diff --git a/public/resource/tinymce/plugins/kityformula-editor/icon.svg b/public/resource/tinymce/plugins/kityformula-editor/icon.svg
new file mode 100644
index 0000000..d0103e7
--- /dev/null
+++ b/public/resource/tinymce/plugins/kityformula-editor/icon.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityFormula.html b/public/resource/tinymce/plugins/kityformula-editor/kityFormula.html
new file mode 100644
index 0000000..f5f25b5
--- /dev/null
+++ b/public/resource/tinymce/plugins/kityformula-editor/kityFormula.html
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ sorry! Beta版本仅支持IE9及以上版本的浏览器,正式版本将会支持低版本浏览器,谢谢您的关注!
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bar-bg.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bar-bg.png
new file mode 100644
index 0000000..9dedcc6
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bar-bg.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bar.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bar.png
new file mode 100644
index 0000000..f98ded7
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bar.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bg.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bg.png
new file mode 100644
index 0000000..2147441
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bg.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bottom.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bottom.png
new file mode 100644
index 0000000..e3df3d1
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/bottom.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/btn.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/btn.png
new file mode 100644
index 0000000..31c0b52
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/btn.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/down.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/down.png
new file mode 100644
index 0000000..31c0b52
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/down.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/top.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/top.png
new file mode 100644
index 0000000..ecda070
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/top.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/up.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/up.png
new file mode 100644
index 0000000..31c0b52
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/custom/up.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/bar-bg.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/bar-bg.png
new file mode 100644
index 0000000..4f9db6b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/bar-bg.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/bar-left.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/bar-left.png
new file mode 100644
index 0000000..2f8c46e
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/bar-left.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/bar-right.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/bar-right.png
new file mode 100644
index 0000000..9772c54
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/bar-right.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/thumb-bg.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/thumb-bg.png
new file mode 100644
index 0000000..450faa2
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/thumb-bg.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/thumb-left.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/thumb-left.png
new file mode 100644
index 0000000..01b9255
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/thumb-left.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/thumb-right.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/thumb-right.png
new file mode 100644
index 0000000..f74673a
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/scrollbar/edit/thumb-right.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/aleph.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/aleph.png
new file mode 100644
index 0000000..fa895d8
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/aleph.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/bbbk.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/bbbk.png
new file mode 100644
index 0000000..a793366
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/bbbk.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/beth.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/beth.png
new file mode 100644
index 0000000..c8cb723
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/beth.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/circleds.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/circleds.png
new file mode 100644
index 0000000..7f455e8
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/circleds.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/complement.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/complement.png
new file mode 100644
index 0000000..f128598
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/complement.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/daleth.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/daleth.png
new file mode 100644
index 0000000..ac705c3
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/daleth.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/ell.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/ell.png
new file mode 100644
index 0000000..ccc6ee3
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/ell.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/eth.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/eth.png
new file mode 100644
index 0000000..501dbb1
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/eth.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/finv.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/finv.png
new file mode 100644
index 0000000..a838bc0
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/finv.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/game.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/game.png
new file mode 100644
index 0000000..c0a5edc
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/game.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/gimel.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/gimel.png
new file mode 100644
index 0000000..e4fd840
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/gimel.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/hbar.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/hbar.png
new file mode 100644
index 0000000..8809ef3
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/hbar.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/hslash.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/hslash.png
new file mode 100644
index 0000000..a1e4e68
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/hslash.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/im.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/im.png
new file mode 100644
index 0000000..201ec05
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/im.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/mho.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/mho.png
new file mode 100644
index 0000000..291f750
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/mho.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/partial.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/partial.png
new file mode 100644
index 0000000..f3b46a0
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/partial.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/re.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/re.png
new file mode 100644
index 0000000..9c96096
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/re.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/wp.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/wp.png
new file mode 100644
index 0000000..23f6541
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/alphabetic/wp.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/circlearrowleft.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/circlearrowleft.png
new file mode 100644
index 0000000..26a9213
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/circlearrowleft.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/circlearrowright.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/circlearrowright.png
new file mode 100644
index 0000000..d291162
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/circlearrowright.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/curvearrowleft.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/curvearrowleft.png
new file mode 100644
index 0000000..3cc06b9
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/curvearrowleft.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/curvearrowright.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/curvearrowright.png
new file mode 100644
index 0000000..265e1e0
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/curvearrowright.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downarrow.png
new file mode 100644
index 0000000..1b5c375
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downdownarrows.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downdownarrows.png
new file mode 100644
index 0000000..457598c
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downdownarrows.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downharpoonleft.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downharpoonleft.png
new file mode 100644
index 0000000..f1de8a2
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downharpoonleft.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downharpoonright.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downharpoonright.png
new file mode 100644
index 0000000..b94a0b8
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/downharpoonright.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/gets.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/gets.png
new file mode 100644
index 0000000..8d659f0
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/gets.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftarrowtail.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftarrowtail.png
new file mode 100644
index 0000000..d36a75a
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftarrowtail.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftharpoondown.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftharpoondown.png
new file mode 100644
index 0000000..882f6e0
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftharpoondown.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftharpoonup.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftharpoonup.png
new file mode 100644
index 0000000..d9fd9f2
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftharpoonup.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftleftarrows.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftleftarrows.png
new file mode 100644
index 0000000..f4cd7c0
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftleftarrows.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightarrow.png
new file mode 100644
index 0000000..4d8d86b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightarrows.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightarrows.png
new file mode 100644
index 0000000..6f0717c
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightarrows.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightharpoons.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightharpoons.png
new file mode 100644
index 0000000..10a057f
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightharpoons.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightsquigarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightsquigarrow.png
new file mode 100644
index 0000000..d515001
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/leftrightsquigarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/longleftarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/longleftarrow.png
new file mode 100644
index 0000000..ab5a64e
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/longleftarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/longleftrightarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/longleftrightarrow.png
new file mode 100644
index 0000000..fe3141d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/longleftrightarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/longrightarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/longrightarrow.png
new file mode 100644
index 0000000..ec988e1
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/longrightarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/looparrowleft.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/looparrowleft.png
new file mode 100644
index 0000000..a4dee7a
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/looparrowleft.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/looparrowright.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/looparrowright.png
new file mode 100644
index 0000000..67885fb
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/looparrowright.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/multimap.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/multimap.png
new file mode 100644
index 0000000..c7a0bb8
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/multimap.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/nearrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/nearrow.png
new file mode 100644
index 0000000..d5891e0
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/nearrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/nleftarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/nleftarrow.png
new file mode 100644
index 0000000..df714e1
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/nleftarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/nrightarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/nrightarrow.png
new file mode 100644
index 0000000..b29d923
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/nrightarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/nwarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/nwarrow.png
new file mode 100644
index 0000000..bf7b7d2
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/nwarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightarrowtail.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightarrowtail.png
new file mode 100644
index 0000000..27cdc5b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightarrowtail.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightharpoondown.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightharpoondown.png
new file mode 100644
index 0000000..e384cf8
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightharpoondown.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightharpoonup.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightharpoonup.png
new file mode 100644
index 0000000..187e1eb
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightharpoonup.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightleftarrows.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightleftarrows.png
new file mode 100644
index 0000000..cdec5d9
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightleftarrows.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightleftharpoons.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightleftharpoons.png
new file mode 100644
index 0000000..73385cb
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightleftharpoons.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightrightarrows.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightrightarrows.png
new file mode 100644
index 0000000..52a7f0f
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightrightarrows.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightsquigarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightsquigarrow.png
new file mode 100644
index 0000000..f471054
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/rightsquigarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/searrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/searrow.png
new file mode 100644
index 0000000..7d887fb
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/searrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/swarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/swarrow.png
new file mode 100644
index 0000000..448b686
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/swarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/to.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/to.png
new file mode 100644
index 0000000..0053655
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/to.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/twoheadleftarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/twoheadleftarrow.png
new file mode 100644
index 0000000..17bcb54
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/twoheadleftarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/twoheadrightarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/twoheadrightarrow.png
new file mode 100644
index 0000000..9242bc2
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/twoheadrightarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-downarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-downarrow.png
new file mode 100644
index 0000000..b2264cb
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-downarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-leftarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-leftarrow.png
new file mode 100644
index 0000000..84bf7a5
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-leftarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-leftrightarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-leftrightarrow.png
new file mode 100644
index 0000000..288dcc1
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-leftrightarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-lftarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-lftarrow.png
new file mode 100644
index 0000000..8ecff74
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-lftarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-lleftarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-lleftarrow.png
new file mode 100644
index 0000000..6bed121
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-lleftarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-longleftarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-longleftarrow.png
new file mode 100644
index 0000000..1cdf790
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-longleftarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-longleftrightarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-longleftrightarrow.png
new file mode 100644
index 0000000..def0c9e
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-longleftrightarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-longrightarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-longrightarrow.png
new file mode 100644
index 0000000..c21e68c
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-longrightarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-lsh.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-lsh.png
new file mode 100644
index 0000000..1f61789
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-lsh.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-nleftarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-nleftarrow.png
new file mode 100644
index 0000000..07657c0
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-nleftarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-nleftrightarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-nleftrightarrow.png
new file mode 100644
index 0000000..daf4e65
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-nleftrightarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-nrightarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-nrightarrow.png
new file mode 100644
index 0000000..902826c
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-nrightarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-rightarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-rightarrow.png
new file mode 100644
index 0000000..39bc777
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-rightarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-rrightarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-rrightarrow.png
new file mode 100644
index 0000000..7aed67d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-rrightarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-rsh.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-rsh.png
new file mode 100644
index 0000000..05e8974
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-rsh.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-uparrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-uparrow.png
new file mode 100644
index 0000000..e539f65
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-uparrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-updownarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-updownarrow.png
new file mode 100644
index 0000000..4aa9faa
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/u-updownarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/uparrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/uparrow.png
new file mode 100644
index 0000000..aa8f571
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/uparrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/updownarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/updownarrow.png
new file mode 100644
index 0000000..2235860
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/updownarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/upharpoonleft.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/upharpoonleft.png
new file mode 100644
index 0000000..72d093d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/upharpoonleft.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/upharpoonright.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/upharpoonright.png
new file mode 100644
index 0000000..76c7335
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/upharpoonright.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/upuparrows.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/upuparrows.png
new file mode 100644
index 0000000..129a338
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/arrow/upuparrows.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/1.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/1.png
new file mode 100644
index 0000000..3b1ed26
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/1.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/2.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/2.png
new file mode 100644
index 0000000..07cf41b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/2.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/3.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/3.png
new file mode 100644
index 0000000..8abe196
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/3.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/4.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/4.png
new file mode 100644
index 0000000..31ad7f7
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/brackets/4.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/btn.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/btn.png
new file mode 100644
index 0000000..77d7c10
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/btn.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/brackets.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/brackets.png
new file mode 100644
index 0000000..b05c1ca
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/brackets.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/down.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/down.png
new file mode 100644
index 0000000..00a8a3a
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/down.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/frac.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/frac.png
new file mode 100644
index 0000000..1048182
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/frac.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/fx.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/fx.png
new file mode 100644
index 0000000..2482b86
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/fx.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/int.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/int.png
new file mode 100644
index 0000000..baafcaa
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/int.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/lim.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/lim.png
new file mode 100644
index 0000000..4547302
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/lim.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/open.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/open.png
new file mode 100644
index 0000000..24026c9
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/open.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/script.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/script.png
new file mode 100644
index 0000000..e29e594
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/script.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/sin.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/sin.png
new file mode 100644
index 0000000..e5b8295
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/sin.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/sqrt.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/sqrt.png
new file mode 100644
index 0000000..782a0da
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/sqrt.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/sum.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/sum.png
new file mode 100644
index 0000000..8c663e2
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/sum.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/tick.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/tick.png
new file mode 100644
index 0000000..6e874f4
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/tick.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/up.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/up.png
new file mode 100644
index 0000000..6eabcad
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/button/up.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char.png
new file mode 100644
index 0000000..4eef3c3
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/a.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/a.png
new file mode 100644
index 0000000..1fc074e
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/a.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/b.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/b.png
new file mode 100644
index 0000000..cc75c7d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/b.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/c.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/c.png
new file mode 100644
index 0000000..b407a1b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/c.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/d.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/d.png
new file mode 100644
index 0000000..66e23a8
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/d.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/e.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/e.png
new file mode 100644
index 0000000..0ef98d1
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/e.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/f.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/f.png
new file mode 100644
index 0000000..e0f76fc
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/f.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/g.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/g.png
new file mode 100644
index 0000000..bbf855f
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/g.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/h.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/h.png
new file mode 100644
index 0000000..0347c93
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/h.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/i.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/i.png
new file mode 100644
index 0000000..cfb5814
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/i.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/j.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/j.png
new file mode 100644
index 0000000..c9ad651
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/j.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/k.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/k.png
new file mode 100644
index 0000000..032f29d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/k.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/l.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/l.png
new file mode 100644
index 0000000..72015ab
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/l.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/m.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/m.png
new file mode 100644
index 0000000..d9c072c
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/m.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/n.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/n.png
new file mode 100644
index 0000000..a398698
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/n.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/o.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/o.png
new file mode 100644
index 0000000..9acb05b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/o.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/p.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/p.png
new file mode 100644
index 0000000..8c11f94
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/p.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/q.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/q.png
new file mode 100644
index 0000000..e47c32e
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/q.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/r.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/r.png
new file mode 100644
index 0000000..44ae3c0
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/r.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/s.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/s.png
new file mode 100644
index 0000000..93dd1c6
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/s.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/t.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/t.png
new file mode 100644
index 0000000..c359ccd
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/t.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/u.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/u.png
new file mode 100644
index 0000000..c5b6158
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/u.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/v.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/v.png
new file mode 100644
index 0000000..2bba8a8
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/v.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/w.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/w.png
new file mode 100644
index 0000000..82518bb
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/w.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/x.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/x.png
new file mode 100644
index 0000000..58bb03c
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/x.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/y.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/y.png
new file mode 100644
index 0000000..7b1ecf6
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/y.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/z.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/z.png
new file mode 100644
index 0000000..d8ad9de
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/bb/z.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/a.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/a.png
new file mode 100644
index 0000000..bbbc102
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/a.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/b.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/b.png
new file mode 100644
index 0000000..1f2d08a
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/b.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/c.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/c.png
new file mode 100644
index 0000000..21c7817
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/c.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/d.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/d.png
new file mode 100644
index 0000000..b6cd5a3
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/d.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/e.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/e.png
new file mode 100644
index 0000000..5b6d59d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/e.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/f.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/f.png
new file mode 100644
index 0000000..28a6cff
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/f.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/g.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/g.png
new file mode 100644
index 0000000..a8f1999
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/g.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/h.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/h.png
new file mode 100644
index 0000000..8592859
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/h.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/i.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/i.png
new file mode 100644
index 0000000..a149116
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/i.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/j.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/j.png
new file mode 100644
index 0000000..cf94ff2
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/j.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/k.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/k.png
new file mode 100644
index 0000000..35b3656
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/k.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/l.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/l.png
new file mode 100644
index 0000000..058d85d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/l.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/m.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/m.png
new file mode 100644
index 0000000..08eccac
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/m.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/n.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/n.png
new file mode 100644
index 0000000..f8c62c3
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/n.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/o.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/o.png
new file mode 100644
index 0000000..a656858
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/o.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/p.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/p.png
new file mode 100644
index 0000000..fc24a27
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/p.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/q.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/q.png
new file mode 100644
index 0000000..44ebb8d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/q.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/r.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/r.png
new file mode 100644
index 0000000..be3017a
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/r.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/s.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/s.png
new file mode 100644
index 0000000..3942b71
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/s.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/t.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/t.png
new file mode 100644
index 0000000..5d41fd0
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/t.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/u.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/u.png
new file mode 100644
index 0000000..8ebf443
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/u.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/v.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/v.png
new file mode 100644
index 0000000..2c51c10
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/v.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/w.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/w.png
new file mode 100644
index 0000000..33ef1d5
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/w.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/x.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/x.png
new file mode 100644
index 0000000..fc7dd0b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/x.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/y.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/y.png
new file mode 100644
index 0000000..6670417
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/y.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/z.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/z.png
new file mode 100644
index 0000000..2489eda
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/cal/z.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/a.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/a.png
new file mode 100644
index 0000000..e8a6950
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/a.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/b.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/b.png
new file mode 100644
index 0000000..5bc50aa
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/b.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/c.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/c.png
new file mode 100644
index 0000000..e0417c5
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/c.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/d.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/d.png
new file mode 100644
index 0000000..a267b36
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/d.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/e.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/e.png
new file mode 100644
index 0000000..be71bf6
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/e.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/f.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/f.png
new file mode 100644
index 0000000..2c17011
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/f.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/g.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/g.png
new file mode 100644
index 0000000..d05843d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/g.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/h.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/h.png
new file mode 100644
index 0000000..41d958e
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/h.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/i.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/i.png
new file mode 100644
index 0000000..1e9bd34
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/i.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/j.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/j.png
new file mode 100644
index 0000000..fc66b89
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/j.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/k.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/k.png
new file mode 100644
index 0000000..49dbc27
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/k.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/l.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/l.png
new file mode 100644
index 0000000..8e23844
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/l.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/m.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/m.png
new file mode 100644
index 0000000..f5a79ce
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/m.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/n.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/n.png
new file mode 100644
index 0000000..e9b7491
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/n.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/o.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/o.png
new file mode 100644
index 0000000..f386683
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/o.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/p.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/p.png
new file mode 100644
index 0000000..334a118
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/p.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/q.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/q.png
new file mode 100644
index 0000000..205df6a
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/q.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/r.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/r.png
new file mode 100644
index 0000000..fc8bc8b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/r.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/s.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/s.png
new file mode 100644
index 0000000..bd6c50c
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/s.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/t.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/t.png
new file mode 100644
index 0000000..76de185
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/t.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/u.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/u.png
new file mode 100644
index 0000000..8c1dfbc
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/u.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ua.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ua.png
new file mode 100644
index 0000000..cc049ef
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ua.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ub.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ub.png
new file mode 100644
index 0000000..841e8cc
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ub.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uc.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uc.png
new file mode 100644
index 0000000..f15063d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uc.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ud.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ud.png
new file mode 100644
index 0000000..8671415
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ud.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ue.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ue.png
new file mode 100644
index 0000000..69b1f08
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ue.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uf.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uf.png
new file mode 100644
index 0000000..9fd1e6a
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uf.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ug.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ug.png
new file mode 100644
index 0000000..3fc5ede
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ug.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uh.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uh.png
new file mode 100644
index 0000000..45e18a9
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uh.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ui.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ui.png
new file mode 100644
index 0000000..6e9a03a
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ui.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uj.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uj.png
new file mode 100644
index 0000000..855aaa9
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uj.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uk.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uk.png
new file mode 100644
index 0000000..adb3b00
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uk.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ul.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ul.png
new file mode 100644
index 0000000..9f138ee
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ul.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/um.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/um.png
new file mode 100644
index 0000000..64d7bd4
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/um.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/un.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/un.png
new file mode 100644
index 0000000..37c4bfd
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/un.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uo.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uo.png
new file mode 100644
index 0000000..0340b6d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uo.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/up.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/up.png
new file mode 100644
index 0000000..f5a1d38
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/up.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uq.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uq.png
new file mode 100644
index 0000000..bfb7f50
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uq.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ur.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ur.png
new file mode 100644
index 0000000..959804c
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ur.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/us.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/us.png
new file mode 100644
index 0000000..1d77b1d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/us.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ut.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ut.png
new file mode 100644
index 0000000..5ebab86
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ut.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uu.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uu.png
new file mode 100644
index 0000000..fa9d855
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uu.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uv.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uv.png
new file mode 100644
index 0000000..8c346f1
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uv.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uw.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uw.png
new file mode 100644
index 0000000..223543d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uw.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ux.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ux.png
new file mode 100644
index 0000000..e87b755
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/ux.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uy.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uy.png
new file mode 100644
index 0000000..b51e8ee
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uy.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uz.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uz.png
new file mode 100644
index 0000000..58ee470
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/uz.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/v.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/v.png
new file mode 100644
index 0000000..3aed003
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/v.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/w.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/w.png
new file mode 100644
index 0000000..008b361
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/w.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/x.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/x.png
new file mode 100644
index 0000000..b73a3c3
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/x.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/y.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/y.png
new file mode 100644
index 0000000..158863b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/y.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/z.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/z.png
new file mode 100644
index 0000000..d3907d2
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/frak/z.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/alpha.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/alpha.png
new file mode 100644
index 0000000..91907f2
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/alpha.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/beta.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/beta.png
new file mode 100644
index 0000000..95edb82
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/beta.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/chi.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/chi.png
new file mode 100644
index 0000000..2c5f2f2
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/chi.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/delta.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/delta.png
new file mode 100644
index 0000000..847f5c1
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/delta.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/epsilon.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/epsilon.png
new file mode 100644
index 0000000..d9fa6c2
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/epsilon.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/eta.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/eta.png
new file mode 100644
index 0000000..206d014
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/eta.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/gamma.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/gamma.png
new file mode 100644
index 0000000..97a09a0
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/gamma.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/iota.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/iota.png
new file mode 100644
index 0000000..7eaad51
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/iota.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/kappa.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/kappa.png
new file mode 100644
index 0000000..7a8571d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/kappa.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/lambda.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/lambda.png
new file mode 100644
index 0000000..b619ecd
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/lambda.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/mu.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/mu.png
new file mode 100644
index 0000000..016d464
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/mu.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/nu.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/nu.png
new file mode 100644
index 0000000..0f00fc4
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/nu.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/omega.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/omega.png
new file mode 100644
index 0000000..3c0220f
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/omega.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/omicron.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/omicron.png
new file mode 100644
index 0000000..c5511b2
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/omicron.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/phi.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/phi.png
new file mode 100644
index 0000000..5b6fc9e
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/phi.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/pi.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/pi.png
new file mode 100644
index 0000000..30bc20c
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/pi.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/psi.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/psi.png
new file mode 100644
index 0000000..92054d2
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/psi.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/rho.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/rho.png
new file mode 100644
index 0000000..48cc456
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/rho.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/sigma.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/sigma.png
new file mode 100644
index 0000000..349fb3b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/sigma.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/tau.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/tau.png
new file mode 100644
index 0000000..235468f
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/tau.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/theta.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/theta.png
new file mode 100644
index 0000000..6540af2
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/theta.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/upsilon.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/upsilon.png
new file mode 100644
index 0000000..0d88ee0
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/upsilon.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/xi.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/xi.png
new file mode 100644
index 0000000..a00c382
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/xi.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/zeta.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/zeta.png
new file mode 100644
index 0000000..683d9bc
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/lower/zeta.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/digamma.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/digamma.png
new file mode 100644
index 0000000..b9ab6f1
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/digamma.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varepsilon.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varepsilon.png
new file mode 100644
index 0000000..2f3ae9c
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varepsilon.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varkappa.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varkappa.png
new file mode 100644
index 0000000..ddc85a2
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varkappa.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varphi.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varphi.png
new file mode 100644
index 0000000..a198b26
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varphi.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varpi.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varpi.png
new file mode 100644
index 0000000..788c350
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varpi.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varrho.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varrho.png
new file mode 100644
index 0000000..d884767
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varrho.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varsigma.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varsigma.png
new file mode 100644
index 0000000..a5409dd
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/varsigma.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/vartheta.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/vartheta.png
new file mode 100644
index 0000000..4729b15
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/misc/vartheta.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/alpha.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/alpha.png
new file mode 100644
index 0000000..22dfae1
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/alpha.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/beta.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/beta.png
new file mode 100644
index 0000000..c95d79b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/beta.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/chi.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/chi.png
new file mode 100644
index 0000000..774804a
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/chi.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/delta.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/delta.png
new file mode 100644
index 0000000..c3baf62
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/delta.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/epsilon.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/epsilon.png
new file mode 100644
index 0000000..c8f85ef
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/epsilon.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/eta.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/eta.png
new file mode 100644
index 0000000..c02a78a
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/eta.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/gamma.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/gamma.png
new file mode 100644
index 0000000..1f6ccb0
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/gamma.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/iota.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/iota.png
new file mode 100644
index 0000000..10777c9
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/iota.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/kappa.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/kappa.png
new file mode 100644
index 0000000..44aa91f
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/kappa.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/lambda.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/lambda.png
new file mode 100644
index 0000000..cf67ea5
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/lambda.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/mu.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/mu.png
new file mode 100644
index 0000000..7284125
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/mu.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/nu.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/nu.png
new file mode 100644
index 0000000..2dcc1c3
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/nu.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/omega.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/omega.png
new file mode 100644
index 0000000..3b9466d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/omega.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/omicron.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/omicron.png
new file mode 100644
index 0000000..6d31fbd
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/omicron.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/phi.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/phi.png
new file mode 100644
index 0000000..1a928d6
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/phi.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/pi.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/pi.png
new file mode 100644
index 0000000..a1e1314
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/pi.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/psi.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/psi.png
new file mode 100644
index 0000000..fdc0321
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/psi.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/rho.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/rho.png
new file mode 100644
index 0000000..27d8c36
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/rho.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/sigma.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/sigma.png
new file mode 100644
index 0000000..dd4ad4b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/sigma.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/tau.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/tau.png
new file mode 100644
index 0000000..7ad4305
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/tau.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/theta.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/theta.png
new file mode 100644
index 0000000..b5d7830
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/theta.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/upsilon.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/upsilon.png
new file mode 100644
index 0000000..ff1fd88
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/upsilon.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/xi.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/xi.png
new file mode 100644
index 0000000..a478d75
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/xi.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/zeta.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/zeta.png
new file mode 100644
index 0000000..4052d09
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/greek/upper/zeta.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/aleph.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/aleph.png
new file mode 100644
index 0000000..4963111
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/aleph.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/approx.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/approx.png
new file mode 100644
index 0000000..7ef6f5d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/approx.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/ast.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/ast.png
new file mode 100644
index 0000000..8b4dead
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/ast.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/baifenhao.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/baifenhao.png
new file mode 100644
index 0000000..624539c
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/baifenhao.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/because.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/because.png
new file mode 100644
index 0000000..51070ef
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/because.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/beth.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/beth.png
new file mode 100644
index 0000000..90fa4e2
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/beth.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/blacksquare.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/blacksquare.png
new file mode 100644
index 0000000..4221d79
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/blacksquare.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/cap.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/cap.png
new file mode 100644
index 0000000..59d6a75
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/cap.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/cdot.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/cdot.png
new file mode 100644
index 0000000..4f923c1
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/cdot.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/circ.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/circ.png
new file mode 100644
index 0000000..a27d477
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/circ.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/cong.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/cong.png
new file mode 100644
index 0000000..46abcf0
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/cong.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/cup.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/cup.png
new file mode 100644
index 0000000..f321d24
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/cup.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/ddots.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/ddots.png
new file mode 100644
index 0000000..c609835
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/ddots.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/div.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/div.png
new file mode 100644
index 0000000..8c11435
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/div.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/downarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/downarrow.png
new file mode 100644
index 0000000..fe285dd
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/downarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/eq.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/eq.png
new file mode 100644
index 0000000..21820ca
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/eq.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/equiv.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/equiv.png
new file mode 100644
index 0000000..d21d2b6
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/equiv.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/exists.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/exists.png
new file mode 100644
index 0000000..291cead
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/exists.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/forall.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/forall.png
new file mode 100644
index 0000000..c2a01c8
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/forall.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/geq.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/geq.png
new file mode 100644
index 0000000..0ccd752
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/geq.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/gets.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/gets.png
new file mode 100644
index 0000000..702b6da
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/gets.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/gg.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/gg.png
new file mode 100644
index 0000000..7dcdea8
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/gg.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/gt.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/gt.png
new file mode 100644
index 0000000..cc05729
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/gt.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/in.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/in.png
new file mode 100644
index 0000000..271d619
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/in.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/infty.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/infty.png
new file mode 100644
index 0000000..8db988c
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/infty.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/leftrightarrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/leftrightarrow.png
new file mode 100644
index 0000000..989a47d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/leftrightarrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/leq.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/leq.png
new file mode 100644
index 0000000..01255b2
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/leq.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/ll.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/ll.png
new file mode 100644
index 0000000..d0cc99f
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/ll.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/lt.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/lt.png
new file mode 100644
index 0000000..f11edc8
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/lt.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/minus.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/minus.png
new file mode 100644
index 0000000..0f845a2
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/minus.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/mp.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/mp.png
new file mode 100644
index 0000000..1cf38f0
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/mp.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/neg.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/neg.png
new file mode 100644
index 0000000..164bfa8
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/neg.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/nexists.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/nexists.png
new file mode 100644
index 0000000..e4523e1
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/nexists.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/ni.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/ni.png
new file mode 100644
index 0000000..5b3da57
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/ni.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/partial.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/partial.png
new file mode 100644
index 0000000..28253fa
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/partial.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/plus.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/plus.png
new file mode 100644
index 0000000..7055190
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/plus.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/pm.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/pm.png
new file mode 100644
index 0000000..8816655
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/pm.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/propto.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/propto.png
new file mode 100644
index 0000000..4ba04fd
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/propto.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/sim.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/sim.png
new file mode 100644
index 0000000..4a5264b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/sim.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/simeq.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/simeq.png
new file mode 100644
index 0000000..ac4b64b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/simeq.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/surd.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/surd.png
new file mode 100644
index 0000000..9ddfd4d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/surd.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/tanhao.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/tanhao.png
new file mode 100644
index 0000000..35a3346
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/tanhao.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/therefore.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/therefore.png
new file mode 100644
index 0000000..7fd47cf
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/therefore.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/times.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/times.png
new file mode 100644
index 0000000..1018224
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/times.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/to.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/to.png
new file mode 100644
index 0000000..12609e4
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/to.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/uparrow.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/uparrow.png
new file mode 100644
index 0000000..0c61945
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/uparrow.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/varnothing.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/varnothing.png
new file mode 100644
index 0000000..ea1b6c1
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/varnothing.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/vdots.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/vdots.png
new file mode 100644
index 0000000..0ce84f2
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/math/vdots.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/gneqq.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/gneqq.png
new file mode 100644
index 0000000..b299d23
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/gneqq.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/gnsim.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/gnsim.png
new file mode 100644
index 0000000..683af6b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/gnsim.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/lneqq.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/lneqq.png
new file mode 100644
index 0000000..5644063
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/lneqq.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/lnsim.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/lnsim.png
new file mode 100644
index 0000000..1365188
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/lnsim.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nbdash-1.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nbdash-1.png
new file mode 100644
index 0000000..07cce70
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nbdash-1.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ncong.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ncong.png
new file mode 100644
index 0000000..156f8be
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ncong.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/neq.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/neq.png
new file mode 100644
index 0000000..feb442f
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/neq.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nequiv.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nequiv.png
new file mode 100644
index 0000000..83427dc
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nequiv.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nexists.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nexists.png
new file mode 100644
index 0000000..c5e3e58
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nexists.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ngeq.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ngeq.png
new file mode 100644
index 0000000..d3385e4
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ngeq.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ngtr.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ngtr.png
new file mode 100644
index 0000000..033a1d1
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ngtr.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nleq.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nleq.png
new file mode 100644
index 0000000..16347a1
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nleq.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nless.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nless.png
new file mode 100644
index 0000000..11c9472
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nless.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nmid.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nmid.png
new file mode 100644
index 0000000..c63688e
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nmid.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/notin.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/notin.png
new file mode 100644
index 0000000..d001291
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/notin.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nparallel.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nparallel.png
new file mode 100644
index 0000000..76887ca
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nparallel.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nprec.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nprec.png
new file mode 100644
index 0000000..a929e3b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nprec.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nsim.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nsim.png
new file mode 100644
index 0000000..45cf001
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nsim.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nsubseteq.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nsubseteq.png
new file mode 100644
index 0000000..9e530e2
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nsubseteq.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nsucc.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nsucc.png
new file mode 100644
index 0000000..b975eaf
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nsucc.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nsupseteq.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nsupseteq.png
new file mode 100644
index 0000000..4c1866b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nsupseteq.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ntriangleleft.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ntriangleleft.png
new file mode 100644
index 0000000..39ecc4d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ntriangleleft.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ntrianglelefteq.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ntrianglelefteq.png
new file mode 100644
index 0000000..9b8f737
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ntrianglelefteq.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ntriangleright.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ntriangleright.png
new file mode 100644
index 0000000..751acf0
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ntriangleright.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ntrianglerighteq.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ntrianglerighteq.png
new file mode 100644
index 0000000..abff3af
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/ntrianglerighteq.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nvdash-1.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nvdash-1.png
new file mode 100644
index 0000000..dc641d9
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nvdash-1.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nvdash-2.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nvdash-2.png
new file mode 100644
index 0000000..4079f6f
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nvdash-2.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nvdash-3.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nvdash-3.png
new file mode 100644
index 0000000..3d872b4
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nvdash-3.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nvdash.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nvdash.png
new file mode 100644
index 0000000..4f4fb1f
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/nvdash.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/precnsim.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/precnsim.png
new file mode 100644
index 0000000..e6c148b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/precnsim.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/subsetneq.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/subsetneq.png
new file mode 100644
index 0000000..cc33835
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/subsetneq.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/succnsim.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/succnsim.png
new file mode 100644
index 0000000..7eafb5b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/succnsim.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/supsetneq.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/supsetneq.png
new file mode 100644
index 0000000..b43f091
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/not/supsetneq.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/a.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/a.png
new file mode 100644
index 0000000..9da4faf
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/a.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/b.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/b.png
new file mode 100644
index 0000000..c14fe4f
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/b.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/c.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/c.png
new file mode 100644
index 0000000..08015b7
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/c.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/d.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/d.png
new file mode 100644
index 0000000..2c9a95d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/d.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/e.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/e.png
new file mode 100644
index 0000000..e966a24
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/e.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/f.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/f.png
new file mode 100644
index 0000000..76d3d37
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/f.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/g.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/g.png
new file mode 100644
index 0000000..8ea5775
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/g.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/h.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/h.png
new file mode 100644
index 0000000..fa3c006
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/h.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/i.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/i.png
new file mode 100644
index 0000000..58e2a69
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/i.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/j.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/j.png
new file mode 100644
index 0000000..592148a
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/j.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/k.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/k.png
new file mode 100644
index 0000000..e2daf2e
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/k.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/l.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/l.png
new file mode 100644
index 0000000..691a92f
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/l.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/m.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/m.png
new file mode 100644
index 0000000..9f020cc
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/m.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/n.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/n.png
new file mode 100644
index 0000000..30be2cc
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/n.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/o.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/o.png
new file mode 100644
index 0000000..16c83a0
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/o.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/p.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/p.png
new file mode 100644
index 0000000..b3e837c
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/p.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/q.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/q.png
new file mode 100644
index 0000000..203bb20
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/q.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/r.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/r.png
new file mode 100644
index 0000000..763f81e
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/r.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/s.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/s.png
new file mode 100644
index 0000000..7510702
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/s.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/t.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/t.png
new file mode 100644
index 0000000..0043204
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/t.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/u.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/u.png
new file mode 100644
index 0000000..f495f3d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/u.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ua.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ua.png
new file mode 100644
index 0000000..7d36a0e
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ua.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ub.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ub.png
new file mode 100644
index 0000000..d1eacb7
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ub.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uc.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uc.png
new file mode 100644
index 0000000..e1f8bb9
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uc.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ud.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ud.png
new file mode 100644
index 0000000..a5d2343
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ud.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ue.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ue.png
new file mode 100644
index 0000000..974322c
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ue.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uf.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uf.png
new file mode 100644
index 0000000..253244e
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uf.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ug.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ug.png
new file mode 100644
index 0000000..3fd2e08
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ug.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uh.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uh.png
new file mode 100644
index 0000000..c72d319
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uh.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ui.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ui.png
new file mode 100644
index 0000000..f69e3f8
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ui.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uj.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uj.png
new file mode 100644
index 0000000..ffefb31
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uj.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uk.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uk.png
new file mode 100644
index 0000000..07a569d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uk.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ul.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ul.png
new file mode 100644
index 0000000..47d868a
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ul.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/um.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/um.png
new file mode 100644
index 0000000..c45333e
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/um.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/un.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/un.png
new file mode 100644
index 0000000..c3ba37c
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/un.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uo.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uo.png
new file mode 100644
index 0000000..cac7b4f
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uo.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/up.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/up.png
new file mode 100644
index 0000000..d48be7b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/up.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uq.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uq.png
new file mode 100644
index 0000000..d20612b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uq.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ur.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ur.png
new file mode 100644
index 0000000..e812c31
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ur.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/us.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/us.png
new file mode 100644
index 0000000..3204257
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/us.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ut.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ut.png
new file mode 100644
index 0000000..d897d27
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ut.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uu.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uu.png
new file mode 100644
index 0000000..87ca6ce
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uu.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uv.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uv.png
new file mode 100644
index 0000000..8d6cd3b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uv.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uw.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uw.png
new file mode 100644
index 0000000..0d5f389
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uw.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ux.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ux.png
new file mode 100644
index 0000000..024bade
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/ux.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uy.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uy.png
new file mode 100644
index 0000000..cfa70de
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uy.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uz.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uz.png
new file mode 100644
index 0000000..8d1fcc8
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/uz.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/v.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/v.png
new file mode 100644
index 0000000..0ad4cd8
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/v.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/w.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/w.png
new file mode 100644
index 0000000..c6edcb4
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/w.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/x.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/x.png
new file mode 100644
index 0000000..f299eeb
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/x.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/y.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/y.png
new file mode 100644
index 0000000..98c8626
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/y.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/z.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/z.png
new file mode 100644
index 0000000..644a5b3
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/char/rm/z.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/1.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/1.png
new file mode 100644
index 0000000..3894249
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/1.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/2.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/2.png
new file mode 100644
index 0000000..c378fdc
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/2.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/3.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/3.png
new file mode 100644
index 0000000..fad9d20
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/3.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/c1.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/c1.png
new file mode 100644
index 0000000..a032d70
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/c1.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/c2.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/c2.png
new file mode 100644
index 0000000..a8c95a8
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/c2.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/c4.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/c4.png
new file mode 100644
index 0000000..74c5cdf
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/c4.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/c5.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/c5.png
new file mode 100644
index 0000000..05e6adf
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/frac/c5.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/1.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/1.png
new file mode 100644
index 0000000..3654ff9
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/1.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/2.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/2.png
new file mode 100644
index 0000000..a33c1dc
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/2.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/3.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/3.png
new file mode 100644
index 0000000..3fc2186
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/3.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/4.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/4.png
new file mode 100644
index 0000000..6f528db
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/4.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/5.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/5.png
new file mode 100644
index 0000000..e22d592
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/5.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/6.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/6.png
new file mode 100644
index 0000000..2eed1bc
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/6.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/c1.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/c1.png
new file mode 100644
index 0000000..d797cb8
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/c1.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/c2.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/c2.png
new file mode 100644
index 0000000..4eb6c8f
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/c2.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/c3.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/c3.png
new file mode 100644
index 0000000..0f55b7e
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/func/c3.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/1.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/1.png
new file mode 100644
index 0000000..a08ab60
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/1.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/2.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/2.png
new file mode 100644
index 0000000..09cb7f8
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/2.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/3.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/3.png
new file mode 100644
index 0000000..8898b84
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/3.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/4.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/4.png
new file mode 100644
index 0000000..483092e
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/4.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/5.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/5.png
new file mode 100644
index 0000000..604128c
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/5.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/6.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/6.png
new file mode 100644
index 0000000..287b6ca
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/int/6.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/large/1.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/large/1.png
new file mode 100644
index 0000000..a83bf8e
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/large/1.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/large/2.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/large/2.png
new file mode 100644
index 0000000..7052553
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/large/2.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/large/3.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/large/3.png
new file mode 100644
index 0000000..70b0f3e
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/large/3.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/other.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/other.png
new file mode 100644
index 0000000..a5796aa
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/other.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/1.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/1.png
new file mode 100644
index 0000000..a40b79a
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/1.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/2.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/2.png
new file mode 100644
index 0000000..1eac155
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/2.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/3.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/3.png
new file mode 100644
index 0000000..3425abe
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/3.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/4.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/4.png
new file mode 100644
index 0000000..fad9d20
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/4.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/c1.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/c1.png
new file mode 100644
index 0000000..24cbd1b
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/c1.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/c2.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/c2.png
new file mode 100644
index 0000000..572ad1f
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/c2.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/c3.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/c3.png
new file mode 100644
index 0000000..d557b77
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/script/c3.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/1.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/1.png
new file mode 100644
index 0000000..f6d0f2e
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/1.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/2.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/2.png
new file mode 100644
index 0000000..0ffbabb
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/2.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/3.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/3.png
new file mode 100644
index 0000000..1f10156
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/3.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/4.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/4.png
new file mode 100644
index 0000000..66470a6
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/4.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/c1.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/c1.png
new file mode 100644
index 0000000..cf7beba
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/c1.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/c2.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/c2.png
new file mode 100644
index 0000000..35a5bae
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/sqrt/c2.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/ys/1.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/ys/1.png
new file mode 100644
index 0000000..f7c7d17
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/ys/1.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/ys/2.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/ys/2.png
new file mode 100644
index 0000000..ee9586d
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/ys/2.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/ys/3.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/ys/3.png
new file mode 100644
index 0000000..93f7d9c
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/images/toolbar/ys/3.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/styles/base.css b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/styles/base.css
new file mode 100644
index 0000000..355d9b0
--- /dev/null
+++ b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/styles/base.css
@@ -0,0 +1,40 @@
+
+.kf-editor {
+ width: 100%;
+ height: 100%;
+ border: 1px solid #e0e0e0;
+ position: relative;
+ top: 0;
+ left: 0;
+
+ overflow: hidden;
+ z-index: 2;
+ background-color: #f6f5ee;
+}
+
+.kf-editor-edit-area {
+ position: relative;
+ top: 0;
+ left: 0;
+
+ z-index: 1;
+ height: 0;
+ background-color: white;
+ /*background-color: white;*/
+ /*background-size: 21px 21px;*/
+ /*background-position: 0 0,10px 10px;*/
+ /*background-image: -webkit-linear-gradient(45deg,#efefef 25%,transparent 25%,transparent 75%,#efefef 75%,#efefef),-webkit-linear-gradient(45deg,#efefef 25%,transparent 25%,transparent 75%,#efefef 75%,#efefef);*/
+ /*background-image: linear-gradient(45deg,#efefef 25%,transparent 25%,transparent 75%,#efefef 75%,#efefef),linear-gradient(45deg,#efefef 25%,transparent 25%,transparent 75%,#efefef 75%,#efefef);*/
+}
+
+.kf-editor-canvas-container {
+ width: 100%;
+ height: 100%;
+}
+
+.kf-editor-input-box {
+ position: fixed;
+ top: 0;
+ left: -99999999px;
+ z-index: 999999;
+}
\ No newline at end of file
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/styles/page.css b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/styles/page.css
new file mode 100644
index 0000000..8026403
--- /dev/null
+++ b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/styles/page.css
@@ -0,0 +1,12 @@
+
+html, body {
+ width: 100%;
+ height: 100%;
+ padding: 0;
+ margin: 0;
+ background: rgba( 48, 48, 48, 0.5 );
+}
+
+body {
+ height: 1000px;
+}
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/styles/scrollbar.css b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/styles/scrollbar.css
new file mode 100644
index 0000000..b8254b0
--- /dev/null
+++ b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/styles/scrollbar.css
@@ -0,0 +1,78 @@
+/*!
+ * 滚动条
+ **/
+
+.kf-editor-edit-scrollbar {
+ width: 100%;
+ height: 16px;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ z-index: 994;
+ border-top: 1px solid #ddd;
+}
+
+.kf-editor-ui-left-button {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 5px;
+ height: 100%;
+ background: white;
+}
+
+.kf-editor-ui-right-button {
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 5px;
+ height: 100%;
+ background: white;
+}
+
+.kf-editor-ui-track {
+ position: absolute;
+ top: 0;
+ left: 5px;
+ width: 0;
+ height: 100%;
+ background-image: url(../images/scrollbar/edit/bar-left.png), url(../images/scrollbar/edit/bar-right.png), url(../images/scrollbar/edit/bar-bg.png);
+ background-repeat: no-repeat, no-repeat, repeat-x;
+ background-position: 0 0, right 0, 0 0;
+}
+
+.kf-editor-ui-thumb {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 0;
+ height: 100%;
+}
+
+.kf-editor-ui-thumb-left {
+ width: 5px;
+ height: 100%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ background: url(../images/scrollbar/edit/thumb-left.png) no-repeat 0 0;
+ z-index: 1;
+}
+
+.kf-editor-ui-thumb-right {
+ width: 5px;
+ height: 100%;
+ position: absolute;
+ top: 0;
+ right: 0;
+ background: url(../images/scrollbar/edit/thumb-right.png) no-repeat 0 0;
+}
+
+.kf-editor-ui-thumb-body {
+ position: absolute;
+ top: 0;
+ left: 5px;
+ width: 0;
+ height: 100%;
+ background: url(../images/scrollbar/edit/thumb-bg.png) repeat-x 0 0;
+}
\ No newline at end of file
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/styles/ui.css b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/styles/ui.css
new file mode 100644
index 0000000..e8ac470
--- /dev/null
+++ b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/styles/ui.css
@@ -0,0 +1,536 @@
+/* 工具栏 */
+.kf-editor-toolbar {
+ width: 100%;
+ padding: 1px 10px;
+ position: relative;
+ top: 0;
+ left: 0;
+ z-index: 2;
+ background-color: #f6f5ee;
+ border-bottom: 1px solid #ccc;
+ -moz-box-shadow:1px 1px 1px rgba( 0, 0, 0, 0.1 );
+ -webkit-box-shadow:1px 1px 1px rgba( 0, 0, 0, 0.1 );
+ box-shadow:1px 1px 1px rgba( 0, 0, 0, 0.1 );
+ color: #000;
+ font-family: Helvetica, Arial, "微软雅黑", "Microsoft YaHei", "宋体", sans-serif;
+}
+
+/* 按钮 */
+.kf-editor-ui-button {
+ padding: 8px 6px;
+ height: 79px;
+ font-size: 12px;
+ display: inline-block;
+ border: 1px solid transparent;
+ border-radius: 3px;
+ cursor: default;
+ position: relative;
+ top: 0;
+ left: 0;
+ z-index: 3;
+ vertical-align: top;
+ opacity: 0.5;
+ margin-right: 1px;
+}
+
+.kf-editor-toolbar .kf-editor-ui-overlap-button {
+ width: 100%;
+ height: 25px;
+ background: #53b856;
+ border-radius: 0;
+}
+
+.kf-editor-ui-button-icon {
+ width: 32px;
+ height: 32px;
+ margin: 2px auto;
+}
+
+.kf-editor-ui-button-label {
+ color: #666;
+ text-align: center;
+ display: block;
+ font-size: 12px;
+ line-height: 20px;
+}
+
+.kf-editor-ui-overlap-button .kf-editor-ui-button-label {
+ padding: 3px 5px;
+ text-align: left;
+ color: white;
+ font-size: 12px;
+}
+
+.kf-editor-ui-button-sign {
+ border: 4px solid transparent;
+ border-top-color: #2d2d2d;
+ width: 0;
+ height: 0;
+ display: inline-block;
+ margin: 8px auto;
+ vertical-align: top;
+}
+
+.kf-editor-ui-button-mount-point {
+ display: none;
+ position: absolute;
+ bottom: -2px;
+ left: -1px;
+}
+
+.kf-editor-ui-overlap-button .kf-editor-ui-button-mount-point {
+ width: 100%;
+ height: 10000px;
+}
+
+.kf-editor-ui-wrap-group {
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.kf-editor-ui-overlap-button .kf-editor-ui-button-mount-point {
+ top: 27px;
+}
+
+.kf-editor-toolbar .kf-editor-ui-button-in {
+ border-color: #8fcc91!important;
+ background: #e0f0dd!important;
+}
+
+.kf-editor-toolbar .kf-editor-ui-overlap-button {
+ padding-top: 0;
+ padding-bottom: 0;
+ border-color: #61b864!important;
+ background: #61b864!important;
+}
+
+/* 分割符 */
+.kf-editor-ui-delimiter {
+ width: 11px;
+ height: 100%;
+ display: none;
+}
+
+.kf-editor-ui-enabled.kf-editor-ui-button:HOVER {
+ border: 1px solid #a9d9ab;
+ background: #ebf7e6;
+}
+
+.kf-editor-ui-enabled.kf-editor-ui-overlap-button:HOVER {
+ border: 1px solid #53b856;
+ background: #53b856;
+}
+
+.kf-editor-ui-delimiter-line {
+ width: 1px;
+ height: 100%;
+ margin: 0 auto;
+ background: -webkit-linear-gradient(top, rgba(233, 233, 233, 0.11), rgba(92, 92, 92, 0.20) 60%, rgba(92, 92, 92, 0.41) 80%, rgba(123, 123, 123, 0.50));
+}
+
+/* box */
+.kf-editor-ui-box {
+ border: 1px solid #b3aead;
+ border-radius: 3px;
+ box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.11);
+ background: white;
+ position: absolute;
+ top: 0;
+ left: -1px;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.kf-editor-ui-area .kf-editor-ui-box {
+ border-color: #61b864;
+}
+
+.kf-editor-ui-box-container {
+ font-size: 12px;
+}
+
+.kf-editor-ui-box-group-title {
+ background-color: #f7f6f0;
+ height: 23px;
+ line-height: 23px;
+ font-size: 12px;
+ border: 1px solid #ebeae4;
+ border-width: 1px 0;
+ padding-left: 12px;
+}
+
+.kf-editor-ui-box-group-item-container {
+ padding: 7px 9px 17px 9px;
+}
+
+.kf-editor-ui-overlap-container {
+ overflow: hidden;
+}
+
+.kf-editor-ui-area .kf-editor-ui-box {
+ top: -1px;
+}
+
+.kf-editor-ui-overlap-container .kf-editor-ui-button-sign {
+ border-top-color: white;
+ border-width: 4px;
+ margin-left: 10px;
+ margin-top: 8px;
+}
+
+.kf-editor-ui-yushe-btn .kf-editor-ui-box-item {
+ border: 1px solid transparent;
+ padding: 5px;
+}
+
+.kf-editor-ui-box-item {
+ display: inline-block;
+ margin: 4px;
+}
+
+.kf-editor-ui-box-item-content:HOVER {
+ border-color: #dff3df;
+}
+
+.kf-editor-ui-box-item-content:HOVER .kf-editor-ui-box-item-val {
+ border-color: #6eb864;
+}
+
+.kf-editor-ui-area .kf-editor-ui-box-item {
+ position: relative;
+ top: 0;
+ left: 0;
+ width: 32px;
+ height: 32px;
+ border: 0;
+ margin: 3px;
+ padding: 0;
+ z-index: 1;
+}
+
+.kf-editor-ui-area .kf-editor-ui-box-item img {
+ width: 32px;
+ height: 32px;
+}
+
+
+.kf-editor-ui-box-item-label {
+ margin-bottom: 5px;
+}
+
+.kf-editor-ui-box-item-content {
+ background: white;
+ border: 1px solid white;
+}
+
+.kf-editor-ui-area .kf-editor-ui-box-item-content {
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+
+.kf-editor-ui-area .kf-editor-ui-box-item-content:HOVER {
+ border: 1px solid #dff3df;
+}
+
+.kf-editor-ui-box-item-val {
+ padding: 5px;
+ line-height: 0;
+ border: 1px solid #808080;
+}
+
+.kf-editor-ui-area .kf-editor-ui-box-item-val {
+ padding: 0;
+ margin: 0;
+}
+
+/* area */
+.kf-editor-ui-area {
+ height: 79px;
+ display: inline-block;
+ cursor: default;
+ position: relative;
+ top: 0;
+ left: 0;
+ vertical-align: top;
+ opacity: 0.5;
+ z-index: 4;
+ border: 1px solid #e0dfd5;
+ border-radius: 4px;
+ background: white;
+ margin: 8px 10px;
+}
+
+.kf-editor-ui-area-container {
+ width: 293px;
+ height: 70px;
+ /*margin: 7px 5px 5px 5px;*/
+ margin: 5px;
+ display: inline-block;
+ border-right: 0;
+ vertical-align: top;
+ position: relative;
+ top: 0;
+ left: 0;
+ overflow: hidden;
+}
+
+.kf-editor-ui-area-panel {
+ position: absolute;
+ top: 0;
+ left: 0;
+ line-height: 0;
+ background: white;
+ -webkit-transition: top 0.5s linear;
+ -moz-transition: top 0.5s linear;
+ transition: top 0.5s linear;
+}
+
+.kf-editor-ui-area-button-container {
+ display: inline-block;
+ width: 16px;
+ height: 100%;
+ overflow: hidden;
+ text-align: center;
+ border: 0 solid #D3D3D3;
+ border-left-width: 1px;
+ background-color: #f2f0e6;
+}
+
+.kf-editor-ui-moveup-button, .kf-editor-ui-movedown-button {
+ line-height: 25px;
+ height: 30px;
+}
+
+.kf-editor-ui-moveup-button {
+ background: url("../images/toolbar/btn.png") -304px 9px no-repeat;
+}
+
+.kf-editor-ui-movedown-button {
+ border: 1px solid #D3D3D3;
+ border-width: 1px 0;
+ background: url("../images/toolbar/btn.png") -325px 9px no-repeat;
+}
+
+.kf-editor-ui-area-button {
+ width: 100%;
+ height: 50px;
+ line-height: 26px;
+ background: url("../images/toolbar/btn.png") -346px 0 no-repeat;
+}
+
+.kf-editor-ui-enabled .kf-editor-ui-area-button:HOVER {
+ background-color: #e5e4e1;
+}
+
+.kf-editor-ui-enabled .kf-editor-ui-moveup-button:HOVER {
+ background-color: #e5e4e1;
+}
+
+.kf-editor-ui-enabled .kf-editor-ui-movedown-button:HOVER {
+ background-color: #e5e4e1;
+}
+
+.kf-editor-ui-area-button-container .kf-editor-ui-disabled {
+ opacity: 0.25;
+ background-color: transparent!important;
+}
+
+.kf-editor-ui-area-mount {
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: none;
+}
+
+.kf-editor-ui-overlap-title {
+ width: 100%;
+ line-height: 1.5;
+}
+
+/* list */
+.kf-editor-ui-list {
+ background: #f9f8f5;
+ border: 1px solid #b3aead;
+ border-radius: 3px;
+ position: fixed;
+ top: 0;
+ left: 0;
+ box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.11);
+}
+
+.kf-editor-ui-list-bg {
+ display: none;
+}
+
+.kf-editor-ui-list-item-container {
+ position: relative;
+ top: 0;
+ left: 0;
+ z-index: 2;
+}
+
+.kf-editor-ui-list-item {
+ line-height: 24px;
+ padding: 2px 6px;
+ border: 1px solid transparent;
+ border-width: 1px 0;
+}
+
+.kf-editor-ui-list-item-select {
+ color: #61b864;
+ font-weight: bold;
+}
+
+.kf-editor-ui-list-item-select .kf-editor-ui-list-item-icon {
+ visibility: visible;
+ width: 16px;
+ height: 16px;
+ background: url(../images/toolbar/btn.png) no-repeat -367px 0;
+}
+
+.kf-editor-ui-list-item:HOVER {
+ border-color: #beddbf;
+ background-color: #ecf3e9;
+}
+
+.kf-editor-ui-list-item-icon {
+ width: 16px;
+ height: 16px;
+ display: inline-block;
+ vertical-align: middle;
+ margin-top: -2px;
+ margin-right: 4px;
+ visibility: hidden;
+}
+
+/* area 内容区 */
+.kf-editor-ui-area-item {
+ width: 26px;
+ height: 26px;
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+
+.kf-editor-ui-area-item-inner {
+ width: 34px;
+ height: 34px;
+ border: 1px solid white;
+ position: absolute;
+ top: -4px;
+ left: -4px;
+ -webkit-transition: all 0.1s linear;
+ -moz-transition: all 0.1s linear;
+ transition: all 0.1s linear;
+
+ -webkit-transform: scale( 0.76 );
+ -moz-transform: scale( 0.76 );
+ transform: scale( 0.76 );
+}
+
+.kf-editor-ui-enabled .kf-editor-ui-area-item-inner:HOVER {
+ border-color: #dff3df;
+
+ -webkit-transform: scale( 1 );
+ -moz-transform: scale( 1 );
+ transform: scale( 1 );
+}
+
+.kf-editor-ui-area-item-img {
+ width: 32px;
+ height: 32px;
+ border: 1px solid #808080;
+ -webkit-transition: all 0.1s linear;
+ -moz-transition: all 0.1s linear;
+ transition: all 0.1s linear;
+}
+
+.kf-editor-ui-enabled .kf-editor-ui-area-item-inner:HOVER .kf-editor-ui-area-item-img {
+ border-color: #6eb864;
+}
+
+.kf-editor-ui-enabled {
+ opacity: 1;
+}
+
+.kf-editor-ui-overlap-container .kf-editor-ui-box-item {
+ width: 34px;
+ height: 34px;
+ border: 1px solid white;
+}
+
+.kf-editor-ui-overlap-container .kf-editor-ui-box-item-content:HOVER {
+}
+
+.kf-editor-ui-overlap-container .kf-editor-ui-box-item-val {
+ width: 32px;
+ height: 32px;
+}
+
+/* scrollbar */
+.kf-editor-ui-box::-webkit-scrollbar {
+ width: 17px;
+ background: url(../images/scrollbar/custom/bg.png) 0 0 repeat-y white;
+}
+
+.kf-editor-ui-box::-webkit-scrollbar-button:end:increment {
+ height: 5px;
+ background: url(../images/scrollbar/custom/down.png) 0 0 repeat-y white;
+}
+/*定义滚动条渐减按扭的样式 */
+.kf-editor-ui-box::-webkit-scrollbar-button:start:decrement {
+ height: 5px;
+ background: url(../images/scrollbar/custom/up.png) 0 0 repeat-y white;
+}
+
+/* 垂直滚动条的第三层轨道的上段 */
+.kf-editor-ui-box::-webkit-scrollbar-track-piece:vertical:start {
+ background-image: url(../images/scrollbar/custom/top.png), url(../images/scrollbar/custom/bg.png);
+ background-repeat: no-repeat, repeat-y;
+}
+/* 垂直滚动条的第三层轨道的下段 */
+.kf-editor-ui-box::-webkit-scrollbar-track-piece:vertical:end {
+ background-image: url(../images/scrollbar/custom/bottom.png), url(../images/scrollbar/custom/bg.png);
+ background-repeat: no-repeat, repeat-y;
+ background-position: 0 bottom, 0 0;
+}
+/* 垂直滚动条的滑动块 */
+.kf-editor-ui-box::-webkit-scrollbar-thumb:vertical {
+ /*background: url(./images2/bar.png) 6px 0 no-repeat;*/
+ /*background-size: 6px;*/
+ -webkit-border-image: url(../images/scrollbar/custom/bar.png) 8;
+ border-width: 10px;
+}
+
+.kf-editor-ui-wrap-group::-webkit-scrollbar {
+ width: 17px;
+ background: url(../images/scrollbar/custom/bg.png) 0 0 repeat-y white;
+}
+
+.kf-editor-ui-wrap-group::-webkit-scrollbar-button:end:increment {
+ height: 5px;
+ background: url(../images/scrollbar/custom/down.png) 0 0 repeat-y white;
+}
+/*定义滚动条渐减按扭的样式 */
+.kf-editor-ui-wrap-group::-webkit-scrollbar-button:start:decrement {
+ height: 5px;
+ background: url(../images/scrollbar/custom/up.png) 0 0 repeat-y white;
+}
+
+/* 垂直滚动条的第三层轨道的上段 */
+.kf-editor-ui-wrap-group::-webkit-scrollbar-track-piece:vertical:start {
+ background-image: url(../images/scrollbar/custom/top.png), url(../images/scrollbar/custom/bg.png);
+ background-repeat: no-repeat, repeat-y;
+}
+/* 垂直滚动条的第三层轨道的下段 */
+.kf-editor-ui-wrap-group::-webkit-scrollbar-track-piece:vertical:end {
+ background-image: url(../images/scrollbar/custom/bottom.png), url(../images/scrollbar/custom/bg.png);
+ background-repeat: no-repeat, repeat-y;
+ background-position: 0 bottom, 0 0;
+}
+/* 垂直滚动条的滑动块 */
+.kf-editor-ui-wrap-group::-webkit-scrollbar-thumb:vertical {
+ -webkit-border-image: url(../images/scrollbar/custom/bar.png) 8;
+ border-width: 10px;
+}
\ No newline at end of file
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/fui.css b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/fui.css
new file mode 100644
index 0000000..de07bba
--- /dev/null
+++ b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/fui.css
@@ -0,0 +1,540 @@
+/**
+ * 所有构件样式规则
+ **/
+/**
+ * FUI 通用样式定义
+ */
+/*------------ var*/
+/*------------ mixin*/
+.fui-widget {
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ -webkit-user-drag: none;
+ color: #000000;
+ line-height: 1.5;
+ font-size: 12px;
+ font-family: "ff-tisa-web-pro-1", "ff-tisa-web-pro-2", "Lucida Grande", "Hiragino Sans GB", "Hiragino Sans GB W3", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif;
+ -webkit-font-smoothing: antialiased;
+ outline: none;
+ display: inline-block;
+ vertical-align: top;
+ position: relative;
+ top: 0;
+ left: 0;
+}
+.fui-widget.fui-selectable {
+ -webkit-user-select: text;
+ -khtml-user-select: text;
+ -moz-user-select: text;
+ -ms-user-select: text;
+ user-select: text;
+ -webkit-user-drag: text;
+}
+.fui-widget * {
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ -webkit-user-drag: none;
+}
+.fui-widget.fui-disabled {
+ opacity: 0.3!important;
+}
+.fui-widget.fui-hide {
+ display: none!important;
+}
+.fui-widget.fui-mask-animate {
+ -webkit-transition: all 0.2s;
+}
+.fui-widget.fui-mask-hint {
+ -webkit-transform: perspective(600px) translateZ(30px);
+}
+
+/**
+ * 容器类通用样式
+ **/
+/**
+ * FUI 通用样式定义
+ */
+/*------------ var*/
+/*------------ mixin*/
+.fui-container {
+ overflow: hidden;
+ position: relative;
+ top: 0;
+ left: 0;
+}
+.fui-container.fui-disabled {
+ opacity: 1!important;
+}
+
+/**
+ * FUI 通用样式定义
+ */
+/*------------ var*/
+/*------------ mixin*/
+.fui-button-menu {
+ border: 1px solid white;
+}
+.fui-button-menu:HOVER {
+ border-color: #d5e1f2;
+}
+.fui-button-menu.fui-button-active {
+ border-color: #d5e1f2;
+ background: #d5e1f2;
+}
+.fui-button-menu.fui-button-active .fui-button {
+ background: #d5e1f2;
+}
+.fui-button-menu.fui-layout-top,
+.fui-button-menu.fui-layout-bottom {
+ text-align: center;
+}
+.fui-button-menu.fui-layout-top .fui-open-btn,
+.fui-button-menu.fui-layout-bottom .fui-open-btn {
+ display: block;
+}
+
+/**
+ * 通用button
+ */
+/**
+ * FUI 通用样式定义
+ */
+/*------------ var*/
+/*------------ mixin*/
+.fui-button {
+ overflow: hidden;
+ cursor: default;
+ font-size: 0;
+}
+.fui-button ._layout .fui-label {
+ display: block;
+}
+.fui-button ._layout .fui-icon {
+ display: block;
+}
+.fui-button .fui-icon {
+ display: inline-block;
+ vertical-align: middle;
+}
+.fui-button .fui-label {
+ display: inline-block;
+ vertical-align: middle;
+}
+.fui-button.fui-button-layout-top .fui-label {
+ display: block;
+}
+.fui-button.fui-button-layout-top .fui-icon {
+ display: block;
+}
+.fui-button.fui-button-layout-bottom .fui-label {
+ display: block;
+}
+.fui-button.fui-button-layout-bottom .fui-icon {
+ display: block;
+}
+.fui-button:HOVER {
+ background-color: #d5e1f2 !important;
+ color: #000000 !important;
+}
+.fui-button:ACTIVE {
+ background-color: #87a9da !important;
+ color: #000000 !important;
+}
+.fui-button.fui-disabled:HOVER {
+ background-color: #ffffff !important;
+ color: #000000 !important;
+}
+.fui-button.fui-disabled:ACTIVE {
+ background-color: #ffffff !important;
+ color: #000000 !important;
+}
+
+/**
+ * FUI 通用样式定义
+ */
+/*------------ var*/
+/*------------ mixin*/
+.fui-colorpicker {
+ background-color: #fff;
+}
+.fui-colorpicker-container {
+ border: 1px solid #d3d3d3;
+}
+.fui-colorpicker-container .fui-colorpicker-title {
+ background: #eee;
+ padding: 2px 4px;
+}
+.fui-colorpicker-container .fui-colorpicker-colors {
+ margin: 0;
+ padding: 0;
+ font-size: 0;
+ line-height: 0;
+}
+.fui-colorpicker-container .fui-colorpicker-colors-line0 {
+ margin-bottom: 3px;
+}
+.fui-colorpicker-container .fui-colorpicker-item {
+ display: inline-block;
+ margin: 0 2px;
+ width: 13px;
+ height: 13px;
+ border-style: solid;
+ border-width: 1px;
+}
+.fui-colorpicker-container .fui-colorpicker-commoncolor,
+.fui-colorpicker-container .fui-colorpicker-standardcolor {
+ margin: 4px 3px;
+ white-space: nowrap;
+}
+.fui-colorpicker-container .fui-colorpicker-toolbar {
+ margin: 4px;
+ height: 27px;
+}
+.fui-colorpicker-container .fui-colorpicker-toolbar .fui-colorpicker-preview {
+ display: inline-block;
+ height: 25px;
+ line-height: 25px;
+ width: 120px;
+ border: 1px solid #d3d3d3;
+}
+.fui-colorpicker-container .fui-colorpicker-toolbar .fui-colorpicker-clear {
+ display: inline-block;
+ height: 25px;
+ line-height: 25px;
+ width: 60px;
+ border: 1px solid #d3d3d3;
+ font-size: 12px;
+ text-align: center;
+ position: absolute;
+ right: 5px;
+ cursor: pointer;
+}
+
+/**
+ * FUI 通用样式定义
+ */
+/*------------ var*/
+/*------------ mixin*/
+
+/**
+ * 通用button
+ */
+/**
+ * FUI 通用样式定义
+ */
+/*------------ var*/
+/*------------ mixin*/
+.fui-dialog {
+ position: fixed;
+ top: -1000000px;
+ left: -100000px;
+ border: 1px solid #B1B1B1;
+ background: #fff;
+}
+.fui-dialog .fui-panel-content {
+ width: auto!important;
+ height: auto!important;
+ padding: 2px;
+}
+.fui-dialog .fui-dialog-caption {
+ margin: 0;
+ padding: 5px;
+ font-size: 16px;
+ font-weight: normal;
+ line-height: 1;
+ display: inline-block;
+}
+.fui-dialog .fui-dialog-head .fui-close-button {
+ float: right;
+}
+.fui-dialog .fui-dialog-head .fui-close-button .fui-close-button-icon {
+ width: 16px;
+ height: 16px;
+ background: url("images/close.png") no-repeat 0 0;
+}
+
+/**
+ * FUI 通用样式定义
+ */
+/*------------ var*/
+/*------------ mixin*/
+.fui-drop-panel {
+ border: 1px solid #d3d3d3;
+ overflow: hidden;
+ position: relative;
+}
+.fui-drop-panel .fui-drop-panel-content {
+ display: inline-block;
+}
+.fui-drop-panel .fui-drop-panel-placeholder {
+ display: none;
+}
+.fui-drop-panel .fui-drop-panel-button {
+ border-left: 1px solid #d3d3d3;
+ visibility: visible;
+}
+.fui-drop-panel .fui-drop-panel-button:HOVER {
+ border-color: #d5e1f2;
+}
+.fui-drop-panel .fui-drop-panel-button:ACTIVE {
+ border-color: #87a9da;
+}
+.fui-drop-panel:HOVER {
+ border-color: #d5e1f2;
+}
+.fui-drop-panel:HOVER .fui-drop-panel-button {
+ border-left-color: #d5e1f2;
+}
+.fui-drop-panel:ACTIVE {
+ border-color: #87a9da;
+}
+.fui-drop-panel:ACTIVE .fui-drop-panel-button {
+ border-left-color: #d5e1f2;
+}
+.fui-drop-panel.fui-drop-panel-open {
+ overflow: visible;
+}
+.fui-drop-panel.fui-drop-panel-open .fui-drop-panel-content {
+ border: 1px solid #d3d3d3;
+ position: absolute;
+ top: -1px;
+ left: -1px;
+}
+.fui-drop-panel.fui-drop-panel-open .fui-drop-panel-button {
+ visibility: hidden;
+}
+.fui-drop-panel.fui-drop-panel-open .fui-drop-panel-placeholder {
+ display: inline-block;
+}
+.fui-drop-panel-popup {
+ border: 1px solid #d3d3d3;
+}
+.fui-drop-panel-popup:HOVER {
+ border-color: #d5e1f2;
+}
+.fui-drop-panel-popup:HOVER .fui-drop-panel-button {
+ border-left-color: #d5e1f2;
+}
+.fui-drop-panel-popup:ACTIVE {
+ border-color: #87a9da;
+}
+.fui-drop-panel-popup:ACTIVE .fui-drop-panel-button {
+ border-left-color: #d5e1f2;
+}
+
+.fui-icon {
+ text-align: center;
+ font-size: 0;
+}
+.fui-icon img {
+ display: inline-block;
+}
+
+/**
+ * FUI 通用样式定义
+ */
+/*------------ var*/
+/*------------ mixin*/
+.fui-input-button {
+ border: 1px solid #ababab;
+}
+.fui-input-button .fui-input {
+ vertical-align: middle;
+ border: none!important;
+}
+.fui-input-button .fui-button {
+ vertical-align: middle;
+}
+.fui-input-button:HOVER {
+ border-color: #87a9da;
+}
+.fui-input-button:ACTIVE {
+ border-color: #87a9da;
+}
+
+/**
+ * FUI 通用样式定义
+ */
+/*------------ var*/
+/*------------ mixin*/
+.fui-input {
+ border: 1px solid #d3d3d3;
+ padding: 1px;
+ margin: 0;
+}
+.fui-input:HOVER,
+.fui-input:FOCUS {
+ border-color: #4d90fe!important;
+}
+
+/**
+ * FUI 通用样式定义
+ */
+/*------------ var*/
+/*------------ mixin*/
+.fui-item {
+ font-size: 0;
+}
+.fui-item .fui-icon {
+ vertical-align: middle;
+}
+.fui-item .fui-label {
+ vertical-align: middle;
+}
+.fui-item.fui-item-selected {
+ background: #87a9da;
+}
+
+/**
+ * FUI 通用样式定义
+ */
+/*------------ var*/
+/*------------ mixin*/
+.fui-label-panel .fui-label-panel-label {
+ width: 100%;
+ color: #666;
+}
+.fui-label-panel.fui-no-position .fui-label-panel-label {
+ position: static!important;
+}
+.fui-label-panel.fui-layout-bottom .fui-label-panel-label {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ top: auto;
+ z-index: 2;
+}
+
+.fui-label {
+ cursor: default;
+ display: inline-block;
+ white-space: nowrap;
+}
+
+/**
+ * 通用button
+ */
+.fui-mask {
+ position: fixed;
+ z-index: 99998;
+}
+
+/**
+ * FUI 通用样式定义
+ */
+/*------------ var*/
+/*------------ mixin*/
+.fui-menu {
+ background-color: #fff;
+ border: 1px solid #d3d3d3;
+}
+.fui-menu .fui-item {
+ padding: 2px 5px;
+ display: block!important;
+}
+.fui-menu .fui-item:HOVER {
+ background: #d5e1f2;
+}
+
+/**
+ * 通用button
+ */
+/**
+ * FUI 通用样式定义
+ */
+/*------------ var*/
+/*------------ mixin*/
+.fui-panel {
+ display: inline-block;
+ vertical-align: top;
+ overflow-y: auto;
+ overflow-x: hidden;
+}
+.fui-panel .fui-panel-content {
+ position: relative;
+ top: 0;
+ left: 0;
+}
+.fui-panel .fui-panel-content {
+ width: 100%;
+ height: 100%;
+}
+.fui-panel.fui-container-column {
+ font-size: 0;
+}
+.fui-panel.fui-container-column .fui-column {
+ display: block;
+}
+
+/**
+ * 通用button
+ */
+.fui-ppanel::-webkit-scrollbar {
+ width: 15px;
+}
+.fui-ppanel::-webkit-scrollbar-button:start:decrement,
+.fui-ppanel::-webkit-scrollbar-button:end:decrement,
+.fui-ppanel::-webkit-scrollbar-button:start:increment,
+.fui-ppanel::-webkit-scrollbar-button:end:increment,
+.fui-ppanel::-webkit-scrollbar-thumb {
+ border: 1px solid #e7e7e7;
+}
+.fui-ppanel.fui-ppanel-position {
+ position: fixed;
+ z-index: 99999;
+}
+
+/**
+ * FUI 通用样式定义
+ */
+/*------------ var*/
+/*------------ mixin*/
+.fui-separator {
+ background: #6d6d6d;
+}
+
+/**
+ * Spin-button
+ */
+.fui-spin-button .fui-spin-up-btn .fui-icon,
+.fui-spin-button .fui-spin-down-btn .fui-icon {
+ width: 16px;
+ height: 9px;
+ background: url("images/up.png") no-repeat 3px 1.5px;
+}
+.fui-spin-button .fui-spin-down-btn .fui-icon {
+ background-image: url("images/down.png");
+}
+
+/**
+ * 通用button
+ */
+/**
+ * FUI 通用样式定义
+ */
+/*------------ var*/
+/*------------ mixin*/
+.fui-tabs .fui-selected {
+ background-color: #d5e1f2;
+}
+
+/**
+ * 可切换Button (ToggleButton)
+ */
+/**
+ * FUI 通用样式定义
+ */
+/*------------ var*/
+/*------------ mixin*/
+.fui-toggle-button.fui-button-pressed {
+ background-color: #aec5e6;
+}
+.fui-toggle-button.fui-button-pressed.fui-disabled {
+ background-color: #aec5e6 !important;
+}
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/fui.min.css b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/fui.min.css
new file mode 100644
index 0000000..3faab2a
--- /dev/null
+++ b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/fui.min.css
@@ -0,0 +1,10 @@
+/*!
+ * ====================================================
+ * Themes file * Flex UI - v1.0.0 - 2014-07-28
+ * https://github.com/fex-team/fui
+ * GitHub: https://github.com/fex-team/fui.git
+ * Copyright (c) 2014 Baidu Kity Group; Licensed MIT
+ * ====================================================
+ */
+
+.fui-widget{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-drag:none;color:#000;line-height:1.5;font-size:12px;font-family:ff-tisa-web-pro-1,ff-tisa-web-pro-2,"Lucida Grande","Hiragino Sans GB","Hiragino Sans GB W3","Microsoft YaHei","WenQuanYi Micro Hei",sans-serif;-webkit-font-smoothing:antialiased;outline:0;display:inline-block;vertical-align:top;position:relative;top:0;left:0}.fui-widget.fui-selectable{-webkit-user-select:text;-khtml-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;-webkit-user-drag:text}.fui-widget *{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-drag:none}.fui-widget.fui-disabled{opacity:.3!important}.fui-widget.fui-hide{display:none!important}.fui-widget.fui-mask-animate{-webkit-transition:all .2s}.fui-widget.fui-mask-hint{-webkit-transform:perspective(600px) translateZ(30px)}.fui-container{overflow:hidden;position:relative;top:0;left:0}.fui-container.fui-disabled{opacity:1!important}.fui-button-menu{border:1px solid #fff}.fui-button-menu:HOVER{border-color:#d5e1f2}.fui-button-menu.fui-button-active{border-color:#d5e1f2;background:#d5e1f2}.fui-button-menu.fui-button-active .fui-button{background:#d5e1f2}.fui-button-menu.fui-layout-bottom,.fui-button-menu.fui-layout-top{text-align:center}.fui-button-menu.fui-layout-bottom .fui-open-btn,.fui-button-menu.fui-layout-top .fui-open-btn{display:block}.fui-button{overflow:hidden;cursor:default;font-size:0}.fui-button ._layout .fui-icon,.fui-button ._layout .fui-label{display:block}.fui-button .fui-icon,.fui-button .fui-label{display:inline-block;vertical-align:middle}.fui-button.fui-button-layout-bottom .fui-icon,.fui-button.fui-button-layout-bottom .fui-label,.fui-button.fui-button-layout-top .fui-icon,.fui-button.fui-button-layout-top .fui-label{display:block}.fui-button:HOVER{background-color:#d5e1f2!important;color:#000!important}.fui-button:ACTIVE{background-color:#87a9da!important;color:#000!important}.fui-button.fui-disabled:ACTIVE,.fui-button.fui-disabled:HOVER{background-color:#fff!important;color:#000!important}.fui-colorpicker{background-color:#fff}.fui-colorpicker-container{border:1px solid #d3d3d3}.fui-colorpicker-container .fui-colorpicker-title{background:#eee;padding:2px 4px}.fui-colorpicker-container .fui-colorpicker-colors{margin:0;padding:0;font-size:0;line-height:0}.fui-colorpicker-container .fui-colorpicker-colors-line0{margin-bottom:3px}.fui-colorpicker-container .fui-colorpicker-item{display:inline-block;margin:0 2px;width:13px;height:13px;border-style:solid;border-width:1px}.fui-colorpicker-container .fui-colorpicker-commoncolor,.fui-colorpicker-container .fui-colorpicker-standardcolor{margin:4px 3px;white-space:nowrap}.fui-colorpicker-container .fui-colorpicker-toolbar{margin:4px;height:27px}.fui-colorpicker-container .fui-colorpicker-toolbar .fui-colorpicker-preview{display:inline-block;height:25px;line-height:25px;width:120px;border:1px solid #d3d3d3}.fui-colorpicker-container .fui-colorpicker-toolbar .fui-colorpicker-clear{display:inline-block;height:25px;line-height:25px;width:60px;border:1px solid #d3d3d3;font-size:12px;text-align:center;position:absolute;right:5px;cursor:pointer}.fui-dialog{position:fixed;top:-1000000px;left:-100000px;border:1px solid #B1B1B1;background:#fff}.fui-dialog .fui-panel-content{width:auto!important;height:auto!important;padding:2px}.fui-dialog .fui-dialog-caption{margin:0;padding:5px;font-size:16px;font-weight:400;line-height:1;display:inline-block}.fui-dialog .fui-dialog-head .fui-close-button{float:right}.fui-dialog .fui-dialog-head .fui-close-button .fui-close-button-icon{width:16px;height:16px;background:url(images/close.png) no-repeat}.fui-drop-panel{border:1px solid #d3d3d3;overflow:hidden;position:relative}.fui-drop-panel .fui-drop-panel-content{display:inline-block}.fui-drop-panel .fui-drop-panel-placeholder{display:none}.fui-drop-panel .fui-drop-panel-button{border-left:1px solid #d3d3d3;visibility:visible}.fui-drop-panel .fui-drop-panel-button:HOVER{border-color:#d5e1f2}.fui-drop-panel .fui-drop-panel-button:ACTIVE{border-color:#87a9da}.fui-drop-panel:HOVER{border-color:#d5e1f2}.fui-drop-panel:HOVER .fui-drop-panel-button{border-left-color:#d5e1f2}.fui-drop-panel:ACTIVE{border-color:#87a9da}.fui-drop-panel:ACTIVE .fui-drop-panel-button{border-left-color:#d5e1f2}.fui-drop-panel.fui-drop-panel-open{overflow:visible}.fui-drop-panel.fui-drop-panel-open .fui-drop-panel-content{border:1px solid #d3d3d3;position:absolute;top:-1px;left:-1px}.fui-drop-panel.fui-drop-panel-open .fui-drop-panel-button{visibility:hidden}.fui-drop-panel.fui-drop-panel-open .fui-drop-panel-placeholder{display:inline-block}.fui-drop-panel-popup{border:1px solid #d3d3d3}.fui-drop-panel-popup:HOVER{border-color:#d5e1f2}.fui-drop-panel-popup:HOVER .fui-drop-panel-button{border-left-color:#d5e1f2}.fui-drop-panel-popup:ACTIVE{border-color:#87a9da}.fui-drop-panel-popup:ACTIVE .fui-drop-panel-button{border-left-color:#d5e1f2}.fui-icon{text-align:center;font-size:0}.fui-icon img{display:inline-block}.fui-input-button{border:1px solid #ababab}.fui-input-button .fui-input{vertical-align:middle;border:none!important}.fui-input-button .fui-button{vertical-align:middle}.fui-input-button:ACTIVE,.fui-input-button:HOVER{border-color:#87a9da}.fui-input{border:1px solid #d3d3d3;padding:1px;margin:0}.fui-input:FOCUS,.fui-input:HOVER{border-color:#4d90fe!important}.fui-item{font-size:0}.fui-item .fui-icon,.fui-item .fui-label{vertical-align:middle}.fui-item.fui-item-selected{background:#87a9da}.fui-label-panel .fui-label-panel-label{width:100%;color:#666}.fui-label-panel.fui-no-position .fui-label-panel-label{position:static!important}.fui-label-panel.fui-layout-bottom .fui-label-panel-label{position:absolute;bottom:0;left:0;top:auto;z-index:2}.fui-label{cursor:default;display:inline-block;white-space:nowrap}.fui-mask{position:fixed;z-index:99998}.fui-menu{background-color:#fff;border:1px solid #d3d3d3}.fui-menu .fui-item{padding:2px 5px;display:block!important}.fui-menu .fui-item:HOVER{background:#d5e1f2}.fui-panel{display:inline-block;vertical-align:top;overflow-y:auto;overflow-x:hidden}.fui-panel .fui-panel-content{position:relative;top:0;left:0;width:100%;height:100%}.fui-panel.fui-container-column{font-size:0}.fui-panel.fui-container-column .fui-column{display:block}.fui-ppanel::-webkit-scrollbar{width:15px}.fui-ppanel::-webkit-scrollbar-button:end:decrement,.fui-ppanel::-webkit-scrollbar-button:end:increment,.fui-ppanel::-webkit-scrollbar-button:start:decrement,.fui-ppanel::-webkit-scrollbar-button:start:increment,.fui-ppanel::-webkit-scrollbar-thumb{border:1px solid #e7e7e7}.fui-ppanel.fui-ppanel-position{position:fixed;z-index:99999}.fui-separator{background:#6d6d6d}.fui-spin-button .fui-spin-down-btn .fui-icon,.fui-spin-button .fui-spin-up-btn .fui-icon{width:16px;height:9px;background:url(images/up.png) 3px 1.5px no-repeat}.fui-spin-button .fui-spin-down-btn .fui-icon{background-image:url(images/down.png)}.fui-tabs .fui-selected{background-color:#d5e1f2}.fui-toggle-button.fui-button-pressed{background-color:#aec5e6}.fui-toggle-button.fui-button-pressed.fui-disabled{background-color:#aec5e6!important}
\ No newline at end of file
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/close.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/close.png
new file mode 100644
index 0000000..4f8885f
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/close.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/down.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/down.png
new file mode 100644
index 0000000..cf92db6
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/down.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/open.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/open.png
new file mode 100644
index 0000000..861a04e
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/open.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/up.png b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/up.png
new file mode 100644
index 0000000..4e4a6d1
Binary files /dev/null and b/public/resource/tinymce/plugins/kityformula-editor/kityformula/assets/theme/default/images/up.png differ
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/js/jquery-3.6.0.min.js b/public/resource/tinymce/plugins/kityformula-editor/kityformula/js/jquery-3.6.0.min.js
new file mode 100644
index 0000000..c4c6022
--- /dev/null
+++ b/public/resource/tinymce/plugins/kityformula-editor/kityformula/js/jquery-3.6.0.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0p;p++)k=n[p],k!==h?k?"string"==typeof k?(n[p]="brackets"===e.name&&2>p?k:"function"===e.name&&0===p?k:c("text",k),f.operand.push(n[p])):(f.operand.push({}),n[p]=b(a.operand[p],k,f.operand[f.operand.length-1],g,i)):(n[p]=c("empty"),f.operand.push(n[p])):(m.push(p),i.hasOwnProperty("startOffset")||(i.startOffset=p),i.endOffset=p,e.attr&&e.attr.id&&(i.groupId=e.attr.id));for(2===m.length&&(i.endOffset-=1);p=m.length;)p=m[p-1],n.splice(p,1),m.length--,a.operand.splice(p,1)}if(o=d(e.name),!o)throw new Error("operator type error: not found "+e.operator);j=function(){},j.prototype=o.prototype,l=new j,o.apply(l,n),f.func=l;for(var r in e.callFn)e.callFn.hasOwnProperty(r)&&l[r]&&l[r].apply(l,e.callFn[r]);return e.attr&&(e.attr.id&&(g[e.attr.id]={objGroup:l,strGroup:a}),e.attr["data-root"]&&(g.root={objGroup:l,strGroup:a}),l.setAttr(e.attr)),l}function c(a,b){switch(a){case"empty":return new kf.EmptyExpression;case"text":return new kf.TextExpression(b)}}function d(a){return g[a]||kf[a.replace(/^[a-z]/i,function(a){return a.toUpperCase()}).replace(/-([a-z])/gi,function(a,b){return b.toUpperCase()})+"Expression"]}function e(a){var b={};if("[object Array]"==={}.toString.call(a)){b=[];for(var c=0,d=a.length;d>c;c++)b[c]=f(a[c])}else for(var e in a)a.hasOwnProperty(e)&&(b[e]=f(a[e]));return b}function f(a){return a?"object"!=typeof a?a:e(a):a}var g={},h="\uf155";return a.prototype.generateBy=function(a){var c=a.tree,d={},f={},g={};if("string"==typeof c)throw new Error("Unhandled error");return this.formula.appendExpression(b(c,e(c),d,g,f)),{select:f,parsedTree:c,tree:d,mapping:g}},a.prototype.regenerateBy=function(a){return this.formula.clearExpressions(),this.generateBy(a)},a}},b[1]={value:function(){return{toRPNExpression:b.r(2),generateTree:b.r(3)}}},b[2]={value:function(){function a(b){var e=[],f=null;for(b=c(b);f=b.shift();)"combination"===f.name&&1===f.operand.length&&"brackets"===f.operand[0].name&&(f=f.operand[0]),e.push(d.isArray(f)?a(f):f);return e}function c(a){for(var b=[],c=null;void 0!==(c=a.pop());)if(!c||"object"!=typeof c||c.sign!==!1&&"function"!==c.name)b.push(c);else{var d=c.handler(c,[],b.reverse());b.unshift(d),b.reverse()}return b.reverse()}var d=b.r(4);return a}},b[3]={value:function(){function a(b){for(var e=null,f=[],g=0,h=b.length;h>g;g++)d.isArray(b[g])&&(b[g]=a(b[g]));for(;e=b.shift();)f.push("object"==typeof e&&e.handler?e.handler(e,f,b):e);return c(f)}var c=b.r(13),d=b.r(4);return a}},b[4]={value:function(){var a=b.r(7),c=b.r(6),d=b.r(15),e={getLatexType:function(b){return b=b.replace(/^\\/,""),a[b]?"operator":c[b]?"function":"text"},isArray:function(a){return a&&"[object Array]"===Object.prototype.toString.call(a)},getDefine:function(b){return e.extend({},a[b.replace("\\","")])},getFuncDefine:function(a){return{name:"function",params:a.replace(/^\\/,""),handler:d}},getBracketsDefine:function(b,c){return e.extend({params:[b,c]},a.brackets)},extend:function(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}};return e}},b[5]={value:function(){var a=!0;return{".":a,"{":a,"}":a,"[":a,"]":a,"(":a,")":a,"|":a}}},b[6]={value:function(){return{sin:1,cos:1,arccos:1,cosh:1,det:1,inf:1,limsup:1,Pr:1,tan:1,arcsin:1,cot:1,dim:1,ker:1,ln:1,sec:1,tanh:1,arctan:1,coth:1,exp:1,lg:1,log:1,arg:1,csc:1,gcd:1,lim:1,max:1,sinh:1,deg:1,hom:1,liminf:1,min:1,sup:1}}},b[7]={value:function(){var a=b.r(22),c=b.r(11);return{"^":{name:"superscript",type:c.OP,handler:a},_:{name:"subscript",type:c.OP,handler:a},frac:{name:"fraction",type:c.FN,sign:!1,handler:b.r(14)},sqrt:{name:"radical",type:c.FN,sign:!1,handler:b.r(23)},sum:{name:"summation",type:c.FN,traversal:"rtl",handler:b.r(24)},"int":{name:"integration",type:c.FN,traversal:"rtl",handler:b.r(16)},brackets:{name:"brackets",type:c.FN,handler:b.r(12)},mathcal:{name:"mathcal",type:c.FN,sign:!1,handler:b.r(19)},mathfrak:{name:"mathfrak",type:c.FN,sign:!1,handler:b.r(20)},mathbb:{name:"mathbb",type:c.FN,sign:!1,handler:b.r(18)},mathrm:{name:"mathrm",type:c.FN,sign:!1,handler:b.r(21)}}}},b[8]={value:function(){return{"int":b.r(26),quot:b.r(27)}}},b[9]={value:function(){return{combination:b.r(29),fraction:b.r(30),"function":b.r(31),integration:b.r(32),subscript:b.r(39),superscript:b.r(41),script:b.r(37),radical:b.r(38),summation:b.r(40),brackets:b.r(28),mathcal:b.r(34),mathfrak:b.r(35),mathbb:b.r(33),mathrm:b.r(36)}}},b[10]={value:function(){return{"#":1,$:1,"%":1,_:1,"&":1,"{":1,"}":1,"^":1,"~":1}}},b[11]={value:function(){return{OP:1,FN:2}}},b[12]={value:function(){var a=b.r(5);return function(b,c,d){for(var e=0,f=b.params.length;f>e;e++)if(!(b.params[e]in a))throw new Error("Brackets: invalid params");return b.operand=b.params,b.params[2]=d.shift(),delete b.handler,delete b.params,b}}},b[13]={value:function(){return function(){return{name:"combination",operand:arguments[0]||[]}}}},b[14]={value:function(){return function(a,b,c){var d=c.shift(),e=c.shift();if(void 0===d||void 0===e)throw new Error("Frac: Syntax Error");return d.handler&&"integration"===d.name?(d=d.handler(d,b,[e]),e=c.shift()):e.handler&&"integration"===e.name&&(e=e.handler(e,b,[c.shift()])),a.operand=[d,e],delete a.handler,a}}},b[15]={value:function(){var a=b.r(17);return function(b,c,d){var e=a.exec(d);return e.expr&&e.expr.handler&&"integration"===e.expr.name&&(e.expr=e.expr.handler(e.expr,c,[d.shift()])),b.operand=[b.params,e.expr,e.superscript,e.subscript],delete b.params,delete b.handler,b}}},b[16]={value:function(){var a=b.r(17),c=b.r(11).FN;return function(b,d,e){var f=e.shift(),g=a.exec(e);return g.expr&&g.expr.type===c&&g.expr.handler&&"integration"===g.expr.name&&(g.expr=g.expr.handler(g.expr,d,[e.shift()])),b.operand=[g.expr,g.superscript,g.subscript],b.callFn={setType:[0|f]},delete b.handler,b}}},b[17]={value:function(){function a(a){var c=b(a),d=null,e={superscript:null,subscript:null};if(!c)return e;if(d=b(a),e[c.type]=c.value||null,d){if(d.type===c.type)throw new Error("Script: syntax error!");e[d.type]=d.value||null}return e}function b(a){var b=a.shift();return b?"subscript"===b.name||"superscript"===b.name?{type:b.name,value:a.shift()}:(a.unshift(b),null):null}return{exec:function(b){var c=a(b),d=b.shift();if(d&&d.name&&-1!==d.name.indexOf("script"))throw new Error("Script: syntax error!");return c.expr=d||null,c}}}},b[18]={value:function(){return function(a,b,c){var d=c.shift();return"object"==typeof d&&"combination"===d.name&&(d=d.operand.join("")),a.name="text",a.attr={_reverse:"mathbb"},a.callFn={setFamily:["KF AMS BB"]},a.operand=[d],delete a.handler,a}}},b[19]={value:function(){return function(a,b,c){var d=c.shift();return"object"==typeof d&&"combination"===d.name&&(d=d.operand.join("")),a.name="text",a.attr={_reverse:"mathcal"},a.callFn={setFamily:["KF AMS CAL"]},a.operand=[d],delete a.handler,a}}},b[20]={value:function(){return function(a,b,c){var d=c.shift();return"object"==typeof d&&"combination"===d.name&&(d=d.operand.join("")),a.name="text",a.attr={_reverse:"mathfrak"},a.callFn={setFamily:["KF AMS FRAK"]},a.operand=[d],delete a.handler,a}}},b[21]={value:function(){return function(a,b,c){var d=c.shift();return"object"==typeof d&&"combination"===d.name&&(d=d.operand.join("")),a.name="text",a.attr={_reverse:"mathrm"},a.callFn={setFamily:["KF AMS ROMAN"]},a.operand=[d],delete a.handler,a}}},b[22]={value:function(){return function(a,b,c){var d=b.pop(),e=c.shift()||null;if(!e)throw new Error("Missing script");if(d=d||"",d.name===a.name||"script"===d.name)throw new Error("script error");return"subscript"===d.name?(d.name="script",d.operand[2]=d.operand[1],d.operand[1]=e,d):"superscript"===d.name?(d.name="script",d.operand[2]=e,d):(a.operand=[d,e],delete a.handler,a)}}},b[23]={value:function(){var a=b.r(13);return function(b,c,d){var e=d.shift(),f=null,g=null;if("["===e){for(e=[];(f=d.shift())&&"]"!==f;)e.push(f);e=0===e.length?null:a(e),g=d.shift()}else g=e,e=null;return b.operand=[g,e],delete b.handler,b}}},b[24]={value:function(){var a=b.r(17),c=b.r(11).FN;return function(b,d,e){var f=a.exec(e);return f.expr&&f.expr.type===c&&f.expr.handler&&"integration"===f.expr.name&&(f.expr=f.expr.handler(f.expr,d,[e.shift()])),b.operand=[f.expr,f.superscript,f.subscript],delete b.handler,b}}},b[25]={value:function(){function a(a){if(d(a))return a.substring(1);switch(m.getLatexType(a)){case"operator":return m.getDefine(a);case"function":return m.getFuncDefine(a);default:return c(a)}}function c(a){return 0===a.indexOf("\\")?a+"\\":a}function d(a){return 0===a.indexOf("\\")?!!l[a.substring(1)]:!1}function e(a){return a.replace(/\\\s+/,"").replace(/\s*([^a-z0-9\s])\s*/gi,function(a,b){return b})}var f=b.r(43).Parser,g=b.r(1),h=b.r(8),i=b.r(42),j=b.r(7),k=b.r(9),l=b.r(10),m=b.r(4),n="\ufff8",o="\ufffc",p=new RegExp(n+"|"+o,"g"),q=new RegExp(n,"g"),r=new RegExp(o,"g");f.register("latex",f.implement({parse:function(a){var b=this.split(this.format(a));return b=this.parseToGroup(b),b=this.parseToStruct(b),this.generateTree(b)},serialization:function(a,b){return i(a,b)},expand:function(a){var b=a.parse,c=null,d=a.pre,e=a.reverse;for(var f in b)b.hasOwnProperty(f)&&(c=f.replace(/\\/g,""),j[c]=b[f]);for(var f in e)e.hasOwnProperty(f)&&(k[f.replace(/\\/g,"")]=e[f]);if(d)for(var f in d)d.hasOwnProperty(f)&&(h[f.replace(/\\/g,"")]=d[f])},format:function(a){a=e(a),a=a.replace(p,"").replace(/\\{/gi,n).replace(/\\}/gi,o);for(var b in h)h.hasOwnProperty(b)&&(a=h[b](a));return a},split:function(a){var b=[],c=/(?:\\[^a-z]\s*)|(?:\\[a-z]+\s*)|(?:[{}]\s*)|(?:[^\\{}]\s*)/gi,d=/^\s+|\s+$/g,e=null;for(a=a.replace(d,"");e=c.exec(a);)e=e[0].replace(d,""),e&&b.push(e);return b},generateTree:function(a){for(var b=[],c=null;c=a.shift();)b.push(m.isArray(c)?this.generateTree(c):c);return b=g.toRPNExpression(b),g.generateTree(b)},parseToGroup:function(a){for(var b=[],c=[b],d=0,e=0,f=0,g=a.length;g>f;f++)switch(a[f]){case"{":d++,c.push(b),b.push([]),b=b[b.length-1];break;case"}":d--,b=c.pop();break;case"\\left":e++,c.push(b),b.push([[]]),b=b[b.length-1][0],b.type="brackets",f++,b.leftBrackets=a[f].replace(q,"{").replace(r,"}");break;case"\\right":e--,f++,b.rightBrackets=a[f].replace(q,"{").replace(r,"}"),b=c.pop();break;default:b.push(a[f].replace(q,"\\{").replace(r,"\\}"))}if(0!==d)throw new Error("Group Error!");if(0!==e)throw new Error("Brackets Error!");return c[0]},parseToStruct:function(b){for(var c=[],d=0,e=b.length;e>d;d++)m.isArray(b[d])?"brackets"===b[d].type?(c.push(m.getBracketsDefine(b[d].leftBrackets,b[d].rightBrackets)),c.push(this.parseToStruct(b[d]))):c.push(this.parseToStruct(b[d])):c.push(a(b[d]));return c}}))}},b[26]={value:function(){return function(a){return a.replace(/\\(i+)nt(\b|[^a-zA-Z])/g,function(a,b,c){return"\\int "+b.length+c})}}},b[27]={value:function(){return function(a){return a.replace(/``/g,"\u201c")}}},b[28]={value:function(){return function(a){return("{"===a[0]||"}"===a[0])&&(a[0]="\\"+a[0]),("{"===a[1]||"}"===a[1])&&(a[1]="\\"+a[1]),["\\left",a[0],a[2],"\\right",a[1]].join(" ")}}},b[29]={value:function(){return function(a){return this.attr["data-root"]||this.attr["data-placeholder"]?a.join(""):"{"+a.join("")+"}"}}},b[30]={value:function(){return function(a){return"\\frac "+a[0]+" "+a[1]}}},b[31]={value:function(){return function(a){var b=["\\"+a[0]];return a[2]&&b.push("^"+a[2]),a[3]&&b.push("_"+a[3]),a[1]&&b.push(" "+a[1]),b.join("")}}},b[32]={value:function(){return function(a){var b=["\\int "];if(this.callFn&&this.callFn.setType){b=["\\"];for(var c=0,d=this.callFn.setType;d>c;c++)b.push("i");b.push("nt ")}return a[1]&&b.push("^"+a[1]),a[2]&&b.push("_"+a[2]),a[0]&&b.push(" "+a[0]),b.join("")}}},b[33]={value:function(){return function(a){return"\\mathbb{"+a[0]+"}"}}},b[34]={value:function(){return function(a){return"\\mathcal{"+a[0]+"}"}}},b[35]={value:function(){return function(a){return"\\mathfrak{"+a[0]+"}"}}},b[36]={value:function(){return function(a){return"\\mathrm{"+a[0]+"}"}}},b[37]={value:function(){return function(a){return a[0]+"^"+a[1]+"_"+a[2]}}},b[38]={value:function(){return function(a){var b=["\\sqrt"];return a[1]&&b.push("["+a[1]+"]"),b.push(" "+a[0]),b.join("")}}},b[39]={value:function(){return function(a){return a[0]+"_"+a[1]}}},b[40]={value:function(){return function(a){var b=["\\sum "];return a[1]&&b.push("^"+a[1]),a[2]&&b.push("_"+a[2]),a[0]&&b.push(" "+a[0]),b.join("")}}},b[41]={value:function(){return function(a){return a[0]+"^"+a[1]}}},b[42]={value:function(){function a(b,e){var g=[],h=null,i=null;if("object"!=typeof b)return c(b)?"\\"+b+" ":b.replace(f,function(a,b){return b+" "});"combination"===b.name&&1===b.operand.length&&"combination"===b.operand[0].name&&(b=b.operand[0]),i=b.operand;for(var j=0,k=i.length;k>j;j++)g.push(i[j]?a(i[j]):i[j]);return h=b.attr&&b.attr._reverse?b.attr._reverse:b.name,d[h].call(b,g,e)}function c(a){return!!e[a]}var d=b.r(9),e=b.r(10),f=/(\\(?:[\w]+)|(?:[^a-z]))\\/gi;return function(b,c){return a(b,c)}}},b[43]={value:function(a,b,c){function d(a){this.impl=new a,this.conf={}}function e(){this.conf={}}var f={},g={},h={extend:function(a,b){var c=null;b=[].slice.call(arguments,1);for(var d=0,e=b.length;e>d;d++){c=b[d];for(var f in c)c.hasOwnProperty(f)&&(a[f]=c[f])}},setData:function(a,b,c){if("string"==typeof b)a[b]=c;else{if("object"!=typeof b)throw new Error("invalid option");for(c in b)b.hasOwnProperty(c)&&(a[c]=b[c])}}},i={use:function(a){if(!g[a])throw new Error("unknown parser type");return this.proxy(g[a])},config:function(a,b){return h.setData(f,a,b),this},register:function(a,b){return g[a.toLowerCase()]=b,this},implement:function(a){var b=function(){},c=a.constructor||function(){},d=function(){e.call(this),c.call(this)};b.prototype=e.prototype,d.prototype=new b,delete a.constructor;for(var f in a)"constructor"!==f&&a.hasOwnProperty(f)&&(d.prototype[f]=a[f]);return d},proxy:function(a){return new d(a)}};h.extend(d.prototype,{config:function(a,b){h.setData(this.conf,a,b)},set:function(a,b){this.impl.set(a,b)},parse:function(a){var b={config:{},tree:this.impl.parse(a)};return h.extend(b.config,f,this.conf),b},serialization:function(a,b){return this.impl.serialization(a,b)},expand:function(a){this.impl.expand(a)}}),h.extend(e.prototype,{set:function(a,b){h.extend(this.conf,a,b)},parse:function(){throw new Error("Abstract function")}}),c.exports={Parser:i,ParserInterface:e}}},b[44]={value:function(){var a=b.r(43).Parser;b.r(25),window.kf.Parser=a,window.kf.Assembly=b.r(0)}};var c={"kf.start":44};!function(){try{a("kf.start")}catch(b){}}(this)}();
\ No newline at end of file
diff --git a/public/resource/tinymce/plugins/kityformula-editor/kityformula/js/kity-formula-render.all.js b/public/resource/tinymce/plugins/kityformula-editor/kityformula/js/kity-formula-render.all.js
new file mode 100644
index 0000000..8066599
--- /dev/null
+++ b/public/resource/tinymce/plugins/kityformula-editor/kityformula/js/kity-formula-render.all.js
@@ -0,0 +1,5757 @@
+/*!
+ * ====================================================
+ * Kity Formula Render - v1.0.0 - 2014-07-30
+ * https://github.com/kitygraph/formula
+ * GitHub: https://github.com/kitygraph/formula.git
+ * Copyright (c) 2014 Baidu Kity Group; Licensed MIT
+ * ====================================================
+ */
+
+(function () {
+var _p = {
+ r: function(index) {
+ if (_p[index].inited) {
+ return _p[index].value;
+ }
+ if (typeof _p[index].value === "function") {
+ var module = {
+ exports: {}
+ }, returnValue = _p[index].value(null, module.exports, module);
+ _p[index].inited = true;
+ _p[index].value = returnValue;
+ if (returnValue !== undefined) {
+ return returnValue;
+ } else {
+ for (var key in module.exports) {
+ if (module.exports.hasOwnProperty(key)) {
+ _p[index].inited = true;
+ _p[index].value = module.exports;
+ return module.exports;
+ }
+ }
+ }
+ } else {
+ _p[index].inited = true;
+ return _p[index].value;
+ }
+ }
+};
+
+/*!
+ * canvg库封装
+ * canvg官网: https://code.google.com/p/canvg/
+ */
+_p[0] = {
+ value: function(require) {
+ /**
+ * A class to parse color values
+ * @author Stoyan Stefanov
+ * @link http://www.phpied.com/rgb-color-parser-in-javascript/
+ * @license Use it if you like it
+ */
+ function RGBColor(color_string) {
+ this.ok = false;
+ // strip any leading #
+ if (color_string.charAt(0) == "#") {
+ // remove # if any
+ color_string = color_string.substr(1, 6);
+ }
+ color_string = color_string.replace(/ /g, "");
+ color_string = color_string.toLowerCase();
+ // before getting into regexps, try simple matches
+ // and overwrite the input
+ var simple_colors = {
+ aliceblue: "f0f8ff",
+ antiquewhite: "faebd7",
+ aqua: "00ffff",
+ aquamarine: "7fffd4",
+ azure: "f0ffff",
+ beige: "f5f5dc",
+ bisque: "ffe4c4",
+ black: "000000",
+ blanchedalmond: "ffebcd",
+ blue: "0000ff",
+ blueviolet: "8a2be2",
+ brown: "a52a2a",
+ burlywood: "deb887",
+ cadetblue: "5f9ea0",
+ chartreuse: "7fff00",
+ chocolate: "d2691e",
+ coral: "ff7f50",
+ cornflowerblue: "6495ed",
+ cornsilk: "fff8dc",
+ crimson: "dc143c",
+ cyan: "00ffff",
+ darkblue: "00008b",
+ darkcyan: "008b8b",
+ darkgoldenrod: "b8860b",
+ darkgray: "a9a9a9",
+ darkgreen: "006400",
+ darkkhaki: "bdb76b",
+ darkmagenta: "8b008b",
+ darkolivegreen: "556b2f",
+ darkorange: "ff8c00",
+ darkorchid: "9932cc",
+ darkred: "8b0000",
+ darksalmon: "e9967a",
+ darkseagreen: "8fbc8f",
+ darkslateblue: "483d8b",
+ darkslategray: "2f4f4f",
+ darkturquoise: "00ced1",
+ darkviolet: "9400d3",
+ deeppink: "ff1493",
+ deepskyblue: "00bfff",
+ dimgray: "696969",
+ dodgerblue: "1e90ff",
+ feldspar: "d19275",
+ firebrick: "b22222",
+ floralwhite: "fffaf0",
+ forestgreen: "228b22",
+ fuchsia: "ff00ff",
+ gainsboro: "dcdcdc",
+ ghostwhite: "f8f8ff",
+ gold: "ffd700",
+ goldenrod: "daa520",
+ gray: "808080",
+ green: "008000",
+ greenyellow: "adff2f",
+ honeydew: "f0fff0",
+ hotpink: "ff69b4",
+ indianred: "cd5c5c",
+ indigo: "4b0082",
+ ivory: "fffff0",
+ khaki: "f0e68c",
+ lavender: "e6e6fa",
+ lavenderblush: "fff0f5",
+ lawngreen: "7cfc00",
+ lemonchiffon: "fffacd",
+ lightblue: "add8e6",
+ lightcoral: "f08080",
+ lightcyan: "e0ffff",
+ lightgoldenrodyellow: "fafad2",
+ lightgrey: "d3d3d3",
+ lightgreen: "90ee90",
+ lightpink: "ffb6c1",
+ lightsalmon: "ffa07a",
+ lightseagreen: "20b2aa",
+ lightskyblue: "87cefa",
+ lightslateblue: "8470ff",
+ lightslategray: "778899",
+ lightsteelblue: "b0c4de",
+ lightyellow: "ffffe0",
+ lime: "00ff00",
+ limegreen: "32cd32",
+ linen: "faf0e6",
+ magenta: "ff00ff",
+ maroon: "800000",
+ mediumaquamarine: "66cdaa",
+ mediumblue: "0000cd",
+ mediumorchid: "ba55d3",
+ mediumpurple: "9370d8",
+ mediumseagreen: "3cb371",
+ mediumslateblue: "7b68ee",
+ mediumspringgreen: "00fa9a",
+ mediumturquoise: "48d1cc",
+ mediumvioletred: "c71585",
+ midnightblue: "191970",
+ mintcream: "f5fffa",
+ mistyrose: "ffe4e1",
+ moccasin: "ffe4b5",
+ navajowhite: "ffdead",
+ navy: "000080",
+ oldlace: "fdf5e6",
+ olive: "808000",
+ olivedrab: "6b8e23",
+ orange: "ffa500",
+ orangered: "ff4500",
+ orchid: "da70d6",
+ palegoldenrod: "eee8aa",
+ palegreen: "98fb98",
+ paleturquoise: "afeeee",
+ palevioletred: "d87093",
+ papayawhip: "ffefd5",
+ peachpuff: "ffdab9",
+ peru: "cd853f",
+ pink: "ffc0cb",
+ plum: "dda0dd",
+ powderblue: "b0e0e6",
+ purple: "800080",
+ red: "ff0000",
+ rosybrown: "bc8f8f",
+ royalblue: "4169e1",
+ saddlebrown: "8b4513",
+ salmon: "fa8072",
+ sandybrown: "f4a460",
+ seagreen: "2e8b57",
+ seashell: "fff5ee",
+ sienna: "a0522d",
+ silver: "c0c0c0",
+ skyblue: "87ceeb",
+ slateblue: "6a5acd",
+ slategray: "708090",
+ snow: "fffafa",
+ springgreen: "00ff7f",
+ steelblue: "4682b4",
+ tan: "d2b48c",
+ teal: "008080",
+ thistle: "d8bfd8",
+ tomato: "ff6347",
+ turquoise: "40e0d0",
+ violet: "ee82ee",
+ violetred: "d02090",
+ wheat: "f5deb3",
+ white: "ffffff",
+ whitesmoke: "f5f5f5",
+ yellow: "ffff00",
+ yellowgreen: "9acd32"
+ };
+ for (var key in simple_colors) {
+ if (color_string == key) {
+ color_string = simple_colors[key];
+ }
+ }
+ // emd of simple type-in colors
+ // array of color definition objects
+ var color_defs = [ {
+ re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,
+ example: [ "rgb(123, 234, 45)", "rgb(255,234,245)" ],
+ process: function(bits) {
+ return [ parseInt(bits[1]), parseInt(bits[2]), parseInt(bits[3]) ];
+ }
+ }, {
+ re: /^(\w{2})(\w{2})(\w{2})$/,
+ example: [ "#00ff00", "336699" ],
+ process: function(bits) {
+ return [ parseInt(bits[1], 16), parseInt(bits[2], 16), parseInt(bits[3], 16) ];
+ }
+ }, {
+ re: /^(\w{1})(\w{1})(\w{1})$/,
+ example: [ "#fb0", "f0f" ],
+ process: function(bits) {
+ return [ parseInt(bits[1] + bits[1], 16), parseInt(bits[2] + bits[2], 16), parseInt(bits[3] + bits[3], 16) ];
+ }
+ } ];
+ // search through the definitions to find a match
+ for (var i = 0; i < color_defs.length; i++) {
+ var re = color_defs[i].re;
+ var processor = color_defs[i].process;
+ var bits = re.exec(color_string);
+ if (bits) {
+ channels = processor(bits);
+ this.r = channels[0];
+ this.g = channels[1];
+ this.b = channels[2];
+ this.ok = true;
+ }
+ }
+ // validate/cleanup values
+ this.r = this.r < 0 || isNaN(this.r) ? 0 : this.r > 255 ? 255 : this.r;
+ this.g = this.g < 0 || isNaN(this.g) ? 0 : this.g > 255 ? 255 : this.g;
+ this.b = this.b < 0 || isNaN(this.b) ? 0 : this.b > 255 ? 255 : this.b;
+ // some getters
+ this.toRGB = function() {
+ return "rgb(" + this.r + ", " + this.g + ", " + this.b + ")";
+ };
+ this.toHex = function() {
+ var r = this.r.toString(16);
+ var g = this.g.toString(16);
+ var b = this.b.toString(16);
+ if (r.length == 1) r = "0" + r;
+ if (g.length == 1) g = "0" + g;
+ if (b.length == 1) b = "0" + b;
+ return "#" + r + g + b;
+ };
+ // help
+ this.getHelpXML = function() {
+ var examples = new Array();
+ // add regexps
+ for (var i = 0; i < color_defs.length; i++) {
+ var example = color_defs[i].example;
+ for (var j = 0; j < example.length; j++) {
+ examples[examples.length] = example[j];
+ }
+ }
+ // add type-in colors
+ for (var sc in simple_colors) {
+ examples[examples.length] = sc;
+ }
+ var xml = document.createElement("ul");
+ xml.setAttribute("id", "rgbcolor-examples");
+ for (var i = 0; i < examples.length; i++) {
+ try {
+ var list_item = document.createElement("li");
+ var list_color = new RGBColor(examples[i]);
+ var example_div = document.createElement("div");
+ example_div.style.cssText = "margin: 3px; " + "border: 1px solid black; " + "background:" + list_color.toHex() + "; " + "color:" + list_color.toHex();
+ example_div.appendChild(document.createTextNode("test"));
+ var list_item_value = document.createTextNode(" " + examples[i] + " -> " + list_color.toRGB() + " -> " + list_color.toHex());
+ list_item.appendChild(example_div);
+ list_item.appendChild(list_item_value);
+ xml.appendChild(list_item);
+ } catch (e) {}
+ }
+ return xml;
+ };
+ }
+ /*
+
+ StackBlur - a fast almost Gaussian Blur For Canvas
+
+ Version: 0.5
+ Author: Mario Klingemann
+ Contact: mario@quasimondo.com
+ Website: http://www.quasimondo.com/StackBlurForCanvas
+ Twitter: @quasimondo
+
+ In case you find this class useful - especially in commercial projects -
+ I am not totally unhappy for a small donation to my PayPal account
+ mario@quasimondo.de
+
+ Or support me on flattr:
+ https://flattr.com/thing/72791/StackBlur-a-fast-almost-Gaussian-Blur-Effect-for-CanvasJavascript
+
+ Copyright (c) 2010 Mario Klingemann
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation
+ files (the "Software"), to deal in the Software without
+ restriction, including without limitation the rights to use,
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following
+ conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ OTHER DEALINGS IN THE SOFTWARE.
+ */
+ var mul_table = [ 512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512, 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512, 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456, 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512, 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328, 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456, 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335, 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512, 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405, 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328, 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271, 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456, 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388, 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335, 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292, 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259 ];
+ var shg_table = [ 9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24 ];
+ function stackBlurImage(imageID, canvasID, radius, blurAlphaChannel) {
+ var img = document.getElementById(imageID);
+ var w = img.naturalWidth;
+ var h = img.naturalHeight;
+ var canvas = document.getElementById(canvasID);
+ canvas.style.width = w + "px";
+ canvas.style.height = h + "px";
+ canvas.width = w;
+ canvas.height = h;
+ var context = canvas.getContext("2d");
+ context.clearRect(0, 0, w, h);
+ context.drawImage(img, 0, 0);
+ if (isNaN(radius) || radius < 1) return;
+ if (blurAlphaChannel) stackBlurCanvasRGBA(canvasID, 0, 0, w, h, radius); else stackBlurCanvasRGB(canvasID, 0, 0, w, h, radius);
+ }
+ function stackBlurCanvasRGBA(id, top_x, top_y, width, height, radius) {
+ if (isNaN(radius) || radius < 1) return;
+ radius |= 0;
+ var canvas = document.getElementById(id);
+ var context = canvas.getContext("2d");
+ var imageData;
+ try {
+ try {
+ imageData = context.getImageData(top_x, top_y, width, height);
+ } catch (e) {
+ // NOTE: this part is supposedly only needed if you want to work with local files
+ // so it might be okay to remove the whole try/catch block and just use
+ // imageData = context.getImageData( top_x, top_y, width, height );
+ try {
+ netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
+ imageData = context.getImageData(top_x, top_y, width, height);
+ } catch (e) {
+ alert("Cannot access local image");
+ throw new Error("unable to access local image data: " + e);
+ return;
+ }
+ }
+ } catch (e) {
+ alert("Cannot access image");
+ throw new Error("unable to access image data: " + e);
+ }
+ var pixels = imageData.data;
+ var x, y, i, p, yp, yi, yw, r_sum, g_sum, b_sum, a_sum, r_out_sum, g_out_sum, b_out_sum, a_out_sum, r_in_sum, g_in_sum, b_in_sum, a_in_sum, pr, pg, pb, pa, rbs;
+ var div = radius + radius + 1;
+ var w4 = width << 2;
+ var widthMinus1 = width - 1;
+ var heightMinus1 = height - 1;
+ var radiusPlus1 = radius + 1;
+ var sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2;
+ var stackStart = new BlurStack();
+ var stack = stackStart;
+ for (i = 1; i < div; i++) {
+ stack = stack.next = new BlurStack();
+ if (i == radiusPlus1) var stackEnd = stack;
+ }
+ stack.next = stackStart;
+ var stackIn = null;
+ var stackOut = null;
+ yw = yi = 0;
+ var mul_sum = mul_table[radius];
+ var shg_sum = shg_table[radius];
+ for (y = 0; y < height; y++) {
+ r_in_sum = g_in_sum = b_in_sum = a_in_sum = r_sum = g_sum = b_sum = a_sum = 0;
+ r_out_sum = radiusPlus1 * (pr = pixels[yi]);
+ g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);
+ b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);
+ a_out_sum = radiusPlus1 * (pa = pixels[yi + 3]);
+ r_sum += sumFactor * pr;
+ g_sum += sumFactor * pg;
+ b_sum += sumFactor * pb;
+ a_sum += sumFactor * pa;
+ stack = stackStart;
+ for (i = 0; i < radiusPlus1; i++) {
+ stack.r = pr;
+ stack.g = pg;
+ stack.b = pb;
+ stack.a = pa;
+ stack = stack.next;
+ }
+ for (i = 1; i < radiusPlus1; i++) {
+ p = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2);
+ r_sum += (stack.r = pr = pixels[p]) * (rbs = radiusPlus1 - i);
+ g_sum += (stack.g = pg = pixels[p + 1]) * rbs;
+ b_sum += (stack.b = pb = pixels[p + 2]) * rbs;
+ a_sum += (stack.a = pa = pixels[p + 3]) * rbs;
+ r_in_sum += pr;
+ g_in_sum += pg;
+ b_in_sum += pb;
+ a_in_sum += pa;
+ stack = stack.next;
+ }
+ stackIn = stackStart;
+ stackOut = stackEnd;
+ for (x = 0; x < width; x++) {
+ pixels[yi + 3] = pa = a_sum * mul_sum >> shg_sum;
+ if (pa != 0) {
+ pa = 255 / pa;
+ pixels[yi] = (r_sum * mul_sum >> shg_sum) * pa;
+ pixels[yi + 1] = (g_sum * mul_sum >> shg_sum) * pa;
+ pixels[yi + 2] = (b_sum * mul_sum >> shg_sum) * pa;
+ } else {
+ pixels[yi] = pixels[yi + 1] = pixels[yi + 2] = 0;
+ }
+ r_sum -= r_out_sum;
+ g_sum -= g_out_sum;
+ b_sum -= b_out_sum;
+ a_sum -= a_out_sum;
+ r_out_sum -= stackIn.r;
+ g_out_sum -= stackIn.g;
+ b_out_sum -= stackIn.b;
+ a_out_sum -= stackIn.a;
+ p = yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1) << 2;
+ r_in_sum += stackIn.r = pixels[p];
+ g_in_sum += stackIn.g = pixels[p + 1];
+ b_in_sum += stackIn.b = pixels[p + 2];
+ a_in_sum += stackIn.a = pixels[p + 3];
+ r_sum += r_in_sum;
+ g_sum += g_in_sum;
+ b_sum += b_in_sum;
+ a_sum += a_in_sum;
+ stackIn = stackIn.next;
+ r_out_sum += pr = stackOut.r;
+ g_out_sum += pg = stackOut.g;
+ b_out_sum += pb = stackOut.b;
+ a_out_sum += pa = stackOut.a;
+ r_in_sum -= pr;
+ g_in_sum -= pg;
+ b_in_sum -= pb;
+ a_in_sum -= pa;
+ stackOut = stackOut.next;
+ yi += 4;
+ }
+ yw += width;
+ }
+ for (x = 0; x < width; x++) {
+ g_in_sum = b_in_sum = a_in_sum = r_in_sum = g_sum = b_sum = a_sum = r_sum = 0;
+ yi = x << 2;
+ r_out_sum = radiusPlus1 * (pr = pixels[yi]);
+ g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);
+ b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);
+ a_out_sum = radiusPlus1 * (pa = pixels[yi + 3]);
+ r_sum += sumFactor * pr;
+ g_sum += sumFactor * pg;
+ b_sum += sumFactor * pb;
+ a_sum += sumFactor * pa;
+ stack = stackStart;
+ for (i = 0; i < radiusPlus1; i++) {
+ stack.r = pr;
+ stack.g = pg;
+ stack.b = pb;
+ stack.a = pa;
+ stack = stack.next;
+ }
+ yp = width;
+ for (i = 1; i <= radius; i++) {
+ yi = yp + x << 2;
+ r_sum += (stack.r = pr = pixels[yi]) * (rbs = radiusPlus1 - i);
+ g_sum += (stack.g = pg = pixels[yi + 1]) * rbs;
+ b_sum += (stack.b = pb = pixels[yi + 2]) * rbs;
+ a_sum += (stack.a = pa = pixels[yi + 3]) * rbs;
+ r_in_sum += pr;
+ g_in_sum += pg;
+ b_in_sum += pb;
+ a_in_sum += pa;
+ stack = stack.next;
+ if (i < heightMinus1) {
+ yp += width;
+ }
+ }
+ yi = x;
+ stackIn = stackStart;
+ stackOut = stackEnd;
+ for (y = 0; y < height; y++) {
+ p = yi << 2;
+ pixels[p + 3] = pa = a_sum * mul_sum >> shg_sum;
+ if (pa > 0) {
+ pa = 255 / pa;
+ pixels[p] = (r_sum * mul_sum >> shg_sum) * pa;
+ pixels[p + 1] = (g_sum * mul_sum >> shg_sum) * pa;
+ pixels[p + 2] = (b_sum * mul_sum >> shg_sum) * pa;
+ } else {
+ pixels[p] = pixels[p + 1] = pixels[p + 2] = 0;
+ }
+ r_sum -= r_out_sum;
+ g_sum -= g_out_sum;
+ b_sum -= b_out_sum;
+ a_sum -= a_out_sum;
+ r_out_sum -= stackIn.r;
+ g_out_sum -= stackIn.g;
+ b_out_sum -= stackIn.b;
+ a_out_sum -= stackIn.a;
+ p = x + ((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width << 2;
+ r_sum += r_in_sum += stackIn.r = pixels[p];
+ g_sum += g_in_sum += stackIn.g = pixels[p + 1];
+ b_sum += b_in_sum += stackIn.b = pixels[p + 2];
+ a_sum += a_in_sum += stackIn.a = pixels[p + 3];
+ stackIn = stackIn.next;
+ r_out_sum += pr = stackOut.r;
+ g_out_sum += pg = stackOut.g;
+ b_out_sum += pb = stackOut.b;
+ a_out_sum += pa = stackOut.a;
+ r_in_sum -= pr;
+ g_in_sum -= pg;
+ b_in_sum -= pb;
+ a_in_sum -= pa;
+ stackOut = stackOut.next;
+ yi += width;
+ }
+ }
+ context.putImageData(imageData, top_x, top_y);
+ }
+ function stackBlurCanvasRGB(id, top_x, top_y, width, height, radius) {
+ if (isNaN(radius) || radius < 1) return;
+ radius |= 0;
+ var canvas = document.getElementById(id);
+ var context = canvas.getContext("2d");
+ var imageData;
+ try {
+ try {
+ imageData = context.getImageData(top_x, top_y, width, height);
+ } catch (e) {
+ // NOTE: this part is supposedly only needed if you want to work with local files
+ // so it might be okay to remove the whole try/catch block and just use
+ // imageData = context.getImageData( top_x, top_y, width, height );
+ try {
+ netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
+ imageData = context.getImageData(top_x, top_y, width, height);
+ } catch (e) {
+ alert("Cannot access local image");
+ throw new Error("unable to access local image data: " + e);
+ return;
+ }
+ }
+ } catch (e) {
+ alert("Cannot access image");
+ throw new Error("unable to access image data: " + e);
+ }
+ var pixels = imageData.data;
+ var x, y, i, p, yp, yi, yw, r_sum, g_sum, b_sum, r_out_sum, g_out_sum, b_out_sum, r_in_sum, g_in_sum, b_in_sum, pr, pg, pb, rbs;
+ var div = radius + radius + 1;
+ var w4 = width << 2;
+ var widthMinus1 = width - 1;
+ var heightMinus1 = height - 1;
+ var radiusPlus1 = radius + 1;
+ var sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2;
+ var stackStart = new BlurStack();
+ var stack = stackStart;
+ for (i = 1; i < div; i++) {
+ stack = stack.next = new BlurStack();
+ if (i == radiusPlus1) var stackEnd = stack;
+ }
+ stack.next = stackStart;
+ var stackIn = null;
+ var stackOut = null;
+ yw = yi = 0;
+ var mul_sum = mul_table[radius];
+ var shg_sum = shg_table[radius];
+ for (y = 0; y < height; y++) {
+ r_in_sum = g_in_sum = b_in_sum = r_sum = g_sum = b_sum = 0;
+ r_out_sum = radiusPlus1 * (pr = pixels[yi]);
+ g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);
+ b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);
+ r_sum += sumFactor * pr;
+ g_sum += sumFactor * pg;
+ b_sum += sumFactor * pb;
+ stack = stackStart;
+ for (i = 0; i < radiusPlus1; i++) {
+ stack.r = pr;
+ stack.g = pg;
+ stack.b = pb;
+ stack = stack.next;
+ }
+ for (i = 1; i < radiusPlus1; i++) {
+ p = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2);
+ r_sum += (stack.r = pr = pixels[p]) * (rbs = radiusPlus1 - i);
+ g_sum += (stack.g = pg = pixels[p + 1]) * rbs;
+ b_sum += (stack.b = pb = pixels[p + 2]) * rbs;
+ r_in_sum += pr;
+ g_in_sum += pg;
+ b_in_sum += pb;
+ stack = stack.next;
+ }
+ stackIn = stackStart;
+ stackOut = stackEnd;
+ for (x = 0; x < width; x++) {
+ pixels[yi] = r_sum * mul_sum >> shg_sum;
+ pixels[yi + 1] = g_sum * mul_sum >> shg_sum;
+ pixels[yi + 2] = b_sum * mul_sum >> shg_sum;
+ r_sum -= r_out_sum;
+ g_sum -= g_out_sum;
+ b_sum -= b_out_sum;
+ r_out_sum -= stackIn.r;
+ g_out_sum -= stackIn.g;
+ b_out_sum -= stackIn.b;
+ p = yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1) << 2;
+ r_in_sum += stackIn.r = pixels[p];
+ g_in_sum += stackIn.g = pixels[p + 1];
+ b_in_sum += stackIn.b = pixels[p + 2];
+ r_sum += r_in_sum;
+ g_sum += g_in_sum;
+ b_sum += b_in_sum;
+ stackIn = stackIn.next;
+ r_out_sum += pr = stackOut.r;
+ g_out_sum += pg = stackOut.g;
+ b_out_sum += pb = stackOut.b;
+ r_in_sum -= pr;
+ g_in_sum -= pg;
+ b_in_sum -= pb;
+ stackOut = stackOut.next;
+ yi += 4;
+ }
+ yw += width;
+ }
+ for (x = 0; x < width; x++) {
+ g_in_sum = b_in_sum = r_in_sum = g_sum = b_sum = r_sum = 0;
+ yi = x << 2;
+ r_out_sum = radiusPlus1 * (pr = pixels[yi]);
+ g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);
+ b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);
+ r_sum += sumFactor * pr;
+ g_sum += sumFactor * pg;
+ b_sum += sumFactor * pb;
+ stack = stackStart;
+ for (i = 0; i < radiusPlus1; i++) {
+ stack.r = pr;
+ stack.g = pg;
+ stack.b = pb;
+ stack = stack.next;
+ }
+ yp = width;
+ for (i = 1; i <= radius; i++) {
+ yi = yp + x << 2;
+ r_sum += (stack.r = pr = pixels[yi]) * (rbs = radiusPlus1 - i);
+ g_sum += (stack.g = pg = pixels[yi + 1]) * rbs;
+ b_sum += (stack.b = pb = pixels[yi + 2]) * rbs;
+ r_in_sum += pr;
+ g_in_sum += pg;
+ b_in_sum += pb;
+ stack = stack.next;
+ if (i < heightMinus1) {
+ yp += width;
+ }
+ }
+ yi = x;
+ stackIn = stackStart;
+ stackOut = stackEnd;
+ for (y = 0; y < height; y++) {
+ p = yi << 2;
+ pixels[p] = r_sum * mul_sum >> shg_sum;
+ pixels[p + 1] = g_sum * mul_sum >> shg_sum;
+ pixels[p + 2] = b_sum * mul_sum >> shg_sum;
+ r_sum -= r_out_sum;
+ g_sum -= g_out_sum;
+ b_sum -= b_out_sum;
+ r_out_sum -= stackIn.r;
+ g_out_sum -= stackIn.g;
+ b_out_sum -= stackIn.b;
+ p = x + ((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width << 2;
+ r_sum += r_in_sum += stackIn.r = pixels[p];
+ g_sum += g_in_sum += stackIn.g = pixels[p + 1];
+ b_sum += b_in_sum += stackIn.b = pixels[p + 2];
+ stackIn = stackIn.next;
+ r_out_sum += pr = stackOut.r;
+ g_out_sum += pg = stackOut.g;
+ b_out_sum += pb = stackOut.b;
+ r_in_sum -= pr;
+ g_in_sum -= pg;
+ b_in_sum -= pb;
+ stackOut = stackOut.next;
+ yi += width;
+ }
+ }
+ context.putImageData(imageData, top_x, top_y);
+ }
+ function BlurStack() {
+ this.r = 0;
+ this.g = 0;
+ this.b = 0;
+ this.a = 0;
+ this.next = null;
+ }
+ /*
+ * canvg.js - Javascript SVG parser and renderer on Canvas
+ * MIT Licensed
+ * Gabe Lerner (gabelerner@gmail.com)
+ * http://code.google.com/p/canvg/
+ *
+ * Requires: rgbcolor.js - http://www.phpied.com/rgb-color-parser-in-javascript/
+ */
+ (function() {
+ // canvg(target, s)
+ // empty parameters: replace all 'svg' elements on page with 'canvas' elements
+ // target: canvas element or the id of a canvas element
+ // s: svg string, url to svg file, or xml document
+ // opts: optional hash of options
+ // ignoreMouse: true => ignore mouse events
+ // ignoreAnimation: true => ignore animations
+ // ignoreDimensions: true => does not try to resize canvas
+ // ignoreClear: true => does not clear canvas
+ // offsetX: int => draws at a x offset
+ // offsetY: int => draws at a y offset
+ // scaleWidth: int => scales horizontally to width
+ // scaleHeight: int => scales vertically to height
+ // renderCallback: function => will call the function after the first render is completed
+ // forceRedraw: function => will call the function on every frame, if it returns true, will redraw
+ this.canvg = function(target, s, opts) {
+ // no parameters
+ if (target == null && s == null && opts == null) {
+ var svgTags = document.getElementsByTagName("svg");
+ for (var i = 0; i < svgTags.length; i++) {
+ var svgTag = svgTags[i];
+ var c = document.createElement("canvas");
+ c.width = svgTag.clientWidth;
+ c.height = svgTag.clientHeight;
+ svgTag.parentNode.insertBefore(c, svgTag);
+ svgTag.parentNode.removeChild(svgTag);
+ var div = document.createElement("div");
+ div.appendChild(svgTag);
+ canvg(c, div.innerHTML);
+ }
+ return;
+ }
+ opts = opts || {};
+ if (typeof target == "string") {
+ target = document.getElementById(target);
+ }
+ // store class on canvas
+ if (target.svg != null) target.svg.stop();
+ var svg = build();
+ // on i.e. 8 for flash canvas, we can't assign the property so check for it
+ if (!(target.childNodes.length == 1 && target.childNodes[0].nodeName == "OBJECT")) target.svg = svg;
+ svg.opts = opts;
+ var ctx = target.getContext("2d");
+ if (typeof s.documentElement != "undefined") {
+ // load from xml doc
+ svg.loadXmlDoc(ctx, s);
+ } else if (s.substr(0, 1) == "<") {
+ // load from xml string
+ svg.loadXml(ctx, s);
+ } else {
+ // load from url
+ svg.load(ctx, s);
+ }
+ };
+ function build() {
+ var svg = {};
+ svg.FRAMERATE = 30;
+ svg.MAX_VIRTUAL_PIXELS = 3e4;
+ // globals
+ svg.init = function(ctx) {
+ var uniqueId = 0;
+ svg.UniqueId = function() {
+ uniqueId++;
+ return "canvg" + uniqueId;
+ };
+ svg.Definitions = {};
+ svg.Styles = {};
+ svg.Animations = [];
+ svg.Images = [];
+ svg.ctx = ctx;
+ svg.ViewPort = new function() {
+ this.viewPorts = [];
+ this.Clear = function() {
+ this.viewPorts = [];
+ };
+ this.SetCurrent = function(width, height) {
+ this.viewPorts.push({
+ width: width,
+ height: height
+ });
+ };
+ this.RemoveCurrent = function() {
+ this.viewPorts.pop();
+ };
+ this.Current = function() {
+ return this.viewPorts[this.viewPorts.length - 1];
+ };
+ this.width = function() {
+ return this.Current().width;
+ };
+ this.height = function() {
+ return this.Current().height;
+ };
+ this.ComputeSize = function(d) {
+ if (d != null && typeof d == "number") return d;
+ if (d == "x") return this.width();
+ if (d == "y") return this.height();
+ return Math.sqrt(Math.pow(this.width(), 2) + Math.pow(this.height(), 2)) / Math.sqrt(2);
+ };
+ }();
+ };
+ svg.init();
+ // images loaded
+ svg.ImagesLoaded = function() {
+ for (var i = 0; i < svg.Images.length; i++) {
+ if (!svg.Images[i].loaded) return false;
+ }
+ return true;
+ };
+ // trim
+ svg.trim = function(s) {
+ return s.replace(/^\s+|\s+$/g, "");
+ };
+ // compress spaces
+ svg.compressSpaces = function(s) {
+ return s.replace(/[\s\r\t\n]+/gm, " ");
+ };
+ // ajax
+ svg.ajax = function(url) {
+ var AJAX;
+ if (window.XMLHttpRequest) {
+ AJAX = new XMLHttpRequest();
+ } else {
+ AJAX = new ActiveXObject("Microsoft.XMLHTTP");
+ }
+ if (AJAX) {
+ AJAX.open("GET", url, false);
+ AJAX.send(null);
+ return AJAX.responseText;
+ }
+ return null;
+ };
+ // parse xml
+ svg.parseXml = function(xml) {
+ if (window.DOMParser) {
+ var parser = new DOMParser();
+ return parser.parseFromString(xml, "text/xml");
+ } else {
+ xml = xml.replace(/]*>/, "");
+ var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
+ xmlDoc.async = "false";
+ xmlDoc.loadXML(xml);
+ return xmlDoc;
+ }
+ };
+ svg.Property = function(name, value) {
+ this.name = name;
+ this.value = value;
+ };
+ svg.Property.prototype.getValue = function() {
+ return this.value;
+ };
+ svg.Property.prototype.hasValue = function() {
+ return this.value != null && this.value !== "";
+ };
+ // return the numerical value of the property
+ svg.Property.prototype.numValue = function() {
+ if (!this.hasValue()) return 0;
+ var n = parseFloat(this.value);
+ if ((this.value + "").match(/%$/)) {
+ n = n / 100;
+ }
+ return n;
+ };
+ svg.Property.prototype.valueOrDefault = function(def) {
+ if (this.hasValue()) return this.value;
+ return def;
+ };
+ svg.Property.prototype.numValueOrDefault = function(def) {
+ if (this.hasValue()) return this.numValue();
+ return def;
+ };
+ // color extensions
+ // augment the current color value with the opacity
+ svg.Property.prototype.addOpacity = function(opacity) {
+ var newValue = this.value;
+ if (opacity != null && opacity != "" && typeof this.value == "string") {
+ // can only add opacity to colors, not patterns
+ var color = new RGBColor(this.value);
+ if (color.ok) {
+ newValue = "rgba(" + color.r + ", " + color.g + ", " + color.b + ", " + opacity + ")";
+ }
+ }
+ return new svg.Property(this.name, newValue);
+ };
+ // definition extensions
+ // get the definition from the definitions table
+ svg.Property.prototype.getDefinition = function() {
+ var name = this.value.match(/#([^\)'"]+)/);
+ if (name) {
+ name = name[1];
+ }
+ if (!name) {
+ name = this.value;
+ }
+ return svg.Definitions[name];
+ };
+ svg.Property.prototype.isUrlDefinition = function() {
+ return this.value.indexOf("url(") == 0;
+ };
+ svg.Property.prototype.getFillStyleDefinition = function(e, opacityProp) {
+ var def = this.getDefinition();
+ // gradient
+ if (def != null && def.createGradient) {
+ return def.createGradient(svg.ctx, e, opacityProp);
+ }
+ // pattern
+ if (def != null && def.createPattern) {
+ if (def.getHrefAttribute().hasValue()) {
+ var pt = def.attribute("patternTransform");
+ def = def.getHrefAttribute().getDefinition();
+ if (pt.hasValue()) {
+ def.attribute("patternTransform", true).value = pt.value;
+ }
+ }
+ return def.createPattern(svg.ctx, e);
+ }
+ return null;
+ };
+ // length extensions
+ svg.Property.prototype.getDPI = function(viewPort) {
+ return 96;
+ };
+ svg.Property.prototype.getEM = function(viewPort) {
+ var em = 12;
+ var fontSize = new svg.Property("fontSize", svg.Font.Parse(svg.ctx.font).fontSize);
+ if (fontSize.hasValue()) em = fontSize.toPixels(viewPort);
+ return em;
+ };
+ svg.Property.prototype.getUnits = function() {
+ var s = this.value + "";
+ return s.replace(/[0-9\.\-]/g, "");
+ };
+ // get the length as pixels
+ svg.Property.prototype.toPixels = function(viewPort, processPercent) {
+ if (!this.hasValue()) return 0;
+ var s = this.value + "";
+ if (s.match(/em$/)) return this.numValue() * this.getEM(viewPort);
+ if (s.match(/ex$/)) return this.numValue() * this.getEM(viewPort) / 2;
+ if (s.match(/px$/)) return this.numValue();
+ if (s.match(/pt$/)) return this.numValue() * this.getDPI(viewPort) * (1 / 72);
+ if (s.match(/pc$/)) return this.numValue() * 15;
+ if (s.match(/cm$/)) return this.numValue() * this.getDPI(viewPort) / 2.54;
+ if (s.match(/mm$/)) return this.numValue() * this.getDPI(viewPort) / 25.4;
+ if (s.match(/in$/)) return this.numValue() * this.getDPI(viewPort);
+ if (s.match(/%$/)) return this.numValue() * svg.ViewPort.ComputeSize(viewPort);
+ var n = this.numValue();
+ if (processPercent && n < 1) return n * svg.ViewPort.ComputeSize(viewPort);
+ return n;
+ };
+ // time extensions
+ // get the time as milliseconds
+ svg.Property.prototype.toMilliseconds = function() {
+ if (!this.hasValue()) return 0;
+ var s = this.value + "";
+ if (s.match(/s$/)) return this.numValue() * 1e3;
+ if (s.match(/ms$/)) return this.numValue();
+ return this.numValue();
+ };
+ // angle extensions
+ // get the angle as radians
+ svg.Property.prototype.toRadians = function() {
+ if (!this.hasValue()) return 0;
+ var s = this.value + "";
+ if (s.match(/deg$/)) return this.numValue() * (Math.PI / 180);
+ if (s.match(/grad$/)) return this.numValue() * (Math.PI / 200);
+ if (s.match(/rad$/)) return this.numValue();
+ return this.numValue() * (Math.PI / 180);
+ };
+ // fonts
+ svg.Font = new function() {
+ this.Styles = "normal|italic|oblique|inherit";
+ this.Variants = "normal|small-caps|inherit";
+ this.Weights = "normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit";
+ this.CreateFont = function(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) {
+ var f = inherit != null ? this.Parse(inherit) : this.CreateFont("", "", "", "", "", svg.ctx.font);
+ return {
+ fontFamily: fontFamily || f.fontFamily,
+ fontSize: fontSize || f.fontSize,
+ fontStyle: fontStyle || f.fontStyle,
+ fontWeight: fontWeight || f.fontWeight,
+ fontVariant: fontVariant || f.fontVariant,
+ toString: function() {
+ return [ this.fontStyle, this.fontVariant, this.fontWeight, this.fontSize, this.fontFamily ].join(" ");
+ }
+ };
+ };
+ var that = this;
+ this.Parse = function(s) {
+ var f = {};
+ var d = svg.trim(svg.compressSpaces(s || "")).split(" ");
+ var set = {
+ fontSize: false,
+ fontStyle: false,
+ fontWeight: false,
+ fontVariant: false
+ };
+ var ff = "";
+ for (var i = 0; i < d.length; i++) {
+ if (!set.fontStyle && that.Styles.indexOf(d[i]) != -1) {
+ if (d[i] != "inherit") f.fontStyle = d[i];
+ set.fontStyle = true;
+ } else if (!set.fontVariant && that.Variants.indexOf(d[i]) != -1) {
+ if (d[i] != "inherit") f.fontVariant = d[i];
+ set.fontStyle = set.fontVariant = true;
+ } else if (!set.fontWeight && that.Weights.indexOf(d[i]) != -1) {
+ if (d[i] != "inherit") f.fontWeight = d[i];
+ set.fontStyle = set.fontVariant = set.fontWeight = true;
+ } else if (!set.fontSize) {
+ if (d[i] != "inherit") f.fontSize = d[i].split("/")[0];
+ set.fontStyle = set.fontVariant = set.fontWeight = set.fontSize = true;
+ } else {
+ if (d[i] != "inherit") ff += d[i];
+ }
+ }
+ if (ff != "") f.fontFamily = ff;
+ return f;
+ };
+ }();
+ // points and paths
+ svg.ToNumberArray = function(s) {
+ var a = svg.trim(svg.compressSpaces((s || "").replace(/,/g, " "))).split(" ");
+ for (var i = 0; i < a.length; i++) {
+ a[i] = parseFloat(a[i]);
+ }
+ return a;
+ };
+ svg.Point = function(x, y) {
+ this.x = x;
+ this.y = y;
+ };
+ svg.Point.prototype.angleTo = function(p) {
+ return Math.atan2(p.y - this.y, p.x - this.x);
+ };
+ svg.Point.prototype.applyTransform = function(v) {
+ var xp = this.x * v[0] + this.y * v[2] + v[4];
+ var yp = this.x * v[1] + this.y * v[3] + v[5];
+ this.x = xp;
+ this.y = yp;
+ };
+ svg.CreatePoint = function(s) {
+ var a = svg.ToNumberArray(s);
+ return new svg.Point(a[0], a[1]);
+ };
+ svg.CreatePath = function(s) {
+ var a = svg.ToNumberArray(s);
+ var path = [];
+ for (var i = 0; i < a.length; i += 2) {
+ path.push(new svg.Point(a[i], a[i + 1]));
+ }
+ return path;
+ };
+ // bounding box
+ svg.BoundingBox = function(x1, y1, x2, y2) {
+ // pass in initial points if you want
+ this.x1 = Number.NaN;
+ this.y1 = Number.NaN;
+ this.x2 = Number.NaN;
+ this.y2 = Number.NaN;
+ this.x = function() {
+ return this.x1;
+ };
+ this.y = function() {
+ return this.y1;
+ };
+ this.width = function() {
+ return this.x2 - this.x1;
+ };
+ this.height = function() {
+ return this.y2 - this.y1;
+ };
+ this.addPoint = function(x, y) {
+ if (x != null) {
+ if (isNaN(this.x1) || isNaN(this.x2)) {
+ this.x1 = x;
+ this.x2 = x;
+ }
+ if (x < this.x1) this.x1 = x;
+ if (x > this.x2) this.x2 = x;
+ }
+ if (y != null) {
+ if (isNaN(this.y1) || isNaN(this.y2)) {
+ this.y1 = y;
+ this.y2 = y;
+ }
+ if (y < this.y1) this.y1 = y;
+ if (y > this.y2) this.y2 = y;
+ }
+ };
+ this.addX = function(x) {
+ this.addPoint(x, null);
+ };
+ this.addY = function(y) {
+ this.addPoint(null, y);
+ };
+ this.addBoundingBox = function(bb) {
+ this.addPoint(bb.x1, bb.y1);
+ this.addPoint(bb.x2, bb.y2);
+ };
+ this.addQuadraticCurve = function(p0x, p0y, p1x, p1y, p2x, p2y) {
+ var cp1x = p0x + 2 / 3 * (p1x - p0x);
+ // CP1 = QP0 + 2/3 *(QP1-QP0)
+ var cp1y = p0y + 2 / 3 * (p1y - p0y);
+ // CP1 = QP0 + 2/3 *(QP1-QP0)
+ var cp2x = cp1x + 1 / 3 * (p2x - p0x);
+ // CP2 = CP1 + 1/3 *(QP2-QP0)
+ var cp2y = cp1y + 1 / 3 * (p2y - p0y);
+ // CP2 = CP1 + 1/3 *(QP2-QP0)
+ this.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y, cp2y, p2x, p2y);
+ };
+ this.addBezierCurve = function(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {
+ // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html
+ var p0 = [ p0x, p0y ], p1 = [ p1x, p1y ], p2 = [ p2x, p2y ], p3 = [ p3x, p3y ];
+ this.addPoint(p0[0], p0[1]);
+ this.addPoint(p3[0], p3[1]);
+ for (i = 0; i <= 1; i++) {
+ var f = function(t) {
+ return Math.pow(1 - t, 3) * p0[i] + 3 * Math.pow(1 - t, 2) * t * p1[i] + 3 * (1 - t) * Math.pow(t, 2) * p2[i] + Math.pow(t, 3) * p3[i];
+ };
+ var b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];
+ var a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];
+ var c = 3 * p1[i] - 3 * p0[i];
+ if (a == 0) {
+ if (b == 0) continue;
+ var t = -c / b;
+ if (0 < t && t < 1) {
+ if (i == 0) this.addX(f(t));
+ if (i == 1) this.addY(f(t));
+ }
+ continue;
+ }
+ var b2ac = Math.pow(b, 2) - 4 * c * a;
+ if (b2ac < 0) continue;
+ var t1 = (-b + Math.sqrt(b2ac)) / (2 * a);
+ if (0 < t1 && t1 < 1) {
+ if (i == 0) this.addX(f(t1));
+ if (i == 1) this.addY(f(t1));
+ }
+ var t2 = (-b - Math.sqrt(b2ac)) / (2 * a);
+ if (0 < t2 && t2 < 1) {
+ if (i == 0) this.addX(f(t2));
+ if (i == 1) this.addY(f(t2));
+ }
+ }
+ };
+ this.isPointInBox = function(x, y) {
+ return this.x1 <= x && x <= this.x2 && this.y1 <= y && y <= this.y2;
+ };
+ this.addPoint(x1, y1);
+ this.addPoint(x2, y2);
+ };
+ // transforms
+ svg.Transform = function(v) {
+ var that = this;
+ this.Type = {};
+ // translate
+ this.Type.translate = function(s) {
+ this.p = svg.CreatePoint(s);
+ this.apply = function(ctx) {
+ ctx.translate(this.p.x || 0, this.p.y || 0);
+ };
+ this.unapply = function(ctx) {
+ ctx.translate(-1 * this.p.x || 0, -1 * this.p.y || 0);
+ };
+ this.applyToPoint = function(p) {
+ p.applyTransform([ 1, 0, 0, 1, this.p.x || 0, this.p.y || 0 ]);
+ };
+ };
+ // rotate
+ this.Type.rotate = function(s) {
+ var a = svg.ToNumberArray(s);
+ this.angle = new svg.Property("angle", a[0]);
+ this.cx = a[1] || 0;
+ this.cy = a[2] || 0;
+ this.apply = function(ctx) {
+ ctx.translate(this.cx, this.cy);
+ ctx.rotate(this.angle.toRadians());
+ ctx.translate(-this.cx, -this.cy);
+ };
+ this.unapply = function(ctx) {
+ ctx.translate(this.cx, this.cy);
+ ctx.rotate(-1 * this.angle.toRadians());
+ ctx.translate(-this.cx, -this.cy);
+ };
+ this.applyToPoint = function(p) {
+ var a = this.angle.toRadians();
+ p.applyTransform([ 1, 0, 0, 1, this.p.x || 0, this.p.y || 0 ]);
+ p.applyTransform([ Math.cos(a), Math.sin(a), -Math.sin(a), Math.cos(a), 0, 0 ]);
+ p.applyTransform([ 1, 0, 0, 1, -this.p.x || 0, -this.p.y || 0 ]);
+ };
+ };
+ this.Type.scale = function(s) {
+ this.p = svg.CreatePoint(s);
+ this.apply = function(ctx) {
+ ctx.scale(this.p.x || 1, this.p.y || this.p.x || 1);
+ };
+ this.unapply = function(ctx) {
+ ctx.scale(1 / this.p.x || 1, 1 / this.p.y || this.p.x || 1);
+ };
+ this.applyToPoint = function(p) {
+ p.applyTransform([ this.p.x || 0, 0, 0, this.p.y || 0, 0, 0 ]);
+ };
+ };
+ this.Type.matrix = function(s) {
+ this.m = svg.ToNumberArray(s);
+ this.apply = function(ctx) {
+ ctx.transform(this.m[0], this.m[1], this.m[2], this.m[3], this.m[4], this.m[5]);
+ };
+ this.applyToPoint = function(p) {
+ p.applyTransform(this.m);
+ };
+ };
+ this.Type.SkewBase = function(s) {
+ this.base = that.Type.matrix;
+ this.base(s);
+ this.angle = new svg.Property("angle", s);
+ };
+ this.Type.SkewBase.prototype = new this.Type.matrix();
+ this.Type.skewX = function(s) {
+ this.base = that.Type.SkewBase;
+ this.base(s);
+ this.m = [ 1, 0, Math.tan(this.angle.toRadians()), 1, 0, 0 ];
+ };
+ this.Type.skewX.prototype = new this.Type.SkewBase();
+ this.Type.skewY = function(s) {
+ this.base = that.Type.SkewBase;
+ this.base(s);
+ this.m = [ 1, Math.tan(this.angle.toRadians()), 0, 1, 0, 0 ];
+ };
+ this.Type.skewY.prototype = new this.Type.SkewBase();
+ this.transforms = [];
+ this.apply = function(ctx) {
+ for (var i = 0; i < this.transforms.length; i++) {
+ this.transforms[i].apply(ctx);
+ }
+ };
+ this.unapply = function(ctx) {
+ for (var i = this.transforms.length - 1; i >= 0; i--) {
+ this.transforms[i].unapply(ctx);
+ }
+ };
+ this.applyToPoint = function(p) {
+ for (var i = 0; i < this.transforms.length; i++) {
+ this.transforms[i].applyToPoint(p);
+ }
+ };
+ var data = svg.trim(svg.compressSpaces(v)).replace(/\)(\s?,\s?)/g, ") ").split(/\s(?=[a-z])/);
+ for (var i = 0; i < data.length; i++) {
+ var type = svg.trim(data[i].split("(")[0]);
+ var s = data[i].split("(")[1].replace(")", "");
+ var transform = new this.Type[type](s);
+ transform.type = type;
+ this.transforms.push(transform);
+ }
+ };
+ // aspect ratio
+ svg.AspectRatio = function(ctx, aspectRatio, width, desiredWidth, height, desiredHeight, minX, minY, refX, refY) {
+ // aspect ratio - http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute
+ aspectRatio = svg.compressSpaces(aspectRatio);
+ aspectRatio = aspectRatio.replace(/^defer\s/, "");
+ // ignore defer
+ var align = aspectRatio.split(" ")[0] || "xMidYMid";
+ var meetOrSlice = aspectRatio.split(" ")[1] || "meet";
+ // calculate scale
+ var scaleX = width / desiredWidth;
+ var scaleY = height / desiredHeight;
+ var scaleMin = Math.min(scaleX, scaleY);
+ var scaleMax = Math.max(scaleX, scaleY);
+ if (meetOrSlice == "meet") {
+ desiredWidth *= scaleMin;
+ desiredHeight *= scaleMin;
+ }
+ if (meetOrSlice == "slice") {
+ desiredWidth *= scaleMax;
+ desiredHeight *= scaleMax;
+ }
+ refX = new svg.Property("refX", refX);
+ refY = new svg.Property("refY", refY);
+ if (refX.hasValue() && refY.hasValue()) {
+ ctx.translate(-scaleMin * refX.toPixels("x"), -scaleMin * refY.toPixels("y"));
+ } else {
+ // align
+ if (align.match(/^xMid/) && (meetOrSlice == "meet" && scaleMin == scaleY || meetOrSlice == "slice" && scaleMax == scaleY)) ctx.translate(width / 2 - desiredWidth / 2, 0);
+ if (align.match(/YMid$/) && (meetOrSlice == "meet" && scaleMin == scaleX || meetOrSlice == "slice" && scaleMax == scaleX)) ctx.translate(0, height / 2 - desiredHeight / 2);
+ if (align.match(/^xMax/) && (meetOrSlice == "meet" && scaleMin == scaleY || meetOrSlice == "slice" && scaleMax == scaleY)) ctx.translate(width - desiredWidth, 0);
+ if (align.match(/YMax$/) && (meetOrSlice == "meet" && scaleMin == scaleX || meetOrSlice == "slice" && scaleMax == scaleX)) ctx.translate(0, height - desiredHeight);
+ }
+ // scale
+ if (align == "none") ctx.scale(scaleX, scaleY); else if (meetOrSlice == "meet") ctx.scale(scaleMin, scaleMin); else if (meetOrSlice == "slice") ctx.scale(scaleMax, scaleMax);
+ // translate
+ ctx.translate(minX == null ? 0 : -minX, minY == null ? 0 : -minY);
+ };
+ // elements
+ svg.Element = {};
+ svg.EmptyProperty = new svg.Property("EMPTY", "");
+ svg.Element.ElementBase = function(node) {
+ this.attributes = {};
+ this.styles = {};
+ this.children = [];
+ // get or create attribute
+ this.attribute = function(name, createIfNotExists) {
+ var a = this.attributes[name];
+ if (a != null) return a;
+ if (createIfNotExists == true) {
+ a = new svg.Property(name, "");
+ this.attributes[name] = a;
+ }
+ return a || svg.EmptyProperty;
+ };
+ this.getHrefAttribute = function() {
+ for (var a in this.attributes) {
+ if (a.match(/:href$/)) {
+ return this.attributes[a];
+ }
+ }
+ return svg.EmptyProperty;
+ };
+ // get or create style, crawls up node tree
+ this.style = function(name, createIfNotExists) {
+ var s = this.styles[name];
+ if (s != null) return s;
+ var a = this.attribute(name);
+ if (a != null && a.hasValue()) {
+ this.styles[name] = a;
+ // move up to me to cache
+ return a;
+ }
+ var p = this.parent;
+ if (p != null) {
+ var ps = p.style(name);
+ if (ps != null && ps.hasValue()) {
+ return ps;
+ }
+ }
+ if (createIfNotExists == true) {
+ s = new svg.Property(name, "");
+ this.styles[name] = s;
+ }
+ return s || svg.EmptyProperty;
+ };
+ // base render
+ this.render = function(ctx) {
+ // don't render display=none
+ if (this.style("display").value == "none") return;
+ // don't render visibility=hidden
+ if (this.attribute("visibility").value == "hidden") return;
+ ctx.save();
+ if (this.attribute("mask").hasValue()) {
+ // mask
+ var mask = this.attribute("mask").getDefinition();
+ if (mask != null) mask.apply(ctx, this);
+ } else if (this.style("filter").hasValue()) {
+ // filter
+ var filter = this.style("filter").getDefinition();
+ if (filter != null) filter.apply(ctx, this);
+ } else {
+ this.setContext(ctx);
+ this.renderChildren(ctx);
+ this.clearContext(ctx);
+ }
+ ctx.restore();
+ };
+ // base set context
+ this.setContext = function(ctx) {};
+ // base clear context
+ this.clearContext = function(ctx) {};
+ // base render children
+ this.renderChildren = function(ctx) {
+ for (var i = 0; i < this.children.length; i++) {
+ this.children[i].render(ctx);
+ }
+ };
+ this.addChild = function(childNode, create) {
+ var child = childNode;
+ if (create) child = svg.CreateElement(childNode);
+ child.parent = this;
+ this.children.push(child);
+ };
+ if (node != null && node.nodeType == 1) {
+ //ELEMENT_NODE
+ // add children
+ for (var i = 0; i < node.childNodes.length; i++) {
+ var childNode = node.childNodes[i];
+ if (childNode.nodeType == 1) this.addChild(childNode, true);
+ //ELEMENT_NODE
+ if (this.captureTextNodes && childNode.nodeType == 3) {
+ var text = childNode.nodeValue || childNode.text || "";
+ if (svg.trim(svg.compressSpaces(text)) != "") {
+ this.addChild(new svg.Element.tspan(childNode), false);
+ }
+ }
+ }
+ // add attributes
+ for (var i = 0; i < node.attributes.length; i++) {
+ var attribute = node.attributes[i];
+ this.attributes[attribute.nodeName] = new svg.Property(attribute.nodeName, attribute.nodeValue);
+ }
+ // add tag styles
+ var styles = svg.Styles[node.nodeName];
+ if (styles != null) {
+ for (var name in styles) {
+ this.styles[name] = styles[name];
+ }
+ }
+ // add class styles
+ if (this.attribute("class").hasValue()) {
+ var classes = svg.compressSpaces(this.attribute("class").value).split(" ");
+ for (var j = 0; j < classes.length; j++) {
+ styles = svg.Styles["." + classes[j]];
+ if (styles != null) {
+ for (var name in styles) {
+ this.styles[name] = styles[name];
+ }
+ }
+ styles = svg.Styles[node.nodeName + "." + classes[j]];
+ if (styles != null) {
+ for (var name in styles) {
+ this.styles[name] = styles[name];
+ }
+ }
+ }
+ }
+ // add id styles
+ if (this.attribute("id").hasValue()) {
+ var styles = svg.Styles["#" + this.attribute("id").value];
+ if (styles != null) {
+ for (var name in styles) {
+ this.styles[name] = styles[name];
+ }
+ }
+ }
+ // add inline styles
+ if (this.attribute("style").hasValue()) {
+ var styles = this.attribute("style").value.split(";");
+ for (var i = 0; i < styles.length; i++) {
+ if (svg.trim(styles[i]) != "") {
+ var style = styles[i].split(":");
+ var name = svg.trim(style[0]);
+ var value = svg.trim(style[1]);
+ this.styles[name] = new svg.Property(name, value);
+ }
+ }
+ }
+ // add id
+ if (this.attribute("id").hasValue()) {
+ if (svg.Definitions[this.attribute("id").value] == null) {
+ svg.Definitions[this.attribute("id").value] = this;
+ }
+ }
+ }
+ };
+ svg.Element.RenderedElementBase = function(node) {
+ this.base = svg.Element.ElementBase;
+ this.base(node);
+ this.setContext = function(ctx) {
+ // fill
+ if (this.style("fill").isUrlDefinition()) {
+ var fs = this.style("fill").getFillStyleDefinition(this, this.style("fill-opacity"));
+ if (fs != null) ctx.fillStyle = fs;
+ } else if (this.style("fill").hasValue()) {
+ var fillStyle = this.style("fill");
+ if (fillStyle.value == "currentColor") fillStyle.value = this.style("color").value;
+ ctx.fillStyle = fillStyle.value == "none" ? "rgba(0,0,0,0)" : fillStyle.value;
+ }
+ if (this.style("fill-opacity").hasValue()) {
+ var fillStyle = new svg.Property("fill", ctx.fillStyle);
+ fillStyle = fillStyle.addOpacity(this.style("fill-opacity").value);
+ ctx.fillStyle = fillStyle.value;
+ }
+ // stroke
+ if (this.style("stroke").isUrlDefinition()) {
+ var fs = this.style("stroke").getFillStyleDefinition(this, this.style("stroke-opacity"));
+ if (fs != null) ctx.strokeStyle = fs;
+ } else if (this.style("stroke").hasValue()) {
+ var strokeStyle = this.style("stroke");
+ if (strokeStyle.value == "currentColor") strokeStyle.value = this.style("color").value;
+ ctx.strokeStyle = strokeStyle.value == "none" ? "rgba(0,0,0,0)" : strokeStyle.value;
+ }
+ if (this.style("stroke-opacity").hasValue()) {
+ var strokeStyle = new svg.Property("stroke", ctx.strokeStyle);
+ strokeStyle = strokeStyle.addOpacity(this.style("stroke-opacity").value);
+ ctx.strokeStyle = strokeStyle.value;
+ }
+ if (this.style("stroke-width").hasValue()) {
+ var newLineWidth = this.style("stroke-width").toPixels();
+ ctx.lineWidth = newLineWidth == 0 ? .001 : newLineWidth;
+ }
+ if (this.style("stroke-linecap").hasValue()) ctx.lineCap = this.style("stroke-linecap").value;
+ if (this.style("stroke-linejoin").hasValue()) ctx.lineJoin = this.style("stroke-linejoin").value;
+ if (this.style("stroke-miterlimit").hasValue()) ctx.miterLimit = this.style("stroke-miterlimit").value;
+ if (this.style("stroke-dasharray").hasValue()) {
+ var gaps = svg.ToNumberArray(this.style("stroke-dasharray").value);
+ if (typeof ctx.setLineDash != "undefined") {
+ ctx.setLineDash(gaps);
+ } else if (typeof ctx.webkitLineDash != "undefined") {
+ ctx.webkitLineDash = gaps;
+ } else if (typeof ctx.mozDash != "undefined") {
+ ctx.mozDash = gaps;
+ }
+ var offset = this.style("stroke-dashoffset").numValueOrDefault(1);
+ if (typeof ctx.lineDashOffset != "undefined") {
+ ctx.lineDashOffset = offset;
+ } else if (typeof ctx.webkitLineDashOffset != "undefined") {
+ ctx.webkitLineDashOffset = offset;
+ } else if (typeof ctx.mozDashOffset != "undefined") {
+ ctx.mozDashOffset = offset;
+ }
+ }
+ // font
+ if (typeof ctx.font != "undefined") {
+ ctx.font = svg.Font.CreateFont(this.style("font-style").value, this.style("font-variant").value, this.style("font-weight").value, this.style("font-size").hasValue() ? this.style("font-size").toPixels() + "px" : "", this.style("font-family").value).toString();
+ }
+ // transform
+ if (this.attribute("transform").hasValue()) {
+ var transform = new svg.Transform(this.attribute("transform").value);
+ transform.apply(ctx);
+ }
+ // clip
+ if (this.style("clip-path").hasValue()) {
+ var clip = this.style("clip-path").getDefinition();
+ if (clip != null) clip.apply(ctx);
+ }
+ // opacity
+ if (this.style("opacity").hasValue()) {
+ ctx.globalAlpha = this.style("opacity").numValue();
+ }
+ };
+ };
+ svg.Element.RenderedElementBase.prototype = new svg.Element.ElementBase();
+ svg.Element.PathElementBase = function(node) {
+ this.base = svg.Element.RenderedElementBase;
+ this.base(node);
+ this.path = function(ctx) {
+ if (ctx != null) ctx.beginPath();
+ return new svg.BoundingBox();
+ };
+ this.renderChildren = function(ctx) {
+ this.path(ctx);
+ svg.Mouse.checkPath(this, ctx);
+ if (ctx.fillStyle != "") {
+ if (this.attribute("fill-rule").hasValue()) {
+ ctx.fill(this.attribute("fill-rule").value);
+ } else {
+ ctx.fill();
+ }
+ }
+ if (ctx.strokeStyle != "") ctx.stroke();
+ var markers = this.getMarkers();
+ if (markers != null) {
+ if (this.style("marker-start").isUrlDefinition()) {
+ var marker = this.style("marker-start").getDefinition();
+ marker.render(ctx, markers[0][0], markers[0][1]);
+ }
+ if (this.style("marker-mid").isUrlDefinition()) {
+ var marker = this.style("marker-mid").getDefinition();
+ for (var i = 1; i < markers.length - 1; i++) {
+ marker.render(ctx, markers[i][0], markers[i][1]);
+ }
+ }
+ if (this.style("marker-end").isUrlDefinition()) {
+ var marker = this.style("marker-end").getDefinition();
+ marker.render(ctx, markers[markers.length - 1][0], markers[markers.length - 1][1]);
+ }
+ }
+ };
+ this.getBoundingBox = function() {
+ return this.path();
+ };
+ this.getMarkers = function() {
+ return null;
+ };
+ };
+ svg.Element.PathElementBase.prototype = new svg.Element.RenderedElementBase();
+ // svg element
+ svg.Element.svg = function(node) {
+ this.base = svg.Element.RenderedElementBase;
+ this.base(node);
+ this.baseClearContext = this.clearContext;
+ this.clearContext = function(ctx) {
+ this.baseClearContext(ctx);
+ svg.ViewPort.RemoveCurrent();
+ };
+ this.baseSetContext = this.setContext;
+ this.setContext = function(ctx) {
+ // initial values
+ ctx.strokeStyle = "rgba(0,0,0,0)";
+ ctx.lineCap = "butt";
+ ctx.lineJoin = "miter";
+ ctx.miterLimit = 4;
+ this.baseSetContext(ctx);
+ // create new view port
+ if (!this.attribute("x").hasValue()) this.attribute("x", true).value = 0;
+ if (!this.attribute("y").hasValue()) this.attribute("y", true).value = 0;
+ ctx.translate(this.attribute("x").toPixels("x"), this.attribute("y").toPixels("y"));
+ var width = svg.ViewPort.width();
+ var height = svg.ViewPort.height();
+ if (!this.attribute("width").hasValue()) this.attribute("width", true).value = "100%";
+ if (!this.attribute("height").hasValue()) this.attribute("height", true).value = "100%";
+ if (typeof this.root == "undefined") {
+ width = this.attribute("width").toPixels("x");
+ height = this.attribute("height").toPixels("y");
+ var x = 0;
+ var y = 0;
+ if (this.attribute("refX").hasValue() && this.attribute("refY").hasValue()) {
+ x = -this.attribute("refX").toPixels("x");
+ y = -this.attribute("refY").toPixels("y");
+ }
+ ctx.beginPath();
+ ctx.moveTo(x, y);
+ ctx.lineTo(width, y);
+ ctx.lineTo(width, height);
+ ctx.lineTo(x, height);
+ ctx.closePath();
+ ctx.clip();
+ }
+ svg.ViewPort.SetCurrent(width, height);
+ // viewbox
+ if (this.attribute("viewBox").hasValue()) {
+ var viewBox = svg.ToNumberArray(this.attribute("viewBox").value);
+ var minX = viewBox[0];
+ var minY = viewBox[1];
+ width = viewBox[2];
+ height = viewBox[3];
+ svg.AspectRatio(ctx, this.attribute("preserveAspectRatio").value, svg.ViewPort.width(), width, svg.ViewPort.height(), height, minX, minY, this.attribute("refX").value, this.attribute("refY").value);
+ svg.ViewPort.RemoveCurrent();
+ svg.ViewPort.SetCurrent(viewBox[2], viewBox[3]);
+ }
+ };
+ };
+ svg.Element.svg.prototype = new svg.Element.RenderedElementBase();
+ // rect element
+ svg.Element.rect = function(node) {
+ this.base = svg.Element.PathElementBase;
+ this.base(node);
+ this.path = function(ctx) {
+ var x = this.attribute("x").toPixels("x");
+ var y = this.attribute("y").toPixels("y");
+ var width = this.attribute("width").toPixels("x");
+ var height = this.attribute("height").toPixels("y");
+ var rx = this.attribute("rx").toPixels("x");
+ var ry = this.attribute("ry").toPixels("y");
+ if (this.attribute("rx").hasValue() && !this.attribute("ry").hasValue()) ry = rx;
+ if (this.attribute("ry").hasValue() && !this.attribute("rx").hasValue()) rx = ry;
+ rx = Math.min(rx, width / 2);
+ ry = Math.min(ry, height / 2);
+ if (ctx != null) {
+ ctx.beginPath();
+ ctx.moveTo(x + rx, y);
+ ctx.lineTo(x + width - rx, y);
+ ctx.quadraticCurveTo(x + width, y, x + width, y + ry);
+ ctx.lineTo(x + width, y + height - ry);
+ ctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height);
+ ctx.lineTo(x + rx, y + height);
+ ctx.quadraticCurveTo(x, y + height, x, y + height - ry);
+ ctx.lineTo(x, y + ry);
+ ctx.quadraticCurveTo(x, y, x + rx, y);
+ ctx.closePath();
+ }
+ return new svg.BoundingBox(x, y, x + width, y + height);
+ };
+ };
+ svg.Element.rect.prototype = new svg.Element.PathElementBase();
+ // circle element
+ svg.Element.circle = function(node) {
+ this.base = svg.Element.PathElementBase;
+ this.base(node);
+ this.path = function(ctx) {
+ var cx = this.attribute("cx").toPixels("x");
+ var cy = this.attribute("cy").toPixels("y");
+ var r = this.attribute("r").toPixels();
+ if (ctx != null) {
+ ctx.beginPath();
+ ctx.arc(cx, cy, r, 0, Math.PI * 2, true);
+ ctx.closePath();
+ }
+ return new svg.BoundingBox(cx - r, cy - r, cx + r, cy + r);
+ };
+ };
+ svg.Element.circle.prototype = new svg.Element.PathElementBase();
+ // ellipse element
+ svg.Element.ellipse = function(node) {
+ this.base = svg.Element.PathElementBase;
+ this.base(node);
+ this.path = function(ctx) {
+ var KAPPA = 4 * ((Math.sqrt(2) - 1) / 3);
+ var rx = this.attribute("rx").toPixels("x");
+ var ry = this.attribute("ry").toPixels("y");
+ var cx = this.attribute("cx").toPixels("x");
+ var cy = this.attribute("cy").toPixels("y");
+ if (ctx != null) {
+ ctx.beginPath();
+ ctx.moveTo(cx, cy - ry);
+ ctx.bezierCurveTo(cx + KAPPA * rx, cy - ry, cx + rx, cy - KAPPA * ry, cx + rx, cy);
+ ctx.bezierCurveTo(cx + rx, cy + KAPPA * ry, cx + KAPPA * rx, cy + ry, cx, cy + ry);
+ ctx.bezierCurveTo(cx - KAPPA * rx, cy + ry, cx - rx, cy + KAPPA * ry, cx - rx, cy);
+ ctx.bezierCurveTo(cx - rx, cy - KAPPA * ry, cx - KAPPA * rx, cy - ry, cx, cy - ry);
+ ctx.closePath();
+ }
+ return new svg.BoundingBox(cx - rx, cy - ry, cx + rx, cy + ry);
+ };
+ };
+ svg.Element.ellipse.prototype = new svg.Element.PathElementBase();
+ // line element
+ svg.Element.line = function(node) {
+ this.base = svg.Element.PathElementBase;
+ this.base(node);
+ this.getPoints = function() {
+ return [ new svg.Point(this.attribute("x1").toPixels("x"), this.attribute("y1").toPixels("y")), new svg.Point(this.attribute("x2").toPixels("x"), this.attribute("y2").toPixels("y")) ];
+ };
+ this.path = function(ctx) {
+ var points = this.getPoints();
+ if (ctx != null) {
+ ctx.beginPath();
+ ctx.moveTo(points[0].x, points[0].y);
+ ctx.lineTo(points[1].x, points[1].y);
+ }
+ return new svg.BoundingBox(points[0].x, points[0].y, points[1].x, points[1].y);
+ };
+ this.getMarkers = function() {
+ var points = this.getPoints();
+ var a = points[0].angleTo(points[1]);
+ return [ [ points[0], a ], [ points[1], a ] ];
+ };
+ };
+ svg.Element.line.prototype = new svg.Element.PathElementBase();
+ // polyline element
+ svg.Element.polyline = function(node) {
+ this.base = svg.Element.PathElementBase;
+ this.base(node);
+ this.points = svg.CreatePath(this.attribute("points").value);
+ this.path = function(ctx) {
+ var bb = new svg.BoundingBox(this.points[0].x, this.points[0].y);
+ if (ctx != null) {
+ ctx.beginPath();
+ ctx.moveTo(this.points[0].x, this.points[0].y);
+ }
+ for (var i = 1; i < this.points.length; i++) {
+ bb.addPoint(this.points[i].x, this.points[i].y);
+ if (ctx != null) ctx.lineTo(this.points[i].x, this.points[i].y);
+ }
+ return bb;
+ };
+ this.getMarkers = function() {
+ var markers = [];
+ for (var i = 0; i < this.points.length - 1; i++) {
+ markers.push([ this.points[i], this.points[i].angleTo(this.points[i + 1]) ]);
+ }
+ markers.push([ this.points[this.points.length - 1], markers[markers.length - 1][1] ]);
+ return markers;
+ };
+ };
+ svg.Element.polyline.prototype = new svg.Element.PathElementBase();
+ // polygon element
+ svg.Element.polygon = function(node) {
+ this.base = svg.Element.polyline;
+ this.base(node);
+ this.basePath = this.path;
+ this.path = function(ctx) {
+ var bb = this.basePath(ctx);
+ if (ctx != null) {
+ ctx.lineTo(this.points[0].x, this.points[0].y);
+ ctx.closePath();
+ }
+ return bb;
+ };
+ };
+ svg.Element.polygon.prototype = new svg.Element.polyline();
+ // path element
+ svg.Element.path = function(node) {
+ this.base = svg.Element.PathElementBase;
+ this.base(node);
+ var d = this.attribute("d").value;
+ // TODO: convert to real lexer based on http://www.w3.org/TR/SVG11/paths.html#PathDataBNF
+ d = d.replace(/,/gm, " ");
+ // get rid of all commas
+ d = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm, "$1 $2");
+ // separate commands from commands
+ d = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm, "$1 $2");
+ // separate commands from commands
+ d = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\s])/gm, "$1 $2");
+ // separate commands from points
+ d = d.replace(/([^\s])([MmZzLlHhVvCcSsQqTtAa])/gm, "$1 $2");
+ // separate commands from points
+ d = d.replace(/([0-9])([+\-])/gm, "$1 $2");
+ // separate digits when no comma
+ d = d.replace(/(\.[0-9]*)(\.)/gm, "$1 $2");
+ // separate digits when no comma
+ d = d.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm, "$1 $3 $4 ");
+ // shorthand elliptical arc path syntax
+ d = svg.compressSpaces(d);
+ // compress multiple spaces
+ d = svg.trim(d);
+ this.PathParser = new function(d) {
+ this.tokens = d.split(" ");
+ this.reset = function() {
+ this.i = -1;
+ this.command = "";
+ this.previousCommand = "";
+ this.start = new svg.Point(0, 0);
+ this.control = new svg.Point(0, 0);
+ this.current = new svg.Point(0, 0);
+ this.points = [];
+ this.angles = [];
+ };
+ this.isEnd = function() {
+ return this.i >= this.tokens.length - 1;
+ };
+ this.isCommandOrEnd = function() {
+ if (this.isEnd()) return true;
+ return this.tokens[this.i + 1].match(/^[A-Za-z]$/) != null;
+ };
+ this.isRelativeCommand = function() {
+ switch (this.command) {
+ case "m":
+ case "l":
+ case "h":
+ case "v":
+ case "c":
+ case "s":
+ case "q":
+ case "t":
+ case "a":
+ case "z":
+ return true;
+ break;
+ }
+ return false;
+ };
+ this.getToken = function() {
+ this.i++;
+ return this.tokens[this.i];
+ };
+ this.getScalar = function() {
+ return parseFloat(this.getToken());
+ };
+ this.nextCommand = function() {
+ this.previousCommand = this.command;
+ this.command = this.getToken();
+ };
+ this.getPoint = function() {
+ var p = new svg.Point(this.getScalar(), this.getScalar());
+ return this.makeAbsolute(p);
+ };
+ this.getAsControlPoint = function() {
+ var p = this.getPoint();
+ this.control = p;
+ return p;
+ };
+ this.getAsCurrentPoint = function() {
+ var p = this.getPoint();
+ this.current = p;
+ return p;
+ };
+ this.getReflectedControlPoint = function() {
+ if (this.previousCommand.toLowerCase() != "c" && this.previousCommand.toLowerCase() != "s" && this.previousCommand.toLowerCase() != "q" && this.previousCommand.toLowerCase() != "t") {
+ return this.current;
+ }
+ // reflect point
+ var p = new svg.Point(2 * this.current.x - this.control.x, 2 * this.current.y - this.control.y);
+ return p;
+ };
+ this.makeAbsolute = function(p) {
+ if (this.isRelativeCommand()) {
+ p.x += this.current.x;
+ p.y += this.current.y;
+ }
+ return p;
+ };
+ this.addMarker = function(p, from, priorTo) {
+ // if the last angle isn't filled in because we didn't have this point yet ...
+ if (priorTo != null && this.angles.length > 0 && this.angles[this.angles.length - 1] == null) {
+ this.angles[this.angles.length - 1] = this.points[this.points.length - 1].angleTo(priorTo);
+ }
+ this.addMarkerAngle(p, from == null ? null : from.angleTo(p));
+ };
+ this.addMarkerAngle = function(p, a) {
+ this.points.push(p);
+ this.angles.push(a);
+ };
+ this.getMarkerPoints = function() {
+ return this.points;
+ };
+ this.getMarkerAngles = function() {
+ for (var i = 0; i < this.angles.length; i++) {
+ if (this.angles[i] == null) {
+ for (var j = i + 1; j < this.angles.length; j++) {
+ if (this.angles[j] != null) {
+ this.angles[i] = this.angles[j];
+ break;
+ }
+ }
+ }
+ }
+ return this.angles;
+ };
+ }(d);
+ this.path = function(ctx) {
+ var pp = this.PathParser;
+ pp.reset();
+ var bb = new svg.BoundingBox();
+ if (ctx != null) ctx.beginPath();
+ while (!pp.isEnd()) {
+ pp.nextCommand();
+ switch (pp.command) {
+ case "M":
+ case "m":
+ var p = pp.getAsCurrentPoint();
+ pp.addMarker(p);
+ bb.addPoint(p.x, p.y);
+ if (ctx != null) ctx.moveTo(p.x, p.y);
+ pp.start = pp.current;
+ while (!pp.isCommandOrEnd()) {
+ var p = pp.getAsCurrentPoint();
+ pp.addMarker(p, pp.start);
+ bb.addPoint(p.x, p.y);
+ if (ctx != null) ctx.lineTo(p.x, p.y);
+ }
+ break;
+
+ case "L":
+ case "l":
+ while (!pp.isCommandOrEnd()) {
+ var c = pp.current;
+ var p = pp.getAsCurrentPoint();
+ pp.addMarker(p, c);
+ bb.addPoint(p.x, p.y);
+ if (ctx != null) ctx.lineTo(p.x, p.y);
+ }
+ break;
+
+ case "H":
+ case "h":
+ while (!pp.isCommandOrEnd()) {
+ var newP = new svg.Point((pp.isRelativeCommand() ? pp.current.x : 0) + pp.getScalar(), pp.current.y);
+ pp.addMarker(newP, pp.current);
+ pp.current = newP;
+ bb.addPoint(pp.current.x, pp.current.y);
+ if (ctx != null) ctx.lineTo(pp.current.x, pp.current.y);
+ }
+ break;
+
+ case "V":
+ case "v":
+ while (!pp.isCommandOrEnd()) {
+ var newP = new svg.Point(pp.current.x, (pp.isRelativeCommand() ? pp.current.y : 0) + pp.getScalar());
+ pp.addMarker(newP, pp.current);
+ pp.current = newP;
+ bb.addPoint(pp.current.x, pp.current.y);
+ if (ctx != null) ctx.lineTo(pp.current.x, pp.current.y);
+ }
+ break;
+
+ case "C":
+ case "c":
+ while (!pp.isCommandOrEnd()) {
+ var curr = pp.current;
+ var p1 = pp.getPoint();
+ var cntrl = pp.getAsControlPoint();
+ var cp = pp.getAsCurrentPoint();
+ pp.addMarker(cp, cntrl, p1);
+ bb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);
+ if (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);
+ }
+ break;
+
+ case "S":
+ case "s":
+ while (!pp.isCommandOrEnd()) {
+ var curr = pp.current;
+ var p1 = pp.getReflectedControlPoint();
+ var cntrl = pp.getAsControlPoint();
+ var cp = pp.getAsCurrentPoint();
+ pp.addMarker(cp, cntrl, p1);
+ bb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);
+ if (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);
+ }
+ break;
+
+ case "Q":
+ case "q":
+ while (!pp.isCommandOrEnd()) {
+ var curr = pp.current;
+ var cntrl = pp.getAsControlPoint();
+ var cp = pp.getAsCurrentPoint();
+ pp.addMarker(cp, cntrl, cntrl);
+ bb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);
+ if (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);
+ }
+ break;
+
+ case "T":
+ case "t":
+ while (!pp.isCommandOrEnd()) {
+ var curr = pp.current;
+ var cntrl = pp.getReflectedControlPoint();
+ pp.control = cntrl;
+ var cp = pp.getAsCurrentPoint();
+ pp.addMarker(cp, cntrl, cntrl);
+ bb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);
+ if (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);
+ }
+ break;
+
+ case "A":
+ case "a":
+ while (!pp.isCommandOrEnd()) {
+ var curr = pp.current;
+ var rx = pp.getScalar();
+ var ry = pp.getScalar();
+ var xAxisRotation = pp.getScalar() * (Math.PI / 180);
+ var largeArcFlag = pp.getScalar();
+ var sweepFlag = pp.getScalar();
+ var cp = pp.getAsCurrentPoint();
+ // Conversion from endpoint to center parameterization
+ // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes
+ // x1', y1'
+ var currp = new svg.Point(Math.cos(xAxisRotation) * (curr.x - cp.x) / 2 + Math.sin(xAxisRotation) * (curr.y - cp.y) / 2, -Math.sin(xAxisRotation) * (curr.x - cp.x) / 2 + Math.cos(xAxisRotation) * (curr.y - cp.y) / 2);
+ // adjust radii
+ var l = Math.pow(currp.x, 2) / Math.pow(rx, 2) + Math.pow(currp.y, 2) / Math.pow(ry, 2);
+ if (l > 1) {
+ rx *= Math.sqrt(l);
+ ry *= Math.sqrt(l);
+ }
+ // cx', cy'
+ var s = (largeArcFlag == sweepFlag ? -1 : 1) * Math.sqrt((Math.pow(rx, 2) * Math.pow(ry, 2) - Math.pow(rx, 2) * Math.pow(currp.y, 2) - Math.pow(ry, 2) * Math.pow(currp.x, 2)) / (Math.pow(rx, 2) * Math.pow(currp.y, 2) + Math.pow(ry, 2) * Math.pow(currp.x, 2)));
+ if (isNaN(s)) s = 0;
+ var cpp = new svg.Point(s * rx * currp.y / ry, s * -ry * currp.x / rx);
+ // cx, cy
+ var centp = new svg.Point((curr.x + cp.x) / 2 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y, (curr.y + cp.y) / 2 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y);
+ // vector magnitude
+ var m = function(v) {
+ return Math.sqrt(Math.pow(v[0], 2) + Math.pow(v[1], 2));
+ };
+ // ratio between two vectors
+ var r = function(u, v) {
+ return (u[0] * v[0] + u[1] * v[1]) / (m(u) * m(v));
+ };
+ // angle between two vectors
+ var a = function(u, v) {
+ return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(r(u, v));
+ };
+ // initial angle
+ var a1 = a([ 1, 0 ], [ (currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry ]);
+ // angle delta
+ var u = [ (currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry ];
+ var v = [ (-currp.x - cpp.x) / rx, (-currp.y - cpp.y) / ry ];
+ var ad = a(u, v);
+ if (r(u, v) <= -1) ad = Math.PI;
+ if (r(u, v) >= 1) ad = 0;
+ // for markers
+ var dir = 1 - sweepFlag ? 1 : -1;
+ var ah = a1 + dir * (ad / 2);
+ var halfWay = new svg.Point(centp.x + rx * Math.cos(ah), centp.y + ry * Math.sin(ah));
+ pp.addMarkerAngle(halfWay, ah - dir * Math.PI / 2);
+ pp.addMarkerAngle(cp, ah - dir * Math.PI);
+ bb.addPoint(cp.x, cp.y);
+ // TODO: this is too naive, make it better
+ if (ctx != null) {
+ var r = rx > ry ? rx : ry;
+ var sx = rx > ry ? 1 : rx / ry;
+ var sy = rx > ry ? ry / rx : 1;
+ ctx.translate(centp.x, centp.y);
+ ctx.rotate(xAxisRotation);
+ ctx.scale(sx, sy);
+ ctx.arc(0, 0, r, a1, a1 + ad, 1 - sweepFlag);
+ ctx.scale(1 / sx, 1 / sy);
+ ctx.rotate(-xAxisRotation);
+ ctx.translate(-centp.x, -centp.y);
+ }
+ }
+ break;
+
+ case "Z":
+ case "z":
+ if (ctx != null) ctx.closePath();
+ pp.current = pp.start;
+ }
+ }
+ return bb;
+ };
+ this.getMarkers = function() {
+ var points = this.PathParser.getMarkerPoints();
+ var angles = this.PathParser.getMarkerAngles();
+ var markers = [];
+ for (var i = 0; i < points.length; i++) {
+ markers.push([ points[i], angles[i] ]);
+ }
+ return markers;
+ };
+ };
+ svg.Element.path.prototype = new svg.Element.PathElementBase();
+ // pattern element
+ svg.Element.pattern = function(node) {
+ this.base = svg.Element.ElementBase;
+ this.base(node);
+ this.createPattern = function(ctx, element) {
+ var width = this.attribute("width").toPixels("x", true);
+ var height = this.attribute("height").toPixels("y", true);
+ // render me using a temporary svg element
+ var tempSvg = new svg.Element.svg();
+ tempSvg.attributes["viewBox"] = new svg.Property("viewBox", this.attribute("viewBox").value);
+ tempSvg.attributes["width"] = new svg.Property("width", width + "px");
+ tempSvg.attributes["height"] = new svg.Property("height", height + "px");
+ tempSvg.attributes["transform"] = new svg.Property("transform", this.attribute("patternTransform").value);
+ tempSvg.children = this.children;
+ var c = document.createElement("canvas");
+ c.width = width;
+ c.height = height;
+ var cctx = c.getContext("2d");
+ if (this.attribute("x").hasValue() && this.attribute("y").hasValue()) {
+ cctx.translate(this.attribute("x").toPixels("x", true), this.attribute("y").toPixels("y", true));
+ }
+ // render 3x3 grid so when we transform there's no white space on edges
+ for (var x = -1; x <= 1; x++) {
+ for (var y = -1; y <= 1; y++) {
+ cctx.save();
+ cctx.translate(x * c.width, y * c.height);
+ tempSvg.render(cctx);
+ cctx.restore();
+ }
+ }
+ var pattern = ctx.createPattern(c, "repeat");
+ return pattern;
+ };
+ };
+ svg.Element.pattern.prototype = new svg.Element.ElementBase();
+ // marker element
+ svg.Element.marker = function(node) {
+ this.base = svg.Element.ElementBase;
+ this.base(node);
+ this.baseRender = this.render;
+ this.render = function(ctx, point, angle) {
+ ctx.translate(point.x, point.y);
+ if (this.attribute("orient").valueOrDefault("auto") == "auto") ctx.rotate(angle);
+ if (this.attribute("markerUnits").valueOrDefault("strokeWidth") == "strokeWidth") ctx.scale(ctx.lineWidth, ctx.lineWidth);
+ ctx.save();
+ // render me using a temporary svg element
+ var tempSvg = new svg.Element.svg();
+ tempSvg.attributes["viewBox"] = new svg.Property("viewBox", this.attribute("viewBox").value);
+ tempSvg.attributes["refX"] = new svg.Property("refX", this.attribute("refX").value);
+ tempSvg.attributes["refY"] = new svg.Property("refY", this.attribute("refY").value);
+ tempSvg.attributes["width"] = new svg.Property("width", this.attribute("markerWidth").value);
+ tempSvg.attributes["height"] = new svg.Property("height", this.attribute("markerHeight").value);
+ tempSvg.attributes["fill"] = new svg.Property("fill", this.attribute("fill").valueOrDefault("black"));
+ tempSvg.attributes["stroke"] = new svg.Property("stroke", this.attribute("stroke").valueOrDefault("none"));
+ tempSvg.children = this.children;
+ tempSvg.render(ctx);
+ ctx.restore();
+ if (this.attribute("markerUnits").valueOrDefault("strokeWidth") == "strokeWidth") ctx.scale(1 / ctx.lineWidth, 1 / ctx.lineWidth);
+ if (this.attribute("orient").valueOrDefault("auto") == "auto") ctx.rotate(-angle);
+ ctx.translate(-point.x, -point.y);
+ };
+ };
+ svg.Element.marker.prototype = new svg.Element.ElementBase();
+ // definitions element
+ svg.Element.defs = function(node) {
+ this.base = svg.Element.ElementBase;
+ this.base(node);
+ this.render = function(ctx) {};
+ };
+ svg.Element.defs.prototype = new svg.Element.ElementBase();
+ // base for gradients
+ svg.Element.GradientBase = function(node) {
+ this.base = svg.Element.ElementBase;
+ this.base(node);
+ this.gradientUnits = this.attribute("gradientUnits").valueOrDefault("objectBoundingBox");
+ this.stops = [];
+ for (var i = 0; i < this.children.length; i++) {
+ var child = this.children[i];
+ if (child.type == "stop") this.stops.push(child);
+ }
+ this.getGradient = function() {};
+ this.createGradient = function(ctx, element, parentOpacityProp) {
+ var stopsContainer = this;
+ if (this.getHrefAttribute().hasValue()) {
+ stopsContainer = this.getHrefAttribute().getDefinition();
+ }
+ var addParentOpacity = function(color) {
+ if (parentOpacityProp.hasValue()) {
+ var p = new svg.Property("color", color);
+ return p.addOpacity(parentOpacityProp.value).value;
+ }
+ return color;
+ };
+ var g = this.getGradient(ctx, element);
+ if (g == null) return addParentOpacity(stopsContainer.stops[stopsContainer.stops.length - 1].color);
+ for (var i = 0; i < stopsContainer.stops.length; i++) {
+ g.addColorStop(stopsContainer.stops[i].offset, addParentOpacity(stopsContainer.stops[i].color));
+ }
+ if (this.attribute("gradientTransform").hasValue()) {
+ // render as transformed pattern on temporary canvas
+ var rootView = svg.ViewPort.viewPorts[0];
+ var rect = new svg.Element.rect();
+ rect.attributes["x"] = new svg.Property("x", -svg.MAX_VIRTUAL_PIXELS / 3);
+ rect.attributes["y"] = new svg.Property("y", -svg.MAX_VIRTUAL_PIXELS / 3);
+ rect.attributes["width"] = new svg.Property("width", svg.MAX_VIRTUAL_PIXELS);
+ rect.attributes["height"] = new svg.Property("height", svg.MAX_VIRTUAL_PIXELS);
+ var group = new svg.Element.g();
+ group.attributes["transform"] = new svg.Property("transform", this.attribute("gradientTransform").value);
+ group.children = [ rect ];
+ var tempSvg = new svg.Element.svg();
+ tempSvg.attributes["x"] = new svg.Property("x", 0);
+ tempSvg.attributes["y"] = new svg.Property("y", 0);
+ tempSvg.attributes["width"] = new svg.Property("width", rootView.width);
+ tempSvg.attributes["height"] = new svg.Property("height", rootView.height);
+ tempSvg.children = [ group ];
+ var c = document.createElement("canvas");
+ c.width = rootView.width;
+ c.height = rootView.height;
+ var tempCtx = c.getContext("2d");
+ tempCtx.fillStyle = g;
+ tempSvg.render(tempCtx);
+ return tempCtx.createPattern(c, "no-repeat");
+ }
+ return g;
+ };
+ };
+ svg.Element.GradientBase.prototype = new svg.Element.ElementBase();
+ // linear gradient element
+ svg.Element.linearGradient = function(node) {
+ this.base = svg.Element.GradientBase;
+ this.base(node);
+ this.getGradient = function(ctx, element) {
+ var bb = element.getBoundingBox();
+ if (!this.attribute("x1").hasValue() && !this.attribute("y1").hasValue() && !this.attribute("x2").hasValue() && !this.attribute("y2").hasValue()) {
+ this.attribute("x1", true).value = 0;
+ this.attribute("y1", true).value = 0;
+ this.attribute("x2", true).value = 1;
+ this.attribute("y2", true).value = 0;
+ }
+ var x1 = this.gradientUnits == "objectBoundingBox" ? bb.x() + bb.width() * this.attribute("x1").numValue() : this.attribute("x1").toPixels("x");
+ var y1 = this.gradientUnits == "objectBoundingBox" ? bb.y() + bb.height() * this.attribute("y1").numValue() : this.attribute("y1").toPixels("y");
+ var x2 = this.gradientUnits == "objectBoundingBox" ? bb.x() + bb.width() * this.attribute("x2").numValue() : this.attribute("x2").toPixels("x");
+ var y2 = this.gradientUnits == "objectBoundingBox" ? bb.y() + bb.height() * this.attribute("y2").numValue() : this.attribute("y2").toPixels("y");
+ if (x1 == x2 && y1 == y2) return null;
+ return ctx.createLinearGradient(x1, y1, x2, y2);
+ };
+ };
+ svg.Element.linearGradient.prototype = new svg.Element.GradientBase();
+ // radial gradient element
+ svg.Element.radialGradient = function(node) {
+ this.base = svg.Element.GradientBase;
+ this.base(node);
+ this.getGradient = function(ctx, element) {
+ var bb = element.getBoundingBox();
+ if (!this.attribute("cx").hasValue()) this.attribute("cx", true).value = "50%";
+ if (!this.attribute("cy").hasValue()) this.attribute("cy", true).value = "50%";
+ if (!this.attribute("r").hasValue()) this.attribute("r", true).value = "50%";
+ var cx = this.gradientUnits == "objectBoundingBox" ? bb.x() + bb.width() * this.attribute("cx").numValue() : this.attribute("cx").toPixels("x");
+ var cy = this.gradientUnits == "objectBoundingBox" ? bb.y() + bb.height() * this.attribute("cy").numValue() : this.attribute("cy").toPixels("y");
+ var fx = cx;
+ var fy = cy;
+ if (this.attribute("fx").hasValue()) {
+ fx = this.gradientUnits == "objectBoundingBox" ? bb.x() + bb.width() * this.attribute("fx").numValue() : this.attribute("fx").toPixels("x");
+ }
+ if (this.attribute("fy").hasValue()) {
+ fy = this.gradientUnits == "objectBoundingBox" ? bb.y() + bb.height() * this.attribute("fy").numValue() : this.attribute("fy").toPixels("y");
+ }
+ var r = this.gradientUnits == "objectBoundingBox" ? (bb.width() + bb.height()) / 2 * this.attribute("r").numValue() : this.attribute("r").toPixels();
+ return ctx.createRadialGradient(fx, fy, 0, cx, cy, r);
+ };
+ };
+ svg.Element.radialGradient.prototype = new svg.Element.GradientBase();
+ // gradient stop element
+ svg.Element.stop = function(node) {
+ this.base = svg.Element.ElementBase;
+ this.base(node);
+ this.offset = this.attribute("offset").numValue();
+ if (this.offset < 0) this.offset = 0;
+ if (this.offset > 1) this.offset = 1;
+ var stopColor = this.style("stop-color");
+ if (this.style("stop-opacity").hasValue()) stopColor = stopColor.addOpacity(this.style("stop-opacity").value);
+ this.color = stopColor.value;
+ };
+ svg.Element.stop.prototype = new svg.Element.ElementBase();
+ // animation base element
+ svg.Element.AnimateBase = function(node) {
+ this.base = svg.Element.ElementBase;
+ this.base(node);
+ svg.Animations.push(this);
+ this.duration = 0;
+ this.begin = this.attribute("begin").toMilliseconds();
+ this.maxDuration = this.begin + this.attribute("dur").toMilliseconds();
+ this.getProperty = function() {
+ var attributeType = this.attribute("attributeType").value;
+ var attributeName = this.attribute("attributeName").value;
+ if (attributeType == "CSS") {
+ return this.parent.style(attributeName, true);
+ }
+ return this.parent.attribute(attributeName, true);
+ };
+ this.initialValue = null;
+ this.initialUnits = "";
+ this.removed = false;
+ this.calcValue = function() {
+ // OVERRIDE ME!
+ return "";
+ };
+ this.update = function(delta) {
+ // set initial value
+ if (this.initialValue == null) {
+ this.initialValue = this.getProperty().value;
+ this.initialUnits = this.getProperty().getUnits();
+ }
+ // if we're past the end time
+ if (this.duration > this.maxDuration) {
+ // loop for indefinitely repeating animations
+ if (this.attribute("repeatCount").value == "indefinite" || this.attribute("repeatDur").value == "indefinite") {
+ this.duration = 0;
+ } else if (this.attribute("fill").valueOrDefault("remove") == "remove" && !this.removed) {
+ this.removed = true;
+ this.getProperty().value = this.initialValue;
+ return true;
+ } else {
+ return false;
+ }
+ }
+ this.duration = this.duration + delta;
+ // if we're past the begin time
+ var updated = false;
+ if (this.begin < this.duration) {
+ var newValue = this.calcValue();
+ // tween
+ if (this.attribute("type").hasValue()) {
+ // for transform, etc.
+ var type = this.attribute("type").value;
+ newValue = type + "(" + newValue + ")";
+ }
+ this.getProperty().value = newValue;
+ updated = true;
+ }
+ return updated;
+ };
+ this.from = this.attribute("from");
+ this.to = this.attribute("to");
+ this.values = this.attribute("values");
+ if (this.values.hasValue()) this.values.value = this.values.value.split(";");
+ // fraction of duration we've covered
+ this.progress = function() {
+ var ret = {
+ progress: (this.duration - this.begin) / (this.maxDuration - this.begin)
+ };
+ if (this.values.hasValue()) {
+ var p = ret.progress * (this.values.value.length - 1);
+ var lb = Math.floor(p), ub = Math.ceil(p);
+ ret.from = new svg.Property("from", parseFloat(this.values.value[lb]));
+ ret.to = new svg.Property("to", parseFloat(this.values.value[ub]));
+ ret.progress = (p - lb) / (ub - lb);
+ } else {
+ ret.from = this.from;
+ ret.to = this.to;
+ }
+ return ret;
+ };
+ };
+ svg.Element.AnimateBase.prototype = new svg.Element.ElementBase();
+ // animate element
+ svg.Element.animate = function(node) {
+ this.base = svg.Element.AnimateBase;
+ this.base(node);
+ this.calcValue = function() {
+ var p = this.progress();
+ // tween value linearly
+ var newValue = p.from.numValue() + (p.to.numValue() - p.from.numValue()) * p.progress;
+ return newValue + this.initialUnits;
+ };
+ };
+ svg.Element.animate.prototype = new svg.Element.AnimateBase();
+ // animate color element
+ svg.Element.animateColor = function(node) {
+ this.base = svg.Element.AnimateBase;
+ this.base(node);
+ this.calcValue = function() {
+ var p = this.progress();
+ var from = new RGBColor(p.from.value);
+ var to = new RGBColor(p.to.value);
+ if (from.ok && to.ok) {
+ // tween color linearly
+ var r = from.r + (to.r - from.r) * p.progress;
+ var g = from.g + (to.g - from.g) * p.progress;
+ var b = from.b + (to.b - from.b) * p.progress;
+ return "rgb(" + parseInt(r, 10) + "," + parseInt(g, 10) + "," + parseInt(b, 10) + ")";
+ }
+ return this.attribute("from").value;
+ };
+ };
+ svg.Element.animateColor.prototype = new svg.Element.AnimateBase();
+ // animate transform element
+ svg.Element.animateTransform = function(node) {
+ this.base = svg.Element.AnimateBase;
+ this.base(node);
+ this.calcValue = function() {
+ var p = this.progress();
+ // tween value linearly
+ var from = svg.ToNumberArray(p.from.value);
+ var to = svg.ToNumberArray(p.to.value);
+ var newValue = "";
+ for (var i = 0; i < from.length; i++) {
+ newValue += from[i] + (to[i] - from[i]) * p.progress + " ";
+ }
+ return newValue;
+ };
+ };
+ svg.Element.animateTransform.prototype = new svg.Element.animate();
+ // font element
+ svg.Element.font = function(node) {
+ this.base = svg.Element.ElementBase;
+ this.base(node);
+ this.horizAdvX = this.attribute("horiz-adv-x").numValue();
+ this.isRTL = false;
+ this.isArabic = false;
+ this.fontFace = null;
+ this.missingGlyph = null;
+ this.glyphs = [];
+ for (var i = 0; i < this.children.length; i++) {
+ var child = this.children[i];
+ if (child.type == "font-face") {
+ this.fontFace = child;
+ if (child.style("font-family").hasValue()) {
+ svg.Definitions[child.style("font-family").value] = this;
+ }
+ } else if (child.type == "missing-glyph") this.missingGlyph = child; else if (child.type == "glyph") {
+ if (child.arabicForm != "") {
+ this.isRTL = true;
+ this.isArabic = true;
+ if (typeof this.glyphs[child.unicode] == "undefined") this.glyphs[child.unicode] = [];
+ this.glyphs[child.unicode][child.arabicForm] = child;
+ } else {
+ this.glyphs[child.unicode] = child;
+ }
+ }
+ }
+ };
+ svg.Element.font.prototype = new svg.Element.ElementBase();
+ // font-face element
+ svg.Element.fontface = function(node) {
+ this.base = svg.Element.ElementBase;
+ this.base(node);
+ this.ascent = this.attribute("ascent").value;
+ this.descent = this.attribute("descent").value;
+ this.unitsPerEm = this.attribute("units-per-em").numValue();
+ };
+ svg.Element.fontface.prototype = new svg.Element.ElementBase();
+ // missing-glyph element
+ svg.Element.missingglyph = function(node) {
+ this.base = svg.Element.path;
+ this.base(node);
+ this.horizAdvX = 0;
+ };
+ svg.Element.missingglyph.prototype = new svg.Element.path();
+ // glyph element
+ svg.Element.glyph = function(node) {
+ this.base = svg.Element.path;
+ this.base(node);
+ this.horizAdvX = this.attribute("horiz-adv-x").numValue();
+ this.unicode = this.attribute("unicode").value;
+ this.arabicForm = this.attribute("arabic-form").value;
+ };
+ svg.Element.glyph.prototype = new svg.Element.path();
+ // text element
+ svg.Element.text = function(node) {
+ this.captureTextNodes = true;
+ this.base = svg.Element.RenderedElementBase;
+ this.base(node);
+ this.baseSetContext = this.setContext;
+ this.setContext = function(ctx) {
+ this.baseSetContext(ctx);
+ if (this.style("dominant-baseline").hasValue()) ctx.textBaseline = this.style("dominant-baseline").value;
+ if (this.style("alignment-baseline").hasValue()) ctx.textBaseline = this.style("alignment-baseline").value;
+ };
+ this.getBoundingBox = function() {
+ // TODO: implement
+ return new svg.BoundingBox(this.attribute("x").toPixels("x"), this.attribute("y").toPixels("y"), 0, 0);
+ };
+ this.renderChildren = function(ctx) {
+ this.x = this.attribute("x").toPixels("x");
+ this.y = this.attribute("y").toPixels("y");
+ this.x += this.getAnchorDelta(ctx, this, 0);
+ for (var i = 0; i < this.children.length; i++) {
+ this.renderChild(ctx, this, i);
+ }
+ };
+ this.getAnchorDelta = function(ctx, parent, startI) {
+ var textAnchor = this.style("text-anchor").valueOrDefault("start");
+ if (textAnchor != "start") {
+ var width = 0;
+ for (var i = startI; i < parent.children.length; i++) {
+ var child = parent.children[i];
+ if (i > startI && child.attribute("x").hasValue()) break;
+ // new group
+ width += child.measureTextRecursive(ctx);
+ }
+ return -1 * (textAnchor == "end" ? width : width / 2);
+ }
+ return 0;
+ };
+ this.renderChild = function(ctx, parent, i) {
+ var child = parent.children[i];
+ if (child.attribute("x").hasValue()) {
+ child.x = child.attribute("x").toPixels("x") + this.getAnchorDelta(ctx, parent, i);
+ } else {
+ if (this.attribute("dx").hasValue()) this.x += this.attribute("dx").toPixels("x");
+ if (child.attribute("dx").hasValue()) this.x += child.attribute("dx").toPixels("x");
+ child.x = this.x;
+ }
+ this.x = child.x + child.measureText(ctx);
+ if (child.attribute("y").hasValue()) {
+ child.y = child.attribute("y").toPixels("y");
+ } else {
+ if (this.attribute("dy").hasValue()) this.y += this.attribute("dy").toPixels("y");
+ if (child.attribute("dy").hasValue()) this.y += child.attribute("dy").toPixels("y");
+ child.y = this.y;
+ }
+ this.y = child.y;
+ child.render(ctx);
+ for (var i = 0; i < child.children.length; i++) {
+ this.renderChild(ctx, child, i);
+ }
+ };
+ };
+ svg.Element.text.prototype = new svg.Element.RenderedElementBase();
+ // text base
+ svg.Element.TextElementBase = function(node) {
+ this.base = svg.Element.RenderedElementBase;
+ this.base(node);
+ this.getGlyph = function(font, text, i) {
+ var c = text[i];
+ var glyph = null;
+ if (font.isArabic) {
+ var arabicForm = "isolated";
+ if ((i == 0 || text[i - 1] == " ") && i < text.length - 2 && text[i + 1] != " ") arabicForm = "terminal";
+ if (i > 0 && text[i - 1] != " " && i < text.length - 2 && text[i + 1] != " ") arabicForm = "medial";
+ if (i > 0 && text[i - 1] != " " && (i == text.length - 1 || text[i + 1] == " ")) arabicForm = "initial";
+ if (typeof font.glyphs[c] != "undefined") {
+ glyph = font.glyphs[c][arabicForm];
+ if (glyph == null && font.glyphs[c].type == "glyph") glyph = font.glyphs[c];
+ }
+ } else {
+ glyph = font.glyphs[c];
+ }
+ if (glyph == null) glyph = font.missingGlyph;
+ return glyph;
+ };
+ this.renderChildren = function(ctx) {
+ var customFont = this.parent.style("font-family").getDefinition();
+ if (customFont != null) {
+ var fontSize = this.parent.style("font-size").numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);
+ var fontStyle = this.parent.style("font-style").valueOrDefault(svg.Font.Parse(svg.ctx.font).fontStyle);
+ var text = this.getText();
+ if (customFont.isRTL) text = text.split("").reverse().join("");
+ var dx = svg.ToNumberArray(this.parent.attribute("dx").value);
+ for (var i = 0; i < text.length; i++) {
+ var glyph = this.getGlyph(customFont, text, i);
+ var scale = fontSize / customFont.fontFace.unitsPerEm;
+ ctx.translate(this.x, this.y);
+ ctx.scale(scale, -scale);
+ var lw = ctx.lineWidth;
+ ctx.lineWidth = ctx.lineWidth * customFont.fontFace.unitsPerEm / fontSize;
+ if (fontStyle == "italic") ctx.transform(1, 0, .4, 1, 0, 0);
+ glyph.render(ctx);
+ if (fontStyle == "italic") ctx.transform(1, 0, -.4, 1, 0, 0);
+ ctx.lineWidth = lw;
+ ctx.scale(1 / scale, -1 / scale);
+ ctx.translate(-this.x, -this.y);
+ this.x += fontSize * (glyph.horizAdvX || customFont.horizAdvX) / customFont.fontFace.unitsPerEm;
+ if (typeof dx[i] != "undefined" && !isNaN(dx[i])) {
+ this.x += dx[i];
+ }
+ }
+ return;
+ }
+ if (ctx.fillStyle != "") ctx.fillText(svg.compressSpaces(this.getText()), this.x, this.y);
+ if (ctx.strokeStyle != "") ctx.strokeText(svg.compressSpaces(this.getText()), this.x, this.y);
+ };
+ this.getText = function() {};
+ this.measureTextRecursive = function(ctx) {
+ var width = this.measureText(ctx);
+ for (var i = 0; i < this.children.length; i++) {
+ width += this.children[i].measureTextRecursive(ctx);
+ }
+ return width;
+ };
+ this.measureText = function(ctx) {
+ var customFont = this.parent.style("font-family").getDefinition();
+ if (customFont != null) {
+ var fontSize = this.parent.style("font-size").numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);
+ var measure = 0;
+ var text = this.getText();
+ if (customFont.isRTL) text = text.split("").reverse().join("");
+ var dx = svg.ToNumberArray(this.parent.attribute("dx").value);
+ for (var i = 0; i < text.length; i++) {
+ var glyph = this.getGlyph(customFont, text, i);
+ measure += (glyph.horizAdvX || customFont.horizAdvX) * fontSize / customFont.fontFace.unitsPerEm;
+ if (typeof dx[i] != "undefined" && !isNaN(dx[i])) {
+ measure += dx[i];
+ }
+ }
+ return measure;
+ }
+ var textToMeasure = svg.compressSpaces(this.getText());
+ if (!ctx.measureText) return textToMeasure.length * 10;
+ ctx.save();
+ this.setContext(ctx);
+ var width = ctx.measureText(textToMeasure).width;
+ ctx.restore();
+ return width;
+ };
+ };
+ svg.Element.TextElementBase.prototype = new svg.Element.RenderedElementBase();
+ // tspan
+ svg.Element.tspan = function(node) {
+ this.captureTextNodes = true;
+ this.base = svg.Element.TextElementBase;
+ this.base(node);
+ this.text = node.nodeValue || node.text || "";
+ this.getText = function() {
+ return this.text;
+ };
+ };
+ svg.Element.tspan.prototype = new svg.Element.TextElementBase();
+ // tref
+ svg.Element.tref = function(node) {
+ this.base = svg.Element.TextElementBase;
+ this.base(node);
+ this.getText = function() {
+ var element = this.getHrefAttribute().getDefinition();
+ if (element != null) return element.children[0].getText();
+ };
+ };
+ svg.Element.tref.prototype = new svg.Element.TextElementBase();
+ // a element
+ svg.Element.a = function(node) {
+ this.base = svg.Element.TextElementBase;
+ this.base(node);
+ this.hasText = true;
+ for (var i = 0; i < node.childNodes.length; i++) {
+ if (node.childNodes[i].nodeType != 3) this.hasText = false;
+ }
+ // this might contain text
+ this.text = this.hasText ? node.childNodes[0].nodeValue : "";
+ this.getText = function() {
+ return this.text;
+ };
+ this.baseRenderChildren = this.renderChildren;
+ this.renderChildren = function(ctx) {
+ if (this.hasText) {
+ // render as text element
+ this.baseRenderChildren(ctx);
+ var fontSize = new svg.Property("fontSize", svg.Font.Parse(svg.ctx.font).fontSize);
+ svg.Mouse.checkBoundingBox(this, new svg.BoundingBox(this.x, this.y - fontSize.toPixels("y"), this.x + this.measureText(ctx), this.y));
+ } else {
+ // render as temporary group
+ var g = new svg.Element.g();
+ g.children = this.children;
+ g.parent = this;
+ g.render(ctx);
+ }
+ };
+ this.onclick = function() {
+ window.open(this.getHrefAttribute().value);
+ };
+ this.onmousemove = function() {
+ svg.ctx.canvas.style.cursor = "pointer";
+ };
+ };
+ svg.Element.a.prototype = new svg.Element.TextElementBase();
+ // image element
+ svg.Element.image = function(node) {
+ this.base = svg.Element.RenderedElementBase;
+ this.base(node);
+ var href = this.getHrefAttribute().value;
+ var isSvg = href.match(/\.svg$/);
+ svg.Images.push(this);
+ this.loaded = false;
+ if (!isSvg) {
+ this.img = document.createElement("img");
+ var self = this;
+ this.img.onload = function() {
+ self.loaded = true;
+ };
+ this.img.onerror = function() {
+ if (typeof console != "undefined") {
+ console.log('ERROR: image "' + href + '" not found');
+ self.loaded = true;
+ }
+ };
+ this.img.src = href;
+ } else {
+ this.img = svg.ajax(href);
+ this.loaded = true;
+ }
+ this.renderChildren = function(ctx) {
+ var x = this.attribute("x").toPixels("x");
+ var y = this.attribute("y").toPixels("y");
+ var width = this.attribute("width").toPixels("x");
+ var height = this.attribute("height").toPixels("y");
+ if (width == 0 || height == 0) return;
+ ctx.save();
+ if (isSvg) {
+ ctx.drawSvg(this.img, x, y, width, height);
+ } else {
+ ctx.translate(x, y);
+ svg.AspectRatio(ctx, this.attribute("preserveAspectRatio").value, width, this.img.width, height, this.img.height, 0, 0);
+ ctx.drawImage(this.img, 0, 0);
+ }
+ ctx.restore();
+ };
+ this.getBoundingBox = function() {
+ var x = this.attribute("x").toPixels("x");
+ var y = this.attribute("y").toPixels("y");
+ var width = this.attribute("width").toPixels("x");
+ var height = this.attribute("height").toPixels("y");
+ return new svg.BoundingBox(x, y, x + width, y + height);
+ };
+ };
+ svg.Element.image.prototype = new svg.Element.RenderedElementBase();
+ // group element
+ svg.Element.g = function(node) {
+ this.base = svg.Element.RenderedElementBase;
+ this.base(node);
+ this.getBoundingBox = function() {
+ var bb = new svg.BoundingBox();
+ for (var i = 0; i < this.children.length; i++) {
+ bb.addBoundingBox(this.children[i].getBoundingBox());
+ }
+ return bb;
+ };
+ };
+ svg.Element.g.prototype = new svg.Element.RenderedElementBase();
+ // symbol element
+ svg.Element.symbol = function(node) {
+ this.base = svg.Element.RenderedElementBase;
+ this.base(node);
+ this.baseSetContext = this.setContext;
+ this.setContext = function(ctx) {
+ this.baseSetContext(ctx);
+ // viewbox
+ if (this.attribute("viewBox").hasValue()) {
+ var viewBox = svg.ToNumberArray(this.attribute("viewBox").value);
+ var minX = viewBox[0];
+ var minY = viewBox[1];
+ width = viewBox[2];
+ height = viewBox[3];
+ svg.AspectRatio(ctx, this.attribute("preserveAspectRatio").value, this.attribute("width").toPixels("x"), width, this.attribute("height").toPixels("y"), height, minX, minY);
+ svg.ViewPort.SetCurrent(viewBox[2], viewBox[3]);
+ }
+ };
+ };
+ svg.Element.symbol.prototype = new svg.Element.RenderedElementBase();
+ // style element
+ svg.Element.style = function(node) {
+ this.base = svg.Element.ElementBase;
+ this.base(node);
+ // text, or spaces then CDATA
+ var css = "";
+ for (var i = 0; i < node.childNodes.length; i++) {
+ css += node.childNodes[i].nodeValue;
+ }
+ css = css.replace(/(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)|(^[\s]*\/\/.*)/gm, "");
+ // remove comments
+ css = svg.compressSpaces(css);
+ // replace whitespace
+ var cssDefs = css.split("}");
+ for (var i = 0; i < cssDefs.length; i++) {
+ if (svg.trim(cssDefs[i]) != "") {
+ var cssDef = cssDefs[i].split("{");
+ var cssClasses = cssDef[0].split(",");
+ var cssProps = cssDef[1].split(";");
+ for (var j = 0; j < cssClasses.length; j++) {
+ var cssClass = svg.trim(cssClasses[j]);
+ if (cssClass != "") {
+ var props = {};
+ for (var k = 0; k < cssProps.length; k++) {
+ var prop = cssProps[k].indexOf(":");
+ var name = cssProps[k].substr(0, prop);
+ var value = cssProps[k].substr(prop + 1, cssProps[k].length - prop);
+ if (name != null && value != null) {
+ props[svg.trim(name)] = new svg.Property(svg.trim(name), svg.trim(value));
+ }
+ }
+ svg.Styles[cssClass] = props;
+ if (cssClass == "@font-face") {
+ var fontFamily = props["font-family"].value.replace(/"/g, "");
+ var srcs = props["src"].value.split(",");
+ for (var s = 0; s < srcs.length; s++) {
+ if (srcs[s].indexOf('format("svg")') > 0) {
+ var urlStart = srcs[s].indexOf("url");
+ var urlEnd = srcs[s].indexOf(")", urlStart);
+ var url = srcs[s].substr(urlStart + 5, urlEnd - urlStart - 6);
+ var doc = svg.parseXml(svg.ajax(url));
+ var fonts = doc.getElementsByTagName("font");
+ for (var f = 0; f < fonts.length; f++) {
+ var font = svg.CreateElement(fonts[f]);
+ svg.Definitions[fontFamily] = font;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ };
+ svg.Element.style.prototype = new svg.Element.ElementBase();
+ // use element
+ svg.Element.use = function(node) {
+ this.base = svg.Element.RenderedElementBase;
+ this.base(node);
+ this.baseSetContext = this.setContext;
+ this.setContext = function(ctx) {
+ this.baseSetContext(ctx);
+ if (this.attribute("x").hasValue()) ctx.translate(this.attribute("x").toPixels("x"), 0);
+ if (this.attribute("y").hasValue()) ctx.translate(0, this.attribute("y").toPixels("y"));
+ };
+ this.getDefinition = function() {
+ var element = this.getHrefAttribute().getDefinition();
+ if (this.attribute("width").hasValue()) element.attribute("width", true).value = this.attribute("width").value;
+ if (this.attribute("height").hasValue()) element.attribute("height", true).value = this.attribute("height").value;
+ return element;
+ };
+ this.path = function(ctx) {
+ var element = this.getDefinition();
+ if (element != null) element.path(ctx);
+ };
+ this.getBoundingBox = function() {
+ var element = this.getDefinition();
+ if (element != null) return element.getBoundingBox();
+ };
+ this.renderChildren = function(ctx) {
+ var element = this.getDefinition();
+ if (element != null) {
+ // temporarily detach from parent and render
+ var oldParent = element.parent;
+ element.parent = null;
+ element.render(ctx);
+ element.parent = oldParent;
+ }
+ };
+ };
+ svg.Element.use.prototype = new svg.Element.RenderedElementBase();
+ // mask element
+ svg.Element.mask = function(node) {
+ this.base = svg.Element.ElementBase;
+ this.base(node);
+ this.apply = function(ctx, element) {
+ // render as temp svg
+ var x = this.attribute("x").toPixels("x");
+ var y = this.attribute("y").toPixels("y");
+ var width = this.attribute("width").toPixels("x");
+ var height = this.attribute("height").toPixels("y");
+ if (width == 0 && height == 0) {
+ var bb = new svg.BoundingBox();
+ for (var i = 0; i < this.children.length; i++) {
+ bb.addBoundingBox(this.children[i].getBoundingBox());
+ }
+ var x = Math.floor(bb.x1);
+ var y = Math.floor(bb.y1);
+ var width = Math.floor(bb.width());
+ var height = Math.floor(bb.height());
+ }
+ // temporarily remove mask to avoid recursion
+ var mask = element.attribute("mask").value;
+ element.attribute("mask").value = "";
+ var cMask = document.createElement("canvas");
+ cMask.width = x + width;
+ cMask.height = y + height;
+ var maskCtx = cMask.getContext("2d");
+ this.renderChildren(maskCtx);
+ var c = document.createElement("canvas");
+ c.width = x + width;
+ c.height = y + height;
+ var tempCtx = c.getContext("2d");
+ element.render(tempCtx);
+ tempCtx.globalCompositeOperation = "destination-in";
+ tempCtx.fillStyle = maskCtx.createPattern(cMask, "no-repeat");
+ tempCtx.fillRect(0, 0, x + width, y + height);
+ ctx.fillStyle = tempCtx.createPattern(c, "no-repeat");
+ ctx.fillRect(0, 0, x + width, y + height);
+ // reassign mask
+ element.attribute("mask").value = mask;
+ };
+ this.render = function(ctx) {};
+ };
+ svg.Element.mask.prototype = new svg.Element.ElementBase();
+ // clip element
+ svg.Element.clipPath = function(node) {
+ this.base = svg.Element.ElementBase;
+ this.base(node);
+ this.apply = function(ctx) {
+ for (var i = 0; i < this.children.length; i++) {
+ var child = this.children[i];
+ if (typeof child.path != "undefined") {
+ var transform = null;
+ if (child.attribute("transform").hasValue()) {
+ transform = new svg.Transform(child.attribute("transform").value);
+ transform.apply(ctx);
+ }
+ child.path(ctx);
+ ctx.clip();
+ if (transform) {
+ transform.unapply(ctx);
+ }
+ }
+ }
+ };
+ this.render = function(ctx) {};
+ };
+ svg.Element.clipPath.prototype = new svg.Element.ElementBase();
+ // filters
+ svg.Element.filter = function(node) {
+ this.base = svg.Element.ElementBase;
+ this.base(node);
+ this.apply = function(ctx, element) {
+ // render as temp svg
+ var bb = element.getBoundingBox();
+ var x = Math.floor(bb.x1);
+ var y = Math.floor(bb.y1);
+ var width = Math.floor(bb.width());
+ var height = Math.floor(bb.height());
+ // temporarily remove filter to avoid recursion
+ var filter = element.style("filter").value;
+ element.style("filter").value = "";
+ var px = 0, py = 0;
+ for (var i = 0; i < this.children.length; i++) {
+ var efd = this.children[i].extraFilterDistance || 0;
+ px = Math.max(px, efd);
+ py = Math.max(py, efd);
+ }
+ var c = document.createElement("canvas");
+ c.width = width + 2 * px;
+ c.height = height + 2 * py;
+ var tempCtx = c.getContext("2d");
+ tempCtx.translate(-x + px, -y + py);
+ element.render(tempCtx);
+ // apply filters
+ for (var i = 0; i < this.children.length; i++) {
+ this.children[i].apply(tempCtx, 0, 0, width + 2 * px, height + 2 * py);
+ }
+ // render on me
+ ctx.drawImage(c, 0, 0, width + 2 * px, height + 2 * py, x - px, y - py, width + 2 * px, height + 2 * py);
+ // reassign filter
+ element.style("filter", true).value = filter;
+ };
+ this.render = function(ctx) {};
+ };
+ svg.Element.filter.prototype = new svg.Element.ElementBase();
+ svg.Element.feMorphology = function(node) {
+ this.base = svg.Element.ElementBase;
+ this.base(node);
+ this.apply = function(ctx, x, y, width, height) {};
+ };
+ svg.Element.feMorphology.prototype = new svg.Element.ElementBase();
+ svg.Element.feColorMatrix = function(node) {
+ this.base = svg.Element.ElementBase;
+ this.base(node);
+ function imGet(img, x, y, width, height, rgba) {
+ return img[y * width * 4 + x * 4 + rgba];
+ }
+ function imSet(img, x, y, width, height, rgba, val) {
+ img[y * width * 4 + x * 4 + rgba] = val;
+ }
+ this.apply = function(ctx, x, y, width, height) {
+ // only supporting grayscale for now per Issue 195, need to extend to all matrix
+ // assuming x==0 && y==0 for now
+ var srcData = ctx.getImageData(0, 0, width, height);
+ for (var y = 0; y < height; y++) {
+ for (var x = 0; x < width; x++) {
+ var r = imGet(srcData.data, x, y, width, height, 0);
+ var g = imGet(srcData.data, x, y, width, height, 1);
+ var b = imGet(srcData.data, x, y, width, height, 2);
+ var gray = (r + g + b) / 3;
+ imSet(srcData.data, x, y, width, height, 0, gray);
+ imSet(srcData.data, x, y, width, height, 1, gray);
+ imSet(srcData.data, x, y, width, height, 2, gray);
+ }
+ }
+ ctx.clearRect(0, 0, width, height);
+ ctx.putImageData(srcData, 0, 0);
+ };
+ };
+ svg.Element.feColorMatrix.prototype = new svg.Element.ElementBase();
+ svg.Element.feGaussianBlur = function(node) {
+ this.base = svg.Element.ElementBase;
+ this.base(node);
+ this.blurRadius = Math.floor(this.attribute("stdDeviation").numValue());
+ this.extraFilterDistance = this.blurRadius;
+ this.apply = function(ctx, x, y, width, height) {
+ if (typeof stackBlurCanvasRGBA == "undefined") {
+ if (typeof console != "undefined") {
+ console.log("ERROR: StackBlur.js must be included for blur to work");
+ }
+ return;
+ }
+ // StackBlur requires canvas be on document
+ ctx.canvas.id = svg.UniqueId();
+ ctx.canvas.style.display = "none";
+ document.body.appendChild(ctx.canvas);
+ stackBlurCanvasRGBA(ctx.canvas.id, x, y, width, height, this.blurRadius);
+ document.body.removeChild(ctx.canvas);
+ };
+ };
+ svg.Element.feGaussianBlur.prototype = new svg.Element.ElementBase();
+ // title element, do nothing
+ svg.Element.title = function(node) {};
+ svg.Element.title.prototype = new svg.Element.ElementBase();
+ // desc element, do nothing
+ svg.Element.desc = function(node) {};
+ svg.Element.desc.prototype = new svg.Element.ElementBase();
+ svg.Element.MISSING = function(node) {
+ if (typeof console != "undefined") {
+ console.log("ERROR: Element '" + node.nodeName + "' not yet implemented.");
+ }
+ };
+ svg.Element.MISSING.prototype = new svg.Element.ElementBase();
+ // element factory
+ svg.CreateElement = function(node) {
+ var className = node.nodeName.replace(/^[^:]+:/, "");
+ // remove namespace
+ className = className.replace(/\-/g, "");
+ // remove dashes
+ var e = null;
+ if (typeof svg.Element[className] != "undefined") {
+ e = new svg.Element[className](node);
+ } else {
+ e = new svg.Element.MISSING(node);
+ }
+ e.type = node.nodeName;
+ return e;
+ };
+ // load from url
+ svg.load = function(ctx, url) {
+ svg.loadXml(ctx, svg.ajax(url));
+ };
+ // load from xml
+ svg.loadXml = function(ctx, xml) {
+ svg.loadXmlDoc(ctx, svg.parseXml(xml));
+ };
+ svg.loadXmlDoc = function(ctx, dom) {
+ svg.init(ctx);
+ var mapXY = function(p) {
+ var e = ctx.canvas;
+ while (e) {
+ p.x -= e.offsetLeft;
+ p.y -= e.offsetTop;
+ e = e.offsetParent;
+ }
+ if (window.scrollX) p.x += window.scrollX;
+ if (window.scrollY) p.y += window.scrollY;
+ return p;
+ };
+ // bind mouse
+ if (svg.opts["ignoreMouse"] != true) {
+ ctx.canvas.onclick = function(e) {
+ var p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY));
+ svg.Mouse.onclick(p.x, p.y);
+ };
+ ctx.canvas.onmousemove = function(e) {
+ var p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY));
+ svg.Mouse.onmousemove(p.x, p.y);
+ };
+ }
+ var e = svg.CreateElement(dom.documentElement);
+ e.root = true;
+ // render loop
+ var isFirstRender = true;
+ var draw = function() {
+ svg.ViewPort.Clear();
+ if (ctx.canvas.parentNode) svg.ViewPort.SetCurrent(ctx.canvas.parentNode.clientWidth, ctx.canvas.parentNode.clientHeight);
+ if (svg.opts["ignoreDimensions"] != true) {
+ // set canvas size
+ if (e.style("width").hasValue()) {
+ ctx.canvas.width = e.style("width").toPixels("x");
+ ctx.canvas.style.width = ctx.canvas.width + "px";
+ }
+ if (e.style("height").hasValue()) {
+ ctx.canvas.height = e.style("height").toPixels("y");
+ ctx.canvas.style.height = ctx.canvas.height + "px";
+ }
+ }
+ var cWidth = ctx.canvas.clientWidth || ctx.canvas.width;
+ var cHeight = ctx.canvas.clientHeight || ctx.canvas.height;
+ if (svg.opts["ignoreDimensions"] == true && e.style("width").hasValue() && e.style("height").hasValue()) {
+ cWidth = e.style("width").toPixels("x");
+ cHeight = e.style("height").toPixels("y");
+ }
+ svg.ViewPort.SetCurrent(cWidth, cHeight);
+ if (svg.opts["offsetX"] != null) e.attribute("x", true).value = svg.opts["offsetX"];
+ if (svg.opts["offsetY"] != null) e.attribute("y", true).value = svg.opts["offsetY"];
+ if (svg.opts["scaleWidth"] != null && svg.opts["scaleHeight"] != null) {
+ var xRatio = 1, yRatio = 1, viewBox = svg.ToNumberArray(e.attribute("viewBox").value);
+ if (e.attribute("width").hasValue()) xRatio = e.attribute("width").toPixels("x") / svg.opts["scaleWidth"]; else if (!isNaN(viewBox[2])) xRatio = viewBox[2] / svg.opts["scaleWidth"];
+ if (e.attribute("height").hasValue()) yRatio = e.attribute("height").toPixels("y") / svg.opts["scaleHeight"]; else if (!isNaN(viewBox[3])) yRatio = viewBox[3] / svg.opts["scaleHeight"];
+ e.attribute("width", true).value = svg.opts["scaleWidth"];
+ e.attribute("height", true).value = svg.opts["scaleHeight"];
+ e.attribute("viewBox", true).value = "0 0 " + cWidth * xRatio + " " + cHeight * yRatio;
+ e.attribute("preserveAspectRatio", true).value = "none";
+ }
+ // clear and render
+ if (svg.opts["ignoreClear"] != true) {
+ ctx.clearRect(0, 0, cWidth, cHeight);
+ }
+ e.render(ctx);
+ if (isFirstRender) {
+ isFirstRender = false;
+ if (typeof svg.opts["renderCallback"] == "function") svg.opts["renderCallback"](dom);
+ }
+ };
+ var waitingForImages = true;
+ if (svg.ImagesLoaded()) {
+ waitingForImages = false;
+ draw();
+ }
+ svg.intervalID = setInterval(function() {
+ var needUpdate = false;
+ if (waitingForImages && svg.ImagesLoaded()) {
+ waitingForImages = false;
+ needUpdate = true;
+ }
+ // need update from mouse events?
+ if (svg.opts["ignoreMouse"] != true) {
+ needUpdate = needUpdate | svg.Mouse.hasEvents();
+ }
+ // need update from animations?
+ if (svg.opts["ignoreAnimation"] != true) {
+ for (var i = 0; i < svg.Animations.length; i++) {
+ needUpdate = needUpdate | svg.Animations[i].update(1e3 / svg.FRAMERATE);
+ }
+ }
+ // need update from redraw?
+ if (typeof svg.opts["forceRedraw"] == "function") {
+ if (svg.opts["forceRedraw"]() == true) needUpdate = true;
+ }
+ // render if needed
+ if (needUpdate) {
+ draw();
+ svg.Mouse.runEvents();
+ }
+ }, 1e3 / svg.FRAMERATE);
+ };
+ svg.stop = function() {
+ if (svg.intervalID) {
+ clearInterval(svg.intervalID);
+ }
+ };
+ svg.Mouse = new function() {
+ this.events = [];
+ this.hasEvents = function() {
+ return this.events.length != 0;
+ };
+ this.onclick = function(x, y) {
+ this.events.push({
+ type: "onclick",
+ x: x,
+ y: y,
+ run: function(e) {
+ if (e.onclick) e.onclick();
+ }
+ });
+ };
+ this.onmousemove = function(x, y) {
+ this.events.push({
+ type: "onmousemove",
+ x: x,
+ y: y,
+ run: function(e) {
+ if (e.onmousemove) e.onmousemove();
+ }
+ });
+ };
+ this.eventElements = [];
+ this.checkPath = function(element, ctx) {
+ for (var i = 0; i < this.events.length; i++) {
+ var e = this.events[i];
+ if (ctx.isPointInPath && ctx.isPointInPath(e.x, e.y)) this.eventElements[i] = element;
+ }
+ };
+ this.checkBoundingBox = function(element, bb) {
+ for (var i = 0; i < this.events.length; i++) {
+ var e = this.events[i];
+ if (bb.isPointInBox(e.x, e.y)) this.eventElements[i] = element;
+ }
+ };
+ this.runEvents = function() {
+ svg.ctx.canvas.style.cursor = "";
+ for (var i = 0; i < this.events.length; i++) {
+ var e = this.events[i];
+ var element = this.eventElements[i];
+ while (element) {
+ e.run(element);
+ element = element.parent;
+ }
+ }
+ // done running, clear
+ this.events = [];
+ this.eventElements = [];
+ };
+ }();
+ return svg;
+ }
+ })();
+ if (typeof CanvasRenderingContext2D != "undefined") {
+ CanvasRenderingContext2D.prototype.drawSvg = function(s, dx, dy, dw, dh) {
+ canvg(this.canvas, s, {
+ ignoreMouse: true,
+ ignoreAnimation: true,
+ ignoreDimensions: true,
+ ignoreClear: true,
+ offsetX: dx,
+ offsetY: dy,
+ scaleWidth: dw,
+ scaleHeight: dh
+ });
+ };
+ }
+ return canvg;
+ }
+};
+
+/*!
+ * 输出转换器,提供输出支持
+ */
+_p[1] = {
+ value: function(require) {
+ var kity = _p.r(34), canvg = _p.r(0);
+ return kity.createClass("Output", {
+ constructor: function(formula) {
+ this.formula = formula;
+ },
+ toJPG: function(cb) {
+ toImage(this.formula, "image/jpeg", cb);
+ },
+ toPNG: function(cb) {
+ toImage(this.formula, "image/png", cb);
+ }
+ });
+ function toImage(formula, type, cb) {
+ var rectSpace = formula.container.getRenderBox();
+ return getBase64DataURL(formula.node.ownerDocument, {
+ width: rectSpace.width,
+ height: rectSpace.height,
+ content: getSVGContent(formula.node)
+ }, type, cb);
+ }
+ function getBase64DataURL(doc, data, type, cb) {
+ var canvas = null, args = arguments, ctx = null;
+ if (true) {
+ drawToCanvas.apply(null, args);
+ } else {
+ canvas = getImageCanvas(doc, data.width, data.height, type);
+ ctx = canvas.getContext("2d");
+ var image = new Image();
+ image.onload = function() {
+ try {
+ ctx.drawImage(image, 0, 0);
+ cb(canvas.toDataURL(type));
+ } catch (e) {
+ drawToCanvas.apply(null, args);
+ }
+ };
+ image.src = getSVGDataURL(data.content);
+ }
+ }
+ function getSVGContent(svgNode) {
+ var tmp = svgNode.ownerDocument.createElement("div"), start = [ '