From 556c648b16ed7a063d1f2de44ebc7b948b5f10b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=97=B6=E9=9B=A8?= Date: Tue, 5 May 2015 22:33:45 +0800 Subject: [PATCH] minos open source --- .gitignore | 7 + LICENSE | 20 + controller/__init__.py | 0 controller/admin.py | 240 + controller/ajax.py | 155 + controller/auth.py | 294 + controller/base.py | 199 + controller/dashboard.py | 131 + controller/download.py | 26 + controller/main.py | 33 + controller/message.py | 76 + controller/open.py | 147 + controller/post.py | 171 + controller/publish.py | 208 + controller/search.py | 32 + controller/sort.py | 30 + controller/user.py | 237 + controller/welcome.py | 6 + download/.gitignore | 1 + extends/__init__.py | 1 + extends/torndsession/__init__.py | 1 + extends/torndsession/driver.py | 42 + extends/torndsession/filesession.py | 86 + extends/torndsession/memorysession.py | 64 + extends/torndsession/redissession.py | 54 + extends/torndsession/session.py | 259 + extends/torndsession/sessionhandler.py | 26 + extends/torndsession/test/TEST_DIRECTORY | 1 + main.py | 97 + model/__init__.py | 1 + model/article.py | 40 + model/base.py | 47 + model/sort.py | 31 + model/user.py | 67 + requirements.txt | 17 + .../assets/ZeroClipboard/ZeroClipboard.min.js | 10 + .../ZeroClipboard/ZeroClipboard.min.map | 1 + static/assets/ZeroClipboard/ZeroClipboard.swf | Bin 0 -> 6580 bytes static/assets/ckeditor/build-config.js | 180 + static/assets/ckeditor/ckeditor.js | 1020 + static/assets/ckeditor/config.js | 32 + static/assets/ckeditor/contents.css | 134 + static/assets/ckeditor/lang/en.js | 5 + static/assets/ckeditor/lang/zh-cn.js | 5 + static/assets/ckeditor/lang/zh.js | 5 + .../plugins/a11yhelp/dialogs/a11yhelp.js | 10 + .../dialogs/lang/_translationstatus.txt | 25 + .../plugins/a11yhelp/dialogs/lang/af.js | 11 + .../plugins/a11yhelp/dialogs/lang/ar.js | 11 + .../plugins/a11yhelp/dialogs/lang/bg.js | 11 + .../plugins/a11yhelp/dialogs/lang/ca.js | 13 + .../plugins/a11yhelp/dialogs/lang/cs.js | 13 + .../plugins/a11yhelp/dialogs/lang/cy.js | 11 + .../plugins/a11yhelp/dialogs/lang/da.js | 11 + .../plugins/a11yhelp/dialogs/lang/de.js | 13 + .../plugins/a11yhelp/dialogs/lang/el.js | 13 + .../plugins/a11yhelp/dialogs/lang/en-gb.js | 11 + .../plugins/a11yhelp/dialogs/lang/en.js | 11 + .../plugins/a11yhelp/dialogs/lang/eo.js | 13 + .../plugins/a11yhelp/dialogs/lang/es.js | 12 + .../plugins/a11yhelp/dialogs/lang/et.js | 11 + .../plugins/a11yhelp/dialogs/lang/fa.js | 11 + .../plugins/a11yhelp/dialogs/lang/fi.js | 12 + .../plugins/a11yhelp/dialogs/lang/fr-ca.js | 12 + .../plugins/a11yhelp/dialogs/lang/fr.js | 13 + .../plugins/a11yhelp/dialogs/lang/gl.js | 12 + .../plugins/a11yhelp/dialogs/lang/gu.js | 11 + .../plugins/a11yhelp/dialogs/lang/he.js | 11 + .../plugins/a11yhelp/dialogs/lang/hi.js | 11 + .../plugins/a11yhelp/dialogs/lang/hr.js | 11 + .../plugins/a11yhelp/dialogs/lang/hu.js | 13 + .../plugins/a11yhelp/dialogs/lang/id.js | 11 + .../plugins/a11yhelp/dialogs/lang/it.js | 13 + .../plugins/a11yhelp/dialogs/lang/ja.js | 9 + .../plugins/a11yhelp/dialogs/lang/km.js | 11 + .../plugins/a11yhelp/dialogs/lang/ko.js | 11 + .../plugins/a11yhelp/dialogs/lang/ku.js | 12 + .../plugins/a11yhelp/dialogs/lang/lt.js | 11 + .../plugins/a11yhelp/dialogs/lang/lv.js | 13 + .../plugins/a11yhelp/dialogs/lang/mk.js | 11 + .../plugins/a11yhelp/dialogs/lang/mn.js | 11 + .../plugins/a11yhelp/dialogs/lang/nb.js | 12 + .../plugins/a11yhelp/dialogs/lang/nl.js | 12 + .../plugins/a11yhelp/dialogs/lang/no.js | 11 + .../plugins/a11yhelp/dialogs/lang/pl.js | 13 + .../plugins/a11yhelp/dialogs/lang/pt-br.js | 12 + .../plugins/a11yhelp/dialogs/lang/pt.js | 12 + .../plugins/a11yhelp/dialogs/lang/ro.js | 12 + .../plugins/a11yhelp/dialogs/lang/ru.js | 11 + .../plugins/a11yhelp/dialogs/lang/si.js | 10 + .../plugins/a11yhelp/dialogs/lang/sk.js | 12 + .../plugins/a11yhelp/dialogs/lang/sl.js | 12 + .../plugins/a11yhelp/dialogs/lang/sq.js | 11 + .../plugins/a11yhelp/dialogs/lang/sr-latn.js | 11 + .../plugins/a11yhelp/dialogs/lang/sr.js | 11 + .../plugins/a11yhelp/dialogs/lang/sv.js | 12 + .../plugins/a11yhelp/dialogs/lang/th.js | 11 + .../plugins/a11yhelp/dialogs/lang/tr.js | 12 + .../plugins/a11yhelp/dialogs/lang/tt.js | 11 + .../plugins/a11yhelp/dialogs/lang/ug.js | 11 + .../plugins/a11yhelp/dialogs/lang/uk.js | 12 + .../plugins/a11yhelp/dialogs/lang/vi.js | 11 + .../plugins/a11yhelp/dialogs/lang/zh-cn.js | 9 + .../plugins/a11yhelp/dialogs/lang/zh.js | 9 + .../ckeditor/plugins/about/dialogs/about.js | 7 + .../about/dialogs/hidpi/logo_ckeditor.png | Bin 0 -> 13339 bytes .../plugins/about/dialogs/logo_ckeditor.png | Bin 0 -> 6757 bytes .../ckeditor/plugins/autogrow/plugin.js | 209 + .../plugins/autogrow/samples/autogrow.html | 99 + .../plugins/clipboard/dialogs/paste.js | 11 + .../codesnippet/dialogs/codesnippet.js | 83 + .../plugins/codesnippet/icons/codesnippet.png | Bin 0 -> 597 bytes .../codesnippet/icons/hidpi/codesnippet.png | Bin 0 -> 1887 bytes .../ckeditor/plugins/codesnippet/lang/bg.js | 13 + .../ckeditor/plugins/codesnippet/lang/ca.js | 13 + .../ckeditor/plugins/codesnippet/lang/cs.js | 13 + .../ckeditor/plugins/codesnippet/lang/da.js | 13 + .../ckeditor/plugins/codesnippet/lang/de.js | 13 + .../ckeditor/plugins/codesnippet/lang/el.js | 13 + .../plugins/codesnippet/lang/en-gb.js | 13 + .../ckeditor/plugins/codesnippet/lang/en.js | 13 + .../ckeditor/plugins/codesnippet/lang/eo.js | 13 + .../ckeditor/plugins/codesnippet/lang/es.js | 13 + .../ckeditor/plugins/codesnippet/lang/et.js | 13 + .../ckeditor/plugins/codesnippet/lang/fa.js | 13 + .../ckeditor/plugins/codesnippet/lang/fi.js | 13 + .../plugins/codesnippet/lang/fr-ca.js | 13 + .../ckeditor/plugins/codesnippet/lang/fr.js | 13 + .../ckeditor/plugins/codesnippet/lang/he.js | 13 + .../ckeditor/plugins/codesnippet/lang/hr.js | 13 + .../ckeditor/plugins/codesnippet/lang/hu.js | 13 + .../ckeditor/plugins/codesnippet/lang/it.js | 13 + .../ckeditor/plugins/codesnippet/lang/ja.js | 13 + .../ckeditor/plugins/codesnippet/lang/km.js | 13 + .../ckeditor/plugins/codesnippet/lang/ku.js | 13 + .../ckeditor/plugins/codesnippet/lang/lt.js | 13 + .../ckeditor/plugins/codesnippet/lang/lv.js | 13 + .../ckeditor/plugins/codesnippet/lang/nb.js | 13 + .../ckeditor/plugins/codesnippet/lang/nl.js | 13 + .../ckeditor/plugins/codesnippet/lang/no.js | 13 + .../ckeditor/plugins/codesnippet/lang/pl.js | 13 + .../plugins/codesnippet/lang/pt-br.js | 13 + .../ckeditor/plugins/codesnippet/lang/pt.js | 13 + .../ckeditor/plugins/codesnippet/lang/ro.js | 13 + .../ckeditor/plugins/codesnippet/lang/ru.js | 13 + .../ckeditor/plugins/codesnippet/lang/sk.js | 13 + .../ckeditor/plugins/codesnippet/lang/sl.js | 13 + .../ckeditor/plugins/codesnippet/lang/sq.js | 13 + .../ckeditor/plugins/codesnippet/lang/sv.js | 13 + .../ckeditor/plugins/codesnippet/lang/th.js | 13 + .../ckeditor/plugins/codesnippet/lang/tr.js | 13 + .../ckeditor/plugins/codesnippet/lang/tt.js | 13 + .../ckeditor/plugins/codesnippet/lang/ug.js | 13 + .../ckeditor/plugins/codesnippet/lang/uk.js | 13 + .../ckeditor/plugins/codesnippet/lang/vi.js | 13 + .../plugins/codesnippet/lang/zh-cn.js | 13 + .../ckeditor/plugins/codesnippet/lang/zh.js | 13 + .../codesnippet/lib/highlight/CHANGES.md | 827 + .../plugins/codesnippet/lib/highlight/LICENSE | 24 + .../codesnippet/lib/highlight/README.md | 167 + .../codesnippet/lib/highlight/README.ru.md | 171 + .../lib/highlight/highlight.pack.js | 2 + .../codesnippet/lib/highlight/styles/arta.css | 160 + .../lib/highlight/styles/ascetic.css | 50 + .../highlight/styles/atelier-dune.dark.css | 93 + .../highlight/styles/atelier-dune.light.css | 93 + .../highlight/styles/atelier-forest.dark.css | 93 + .../highlight/styles/atelier-forest.light.css | 93 + .../highlight/styles/atelier-heath.dark.css | 93 + .../highlight/styles/atelier-heath.light.css | 93 + .../styles/atelier-lakeside.dark.css | 93 + .../styles/atelier-lakeside.light.css | 93 + .../highlight/styles/atelier-seaside.dark.css | 93 + .../styles/atelier-seaside.light.css | 93 + .../lib/highlight/styles/brown_paper.css | 105 + .../lib/highlight/styles/brown_papersq.png | Bin 0 -> 18198 bytes .../codesnippet/lib/highlight/styles/dark.css | 105 + .../lib/highlight/styles/default.css | 153 + .../lib/highlight/styles/docco.css | 132 + .../codesnippet/lib/highlight/styles/far.css | 113 + .../lib/highlight/styles/foundation.css | 133 + .../lib/highlight/styles/github.css | 125 + .../lib/highlight/styles/googlecode.css | 147 + .../codesnippet/lib/highlight/styles/idea.css | 122 + .../lib/highlight/styles/ir_black.css | 105 + .../lib/highlight/styles/magula.css | 123 + .../lib/highlight/styles/mono-blue.css | 62 + .../lib/highlight/styles/monokai.css | 127 + .../lib/highlight/styles/monokai_sublime.css | 149 + .../lib/highlight/styles/obsidian.css | 154 + .../lib/highlight/styles/paraiso.dark.css | 93 + .../lib/highlight/styles/paraiso.light.css | 93 + .../lib/highlight/styles/pojoaque.css | 106 + .../lib/highlight/styles/pojoaque.jpg | Bin 0 -> 1186 bytes .../lib/highlight/styles/railscasts.css | 182 + .../lib/highlight/styles/rainbow.css | 112 + .../lib/highlight/styles/school_book.css | 113 + .../lib/highlight/styles/school_book.png | Bin 0 -> 486 bytes .../lib/highlight/styles/solarized_dark.css | 107 + .../lib/highlight/styles/solarized_light.css | 107 + .../lib/highlight/styles/sunburst.css | 160 + .../highlight/styles/tomorrow-night-blue.css | 93 + .../styles/tomorrow-night-bright.css | 92 + .../styles/tomorrow-night-eighties.css | 92 + .../lib/highlight/styles/tomorrow-night.css | 93 + .../lib/highlight/styles/tomorrow.css | 90 + .../codesnippet/lib/highlight/styles/vs.css | 89 + .../lib/highlight/styles/xcode.css | 158 + .../lib/highlight/styles/zenburn.css | 117 + .../ckeditor/plugins/codesnippet/plugin.js | 474 + .../codesnippet/samples/codesnippet.html | 236 + .../colordialog/dialogs/colordialog.js | 13 + .../devtools/lang/_translationstatus.txt | 27 + .../ckeditor/plugins/devtools/lang/ar.js | 12 + .../ckeditor/plugins/devtools/lang/bg.js | 12 + .../ckeditor/plugins/devtools/lang/ca.js | 12 + .../ckeditor/plugins/devtools/lang/cs.js | 12 + .../ckeditor/plugins/devtools/lang/cy.js | 12 + .../ckeditor/plugins/devtools/lang/da.js | 12 + .../ckeditor/plugins/devtools/lang/de.js | 12 + .../ckeditor/plugins/devtools/lang/el.js | 12 + .../ckeditor/plugins/devtools/lang/en-gb.js | 12 + .../ckeditor/plugins/devtools/lang/en.js | 12 + .../ckeditor/plugins/devtools/lang/eo.js | 12 + .../ckeditor/plugins/devtools/lang/es.js | 12 + .../ckeditor/plugins/devtools/lang/et.js | 12 + .../ckeditor/plugins/devtools/lang/eu.js | 12 + .../ckeditor/plugins/devtools/lang/fa.js | 12 + .../ckeditor/plugins/devtools/lang/fi.js | 12 + .../ckeditor/plugins/devtools/lang/fr-ca.js | 12 + .../ckeditor/plugins/devtools/lang/fr.js | 12 + .../ckeditor/plugins/devtools/lang/gl.js | 12 + .../ckeditor/plugins/devtools/lang/gu.js | 12 + .../ckeditor/plugins/devtools/lang/he.js | 12 + .../ckeditor/plugins/devtools/lang/hr.js | 12 + .../ckeditor/plugins/devtools/lang/hu.js | 12 + .../ckeditor/plugins/devtools/lang/id.js | 12 + .../ckeditor/plugins/devtools/lang/it.js | 12 + .../ckeditor/plugins/devtools/lang/ja.js | 12 + .../ckeditor/plugins/devtools/lang/km.js | 12 + .../ckeditor/plugins/devtools/lang/ko.js | 12 + .../ckeditor/plugins/devtools/lang/ku.js | 12 + .../ckeditor/plugins/devtools/lang/lt.js | 12 + .../ckeditor/plugins/devtools/lang/lv.js | 12 + .../ckeditor/plugins/devtools/lang/nb.js | 12 + .../ckeditor/plugins/devtools/lang/nl.js | 12 + .../ckeditor/plugins/devtools/lang/no.js | 12 + .../ckeditor/plugins/devtools/lang/pl.js | 12 + .../ckeditor/plugins/devtools/lang/pt-br.js | 12 + .../ckeditor/plugins/devtools/lang/pt.js | 12 + .../ckeditor/plugins/devtools/lang/ru.js | 12 + .../ckeditor/plugins/devtools/lang/si.js | 12 + .../ckeditor/plugins/devtools/lang/sk.js | 12 + .../ckeditor/plugins/devtools/lang/sl.js | 12 + .../ckeditor/plugins/devtools/lang/sq.js | 12 + .../ckeditor/plugins/devtools/lang/sv.js | 12 + .../ckeditor/plugins/devtools/lang/tr.js | 12 + .../ckeditor/plugins/devtools/lang/tt.js | 12 + .../ckeditor/plugins/devtools/lang/ug.js | 12 + .../ckeditor/plugins/devtools/lang/uk.js | 12 + .../ckeditor/plugins/devtools/lang/vi.js | 12 + .../ckeditor/plugins/devtools/lang/zh-cn.js | 12 + .../ckeditor/plugins/devtools/lang/zh.js | 12 + .../ckeditor/plugins/devtools/plugin.js | 159 + .../plugins/devtools/samples/devtools.html | 83 + .../plugins/dialog/dialogDefinition.js | 4 + .../ckeditor/plugins/div/dialogs/div.js | 9 + .../ckeditor/plugins/find/dialogs/find.js | 24 + .../ckeditor/plugins/flash/dialogs/flash.js | 24 + .../plugins/flash/images/placeholder.png | Bin 0 -> 256 bytes .../ckeditor/plugins/forms/dialogs/button.js | 8 + .../plugins/forms/dialogs/checkbox.js | 8 + .../ckeditor/plugins/forms/dialogs/form.js | 8 + .../plugins/forms/dialogs/hiddenfield.js | 7 + .../ckeditor/plugins/forms/dialogs/radio.js | 8 + .../ckeditor/plugins/forms/dialogs/select.js | 20 + .../plugins/forms/dialogs/textarea.js | 8 + .../plugins/forms/dialogs/textfield.js | 10 + .../plugins/forms/images/hiddenfield.gif | Bin 0 -> 105 bytes .../plugins/hidecont/dialogs/hidecont.js | 56 + .../ckeditor/plugins/hidecont/hidden.png | Bin 0 -> 1025 bytes .../ckeditor/plugins/hidecont/plugin.js | 19 + static/assets/ckeditor/plugins/icons.png | Bin 0 -> 20833 bytes .../assets/ckeditor/plugins/icons_hidpi.png | Bin 0 -> 67753 bytes .../ckeditor/plugins/iframe/dialogs/iframe.js | 10 + .../plugins/iframe/images/placeholder.png | Bin 0 -> 265 bytes .../ckeditor/plugins/image/dialogs/image.js | 43 + .../ckeditor/plugins/image/images/noimage.png | Bin 0 -> 2115 bytes .../ckeditor/plugins/lineutils/dev/dnd.html | 172 + .../plugins/lineutils/dev/magicfinger.html | 285 + .../ckeditor/plugins/lineutils/plugin.js | 935 + .../ckeditor/plugins/link/dialogs/anchor.js | 7 + .../ckeditor/plugins/link/dialogs/link.js | 26 + .../ckeditor/plugins/link/images/anchor.png | Bin 0 -> 589 bytes .../plugins/link/images/hidpi/anchor.png | Bin 0 -> 1379 bytes .../plugins/liststyle/dialogs/liststyle.js | 10 + .../magicline/images/hidpi/icon-rtl.png | Bin 0 -> 176 bytes .../plugins/magicline/images/hidpi/icon.png | Bin 0 -> 199 bytes .../plugins/magicline/images/icon-rtl.png | Bin 0 -> 138 bytes .../plugins/magicline/images/icon.png | Bin 0 -> 133 bytes .../plugins/pagebreak/images/pagebreak.gif | Bin 0 -> 54 bytes .../plugins/pastefromword/filter/default.js | 31 + .../ckeditor/plugins/preview/preview.html | 13 + .../assets/ckeditor/plugins/scayt/LICENSE.md | 28 + .../assets/ckeditor/plugins/scayt/README.md | 25 + .../ckeditor/plugins/scayt/dialogs/options.js | 17 + .../plugins/scayt/dialogs/toolbar.css | 71 + .../showblocks/images/block_address.png | Bin 0 -> 152 bytes .../showblocks/images/block_blockquote.png | Bin 0 -> 154 bytes .../plugins/showblocks/images/block_div.png | Bin 0 -> 127 bytes .../plugins/showblocks/images/block_h1.png | Bin 0 -> 120 bytes .../plugins/showblocks/images/block_h2.png | Bin 0 -> 127 bytes .../plugins/showblocks/images/block_h3.png | Bin 0 -> 123 bytes .../plugins/showblocks/images/block_h4.png | Bin 0 -> 123 bytes .../plugins/showblocks/images/block_h5.png | Bin 0 -> 126 bytes .../plugins/showblocks/images/block_h6.png | Bin 0 -> 123 bytes .../plugins/showblocks/images/block_p.png | Bin 0 -> 115 bytes .../plugins/showblocks/images/block_pre.png | Bin 0 -> 128 bytes .../ckeditor/plugins/smiley/dialogs/smiley.js | 10 + .../plugins/smiley/images/angel_smile.gif | Bin 0 -> 1245 bytes .../plugins/smiley/images/angel_smile.png | Bin 0 -> 1172 bytes .../plugins/smiley/images/angry_smile.gif | Bin 0 -> 1219 bytes .../plugins/smiley/images/angry_smile.png | Bin 0 -> 1220 bytes .../plugins/smiley/images/broken_heart.gif | Bin 0 -> 732 bytes .../plugins/smiley/images/broken_heart.png | Bin 0 -> 1139 bytes .../plugins/smiley/images/confused_smile.gif | Bin 0 -> 1202 bytes .../plugins/smiley/images/confused_smile.png | Bin 0 -> 1101 bytes .../plugins/smiley/images/cry_smile.gif | Bin 0 -> 795 bytes .../plugins/smiley/images/cry_smile.png | Bin 0 -> 1214 bytes .../plugins/smiley/images/devil_smile.gif | Bin 0 -> 1239 bytes .../plugins/smiley/images/devil_smile.png | Bin 0 -> 1220 bytes .../smiley/images/embaressed_smile.gif | Bin 0 -> 786 bytes .../smiley/images/embarrassed_smile.gif | Bin 0 -> 786 bytes .../smiley/images/embarrassed_smile.png | Bin 0 -> 1145 bytes .../plugins/smiley/images/envelope.gif | Bin 0 -> 506 bytes .../plugins/smiley/images/envelope.png | Bin 0 -> 760 bytes .../ckeditor/plugins/smiley/images/heart.gif | Bin 0 -> 692 bytes .../ckeditor/plugins/smiley/images/heart.png | Bin 0 -> 999 bytes .../ckeditor/plugins/smiley/images/kiss.gif | Bin 0 -> 683 bytes .../ckeditor/plugins/smiley/images/kiss.png | Bin 0 -> 1003 bytes .../plugins/smiley/images/lightbulb.gif | Bin 0 -> 660 bytes .../plugins/smiley/images/lightbulb.png | Bin 0 -> 919 bytes .../plugins/smiley/images/omg_smile.gif | Bin 0 -> 820 bytes .../plugins/smiley/images/omg_smile.png | Bin 0 -> 1122 bytes .../plugins/smiley/images/regular_smile.gif | Bin 0 -> 1209 bytes .../plugins/smiley/images/regular_smile.png | Bin 0 -> 1084 bytes .../plugins/smiley/images/sad_smile.gif | Bin 0 -> 782 bytes .../plugins/smiley/images/sad_smile.png | Bin 0 -> 1115 bytes .../plugins/smiley/images/shades_smile.gif | Bin 0 -> 1231 bytes .../plugins/smiley/images/shades_smile.png | Bin 0 -> 1204 bytes .../plugins/smiley/images/teeth_smile.gif | Bin 0 -> 1201 bytes .../plugins/smiley/images/teeth_smile.png | Bin 0 -> 1183 bytes .../plugins/smiley/images/thumbs_down.gif | Bin 0 -> 715 bytes .../plugins/smiley/images/thumbs_down.png | Bin 0 -> 985 bytes .../plugins/smiley/images/thumbs_up.gif | Bin 0 -> 714 bytes .../plugins/smiley/images/thumbs_up.png | Bin 0 -> 959 bytes .../plugins/smiley/images/tongue_smile.gif | Bin 0 -> 1210 bytes .../plugins/smiley/images/tongue_smile.png | Bin 0 -> 1132 bytes .../plugins/smiley/images/tounge_smile.gif | Bin 0 -> 1210 bytes .../images/whatchutalkingabout_smile.gif | Bin 0 -> 775 bytes .../images/whatchutalkingabout_smile.png | Bin 0 -> 1039 bytes .../plugins/smiley/images/wink_smile.gif | Bin 0 -> 1202 bytes .../plugins/smiley/images/wink_smile.png | Bin 0 -> 1114 bytes .../dialogs/lang/_translationstatus.txt | 20 + .../plugins/specialchar/dialogs/lang/af.js | 13 + .../plugins/specialchar/dialogs/lang/ar.js | 13 + .../plugins/specialchar/dialogs/lang/bg.js | 13 + .../plugins/specialchar/dialogs/lang/ca.js | 14 + .../plugins/specialchar/dialogs/lang/cs.js | 13 + .../plugins/specialchar/dialogs/lang/cy.js | 14 + .../plugins/specialchar/dialogs/lang/da.js | 13 + .../plugins/specialchar/dialogs/lang/de.js | 13 + .../plugins/specialchar/dialogs/lang/el.js | 13 + .../plugins/specialchar/dialogs/lang/en-gb.js | 13 + .../plugins/specialchar/dialogs/lang/en.js | 13 + .../plugins/specialchar/dialogs/lang/eo.js | 12 + .../plugins/specialchar/dialogs/lang/es.js | 13 + .../plugins/specialchar/dialogs/lang/et.js | 13 + .../plugins/specialchar/dialogs/lang/fa.js | 12 + .../plugins/specialchar/dialogs/lang/fi.js | 13 + .../plugins/specialchar/dialogs/lang/fr-ca.js | 10 + .../plugins/specialchar/dialogs/lang/fr.js | 11 + .../plugins/specialchar/dialogs/lang/gl.js | 13 + .../plugins/specialchar/dialogs/lang/he.js | 12 + .../plugins/specialchar/dialogs/lang/hr.js | 13 + .../plugins/specialchar/dialogs/lang/hu.js | 12 + .../plugins/specialchar/dialogs/lang/id.js | 13 + .../plugins/specialchar/dialogs/lang/it.js | 14 + .../plugins/specialchar/dialogs/lang/ja.js | 9 + .../plugins/specialchar/dialogs/lang/km.js | 13 + .../plugins/specialchar/dialogs/lang/ku.js | 13 + .../plugins/specialchar/dialogs/lang/lt.js | 13 + .../plugins/specialchar/dialogs/lang/lv.js | 13 + .../plugins/specialchar/dialogs/lang/nb.js | 11 + .../plugins/specialchar/dialogs/lang/nl.js | 13 + .../plugins/specialchar/dialogs/lang/no.js | 11 + .../plugins/specialchar/dialogs/lang/pl.js | 12 + .../plugins/specialchar/dialogs/lang/pt-br.js | 11 + .../plugins/specialchar/dialogs/lang/pt.js | 13 + .../plugins/specialchar/dialogs/lang/ru.js | 13 + .../plugins/specialchar/dialogs/lang/si.js | 13 + .../plugins/specialchar/dialogs/lang/sk.js | 13 + .../plugins/specialchar/dialogs/lang/sl.js | 12 + .../plugins/specialchar/dialogs/lang/sq.js | 13 + .../plugins/specialchar/dialogs/lang/sv.js | 11 + .../plugins/specialchar/dialogs/lang/th.js | 13 + .../plugins/specialchar/dialogs/lang/tr.js | 12 + .../plugins/specialchar/dialogs/lang/tt.js | 13 + .../plugins/specialchar/dialogs/lang/ug.js | 13 + .../plugins/specialchar/dialogs/lang/uk.js | 12 + .../plugins/specialchar/dialogs/lang/vi.js | 14 + .../plugins/specialchar/dialogs/lang/zh-cn.js | 9 + .../plugins/specialchar/dialogs/lang/zh.js | 12 + .../specialchar/dialogs/specialchar.js | 14 + .../ckeditor/plugins/table/dialogs/table.js | 21 + .../plugins/tabletools/dialogs/tableCell.js | 17 + .../plugins/templates/dialogs/templates.css | 84 + .../plugins/templates/dialogs/templates.js | 10 + .../plugins/templates/templates/default.js | 6 + .../templates/templates/images/template1.gif | Bin 0 -> 375 bytes .../templates/templates/images/template2.gif | Bin 0 -> 333 bytes .../templates/templates/images/template3.gif | Bin 0 -> 422 bytes .../plugins/widget/dev/assets/contents.css | 23 + .../plugins/widget/dev/assets/sample.jpg | Bin 0 -> 17932 bytes .../widget/dev/assets/simplebox/contents.css | 36 + .../dev/assets/simplebox/dialogs/simplebox.js | 51 + .../dev/assets/simplebox/icons/simplebox.png | Bin 0 -> 286 bytes .../widget/dev/assets/simplebox/plugin.js | 114 + .../ckeditor/plugins/widget/dev/console.js | 131 + .../plugins/widget/dev/nestedwidgets.html | 135 + .../plugins/widget/dev/widgetstyles.html | 145 + .../ckeditor/plugins/widget/images/handle.png | Bin 0 -> 220 bytes .../assets/ckeditor/plugins/widget/lang/af.js | 7 + .../assets/ckeditor/plugins/widget/lang/ar.js | 7 + .../assets/ckeditor/plugins/widget/lang/ca.js | 7 + .../assets/ckeditor/plugins/widget/lang/cs.js | 7 + .../assets/ckeditor/plugins/widget/lang/cy.js | 7 + .../assets/ckeditor/plugins/widget/lang/da.js | 7 + .../assets/ckeditor/plugins/widget/lang/de.js | 7 + .../assets/ckeditor/plugins/widget/lang/el.js | 7 + .../ckeditor/plugins/widget/lang/en-gb.js | 7 + .../assets/ckeditor/plugins/widget/lang/en.js | 7 + .../assets/ckeditor/plugins/widget/lang/eo.js | 7 + .../assets/ckeditor/plugins/widget/lang/es.js | 7 + .../assets/ckeditor/plugins/widget/lang/fa.js | 7 + .../assets/ckeditor/plugins/widget/lang/fi.js | 7 + .../assets/ckeditor/plugins/widget/lang/fr.js | 7 + .../assets/ckeditor/plugins/widget/lang/gl.js | 7 + .../assets/ckeditor/plugins/widget/lang/he.js | 7 + .../assets/ckeditor/plugins/widget/lang/hr.js | 7 + .../assets/ckeditor/plugins/widget/lang/hu.js | 7 + .../assets/ckeditor/plugins/widget/lang/it.js | 7 + .../assets/ckeditor/plugins/widget/lang/ja.js | 7 + .../assets/ckeditor/plugins/widget/lang/km.js | 7 + .../assets/ckeditor/plugins/widget/lang/ko.js | 7 + .../assets/ckeditor/plugins/widget/lang/ku.js | 7 + .../assets/ckeditor/plugins/widget/lang/nb.js | 7 + .../assets/ckeditor/plugins/widget/lang/nl.js | 7 + .../assets/ckeditor/plugins/widget/lang/no.js | 7 + .../assets/ckeditor/plugins/widget/lang/pl.js | 7 + .../ckeditor/plugins/widget/lang/pt-br.js | 7 + .../assets/ckeditor/plugins/widget/lang/pt.js | 7 + .../assets/ckeditor/plugins/widget/lang/ru.js | 7 + .../assets/ckeditor/plugins/widget/lang/sk.js | 7 + .../assets/ckeditor/plugins/widget/lang/sl.js | 7 + .../assets/ckeditor/plugins/widget/lang/sq.js | 7 + .../assets/ckeditor/plugins/widget/lang/sv.js | 7 + .../assets/ckeditor/plugins/widget/lang/tr.js | 7 + .../assets/ckeditor/plugins/widget/lang/tt.js | 7 + .../assets/ckeditor/plugins/widget/lang/uk.js | 7 + .../assets/ckeditor/plugins/widget/lang/vi.js | 7 + .../ckeditor/plugins/widget/lang/zh-cn.js | 7 + .../assets/ckeditor/plugins/widget/lang/zh.js | 7 + .../assets/ckeditor/plugins/widget/plugin.js | 3744 ++++ static/assets/ckeditor/plugins/wsc/LICENSE.md | 28 + static/assets/ckeditor/plugins/wsc/README.md | 25 + .../ckeditor/plugins/wsc/dialogs/ciframe.html | 66 + .../plugins/wsc/dialogs/tmpFrameset.html | 52 + .../ckeditor/plugins/wsc/dialogs/wsc.css | 82 + .../ckeditor/plugins/wsc/dialogs/wsc.js | 74 + .../ckeditor/plugins/wsc/dialogs/wsc_ie.js | 11 + .../ckeditor/skins/flat/dev/icons16.png | Bin 0 -> 29947 bytes .../ckeditor/skins/flat/dev/icons16.svg | 2374 ++ .../ckeditor/skins/flat/dev/icons32.png | Bin 0 -> 75488 bytes .../ckeditor/skins/flat/dev/icons32.svg | 2722 +++ .../ckeditor/skins/flat/dev/locations.json | 144 + static/assets/ckeditor/skins/flat/dialog.css | 5 + .../assets/ckeditor/skins/flat/dialog_ie.css | 5 + .../assets/ckeditor/skins/flat/dialog_ie7.css | 5 + .../assets/ckeditor/skins/flat/dialog_ie8.css | 5 + .../ckeditor/skins/flat/dialog_iequirks.css | 5 + static/assets/ckeditor/skins/flat/editor.css | 5 + .../ckeditor/skins/flat/editor_gecko.css | 5 + .../assets/ckeditor/skins/flat/editor_ie.css | 5 + .../assets/ckeditor/skins/flat/editor_ie7.css | 5 + .../assets/ckeditor/skins/flat/editor_ie8.css | 5 + .../ckeditor/skins/flat/editor_iequirks.css | 5 + .../ckeditor/skins/flat/images/arrow.png | Bin 0 -> 191 bytes .../ckeditor/skins/flat/images/close.png | Bin 0 -> 468 bytes .../skins/flat/images/hidpi/close.png | Bin 0 -> 1271 bytes .../skins/flat/images/hidpi/lock-open.png | Bin 0 -> 1329 bytes .../ckeditor/skins/flat/images/hidpi/lock.png | Bin 0 -> 1299 bytes .../skins/flat/images/hidpi/refresh.png | Bin 0 -> 1842 bytes .../ckeditor/skins/flat/images/lock-open.png | Bin 0 -> 349 bytes .../ckeditor/skins/flat/images/lock.png | Bin 0 -> 475 bytes .../ckeditor/skins/flat/images/refresh.png | Bin 0 -> 422 bytes static/assets/ckeditor/skins/flat/readme.md | 8 + static/assets/ckeditor/skins/flat/skin.js | 10 + static/assets/ckeditor/skins/moono/dialog.css | 5 + .../assets/ckeditor/skins/moono/dialog_ie.css | 5 + .../ckeditor/skins/moono/dialog_ie7.css | 5 + .../ckeditor/skins/moono/dialog_ie8.css | 5 + .../ckeditor/skins/moono/dialog_iequirks.css | 5 + static/assets/ckeditor/skins/moono/editor.css | 5 + .../ckeditor/skins/moono/editor_gecko.css | 5 + .../assets/ckeditor/skins/moono/editor_ie.css | 5 + .../ckeditor/skins/moono/editor_ie7.css | 5 + .../ckeditor/skins/moono/editor_ie8.css | 5 + .../ckeditor/skins/moono/editor_iequirks.css | 5 + static/assets/ckeditor/skins/moono/icons.png | Bin 0 -> 20833 bytes .../ckeditor/skins/moono/icons_hidpi.png | Bin 0 -> 67753 bytes .../ckeditor/skins/moono/images/arrow.png | Bin 0 -> 191 bytes .../ckeditor/skins/moono/images/close.png | Bin 0 -> 468 bytes .../skins/moono/images/hidpi/close.png | Bin 0 -> 1271 bytes .../skins/moono/images/hidpi/lock-open.png | Bin 0 -> 1329 bytes .../skins/moono/images/hidpi/lock.png | Bin 0 -> 1299 bytes .../skins/moono/images/hidpi/refresh.png | Bin 0 -> 1842 bytes .../ckeditor/skins/moono/images/lock-open.png | Bin 0 -> 349 bytes .../ckeditor/skins/moono/images/lock.png | Bin 0 -> 475 bytes .../ckeditor/skins/moono/images/refresh.png | Bin 0 -> 422 bytes static/assets/ckeditor/skins/moono/readme.md | 51 + static/assets/ckeditor/styles.js | 111 + static/assets/cropbox/css/style.css | 151 + static/assets/cropbox/images/avatar.png | Bin 0 -> 84746 bytes static/assets/cropbox/js/cropbox.js | 191 + static/assets/css/404.css | 158 + static/assets/css/admin.css | 325 + static/assets/css/amazeui.flat.min.css | 1 + static/assets/css/amazeui.min.css | 1 + static/assets/css/app.css | 173 + static/assets/css/none.css | 0 static/assets/fonts/FontAwesome.otf | Bin 0 -> 93888 bytes static/assets/fonts/captcha.ttf | Bin 0 -> 13948 bytes static/assets/fonts/fontawesome-webfont.eot | Bin 0 -> 60767 bytes static/assets/fonts/fontawesome-webfont.svg | 565 + static/assets/fonts/fontawesome-webfont.ttf | Bin 0 -> 122092 bytes static/assets/fonts/fontawesome-webfont.woff | Bin 0 -> 71508 bytes static/assets/fonts/fontawesome-webfont.woff2 | Bin 0 -> 56780 bytes static/assets/i/app-icon72x72@2x.png | Bin 0 -> 7215 bytes static/assets/i/bg1.png | Bin 0 -> 77595 bytes static/assets/i/error-img.png | Bin 0 -> 75577 bytes static/assets/i/examples/admin-chrome.png | Bin 0 -> 3594 bytes static/assets/i/examples/admin-firefox.png | Bin 0 -> 4030 bytes static/assets/i/examples/admin-ie.png | Bin 0 -> 3999 bytes static/assets/i/examples/admin-opera.png | Bin 0 -> 3749 bytes static/assets/i/examples/admin-safari.png | Bin 0 -> 4055 bytes static/assets/i/examples/adminPage.png | Bin 0 -> 2702 bytes static/assets/i/examples/blogPage.png | Bin 0 -> 2581 bytes static/assets/i/examples/landing.png | Bin 0 -> 4520 bytes static/assets/i/examples/landingPage.png | Bin 0 -> 2499 bytes static/assets/i/examples/loginPage.png | Bin 0 -> 2081 bytes static/assets/i/examples/sidebarPage.png | Bin 0 -> 2365 bytes static/assets/i/favicon.png | Bin 0 -> 1024 bytes static/assets/i/logo.png | Bin 0 -> 1353 bytes static/assets/i/logo.svg | 28 + .../i/logo\345\211\257\346\234\254.svg" | 28 + static/assets/i/startup-640x1096.png | Bin 0 -> 9599 bytes static/assets/js/admin.js | 31 + static/assets/js/amazeui.js | 17978 ++++++++++++++++ static/assets/js/amazeui.legacy.min.js | 4 + static/assets/js/amazeui.min.js | 8 + .../assets/js/amazeui.widgets.helper.min.js | 3 + static/assets/js/app.js | 77 + static/assets/js/editpost.js | 3 + static/assets/js/handlebars.min.js | 28 + static/assets/js/jquery-1.11.1.min.js | 4 + static/assets/js/jquery.min.js | 4 + static/assets/js/like.js | 12 + static/assets/js/message.js | 12 + static/assets/js/nologin.js | 49 + static/assets/js/polyfill/rem.min.js | 7 + static/assets/js/polyfill/respond.min.js | 6 + static/assets/js/post.js | 214 + static/assets/js/publish.js | 35 + static/assets/js/qrcode.min.js | 1 + static/face/5526726b2545d40b07ef2f46/180.png | Bin 0 -> 61432 bytes static/face/552aa1f12545d41125cc065b/180.png | Bin 0 -> 35462 bytes static/face/552b7b6f2545d411dcf3659f/180.png | Bin 0 -> 83429 bytes static/face/guest.png | Bin 0 -> 18378 bytes .../11/1f89a6bef047f6182659108e4108cb91.jpg | Bin 0 -> 5769 bytes .../11/236dbd41a8319235225a4420d4520545.jpg | Bin 0 -> 10416 bytes .../11/51a556bd68cc6e4412704c9ef2778393.png | Bin 0 -> 78437 bytes .../11/dd0206049852e28a22644b350a6afbe2.jpg | Bin 0 -> 3235 bytes .../11/fc1ceb425507a1e0ffedfa554b28c104.jpg | Bin 0 -> 16169 bytes .../12/d6834016ea9f4b0534a9637c31a1768d.png | Bin 0 -> 55812 bytes .../12/ed2c839afbb41e8a0bb0dbe98037984b.png | Bin 0 -> 12676 bytes .../13/058d22c8d7d7036ce8a7093532b625ae.jpeg | Bin 0 -> 97387 bytes .../13/46e22822b7cd24ead2855b3913270686.jpg | Bin 0 -> 8204 bytes .../13/74f8b4e9c2a9a9f33d5afeffd53f2f3f.jpg | Bin 0 -> 12305 bytes .../13/83fbc1ca1c8a256baedbd2e3ad45b5d7.jpg | Bin 0 -> 39738 bytes .../13/d52a81cf130b6c579ce0dbca2a7c2b9f.jpg | Bin 0 -> 39391 bytes .../14/5a219a6fbe82b880f5ecdce7a333023d.jpg | Bin 0 -> 12315 bytes .../14/e32ae3b23bf760aa697e0b62efc4dd3d.gif | Bin 0 -> 312446 bytes .../14/ec0a01dec9caa8860bcba0b04eced25a.jpg | Bin 0 -> 9195 bytes .../16/1c313af0bfbd2a37581e760608b6642a.jpg | Bin 0 -> 1071708 bytes .../18/94692ca57003b115d442b4b998f5c7d8.png | Bin 0 -> 219468 bytes .../20/b7782f6d14cd9a4d44da3b453dc26a2e.gif | Bin 0 -> 6226 bytes templates/404.htm | 38 + templates/admin.htm | 186 + templates/admin/base.htm | 54 + templates/admin/error.htm | 32 + templates/admin/index.htm | 60 + templates/admin/invite.htm | 91 + templates/admin/setting.htm | 116 + templates/admin/sidebar.htm | 26 + templates/admin/sort.htm | 51 + templates/admin/sortdetail.htm | 95 + templates/admin/userdetail.htm | 138 + templates/admin/userlist.htm | 61 + templates/base.htm | 37 + templates/bookmark.htm | 59 + templates/dashboard.htm | 124 + templates/edit.htm | 54 + templates/error.htm | 18 + templates/face.htm | 52 + templates/forgetpwd.htm | 55 + templates/header.htm | 54 + templates/like.htm | 58 + templates/login.htm | 64 + templates/main.htm | 58 + templates/message.htm | 67 + templates/msgdetail.htm | 40 + templates/open_list.htm | 53 + templates/open_post.htm | 139 + templates/post.htm | 209 + templates/profile.htm | 190 + templates/publish.htm | 60 + templates/register.htm | 82 + templates/renewpwd.htm | 45 + templates/search.htm | 47 + templates/self.htm | 16 + templates/sort.htm | 58 + templates/upload.htm | 27 + templates/user.htm | 81 + util/__init__.py | 0 util/captcha.orgin.py | 86 + util/captcha.py | 55 + util/error.py | 8 + util/flash.py | 26 + util/function.py | 150 + util/pxfilter.py | 200 + util/sendemail.py | 51 + 652 files changed, 50166 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 controller/__init__.py create mode 100644 controller/admin.py create mode 100644 controller/ajax.py create mode 100644 controller/auth.py create mode 100644 controller/base.py create mode 100644 controller/dashboard.py create mode 100644 controller/download.py create mode 100644 controller/main.py create mode 100644 controller/message.py create mode 100644 controller/open.py create mode 100644 controller/post.py create mode 100644 controller/publish.py create mode 100644 controller/search.py create mode 100644 controller/sort.py create mode 100644 controller/user.py create mode 100644 controller/welcome.py create mode 100644 download/.gitignore create mode 100644 extends/__init__.py create mode 100644 extends/torndsession/__init__.py create mode 100644 extends/torndsession/driver.py create mode 100644 extends/torndsession/filesession.py create mode 100644 extends/torndsession/memorysession.py create mode 100644 extends/torndsession/redissession.py create mode 100644 extends/torndsession/session.py create mode 100644 extends/torndsession/sessionhandler.py create mode 100644 extends/torndsession/test/TEST_DIRECTORY create mode 100755 main.py create mode 100644 model/__init__.py create mode 100644 model/article.py create mode 100644 model/base.py create mode 100644 model/sort.py create mode 100644 model/user.py create mode 100644 requirements.txt create mode 100755 static/assets/ZeroClipboard/ZeroClipboard.min.js create mode 100755 static/assets/ZeroClipboard/ZeroClipboard.min.map create mode 100755 static/assets/ZeroClipboard/ZeroClipboard.swf create mode 100644 static/assets/ckeditor/build-config.js create mode 100644 static/assets/ckeditor/ckeditor.js create mode 100644 static/assets/ckeditor/config.js create mode 100644 static/assets/ckeditor/contents.css create mode 100644 static/assets/ckeditor/lang/en.js create mode 100644 static/assets/ckeditor/lang/zh-cn.js create mode 100644 static/assets/ckeditor/lang/zh.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/_translationstatus.txt create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/af.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/ar.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/bg.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/ca.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/cs.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/cy.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/da.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/de.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/el.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/en-gb.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/en.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/eo.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/es.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/et.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/fa.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/fi.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/fr-ca.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/fr.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/gl.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/gu.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/he.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/hi.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/hr.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/hu.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/id.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/it.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/ja.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/km.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/ko.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/ku.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/lt.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/lv.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/mk.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/mn.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/nb.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/nl.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/no.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/pl.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/pt-br.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/pt.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/ro.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/ru.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/si.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/sk.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/sl.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/sq.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/sr-latn.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/sr.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/sv.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/th.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/tr.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/tt.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/ug.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/uk.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/vi.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js create mode 100644 static/assets/ckeditor/plugins/a11yhelp/dialogs/lang/zh.js create mode 100644 static/assets/ckeditor/plugins/about/dialogs/about.js create mode 100644 static/assets/ckeditor/plugins/about/dialogs/hidpi/logo_ckeditor.png create mode 100644 static/assets/ckeditor/plugins/about/dialogs/logo_ckeditor.png create mode 100644 static/assets/ckeditor/plugins/autogrow/plugin.js create mode 100644 static/assets/ckeditor/plugins/autogrow/samples/autogrow.html create mode 100644 static/assets/ckeditor/plugins/clipboard/dialogs/paste.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/dialogs/codesnippet.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/icons/codesnippet.png create mode 100644 static/assets/ckeditor/plugins/codesnippet/icons/hidpi/codesnippet.png create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/bg.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/ca.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/cs.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/da.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/de.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/el.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/en-gb.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/en.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/eo.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/es.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/et.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/fa.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/fi.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/fr-ca.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/fr.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/he.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/hr.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/hu.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/it.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/ja.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/km.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/ku.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/lt.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/lv.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/nb.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/nl.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/no.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/pl.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/pt-br.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/pt.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/ro.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/ru.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/sk.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/sl.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/sq.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/sv.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/th.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/tr.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/tt.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/ug.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/uk.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/vi.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/zh-cn.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lang/zh.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/CHANGES.md create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/LICENSE create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/README.md create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/README.ru.md create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/highlight.pack.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/arta.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/ascetic.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-dune.dark.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-dune.light.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-forest.dark.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-forest.light.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-heath.dark.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-heath.light.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-lakeside.dark.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-lakeside.light.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-seaside.dark.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-seaside.light.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/brown_paper.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/brown_papersq.png create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/dark.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/default.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/docco.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/far.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/foundation.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/github.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/googlecode.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/idea.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/ir_black.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/magula.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/mono-blue.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/monokai.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/monokai_sublime.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/obsidian.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/paraiso.dark.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/paraiso.light.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/pojoaque.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/pojoaque.jpg create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/railscasts.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/rainbow.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/school_book.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/school_book.png create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/solarized_dark.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/solarized_light.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/sunburst.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-blue.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-bright.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-eighties.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/vs.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/xcode.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/zenburn.css create mode 100644 static/assets/ckeditor/plugins/codesnippet/plugin.js create mode 100644 static/assets/ckeditor/plugins/codesnippet/samples/codesnippet.html create mode 100644 static/assets/ckeditor/plugins/colordialog/dialogs/colordialog.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/_translationstatus.txt create mode 100644 static/assets/ckeditor/plugins/devtools/lang/ar.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/bg.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/ca.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/cs.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/cy.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/da.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/de.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/el.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/en-gb.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/en.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/eo.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/es.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/et.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/eu.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/fa.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/fi.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/fr-ca.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/fr.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/gl.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/gu.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/he.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/hr.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/hu.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/id.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/it.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/ja.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/km.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/ko.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/ku.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/lt.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/lv.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/nb.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/nl.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/no.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/pl.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/pt-br.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/pt.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/ru.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/si.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/sk.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/sl.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/sq.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/sv.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/tr.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/tt.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/ug.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/uk.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/vi.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/zh-cn.js create mode 100644 static/assets/ckeditor/plugins/devtools/lang/zh.js create mode 100644 static/assets/ckeditor/plugins/devtools/plugin.js create mode 100644 static/assets/ckeditor/plugins/devtools/samples/devtools.html create mode 100644 static/assets/ckeditor/plugins/dialog/dialogDefinition.js create mode 100644 static/assets/ckeditor/plugins/div/dialogs/div.js create mode 100644 static/assets/ckeditor/plugins/find/dialogs/find.js create mode 100644 static/assets/ckeditor/plugins/flash/dialogs/flash.js create mode 100644 static/assets/ckeditor/plugins/flash/images/placeholder.png create mode 100644 static/assets/ckeditor/plugins/forms/dialogs/button.js create mode 100644 static/assets/ckeditor/plugins/forms/dialogs/checkbox.js create mode 100644 static/assets/ckeditor/plugins/forms/dialogs/form.js create mode 100644 static/assets/ckeditor/plugins/forms/dialogs/hiddenfield.js create mode 100644 static/assets/ckeditor/plugins/forms/dialogs/radio.js create mode 100644 static/assets/ckeditor/plugins/forms/dialogs/select.js create mode 100644 static/assets/ckeditor/plugins/forms/dialogs/textarea.js create mode 100644 static/assets/ckeditor/plugins/forms/dialogs/textfield.js create mode 100644 static/assets/ckeditor/plugins/forms/images/hiddenfield.gif create mode 100644 static/assets/ckeditor/plugins/hidecont/dialogs/hidecont.js create mode 100644 static/assets/ckeditor/plugins/hidecont/hidden.png create mode 100644 static/assets/ckeditor/plugins/hidecont/plugin.js create mode 100644 static/assets/ckeditor/plugins/icons.png create mode 100644 static/assets/ckeditor/plugins/icons_hidpi.png create mode 100644 static/assets/ckeditor/plugins/iframe/dialogs/iframe.js create mode 100644 static/assets/ckeditor/plugins/iframe/images/placeholder.png create mode 100644 static/assets/ckeditor/plugins/image/dialogs/image.js create mode 100644 static/assets/ckeditor/plugins/image/images/noimage.png create mode 100644 static/assets/ckeditor/plugins/lineutils/dev/dnd.html create mode 100644 static/assets/ckeditor/plugins/lineutils/dev/magicfinger.html create mode 100644 static/assets/ckeditor/plugins/lineutils/plugin.js create mode 100644 static/assets/ckeditor/plugins/link/dialogs/anchor.js create mode 100644 static/assets/ckeditor/plugins/link/dialogs/link.js create mode 100644 static/assets/ckeditor/plugins/link/images/anchor.png create mode 100644 static/assets/ckeditor/plugins/link/images/hidpi/anchor.png create mode 100644 static/assets/ckeditor/plugins/liststyle/dialogs/liststyle.js create mode 100644 static/assets/ckeditor/plugins/magicline/images/hidpi/icon-rtl.png create mode 100644 static/assets/ckeditor/plugins/magicline/images/hidpi/icon.png create mode 100644 static/assets/ckeditor/plugins/magicline/images/icon-rtl.png create mode 100644 static/assets/ckeditor/plugins/magicline/images/icon.png create mode 100644 static/assets/ckeditor/plugins/pagebreak/images/pagebreak.gif create mode 100644 static/assets/ckeditor/plugins/pastefromword/filter/default.js create mode 100644 static/assets/ckeditor/plugins/preview/preview.html create mode 100644 static/assets/ckeditor/plugins/scayt/LICENSE.md create mode 100644 static/assets/ckeditor/plugins/scayt/README.md create mode 100644 static/assets/ckeditor/plugins/scayt/dialogs/options.js create mode 100644 static/assets/ckeditor/plugins/scayt/dialogs/toolbar.css create mode 100644 static/assets/ckeditor/plugins/showblocks/images/block_address.png create mode 100644 static/assets/ckeditor/plugins/showblocks/images/block_blockquote.png create mode 100644 static/assets/ckeditor/plugins/showblocks/images/block_div.png create mode 100644 static/assets/ckeditor/plugins/showblocks/images/block_h1.png create mode 100644 static/assets/ckeditor/plugins/showblocks/images/block_h2.png create mode 100644 static/assets/ckeditor/plugins/showblocks/images/block_h3.png create mode 100644 static/assets/ckeditor/plugins/showblocks/images/block_h4.png create mode 100644 static/assets/ckeditor/plugins/showblocks/images/block_h5.png create mode 100644 static/assets/ckeditor/plugins/showblocks/images/block_h6.png create mode 100644 static/assets/ckeditor/plugins/showblocks/images/block_p.png create mode 100644 static/assets/ckeditor/plugins/showblocks/images/block_pre.png create mode 100644 static/assets/ckeditor/plugins/smiley/dialogs/smiley.js create mode 100644 static/assets/ckeditor/plugins/smiley/images/angel_smile.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/angel_smile.png create mode 100644 static/assets/ckeditor/plugins/smiley/images/angry_smile.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/angry_smile.png create mode 100644 static/assets/ckeditor/plugins/smiley/images/broken_heart.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/broken_heart.png create mode 100644 static/assets/ckeditor/plugins/smiley/images/confused_smile.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/confused_smile.png create mode 100644 static/assets/ckeditor/plugins/smiley/images/cry_smile.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/cry_smile.png create mode 100644 static/assets/ckeditor/plugins/smiley/images/devil_smile.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/devil_smile.png create mode 100644 static/assets/ckeditor/plugins/smiley/images/embaressed_smile.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/embarrassed_smile.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/embarrassed_smile.png create mode 100644 static/assets/ckeditor/plugins/smiley/images/envelope.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/envelope.png create mode 100644 static/assets/ckeditor/plugins/smiley/images/heart.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/heart.png create mode 100644 static/assets/ckeditor/plugins/smiley/images/kiss.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/kiss.png create mode 100644 static/assets/ckeditor/plugins/smiley/images/lightbulb.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/lightbulb.png create mode 100644 static/assets/ckeditor/plugins/smiley/images/omg_smile.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/omg_smile.png create mode 100644 static/assets/ckeditor/plugins/smiley/images/regular_smile.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/regular_smile.png create mode 100644 static/assets/ckeditor/plugins/smiley/images/sad_smile.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/sad_smile.png create mode 100644 static/assets/ckeditor/plugins/smiley/images/shades_smile.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/shades_smile.png create mode 100644 static/assets/ckeditor/plugins/smiley/images/teeth_smile.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/teeth_smile.png create mode 100644 static/assets/ckeditor/plugins/smiley/images/thumbs_down.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/thumbs_down.png create mode 100644 static/assets/ckeditor/plugins/smiley/images/thumbs_up.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/thumbs_up.png create mode 100644 static/assets/ckeditor/plugins/smiley/images/tongue_smile.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/tongue_smile.png create mode 100644 static/assets/ckeditor/plugins/smiley/images/tounge_smile.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.png create mode 100644 static/assets/ckeditor/plugins/smiley/images/wink_smile.gif create mode 100644 static/assets/ckeditor/plugins/smiley/images/wink_smile.png create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/af.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/ar.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/bg.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/ca.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/cs.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/cy.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/da.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/de.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/el.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/en-gb.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/en.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/eo.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/es.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/et.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/fa.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/fi.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/fr.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/gl.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/he.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/hr.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/hu.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/id.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/it.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/ja.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/km.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/ku.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/lt.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/lv.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/nb.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/nl.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/no.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/pl.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/pt.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/ru.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/si.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/sk.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/sl.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/sq.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/sv.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/th.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/tr.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/tt.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/ug.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/uk.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/vi.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/lang/zh.js create mode 100644 static/assets/ckeditor/plugins/specialchar/dialogs/specialchar.js create mode 100644 static/assets/ckeditor/plugins/table/dialogs/table.js create mode 100644 static/assets/ckeditor/plugins/tabletools/dialogs/tableCell.js create mode 100644 static/assets/ckeditor/plugins/templates/dialogs/templates.css create mode 100644 static/assets/ckeditor/plugins/templates/dialogs/templates.js create mode 100644 static/assets/ckeditor/plugins/templates/templates/default.js create mode 100644 static/assets/ckeditor/plugins/templates/templates/images/template1.gif create mode 100644 static/assets/ckeditor/plugins/templates/templates/images/template2.gif create mode 100644 static/assets/ckeditor/plugins/templates/templates/images/template3.gif create mode 100644 static/assets/ckeditor/plugins/widget/dev/assets/contents.css create mode 100644 static/assets/ckeditor/plugins/widget/dev/assets/sample.jpg create mode 100644 static/assets/ckeditor/plugins/widget/dev/assets/simplebox/contents.css create mode 100644 static/assets/ckeditor/plugins/widget/dev/assets/simplebox/dialogs/simplebox.js create mode 100644 static/assets/ckeditor/plugins/widget/dev/assets/simplebox/icons/simplebox.png create mode 100644 static/assets/ckeditor/plugins/widget/dev/assets/simplebox/plugin.js create mode 100644 static/assets/ckeditor/plugins/widget/dev/console.js create mode 100644 static/assets/ckeditor/plugins/widget/dev/nestedwidgets.html create mode 100644 static/assets/ckeditor/plugins/widget/dev/widgetstyles.html create mode 100644 static/assets/ckeditor/plugins/widget/images/handle.png create mode 100644 static/assets/ckeditor/plugins/widget/lang/af.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/ar.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/ca.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/cs.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/cy.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/da.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/de.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/el.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/en-gb.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/en.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/eo.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/es.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/fa.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/fi.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/fr.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/gl.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/he.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/hr.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/hu.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/it.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/ja.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/km.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/ko.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/ku.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/nb.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/nl.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/no.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/pl.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/pt-br.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/pt.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/ru.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/sk.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/sl.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/sq.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/sv.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/tr.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/tt.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/uk.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/vi.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/zh-cn.js create mode 100644 static/assets/ckeditor/plugins/widget/lang/zh.js create mode 100644 static/assets/ckeditor/plugins/widget/plugin.js create mode 100644 static/assets/ckeditor/plugins/wsc/LICENSE.md create mode 100644 static/assets/ckeditor/plugins/wsc/README.md create mode 100644 static/assets/ckeditor/plugins/wsc/dialogs/ciframe.html create mode 100644 static/assets/ckeditor/plugins/wsc/dialogs/tmpFrameset.html create mode 100644 static/assets/ckeditor/plugins/wsc/dialogs/wsc.css create mode 100644 static/assets/ckeditor/plugins/wsc/dialogs/wsc.js create mode 100644 static/assets/ckeditor/plugins/wsc/dialogs/wsc_ie.js create mode 100755 static/assets/ckeditor/skins/flat/dev/icons16.png create mode 100755 static/assets/ckeditor/skins/flat/dev/icons16.svg create mode 100755 static/assets/ckeditor/skins/flat/dev/icons32.png create mode 100755 static/assets/ckeditor/skins/flat/dev/icons32.svg create mode 100755 static/assets/ckeditor/skins/flat/dev/locations.json create mode 100755 static/assets/ckeditor/skins/flat/dialog.css create mode 100755 static/assets/ckeditor/skins/flat/dialog_ie.css create mode 100755 static/assets/ckeditor/skins/flat/dialog_ie7.css create mode 100755 static/assets/ckeditor/skins/flat/dialog_ie8.css create mode 100755 static/assets/ckeditor/skins/flat/dialog_iequirks.css create mode 100755 static/assets/ckeditor/skins/flat/editor.css create mode 100755 static/assets/ckeditor/skins/flat/editor_gecko.css create mode 100755 static/assets/ckeditor/skins/flat/editor_ie.css create mode 100755 static/assets/ckeditor/skins/flat/editor_ie7.css create mode 100755 static/assets/ckeditor/skins/flat/editor_ie8.css create mode 100755 static/assets/ckeditor/skins/flat/editor_iequirks.css create mode 100755 static/assets/ckeditor/skins/flat/images/arrow.png create mode 100755 static/assets/ckeditor/skins/flat/images/close.png create mode 100755 static/assets/ckeditor/skins/flat/images/hidpi/close.png create mode 100755 static/assets/ckeditor/skins/flat/images/hidpi/lock-open.png create mode 100755 static/assets/ckeditor/skins/flat/images/hidpi/lock.png create mode 100755 static/assets/ckeditor/skins/flat/images/hidpi/refresh.png create mode 100755 static/assets/ckeditor/skins/flat/images/lock-open.png create mode 100755 static/assets/ckeditor/skins/flat/images/lock.png create mode 100755 static/assets/ckeditor/skins/flat/images/refresh.png create mode 100755 static/assets/ckeditor/skins/flat/readme.md create mode 100755 static/assets/ckeditor/skins/flat/skin.js create mode 100644 static/assets/ckeditor/skins/moono/dialog.css create mode 100644 static/assets/ckeditor/skins/moono/dialog_ie.css create mode 100644 static/assets/ckeditor/skins/moono/dialog_ie7.css create mode 100644 static/assets/ckeditor/skins/moono/dialog_ie8.css create mode 100644 static/assets/ckeditor/skins/moono/dialog_iequirks.css create mode 100644 static/assets/ckeditor/skins/moono/editor.css create mode 100644 static/assets/ckeditor/skins/moono/editor_gecko.css create mode 100644 static/assets/ckeditor/skins/moono/editor_ie.css create mode 100644 static/assets/ckeditor/skins/moono/editor_ie7.css create mode 100644 static/assets/ckeditor/skins/moono/editor_ie8.css create mode 100644 static/assets/ckeditor/skins/moono/editor_iequirks.css create mode 100644 static/assets/ckeditor/skins/moono/icons.png create mode 100644 static/assets/ckeditor/skins/moono/icons_hidpi.png create mode 100644 static/assets/ckeditor/skins/moono/images/arrow.png create mode 100644 static/assets/ckeditor/skins/moono/images/close.png create mode 100644 static/assets/ckeditor/skins/moono/images/hidpi/close.png create mode 100644 static/assets/ckeditor/skins/moono/images/hidpi/lock-open.png create mode 100644 static/assets/ckeditor/skins/moono/images/hidpi/lock.png create mode 100644 static/assets/ckeditor/skins/moono/images/hidpi/refresh.png create mode 100644 static/assets/ckeditor/skins/moono/images/lock-open.png create mode 100644 static/assets/ckeditor/skins/moono/images/lock.png create mode 100644 static/assets/ckeditor/skins/moono/images/refresh.png create mode 100644 static/assets/ckeditor/skins/moono/readme.md create mode 100644 static/assets/ckeditor/styles.js create mode 100755 static/assets/cropbox/css/style.css create mode 100755 static/assets/cropbox/images/avatar.png create mode 100755 static/assets/cropbox/js/cropbox.js create mode 100755 static/assets/css/404.css create mode 100644 static/assets/css/admin.css create mode 100644 static/assets/css/amazeui.flat.min.css create mode 100644 static/assets/css/amazeui.min.css create mode 100644 static/assets/css/app.css create mode 100644 static/assets/css/none.css create mode 100644 static/assets/fonts/FontAwesome.otf create mode 100644 static/assets/fonts/captcha.ttf create mode 100644 static/assets/fonts/fontawesome-webfont.eot create mode 100644 static/assets/fonts/fontawesome-webfont.svg create mode 100644 static/assets/fonts/fontawesome-webfont.ttf create mode 100644 static/assets/fonts/fontawesome-webfont.woff create mode 100644 static/assets/fonts/fontawesome-webfont.woff2 create mode 100644 static/assets/i/app-icon72x72@2x.png create mode 100755 static/assets/i/bg1.png create mode 100755 static/assets/i/error-img.png create mode 100644 static/assets/i/examples/admin-chrome.png create mode 100644 static/assets/i/examples/admin-firefox.png create mode 100644 static/assets/i/examples/admin-ie.png create mode 100644 static/assets/i/examples/admin-opera.png create mode 100644 static/assets/i/examples/admin-safari.png create mode 100644 static/assets/i/examples/adminPage.png create mode 100644 static/assets/i/examples/blogPage.png create mode 100644 static/assets/i/examples/landing.png create mode 100644 static/assets/i/examples/landingPage.png create mode 100644 static/assets/i/examples/loginPage.png create mode 100644 static/assets/i/examples/sidebarPage.png create mode 100644 static/assets/i/favicon.png create mode 100644 static/assets/i/logo.png create mode 100644 static/assets/i/logo.svg create mode 100644 "static/assets/i/logo\345\211\257\346\234\254.svg" create mode 100644 static/assets/i/startup-640x1096.png create mode 100644 static/assets/js/admin.js create mode 100755 static/assets/js/amazeui.js create mode 100755 static/assets/js/amazeui.legacy.min.js create mode 100755 static/assets/js/amazeui.min.js create mode 100755 static/assets/js/amazeui.widgets.helper.min.js create mode 100644 static/assets/js/app.js create mode 100644 static/assets/js/editpost.js create mode 100755 static/assets/js/handlebars.min.js create mode 100644 static/assets/js/jquery-1.11.1.min.js create mode 100755 static/assets/js/jquery.min.js create mode 100644 static/assets/js/like.js create mode 100644 static/assets/js/message.js create mode 100644 static/assets/js/nologin.js create mode 100755 static/assets/js/polyfill/rem.min.js create mode 100755 static/assets/js/polyfill/respond.min.js create mode 100644 static/assets/js/post.js create mode 100644 static/assets/js/publish.js create mode 100755 static/assets/js/qrcode.min.js create mode 100644 static/face/5526726b2545d40b07ef2f46/180.png create mode 100644 static/face/552aa1f12545d41125cc065b/180.png create mode 100644 static/face/552b7b6f2545d411dcf3659f/180.png create mode 100644 static/face/guest.png create mode 100644 static/upimg/201504/11/1f89a6bef047f6182659108e4108cb91.jpg create mode 100644 static/upimg/201504/11/236dbd41a8319235225a4420d4520545.jpg create mode 100644 static/upimg/201504/11/51a556bd68cc6e4412704c9ef2778393.png create mode 100644 static/upimg/201504/11/dd0206049852e28a22644b350a6afbe2.jpg create mode 100644 static/upimg/201504/11/fc1ceb425507a1e0ffedfa554b28c104.jpg create mode 100644 static/upimg/201504/12/d6834016ea9f4b0534a9637c31a1768d.png create mode 100644 static/upimg/201504/12/ed2c839afbb41e8a0bb0dbe98037984b.png create mode 100644 static/upimg/201504/13/058d22c8d7d7036ce8a7093532b625ae.jpeg create mode 100644 static/upimg/201504/13/46e22822b7cd24ead2855b3913270686.jpg create mode 100644 static/upimg/201504/13/74f8b4e9c2a9a9f33d5afeffd53f2f3f.jpg create mode 100644 static/upimg/201504/13/83fbc1ca1c8a256baedbd2e3ad45b5d7.jpg create mode 100644 static/upimg/201504/13/d52a81cf130b6c579ce0dbca2a7c2b9f.jpg create mode 100644 static/upimg/201504/14/5a219a6fbe82b880f5ecdce7a333023d.jpg create mode 100644 static/upimg/201504/14/e32ae3b23bf760aa697e0b62efc4dd3d.gif create mode 100644 static/upimg/201504/14/ec0a01dec9caa8860bcba0b04eced25a.jpg create mode 100644 static/upimg/201504/16/1c313af0bfbd2a37581e760608b6642a.jpg create mode 100644 static/upimg/201504/18/94692ca57003b115d442b4b998f5c7d8.png create mode 100644 static/upimg/201504/20/b7782f6d14cd9a4d44da3b453dc26a2e.gif create mode 100644 templates/404.htm create mode 100644 templates/admin.htm create mode 100644 templates/admin/base.htm create mode 100644 templates/admin/error.htm create mode 100644 templates/admin/index.htm create mode 100644 templates/admin/invite.htm create mode 100644 templates/admin/setting.htm create mode 100644 templates/admin/sidebar.htm create mode 100644 templates/admin/sort.htm create mode 100644 templates/admin/sortdetail.htm create mode 100644 templates/admin/userdetail.htm create mode 100644 templates/admin/userlist.htm create mode 100644 templates/base.htm create mode 100644 templates/bookmark.htm create mode 100644 templates/dashboard.htm create mode 100644 templates/edit.htm create mode 100644 templates/error.htm create mode 100644 templates/face.htm create mode 100644 templates/forgetpwd.htm create mode 100644 templates/header.htm create mode 100644 templates/like.htm create mode 100644 templates/login.htm create mode 100644 templates/main.htm create mode 100644 templates/message.htm create mode 100644 templates/msgdetail.htm create mode 100644 templates/open_list.htm create mode 100644 templates/open_post.htm create mode 100644 templates/post.htm create mode 100644 templates/profile.htm create mode 100644 templates/publish.htm create mode 100644 templates/register.htm create mode 100644 templates/renewpwd.htm create mode 100644 templates/search.htm create mode 100644 templates/self.htm create mode 100644 templates/sort.htm create mode 100644 templates/upload.htm create mode 100644 templates/user.htm create mode 100644 util/__init__.py create mode 100644 util/captcha.orgin.py create mode 100644 util/captcha.py create mode 100644 util/error.py create mode 100644 util/flash.py create mode 100644 util/function.py create mode 100644 util/pxfilter.py create mode 100644 util/sendemail.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c40b49a --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +*.DS_Store +.idea/* +*.py[cod] +*.yaml +*.so +*.egg +*.egg-info diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2e1b25e --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2015 phithon + +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. \ No newline at end of file diff --git a/controller/__init__.py b/controller/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/controller/admin.py b/controller/admin.py new file mode 100644 index 0000000..4ea4160 --- /dev/null +++ b/controller/admin.py @@ -0,0 +1,240 @@ +#coding=utf-8 +__author__ = 'phithon' +import tornado.web +from controller.base import BaseHandler +from tornado import gen +import time, pymongo, os, uuid +from bson.objectid import ObjectId +from util.function import random_str, hash, intval +from model.user import UserModel +from model.sort import SortModel + +class AdminHandler(BaseHandler): + def initialize(self): + super(AdminHandler, self).initialize() + self.topbar = "admin" + + def prepare(self): + super(AdminHandler, self).prepare() + if self.power != "admin": + self.redirect("/") + + def get(self, *args, **kwargs): + self.home_action(*args, **kwargs) + + def post(self, *args, **kwargs): + method = ("%s_action" % args[0]) if len(args) > 0 else "home_action" + if hasattr(self, method): + getattr(self, method)(*args, **kwargs) + else: + self.home_action(*args, **kwargs) + + @tornado.web.asynchronous + @gen.coroutine + def home_action(self, *args, **kwargs): + codes = [] + cursor = self.db.invite.find({ + "used": {"$eq": False}, + "time": {"$gt": (time.time() - self.settings["invite_expire"])} + }) + while (yield cursor.fetch_next): + codes.append(cursor.next_object()["code"]) + codes = "\n".join(codes) + self.render("admin.htm", flash = self.flash, codes = codes) + + @tornado.web.asynchronous + @gen.coroutine + def register_action(self, *args, **kwargs): + method = self.get_body_argument("method", default=None) + if method in ["open", "close", "invite"]: + config = self._read_config() + config["global"]["register"] = method + self._write_config(config) + self.flash["register"] = "设置成功" + else: + self.flash["register"] = "注册方法不正确" + self.redirect("/admin/") + + @tornado.web.asynchronous + @gen.coroutine + def invite_action(self, *args, **kwargs): + action = self.get_body_argument("action") + if action == "create": + code = random_str() + try: + yield self.db.invite.insert({ + "code": code, + "used": False, + "user": "", + "time": time.time() + }) + except pymongo.errors.DuplicateKeyError: + pass + self.redirect("/manage/invite") + elif action == "delete": + code = self.get_body_argument("code") + yield self.db.invite.remove({ + "code": code, + "used": False + }) + self.redirect("/manage/invite") + elif action == "expire": + yield self.db.invite.remove({ + "time": {"$lt": (time.time() - self.settings["invite_expire"])}, + "used": {"$eq": False} + }) + self.redirect("/manage/invite") + self.custom_error("方法错误,请重试") + + @tornado.web.asynchronous + @gen.coroutine + def article_action(self, *args, **kwargs): + method = self.get_body_argument("method", default="") + id = self.get_body_argument("id", default=None) + if method in ("star", "unstar"): + star = True if method == "star" else False + post = yield self.db.article.find_and_modify({ + "_id": ObjectId(id) + }, { + "$set": { + "star": star + } + }) + content = u"你的文章《%s》被管理员" % post["title"] + (u"加精" if star else u"取消精华") + u"了" + yield self.message(fromuser=None, touser=post["user"], content=content, + jump="/post/%s" % id) + elif method in ("open", "close"): + open = True if method == "open" else False + post = yield self.db.article.find_and_modify({ + "_id": ObjectId(id) + }, { + "$set": { + "open": open + } + }) + elif method == "del": + post = yield self.db.article.find_and_modify({ + "_id": ObjectId(id) + }, remove = True) + if not post: + self.custom_error("不存在这篇文章", jump="/") + yield self.db.member.update({ + }, { + "$pull": { + "bookmark": {"id": id} + } + }, multi = True) + yield self.message(fromuser=None, touser=post["user"], + content=u"你的文章《%s》被管理员删除了" % post["title"]) + self.redirect("/") + elif method == "rank": + rank = intval(self.get_body_argument("rank")) + post = yield self.db.article.find_one({ + "_id": ObjectId(id) + }) + if not post: + self.custom_error("不存在这篇文章") + if "rank" in post and post.get("rank") != 0: + self.custom_error("已经评分过啦") + if not (-10 <= rank <= 10): + self.custom_error("评分超出范围拉") + yield self.db.member.find_and_modify({ + "username": post["user"] + }, { + "$inc": {"money": rank} + }) + yield self.db.article.find_and_modify({ + "_id": ObjectId(id) + }, { + "$set": {"rank": rank} + }) + yield self.message(fromuser=None, touser=post["user"], + content=u"你的文章《%s》被管理员" % post["title"] + (u"奖励" if rank > 0 else u"扣除") + u"%d金币" % abs(rank), + jump="/post/%s" % id) + + self.redirect("/post/%s" % id) + + @tornado.web.asynchronous + @gen.coroutine + def delcomment_action(self, *args, **kwargs): + comid = self.get_body_argument("comid") + postid = self.get_body_argument("postid") + yield self.db.article.find_and_modify({ + "_id": ObjectId(postid), + }, {"$pull": { + "comment": { + "_id": {"$eq": ObjectId(comid)} + } + } + }) + self.redirect("/post/%s" % postid) + + @tornado.web.asynchronous + @gen.coroutine + def edituser_action(self, *args, **kwargs): + id = self.get_body_argument("id") + user = dict( + money = intval(self.get_body_argument("money")), + power = intval(self.get_body_argument("power")), + email = self.get_body_argument("email"), + website = self.get_body_argument("website"), + qq = self.get_body_argument("qq"), + address = self.get_body_argument("address"), + signal = self.get_body_argument("signal"), + ) + model = UserModel() + if not model(user): + self.custom_error(model.error_msg) + password = self.get_body_argument("password", default=None) + if password: + user["password"] = yield self.backend.submit(hash.get, password) + user = yield self.db.member.find_and_modify({ + "_id": ObjectId(id) + }, { + "$set": user + }) + self.redirect("/manage/userdetail/%s" % user['username']) + + @tornado.web.asynchronous + @gen.coroutine + def sort_action(self, *args, **kwargs): + id = self.get_body_argument("id") + sort = dict( + name = self.get_body_argument("name"), + intro = self.get_body_argument("intro",default=None), + show = True if intval(self.get_body_argument("show", default=None)) else False + ) + model = SortModel() + if not model(sort): + self.custom_error(model.error_msg) + sort = yield self.db.sort.find_and_modify({ + "_id": ObjectId(id) + }, { + "$set": sort + }) + if not sort: + self.custom_error("不存在这个板块") + else: + self.redirect("/manage/sortdetail/%s" % id) + + @tornado.web.asynchronous + @gen.coroutine + def setting_action(self, *args, **kwargs): + config = self._read_config() + config["global"]["site"] = dict( + webname = self.get_body_argument("webname"), + keyword = self.get_body_argument("keyword"), + description = self.get_body_argument("description") + ) + config["global"]["init_money"] = intval(self.get_body_argument("init_money")) + config["global"]["register"] = self.get_body_argument("register") + if config["global"]["register"] not in ("open", "invite", "close"): + self.custom_error("注册方法不正确") + captcha = self.get_body_arguments("captcha") + for d in ("register", "login", "comment"): + config["global"]["captcha"][d] = True if (d in captcha) else False + key = self.get_body_argument("key", default=None) + if key: + config["global"]["cookie_secret"] = key + self._write_config(config) + self.redirect("/manage/setting") diff --git a/controller/ajax.py b/controller/ajax.py new file mode 100644 index 0000000..9a16adb --- /dev/null +++ b/controller/ajax.py @@ -0,0 +1,155 @@ +#coding=utf-8 +__author__ = 'phithon' +import tornado.web, time +from controller.base import BaseHandler +from tornado import gen +from bson.objectid import ObjectId +from util.function import time_span, intval + +class AjaxHandler(BaseHandler): + def get(self, *args, **kwargs): + self.json("fail", "no action!") + + def post(self, *args, **kwargs): + action = "_%s_action" % args[0] + if hasattr(self, action): + getattr(self, action)() + else: + self.json("fail", "no action!") + + @tornado.web.asynchronous + @gen.coroutine + def _like_action(self): + id = self.get_body_argument("post") + post = yield self.db.article.find_one({ + "_id": ObjectId(id) + }) + if not post: + self.json("fail", "post id error") + self.__check_already(post) + post["like"].append(self.current_user["username"]) + yield self.db.article.find_and_modify({ + "_id": ObjectId(id) + }, { + "$set": {"like": post["like"]} + }) + self.json("success", len(post["like"])) + + @tornado.web.asynchronous + @gen.coroutine + def _unlike_action(self): + id = self.get_body_argument("post") + post = yield self.db.article.find_one({ + "_id": ObjectId(id) + }) + if not post: + self.json("fail", "post id error") + self.__check_already(post) + post["unlike"].append(self.current_user["username"]) + yield self.db.article.find_and_modify({ + "_id": ObjectId(id) + }, { + "$set": {"unlike": post["unlike"]} + }) + self.json("success", len(post["unlike"])) + + @tornado.web.asynchronous + @gen.coroutine + def _bookmark_action(self): + id = self.get_body_argument("post") + post = yield self.db.article.find_one({ + "_id": ObjectId(id) + }) + if not post: + self.json("fail", "article not found") + user = yield self.db.member.find_one({ + "username": self.current_user["username"] + }) + for row in user["bookmark"]: + if id == row["id"]: + self.json("fail", "already bookmark") + bookmark = { + "id": str(post["_id"]), + "title": post["title"], + "user": post["user"], + "sort": post["sort"], + "time": time.time() + } + ret = yield self.db.member.update({ + "username": self.current_user["username"] + }, { + "$push": {"bookmark": bookmark} + }) + self.json("success", "done") + + @tornado.web.asynchronous + @gen.coroutine + def _thanks_action(self): + id = self.get_body_argument("id") + if not id: + self.json("fail", "post not exists!") + post = yield self.db.article.find_one({ + "_id": ObjectId(id), + "thanks": {"$nin": [self.current_user["username"]]} + }) + if not post: + self.json("fail", "already thanks") + if post["user"] == self.current_user["username"]: + self.json("fail", "cannot thanks to yourself") + old = yield self.db.member.find_and_modify({ + "username": self.current_user["username"], + "money": {"$gt": 0} + }, { + "$inc": {"money": -1} + }) + if not old: + self.json("fail", "money not enough") + yield self.db.member.find_and_modify({ + "username": post["user"] + }, { + "$inc": {"money": 1} + }) + yield self.db.article.find_and_modify({ + "_id": ObjectId(id) + }, { + "$push": {"thanks": self.current_user["username"]} + }) + yield self.message(fromuser = None, touser = post["user"], + content = u"你的文章《%s》被%s感谢了" % (post["title"], self.current_user["username"]), + jump="/post/%s" % id) + self.clear_cookie("flush_info") + self.json("success", "thanks success") + + @tornado.web.asynchronous + @gen.coroutine + def _newmsg_action(self): + cursor = self.db.message.find({ + "$and": [ + {"read": False}, + {"$or": [ + {"to": self.current_user["username"]}, + {"from": self.current_user["username"]} + ]}, + ] + }) + count = yield cursor.count() + self.json("success", count) + + def __check_already(self, post): + ''' + 检查like、unlike是否重复 + + :param post: + :return: + ''' + if (self.current_user["username"] in post["unlike"]): + self.json("fail", "already unliked") + if (self.current_user["username"] in post["like"]): + self.json("fail", "already liked") + + def json(self, status, info): + self.write({ + "status": status, + "info": info + }) + raise tornado.web.Finish() \ No newline at end of file diff --git a/controller/auth.py b/controller/auth.py new file mode 100644 index 0000000..e29b1b1 --- /dev/null +++ b/controller/auth.py @@ -0,0 +1,294 @@ +#coding=utf-8 +import tornado.web, time, json, xxtea, hashlib +from controller.base import BaseHandler +from util.function import not_need_login, hash +from tornado import gen +from tornado.escape import url_escape, utf8 +from model.user import UserModel +from util.captcha import Captcha +from util.sendemail import Sendemail +try: + from cStringIO import StringIO +except: + from StringIO import StringIO + +class AjaxHandler(BaseHandler): + @not_need_login + def prepare(self): + BaseHandler.prepare(self) + + def _json(self, status, info = ""): + data = { + "status": status, + "info": info + } + self.write(data) + raise tornado.web.Finish() + + def post(self, *args, **kwargs): + method = args[0] + if hasattr(self, "_%s_action" % method): + getattr(self, "_%s_action" % method)() + else: + self._json("fail") + + @tornado.web.asynchronous + @gen.coroutine + def _checkusername_action(self): + username = self.get_body_argument("username", default=None) + user = {"username": username} + model = UserModel() + if not model(user): + self._json("fail", model.error_msg) + user = yield self.db.member.find_one({ + "username": username + }) + if user: + self._json("fail", "用户名已存在") + else: + self._json("success") + +class ForgetpwdHandler(BaseHandler): + def initialize(self): + BaseHandler.initialize(self) + self.topbar = '' + + @not_need_login + def prepare(self): + BaseHandler.prepare(self) + + def get_byte_16(self, key): + m = hashlib.md5() + m.update(key) + return m.digest() + + @tornado.web.asynchronous + @gen.coroutine + def get(self): + auth = self.get_query_argument("auth", default=None) + # after users click url in their email, show the new password page + if auth: + try: + svalue = xxtea.decrypt_hex(utf8(auth), self.get_byte_16(self.settings.get("cookie_secret"))) + (username, password, t) = svalue.split("|") + except: + self.custom_error("参数错误,请重新找回密码", jump="/forgetpwd") + + if time.time() - float(t) > 30 * 60: + self.custom_error("链接已过期,请在30分钟内点击链接找回密码", jump="/forgetpwd") + user = yield self.db.member.find_one({ + "username": username, "password": password + }) + if user: + self.render("renewpwd.htm", auth = auth) + else: + self.custom_error("参数错误,请重新找回密码", jump="/forgetpwd") + # first visit forgetpwd + else: + self.render("forgetpwd.htm", success = None) + + @tornado.web.asynchronous + @gen.coroutine + def post(self): + email = self.get_body_argument("email", default=None) + auth = self.get_body_argument("auth", default=None) + # after users submit their email + if email: + # check captcha + captcha = self.get_body_argument("captcha", default="") + if not Captcha.check(captcha, self): + self.custom_error("验证码错误") + + user = yield self.db.member.find_one({ + "email": email + }) + if not user: + self.custom_error("不存在这个Email") + sign = "%s|%s|%s" % (user["username"], user["password"], time.time()) + svalue = xxtea.encrypt_hex(utf8(sign), self.get_byte_16(self.settings.get("cookie_secret"))) + url = self.settings.get("base_url") + "/forgetpwd?auth=%s" % url_escape(svalue, False) + Sendemail(self.settings.get("email")).send( + to=user["email"], + orgin="root@waf.science", + title=u"找回密码 - %s" % self.settings["site"]["webname"], + content=u"点击链接找回你的密码:
%s
如果你没有找回密码,请忽视这封邮件" % (url, url) + ) + self.render("forgetpwd.htm", success = True) + # after users click url in their email, and submit a new password + elif auth: + newpwd = self.get_body_argument("password") + try: + svalue = xxtea.decrypt_hex(utf8(auth), self.get_byte_16(self.settings.get("cookie_secret"))) + (username, password, t) = svalue.split("|") + except: + self.custom_error("参数错误,请重新找回密码", jump="/forgetpwd") + if time.time() - float(t) > 30 * 60: + self.custom_error("链接已过期,请在30分钟内点击链接找回密码", jump="/forgetpwd") + newpwd = yield self.backend.submit(hash.get, newpwd) + user = yield self.db.member.find_and_modify({ + "username": username, "password": password + }, { + "$set": {"password": newpwd} + }) + if not user: + self.custom_error("参数错误,请重新找回密码", jump="/forgetpwd") + else: + self.custom_error("密码修改成功", jump="/login", status = "success") + else: + self.custom_error("不存在这个Email") + +class LoginHandler(BaseHandler): + def initialize(self): + BaseHandler.initialize(self) + self.topbar = 'login' + + @not_need_login + def prepare(self): + BaseHandler.prepare(self) + + def get(self): + self.render("login.htm") + + @tornado.web.asynchronous + @gen.coroutine + def post(self): + try: + username = self.get_body_argument('username', default="") + password = self.get_body_argument('password', default="") + remember = self.get_body_argument('remember', default = "off") + + # check captcha + captcha = self.get_body_argument("captcha", default="") + if self.settings["captcha"]["login"] and not Captcha.check(captcha, self): + self.custom_error("验证码错误") + + user = yield self.db.member.find_one({"username": username}) + check = yield self.backend.submit(hash.verify, password, user.get("password")) + if check and user["power"] >= 0: + session = self.set_session(user) + if remember == "on": + cookie_json = json.dumps(session) + self.set_secure_cookie("user_info", cookie_json, expires_days = 30, httponly = True) + yield self.db.member.find_and_modify({"username": username},{ + "$set": { + "logintime": time.time(), + "loginip": self.request.headers.get("X-Real-Ip") + } + }) + self.redirect("/") + else: + assert False + except tornado.web.Finish: + pass + except: + import traceback + print traceback.print_exc() + self.custom_error("用户名或密码错误或账号被禁用", jump = "/login") + +class RegisterHandler(BaseHandler): + def initialize(self): + BaseHandler.initialize(self) + self.topbar = 'register' + + @not_need_login + def prepare(self): + BaseHandler.prepare(self) + self.error = { + "passworddiff": "两次输入的密码不相同", + "usernameused": "用户已经注册过啦", + "shortpassword": "密码长度不能少于5个字符", + "invitecode": "邀请码错误或不存在", + "invoteexpire": "邀请码过期啦", + "closed": "网站已关闭注册", + "captcha": "验证码错误", + } + + def get(self, *args, **kwargs): + error = self.get_argument("error", default = "") + error = self.error.get(error) + self.render("register.htm", error = error, flash = self.flash, + method = self.settings["register"]) + + @tornado.web.asynchronous + @gen.coroutine + def post(self): + username = self.get_body_argument("username", default="") + password = self.get_body_argument("password", default="") + repassword = self.get_body_argument("repassword", default="") + + self.flash["user_reg"] = dict(username = username, password = password, repassword = repassword) + + # check captcha + captcha = self.get_body_argument("captcha", default="") + if self.settings["captcha"]["register"] and not Captcha.check(captcha, self): + self.redirect("/register?error=captcha") + + # check register method + if self.settings["register"] == "close": + self.redirect("/register?error=closed") + elif self.settings["register"] == "invite": + code = self.get_argument("invitecode") + coderow = yield self.db.invite.find_one({ + "code": {"$eq": code}, + "used": {"$eq": False} + }) + if not coderow: + self.redirect("/register?error=invitecode") + if time.time() - coderow["time"] > self.settings["invite_expire"]: + yield self.db.invite.remove({"code": code}) + self.redirect("/register?error=invoteexpire") + + # 两次输入的密码不匹配 + if password != repassword: + self.redirect("/register?error=passworddiff") + # 密码长度太短 + if len(password) < 5: + self.redirect("/register?error=shortpassword") + # 加密密码 + password = yield self.backend.submit(hash.get, password) + member = yield self.db.member.find_one({'username': username}) + # 用户名已存在 + if member: + self.redirect("/register?error=usernameused") + #插入用户 + user = { + "username": username, + "password": password, + "power": 0, + "money": self.settings["init_money"], + "time": time.time(), + "bookmark": [], + "email": "", + "qq": "", + "website": "", + "address": "", + "signal": u"太懒,没有留下任何个人说明", + "openwebsite": 1, + "openqq": 1, + "openemail": 1, + "allowemail": 1, + "logintime": None, + "loginip": self.request.headers.get('X-Real-Ip') + } + model = UserModel() + if not model(user): + self.custom_error(model.error_msg) + result = yield self.db.member.insert(user) + if self.settings["register"] == "invite": + coderow["used"] = True + coderow["user"] = username + yield self.db.invite.update({"code": code}, coderow) + self.flash["user_reg"] = None + self.redirect('/login') + +class CaptchaHanlder(BaseHandler): + @not_need_login + def prepare(self): + BaseHandler.prepare(self) + + def get(self, *args, **kwargs): + self.set_header("Content-Type", "image/png") + img, chars = Captcha.get(self) + buf = StringIO() + img.save(buf, 'PNG', quality=70) + self.write(buf.getvalue()) diff --git a/controller/base.py b/controller/base.py new file mode 100644 index 0000000..deaac6c --- /dev/null +++ b/controller/base.py @@ -0,0 +1,199 @@ +#coding=utf-8 +__author__ = 'phithon' +import tornado.web, json, yaml, os, time, re +from extends.torndsession.sessionhandler import SessionBaseHandler +from util.flash import flash +from util.function import humantime, nl2br +from tornado import gen +from util.function import not_need_login +from util.sendemail import Sendemail + +class BaseHandler(SessionBaseHandler): + def initialize(self): + self.db = self.settings.get("database") + self.backend = self.settings.get("thread_pool") + self.flash = flash(self) + self.topbar = "home" + + def prepare(self): + self.add_header("Content-Security-Policy", "default-src 'self'; script-src 'self' 'unsafe-eval'; " + "connect-src 'self'; img-src 'self' data:; style-src 'self'; " + "font-src 'self'; frame-src 'self'; ") + self.add_header("X-Frame-Options", "deny") + self.add_header("X-XSS-Protection", "1; mode=block") + self.add_header("X-Content-Type-Options", "nosniff") + self.add_header("x-ua-compatible:", "IE=edge,chrome=1") + self.clear_header("Server") + self.power = "guest" + self.check_login() + power = { + 0: "user", + 20: "admin" + } + if self.current_user and self.current_user.get("power") in power: + self.power = power[self.current_user["power"]] + + flush = self.get_cookie("flush_info", default=None) + if self.current_user and not flush: + self.flush_session() + self.set_cookie("flush_info", "ok", expires = time.time() + 60 * 10) + + def set_session(self, user): + try: + assert ("_id" in user and "username" in user) + session = { + "_id": str(user["_id"]), + "username": user["username"], + "power": user["power"], + "money": user["money"], + "login_time": time.time() + } + self.session.set("current_user", session) + return session + except: + return None + + def get_current_user(self): + try: + user = self.session.get("current_user") + if not user and self.get_cookie("user_info"): + scookie = self.get_secure_cookie("user_info") + user = json.loads(scookie) + if not self.set_session(user): + assert False + except: + user = None + return user + + def check_login(self): + try: + assert type(self.current_user) is dict + assert self.current_user.has_key('username') + except AssertionError: + if self.get_cookie("user_info"): + self.clear_cookie("user_info") + if self.request.path == "/": + self.redirect("/public/list/") + if re.match(r"^/post/([a-f0-9]{24})", self.request.path): + self.redirect("/public%s" % self.request.path) + self.custom_error("请先注册或登录", jump="/register") + + def render(self, template_name, **kwargs): + kwargs["base_url"] = self.settings.get("base_url") + kwargs["topbar"] = self.topbar + kwargs["humantime"] = humantime + kwargs["nl2br"] = nl2br + kwargs["get_avatar"] = self.get_avatar + kwargs["power"] = self.power + kwargs["pagenav"] = self.pagenav + return super(BaseHandler, self).render(template_name, **kwargs) + + def redirect(self, url, permanent=False, status=None): + super(BaseHandler, self).redirect(url, permanent, status) + raise tornado.web.Finish() + + def custom_error(self, info, **kwargs): + if not self._finished: + status_code = kwargs.get("status_code", 200) + self.set_status(status_code) + error_title = kwargs.get("title", "提示信息") + error_status = kwargs.get("status", "warning") + error_jump = kwargs.get("jump", "#back") + self.render("error.htm", error_info = info, error_status = error_status, + error_title = error_title, error_jump = error_jump) + raise tornado.web.Finish() + + def _write_config(self, config): + with open(self.settings["config_filename"], "w") as f: + yaml.dump(config, f, default_flow_style = False, default_style = '"') + for k, v in config["global"].items(): + self.settings[k] = v + + def _read_config(self): + with open(self.settings["config_filename"], "r") as f: + config = yaml.load(f) + return config + + def get_avatar(self, uid): + static_path = self.settings.get("static_path") + path = "%s/face/%s/180.png" % (static_path, uid) + if os.path.exists(path): + return path + else: + return "%s/face/guest.png" % static_path + + def pagenav(self, count, url, each, now, + pre = ''): + _ret = '' + _pre = pre + _end = end + page = (int(count / each) + 1) if (count % each != 0) else (count / each) + i = now - 5 + while (i <= now + 5) and (i <= page): + if i > 0: + if now == i: + _url = url % i + _ret += '
  • %d
  • ' % (_url, i) + else: + _url = url % i + _ret += '
  • %d
  • ' % (_url, i) + i += 1 + if now > 6: + _url = url % 1 + _ret = u'
  • 首页
  • ...
  • %s' % (_url, _ret) + if now + 5 < page: + _url = url % page + _ret = u'%s
  • ...
  • 尾页
  • ' % (_ret, _url) + if page <= 1: + _ret = '' + _ret = _pre + _ret + _end + return _ret + + @tornado.web.asynchronous + def flush_session(self): + def callback(user, error): + if not user: return + user["_id"] = str(user["_id"]) + user["login_time"] = self.current_user["login_time"] + del user["password"] + self.session.set("current_user", user) + self.current_user = user + self.db.member.find_one({ + "username": self.current_user["username"] + }, callback = callback) + + @gen.coroutine + def message(self, touser, content, fromuser = None, jump = None): + ret = yield self.db.message.insert({ + "from": fromuser, + "to": touser, + "content": content, + "jump": jump, + "time": time.time(), + "read": False + }) + user = yield self.db.member.find_one({ + "username": touser + }) + if "email" in user and user.get("allowemail"): + Sendemail(self.settings.get("email")).send( + title=u"来自%s的提醒:%s" % (self.settings["site"]["webname"], content), + content=u"%s
    点击查看" + % (content, self.settings.get("base_url"), jump), + to=user["email"], + orgin="root@waf.science" + ) + raise gen.Return(ret) + + +class NotFoundHandler(BaseHandler): + @not_need_login + def prepare(self): + BaseHandler.prepare(self) + + def get(self, *args, **kwargs): + self.set_status(404) + self.render("404.htm") + + def post(self, *args, **kwargs): + self.get(*args, **kwargs) \ No newline at end of file diff --git a/controller/dashboard.py b/controller/dashboard.py new file mode 100644 index 0000000..4c55f13 --- /dev/null +++ b/controller/dashboard.py @@ -0,0 +1,131 @@ +#coding=utf-8 +import tornado.web, re +from controller.base import BaseHandler +from tornado import gen +import time, pymongo +from util.function import intval +from bson.objectid import ObjectId + +class AdminHandler(BaseHandler): + def initialize(self): + super(AdminHandler, self).initialize() + self.topbar = "admin" + + def prepare(self): + super(AdminHandler, self).prepare() + if self.power != "admin": + self.redirect("/") + + def render(self, template_name, **kwargs): + super(AdminHandler, self).render("admin/%s" % template_name, **kwargs) + + def get(self, *args, **kwargs): + action = args[0] if len(args) else "index" + method = "_view_%s" % action + arg = args[2] if len(args) == 3 else None + if hasattr(self, method): + getattr(self, method)(arg) + else: + self._view_index(arg) + + @tornado.web.asynchronous + @gen.coroutine + def _view_index(self, arg): + user = self.db.member.find() + article = self.db.article.find() + sort = self.db.sort.find() + active = self.db.member.find({ + "logintime": {"$gt": time.time() - 3 * 24 * 60 * 60} + }) + count = { + "user": (yield user.count()), + "article": (yield article.count()), + "sort": (yield sort.count()), + "active": (yield active.count()) + } + user.sort([('time', pymongo.DESCENDING)]).limit(10) + newusers = yield user.to_list(10) + self.render("index.htm", count = count, newusers = newusers) + + @tornado.web.asynchronous + @gen.coroutine + def _view_user(self, arg): + username = self.get_query_argument("username", default=None) + where = {"username": {"$regex": ".*"+re.escape(username)+".*"}} if username else {} + limit = 15 + page = intval(arg) + page = page if page > 1 else 1 + user = self.db.member.find(where) + count = yield user.count() + user.sort([('time', pymongo.ASCENDING)]).limit(limit).skip((page - 1) * limit) + users = yield user.to_list(limit) + if username: + search = "?username=%s" % username + else: + search = "" + self.render("userlist.htm", page = page, users = users, count = count, each = limit, search = search) + + @tornado.web.asynchronous + @gen.coroutine + def _view_userdetail(self, arg): + username = arg + user = yield self.db.member.find_one({ + "username": username + }) + if not user: + self.custom_error("不存在这个用户") + self.render("userdetail.htm", user = user) + + @tornado.web.asynchronous + @gen.coroutine + def _view_sort(self, arg): + limit = 15 + page = intval(arg) + page = page if page > 1 else 1 + cursor = self.db.sort.find() + count = yield cursor.count() + cursor.limit(limit).skip((page - 1) * limit) + sorts = yield cursor.to_list(limit) + self.render("sort.htm", sorts = sorts, count = count, each = limit, page = page) + + @tornado.web.asynchronous + @gen.coroutine + def _view_sortdetail(self, arg): + id = arg + sort = yield self.db.sort.find_one({ + "_id": ObjectId(id) + }) + if not sort: + self.custom_error("不存在这个板块") + self.render("sortdetail.htm", sort = sort) + + @tornado.web.asynchronous + @gen.coroutine + def _view_setting(self, arg): + site = self.settings.get("site") + init_money = self.settings.get("init_money") + captcha = self.settings.get("captcha") + register = self.settings.get("register") + self.render("setting.htm", site = site, init_money = init_money, captcha = captcha, register = register) + + @tornado.web.asynchronous + @gen.coroutine + def _view_invite(self, arg): + where = self.get_query_argument("act", default=None) + act = { + "nouse": {"used": False}, + "used": {"used": True}, + "expire": { + "time": {"$lt": time.time() - self.settings["invite_expire"]}, + "used": False + } + } + where = act.get(where) if (where in act) else {} + limit = 15 + page = intval(arg) + page = page if page > 1 else 1 + cursor = self.db.invite.find(where) + count = yield cursor.count() + cursor.sort([('time', pymongo.DESCENDING)]).limit(limit).skip((page - 1) * limit) + invites = yield cursor.to_list(limit) + self.render("invite.htm", invites = invites, count = count, each = limit, page = page) diff --git a/controller/download.py b/controller/download.py new file mode 100644 index 0000000..d5c1ba5 --- /dev/null +++ b/controller/download.py @@ -0,0 +1,26 @@ +#coding=utf-8 +__author__ = 'phithon' +import tornado.web, os +import tornado.gen + +class DownloadHandler(tornado.web.StaticFileHandler): + @tornado.gen.coroutine + def get(self, path, include_body=True): + filename = self.get_absolute_path(self.root, path) + cookie = self.get_secure_cookie("download_key") + if not cookie or cookie != filename: + self.set_status(404) + self.absolute_path = None + self.render("404.htm") + return + yield super(DownloadHandler, self).get(path, include_body) + + def set_extra_headers(self, path): + filename = os.path.basename(path) + if "MSIE" in self.request.headers.get("User-Agent"): + filename = filename.encode("gbk") + self.set_header("Content-Type", "application/octet-stream") + self.set_header("Content-Disposition", "attachment;filename=\"%s\";" % (filename, )) + self.set_header("Content-Encoding", "none") + self.set_header("Content-Transfer-Encoding", "binary") + self.clear_header("Server") \ No newline at end of file diff --git a/controller/main.py b/controller/main.py new file mode 100644 index 0000000..ced0d0f --- /dev/null +++ b/controller/main.py @@ -0,0 +1,33 @@ +#coding=utf-8 +__author__ = 'phithon' +import tornado.web +from controller.base import BaseHandler +from tornado import gen +import pymongo +from bson.objectid import ObjectId +from util.function import time_span, intval + +class HomeHandler(BaseHandler): + @tornado.web.asynchronous + @gen.coroutine + def get(self, *args, **kwargs): + limit = 10 + page = intval(args[1]) + if not page or page <= 0 : page = 1 + cursor = self.db.article.find() + cursor.sort([('time', pymongo.DESCENDING)]).limit(limit).skip((page - 1) * limit) + count = yield cursor.count() + posts = yield cursor.to_list(length = limit) + sorts = yield self.get_sort() + self.render("main.htm", posts = posts, sorts = sorts, page = page, + time_span = time_span, count = count, each = limit) + + @gen.coroutine + def get_sort(self): + sorts = [] + cursor = self.db.sort.find({ + "show": True + }) + while (yield cursor.fetch_next): + sorts.append(cursor.next_object()) + raise gen.Return(sorts) \ No newline at end of file diff --git a/controller/message.py b/controller/message.py new file mode 100644 index 0000000..ef6ddb0 --- /dev/null +++ b/controller/message.py @@ -0,0 +1,76 @@ +#coding=utf-8 +__author__ = 'phithon' +import tornado.web +from controller.base import BaseHandler +from tornado import gen +import pymongo, re +from bson.objectid import ObjectId +from util.function import time_span, intval + +def cutstr(content): + return content[0:30] + "..." + +class MessageHandler(BaseHandler): + def initialize(self): + BaseHandler.initialize(self) + self.topbar = "message" + + def post(self, *args, **kwargs): + method = self.get_body_argument("method", default=None) + if method and hasattr(self, "_%s_action" % method): + getattr(self, "_%s_action" % method)() + else: + self.custom_error("不存在这个方法") + + @tornado.web.asynchronous + @gen.coroutine + def _readall_action(self): + yield self.db.message.update({ + "to": self.current_user["username"], + "read": False + }, { + "$set": {"read": True} + }, multi = True) + self.redirect("/message") + + @tornado.web.asynchronous + @gen.coroutine + def _deleteall_action(self): + yield self.db.message.remove({ + "to": self.current_user["username"] + }, multi = True) + self.redirect("/message") + + @tornado.web.asynchronous + @gen.coroutine + def get(self, *args, **kwargs): + limit = 20 + page = intval(args[1]) + if not page or page <= 0 : page = 1 + cursor = self.db.message.find({ + "$or": [ + {"to": self.current_user["username"]}, + {"from": self.current_user["username"]} + ] + }) + count = yield cursor.count() + cursor.sort([('time', pymongo.DESCENDING)]).limit(limit).skip((page - 1) * limit) + messages = yield cursor.to_list(length = limit) + self.render("message.htm", messages = messages, count = count, cutstr = cutstr) + +class DetailHandler(BaseHandler): + + def initialize(self): + BaseHandler.initialize(self) + self.topbar = "message" + + @tornado.web.asynchronous + @gen.coroutine + def get(self, *args, **kwargs): + id = args[0] + message = yield self.db.message.find_and_modify({ + "_id": ObjectId(id) + }, { + "$set": {"read": True} + }) + self.render("msgdetail.htm", message = message) \ No newline at end of file diff --git a/controller/open.py b/controller/open.py new file mode 100644 index 0000000..f0a148b --- /dev/null +++ b/controller/open.py @@ -0,0 +1,147 @@ +#coding=utf-8 +__author__ = 'phithon' +import tornado.web, time, re, pymongo +from controller.base import BaseHandler +from tornado import gen +from bson.objectid import ObjectId +from util.captcha import Captcha +from util.function import intval, not_need_login, time_span + +class PostHandler(BaseHandler): + def initialize(self): + BaseHandler.initialize(self) + self.topbar = "" + + @not_need_login + def prepare(self): + BaseHandler.prepare(self) + + def del_with_hide(self, post): + charge = post.get("charge") + content = post.get('content') + template = u"
    " \ + u"
    隐藏内容,需要登录并付费之后才能查看哦
    " \ + u"
    需要" \ + + str(post['charge']) + \ + u"金币,点击 登录" \ + + u"
    " + pattern = re.compile(r"\[hide\](.*?)\[/hide\]", re.S) + if charge == 0: + post["content"] = pattern.sub("\\1", content) + return post + if pattern.search(content): + content = pattern.sub(template, content) + else: + content = template + post["content"] = content + return post + + @tornado.web.asynchronous + @gen.coroutine + def get(self, *args, **kwargs): + self.set_header("Content-Security-Policy", "default-src 'self'; script-src bdimg.share.baidu.com 'self' 'unsafe-eval'; " + "connect-src 'self'; img-src *.share.baidu.com nsclick.baidu.com 'self' data:; " + "style-src 'self' 'unsafe-inline'; font-src 'self'; frame-src 'self';") + id = args[0] + if self.current_user: + self.redirect("/post/%s" % id) + post = yield self.db.article.find_one({ + "_id": ObjectId(id), + "open": True + }) + if not post: + self.custom_error("注册登录后才能查看哦", jump = "/register") + + post = self.del_with_hide(post) + user = yield self.db.member.find_one({ + "username": post["user"] + }) + yield self.db.article.find_and_modify({ + "_id": ObjectId(id) + }, { + "$inc": {"view": 1} + }) + self.render("open_post.htm", post = post, user = user) + + @tornado.web.asynchronous + @gen.coroutine + def post(self, *args, **kwargs): + captcha = self.get_body_argument("captcha") + if not Captcha.check(captcha, self): + self.custom_error("验证码错误") + content = self.get_body_argument("content") + postid = self.get_body_argument("postid") + _id = ObjectId() + post = yield self.db.article.find_and_modify({ + "_id": ObjectId(postid) + },{ + "$push": { + "comment": { + "_id": _id, + "content": content, + "user": { + "id": self.current_user["_id"], + "username": self.current_user["username"] + }, + "time": time.time() + } + } + }) + if post: + if self.current_user["username"] != post["user"]: + self.message(fromuser=None, touser=post["user"], + content=u"%s 评论了你的文章《%s》" % (self.current_user["username"], post["title"]), + jump="/post/%s" % postid) + self.at_user(content, post["title"], post["_id"], _id) + self.redirect("/post/%s#%s" % (postid, _id)) + else: + self.custom_error("不存在这篇文章") + + @gen.coroutine + def at_user(self, content, title, postid, comid): + at = [] + grp = re.findall(r"@([a-zA-Z0-9_\-\u4e00-\u9fa5]+)", content) + for username in grp: + try: + user = yield self.db.member.find_one({ + "username": username + }) + assert type(user) is dict + assert self.current_user["username"] != username + assert username not in at + yield self.message(fromuser=None, touser=username, + content=u"%s在文章《%s》中提到了你。" % (self.current_user["username"], title), + jump="/post/%s#%s" % (postid, comid)) + at.append(username) + except: + continue + + @gen.coroutine + def get_user(self, username): + user = yield self.db.member.find_one({ + "username": {"$eq": username} + }) + raise gen.Return(user) + +class ListHandler(BaseHandler): + @not_need_login + def prepare(self): + BaseHandler.prepare(self) + + @tornado.web.asynchronous + @gen.coroutine + def get(self, *args, **kwargs): + limit = 10 + page = intval(args[1]) + if not page or page <= 0 : page = 1 + cursor = self.db.article.find({ + "open": True + }) + cursor.sort([('time', pymongo.DESCENDING)]).limit(limit).skip((page - 1) * limit) + count = yield cursor.count() + posts = yield cursor.to_list(length = limit) + self.render("open_list.htm", posts = posts, page = page, + time_span = time_span, count = count, each = limit) + + def test(self): + pass \ No newline at end of file diff --git a/controller/post.py b/controller/post.py new file mode 100644 index 0000000..d55bed2 --- /dev/null +++ b/controller/post.py @@ -0,0 +1,171 @@ +#coding=utf-8 +__author__ = 'phithon' +import tornado.web, time, re +from controller.base import BaseHandler +from tornado import gen +from bson.objectid import ObjectId +from util.captcha import Captcha +from util.function import humantime + +class PostHandler(BaseHandler): + def initialize(self): + BaseHandler.initialize(self) + self.topbar = "" + + def is_edit(self, post): + return post["user"] == self.current_user.get("username") and time.time() - post["time"] < 30 * 60 + + def no_need_buy(self, post): + if self.power == "admin": + return True + if post["user"] == self.current_user["username"]: + return True + if "buyer" in post and self.current_user["username"] in post["buyer"]: + return True + now = int(humantime(time.time(), "%H")) + if post["freebegin"] <= now < post["freeend"]: + return True + return False + + def del_with_hide(self, post): + charge = post.get("charge") + content = post.get('content') + template = u"
    " \ + u"
    内容隐藏,付费以后才可以看哦
    " \ + u"
    需要" \ + + str(post['charge']) + \ + u"金币,点击 " \ + + self.xsrf_form_html() + u"
    " + pattern = re.compile(r"\[hide\](.*?)\[/hide\]", re.S) + if charge == 0 or self.no_need_buy(post): + post["content"] = pattern.sub("\\1", content) + return post + if pattern.search(content): + content = pattern.sub(template, content) + else: + content = template + post["content"] = content + return post + + @tornado.web.asynchronous + @gen.coroutine + def get(self, *args, **kwargs): + self.set_header("Content-Security-Policy", "default-src 'self'; script-src bdimg.share.baidu.com 'self' 'unsafe-eval'; " + "connect-src 'self'; img-src *.share.baidu.com nsclick.baidu.com 'self' data:; " + "style-src 'self' 'unsafe-inline'; font-src 'self'; frame-src 'self';") + id = args[0] + post = yield self.db.article.find_one({ + "_id": ObjectId(id) + }) + if not post: + self.custom_error("你找的文章并不存在", jump = "/") + + post = self.del_with_hide(post) + user = yield self.db.member.find_one({ + "username": post["user"] + }) + yield self.db.article.find_and_modify({ + "_id": ObjectId(id) + }, { + "$inc": {"view": 1} + }) + self.render("post.htm", post = post, user = user, is_edit = self.is_edit) + + @tornado.web.asynchronous + @gen.coroutine + def post(self, *args, **kwargs): + captcha = self.get_body_argument("captcha") + if not Captcha.check(captcha, self): + self.custom_error("验证码错误") + content = self.get_body_argument("content") + postid = self.get_body_argument("postid") + _id = ObjectId() + post = yield self.db.article.find_and_modify({ + "_id": ObjectId(postid) + },{ + "$push": { + "comment": { + "_id": _id, + "content": content, + "user": { + "id": self.current_user["_id"], + "username": self.current_user["username"] + }, + "time": time.time() + } + } + }) + if post: + if self.current_user["username"] != post["user"]: + self.message(fromuser=None, touser=post["user"], + content=u"%s 评论了你的文章《%s》" % (self.current_user["username"], post["title"]), + jump="/post/%s" % postid) + self.at_user(content, post["title"], post["_id"], _id) + self.redirect("/post/%s#%s" % (postid, _id)) + else: + self.custom_error("不存在这篇文章") + + @gen.coroutine + def at_user(self, content, title, postid, comid): + at = [] + grp = re.findall(r"@([a-zA-Z0-9_\-\u4e00-\u9fa5]+)", content) + for username in grp: + try: + user = yield self.db.member.find_one({ + "username": username + }) + assert type(user) is dict + assert self.current_user["username"] != username + assert username not in at + yield self.message(fromuser=None, touser=username, + content=u"%s在文章《%s》中提到了你。" % (self.current_user["username"], title), + jump="/post/%s#%s" % (postid, comid)) + at.append(username) + except: + continue + + @gen.coroutine + def get_user(self, username): + user = yield self.db.member.find_one({ + "username": {"$eq": username} + }) + raise gen.Return(user) + +class BuyHandler(BaseHandler): + @tornado.web.asynchronous + @gen.coroutine + def post(self, *args, **kwargs): + id = self.get_body_argument("id", default=None) + if not id: + self.custom_error("文章不存在") + post = yield self.db.article.find_one({ + "_id": ObjectId(id) + }) + if self.current_user["username"] in post["buyer"]: + self.custom_error("已经购买过啦,无需重复购买", jump="/post/%s" % post["_id"]) + if post["charge"]: + charge = int(post["charge"]) + old = yield self.db.member.find_and_modify({ + "username": {"$eq": self.current_user["username"]}, + "money": {"$gte": charge} + }, { + "$inc": {"money": 0 - charge} + }) + if not old: + self.custom_error("余额不够,不能购买帖子") + post["buyer"].append(self.current_user["username"]) + yield self.db.article.find_and_modify({ + "_id": post["_id"] + }, { + "$set": {"buyer": post["buyer"]} + }) + yield self.db.member.find_and_modify({ + "username": post["user"] + }, { + "$inc": {"money": charge} + }) + self.clear_cookie("flush_info") + self.redirect("/post/%s" % post["_id"]) + else: + self.custom_error("这篇文章并不需要付费", jump="/post/%s" % post["_id"]) \ No newline at end of file diff --git a/controller/publish.py b/controller/publish.py new file mode 100644 index 0000000..fa95ff1 --- /dev/null +++ b/controller/publish.py @@ -0,0 +1,208 @@ +#coding=utf-8 +__author__ = 'phithon' +import tornado.web, time, os +from controller.base import BaseHandler +from tornado import gen +from util.function import humantime, md5, random_str, intval +from bson.objectid import ObjectId +from model.article import ArticleModel +from util.pxfilter import XssHtml + +def xss_filter(html): + parser = XssHtml() + parser.feed(html) + parser.close() + return parser.getHtml() + +class PublishHandler(BaseHandler): + def initialize(self): + super(PublishHandler, self).initialize() + self.topbar = "" + + @tornado.web.asynchronous + @gen.coroutine + def get(self, *args, **kwargs): + self.set_header("Content-Security-Policy", "default-src 'self'; script-src 'self' 'unsafe-eval' " + "'unsafe-inline'; connect-src 'self'; img-src 'self' data:; " + "style-src 'self' 'unsafe-inline'; font-src 'self'; frame-src 'self';") + cursor = self.db.sort.find() + sort = [] + while (yield cursor.fetch_next): + sort.append(cursor.next_object()) + self.render("publish.htm", sort = sort, flash = self.flash) + + @tornado.web.asynchronous + @gen.coroutine + def post(self, *args, **kwargs): + content = self.get_body_argument("ckeditor", default=None) + title = self.get_body_argument("title", default=None) + sort = self.get_body_argument("sort", default=None) + charge = intval(self.get_body_argument("charge", default=0)) + freebegin = intval(self.get_body_argument("freebegin", default=0)) + freeend = intval(self.get_body_argument("freeend", default=0)) + if charge < 0: + self.flash["article"] = content + self.custom_error("收费不能低于0", jump = "/publish") + if freebegin > freeend: + self.flash["article"] = content + self.custom_error("结束时间不能小于开始时间", jump = "/publish") + if not sort: + self.flash["article"] = content + self.custom_error("不存在这个分类", jump = "/publish") + tosort = yield self.db.sort.find_and_modify({ + "_id": ObjectId(sort) + }, { + "$inc": {"article": 1} + }) + if not tosort: + self.flash["article"] = content + self.custom_error("不存在这个分类", jump = "/publish") + + # filter html + content = xss_filter(content) + + article = { + "title": title, + "content": content, + "user": self.current_user["username"], + "sort": tosort, + "view": 0, + "like": [], + "unlike": [], + "charge": charge, + "time": time.time(), + "freebegin": freebegin, + "freeend": freeend, + "buyer": [], + "thanks": [], + "star": False, + "rank": 0, + "comment": [], + "open": False + } + model = ArticleModel() + if not model(article): + self.flash["article"] = content + self.custom_error(model.error_msg, jump = "/publish") + id = yield self.db.article.insert(article) + self.redirect("/post/%s" % id) + + +class EditHandler(BaseHandler): + def initialize(self): + super(EditHandler, self).initialize() + self.topbar = "" + + def __check_power(self, post): + if self.power == "admin": + return True + if not post or post["user"] != self.current_user["username"]: + self.custom_error("你没有权限修改这篇文章", "", 0, "/post/%s" % post["_id"]) + if post["user"] == self.current_user["username"] and time.time() - post["time"] > 30 * 60: + self.custom_error("文章发表30分钟后就不允许修改了", "", 0, "/post/%s" % post["_id"]) + + def custom_error(self, info, content, id, jump = None): + if not jump: + self.flash["article"] = content + return super(EditHandler, self).custom_error(info, jump = "/edit/%s" % id) + else: + return super(EditHandler, self).custom_error(info, jump = jump) + + @tornado.web.asynchronous + @gen.coroutine + def get(self, *args, **kwargs): + self.set_header("Content-Security-Policy", "default-src 'self'; script-src 'self' 'unsafe-eval' " + "'unsafe-inline'; connect-src 'self'; img-src 'self' data:; " + "style-src 'self' 'unsafe-inline'; font-src 'self'; frame-src 'self';") + id = args[0] + post = yield self.db.article.find_one({ + "_id": ObjectId(id) + }) + self.__check_power(post) + cursor = self.db.sort.find() + sort = [] + while (yield cursor.fetch_next): + sort.append(cursor.next_object()) + self.render("edit.htm", sort = sort, post = post, flash = self.flash) + + @tornado.web.asynchronous + @gen.coroutine + def post(self, *args, **kwargs): + id = self.get_body_argument("id", default=None) + if not id: + self.custom_error("不存在这篇文章", "", id) + post = yield self.db.article.find_one({ + "_id": ObjectId(id) + }) + self.__check_power(post) + content = self.get_body_argument("ckeditor", default=None) + post["title"] = self.get_body_argument("title", default=None) + sort = self.get_body_argument("sort", default=None) + post["charge"] = intval(self.get_body_argument("charge", default=0)) + post["freebegin"] = intval(self.get_body_argument("freebegin", default=0)) + post["freeend"] = intval(self.get_body_argument("freeend", default=0)) + + if post["charge"] < 0: + self.custom_error("收费不能低于0", content, id) + if post["freebegin"] > post["freeend"]: + self.custom_error("结束时间不能小于开始时间", content, id) + if not sort: + self.custom_error("不存在这个分类", content, id) + post["sort"] = yield self.db.sort.find_one({"_id": ObjectId(sort)}) + if not post["sort"]: + self.custom_error("不存在这个分类", content, id) + + # filter html + post["content"] = xss_filter(content) + model = ArticleModel() + if not model(post): + self.custom_error(model.error_msg, content, id) + yield self.db.article.find_and_modify({ + "_id": post["_id"] + }, post) + self.redirect("/post/%s" % id) + +class UploadHandler(BaseHandler): + def prepare(self): + super(UploadHandler, self).prepare() + self.orgname = '' + self.set_header("X-Frame-Options", "SAMEORIGIN") + self.set_header("Content-Security-Policy", "default-src 'self'; script-src 'self' 'unsafe-eval' " + "'unsafe-inline'; connect-src 'self'; img-src 'self' data:; " + "style-src 'self' 'unsafe-inline'; font-src 'self'; frame-src 'self';") + + def check_xsrf_cookie(self): + return True + + @tornado.web.asynchronous + @gen.coroutine + def post(self, *args, **kwargs): + self.func = intval(self.get_argument("CKEditorFuncNum")) + now = time.time() + try: + if self.request.files: + file = self.request.files['upload'][0] + ext = os.path.splitext(file["filename"])[-1] + if ext not in (".png", ".gif", ".jpg", ".bmp", ".jpeg"): + self.end("", u"不允许上传此类后缀的文件哦") + self.orgname = file["filename"] + filename = md5("%s%s" % (file["filename"], random_str(6))) + ext + folder = "%s/%s/%s" % (self.settings["imagepath"], humantime(now, "%Y%m"), + humantime(now, "%d")) + if not os.path.isdir(folder): + os.makedirs(folder) + filename = "%s/%s" % (folder, filename) + with open(filename, "wb") as fin: + fin.write(file["body"]) + fin.close() + self.end(filename, u"上传成功") + except tornado.web.Finish, e: + pass + except: + import traceback + print traceback.print_exc() + self.end("", u"参数错误") + + def end(self, path, info): + self.render("upload.htm", func = self.func, orgname = self.orgname, path = path, info = info) + raise tornado.web.Finish() \ No newline at end of file diff --git a/controller/search.py b/controller/search.py new file mode 100644 index 0000000..85845c4 --- /dev/null +++ b/controller/search.py @@ -0,0 +1,32 @@ +#coding=utf-8 +__author__ = 'phithon' +import tornado.web +from controller.base import BaseHandler +from tornado import gen +import pymongo, re +from bson.objectid import ObjectId +from util.function import time_span, intval + +class SearchHandler(BaseHandler): + def initialize(self): + BaseHandler.initialize(self) + self.topbar = "" + + @tornado.web.asynchronous + @gen.coroutine + def get(self, *args, **kwargs): + keyword = self.get_query_argument("keyword", default=None) + if not keyword: + self.custom_error("关键词不能为空") + esp_keyword = re.escape(keyword) + limit = 20 + page = intval(args[1]) + if not page or page <= 0 : page = 1 + cursor = self.db.article.find({ + "title": {"$regex": ".*%s.*" % esp_keyword, "$options": "i"} + }) + count = yield cursor.count() + cursor.sort([('time', pymongo.DESCENDING)]).limit(limit).skip((page - 1) * limit) + posts = yield cursor.to_list(length = limit) + self.render("search.htm", posts = posts, page = page, keyword = keyword, + time_span = time_span, count = count, each = limit) \ No newline at end of file diff --git a/controller/sort.py b/controller/sort.py new file mode 100644 index 0000000..56cda57 --- /dev/null +++ b/controller/sort.py @@ -0,0 +1,30 @@ +#coding=utf-8 +__author__ = 'phithon' +import tornado.web +from controller.base import BaseHandler +from tornado import gen +import pymongo +from bson.objectid import ObjectId +from util.function import time_span, intval + +class SortHandler(BaseHandler): + @tornado.web.asynchronous + @gen.coroutine + def get(self, *args, **kwargs): + sortid = args[0] + limit = 1 + page = intval(args[2]) + if not page or page <= 0 : page = 1 + sort = yield self.db.sort.find_one({ + "_id": ObjectId(sortid) + }) + if not sort: + self.custom_error("板块不存在") + cursor = self.db.article.find({ + "sort._id": ObjectId(sortid) + }) + count = yield cursor.count() + cursor.sort([('time', pymongo.DESCENDING)]).limit(limit).skip((page - 1) * limit) + posts = yield cursor.to_list(length = limit) + self.render("sort.htm", posts = posts, page = page, sort = sort, time_span = time_span, + count = count, each = limit) \ No newline at end of file diff --git a/controller/user.py b/controller/user.py new file mode 100644 index 0000000..841db9c --- /dev/null +++ b/controller/user.py @@ -0,0 +1,237 @@ +#coding=utf-8 +__author__ = 'phithon' +import tornado.web, os, base64, pymongo, time +from controller.base import BaseHandler +from tornado import gen +from bson.objectid import ObjectId +from util.function import time_span, hash, intval +from model.user import UserModel + +class UserHandler(BaseHandler): + def initialize(self): + super(UserHandler, self).initialize() + self.topbar = "" + + def get(self, *args, **kwargs): + method = "%s_act" % args[0] + if len(args) == 3 : arg = args[2] + else: arg = None + if hasattr(self, method): + getattr(self, method)(arg) + else: + self.detail_act() + + def quit_act(self, arg): + if self.get_cookie("user_info"): + self.clear_cookie("user_info") + if self.get_cookie("download_key"): + self.clear_cookie("download_key") + self.session.delete("current_user") + self.redirect("/login") + + @tornado.web.asynchronous + @gen.coroutine + def modify_act(self, arg): + pass + + @tornado.web.asynchronous + @gen.coroutine + def detail_act(self, arg): + if not arg : arg = self.current_user["username"] + username = self.get_query_argument("u", default = arg) + user = yield self.db.member.find_one({ + "username": {"$eq": username} + }) + if not user: + self.custom_error("不存在这个用户") + + limit = 10 + page = intval(self.get_argument("page", default=1)) + if not page or page <= 0 : page = 1 + cursor = self.db.article.find({ + "user": username + }) + count = yield cursor.count() + cursor.sort([('time', pymongo.DESCENDING)]).limit(limit).skip((page - 1) * limit) + posts = yield cursor.to_list(length = limit) + face = "./static/face/%s/180.png" % user["_id"] + if not os.path.exists(face): face = "./static/face/guest.png" + self.render("user.htm", user = user, posts = posts, page = page, time_span = time_span, each = limit, count = count) + + @tornado.web.asynchronous + @gen.coroutine + def edit_act(self, arg): + user = yield self.db.member.find_one({ + "username": self.current_user["username"] + }) + self.render("profile.htm", user = user, radio = self.radio) + + def face_act(self, arg): + self.render("face.htm") + + @tornado.web.asynchronous + @gen.coroutine + def bookmark_act(self, arg): + limit = 10 + page = intval(arg) + if page <= 0 : page = 1 + user = yield self.db.member.find_one({ + "username": self.current_user["username"] + }) + bookmark = user.get("bookmark") + count = len(bookmark) + bookmark = bookmark[(page - 1) * limit:(page - 1) * limit + limit] + bookmark.reverse() + self.render("bookmark.htm", bookmark = bookmark, page = page, count = count, each = limit) + + @tornado.web.asynchronous + @gen.coroutine + def like_act(self, arg): + limit = 10 + page = intval(arg) + if page <= 0 : page = 1 + cursor = self.db.article.find({ + "like": self.current_user["username"] + }) + count = yield cursor.count() + cursor.sort([('_id', pymongo.DESCENDING)]).limit(limit).skip((page - 1) * limit) + posts = yield cursor.to_list(length = limit) + self.render("like.htm", posts = posts, page = page, count = count, each = limit) + + + @tornado.web.asynchronous + @gen.coroutine + def download_act(self): + key = self.get_query_argument("key") + task = yield self.db.task.find_one({ + "_id": ObjectId(key), + "owner": self.current_user.get("username") + }) + if task and os.path.exists(task["savepath"]): + self.set_secure_cookie("download_key", task["savepath"]) + relpath = os.path.relpath(task["savepath"]) + self.redirect("/" + relpath) + else: + self.custom_error("File Not Found", status_code = 404) + + def post(self, *args, **kwargs): + method = "_post_%s" % args[0] + if hasattr(self, method): + getattr(self, method)() + else: + self.custom_error("参数错误") + + @tornado.web.asynchronous + @gen.coroutine + def _post_edit(self): + profile = {} + profile["email"] = self.get_body_argument("email", default=None) + profile["website"] = self.get_body_argument("website", default=None) + profile["qq"] = self.get_body_argument("qq", default=None) + profile["address"] = self.get_body_argument("address", default=None) + profile["signal"] = self.get_body_argument("signal", default=None) + orgpass = self.get_body_argument("orgpass", default=None) + if orgpass: + password = self.get_body_argument("password") + repassword = self.get_body_argument("repassword") + if not password or len(password) < 5: + self.custom_error("新密码太短") + if password != repassword: + self.custom_error("两次输入的密码不相同") + user = yield self.db.member.find_one({"username": self.current_user["username"]}) + check = yield self.backend.submit(hash.verify, orgpass, user["password"]) + if not check: + self.custom_error("原始密码输入错误") + profile["password"] = yield self.backend.submit(hash.get, password) + + # check email + ufemail = yield self.db.member.find_one({ + "email": profile["email"] + }) + if ufemail: + self.custom_error("邮箱已经被人使用过啦") + + # check user profile + model = UserModel() + if not model(profile): + self.custom_error(model.error_msg) + yield self.db.member.update({ + "username": self.current_user["username"] + }, { + "$set": profile + }) + self.redirect("/user/edit") + + @tornado.web.asynchronous + @gen.coroutine + def _post_upface(self): + img = self.get_body_argument("img", default = None) + try: + img = base64.b64decode(img) + uid = self.current_user["_id"] + face = "./static/face/%s/" % uid + if not os.path.isdir(face): + os.makedirs(face) + face += "180.png" + with open(face, "wb") as f: + f.write(img) + self.write("success") + except: + self.write("fail") + + @tornado.web.asynchronous + @gen.coroutine + def _post_message(self): + openwebsite = intval(self.get_body_argument("openwebsite", default=1)) + openqq = intval(self.get_body_argument("openqq", default=1)) + openemail = intval(self.get_body_argument("openemail", default=1)) + allowemail = intval(self.get_body_argument("allowemail", default=1)) + yield self.db.member.find_and_modify({ + "username": self.current_user["username"] + }, { + "$set": { + "openwebsite": openwebsite, + "openqq": openqq, + "openemail": openemail, + "allowemail": allowemail + } + }) + self.redirect("/user/edit") + + @tornado.web.asynchronous + @gen.coroutine + def _post_like(self): + id = self.get_body_argument("postid") + yield self.db.article.find_and_modify({ + "_id": ObjectId(id) + }, { + "$pull": {"like": self.current_user["username"]} + }) + self.redirect("/user/like") + + @tornado.web.asynchronous + @gen.coroutine + def _post_bookmark(self): + id = self.get_body_argument("postid") + yield self.db.member.find_and_modify({ + "username": self.current_user["username"] + }, { + "$pull": {"bookmark": {"id": id}} + }) + self.redirect("/user/bookmark") + + @gen.coroutine + def __get_sort(self, id): + sort = yield self.db.sort.find_one({ + "_id": ObjectId(id) + }) + raise gen.Return(sort) + + def radio(self, user, key, tr = 1): + check = "" + if key in user: + if user[key] and tr == 1: + check = "checked" + if not user[key] and tr == 0: + check = "checked" + return '' % (key, tr, check) \ No newline at end of file diff --git a/controller/welcome.py b/controller/welcome.py new file mode 100644 index 0000000..8a6952d --- /dev/null +++ b/controller/welcome.py @@ -0,0 +1,6 @@ +import tornado.web +from controller.base import BaseHandler + +class MainHandler(BaseHandler): + def get(self): + self.write("Hello, world") \ No newline at end of file diff --git a/download/.gitignore b/download/.gitignore new file mode 100644 index 0000000..519c3f9 --- /dev/null +++ b/download/.gitignore @@ -0,0 +1 @@ +# 为毛不能commit空文件夹??求解释!! diff --git a/extends/__init__.py b/extends/__init__.py new file mode 100644 index 0000000..0aba571 --- /dev/null +++ b/extends/__init__.py @@ -0,0 +1 @@ +__author__ = 'phithon' diff --git a/extends/torndsession/__init__.py b/extends/torndsession/__init__.py new file mode 100644 index 0000000..0aba571 --- /dev/null +++ b/extends/torndsession/__init__.py @@ -0,0 +1 @@ +__author__ = 'phithon' diff --git a/extends/torndsession/driver.py b/extends/torndsession/driver.py new file mode 100644 index 0000000..5133f6a --- /dev/null +++ b/extends/torndsession/driver.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright @ 2014 Mitchell Chu + +class SessionDriver(object): + ''' + abstact class for all real session driver implements. + ''' + def __init__(self, **settings): + self.settings = settings + + def get(self, session_id): + raise NotImplementedError() + + def save(self, session_id, session_data, expires=None): + raise NotImplementedError() + + def clear(self, session_id): + raise NotImplementedError() + + def remove_expires(self): + raise NotImplementedError() + +class SessionDriverFactory(object): + ''' + session driver factory + use input settings to return suitable driver's instance + ''' + @staticmethod + def create_driver(driver, **setings): + module_name = 'extends.torndsession.%ssession' % driver.lower() + module = __import__(module_name, globals(), locals(), ['object'], -1) + # must use this form. + # use __import__('torndsession.' + driver.lower()) just load torndsession.__init__.pyc + cls = getattr(module, '%sSession' % driver.capitalize()) + if not 'SessionDriver' in [base.__name__ for base in cls.__bases__]: + raise InvalidSessionDriverException('%s not found in current driver implements ' % driver) + return cls # just return driver class. + +class InvalidSessionDriverException(Exception): + pass diff --git a/extends/torndsession/filesession.py b/extends/torndsession/filesession.py new file mode 100644 index 0000000..9efe948 --- /dev/null +++ b/extends/torndsession/filesession.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright @ 2014 Mitchell Chu + +import os +from os.path import join, exists, isdir +import datetime + +from driver import SessionDriver +from extends.torndsession.session import SessionConfigurationError + +utcnow = datetime.datetime.utcnow +try: + import cPickle as pickle # py2 +except: + import pickle # py3 + +class FileSession(SessionDriver): + """ + System File to save session object. + """ + DEFAULT_SESSION_POSITION = './#_sessions' # default host is '#_sessions' directory which is in current directory. + """ + Session file default save position. + In a recommendation, you need give the host option.when host is missed, system will use this value by default. + + Additional @ Version: 1.1 + """ + + def __init__(self, **settings): + """ + Initialize File Session Driver. + settings section 'host' is recommended, the option 'prefix' is an optional. + if prefix is not given, 'default' is the default. + host: where to save session object file, this is a directory path. + prefix: session file name's prefix. session file like: prefix@session_id + """ + super(FileSession, self).__init__(**settings) + self.host = settings.get("host", self.DEFAULT_SESSION_POSITION) + self._prefix = settings.get("prefix", 'default') + if not exists(self.host): + os.makedirs(self.host, 0700) # only owner can visit this session directory. + if not isdir(self.host): + raise SessionConfigurationError('session host not found') + + def get(self, session_id): + session_file = join(self.host, self._prefix + session_id) + if not exists(session_file): return {} + + rf = file(session_file, 'rb') + session = pickle.load(rf) + rf.close() + now = utcnow() + expires = session.get('__expires__', now) + if expires >= now: + return session + return {} + + def save(self, session_id, session_data, expires=None): + session_file = join(self.host, self._prefix + session_id) + session_data = session_data if session_data else {} + + if not expires: + session_data.update("__expires__", expires) + wf = file(session_file, 'wb') + pickle.dump(session_data, wf) + wf.close() + + def clear(self, session_id): + session_file = join(self.host, self._prefix + session_id) + if exists(session_file): + os.remove(session_file) + + def remove_expires(self): + if not exists(self.host) or not isdir(self.host):return + now = utcnow() + for file in os.listdir(self.host): + if file.startswith(self._prefix): + session_file = join(self.host, file) + f = open(session_file, 'rb') + session = pickle.load(f) + f.close() + expires = session.get('__expires__', now) + if expires <= now: + os.remove(session_file) diff --git a/extends/torndsession/memorysession.py b/extends/torndsession/memorysession.py new file mode 100644 index 0000000..e09a6b9 --- /dev/null +++ b/extends/torndsession/memorysession.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright @ 2014 Mitchell Chu + +import datetime + +from driver import SessionDriver +from extends.torndsession.session import SessionConfigurationError + + +class MemorySession(SessionDriver): + ''' + save session data in process memory + ''' + + MAX_SESSION_OBJECTS = 1024 + """The max session objects save in memory. + when session objects count large than this value, + system will auto to clear the expired session data. + """ + + def __init__(self, **settings): + # check settings + super(MemorySession, self).__init__(**settings) + host = settings.get("host") + if not host: + raise SessionConfigurationError('memory session driver can not found persistence position') + if not hasattr(host, "session_container"): + setattr(host, "session_container", {}) + self._data_handler = host.session_container + # init some thing + + def get(self, session_id): + """ + get session object from host. + """ + return self._data_handler.get(session_id) + + def save(self, session_id, session_data, expires=None): + """ + save session data to host. + if host's session objects is more then MAX_SESSION_OBJECTS + system will auto to clear expired session data. + after cleared, system will add current to session pool, however the pool is full. + """ + session_data = session_data if session_data else {} + session_data.update(__expires__=expires) + if len(self._data_handler) >= self.MAX_SESSION_OBJECTS: + self.remove_expires() + if len(self._data_handler) >= self.MAX_SESSION_OBJECTS: + print 'system session pool is full. need more memory to save session object.' + self._data_handler[session_id]=session_data + + def clear(self, session_id): + if self._data_handler.haskey(session_id): + del self._data_handler[session_id] + + def remove_expires(self): + for key, val in self._data_handler: + now = datetime.datetime.utcnow() + expires = val.get("__expires__", now) + if now > expires: + del self._data_handler[key] diff --git a/extends/torndsession/redissession.py b/extends/torndsession/redissession.py new file mode 100644 index 0000000..8ee110e --- /dev/null +++ b/extends/torndsession/redissession.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright @ 2014 Mitchell Chu + +from extends.torndsession.driver import SessionDriver +# from session import SessionConfigurationError +import redis +from copy import copy +from datetime import datetime +try: + import cPickle as pickle # py2 +except: + import pickle # py3 + +class RedisSession(SessionDriver): + """ + Use Redis to save session object. + """ + + def get(self, session_id): + self.__create_redis_client() + session_data = self.client.get(session_id) + if not session_data: return {} + return pickle.loads(session_data) + + def save(self, session_id, session_data, expires=None): + session_data = session_data if session_data else {} + if expires: + session_data.update(__expires__ = expires) + session_data = pickle.dumps(session_data) + self.__create_redis_client() + self.client.set(session_id, session_data) + if expires: + delta_seconds = int((expires - datetime.utcnow()).total_seconds()) + self.client.expire(session_id,delta_seconds) + + def clear(self, session_id): + self.__create_redis_client() + self.client.delete(session_id) + + def remove_expires(self): + pass + + def __create_redis_client(self): + if not hasattr(self, 'client'): + if 'max_connections' in self.settings: + connection_pool = redis.ConnectionPool(**self.settings) + settings = copy(self.settings) + del settings['max_connections'] + settings['connection_pool'] = connection_pool + else: + settings = self.settings + self.client = redis.Redis(**settings) diff --git a/extends/torndsession/session.py b/extends/torndsession/session.py new file mode 100644 index 0000000..f6199a7 --- /dev/null +++ b/extends/torndsession/session.py @@ -0,0 +1,259 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright @ 2014 Mitchell Chu +# + +from uuid import uuid4 +import datetime + +from extends.torndsession.driver import SessionDriverFactory + +try: + import cPickle as pickle #py2 +except ImportError: + import pickle #py3 + + +class SessionManager(object): + ''' + ''' + SESSION_ID = 'PYSESSID' + DEFAULT_SESSION_LIFETIME = 3600 # seconds + + def __init__(self, handler): + self._default_session_lifetime = datetime.datetime.utcnow() + datetime.timedelta(seconds = self.DEFAULT_SESSION_LIFETIME) + self.handler = handler + self.settings = {} # session configurations + self._expires = self._default_session_lifetime + self._is_dirty = True + self.__init_session_driver() + self.__init_session_object() # 初始化Session对象 + + def __init_session_object(self): + session_id = self.handler.get_cookie(self.SESSION_ID) + if not session_id: + session_id = uuid4().hex + self.handler.set_cookie(self.SESSION_ID, + session_id, + **self.__session_settings()) + self._is_dirty = True + self.session = {} + else: + self.session = self.__get_session_object_from_driver(session_id) + if not self.session: + self.session = {} + self._is_dirty = True + else: + self._is_dirty = False + cookie_config = self.settings.get("cookie_config") + if cookie_config: + expires = cookie_config.get("expires") + expires_days = cookie_config.get("expires_days") + if expires_days is not None and not expires: + expires = datetime.datetime.utcnow() + datetime.timedelta(days = expires_days) + if expires and isinstance(expires, datetime.datetime): + self._expires = expires + self._expires = self._expires if self._expires else self._default_session_lifetime + self._id = session_id + + def __init_session_driver(self): + """ + setup session driver. + """ + self.__init_settings() + + driver = self.settings.get("driver") + if not driver: raise SessionConfigurationError('driver not found') + driver_settings = self.settings.get("driver_settings", {}) + if not driver_settings: raise SessionConfigurationError('driver settings not found.') + + cache_driver = self.settings.get("cache_driver", True) + if cache_driver: + cache_name = '__cached_session_driver' + cache_handler = self.handler.application + if not hasattr(cache_handler, cache_name): + setattr(cache_handler, cache_name, SessionDriverFactory.create_driver(driver, **driver_settings)) + session_driver = getattr(cache_handler, cache_name) + else: + session_driver = SessionDriverFactory.create_driver(driver, driver_settings) + self.driver = session_driver(**driver_settings) # create session driver instance. + + def __get_session_driver(self): + driver_name = self.setting.get("driver") + cache_driver = self.settings.get("cache_driver", True) + driver_settings = self.settings.get("driver_settings", {}) + if cache_driver: + cache_name = '__cached_session_driver' + if not hasattr( self.handler.application, cache_name): + if not driver_name:raise SessionConfigurationError('driver missed') + if not driver_settings: raise SessionConfigurationError('driver settings missed.') + setattr( self.handler.application, cache_name, SessionDriverFactory.create_driver(driver_name, **driver_settings)) + driver = getattr(self.hanlder.application, cache_name) + else: + driver = SessionDriverFactory.create_driver(driver_name, **driver_settings) + return driver + + def __init_settings(self): + """ + Init session relative configurations. + all configuration settings as follow: + settings = dict( + cookie_secret = "00a03c657e749caa89ef650a57b53ba(&#)(", + debug = True, + session = { + driver = 'memory', + driver_settings = {'host':self,}, # use application to save session data. + force_persistence = True, + cache_driver = True, # cache driver in application. + cookie_config = {'expires_days':10, 'expires':datetime.datetime.utcnow(),}, # tornado cookies configuration + }, + ) + driver: default enum value: memory, file, redis, memcache. + driver_settings: the data driver need. settings may be the host, database, password, and so on. + redis settings as follow: + driver_settings = { + host = '127.0.0.1', + port = '6379', + db = 0, # where the session data to save. + password = 'session_db_password', # if database has password + } + force_persistence: default is False. + In default, session's data exists in memory only, you must persistence it by manual. + Generally, rewrite Tornado RequestHandler's prepare(self) and on_finish(self) to persist session data is recommended. + when this value set to True, session data will be force to persist everytime when it has any change. + + """ + session_settings = self.handler.settings.get("session") + if not session_settings: # use default + session_settings = {} + session_settings.update(driver='memory', driver_settings={'host':self.handler.application}, force_persistence=True, cache_driver=True) + driver = session_settings.get("driver") + if not driver: + raise SessionConfigurationError('driver is missed') + self.settings = session_settings + + def __get_session_object_from_driver(self, session_id): + """ + Get session data from driver. + """ + return self.driver.get(session_id) + + def get(self, key, default=None): + ''' + Return session value with name as key. + ''' + self._is_dirty = True + return self.session.get(key, default) + + def set(self, key, value): + ''' + Add/Update session value + ''' + self.session[key]=value + self._is_dirty = True + force_update = self.settings.get("force_persistence") + if force_update: + self.driver.save(self._id, self.session, self._expires) + self._is_dirty = False + + def delete(self, key): + ''' + Delete session key-value pair + ''' + if self.session.has_key(key): + del self.session[key] + self._is_dirty = True + force_update = self.settings.get("force_persistence") + if force_update: + self.driver.save(self._id, self.session, self._expires) + self._is_dirty = False + __deleteitem__ = delete + + def iterkeys(self): + return iter(self.session) + __iter__ = iterkeys + + def keys(self): + ''' + Return all keys in session object + ''' + return self.session.keys() + + def flush(self): + """ + this method force system to do session data persistence. + """ + if self._is_dirty: + self.driver.save(self._id, self.session, self._expires) + + def __setitem__(self, key, value): + self.set(key, value) + + def __getitem__(self, key): + val = self.get(key) + if val: return val + raise KeyError('%s not found' % key) + + def __contains__(self, key): + ''' + ''' + return key in self.session + + @property + def id(self): + ''' + Return current session id + ''' + if not hasattr(self, '_id'): + self.__init_session_object() + return self._id + + @property + def expires(self): + """ + The session object lifetime on server. + this property could not be used to cookie expires setting. + """ + if not hasattr(self, '_expires'): + self.__init_session_object() + return self._expires + + # def __generate_session_id(self): + # ''' + # Generate unique session id by uuid4 + # ''' + # session_id = uuid4().hex + # self.handler.set_cookie(self.SESSION_ID, + # session_id, + # **self.__session_settings()) + # return session_id + + def __session_settings(self): + session_settings = self.settings.get('cookie_config', {}) + session_settings.setdefault('expires', None) + session_settings.setdefault('expires_days', None) + return session_settings + + # def __retrieve_current_session_id(self): + # session_id = self.handler.get_cookie(self.SESSION_ID) + # if session_id:return session_id + # return self.__generate_session_id() + +class SessionMixin(object): + ''' + ''' + + @property + def session(self): + ''' + ''' + return self._create_mixin(self, '__session_manager', SessionManager) + + def _create_mixin(self, context, inner_property_name, session_handler): + if not hasattr(context, inner_property_name): + setattr(context, inner_property_name, session_handler(context)) + return getattr(context, inner_property_name) + +class SessionConfigurationError(Exception): + pass diff --git a/extends/torndsession/sessionhandler.py b/extends/torndsession/sessionhandler.py new file mode 100644 index 0000000..c4cdff6 --- /dev/null +++ b/extends/torndsession/sessionhandler.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright @ 2014 Mitchell Chu + +import tornado.web +import extends.torndsession.session + +class SessionBaseHandler(tornado.web.RequestHandler, extends.torndsession.session.SessionMixin): + """ + This is a tornado web request handler which is base on torndsession. + Generally, user must persistent session object with manual operation when force_persistence is False + but when the handler is inherit from SessionBaseHandler, in your handler, you just need to add/update/delete session values, SessionBaseHandler will auto save it. + """ + + def prepare(self): + """ + Overwrite tornado.web.RequestHandler prepare. + """ + pass + + def on_finish(self): + """ + Overwrite tornado.web.RequestHandler on_finish. + """ + self.session.flush() # try to save session diff --git a/extends/torndsession/test/TEST_DIRECTORY b/extends/torndsession/test/TEST_DIRECTORY new file mode 100644 index 0000000..8d1c8b6 --- /dev/null +++ b/extends/torndsession/test/TEST_DIRECTORY @@ -0,0 +1 @@ + diff --git a/main.py b/main.py new file mode 100755 index 0000000..2f1d2c6 --- /dev/null +++ b/main.py @@ -0,0 +1,97 @@ +#!/usr/bin/python +import tornado.ioloop +import tornado.web, tornado.options +import motor, sys, os, yaml +from concurrent import futures +import controller.base + +tornado.options.define("port", default=8765, help="Run server on a specific port", type=int) +tornado.options.define("host", default="localhost", help="Run server on a specific host") +tornado.options.parse_command_line() + +setting = { + "base_url": "http://%s" % (tornado.options.options.host, ), + "template_path": "templates", + "cookie_secret": "s3cr3tk3y", + "config_filename": "config.yaml", + "compress_response": True, + "default_handler_class": controller.base.NotFoundHandler, + "debug": True, + "xsrf_cookies": True, + "static_path": "static", + "download": "./download", + "session": { + "driver": "redis", + "driver_settings": { + "host": "localhost", + "port": 6379, + "db": 1 + }, + "force_persistence": False, + "cache_driver": True, + "cookie_config": { + "httponly": True + }, + }, + "thread_pool": futures.ThreadPoolExecutor(4) +} + +# config file +config = {} +try: + with open(setting["config_filename"], "r") as fin: + config = yaml.load(fin) + for k, v in config["global"].items(): + setting[k] = v + if "session" in config: + setting["session"]["driver_settings"] = config["session"] +except: + print "cannot found config.yaml file" + sys.exit(0) + +# mongodb connection +# format: mongodb://user:pass@host:port/ +# database name: minos + +try: + client = motor.MotorClient(config["database"]["config"]) + database = client[config["database"]["db"]] + setting["database"] = database +except: + print "cannot connect mongodb, check the config.yaml" + sys.exit(0) + +application = tornado.web.Application([ + (r"^/public/post/([a-f0-9]{24})", "controller.open.PostHandler"), + (r"^/public/list(/(\d*))?", "controller.open.ListHandler"), + (r"^/(page/(\d+))?", "controller.main.HomeHandler"), + (r"^/login", "controller.auth.LoginHandler"), + (r"^/register", "controller.auth.RegisterHandler"), + (r"^/nologin/([a-z]+)", "controller.auth.AjaxHandler"), + (r"^/forgetpwd", "controller.auth.ForgetpwdHandler"), + (r"^/captcha\.png", "controller.auth.CaptchaHanlder"), + (r"^/user/([a-z]+)(/(.*))?", "controller.user.UserHandler"), + (r"^/admin/([a-z]+)?", "controller.admin.AdminHandler"), + (r"^/publish", "controller.publish.PublishHandler"), + (r"^/edit/([a-f0-9]{24})", "controller.publish.EditHandler"), + (r"^/uploader", "controller.publish.UploadHandler"), + (r"^/post/([a-f0-9]{24})", "controller.post.PostHandler"), + (r"^/ajax/([a-z]+)", "controller.ajax.AjaxHandler"), + (r"^/sort/([a-f0-9]{24})(/(\d+))?", "controller.sort.SortHandler"), + (r"^/search(/(\d+))?", "controller.search.SearchHandler"), + (r"^/buy", "controller.post.BuyHandler"), + (r"^/message(/(\d+))?", "controller.message.MessageHandler"), + (r"^/message/([a-f0-9]{24})", "controller.message.DetailHandler"), + (r"^/manage/([a-z]+)(/(.*))?", "controller.dashboard.AdminHandler"), + (r"^/download/(.*)", "controller.download.DownloadHandler", {"path": "./download/"}) +], **setting) + +if __name__ == "__main__": + try: + application.listen(tornado.options.options.port) + tornado.ioloop.IOLoop.instance().start() + except: + import traceback + print traceback.print_exc() + finally: + sys.exit(0) \ No newline at end of file diff --git a/model/__init__.py b/model/__init__.py new file mode 100644 index 0000000..0aba571 --- /dev/null +++ b/model/__init__.py @@ -0,0 +1 @@ +__author__ = 'phithon' diff --git a/model/article.py b/model/article.py new file mode 100644 index 0000000..7a7c831 --- /dev/null +++ b/model/article.py @@ -0,0 +1,40 @@ +#coding=utf-8 +__author__ = 'phithon' +from model.base import BaseModel + +class ArticleModel(BaseModel): + __table__ = "article" + __invalid__ = { + "title": { + "_name": "标题", + "type": unicode, + "max_length": 200, + "min_length": 1 + }, + "charge": { + "_name": "金币数值", + "type": int, + "min": 0, + "max": 100 + }, + "freebegin": { + "_name": "开始时间", + "type": int, + "min": 0, + "max": 24 + }, + "freeend": { + "_name": "结束时间", + "type": int, + "min": 0, + "max": 24 + } + } + __msg__ = { + "type": "%s类型错误", + "max_length": "%s长度太长", + "min_length": "%s长度太短", + "max": "%s过大", + "min": "%s过小" + } + error_msg = "" \ No newline at end of file diff --git a/model/base.py b/model/base.py new file mode 100644 index 0000000..ac0ad34 --- /dev/null +++ b/model/base.py @@ -0,0 +1,47 @@ +__author__ = 'phithon' +import re + +class BaseModel: + def __call__(self, *args, **kwargs): + data = args[0] + for (k, value) in data.items(): + if k not in self.__invalid__: + continue + if (not value) and ("_need" not in self.__invalid__[k]): + continue + for (field, limit) in self.__invalid__[k].items(): + if field[0] == "_": continue + func = "_check_%s" % field + if hasattr(self, func): + ret = getattr(self, func)(limit, value) + if not ret: + self.error_msg = self.__msg__[field] % self.__invalid__[k]["_name"] + return False + return True + + def _check_type(self, valid, value): + return type(value) is valid + + def _check_max_length(self, valid, value): + return len(value) <= valid + + def _check_min_length(self, valid, value): + return len(value) >= valid + + def _check_max(self, valid, value): + return value <= valid + + def _check_min(self, valid, value): + return value >= valid + + def _check_email(self, valid, value): + return re.match(r"^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$", value) + + def _check_number(self, valid, value): + return re.match(r"^\d+$", value) + + def _check_url(self, valid, value): + return value.startswith("http://") or value.startswith("https://") + + def _check_pattern(self, valid, value): + return re.match(valid, value) \ No newline at end of file diff --git a/model/sort.py b/model/sort.py new file mode 100644 index 0000000..93a4f02 --- /dev/null +++ b/model/sort.py @@ -0,0 +1,31 @@ +#coding=utf-8 +__author__ = 'phithon' +from model.base import BaseModel +try: + type(u"a") is unicode +except: + # PY3 + unicode = str + +class SortModel(BaseModel): + __table__ = "sort" + __invalid__ = { + "username": { + "_name": "板块名称", + "_need": True, + "type": unicode, + "max_length": 16, + "min_length": 1 + }, + "intro": { + "_name": "板块说明", + "type": unicode, + "max_length": 512 + } + } + __msg__ = { + "type": "%s类型错误", + "max_length": "%s长度太长", + "min_length": "%s长度太短" + } + error_msg = "" \ No newline at end of file diff --git a/model/user.py b/model/user.py new file mode 100644 index 0000000..a82d328 --- /dev/null +++ b/model/user.py @@ -0,0 +1,67 @@ +#coding=utf-8 +__author__ = 'phithon' +from model.base import BaseModel +try: + type(u"a") is unicode +except: + # PY3 + unicode = str + +class UserModel(BaseModel): + __table__ = "member" + __invalid__ = { + "username": { + "_name": "用户名", + "_need": True, + "type": unicode, + "max_length": 36, + "min_length": 1, + "pattern": ur"^[a-zA-Z0-9_\-\u4e00-\u9fa5]+$" + }, + "money": { + "_name": "金币", + "type": int, + "min": 0 + }, + "email": { + "_name": "Email", + "type": unicode, + "max_length": 64, + "email": True + }, + "website": { + "_name": "个人主页", + "type": unicode, + "max_length": 128, + "url": True + }, + "address": { + "_name": "地址", + "type": unicode, + "max_length": 256 + }, + "signal": { + "_name": "签名", + "type": unicode, + "max_length": 512 + }, + "qq": { + "_name": "QQ", + "type": unicode, + "max_length": 16, + "min_length": 5, + "number": True + } + } + __msg__ = { + "type": "%s类型错误", + "max_length": "%s长度太长", + "min_length": "%s长度太短", + "max": "%s过大", + "min": "%s过小", + "email": "%s格式错误", + "number": "%s必须是数字", + "url": "%s格式错误", + "pattern": "%s格式错误" + } + error_msg = "" \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..85c65c2 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,17 @@ +--index-url http://pypi.douban.com/simple/redis/ +--extra-index-url http://mirrors.aliyun.com/pypi/simple/ +--allow-external PIL +--allow-unverified PIL +tornado>=4.1 +motor>=0.4 +requests>=2.5.3 +rq>=0.5.0 +redis>=2.10.3 +pymongo==2.8.0 +bcrypt>=1.1.1 +pyyaml>=3.11 +PIL>=1.1.7 +wheezy.captcha>=0.1.44 +futures>=2.2.0 +xxtea>=0.2.1 +pycurl \ No newline at end of file diff --git a/static/assets/ZeroClipboard/ZeroClipboard.min.js b/static/assets/ZeroClipboard/ZeroClipboard.min.js new file mode 100755 index 0000000..6ecd088 --- /dev/null +++ b/static/assets/ZeroClipboard/ZeroClipboard.min.js @@ -0,0 +1,10 @@ +/*! + * ZeroClipboard + * The ZeroClipboard library provides an easy way to copy text to the clipboard using an invisible Adobe Flash movie and a JavaScript interface. + * Copyright (c) 2009-2014 Jon Rohan, James M. Greene + * Licensed MIT + * http://zeroclipboard.org/ + * v2.2.0 + */ +!function(a,b){"use strict";var c,d,e,f=a,g=f.document,h=f.navigator,i=f.setTimeout,j=f.clearTimeout,k=f.setInterval,l=f.clearInterval,m=f.getComputedStyle,n=f.encodeURIComponent,o=f.ActiveXObject,p=f.Error,q=f.Number.parseInt||f.parseInt,r=f.Number.parseFloat||f.parseFloat,s=f.Number.isNaN||f.isNaN,t=f.Date.now,u=f.Object.keys,v=f.Object.defineProperty,w=f.Object.prototype.hasOwnProperty,x=f.Array.prototype.slice,y=function(){var a=function(a){return a};if("function"==typeof f.wrap&&"function"==typeof f.unwrap)try{var b=g.createElement("div"),c=f.unwrap(b);1===b.nodeType&&c&&1===c.nodeType&&(a=f.unwrap)}catch(d){}return a}(),z=function(a){return x.call(a,0)},A=function(){var a,c,d,e,f,g,h=z(arguments),i=h[0]||{};for(a=1,c=h.length;c>a;a++)if(null!=(d=h[a]))for(e in d)w.call(d,e)&&(f=i[e],g=d[e],i!==g&&g!==b&&(i[e]=g));return i},B=function(a){var b,c,d,e;if("object"!=typeof a||null==a||"number"==typeof a.nodeType)b=a;else if("number"==typeof a.length)for(b=[],c=0,d=a.length;d>c;c++)w.call(a,c)&&(b[c]=B(a[c]));else{b={};for(e in a)w.call(a,e)&&(b[e]=B(a[e]))}return b},C=function(a,b){for(var c={},d=0,e=b.length;e>d;d++)b[d]in a&&(c[b[d]]=a[b[d]]);return c},D=function(a,b){var c={};for(var d in a)-1===b.indexOf(d)&&(c[d]=a[d]);return c},E=function(a){if(a)for(var b in a)w.call(a,b)&&delete a[b];return a},F=function(a,b){if(a&&1===a.nodeType&&a.ownerDocument&&b&&(1===b.nodeType&&b.ownerDocument&&b.ownerDocument===a.ownerDocument||9===b.nodeType&&!b.ownerDocument&&b===a.ownerDocument))do{if(a===b)return!0;a=a.parentNode}while(a);return!1},G=function(a){var b;return"string"==typeof a&&a&&(b=a.split("#")[0].split("?")[0],b=a.slice(0,a.lastIndexOf("/")+1)),b},H=function(a){var b,c;return"string"==typeof a&&a&&(c=a.match(/^(?:|[^:@]*@|.+\)@(?=http[s]?|file)|.+?\s+(?: at |@)(?:[^:\(]+ )*[\(]?)((?:http[s]?|file):\/\/[\/]?.+?\/[^:\)]*?)(?::\d+)(?::\d+)?/),c&&c[1]?b=c[1]:(c=a.match(/\)@((?:http[s]?|file):\/\/[\/]?.+?\/[^:\)]*?)(?::\d+)(?::\d+)?/),c&&c[1]&&(b=c[1]))),b},I=function(){var a,b;try{throw new p}catch(c){b=c}return b&&(a=b.sourceURL||b.fileName||H(b.stack)),a},J=function(){var a,c,d;if(g.currentScript&&(a=g.currentScript.src))return a;if(c=g.getElementsByTagName("script"),1===c.length)return c[0].src||b;if("readyState"in c[0])for(d=c.length;d--;)if("interactive"===c[d].readyState&&(a=c[d].src))return a;return"loading"===g.readyState&&(a=c[c.length-1].src)?a:(a=I())?a:b},K=function(){var a,c,d,e=g.getElementsByTagName("script");for(a=e.length;a--;){if(!(d=e[a].src)){c=null;break}if(d=G(d),null==c)c=d;else if(c!==d){c=null;break}}return c||b},L=function(){var a=G(J())||K()||"";return a+"ZeroClipboard.swf"},M=function(){return null==a.opener&&(!!a.top&&a!=a.top||!!a.parent&&a!=a.parent)}(),N={bridge:null,version:"0.0.0",pluginType:"unknown",disabled:null,outdated:null,sandboxed:null,unavailable:null,degraded:null,deactivated:null,overdue:null,ready:null},O="11.0.0",P={},Q={},R=null,S=0,T=0,U={ready:"Flash communication is established",error:{"flash-disabled":"Flash is disabled or not installed. May also be attempting to run Flash in a sandboxed iframe, which is impossible.","flash-outdated":"Flash is too outdated to support ZeroClipboard","flash-sandboxed":"Attempting to run Flash in a sandboxed iframe, which is impossible","flash-unavailable":"Flash is unable to communicate bidirectionally with JavaScript","flash-degraded":"Flash is unable to preserve data fidelity when communicating with JavaScript","flash-deactivated":"Flash is too outdated for your browser and/or is configured as click-to-activate.\nThis may also mean that the ZeroClipboard SWF object could not be loaded, so please check your `swfPath` configuration and/or network connectivity.\nMay also be attempting to run Flash in a sandboxed iframe, which is impossible.","flash-overdue":"Flash communication was established but NOT within the acceptable time limit","version-mismatch":"ZeroClipboard JS version number does not match ZeroClipboard SWF version number","clipboard-error":"At least one error was thrown while ZeroClipboard was attempting to inject your data into the clipboard","config-mismatch":"ZeroClipboard configuration does not match Flash's reality","swf-not-found":"The ZeroClipboard SWF object could not be loaded, so please check your `swfPath` configuration and/or network connectivity"}},V=["flash-unavailable","flash-degraded","flash-overdue","version-mismatch","config-mismatch","clipboard-error"],W=["flash-disabled","flash-outdated","flash-sandboxed","flash-unavailable","flash-degraded","flash-deactivated","flash-overdue"],X=new RegExp("^flash-("+W.map(function(a){return a.replace(/^flash-/,"")}).join("|")+")$"),Y=new RegExp("^flash-("+W.slice(1).map(function(a){return a.replace(/^flash-/,"")}).join("|")+")$"),Z={swfPath:L(),trustedDomains:a.location.host?[a.location.host]:[],cacheBust:!0,forceEnhancedClipboard:!1,flashLoadTimeout:3e4,autoActivate:!0,bubbleEvents:!0,containerId:"global-zeroclipboard-html-bridge",containerClass:"global-zeroclipboard-container",swfObjectId:"global-zeroclipboard-flash-bridge",hoverClass:"zeroclipboard-is-hover",activeClass:"zeroclipboard-is-active",forceHandCursor:!1,title:null,zIndex:999999999},$=function(a){if("object"==typeof a&&null!==a)for(var b in a)if(w.call(a,b))if(/^(?:forceHandCursor|title|zIndex|bubbleEvents)$/.test(b))Z[b]=a[b];else if(null==N.bridge)if("containerId"===b||"swfObjectId"===b){if(!nb(a[b]))throw new Error("The specified `"+b+"` value is not valid as an HTML4 Element ID");Z[b]=a[b]}else Z[b]=a[b];{if("string"!=typeof a||!a)return B(Z);if(w.call(Z,a))return Z[a]}},_=function(){return Tb(),{browser:C(h,["userAgent","platform","appName"]),flash:D(N,["bridge"]),zeroclipboard:{version:Vb.version,config:Vb.config()}}},ab=function(){return!!(N.disabled||N.outdated||N.sandboxed||N.unavailable||N.degraded||N.deactivated)},bb=function(a,d){var e,f,g,h={};if("string"==typeof a&&a)g=a.toLowerCase().split(/\s+/);else if("object"==typeof a&&a&&"undefined"==typeof d)for(e in a)w.call(a,e)&&"string"==typeof e&&e&&"function"==typeof a[e]&&Vb.on(e,a[e]);if(g&&g.length){for(e=0,f=g.length;f>e;e++)a=g[e].replace(/^on/,""),h[a]=!0,P[a]||(P[a]=[]),P[a].push(d);if(h.ready&&N.ready&&Vb.emit({type:"ready"}),h.error){for(e=0,f=W.length;f>e;e++)if(N[W[e].replace(/^flash-/,"")]===!0){Vb.emit({type:"error",name:W[e]});break}c!==b&&Vb.version!==c&&Vb.emit({type:"error",name:"version-mismatch",jsVersion:Vb.version,swfVersion:c})}}return Vb},cb=function(a,b){var c,d,e,f,g;if(0===arguments.length)f=u(P);else if("string"==typeof a&&a)f=a.split(/\s+/);else if("object"==typeof a&&a&&"undefined"==typeof b)for(c in a)w.call(a,c)&&"string"==typeof c&&c&&"function"==typeof a[c]&&Vb.off(c,a[c]);if(f&&f.length)for(c=0,d=f.length;d>c;c++)if(a=f[c].toLowerCase().replace(/^on/,""),g=P[a],g&&g.length)if(b)for(e=g.indexOf(b);-1!==e;)g.splice(e,1),e=g.indexOf(b,e);else g.length=0;return Vb},db=function(a){var b;return b="string"==typeof a&&a?B(P[a])||null:B(P)},eb=function(a){var b,c,d;return a=ob(a),a&&!vb(a)?"ready"===a.type&&N.overdue===!0?Vb.emit({type:"error",name:"flash-overdue"}):(b=A({},a),tb.call(this,b),"copy"===a.type&&(d=Db(Q),c=d.data,R=d.formatMap),c):void 0},fb=function(){var a=N.sandboxed;if(Tb(),"boolean"!=typeof N.ready&&(N.ready=!1),N.sandboxed!==a&&N.sandboxed===!0)N.ready=!1,Vb.emit({type:"error",name:"flash-sandboxed"});else if(!Vb.isFlashUnusable()&&null===N.bridge){var b=Z.flashLoadTimeout;"number"==typeof b&&b>=0&&(S=i(function(){"boolean"!=typeof N.deactivated&&(N.deactivated=!0),N.deactivated===!0&&Vb.emit({type:"error",name:"flash-deactivated"})},b)),N.overdue=!1,Bb()}},gb=function(){Vb.clearData(),Vb.blur(),Vb.emit("destroy"),Cb(),Vb.off()},hb=function(a,b){var c;if("object"==typeof a&&a&&"undefined"==typeof b)c=a,Vb.clearData();else{if("string"!=typeof a||!a)return;c={},c[a]=b}for(var d in c)"string"==typeof d&&d&&w.call(c,d)&&"string"==typeof c[d]&&c[d]&&(Q[d]=c[d])},ib=function(a){"undefined"==typeof a?(E(Q),R=null):"string"==typeof a&&w.call(Q,a)&&delete Q[a]},jb=function(a){return"undefined"==typeof a?B(Q):"string"==typeof a&&w.call(Q,a)?Q[a]:void 0},kb=function(a){if(a&&1===a.nodeType){d&&(Lb(d,Z.activeClass),d!==a&&Lb(d,Z.hoverClass)),d=a,Kb(a,Z.hoverClass);var b=a.getAttribute("title")||Z.title;if("string"==typeof b&&b){var c=Ab(N.bridge);c&&c.setAttribute("title",b)}var e=Z.forceHandCursor===!0||"pointer"===Mb(a,"cursor");Rb(e),Qb()}},lb=function(){var a=Ab(N.bridge);a&&(a.removeAttribute("title"),a.style.left="0px",a.style.top="-9999px",a.style.width="1px",a.style.height="1px"),d&&(Lb(d,Z.hoverClass),Lb(d,Z.activeClass),d=null)},mb=function(){return d||null},nb=function(a){return"string"==typeof a&&a&&/^[A-Za-z][A-Za-z0-9_:\-\.]*$/.test(a)},ob=function(a){var b;if("string"==typeof a&&a?(b=a,a={}):"object"==typeof a&&a&&"string"==typeof a.type&&a.type&&(b=a.type),b){b=b.toLowerCase(),!a.target&&(/^(copy|aftercopy|_click)$/.test(b)||"error"===b&&"clipboard-error"===a.name)&&(a.target=e),A(a,{type:b,target:a.target||d||null,relatedTarget:a.relatedTarget||null,currentTarget:N&&N.bridge||null,timeStamp:a.timeStamp||t()||null});var c=U[a.type];return"error"===a.type&&a.name&&c&&(c=c[a.name]),c&&(a.message=c),"ready"===a.type&&A(a,{target:null,version:N.version}),"error"===a.type&&(X.test(a.name)&&A(a,{target:null,minimumVersion:O}),Y.test(a.name)&&A(a,{version:N.version})),"copy"===a.type&&(a.clipboardData={setData:Vb.setData,clearData:Vb.clearData}),"aftercopy"===a.type&&(a=Eb(a,R)),a.target&&!a.relatedTarget&&(a.relatedTarget=pb(a.target)),qb(a)}},pb=function(a){var b=a&&a.getAttribute&&a.getAttribute("data-clipboard-target");return b?g.getElementById(b):null},qb=function(a){if(a&&/^_(?:click|mouse(?:over|out|down|up|move))$/.test(a.type)){var c=a.target,d="_mouseover"===a.type&&a.relatedTarget?a.relatedTarget:b,e="_mouseout"===a.type&&a.relatedTarget?a.relatedTarget:b,h=Nb(c),i=f.screenLeft||f.screenX||0,j=f.screenTop||f.screenY||0,k=g.body.scrollLeft+g.documentElement.scrollLeft,l=g.body.scrollTop+g.documentElement.scrollTop,m=h.left+("number"==typeof a._stageX?a._stageX:0),n=h.top+("number"==typeof a._stageY?a._stageY:0),o=m-k,p=n-l,q=i+o,r=j+p,s="number"==typeof a.movementX?a.movementX:0,t="number"==typeof a.movementY?a.movementY:0;delete a._stageX,delete a._stageY,A(a,{srcElement:c,fromElement:d,toElement:e,screenX:q,screenY:r,pageX:m,pageY:n,clientX:o,clientY:p,x:o,y:p,movementX:s,movementY:t,offsetX:0,offsetY:0,layerX:0,layerY:0})}return a},rb=function(a){var b=a&&"string"==typeof a.type&&a.type||"";return!/^(?:(?:before)?copy|destroy)$/.test(b)},sb=function(a,b,c,d){d?i(function(){a.apply(b,c)},0):a.apply(b,c)},tb=function(a){if("object"==typeof a&&a&&a.type){var b=rb(a),c=P["*"]||[],d=P[a.type]||[],e=c.concat(d);if(e&&e.length){var g,h,i,j,k,l=this;for(g=0,h=e.length;h>g;g++)i=e[g],j=l,"string"==typeof i&&"function"==typeof f[i]&&(i=f[i]),"object"==typeof i&&i&&"function"==typeof i.handleEvent&&(j=i,i=i.handleEvent),"function"==typeof i&&(k=A({},a),sb(i,j,[k],b))}return this}},ub=function(a){var b=null;return(M===!1||a&&"error"===a.type&&a.name&&-1!==V.indexOf(a.name))&&(b=!1),b},vb=function(a){var b=a.target||d||null,f="swf"===a._source;switch(delete a._source,a.type){case"error":var g="flash-sandboxed"===a.name||ub(a);"boolean"==typeof g&&(N.sandboxed=g),-1!==W.indexOf(a.name)?A(N,{disabled:"flash-disabled"===a.name,outdated:"flash-outdated"===a.name,unavailable:"flash-unavailable"===a.name,degraded:"flash-degraded"===a.name,deactivated:"flash-deactivated"===a.name,overdue:"flash-overdue"===a.name,ready:!1}):"version-mismatch"===a.name&&(c=a.swfVersion,A(N,{disabled:!1,outdated:!1,unavailable:!1,degraded:!1,deactivated:!1,overdue:!1,ready:!1})),Pb();break;case"ready":c=a.swfVersion;var h=N.deactivated===!0;A(N,{disabled:!1,outdated:!1,sandboxed:!1,unavailable:!1,degraded:!1,deactivated:!1,overdue:h,ready:!h}),Pb();break;case"beforecopy":e=b;break;case"copy":var i,j,k=a.relatedTarget;!Q["text/html"]&&!Q["text/plain"]&&k&&(j=k.value||k.outerHTML||k.innerHTML)&&(i=k.value||k.textContent||k.innerText)?(a.clipboardData.clearData(),a.clipboardData.setData("text/plain",i),j!==i&&a.clipboardData.setData("text/html",j)):!Q["text/plain"]&&a.target&&(i=a.target.getAttribute("data-clipboard-text"))&&(a.clipboardData.clearData(),a.clipboardData.setData("text/plain",i));break;case"aftercopy":wb(a),Vb.clearData(),b&&b!==Jb()&&b.focus&&b.focus();break;case"_mouseover":Vb.focus(b),Z.bubbleEvents===!0&&f&&(b&&b!==a.relatedTarget&&!F(a.relatedTarget,b)&&xb(A({},a,{type:"mouseenter",bubbles:!1,cancelable:!1})),xb(A({},a,{type:"mouseover"})));break;case"_mouseout":Vb.blur(),Z.bubbleEvents===!0&&f&&(b&&b!==a.relatedTarget&&!F(a.relatedTarget,b)&&xb(A({},a,{type:"mouseleave",bubbles:!1,cancelable:!1})),xb(A({},a,{type:"mouseout"})));break;case"_mousedown":Kb(b,Z.activeClass),Z.bubbleEvents===!0&&f&&xb(A({},a,{type:a.type.slice(1)}));break;case"_mouseup":Lb(b,Z.activeClass),Z.bubbleEvents===!0&&f&&xb(A({},a,{type:a.type.slice(1)}));break;case"_click":e=null,Z.bubbleEvents===!0&&f&&xb(A({},a,{type:a.type.slice(1)}));break;case"_mousemove":Z.bubbleEvents===!0&&f&&xb(A({},a,{type:a.type.slice(1)}))}return/^_(?:click|mouse(?:over|out|down|up|move))$/.test(a.type)?!0:void 0},wb=function(a){if(a.errors&&a.errors.length>0){var b=B(a);A(b,{type:"error",name:"clipboard-error"}),delete b.success,i(function(){Vb.emit(b)},0)}},xb=function(a){if(a&&"string"==typeof a.type&&a){var b,c=a.target||null,d=c&&c.ownerDocument||g,e={view:d.defaultView||f,canBubble:!0,cancelable:!0,detail:"click"===a.type?1:0,button:"number"==typeof a.which?a.which-1:"number"==typeof a.button?a.button:d.createEvent?0:1},h=A(e,a);c&&d.createEvent&&c.dispatchEvent&&(h=[h.type,h.canBubble,h.cancelable,h.view,h.detail,h.screenX,h.screenY,h.clientX,h.clientY,h.ctrlKey,h.altKey,h.shiftKey,h.metaKey,h.button,h.relatedTarget],b=d.createEvent("MouseEvents"),b.initMouseEvent&&(b.initMouseEvent.apply(b,h),b._source="js",c.dispatchEvent(b)))}},yb=function(){var a=Z.flashLoadTimeout;if("number"==typeof a&&a>=0){var b=Math.min(1e3,a/10),c=Z.swfObjectId+"_fallbackContent";T=k(function(){var a=g.getElementById(c);Ob(a)&&(Pb(),N.deactivated=null,Vb.emit({type:"error",name:"swf-not-found"}))},b)}},zb=function(){var a=g.createElement("div");return a.id=Z.containerId,a.className=Z.containerClass,a.style.position="absolute",a.style.left="0px",a.style.top="-9999px",a.style.width="1px",a.style.height="1px",a.style.zIndex=""+Sb(Z.zIndex),a},Ab=function(a){for(var b=a&&a.parentNode;b&&"OBJECT"===b.nodeName&&b.parentNode;)b=b.parentNode;return b||null},Bb=function(){var a,b=N.bridge,c=Ab(b);if(!b){var d=Ib(f.location.host,Z),e="never"===d?"none":"all",h=Gb(A({jsVersion:Vb.version},Z)),i=Z.swfPath+Fb(Z.swfPath,Z);c=zb();var j=g.createElement("div");c.appendChild(j),g.body.appendChild(c);var k=g.createElement("div"),l="activex"===N.pluginType;k.innerHTML='"+(l?'':"")+'
     
    ',b=k.firstChild,k=null,y(b).ZeroClipboard=Vb,c.replaceChild(b,j),yb()}return b||(b=g[Z.swfObjectId],b&&(a=b.length)&&(b=b[a-1]),!b&&c&&(b=c.firstChild)),N.bridge=b||null,b},Cb=function(){var a=N.bridge;if(a){var d=Ab(a);d&&("activex"===N.pluginType&&"readyState"in a?(a.style.display="none",function e(){if(4===a.readyState){for(var b in a)"function"==typeof a[b]&&(a[b]=null);a.parentNode&&a.parentNode.removeChild(a),d.parentNode&&d.parentNode.removeChild(d)}else i(e,10)}()):(a.parentNode&&a.parentNode.removeChild(a),d.parentNode&&d.parentNode.removeChild(d))),Pb(),N.ready=null,N.bridge=null,N.deactivated=null,c=b}},Db=function(a){var b={},c={};if("object"==typeof a&&a){for(var d in a)if(d&&w.call(a,d)&&"string"==typeof a[d]&&a[d])switch(d.toLowerCase()){case"text/plain":case"text":case"air:text":case"flash:text":b.text=a[d],c.text=d;break;case"text/html":case"html":case"air:html":case"flash:html":b.html=a[d],c.html=d;break;case"application/rtf":case"text/rtf":case"rtf":case"richtext":case"air:rtf":case"flash:rtf":b.rtf=a[d],c.rtf=d}return{data:b,formatMap:c}}},Eb=function(a,b){if("object"!=typeof a||!a||"object"!=typeof b||!b)return a;var c={};for(var d in a)if(w.call(a,d))if("errors"===d){c[d]=a[d]?a[d].slice():[];for(var e=0,f=c[d].length;f>e;e++)c[d][e].format=b[c[d][e].format]}else if("success"!==d&&"data"!==d)c[d]=a[d];else{c[d]={};var g=a[d];for(var h in g)h&&w.call(g,h)&&w.call(b,h)&&(c[d][b[h]]=g[h])}return c},Fb=function(a,b){var c=null==b||b&&b.cacheBust===!0;return c?(-1===a.indexOf("?")?"?":"&")+"noCache="+t():""},Gb=function(a){var b,c,d,e,g="",h=[];if(a.trustedDomains&&("string"==typeof a.trustedDomains?e=[a.trustedDomains]:"object"==typeof a.trustedDomains&&"length"in a.trustedDomains&&(e=a.trustedDomains)),e&&e.length)for(b=0,c=e.length;c>b;b++)if(w.call(e,b)&&e[b]&&"string"==typeof e[b]){if(d=Hb(e[b]),!d)continue;if("*"===d){h.length=0,h.push(d);break}h.push.apply(h,[d,"//"+d,f.location.protocol+"//"+d])}return h.length&&(g+="trustedOrigins="+n(h.join(","))),a.forceEnhancedClipboard===!0&&(g+=(g?"&":"")+"forceEnhancedClipboard=true"),"string"==typeof a.swfObjectId&&a.swfObjectId&&(g+=(g?"&":"")+"swfObjectId="+n(a.swfObjectId)),"string"==typeof a.jsVersion&&a.jsVersion&&(g+=(g?"&":"")+"jsVersion="+n(a.jsVersion)),g},Hb=function(a){if(null==a||""===a)return null;if(a=a.replace(/^\s+|\s+$/g,""),""===a)return null;var b=a.indexOf("//");a=-1===b?a:a.slice(b+2);var c=a.indexOf("/");return a=-1===c?a:-1===b||0===c?null:a.slice(0,c),a&&".swf"===a.slice(-4).toLowerCase()?null:a||null},Ib=function(){var a=function(a){var b,c,d,e=[];if("string"==typeof a&&(a=[a]),"object"!=typeof a||!a||"number"!=typeof a.length)return e;for(b=0,c=a.length;c>b;b++)if(w.call(a,b)&&(d=Hb(a[b]))){if("*"===d){e.length=0,e.push("*");break}-1===e.indexOf(d)&&e.push(d)}return e};return function(b,c){var d=Hb(c.swfPath);null===d&&(d=b);var e=a(c.trustedDomains),f=e.length;if(f>0){if(1===f&&"*"===e[0])return"always";if(-1!==e.indexOf(b))return 1===f&&b===d?"sameDomain":"always"}return"never"}}(),Jb=function(){try{return g.activeElement}catch(a){return null}},Kb=function(a,b){var c,d,e,f=[];if("string"==typeof b&&b&&(f=b.split(/\s+/)),a&&1===a.nodeType&&f.length>0)if(a.classList)for(c=0,d=f.length;d>c;c++)a.classList.add(f[c]);else if(a.hasOwnProperty("className")){for(e=" "+a.className+" ",c=0,d=f.length;d>c;c++)-1===e.indexOf(" "+f[c]+" ")&&(e+=f[c]+" ");a.className=e.replace(/^\s+|\s+$/g,"")}return a},Lb=function(a,b){var c,d,e,f=[];if("string"==typeof b&&b&&(f=b.split(/\s+/)),a&&1===a.nodeType&&f.length>0)if(a.classList&&a.classList.length>0)for(c=0,d=f.length;d>c;c++)a.classList.remove(f[c]);else if(a.className){for(e=(" "+a.className+" ").replace(/[\r\n\t]/g," "),c=0,d=f.length;d>c;c++)e=e.replace(" "+f[c]+" "," ");a.className=e.replace(/^\s+|\s+$/g,"")}return a},Mb=function(a,b){var c=m(a,null).getPropertyValue(b);return"cursor"!==b||c&&"auto"!==c||"A"!==a.nodeName?c:"pointer"},Nb=function(a){var b={left:0,top:0,width:0,height:0};if(a.getBoundingClientRect){var c=a.getBoundingClientRect(),d=f.pageXOffset,e=f.pageYOffset,h=g.documentElement.clientLeft||0,i=g.documentElement.clientTop||0,j=0,k=0;if("relative"===Mb(g.body,"position")){var l=g.body.getBoundingClientRect(),m=g.documentElement.getBoundingClientRect();j=l.left-m.left||0,k=l.top-m.top||0}b.left=c.left+d-h-j,b.top=c.top+e-i-k,b.width="width"in c?c.width:c.right-c.left,b.height="height"in c?c.height:c.bottom-c.top}return b},Ob=function(a){if(!a)return!1;var b=m(a,null),c=r(b.height)>0,d=r(b.width)>0,e=r(b.top)>=0,f=r(b.left)>=0,g=c&&d&&e&&f,h=g?null:Nb(a),i="none"!==b.display&&"collapse"!==b.visibility&&(g||!!h&&(c||h.height>0)&&(d||h.width>0)&&(e||h.top>=0)&&(f||h.left>=0));return i},Pb=function(){j(S),S=0,l(T),T=0},Qb=function(){var a;if(d&&(a=Ab(N.bridge))){var b=Nb(d);A(a.style,{width:b.width+"px",height:b.height+"px",top:b.top+"px",left:b.left+"px",zIndex:""+Sb(Z.zIndex)})}},Rb=function(a){N.ready===!0&&(N.bridge&&"function"==typeof N.bridge.setHandCursor?N.bridge.setHandCursor(a):N.ready=!1)},Sb=function(a){if(/^(?:auto|inherit)$/.test(a))return a;var b;return"number"!=typeof a||s(a)?"string"==typeof a&&(b=Sb(q(a,10))):b=a,"number"==typeof b?b:"auto"},Tb=function(b){var c,d,e,f=N.sandboxed,g=null;if(b=b===!0,M===!1)g=!1;else{try{d=a.frameElement||null}catch(h){e={name:h.name,message:h.message}}if(d&&1===d.nodeType&&"IFRAME"===d.nodeName)try{g=d.hasAttribute("sandbox")}catch(h){g=null}else{try{c=document.domain||null}catch(h){c=null}(null===c||e&&"SecurityError"===e.name&&/(^|[\s\(\[@])sandbox(es|ed|ing|[\s\.,!\)\]@]|$)/.test(e.message.toLowerCase()))&&(g=!0)}}return N.sandboxed=g,f===g||b||Ub(o),g},Ub=function(a){function b(a){var b=a.match(/[\d]+/g);return b.length=3,b.join(".")}function c(a){return!!a&&(a=a.toLowerCase())&&(/^(pepflashplayer\.dll|libpepflashplayer\.so|pepperflashplayer\.plugin)$/.test(a)||"chrome.plugin"===a.slice(-13))}function d(a){a&&(i=!0,a.version&&(l=b(a.version)),!l&&a.description&&(l=b(a.description)),a.filename&&(k=c(a.filename)))}var e,f,g,i=!1,j=!1,k=!1,l="";if(h.plugins&&h.plugins.length)e=h.plugins["Shockwave Flash"],d(e),h.plugins["Shockwave Flash 2.0"]&&(i=!0,l="2.0.0.11");else if(h.mimeTypes&&h.mimeTypes.length)g=h.mimeTypes["application/x-shockwave-flash"],e=g&&g.enabledPlugin,d(e);else if("undefined"!=typeof a){j=!0;try{f=new a("ShockwaveFlash.ShockwaveFlash.7"),i=!0,l=b(f.GetVariable("$version"))}catch(m){try{f=new a("ShockwaveFlash.ShockwaveFlash.6"),i=!0,l="6.0.21"}catch(n){try{f=new a("ShockwaveFlash.ShockwaveFlash"),i=!0,l=b(f.GetVariable("$version"))}catch(o){j=!1}}}}N.disabled=i!==!0,N.outdated=l&&r(l)e;e++)a=g[e].replace(/^on/,""),h[a]=!0,j[a]||(j[a]=[]),j[a].push(d);if(h.ready&&N.ready&&this.emit({type:"ready",client:this}),h.error){for(e=0,f=W.length;f>e;e++)if(N[W[e].replace(/^flash-/,"")]){this.emit({type:"error",name:W[e],client:this});break}c!==b&&Vb.version!==c&&this.emit({type:"error",name:"version-mismatch",jsVersion:Vb.version,swfVersion:c})}}return this},bc=function(a,b){var c,d,e,f,g,h=Xb[this.id],i=h&&h.handlers;if(!i)return this;if(0===arguments.length)f=u(i);else if("string"==typeof a&&a)f=a.split(/\s+/);else if("object"==typeof a&&a&&"undefined"==typeof b)for(c in a)w.call(a,c)&&"string"==typeof c&&c&&"function"==typeof a[c]&&this.off(c,a[c]);if(f&&f.length)for(c=0,d=f.length;d>c;c++)if(a=f[c].toLowerCase().replace(/^on/,""),g=i[a],g&&g.length)if(b)for(e=g.indexOf(b);-1!==e;)g.splice(e,1),e=g.indexOf(b,e);else g.length=0;return this},cc=function(a){var b=null,c=Xb[this.id]&&Xb[this.id].handlers;return c&&(b="string"==typeof a&&a?c[a]?c[a].slice(0):[]:B(c)),b},dc=function(a){if(ic.call(this,a)){"object"==typeof a&&a&&"string"==typeof a.type&&a.type&&(a=A({},a));var b=A({},ob(a),{client:this});jc.call(this,b)}return this},ec=function(a){if(!Xb[this.id])throw new Error("Attempted to clip element(s) to a destroyed ZeroClipboard client instance");a=kc(a);for(var b=0;b0,e=!a.target||d&&-1!==c.indexOf(a.target),f=a.relatedTarget&&d&&-1!==c.indexOf(a.relatedTarget),g=a.client&&a.client===this;return b&&(e||f||g)?!0:!1},jc=function(a){var b=Xb[this.id];if("object"==typeof a&&a&&a.type&&b){var c=rb(a),d=b&&b.handlers["*"]||[],e=b&&b.handlers[a.type]||[],g=d.concat(e);if(g&&g.length){var h,i,j,k,l,m=this;for(h=0,i=g.length;i>h;h++)j=g[h],k=m,"string"==typeof j&&"function"==typeof f[j]&&(j=f[j]),"object"==typeof j&&j&&"function"==typeof j.handleEvent&&(k=j,j=j.handleEvent),"function"==typeof j&&(l=A({},a),sb(j,k,[l],c))}}},kc=function(a){return"string"==typeof a&&(a=[]),"number"!=typeof a.length?[a]:a},lc=function(a){if(a&&1===a.nodeType){var b=function(a){(a||(a=f.event))&&("js"!==a._source&&(a.stopImmediatePropagation(),a.preventDefault()),delete a._source)},c=function(c){(c||(c=f.event))&&(b(c),Vb.focus(a))};a.addEventListener("mouseover",c,!1),a.addEventListener("mouseout",b,!1),a.addEventListener("mouseenter",b,!1),a.addEventListener("mouseleave",b,!1),a.addEventListener("mousemove",b,!1),$b[a.zcClippingId]={mouseover:c,mouseout:b,mouseenter:b,mouseleave:b,mousemove:b}}},mc=function(a){if(a&&1===a.nodeType){var b=$b[a.zcClippingId];if("object"==typeof b&&b){for(var c,d,e=["move","leave","enter","out","over"],f=0,g=e.length;g>f;f++)c="mouse"+e[f],d=b[c],"function"==typeof d&&a.removeEventListener(c,d,!1);delete $b[a.zcClippingId]}}};Vb._createClient=function(){_b.apply(this,z(arguments))},Vb.prototype.on=function(){return ac.apply(this,z(arguments))},Vb.prototype.off=function(){return bc.apply(this,z(arguments))},Vb.prototype.handlers=function(){return cc.apply(this,z(arguments))},Vb.prototype.emit=function(){return dc.apply(this,z(arguments))},Vb.prototype.clip=function(){return ec.apply(this,z(arguments))},Vb.prototype.unclip=function(){return fc.apply(this,z(arguments))},Vb.prototype.elements=function(){return gc.apply(this,z(arguments))},Vb.prototype.destroy=function(){return hc.apply(this,z(arguments))},Vb.prototype.setText=function(a){if(!Xb[this.id])throw new Error("Attempted to set pending clipboard data from a destroyed ZeroClipboard client instance");return Vb.setData("text/plain",a),this},Vb.prototype.setHtml=function(a){if(!Xb[this.id])throw new Error("Attempted to set pending clipboard data from a destroyed ZeroClipboard client instance");return Vb.setData("text/html",a),this},Vb.prototype.setRichText=function(a){if(!Xb[this.id])throw new Error("Attempted to set pending clipboard data from a destroyed ZeroClipboard client instance");return Vb.setData("application/rtf",a),this},Vb.prototype.setData=function(){if(!Xb[this.id])throw new Error("Attempted to set pending clipboard data from a destroyed ZeroClipboard client instance");return Vb.setData.apply(this,z(arguments)),this},Vb.prototype.clearData=function(){if(!Xb[this.id])throw new Error("Attempted to clear pending clipboard data from a destroyed ZeroClipboard client instance");return Vb.clearData.apply(this,z(arguments)),this},Vb.prototype.getData=function(){if(!Xb[this.id])throw new Error("Attempted to get pending clipboard data from a destroyed ZeroClipboard client instance");return Vb.getData.apply(this,z(arguments))},"function"==typeof define&&define.amd?define(function(){return Vb}):"object"==typeof module&&module&&"object"==typeof module.exports&&module.exports?module.exports=Vb:a.ZeroClipboard=Vb}(function(){return this||window}()); +//# sourceMappingURL=ZeroClipboard.min.map \ No newline at end of file diff --git a/static/assets/ZeroClipboard/ZeroClipboard.min.map b/static/assets/ZeroClipboard/ZeroClipboard.min.map new file mode 100755 index 0000000..8d7dc47 --- /dev/null +++ b/static/assets/ZeroClipboard/ZeroClipboard.min.map @@ -0,0 +1 @@ +{"version":3,"file":"ZeroClipboard.min.js","sources":["ZeroClipboard.js"],"names":["window","undefined","_zcSwfVersion","_currentElement","_copyTarget","_window","_document","document","_navigator","navigator","_setTimeout","setTimeout","_clearTimeout","clearTimeout","_setInterval","setInterval","_clearInterval","clearInterval","_getComputedStyle","getComputedStyle","_encodeURIComponent","encodeURIComponent","_ActiveXObject","ActiveXObject","_Error","Error","_parseInt","Number","parseInt","_parseFloat","parseFloat","_isNaN","isNaN","_now","Date","now","_keys","Object","keys","_defineProperty","defineProperty","_hasOwn","prototype","hasOwnProperty","_slice","Array","slice","_unwrap","unwrapper","el","wrap","unwrap","div","createElement","unwrappedDiv","nodeType","e","_args","argumentsObj","call","_extend","i","len","arg","prop","src","copy","args","arguments","target","length","_deepCopy","source","_pick","obj","newObj","_omit","indexOf","_deleteOwnProperties","_containedBy","ancestorEl","ownerDocument","parentNode","_getDirPathOfUrl","url","dir","split","lastIndexOf","_getCurrentScriptUrlFromErrorStack","stack","matches","match","_getCurrentScriptUrlFromError","err","sourceURL","fileName","_getCurrentScriptUrl","jsPath","scripts","currentScript","getElementsByTagName","readyState","_getUnanimousScriptParentDir","jsDir","_getDefaultSwfPath","_pageIsFramed","opener","top","parent","_flashState","bridge","version","pluginType","disabled","outdated","sandboxed","unavailable","degraded","deactivated","overdue","ready","_minimumFlashVersion","_handlers","_clipData","_clipDataFormatMap","_flashCheckTimeout","_swfFallbackCheckInterval","_eventMessages","error","flash-disabled","flash-outdated","flash-sandboxed","flash-unavailable","flash-degraded","flash-deactivated","flash-overdue","version-mismatch","clipboard-error","config-mismatch","swf-not-found","_errorsThatOnlyOccurAfterFlashLoads","_flashStateErrorNames","_flashStateErrorNameMatchingRegex","RegExp","map","errorName","replace","join","_flashStateEnabledErrorNameMatchingRegex","_globalConfig","swfPath","trustedDomains","location","host","cacheBust","forceEnhancedClipboard","flashLoadTimeout","autoActivate","bubbleEvents","containerId","containerClass","swfObjectId","hoverClass","activeClass","forceHandCursor","title","zIndex","_config","options","test","_isValidHtml4Id","_state","_detectSandbox","browser","flash","zeroclipboard","ZeroClipboard","config","_isFlashUnusable","_on","eventType","listener","events","added","toLowerCase","on","push","emit","type","name","jsVersion","swfVersion","_off","foundIndex","perEventHandlers","off","splice","_listeners","_emit","event","eventCopy","returnVal","tmp","_createEvent","_preprocessEvent","_dispatchCallbacks","this","_mapClipDataToFlash","data","formatMap","_create","previousState","isFlashUnusable","maxWait","_embedSwf","_destroy","clearData","blur","_unembedSwf","_setData","format","dataObj","dataFormat","_clearData","_getData","_focus","element","_removeClass","_addClass","newTitle","getAttribute","htmlBridge","_getHtmlBridge","setAttribute","useHandCursor","_getStyle","_setHandCursor","_reposition","_blur","removeAttribute","style","left","width","height","_activeElement","id","relatedTarget","currentTarget","timeStamp","msg","message","minimumVersion","clipboardData","setData","_mapClipResultsFromFlash","_getRelatedTarget","_addMouseData","targetEl","relatedTargetId","getElementById","srcElement","fromElement","toElement","pos","_getElementPosition","screenLeft","screenX","screenTop","screenY","scrollLeft","body","documentElement","scrollTop","pageX","_stageX","pageY","_stageY","clientX","clientY","moveX","movementX","moveY","movementY","x","y","offsetX","offsetY","layerX","layerY","_shouldPerformAsync","_dispatchCallback","func","context","async","apply","wildcardTypeHandlers","specificTypeHandlers","handlers","concat","originalContext","handleEvent","_getSandboxStatusFromErrorEvent","isSandboxed","sourceIsSwf","_source","_clearTimeoutsAndPolling","wasDeactivated","textContent","htmlContent","value","outerHTML","innerHTML","innerText","_queueEmitClipboardErrors","_safeActiveElement","focus","_fireMouseEvent","bubbles","cancelable","aftercopyEvent","errors","errorEvent","success","doc","defaults","view","defaultView","canBubble","detail","button","which","createEvent","dispatchEvent","ctrlKey","altKey","shiftKey","metaKey","initMouseEvent","_watchForSwfFallbackContent","pollWait","Math","min","fallbackContentId","_isElementVisible","_createHtmlBridge","container","className","position","_getSafeZIndex","flashBridge","nodeName","allowScriptAccess","_determineScriptAccess","allowNetworking","flashvars","_vars","swfUrl","_cacheBust","divToBeReplaced","appendChild","tmpDiv","usingActiveX","firstChild","replaceChild","display","removeSwfFromIE","removeChild","clipData","newClipData","text","html","rtf","clipResults","newResults","tmpHash","path","domain","domains","str","trustedOriginsExpanded","_extractDomain","protocol","originOrUrl","protocolIndex","pathIndex","_extractAllDomains","origins","resultsArray","currentDomain","configOptions","swfDomain","activeElement","c","cl","classNames","classList","add","remove","getPropertyValue","getBoundingClientRect","elRect","pageXOffset","pageYOffset","leftBorderWidth","clientLeft","topBorderWidth","clientTop","leftBodyOffset","topBodyOffset","bodyRect","htmlRect","right","bottom","styles","hasCssHeight","hasCssWidth","hasCssTop","hasCssLeft","cssKnows","rect","isVisible","visibility","enabled","setHandCursor","val","doNotReassessFlashSupport","effectiveScriptOrigin","frame","frameError","frameElement","hasAttribute","_detectFlashSupport","parseFlashVersion","desc","isPepperFlash","flashPlayerFileName","inspectPlugin","plugin","hasFlash","flashVersion","description","filename","isPPAPI","ax","mimeType","isActiveX","plugins","mimeTypes","enabledPlugin","GetVariable","e1","e2","e3","_createClient","writable","configurable","enumerable","state","create","destroy","getData","activate","deactivate","_clientIdCounter","_clientMeta","_elementIdCounter","_elementMeta","_mouseHandlers","_clientConstructor","elements","client","instance","clip","_clientOn","meta","_clientOff","_clientListeners","_clientEmit","_clientShouldEmit","_clientDispatchCallbacks","_clientClip","_prepClip","zcClippingId","_addMouseHandlers","clippedElements","_clientUnclip","arrayIndex","clientIds","_removeMouseHandlers","_clientElements","_clientDestroy","unclip","clippedEls","hasClippedEls","goodTarget","goodRelTarget","goodClient","_suppressMouseEvents","stopImmediatePropagation","preventDefault","_elementMouseOver","addEventListener","mouseover","mouseout","mouseenter","mouseleave","mousemove","mouseHandlers","key","mouseEvents","removeEventListener","setText","setHtml","setRichText","richText","define","amd","module","exports"],"mappings":"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","sourcesContent":["/*!\n * ZeroClipboard\n * The ZeroClipboard library provides an easy way to copy text to the clipboard using an invisible Adobe Flash movie and a JavaScript interface.\n * Copyright (c) 2009-2014 Jon Rohan, James M. Greene\n * Licensed MIT\n * http://zeroclipboard.org/\n * v2.2.0\n */\n(function(window, undefined) {\n \"use strict\";\n /**\n * Store references to critically important global functions that may be\n * overridden on certain web pages.\n */\n var _window = window, _document = _window.document, _navigator = _window.navigator, _setTimeout = _window.setTimeout, _clearTimeout = _window.clearTimeout, _setInterval = _window.setInterval, _clearInterval = _window.clearInterval, _getComputedStyle = _window.getComputedStyle, _encodeURIComponent = _window.encodeURIComponent, _ActiveXObject = _window.ActiveXObject, _Error = _window.Error, _parseInt = _window.Number.parseInt || _window.parseInt, _parseFloat = _window.Number.parseFloat || _window.parseFloat, _isNaN = _window.Number.isNaN || _window.isNaN, _now = _window.Date.now, _keys = _window.Object.keys, _defineProperty = _window.Object.defineProperty, _hasOwn = _window.Object.prototype.hasOwnProperty, _slice = _window.Array.prototype.slice, _unwrap = function() {\n var unwrapper = function(el) {\n return el;\n };\n if (typeof _window.wrap === \"function\" && typeof _window.unwrap === \"function\") {\n try {\n var div = _document.createElement(\"div\");\n var unwrappedDiv = _window.unwrap(div);\n if (div.nodeType === 1 && unwrappedDiv && unwrappedDiv.nodeType === 1) {\n unwrapper = _window.unwrap;\n }\n } catch (e) {}\n }\n return unwrapper;\n }();\n /**\n * Convert an `arguments` object into an Array.\n *\n * @returns The arguments as an Array\n * @private\n */\n var _args = function(argumentsObj) {\n return _slice.call(argumentsObj, 0);\n };\n /**\n * Shallow-copy the owned, enumerable properties of one object over to another, similar to jQuery's `$.extend`.\n *\n * @returns The target object, augmented\n * @private\n */\n var _extend = function() {\n var i, len, arg, prop, src, copy, args = _args(arguments), target = args[0] || {};\n for (i = 1, len = args.length; i < len; i++) {\n if ((arg = args[i]) != null) {\n for (prop in arg) {\n if (_hasOwn.call(arg, prop)) {\n src = target[prop];\n copy = arg[prop];\n if (target !== copy && copy !== undefined) {\n target[prop] = copy;\n }\n }\n }\n }\n }\n return target;\n };\n /**\n * Return a deep copy of the source object or array.\n *\n * @returns Object or Array\n * @private\n */\n var _deepCopy = function(source) {\n var copy, i, len, prop;\n if (typeof source !== \"object\" || source == null || typeof source.nodeType === \"number\") {\n copy = source;\n } else if (typeof source.length === \"number\") {\n copy = [];\n for (i = 0, len = source.length; i < len; i++) {\n if (_hasOwn.call(source, i)) {\n copy[i] = _deepCopy(source[i]);\n }\n }\n } else {\n copy = {};\n for (prop in source) {\n if (_hasOwn.call(source, prop)) {\n copy[prop] = _deepCopy(source[prop]);\n }\n }\n }\n return copy;\n };\n /**\n * Makes a shallow copy of `obj` (like `_extend`) but filters its properties based on a list of `keys` to keep.\n * The inverse of `_omit`, mostly. The big difference is that these properties do NOT need to be enumerable to\n * be kept.\n *\n * @returns A new filtered object.\n * @private\n */\n var _pick = function(obj, keys) {\n var newObj = {};\n for (var i = 0, len = keys.length; i < len; i++) {\n if (keys[i] in obj) {\n newObj[keys[i]] = obj[keys[i]];\n }\n }\n return newObj;\n };\n /**\n * Makes a shallow copy of `obj` (like `_extend`) but filters its properties based on a list of `keys` to omit.\n * The inverse of `_pick`.\n *\n * @returns A new filtered object.\n * @private\n */\n var _omit = function(obj, keys) {\n var newObj = {};\n for (var prop in obj) {\n if (keys.indexOf(prop) === -1) {\n newObj[prop] = obj[prop];\n }\n }\n return newObj;\n };\n /**\n * Remove all owned, enumerable properties from an object.\n *\n * @returns The original object without its owned, enumerable properties.\n * @private\n */\n var _deleteOwnProperties = function(obj) {\n if (obj) {\n for (var prop in obj) {\n if (_hasOwn.call(obj, prop)) {\n delete obj[prop];\n }\n }\n }\n return obj;\n };\n /**\n * Determine if an element is contained within another element.\n *\n * @returns Boolean\n * @private\n */\n var _containedBy = function(el, ancestorEl) {\n if (el && el.nodeType === 1 && el.ownerDocument && ancestorEl && (ancestorEl.nodeType === 1 && ancestorEl.ownerDocument && ancestorEl.ownerDocument === el.ownerDocument || ancestorEl.nodeType === 9 && !ancestorEl.ownerDocument && ancestorEl === el.ownerDocument)) {\n do {\n if (el === ancestorEl) {\n return true;\n }\n el = el.parentNode;\n } while (el);\n }\n return false;\n };\n /**\n * Get the URL path's parent directory.\n *\n * @returns String or `undefined`\n * @private\n */\n var _getDirPathOfUrl = function(url) {\n var dir;\n if (typeof url === \"string\" && url) {\n dir = url.split(\"#\")[0].split(\"?\")[0];\n dir = url.slice(0, url.lastIndexOf(\"/\") + 1);\n }\n return dir;\n };\n /**\n * Get the current script's URL by throwing an `Error` and analyzing it.\n *\n * @returns String or `undefined`\n * @private\n */\n var _getCurrentScriptUrlFromErrorStack = function(stack) {\n var url, matches;\n if (typeof stack === \"string\" && stack) {\n matches = stack.match(/^(?:|[^:@]*@|.+\\)@(?=http[s]?|file)|.+?\\s+(?: at |@)(?:[^:\\(]+ )*[\\(]?)((?:http[s]?|file):\\/\\/[\\/]?.+?\\/[^:\\)]*?)(?::\\d+)(?::\\d+)?/);\n if (matches && matches[1]) {\n url = matches[1];\n } else {\n matches = stack.match(/\\)@((?:http[s]?|file):\\/\\/[\\/]?.+?\\/[^:\\)]*?)(?::\\d+)(?::\\d+)?/);\n if (matches && matches[1]) {\n url = matches[1];\n }\n }\n }\n return url;\n };\n /**\n * Get the current script's URL by throwing an `Error` and analyzing it.\n *\n * @returns String or `undefined`\n * @private\n */\n var _getCurrentScriptUrlFromError = function() {\n var url, err;\n try {\n throw new _Error();\n } catch (e) {\n err = e;\n }\n if (err) {\n url = err.sourceURL || err.fileName || _getCurrentScriptUrlFromErrorStack(err.stack);\n }\n return url;\n };\n /**\n * Get the current script's URL.\n *\n * @returns String or `undefined`\n * @private\n */\n var _getCurrentScriptUrl = function() {\n var jsPath, scripts, i;\n if (_document.currentScript && (jsPath = _document.currentScript.src)) {\n return jsPath;\n }\n scripts = _document.getElementsByTagName(\"script\");\n if (scripts.length === 1) {\n return scripts[0].src || undefined;\n }\n if (\"readyState\" in scripts[0]) {\n for (i = scripts.length; i--; ) {\n if (scripts[i].readyState === \"interactive\" && (jsPath = scripts[i].src)) {\n return jsPath;\n }\n }\n }\n if (_document.readyState === \"loading\" && (jsPath = scripts[scripts.length - 1].src)) {\n return jsPath;\n }\n if (jsPath = _getCurrentScriptUrlFromError()) {\n return jsPath;\n }\n return undefined;\n };\n /**\n * Get the unanimous parent directory of ALL script tags.\n * If any script tags are either (a) inline or (b) from differing parent\n * directories, this method must return `undefined`.\n *\n * @returns String or `undefined`\n * @private\n */\n var _getUnanimousScriptParentDir = function() {\n var i, jsDir, jsPath, scripts = _document.getElementsByTagName(\"script\");\n for (i = scripts.length; i--; ) {\n if (!(jsPath = scripts[i].src)) {\n jsDir = null;\n break;\n }\n jsPath = _getDirPathOfUrl(jsPath);\n if (jsDir == null) {\n jsDir = jsPath;\n } else if (jsDir !== jsPath) {\n jsDir = null;\n break;\n }\n }\n return jsDir || undefined;\n };\n /**\n * Get the presumed location of the \"ZeroClipboard.swf\" file, based on the location\n * of the executing JavaScript file (e.g. \"ZeroClipboard.js\", etc.).\n *\n * @returns String\n * @private\n */\n var _getDefaultSwfPath = function() {\n var jsDir = _getDirPathOfUrl(_getCurrentScriptUrl()) || _getUnanimousScriptParentDir() || \"\";\n return jsDir + \"ZeroClipboard.swf\";\n };\n /**\n * Keep track of if the page is framed (in an `iframe`). This can never change.\n * @private\n */\n var _pageIsFramed = function() {\n return window.opener == null && (!!window.top && window != window.top || !!window.parent && window != window.parent);\n }();\n /**\n * Keep track of the state of the Flash object.\n * @private\n */\n var _flashState = {\n bridge: null,\n version: \"0.0.0\",\n pluginType: \"unknown\",\n disabled: null,\n outdated: null,\n sandboxed: null,\n unavailable: null,\n degraded: null,\n deactivated: null,\n overdue: null,\n ready: null\n };\n /**\n * The minimum Flash Player version required to use ZeroClipboard completely.\n * @readonly\n * @private\n */\n var _minimumFlashVersion = \"11.0.0\";\n /**\n * The ZeroClipboard library version number, as reported by Flash, at the time the SWF was compiled.\n */\n var _zcSwfVersion;\n /**\n * Keep track of all event listener registrations.\n * @private\n */\n var _handlers = {};\n /**\n * Keep track of the currently activated element.\n * @private\n */\n var _currentElement;\n /**\n * Keep track of the element that was activated when a `copy` process started.\n * @private\n */\n var _copyTarget;\n /**\n * Keep track of data for the pending clipboard transaction.\n * @private\n */\n var _clipData = {};\n /**\n * Keep track of data formats for the pending clipboard transaction.\n * @private\n */\n var _clipDataFormatMap = null;\n /**\n * Keep track of the Flash availability check timeout.\n * @private\n */\n var _flashCheckTimeout = 0;\n /**\n * Keep track of SWF network errors interval polling.\n * @private\n */\n var _swfFallbackCheckInterval = 0;\n /**\n * The `message` store for events\n * @private\n */\n var _eventMessages = {\n ready: \"Flash communication is established\",\n error: {\n \"flash-disabled\": \"Flash is disabled or not installed. May also be attempting to run Flash in a sandboxed iframe, which is impossible.\",\n \"flash-outdated\": \"Flash is too outdated to support ZeroClipboard\",\n \"flash-sandboxed\": \"Attempting to run Flash in a sandboxed iframe, which is impossible\",\n \"flash-unavailable\": \"Flash is unable to communicate bidirectionally with JavaScript\",\n \"flash-degraded\": \"Flash is unable to preserve data fidelity when communicating with JavaScript\",\n \"flash-deactivated\": \"Flash is too outdated for your browser and/or is configured as click-to-activate.\\nThis may also mean that the ZeroClipboard SWF object could not be loaded, so please check your `swfPath` configuration and/or network connectivity.\\nMay also be attempting to run Flash in a sandboxed iframe, which is impossible.\",\n \"flash-overdue\": \"Flash communication was established but NOT within the acceptable time limit\",\n \"version-mismatch\": \"ZeroClipboard JS version number does not match ZeroClipboard SWF version number\",\n \"clipboard-error\": \"At least one error was thrown while ZeroClipboard was attempting to inject your data into the clipboard\",\n \"config-mismatch\": \"ZeroClipboard configuration does not match Flash's reality\",\n \"swf-not-found\": \"The ZeroClipboard SWF object could not be loaded, so please check your `swfPath` configuration and/or network connectivity\"\n }\n };\n /**\n * The `name`s of `error` events that can only occur is Flash has at least\n * been able to load the SWF successfully.\n * @private\n */\n var _errorsThatOnlyOccurAfterFlashLoads = [ \"flash-unavailable\", \"flash-degraded\", \"flash-overdue\", \"version-mismatch\", \"config-mismatch\", \"clipboard-error\" ];\n /**\n * The `name`s of `error` events that should likely result in the `_flashState`\n * variable's property values being updated.\n * @private\n */\n var _flashStateErrorNames = [ \"flash-disabled\", \"flash-outdated\", \"flash-sandboxed\", \"flash-unavailable\", \"flash-degraded\", \"flash-deactivated\", \"flash-overdue\" ];\n /**\n * A RegExp to match the `name` property of `error` events related to Flash.\n * @private\n */\n var _flashStateErrorNameMatchingRegex = new RegExp(\"^flash-(\" + _flashStateErrorNames.map(function(errorName) {\n return errorName.replace(/^flash-/, \"\");\n }).join(\"|\") + \")$\");\n /**\n * A RegExp to match the `name` property of `error` events related to Flash,\n * which is enabled.\n * @private\n */\n var _flashStateEnabledErrorNameMatchingRegex = new RegExp(\"^flash-(\" + _flashStateErrorNames.slice(1).map(function(errorName) {\n return errorName.replace(/^flash-/, \"\");\n }).join(\"|\") + \")$\");\n /**\n * ZeroClipboard configuration defaults for the Core module.\n * @private\n */\n var _globalConfig = {\n swfPath: _getDefaultSwfPath(),\n trustedDomains: window.location.host ? [ window.location.host ] : [],\n cacheBust: true,\n forceEnhancedClipboard: false,\n flashLoadTimeout: 3e4,\n autoActivate: true,\n bubbleEvents: true,\n containerId: \"global-zeroclipboard-html-bridge\",\n containerClass: \"global-zeroclipboard-container\",\n swfObjectId: \"global-zeroclipboard-flash-bridge\",\n hoverClass: \"zeroclipboard-is-hover\",\n activeClass: \"zeroclipboard-is-active\",\n forceHandCursor: false,\n title: null,\n zIndex: 999999999\n };\n /**\n * The underlying implementation of `ZeroClipboard.config`.\n * @private\n */\n var _config = function(options) {\n if (typeof options === \"object\" && options !== null) {\n for (var prop in options) {\n if (_hasOwn.call(options, prop)) {\n if (/^(?:forceHandCursor|title|zIndex|bubbleEvents)$/.test(prop)) {\n _globalConfig[prop] = options[prop];\n } else if (_flashState.bridge == null) {\n if (prop === \"containerId\" || prop === \"swfObjectId\") {\n if (_isValidHtml4Id(options[prop])) {\n _globalConfig[prop] = options[prop];\n } else {\n throw new Error(\"The specified `\" + prop + \"` value is not valid as an HTML4 Element ID\");\n }\n } else {\n _globalConfig[prop] = options[prop];\n }\n }\n }\n }\n }\n if (typeof options === \"string\" && options) {\n if (_hasOwn.call(_globalConfig, options)) {\n return _globalConfig[options];\n }\n return;\n }\n return _deepCopy(_globalConfig);\n };\n /**\n * The underlying implementation of `ZeroClipboard.state`.\n * @private\n */\n var _state = function() {\n _detectSandbox();\n return {\n browser: _pick(_navigator, [ \"userAgent\", \"platform\", \"appName\" ]),\n flash: _omit(_flashState, [ \"bridge\" ]),\n zeroclipboard: {\n version: ZeroClipboard.version,\n config: ZeroClipboard.config()\n }\n };\n };\n /**\n * The underlying implementation of `ZeroClipboard.isFlashUnusable`.\n * @private\n */\n var _isFlashUnusable = function() {\n return !!(_flashState.disabled || _flashState.outdated || _flashState.sandboxed || _flashState.unavailable || _flashState.degraded || _flashState.deactivated);\n };\n /**\n * The underlying implementation of `ZeroClipboard.on`.\n * @private\n */\n var _on = function(eventType, listener) {\n var i, len, events, added = {};\n if (typeof eventType === \"string\" && eventType) {\n events = eventType.toLowerCase().split(/\\s+/);\n } else if (typeof eventType === \"object\" && eventType && typeof listener === \"undefined\") {\n for (i in eventType) {\n if (_hasOwn.call(eventType, i) && typeof i === \"string\" && i && typeof eventType[i] === \"function\") {\n ZeroClipboard.on(i, eventType[i]);\n }\n }\n }\n if (events && events.length) {\n for (i = 0, len = events.length; i < len; i++) {\n eventType = events[i].replace(/^on/, \"\");\n added[eventType] = true;\n if (!_handlers[eventType]) {\n _handlers[eventType] = [];\n }\n _handlers[eventType].push(listener);\n }\n if (added.ready && _flashState.ready) {\n ZeroClipboard.emit({\n type: \"ready\"\n });\n }\n if (added.error) {\n for (i = 0, len = _flashStateErrorNames.length; i < len; i++) {\n if (_flashState[_flashStateErrorNames[i].replace(/^flash-/, \"\")] === true) {\n ZeroClipboard.emit({\n type: \"error\",\n name: _flashStateErrorNames[i]\n });\n break;\n }\n }\n if (_zcSwfVersion !== undefined && ZeroClipboard.version !== _zcSwfVersion) {\n ZeroClipboard.emit({\n type: \"error\",\n name: \"version-mismatch\",\n jsVersion: ZeroClipboard.version,\n swfVersion: _zcSwfVersion\n });\n }\n }\n }\n return ZeroClipboard;\n };\n /**\n * The underlying implementation of `ZeroClipboard.off`.\n * @private\n */\n var _off = function(eventType, listener) {\n var i, len, foundIndex, events, perEventHandlers;\n if (arguments.length === 0) {\n events = _keys(_handlers);\n } else if (typeof eventType === \"string\" && eventType) {\n events = eventType.split(/\\s+/);\n } else if (typeof eventType === \"object\" && eventType && typeof listener === \"undefined\") {\n for (i in eventType) {\n if (_hasOwn.call(eventType, i) && typeof i === \"string\" && i && typeof eventType[i] === \"function\") {\n ZeroClipboard.off(i, eventType[i]);\n }\n }\n }\n if (events && events.length) {\n for (i = 0, len = events.length; i < len; i++) {\n eventType = events[i].toLowerCase().replace(/^on/, \"\");\n perEventHandlers = _handlers[eventType];\n if (perEventHandlers && perEventHandlers.length) {\n if (listener) {\n foundIndex = perEventHandlers.indexOf(listener);\n while (foundIndex !== -1) {\n perEventHandlers.splice(foundIndex, 1);\n foundIndex = perEventHandlers.indexOf(listener, foundIndex);\n }\n } else {\n perEventHandlers.length = 0;\n }\n }\n }\n }\n return ZeroClipboard;\n };\n /**\n * The underlying implementation of `ZeroClipboard.handlers`.\n * @private\n */\n var _listeners = function(eventType) {\n var copy;\n if (typeof eventType === \"string\" && eventType) {\n copy = _deepCopy(_handlers[eventType]) || null;\n } else {\n copy = _deepCopy(_handlers);\n }\n return copy;\n };\n /**\n * The underlying implementation of `ZeroClipboard.emit`.\n * @private\n */\n var _emit = function(event) {\n var eventCopy, returnVal, tmp;\n event = _createEvent(event);\n if (!event) {\n return;\n }\n if (_preprocessEvent(event)) {\n return;\n }\n if (event.type === \"ready\" && _flashState.overdue === true) {\n return ZeroClipboard.emit({\n type: \"error\",\n name: \"flash-overdue\"\n });\n }\n eventCopy = _extend({}, event);\n _dispatchCallbacks.call(this, eventCopy);\n if (event.type === \"copy\") {\n tmp = _mapClipDataToFlash(_clipData);\n returnVal = tmp.data;\n _clipDataFormatMap = tmp.formatMap;\n }\n return returnVal;\n };\n /**\n * The underlying implementation of `ZeroClipboard.create`.\n * @private\n */\n var _create = function() {\n var previousState = _flashState.sandboxed;\n _detectSandbox();\n if (typeof _flashState.ready !== \"boolean\") {\n _flashState.ready = false;\n }\n if (_flashState.sandboxed !== previousState && _flashState.sandboxed === true) {\n _flashState.ready = false;\n ZeroClipboard.emit({\n type: \"error\",\n name: \"flash-sandboxed\"\n });\n } else if (!ZeroClipboard.isFlashUnusable() && _flashState.bridge === null) {\n var maxWait = _globalConfig.flashLoadTimeout;\n if (typeof maxWait === \"number\" && maxWait >= 0) {\n _flashCheckTimeout = _setTimeout(function() {\n if (typeof _flashState.deactivated !== \"boolean\") {\n _flashState.deactivated = true;\n }\n if (_flashState.deactivated === true) {\n ZeroClipboard.emit({\n type: \"error\",\n name: \"flash-deactivated\"\n });\n }\n }, maxWait);\n }\n _flashState.overdue = false;\n _embedSwf();\n }\n };\n /**\n * The underlying implementation of `ZeroClipboard.destroy`.\n * @private\n */\n var _destroy = function() {\n ZeroClipboard.clearData();\n ZeroClipboard.blur();\n ZeroClipboard.emit(\"destroy\");\n _unembedSwf();\n ZeroClipboard.off();\n };\n /**\n * The underlying implementation of `ZeroClipboard.setData`.\n * @private\n */\n var _setData = function(format, data) {\n var dataObj;\n if (typeof format === \"object\" && format && typeof data === \"undefined\") {\n dataObj = format;\n ZeroClipboard.clearData();\n } else if (typeof format === \"string\" && format) {\n dataObj = {};\n dataObj[format] = data;\n } else {\n return;\n }\n for (var dataFormat in dataObj) {\n if (typeof dataFormat === \"string\" && dataFormat && _hasOwn.call(dataObj, dataFormat) && typeof dataObj[dataFormat] === \"string\" && dataObj[dataFormat]) {\n _clipData[dataFormat] = dataObj[dataFormat];\n }\n }\n };\n /**\n * The underlying implementation of `ZeroClipboard.clearData`.\n * @private\n */\n var _clearData = function(format) {\n if (typeof format === \"undefined\") {\n _deleteOwnProperties(_clipData);\n _clipDataFormatMap = null;\n } else if (typeof format === \"string\" && _hasOwn.call(_clipData, format)) {\n delete _clipData[format];\n }\n };\n /**\n * The underlying implementation of `ZeroClipboard.getData`.\n * @private\n */\n var _getData = function(format) {\n if (typeof format === \"undefined\") {\n return _deepCopy(_clipData);\n } else if (typeof format === \"string\" && _hasOwn.call(_clipData, format)) {\n return _clipData[format];\n }\n };\n /**\n * The underlying implementation of `ZeroClipboard.focus`/`ZeroClipboard.activate`.\n * @private\n */\n var _focus = function(element) {\n if (!(element && element.nodeType === 1)) {\n return;\n }\n if (_currentElement) {\n _removeClass(_currentElement, _globalConfig.activeClass);\n if (_currentElement !== element) {\n _removeClass(_currentElement, _globalConfig.hoverClass);\n }\n }\n _currentElement = element;\n _addClass(element, _globalConfig.hoverClass);\n var newTitle = element.getAttribute(\"title\") || _globalConfig.title;\n if (typeof newTitle === \"string\" && newTitle) {\n var htmlBridge = _getHtmlBridge(_flashState.bridge);\n if (htmlBridge) {\n htmlBridge.setAttribute(\"title\", newTitle);\n }\n }\n var useHandCursor = _globalConfig.forceHandCursor === true || _getStyle(element, \"cursor\") === \"pointer\";\n _setHandCursor(useHandCursor);\n _reposition();\n };\n /**\n * The underlying implementation of `ZeroClipboard.blur`/`ZeroClipboard.deactivate`.\n * @private\n */\n var _blur = function() {\n var htmlBridge = _getHtmlBridge(_flashState.bridge);\n if (htmlBridge) {\n htmlBridge.removeAttribute(\"title\");\n htmlBridge.style.left = \"0px\";\n htmlBridge.style.top = \"-9999px\";\n htmlBridge.style.width = \"1px\";\n htmlBridge.style.height = \"1px\";\n }\n if (_currentElement) {\n _removeClass(_currentElement, _globalConfig.hoverClass);\n _removeClass(_currentElement, _globalConfig.activeClass);\n _currentElement = null;\n }\n };\n /**\n * The underlying implementation of `ZeroClipboard.activeElement`.\n * @private\n */\n var _activeElement = function() {\n return _currentElement || null;\n };\n /**\n * Check if a value is a valid HTML4 `ID` or `Name` token.\n * @private\n */\n var _isValidHtml4Id = function(id) {\n return typeof id === \"string\" && id && /^[A-Za-z][A-Za-z0-9_:\\-\\.]*$/.test(id);\n };\n /**\n * Create or update an `event` object, based on the `eventType`.\n * @private\n */\n var _createEvent = function(event) {\n var eventType;\n if (typeof event === \"string\" && event) {\n eventType = event;\n event = {};\n } else if (typeof event === \"object\" && event && typeof event.type === \"string\" && event.type) {\n eventType = event.type;\n }\n if (!eventType) {\n return;\n }\n eventType = eventType.toLowerCase();\n if (!event.target && (/^(copy|aftercopy|_click)$/.test(eventType) || eventType === \"error\" && event.name === \"clipboard-error\")) {\n event.target = _copyTarget;\n }\n _extend(event, {\n type: eventType,\n target: event.target || _currentElement || null,\n relatedTarget: event.relatedTarget || null,\n currentTarget: _flashState && _flashState.bridge || null,\n timeStamp: event.timeStamp || _now() || null\n });\n var msg = _eventMessages[event.type];\n if (event.type === \"error\" && event.name && msg) {\n msg = msg[event.name];\n }\n if (msg) {\n event.message = msg;\n }\n if (event.type === \"ready\") {\n _extend(event, {\n target: null,\n version: _flashState.version\n });\n }\n if (event.type === \"error\") {\n if (_flashStateErrorNameMatchingRegex.test(event.name)) {\n _extend(event, {\n target: null,\n minimumVersion: _minimumFlashVersion\n });\n }\n if (_flashStateEnabledErrorNameMatchingRegex.test(event.name)) {\n _extend(event, {\n version: _flashState.version\n });\n }\n }\n if (event.type === \"copy\") {\n event.clipboardData = {\n setData: ZeroClipboard.setData,\n clearData: ZeroClipboard.clearData\n };\n }\n if (event.type === \"aftercopy\") {\n event = _mapClipResultsFromFlash(event, _clipDataFormatMap);\n }\n if (event.target && !event.relatedTarget) {\n event.relatedTarget = _getRelatedTarget(event.target);\n }\n return _addMouseData(event);\n };\n /**\n * Get a relatedTarget from the target's `data-clipboard-target` attribute\n * @private\n */\n var _getRelatedTarget = function(targetEl) {\n var relatedTargetId = targetEl && targetEl.getAttribute && targetEl.getAttribute(\"data-clipboard-target\");\n return relatedTargetId ? _document.getElementById(relatedTargetId) : null;\n };\n /**\n * Add element and position data to `MouseEvent` instances\n * @private\n */\n var _addMouseData = function(event) {\n if (event && /^_(?:click|mouse(?:over|out|down|up|move))$/.test(event.type)) {\n var srcElement = event.target;\n var fromElement = event.type === \"_mouseover\" && event.relatedTarget ? event.relatedTarget : undefined;\n var toElement = event.type === \"_mouseout\" && event.relatedTarget ? event.relatedTarget : undefined;\n var pos = _getElementPosition(srcElement);\n var screenLeft = _window.screenLeft || _window.screenX || 0;\n var screenTop = _window.screenTop || _window.screenY || 0;\n var scrollLeft = _document.body.scrollLeft + _document.documentElement.scrollLeft;\n var scrollTop = _document.body.scrollTop + _document.documentElement.scrollTop;\n var pageX = pos.left + (typeof event._stageX === \"number\" ? event._stageX : 0);\n var pageY = pos.top + (typeof event._stageY === \"number\" ? event._stageY : 0);\n var clientX = pageX - scrollLeft;\n var clientY = pageY - scrollTop;\n var screenX = screenLeft + clientX;\n var screenY = screenTop + clientY;\n var moveX = typeof event.movementX === \"number\" ? event.movementX : 0;\n var moveY = typeof event.movementY === \"number\" ? event.movementY : 0;\n delete event._stageX;\n delete event._stageY;\n _extend(event, {\n srcElement: srcElement,\n fromElement: fromElement,\n toElement: toElement,\n screenX: screenX,\n screenY: screenY,\n pageX: pageX,\n pageY: pageY,\n clientX: clientX,\n clientY: clientY,\n x: clientX,\n y: clientY,\n movementX: moveX,\n movementY: moveY,\n offsetX: 0,\n offsetY: 0,\n layerX: 0,\n layerY: 0\n });\n }\n return event;\n };\n /**\n * Determine if an event's registered handlers should be execute synchronously or asynchronously.\n *\n * @returns {boolean}\n * @private\n */\n var _shouldPerformAsync = function(event) {\n var eventType = event && typeof event.type === \"string\" && event.type || \"\";\n return !/^(?:(?:before)?copy|destroy)$/.test(eventType);\n };\n /**\n * Control if a callback should be executed asynchronously or not.\n *\n * @returns `undefined`\n * @private\n */\n var _dispatchCallback = function(func, context, args, async) {\n if (async) {\n _setTimeout(function() {\n func.apply(context, args);\n }, 0);\n } else {\n func.apply(context, args);\n }\n };\n /**\n * Handle the actual dispatching of events to client instances.\n *\n * @returns `undefined`\n * @private\n */\n var _dispatchCallbacks = function(event) {\n if (!(typeof event === \"object\" && event && event.type)) {\n return;\n }\n var async = _shouldPerformAsync(event);\n var wildcardTypeHandlers = _handlers[\"*\"] || [];\n var specificTypeHandlers = _handlers[event.type] || [];\n var handlers = wildcardTypeHandlers.concat(specificTypeHandlers);\n if (handlers && handlers.length) {\n var i, len, func, context, eventCopy, originalContext = this;\n for (i = 0, len = handlers.length; i < len; i++) {\n func = handlers[i];\n context = originalContext;\n if (typeof func === \"string\" && typeof _window[func] === \"function\") {\n func = _window[func];\n }\n if (typeof func === \"object\" && func && typeof func.handleEvent === \"function\") {\n context = func;\n func = func.handleEvent;\n }\n if (typeof func === \"function\") {\n eventCopy = _extend({}, event);\n _dispatchCallback(func, context, [ eventCopy ], async);\n }\n }\n }\n return this;\n };\n /**\n * Check an `error` event's `name` property to see if Flash has\n * already loaded, which rules out possible `iframe` sandboxing.\n * @private\n */\n var _getSandboxStatusFromErrorEvent = function(event) {\n var isSandboxed = null;\n if (_pageIsFramed === false || event && event.type === \"error\" && event.name && _errorsThatOnlyOccurAfterFlashLoads.indexOf(event.name) !== -1) {\n isSandboxed = false;\n }\n return isSandboxed;\n };\n /**\n * Preprocess any special behaviors, reactions, or state changes after receiving this event.\n * Executes only once per event emitted, NOT once per client.\n * @private\n */\n var _preprocessEvent = function(event) {\n var element = event.target || _currentElement || null;\n var sourceIsSwf = event._source === \"swf\";\n delete event._source;\n switch (event.type) {\n case \"error\":\n var isSandboxed = event.name === \"flash-sandboxed\" || _getSandboxStatusFromErrorEvent(event);\n if (typeof isSandboxed === \"boolean\") {\n _flashState.sandboxed = isSandboxed;\n }\n if (_flashStateErrorNames.indexOf(event.name) !== -1) {\n _extend(_flashState, {\n disabled: event.name === \"flash-disabled\",\n outdated: event.name === \"flash-outdated\",\n unavailable: event.name === \"flash-unavailable\",\n degraded: event.name === \"flash-degraded\",\n deactivated: event.name === \"flash-deactivated\",\n overdue: event.name === \"flash-overdue\",\n ready: false\n });\n } else if (event.name === \"version-mismatch\") {\n _zcSwfVersion = event.swfVersion;\n _extend(_flashState, {\n disabled: false,\n outdated: false,\n unavailable: false,\n degraded: false,\n deactivated: false,\n overdue: false,\n ready: false\n });\n }\n _clearTimeoutsAndPolling();\n break;\n\n case \"ready\":\n _zcSwfVersion = event.swfVersion;\n var wasDeactivated = _flashState.deactivated === true;\n _extend(_flashState, {\n disabled: false,\n outdated: false,\n sandboxed: false,\n unavailable: false,\n degraded: false,\n deactivated: false,\n overdue: wasDeactivated,\n ready: !wasDeactivated\n });\n _clearTimeoutsAndPolling();\n break;\n\n case \"beforecopy\":\n _copyTarget = element;\n break;\n\n case \"copy\":\n var textContent, htmlContent, targetEl = event.relatedTarget;\n if (!(_clipData[\"text/html\"] || _clipData[\"text/plain\"]) && targetEl && (htmlContent = targetEl.value || targetEl.outerHTML || targetEl.innerHTML) && (textContent = targetEl.value || targetEl.textContent || targetEl.innerText)) {\n event.clipboardData.clearData();\n event.clipboardData.setData(\"text/plain\", textContent);\n if (htmlContent !== textContent) {\n event.clipboardData.setData(\"text/html\", htmlContent);\n }\n } else if (!_clipData[\"text/plain\"] && event.target && (textContent = event.target.getAttribute(\"data-clipboard-text\"))) {\n event.clipboardData.clearData();\n event.clipboardData.setData(\"text/plain\", textContent);\n }\n break;\n\n case \"aftercopy\":\n _queueEmitClipboardErrors(event);\n ZeroClipboard.clearData();\n if (element && element !== _safeActiveElement() && element.focus) {\n element.focus();\n }\n break;\n\n case \"_mouseover\":\n ZeroClipboard.focus(element);\n if (_globalConfig.bubbleEvents === true && sourceIsSwf) {\n if (element && element !== event.relatedTarget && !_containedBy(event.relatedTarget, element)) {\n _fireMouseEvent(_extend({}, event, {\n type: \"mouseenter\",\n bubbles: false,\n cancelable: false\n }));\n }\n _fireMouseEvent(_extend({}, event, {\n type: \"mouseover\"\n }));\n }\n break;\n\n case \"_mouseout\":\n ZeroClipboard.blur();\n if (_globalConfig.bubbleEvents === true && sourceIsSwf) {\n if (element && element !== event.relatedTarget && !_containedBy(event.relatedTarget, element)) {\n _fireMouseEvent(_extend({}, event, {\n type: \"mouseleave\",\n bubbles: false,\n cancelable: false\n }));\n }\n _fireMouseEvent(_extend({}, event, {\n type: \"mouseout\"\n }));\n }\n break;\n\n case \"_mousedown\":\n _addClass(element, _globalConfig.activeClass);\n if (_globalConfig.bubbleEvents === true && sourceIsSwf) {\n _fireMouseEvent(_extend({}, event, {\n type: event.type.slice(1)\n }));\n }\n break;\n\n case \"_mouseup\":\n _removeClass(element, _globalConfig.activeClass);\n if (_globalConfig.bubbleEvents === true && sourceIsSwf) {\n _fireMouseEvent(_extend({}, event, {\n type: event.type.slice(1)\n }));\n }\n break;\n\n case \"_click\":\n _copyTarget = null;\n if (_globalConfig.bubbleEvents === true && sourceIsSwf) {\n _fireMouseEvent(_extend({}, event, {\n type: event.type.slice(1)\n }));\n }\n break;\n\n case \"_mousemove\":\n if (_globalConfig.bubbleEvents === true && sourceIsSwf) {\n _fireMouseEvent(_extend({}, event, {\n type: event.type.slice(1)\n }));\n }\n break;\n }\n if (/^_(?:click|mouse(?:over|out|down|up|move))$/.test(event.type)) {\n return true;\n }\n };\n /**\n * Check an \"aftercopy\" event for clipboard errors and emit a corresponding \"error\" event.\n * @private\n */\n var _queueEmitClipboardErrors = function(aftercopyEvent) {\n if (aftercopyEvent.errors && aftercopyEvent.errors.length > 0) {\n var errorEvent = _deepCopy(aftercopyEvent);\n _extend(errorEvent, {\n type: \"error\",\n name: \"clipboard-error\"\n });\n delete errorEvent.success;\n _setTimeout(function() {\n ZeroClipboard.emit(errorEvent);\n }, 0);\n }\n };\n /**\n * Dispatch a synthetic MouseEvent.\n *\n * @returns `undefined`\n * @private\n */\n var _fireMouseEvent = function(event) {\n if (!(event && typeof event.type === \"string\" && event)) {\n return;\n }\n var e, target = event.target || null, doc = target && target.ownerDocument || _document, defaults = {\n view: doc.defaultView || _window,\n canBubble: true,\n cancelable: true,\n detail: event.type === \"click\" ? 1 : 0,\n button: typeof event.which === \"number\" ? event.which - 1 : typeof event.button === \"number\" ? event.button : doc.createEvent ? 0 : 1\n }, args = _extend(defaults, event);\n if (!target) {\n return;\n }\n if (doc.createEvent && target.dispatchEvent) {\n args = [ args.type, args.canBubble, args.cancelable, args.view, args.detail, args.screenX, args.screenY, args.clientX, args.clientY, args.ctrlKey, args.altKey, args.shiftKey, args.metaKey, args.button, args.relatedTarget ];\n e = doc.createEvent(\"MouseEvents\");\n if (e.initMouseEvent) {\n e.initMouseEvent.apply(e, args);\n e._source = \"js\";\n target.dispatchEvent(e);\n }\n }\n };\n /**\n * Continuously poll the DOM until either:\n * (a) the fallback content becomes visible, or\n * (b) we receive an event from SWF (handled elsewhere)\n *\n * IMPORTANT:\n * This is NOT a necessary check but it can result in significantly faster\n * detection of bad `swfPath` configuration and/or network/server issues [in\n * supported browsers] than waiting for the entire `flashLoadTimeout` duration\n * to elapse before detecting that the SWF cannot be loaded. The detection\n * duration can be anywhere from 10-30 times faster [in supported browsers] by\n * using this approach.\n *\n * @returns `undefined`\n * @private\n */\n var _watchForSwfFallbackContent = function() {\n var maxWait = _globalConfig.flashLoadTimeout;\n if (typeof maxWait === \"number\" && maxWait >= 0) {\n var pollWait = Math.min(1e3, maxWait / 10);\n var fallbackContentId = _globalConfig.swfObjectId + \"_fallbackContent\";\n _swfFallbackCheckInterval = _setInterval(function() {\n var el = _document.getElementById(fallbackContentId);\n if (_isElementVisible(el)) {\n _clearTimeoutsAndPolling();\n _flashState.deactivated = null;\n ZeroClipboard.emit({\n type: \"error\",\n name: \"swf-not-found\"\n });\n }\n }, pollWait);\n }\n };\n /**\n * Create the HTML bridge element to embed the Flash object into.\n * @private\n */\n var _createHtmlBridge = function() {\n var container = _document.createElement(\"div\");\n container.id = _globalConfig.containerId;\n container.className = _globalConfig.containerClass;\n container.style.position = \"absolute\";\n container.style.left = \"0px\";\n container.style.top = \"-9999px\";\n container.style.width = \"1px\";\n container.style.height = \"1px\";\n container.style.zIndex = \"\" + _getSafeZIndex(_globalConfig.zIndex);\n return container;\n };\n /**\n * Get the HTML element container that wraps the Flash bridge object/element.\n * @private\n */\n var _getHtmlBridge = function(flashBridge) {\n var htmlBridge = flashBridge && flashBridge.parentNode;\n while (htmlBridge && htmlBridge.nodeName === \"OBJECT\" && htmlBridge.parentNode) {\n htmlBridge = htmlBridge.parentNode;\n }\n return htmlBridge || null;\n };\n /**\n * Create the SWF object.\n *\n * @returns The SWF object reference.\n * @private\n */\n var _embedSwf = function() {\n var len, flashBridge = _flashState.bridge, container = _getHtmlBridge(flashBridge);\n if (!flashBridge) {\n var allowScriptAccess = _determineScriptAccess(_window.location.host, _globalConfig);\n var allowNetworking = allowScriptAccess === \"never\" ? \"none\" : \"all\";\n var flashvars = _vars(_extend({\n jsVersion: ZeroClipboard.version\n }, _globalConfig));\n var swfUrl = _globalConfig.swfPath + _cacheBust(_globalConfig.swfPath, _globalConfig);\n container = _createHtmlBridge();\n var divToBeReplaced = _document.createElement(\"div\");\n container.appendChild(divToBeReplaced);\n _document.body.appendChild(container);\n var tmpDiv = _document.createElement(\"div\");\n var usingActiveX = _flashState.pluginType === \"activex\";\n tmpDiv.innerHTML = '\" + (usingActiveX ? '' : \"\") + '' + '' + '' + '' + '' + '
     
    ' + \"
    \";\n flashBridge = tmpDiv.firstChild;\n tmpDiv = null;\n _unwrap(flashBridge).ZeroClipboard = ZeroClipboard;\n container.replaceChild(flashBridge, divToBeReplaced);\n _watchForSwfFallbackContent();\n }\n if (!flashBridge) {\n flashBridge = _document[_globalConfig.swfObjectId];\n if (flashBridge && (len = flashBridge.length)) {\n flashBridge = flashBridge[len - 1];\n }\n if (!flashBridge && container) {\n flashBridge = container.firstChild;\n }\n }\n _flashState.bridge = flashBridge || null;\n return flashBridge;\n };\n /**\n * Destroy the SWF object.\n * @private\n */\n var _unembedSwf = function() {\n var flashBridge = _flashState.bridge;\n if (flashBridge) {\n var htmlBridge = _getHtmlBridge(flashBridge);\n if (htmlBridge) {\n if (_flashState.pluginType === \"activex\" && \"readyState\" in flashBridge) {\n flashBridge.style.display = \"none\";\n (function removeSwfFromIE() {\n if (flashBridge.readyState === 4) {\n for (var prop in flashBridge) {\n if (typeof flashBridge[prop] === \"function\") {\n flashBridge[prop] = null;\n }\n }\n if (flashBridge.parentNode) {\n flashBridge.parentNode.removeChild(flashBridge);\n }\n if (htmlBridge.parentNode) {\n htmlBridge.parentNode.removeChild(htmlBridge);\n }\n } else {\n _setTimeout(removeSwfFromIE, 10);\n }\n })();\n } else {\n if (flashBridge.parentNode) {\n flashBridge.parentNode.removeChild(flashBridge);\n }\n if (htmlBridge.parentNode) {\n htmlBridge.parentNode.removeChild(htmlBridge);\n }\n }\n }\n _clearTimeoutsAndPolling();\n _flashState.ready = null;\n _flashState.bridge = null;\n _flashState.deactivated = null;\n _zcSwfVersion = undefined;\n }\n };\n /**\n * Map the data format names of the \"clipData\" to Flash-friendly names.\n *\n * @returns A new transformed object.\n * @private\n */\n var _mapClipDataToFlash = function(clipData) {\n var newClipData = {}, formatMap = {};\n if (!(typeof clipData === \"object\" && clipData)) {\n return;\n }\n for (var dataFormat in clipData) {\n if (dataFormat && _hasOwn.call(clipData, dataFormat) && typeof clipData[dataFormat] === \"string\" && clipData[dataFormat]) {\n switch (dataFormat.toLowerCase()) {\n case \"text/plain\":\n case \"text\":\n case \"air:text\":\n case \"flash:text\":\n newClipData.text = clipData[dataFormat];\n formatMap.text = dataFormat;\n break;\n\n case \"text/html\":\n case \"html\":\n case \"air:html\":\n case \"flash:html\":\n newClipData.html = clipData[dataFormat];\n formatMap.html = dataFormat;\n break;\n\n case \"application/rtf\":\n case \"text/rtf\":\n case \"rtf\":\n case \"richtext\":\n case \"air:rtf\":\n case \"flash:rtf\":\n newClipData.rtf = clipData[dataFormat];\n formatMap.rtf = dataFormat;\n break;\n\n default:\n break;\n }\n }\n }\n return {\n data: newClipData,\n formatMap: formatMap\n };\n };\n /**\n * Map the data format names from Flash-friendly names back to their original \"clipData\" names (via a format mapping).\n *\n * @returns A new transformed object.\n * @private\n */\n var _mapClipResultsFromFlash = function(clipResults, formatMap) {\n if (!(typeof clipResults === \"object\" && clipResults && typeof formatMap === \"object\" && formatMap)) {\n return clipResults;\n }\n var newResults = {};\n for (var prop in clipResults) {\n if (_hasOwn.call(clipResults, prop)) {\n if (prop === \"errors\") {\n newResults[prop] = clipResults[prop] ? clipResults[prop].slice() : [];\n for (var i = 0, len = newResults[prop].length; i < len; i++) {\n newResults[prop][i].format = formatMap[newResults[prop][i].format];\n }\n } else if (prop !== \"success\" && prop !== \"data\") {\n newResults[prop] = clipResults[prop];\n } else {\n newResults[prop] = {};\n var tmpHash = clipResults[prop];\n for (var dataFormat in tmpHash) {\n if (dataFormat && _hasOwn.call(tmpHash, dataFormat) && _hasOwn.call(formatMap, dataFormat)) {\n newResults[prop][formatMap[dataFormat]] = tmpHash[dataFormat];\n }\n }\n }\n }\n }\n return newResults;\n };\n /**\n * Will look at a path, and will create a \"?noCache={time}\" or \"&noCache={time}\"\n * query param string to return. Does NOT append that string to the original path.\n * This is useful because ExternalInterface often breaks when a Flash SWF is cached.\n *\n * @returns The `noCache` query param with necessary \"?\"/\"&\" prefix.\n * @private\n */\n var _cacheBust = function(path, options) {\n var cacheBust = options == null || options && options.cacheBust === true;\n if (cacheBust) {\n return (path.indexOf(\"?\") === -1 ? \"?\" : \"&\") + \"noCache=\" + _now();\n } else {\n return \"\";\n }\n };\n /**\n * Creates a query string for the FlashVars param.\n * Does NOT include the cache-busting query param.\n *\n * @returns FlashVars query string\n * @private\n */\n var _vars = function(options) {\n var i, len, domain, domains, str = \"\", trustedOriginsExpanded = [];\n if (options.trustedDomains) {\n if (typeof options.trustedDomains === \"string\") {\n domains = [ options.trustedDomains ];\n } else if (typeof options.trustedDomains === \"object\" && \"length\" in options.trustedDomains) {\n domains = options.trustedDomains;\n }\n }\n if (domains && domains.length) {\n for (i = 0, len = domains.length; i < len; i++) {\n if (_hasOwn.call(domains, i) && domains[i] && typeof domains[i] === \"string\") {\n domain = _extractDomain(domains[i]);\n if (!domain) {\n continue;\n }\n if (domain === \"*\") {\n trustedOriginsExpanded.length = 0;\n trustedOriginsExpanded.push(domain);\n break;\n }\n trustedOriginsExpanded.push.apply(trustedOriginsExpanded, [ domain, \"//\" + domain, _window.location.protocol + \"//\" + domain ]);\n }\n }\n }\n if (trustedOriginsExpanded.length) {\n str += \"trustedOrigins=\" + _encodeURIComponent(trustedOriginsExpanded.join(\",\"));\n }\n if (options.forceEnhancedClipboard === true) {\n str += (str ? \"&\" : \"\") + \"forceEnhancedClipboard=true\";\n }\n if (typeof options.swfObjectId === \"string\" && options.swfObjectId) {\n str += (str ? \"&\" : \"\") + \"swfObjectId=\" + _encodeURIComponent(options.swfObjectId);\n }\n if (typeof options.jsVersion === \"string\" && options.jsVersion) {\n str += (str ? \"&\" : \"\") + \"jsVersion=\" + _encodeURIComponent(options.jsVersion);\n }\n return str;\n };\n /**\n * Extract the domain (e.g. \"github.com\") from an origin (e.g. \"https://github.com\") or\n * URL (e.g. \"https://github.com/zeroclipboard/zeroclipboard/\").\n *\n * @returns the domain\n * @private\n */\n var _extractDomain = function(originOrUrl) {\n if (originOrUrl == null || originOrUrl === \"\") {\n return null;\n }\n originOrUrl = originOrUrl.replace(/^\\s+|\\s+$/g, \"\");\n if (originOrUrl === \"\") {\n return null;\n }\n var protocolIndex = originOrUrl.indexOf(\"//\");\n originOrUrl = protocolIndex === -1 ? originOrUrl : originOrUrl.slice(protocolIndex + 2);\n var pathIndex = originOrUrl.indexOf(\"/\");\n originOrUrl = pathIndex === -1 ? originOrUrl : protocolIndex === -1 || pathIndex === 0 ? null : originOrUrl.slice(0, pathIndex);\n if (originOrUrl && originOrUrl.slice(-4).toLowerCase() === \".swf\") {\n return null;\n }\n return originOrUrl || null;\n };\n /**\n * Set `allowScriptAccess` based on `trustedDomains` and `window.location.host` vs. `swfPath`.\n *\n * @returns The appropriate script access level.\n * @private\n */\n var _determineScriptAccess = function() {\n var _extractAllDomains = function(origins) {\n var i, len, tmp, resultsArray = [];\n if (typeof origins === \"string\") {\n origins = [ origins ];\n }\n if (!(typeof origins === \"object\" && origins && typeof origins.length === \"number\")) {\n return resultsArray;\n }\n for (i = 0, len = origins.length; i < len; i++) {\n if (_hasOwn.call(origins, i) && (tmp = _extractDomain(origins[i]))) {\n if (tmp === \"*\") {\n resultsArray.length = 0;\n resultsArray.push(\"*\");\n break;\n }\n if (resultsArray.indexOf(tmp) === -1) {\n resultsArray.push(tmp);\n }\n }\n }\n return resultsArray;\n };\n return function(currentDomain, configOptions) {\n var swfDomain = _extractDomain(configOptions.swfPath);\n if (swfDomain === null) {\n swfDomain = currentDomain;\n }\n var trustedDomains = _extractAllDomains(configOptions.trustedDomains);\n var len = trustedDomains.length;\n if (len > 0) {\n if (len === 1 && trustedDomains[0] === \"*\") {\n return \"always\";\n }\n if (trustedDomains.indexOf(currentDomain) !== -1) {\n if (len === 1 && currentDomain === swfDomain) {\n return \"sameDomain\";\n }\n return \"always\";\n }\n }\n return \"never\";\n };\n }();\n /**\n * Get the currently active/focused DOM element.\n *\n * @returns the currently active/focused element, or `null`\n * @private\n */\n var _safeActiveElement = function() {\n try {\n return _document.activeElement;\n } catch (err) {\n return null;\n }\n };\n /**\n * Add a class to an element, if it doesn't already have it.\n *\n * @returns The element, with its new class added.\n * @private\n */\n var _addClass = function(element, value) {\n var c, cl, className, classNames = [];\n if (typeof value === \"string\" && value) {\n classNames = value.split(/\\s+/);\n }\n if (element && element.nodeType === 1 && classNames.length > 0) {\n if (element.classList) {\n for (c = 0, cl = classNames.length; c < cl; c++) {\n element.classList.add(classNames[c]);\n }\n } else if (element.hasOwnProperty(\"className\")) {\n className = \" \" + element.className + \" \";\n for (c = 0, cl = classNames.length; c < cl; c++) {\n if (className.indexOf(\" \" + classNames[c] + \" \") === -1) {\n className += classNames[c] + \" \";\n }\n }\n element.className = className.replace(/^\\s+|\\s+$/g, \"\");\n }\n }\n return element;\n };\n /**\n * Remove a class from an element, if it has it.\n *\n * @returns The element, with its class removed.\n * @private\n */\n var _removeClass = function(element, value) {\n var c, cl, className, classNames = [];\n if (typeof value === \"string\" && value) {\n classNames = value.split(/\\s+/);\n }\n if (element && element.nodeType === 1 && classNames.length > 0) {\n if (element.classList && element.classList.length > 0) {\n for (c = 0, cl = classNames.length; c < cl; c++) {\n element.classList.remove(classNames[c]);\n }\n } else if (element.className) {\n className = (\" \" + element.className + \" \").replace(/[\\r\\n\\t]/g, \" \");\n for (c = 0, cl = classNames.length; c < cl; c++) {\n className = className.replace(\" \" + classNames[c] + \" \", \" \");\n }\n element.className = className.replace(/^\\s+|\\s+$/g, \"\");\n }\n }\n return element;\n };\n /**\n * Attempt to interpret the element's CSS styling. If `prop` is `\"cursor\"`,\n * then we assume that it should be a hand (\"pointer\") cursor if the element\n * is an anchor element (\"a\" tag).\n *\n * @returns The computed style property.\n * @private\n */\n var _getStyle = function(el, prop) {\n var value = _getComputedStyle(el, null).getPropertyValue(prop);\n if (prop === \"cursor\") {\n if (!value || value === \"auto\") {\n if (el.nodeName === \"A\") {\n return \"pointer\";\n }\n }\n }\n return value;\n };\n /**\n * Get the absolutely positioned coordinates of a DOM element.\n *\n * @returns Object containing the element's position, width, and height.\n * @private\n */\n var _getElementPosition = function(el) {\n var pos = {\n left: 0,\n top: 0,\n width: 0,\n height: 0\n };\n if (el.getBoundingClientRect) {\n var elRect = el.getBoundingClientRect();\n var pageXOffset = _window.pageXOffset;\n var pageYOffset = _window.pageYOffset;\n var leftBorderWidth = _document.documentElement.clientLeft || 0;\n var topBorderWidth = _document.documentElement.clientTop || 0;\n var leftBodyOffset = 0;\n var topBodyOffset = 0;\n if (_getStyle(_document.body, \"position\") === \"relative\") {\n var bodyRect = _document.body.getBoundingClientRect();\n var htmlRect = _document.documentElement.getBoundingClientRect();\n leftBodyOffset = bodyRect.left - htmlRect.left || 0;\n topBodyOffset = bodyRect.top - htmlRect.top || 0;\n }\n pos.left = elRect.left + pageXOffset - leftBorderWidth - leftBodyOffset;\n pos.top = elRect.top + pageYOffset - topBorderWidth - topBodyOffset;\n pos.width = \"width\" in elRect ? elRect.width : elRect.right - elRect.left;\n pos.height = \"height\" in elRect ? elRect.height : elRect.bottom - elRect.top;\n }\n return pos;\n };\n /**\n * Determine is an element is visible somewhere within the document (page).\n *\n * @returns Boolean\n * @private\n */\n var _isElementVisible = function(el) {\n if (!el) {\n return false;\n }\n var styles = _getComputedStyle(el, null);\n var hasCssHeight = _parseFloat(styles.height) > 0;\n var hasCssWidth = _parseFloat(styles.width) > 0;\n var hasCssTop = _parseFloat(styles.top) >= 0;\n var hasCssLeft = _parseFloat(styles.left) >= 0;\n var cssKnows = hasCssHeight && hasCssWidth && hasCssTop && hasCssLeft;\n var rect = cssKnows ? null : _getElementPosition(el);\n var isVisible = styles.display !== \"none\" && styles.visibility !== \"collapse\" && (cssKnows || !!rect && (hasCssHeight || rect.height > 0) && (hasCssWidth || rect.width > 0) && (hasCssTop || rect.top >= 0) && (hasCssLeft || rect.left >= 0));\n return isVisible;\n };\n /**\n * Clear all existing timeouts and interval polling delegates.\n *\n * @returns `undefined`\n * @private\n */\n var _clearTimeoutsAndPolling = function() {\n _clearTimeout(_flashCheckTimeout);\n _flashCheckTimeout = 0;\n _clearInterval(_swfFallbackCheckInterval);\n _swfFallbackCheckInterval = 0;\n };\n /**\n * Reposition the Flash object to cover the currently activated element.\n *\n * @returns `undefined`\n * @private\n */\n var _reposition = function() {\n var htmlBridge;\n if (_currentElement && (htmlBridge = _getHtmlBridge(_flashState.bridge))) {\n var pos = _getElementPosition(_currentElement);\n _extend(htmlBridge.style, {\n width: pos.width + \"px\",\n height: pos.height + \"px\",\n top: pos.top + \"px\",\n left: pos.left + \"px\",\n zIndex: \"\" + _getSafeZIndex(_globalConfig.zIndex)\n });\n }\n };\n /**\n * Sends a signal to the Flash object to display the hand cursor if `true`.\n *\n * @returns `undefined`\n * @private\n */\n var _setHandCursor = function(enabled) {\n if (_flashState.ready === true) {\n if (_flashState.bridge && typeof _flashState.bridge.setHandCursor === \"function\") {\n _flashState.bridge.setHandCursor(enabled);\n } else {\n _flashState.ready = false;\n }\n }\n };\n /**\n * Get a safe value for `zIndex`\n *\n * @returns an integer, or \"auto\"\n * @private\n */\n var _getSafeZIndex = function(val) {\n if (/^(?:auto|inherit)$/.test(val)) {\n return val;\n }\n var zIndex;\n if (typeof val === \"number\" && !_isNaN(val)) {\n zIndex = val;\n } else if (typeof val === \"string\") {\n zIndex = _getSafeZIndex(_parseInt(val, 10));\n }\n return typeof zIndex === \"number\" ? zIndex : \"auto\";\n };\n /**\n * Attempt to detect if ZeroClipboard is executing inside of a sandboxed iframe.\n * If it is, Flash Player cannot be used, so ZeroClipboard is dead in the water.\n *\n * @see {@link http://lists.w3.org/Archives/Public/public-whatwg-archive/2014Dec/0002.html}\n * @see {@link https://github.com/zeroclipboard/zeroclipboard/issues/511}\n * @see {@link http://zeroclipboard.org/test-iframes.html}\n *\n * @returns `true` (is sandboxed), `false` (is not sandboxed), or `null` (uncertain) \n * @private\n */\n var _detectSandbox = function(doNotReassessFlashSupport) {\n var effectiveScriptOrigin, frame, frameError, previousState = _flashState.sandboxed, isSandboxed = null;\n doNotReassessFlashSupport = doNotReassessFlashSupport === true;\n if (_pageIsFramed === false) {\n isSandboxed = false;\n } else {\n try {\n frame = window.frameElement || null;\n } catch (e) {\n frameError = {\n name: e.name,\n message: e.message\n };\n }\n if (frame && frame.nodeType === 1 && frame.nodeName === \"IFRAME\") {\n try {\n isSandboxed = frame.hasAttribute(\"sandbox\");\n } catch (e) {\n isSandboxed = null;\n }\n } else {\n try {\n effectiveScriptOrigin = document.domain || null;\n } catch (e) {\n effectiveScriptOrigin = null;\n }\n if (effectiveScriptOrigin === null || frameError && frameError.name === \"SecurityError\" && /(^|[\\s\\(\\[@])sandbox(es|ed|ing|[\\s\\.,!\\)\\]@]|$)/.test(frameError.message.toLowerCase())) {\n isSandboxed = true;\n }\n }\n }\n _flashState.sandboxed = isSandboxed;\n if (previousState !== isSandboxed && !doNotReassessFlashSupport) {\n _detectFlashSupport(_ActiveXObject);\n }\n return isSandboxed;\n };\n /**\n * Detect the Flash Player status, version, and plugin type.\n *\n * @see {@link https://code.google.com/p/doctype-mirror/wiki/ArticleDetectFlash#The_code}\n * @see {@link http://stackoverflow.com/questions/12866060/detecting-pepper-ppapi-flash-with-javascript}\n *\n * @returns `undefined`\n * @private\n */\n var _detectFlashSupport = function(ActiveXObject) {\n var plugin, ax, mimeType, hasFlash = false, isActiveX = false, isPPAPI = false, flashVersion = \"\";\n /**\n * Derived from Apple's suggested sniffer.\n * @param {String} desc e.g. \"Shockwave Flash 7.0 r61\"\n * @returns {String} \"7.0.61\"\n * @private\n */\n function parseFlashVersion(desc) {\n var matches = desc.match(/[\\d]+/g);\n matches.length = 3;\n return matches.join(\".\");\n }\n function isPepperFlash(flashPlayerFileName) {\n return !!flashPlayerFileName && (flashPlayerFileName = flashPlayerFileName.toLowerCase()) && (/^(pepflashplayer\\.dll|libpepflashplayer\\.so|pepperflashplayer\\.plugin)$/.test(flashPlayerFileName) || flashPlayerFileName.slice(-13) === \"chrome.plugin\");\n }\n function inspectPlugin(plugin) {\n if (plugin) {\n hasFlash = true;\n if (plugin.version) {\n flashVersion = parseFlashVersion(plugin.version);\n }\n if (!flashVersion && plugin.description) {\n flashVersion = parseFlashVersion(plugin.description);\n }\n if (plugin.filename) {\n isPPAPI = isPepperFlash(plugin.filename);\n }\n }\n }\n if (_navigator.plugins && _navigator.plugins.length) {\n plugin = _navigator.plugins[\"Shockwave Flash\"];\n inspectPlugin(plugin);\n if (_navigator.plugins[\"Shockwave Flash 2.0\"]) {\n hasFlash = true;\n flashVersion = \"2.0.0.11\";\n }\n } else if (_navigator.mimeTypes && _navigator.mimeTypes.length) {\n mimeType = _navigator.mimeTypes[\"application/x-shockwave-flash\"];\n plugin = mimeType && mimeType.enabledPlugin;\n inspectPlugin(plugin);\n } else if (typeof ActiveXObject !== \"undefined\") {\n isActiveX = true;\n try {\n ax = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.7\");\n hasFlash = true;\n flashVersion = parseFlashVersion(ax.GetVariable(\"$version\"));\n } catch (e1) {\n try {\n ax = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.6\");\n hasFlash = true;\n flashVersion = \"6.0.21\";\n } catch (e2) {\n try {\n ax = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash\");\n hasFlash = true;\n flashVersion = parseFlashVersion(ax.GetVariable(\"$version\"));\n } catch (e3) {\n isActiveX = false;\n }\n }\n }\n }\n _flashState.disabled = hasFlash !== true;\n _flashState.outdated = flashVersion && _parseFloat(flashVersion) < _parseFloat(_minimumFlashVersion);\n _flashState.version = flashVersion || \"0.0.0\";\n _flashState.pluginType = isPPAPI ? \"pepper\" : isActiveX ? \"activex\" : hasFlash ? \"netscape\" : \"unknown\";\n };\n /**\n * Invoke the Flash detection algorithms immediately upon inclusion so we're not waiting later.\n */\n _detectFlashSupport(_ActiveXObject);\n /**\n * Always assess the `sandboxed` state of the page at important Flash-related moments.\n */\n _detectSandbox(true);\n /**\n * A shell constructor for `ZeroClipboard` client instances.\n *\n * @constructor\n */\n var ZeroClipboard = function() {\n if (!(this instanceof ZeroClipboard)) {\n return new ZeroClipboard();\n }\n if (typeof ZeroClipboard._createClient === \"function\") {\n ZeroClipboard._createClient.apply(this, _args(arguments));\n }\n };\n /**\n * The ZeroClipboard library's version number.\n *\n * @static\n * @readonly\n * @property {string}\n */\n _defineProperty(ZeroClipboard, \"version\", {\n value: \"2.2.0\",\n writable: false,\n configurable: true,\n enumerable: true\n });\n /**\n * Update or get a copy of the ZeroClipboard global configuration.\n * Returns a copy of the current/updated configuration.\n *\n * @returns Object\n * @static\n */\n ZeroClipboard.config = function() {\n return _config.apply(this, _args(arguments));\n };\n /**\n * Diagnostic method that describes the state of the browser, Flash Player, and ZeroClipboard.\n *\n * @returns Object\n * @static\n */\n ZeroClipboard.state = function() {\n return _state.apply(this, _args(arguments));\n };\n /**\n * Check if Flash is unusable for any reason: disabled, outdated, deactivated, etc.\n *\n * @returns Boolean\n * @static\n */\n ZeroClipboard.isFlashUnusable = function() {\n return _isFlashUnusable.apply(this, _args(arguments));\n };\n /**\n * Register an event listener.\n *\n * @returns `ZeroClipboard`\n * @static\n */\n ZeroClipboard.on = function() {\n return _on.apply(this, _args(arguments));\n };\n /**\n * Unregister an event listener.\n * If no `listener` function/object is provided, it will unregister all listeners for the provided `eventType`.\n * If no `eventType` is provided, it will unregister all listeners for every event type.\n *\n * @returns `ZeroClipboard`\n * @static\n */\n ZeroClipboard.off = function() {\n return _off.apply(this, _args(arguments));\n };\n /**\n * Retrieve event listeners for an `eventType`.\n * If no `eventType` is provided, it will retrieve all listeners for every event type.\n *\n * @returns array of listeners for the `eventType`; if no `eventType`, then a map/hash object of listeners for all event types; or `null`\n */\n ZeroClipboard.handlers = function() {\n return _listeners.apply(this, _args(arguments));\n };\n /**\n * Event emission receiver from the Flash object, forwarding to any registered JavaScript event listeners.\n *\n * @returns For the \"copy\" event, returns the Flash-friendly \"clipData\" object; otherwise `undefined`.\n * @static\n */\n ZeroClipboard.emit = function() {\n return _emit.apply(this, _args(arguments));\n };\n /**\n * Create and embed the Flash object.\n *\n * @returns The Flash object\n * @static\n */\n ZeroClipboard.create = function() {\n return _create.apply(this, _args(arguments));\n };\n /**\n * Self-destruct and clean up everything, including the embedded Flash object.\n *\n * @returns `undefined`\n * @static\n */\n ZeroClipboard.destroy = function() {\n return _destroy.apply(this, _args(arguments));\n };\n /**\n * Set the pending data for clipboard injection.\n *\n * @returns `undefined`\n * @static\n */\n ZeroClipboard.setData = function() {\n return _setData.apply(this, _args(arguments));\n };\n /**\n * Clear the pending data for clipboard injection.\n * If no `format` is provided, all pending data formats will be cleared.\n *\n * @returns `undefined`\n * @static\n */\n ZeroClipboard.clearData = function() {\n return _clearData.apply(this, _args(arguments));\n };\n /**\n * Get a copy of the pending data for clipboard injection.\n * If no `format` is provided, a copy of ALL pending data formats will be returned.\n *\n * @returns `String` or `Object`\n * @static\n */\n ZeroClipboard.getData = function() {\n return _getData.apply(this, _args(arguments));\n };\n /**\n * Sets the current HTML object that the Flash object should overlay. This will put the global\n * Flash object on top of the current element; depending on the setup, this may also set the\n * pending clipboard text data as well as the Flash object's wrapping element's title attribute\n * based on the underlying HTML element and ZeroClipboard configuration.\n *\n * @returns `undefined`\n * @static\n */\n ZeroClipboard.focus = ZeroClipboard.activate = function() {\n return _focus.apply(this, _args(arguments));\n };\n /**\n * Un-overlays the Flash object. This will put the global Flash object off-screen; depending on\n * the setup, this may also unset the Flash object's wrapping element's title attribute based on\n * the underlying HTML element and ZeroClipboard configuration.\n *\n * @returns `undefined`\n * @static\n */\n ZeroClipboard.blur = ZeroClipboard.deactivate = function() {\n return _blur.apply(this, _args(arguments));\n };\n /**\n * Returns the currently focused/\"activated\" HTML element that the Flash object is wrapping.\n *\n * @returns `HTMLElement` or `null`\n * @static\n */\n ZeroClipboard.activeElement = function() {\n return _activeElement.apply(this, _args(arguments));\n };\n /**\n * Keep track of the ZeroClipboard client instance counter.\n */\n var _clientIdCounter = 0;\n /**\n * Keep track of the state of the client instances.\n *\n * Entry structure:\n * _clientMeta[client.id] = {\n * instance: client,\n * elements: [],\n * handlers: {}\n * };\n */\n var _clientMeta = {};\n /**\n * Keep track of the ZeroClipboard clipped elements counter.\n */\n var _elementIdCounter = 0;\n /**\n * Keep track of the state of the clipped element relationships to clients.\n *\n * Entry structure:\n * _elementMeta[element.zcClippingId] = [client1.id, client2.id];\n */\n var _elementMeta = {};\n /**\n * Keep track of the state of the mouse event handlers for clipped elements.\n *\n * Entry structure:\n * _mouseHandlers[element.zcClippingId] = {\n * mouseover: function(event) {},\n * mouseout: function(event) {},\n * mouseenter: function(event) {},\n * mouseleave: function(event) {},\n * mousemove: function(event) {}\n * };\n */\n var _mouseHandlers = {};\n /**\n * Extending the ZeroClipboard configuration defaults for the Client module.\n */\n _extend(_globalConfig, {\n autoActivate: true\n });\n /**\n * The real constructor for `ZeroClipboard` client instances.\n * @private\n */\n var _clientConstructor = function(elements) {\n var client = this;\n client.id = \"\" + _clientIdCounter++;\n _clientMeta[client.id] = {\n instance: client,\n elements: [],\n handlers: {}\n };\n if (elements) {\n client.clip(elements);\n }\n ZeroClipboard.on(\"*\", function(event) {\n return client.emit(event);\n });\n ZeroClipboard.on(\"destroy\", function() {\n client.destroy();\n });\n ZeroClipboard.create();\n };\n /**\n * The underlying implementation of `ZeroClipboard.Client.prototype.on`.\n * @private\n */\n var _clientOn = function(eventType, listener) {\n var i, len, events, added = {}, meta = _clientMeta[this.id], handlers = meta && meta.handlers;\n if (!meta) {\n throw new Error(\"Attempted to add new listener(s) to a destroyed ZeroClipboard client instance\");\n }\n if (typeof eventType === \"string\" && eventType) {\n events = eventType.toLowerCase().split(/\\s+/);\n } else if (typeof eventType === \"object\" && eventType && typeof listener === \"undefined\") {\n for (i in eventType) {\n if (_hasOwn.call(eventType, i) && typeof i === \"string\" && i && typeof eventType[i] === \"function\") {\n this.on(i, eventType[i]);\n }\n }\n }\n if (events && events.length) {\n for (i = 0, len = events.length; i < len; i++) {\n eventType = events[i].replace(/^on/, \"\");\n added[eventType] = true;\n if (!handlers[eventType]) {\n handlers[eventType] = [];\n }\n handlers[eventType].push(listener);\n }\n if (added.ready && _flashState.ready) {\n this.emit({\n type: \"ready\",\n client: this\n });\n }\n if (added.error) {\n for (i = 0, len = _flashStateErrorNames.length; i < len; i++) {\n if (_flashState[_flashStateErrorNames[i].replace(/^flash-/, \"\")]) {\n this.emit({\n type: \"error\",\n name: _flashStateErrorNames[i],\n client: this\n });\n break;\n }\n }\n if (_zcSwfVersion !== undefined && ZeroClipboard.version !== _zcSwfVersion) {\n this.emit({\n type: \"error\",\n name: \"version-mismatch\",\n jsVersion: ZeroClipboard.version,\n swfVersion: _zcSwfVersion\n });\n }\n }\n }\n return this;\n };\n /**\n * The underlying implementation of `ZeroClipboard.Client.prototype.off`.\n * @private\n */\n var _clientOff = function(eventType, listener) {\n var i, len, foundIndex, events, perEventHandlers, meta = _clientMeta[this.id], handlers = meta && meta.handlers;\n if (!handlers) {\n return this;\n }\n if (arguments.length === 0) {\n events = _keys(handlers);\n } else if (typeof eventType === \"string\" && eventType) {\n events = eventType.split(/\\s+/);\n } else if (typeof eventType === \"object\" && eventType && typeof listener === \"undefined\") {\n for (i in eventType) {\n if (_hasOwn.call(eventType, i) && typeof i === \"string\" && i && typeof eventType[i] === \"function\") {\n this.off(i, eventType[i]);\n }\n }\n }\n if (events && events.length) {\n for (i = 0, len = events.length; i < len; i++) {\n eventType = events[i].toLowerCase().replace(/^on/, \"\");\n perEventHandlers = handlers[eventType];\n if (perEventHandlers && perEventHandlers.length) {\n if (listener) {\n foundIndex = perEventHandlers.indexOf(listener);\n while (foundIndex !== -1) {\n perEventHandlers.splice(foundIndex, 1);\n foundIndex = perEventHandlers.indexOf(listener, foundIndex);\n }\n } else {\n perEventHandlers.length = 0;\n }\n }\n }\n }\n return this;\n };\n /**\n * The underlying implementation of `ZeroClipboard.Client.prototype.handlers`.\n * @private\n */\n var _clientListeners = function(eventType) {\n var copy = null, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;\n if (handlers) {\n if (typeof eventType === \"string\" && eventType) {\n copy = handlers[eventType] ? handlers[eventType].slice(0) : [];\n } else {\n copy = _deepCopy(handlers);\n }\n }\n return copy;\n };\n /**\n * The underlying implementation of `ZeroClipboard.Client.prototype.emit`.\n * @private\n */\n var _clientEmit = function(event) {\n if (_clientShouldEmit.call(this, event)) {\n if (typeof event === \"object\" && event && typeof event.type === \"string\" && event.type) {\n event = _extend({}, event);\n }\n var eventCopy = _extend({}, _createEvent(event), {\n client: this\n });\n _clientDispatchCallbacks.call(this, eventCopy);\n }\n return this;\n };\n /**\n * The underlying implementation of `ZeroClipboard.Client.prototype.clip`.\n * @private\n */\n var _clientClip = function(elements) {\n if (!_clientMeta[this.id]) {\n throw new Error(\"Attempted to clip element(s) to a destroyed ZeroClipboard client instance\");\n }\n elements = _prepClip(elements);\n for (var i = 0; i < elements.length; i++) {\n if (_hasOwn.call(elements, i) && elements[i] && elements[i].nodeType === 1) {\n if (!elements[i].zcClippingId) {\n elements[i].zcClippingId = \"zcClippingId_\" + _elementIdCounter++;\n _elementMeta[elements[i].zcClippingId] = [ this.id ];\n if (_globalConfig.autoActivate === true) {\n _addMouseHandlers(elements[i]);\n }\n } else if (_elementMeta[elements[i].zcClippingId].indexOf(this.id) === -1) {\n _elementMeta[elements[i].zcClippingId].push(this.id);\n }\n var clippedElements = _clientMeta[this.id] && _clientMeta[this.id].elements;\n if (clippedElements.indexOf(elements[i]) === -1) {\n clippedElements.push(elements[i]);\n }\n }\n }\n return this;\n };\n /**\n * The underlying implementation of `ZeroClipboard.Client.prototype.unclip`.\n * @private\n */\n var _clientUnclip = function(elements) {\n var meta = _clientMeta[this.id];\n if (!meta) {\n return this;\n }\n var clippedElements = meta.elements;\n var arrayIndex;\n if (typeof elements === \"undefined\") {\n elements = clippedElements.slice(0);\n } else {\n elements = _prepClip(elements);\n }\n for (var i = elements.length; i--; ) {\n if (_hasOwn.call(elements, i) && elements[i] && elements[i].nodeType === 1) {\n arrayIndex = 0;\n while ((arrayIndex = clippedElements.indexOf(elements[i], arrayIndex)) !== -1) {\n clippedElements.splice(arrayIndex, 1);\n }\n var clientIds = _elementMeta[elements[i].zcClippingId];\n if (clientIds) {\n arrayIndex = 0;\n while ((arrayIndex = clientIds.indexOf(this.id, arrayIndex)) !== -1) {\n clientIds.splice(arrayIndex, 1);\n }\n if (clientIds.length === 0) {\n if (_globalConfig.autoActivate === true) {\n _removeMouseHandlers(elements[i]);\n }\n delete elements[i].zcClippingId;\n }\n }\n }\n }\n return this;\n };\n /**\n * The underlying implementation of `ZeroClipboard.Client.prototype.elements`.\n * @private\n */\n var _clientElements = function() {\n var meta = _clientMeta[this.id];\n return meta && meta.elements ? meta.elements.slice(0) : [];\n };\n /**\n * The underlying implementation of `ZeroClipboard.Client.prototype.destroy`.\n * @private\n */\n var _clientDestroy = function() {\n if (!_clientMeta[this.id]) {\n return;\n }\n this.unclip();\n this.off();\n delete _clientMeta[this.id];\n };\n /**\n * Inspect an Event to see if the Client (`this`) should honor it for emission.\n * @private\n */\n var _clientShouldEmit = function(event) {\n if (!(event && event.type)) {\n return false;\n }\n if (event.client && event.client !== this) {\n return false;\n }\n var meta = _clientMeta[this.id];\n var clippedEls = meta && meta.elements;\n var hasClippedEls = !!clippedEls && clippedEls.length > 0;\n var goodTarget = !event.target || hasClippedEls && clippedEls.indexOf(event.target) !== -1;\n var goodRelTarget = event.relatedTarget && hasClippedEls && clippedEls.indexOf(event.relatedTarget) !== -1;\n var goodClient = event.client && event.client === this;\n if (!meta || !(goodTarget || goodRelTarget || goodClient)) {\n return false;\n }\n return true;\n };\n /**\n * Handle the actual dispatching of events to a client instance.\n *\n * @returns `undefined`\n * @private\n */\n var _clientDispatchCallbacks = function(event) {\n var meta = _clientMeta[this.id];\n if (!(typeof event === \"object\" && event && event.type && meta)) {\n return;\n }\n var async = _shouldPerformAsync(event);\n var wildcardTypeHandlers = meta && meta.handlers[\"*\"] || [];\n var specificTypeHandlers = meta && meta.handlers[event.type] || [];\n var handlers = wildcardTypeHandlers.concat(specificTypeHandlers);\n if (handlers && handlers.length) {\n var i, len, func, context, eventCopy, originalContext = this;\n for (i = 0, len = handlers.length; i < len; i++) {\n func = handlers[i];\n context = originalContext;\n if (typeof func === \"string\" && typeof _window[func] === \"function\") {\n func = _window[func];\n }\n if (typeof func === \"object\" && func && typeof func.handleEvent === \"function\") {\n context = func;\n func = func.handleEvent;\n }\n if (typeof func === \"function\") {\n eventCopy = _extend({}, event);\n _dispatchCallback(func, context, [ eventCopy ], async);\n }\n }\n }\n };\n /**\n * Prepares the elements for clipping/unclipping.\n *\n * @returns An Array of elements.\n * @private\n */\n var _prepClip = function(elements) {\n if (typeof elements === \"string\") {\n elements = [];\n }\n return typeof elements.length !== \"number\" ? [ elements ] : elements;\n };\n /**\n * Add a `mouseover` handler function for a clipped element.\n *\n * @returns `undefined`\n * @private\n */\n var _addMouseHandlers = function(element) {\n if (!(element && element.nodeType === 1)) {\n return;\n }\n var _suppressMouseEvents = function(event) {\n if (!(event || (event = _window.event))) {\n return;\n }\n if (event._source !== \"js\") {\n event.stopImmediatePropagation();\n event.preventDefault();\n }\n delete event._source;\n };\n var _elementMouseOver = function(event) {\n if (!(event || (event = _window.event))) {\n return;\n }\n _suppressMouseEvents(event);\n ZeroClipboard.focus(element);\n };\n element.addEventListener(\"mouseover\", _elementMouseOver, false);\n element.addEventListener(\"mouseout\", _suppressMouseEvents, false);\n element.addEventListener(\"mouseenter\", _suppressMouseEvents, false);\n element.addEventListener(\"mouseleave\", _suppressMouseEvents, false);\n element.addEventListener(\"mousemove\", _suppressMouseEvents, false);\n _mouseHandlers[element.zcClippingId] = {\n mouseover: _elementMouseOver,\n mouseout: _suppressMouseEvents,\n mouseenter: _suppressMouseEvents,\n mouseleave: _suppressMouseEvents,\n mousemove: _suppressMouseEvents\n };\n };\n /**\n * Remove a `mouseover` handler function for a clipped element.\n *\n * @returns `undefined`\n * @private\n */\n var _removeMouseHandlers = function(element) {\n if (!(element && element.nodeType === 1)) {\n return;\n }\n var mouseHandlers = _mouseHandlers[element.zcClippingId];\n if (!(typeof mouseHandlers === \"object\" && mouseHandlers)) {\n return;\n }\n var key, val, mouseEvents = [ \"move\", \"leave\", \"enter\", \"out\", \"over\" ];\n for (var i = 0, len = mouseEvents.length; i < len; i++) {\n key = \"mouse\" + mouseEvents[i];\n val = mouseHandlers[key];\n if (typeof val === \"function\") {\n element.removeEventListener(key, val, false);\n }\n }\n delete _mouseHandlers[element.zcClippingId];\n };\n /**\n * Creates a new ZeroClipboard client instance.\n * Optionally, auto-`clip` an element or collection of elements.\n *\n * @constructor\n */\n ZeroClipboard._createClient = function() {\n _clientConstructor.apply(this, _args(arguments));\n };\n /**\n * Register an event listener to the client.\n *\n * @returns `this`\n */\n ZeroClipboard.prototype.on = function() {\n return _clientOn.apply(this, _args(arguments));\n };\n /**\n * Unregister an event handler from the client.\n * If no `listener` function/object is provided, it will unregister all handlers for the provided `eventType`.\n * If no `eventType` is provided, it will unregister all handlers for every event type.\n *\n * @returns `this`\n */\n ZeroClipboard.prototype.off = function() {\n return _clientOff.apply(this, _args(arguments));\n };\n /**\n * Retrieve event listeners for an `eventType` from the client.\n * If no `eventType` is provided, it will retrieve all listeners for every event type.\n *\n * @returns array of listeners for the `eventType`; if no `eventType`, then a map/hash object of listeners for all event types; or `null`\n */\n ZeroClipboard.prototype.handlers = function() {\n return _clientListeners.apply(this, _args(arguments));\n };\n /**\n * Event emission receiver from the Flash object for this client's registered JavaScript event listeners.\n *\n * @returns For the \"copy\" event, returns the Flash-friendly \"clipData\" object; otherwise `undefined`.\n */\n ZeroClipboard.prototype.emit = function() {\n return _clientEmit.apply(this, _args(arguments));\n };\n /**\n * Register clipboard actions for new element(s) to the client.\n *\n * @returns `this`\n */\n ZeroClipboard.prototype.clip = function() {\n return _clientClip.apply(this, _args(arguments));\n };\n /**\n * Unregister the clipboard actions of previously registered element(s) on the page.\n * If no elements are provided, ALL registered elements will be unregistered.\n *\n * @returns `this`\n */\n ZeroClipboard.prototype.unclip = function() {\n return _clientUnclip.apply(this, _args(arguments));\n };\n /**\n * Get all of the elements to which this client is clipped.\n *\n * @returns array of clipped elements\n */\n ZeroClipboard.prototype.elements = function() {\n return _clientElements.apply(this, _args(arguments));\n };\n /**\n * Self-destruct and clean up everything for a single client.\n * This will NOT destroy the embedded Flash object.\n *\n * @returns `undefined`\n */\n ZeroClipboard.prototype.destroy = function() {\n return _clientDestroy.apply(this, _args(arguments));\n };\n /**\n * Stores the pending plain text to inject into the clipboard.\n *\n * @returns `this`\n */\n ZeroClipboard.prototype.setText = function(text) {\n if (!_clientMeta[this.id]) {\n throw new Error(\"Attempted to set pending clipboard data from a destroyed ZeroClipboard client instance\");\n }\n ZeroClipboard.setData(\"text/plain\", text);\n return this;\n };\n /**\n * Stores the pending HTML text to inject into the clipboard.\n *\n * @returns `this`\n */\n ZeroClipboard.prototype.setHtml = function(html) {\n if (!_clientMeta[this.id]) {\n throw new Error(\"Attempted to set pending clipboard data from a destroyed ZeroClipboard client instance\");\n }\n ZeroClipboard.setData(\"text/html\", html);\n return this;\n };\n /**\n * Stores the pending rich text (RTF) to inject into the clipboard.\n *\n * @returns `this`\n */\n ZeroClipboard.prototype.setRichText = function(richText) {\n if (!_clientMeta[this.id]) {\n throw new Error(\"Attempted to set pending clipboard data from a destroyed ZeroClipboard client instance\");\n }\n ZeroClipboard.setData(\"application/rtf\", richText);\n return this;\n };\n /**\n * Stores the pending data to inject into the clipboard.\n *\n * @returns `this`\n */\n ZeroClipboard.prototype.setData = function() {\n if (!_clientMeta[this.id]) {\n throw new Error(\"Attempted to set pending clipboard data from a destroyed ZeroClipboard client instance\");\n }\n ZeroClipboard.setData.apply(this, _args(arguments));\n return this;\n };\n /**\n * Clears the pending data to inject into the clipboard.\n * If no `format` is provided, all pending data formats will be cleared.\n *\n * @returns `this`\n */\n ZeroClipboard.prototype.clearData = function() {\n if (!_clientMeta[this.id]) {\n throw new Error(\"Attempted to clear pending clipboard data from a destroyed ZeroClipboard client instance\");\n }\n ZeroClipboard.clearData.apply(this, _args(arguments));\n return this;\n };\n /**\n * Gets a copy of the pending data to inject into the clipboard.\n * If no `format` is provided, a copy of ALL pending data formats will be returned.\n *\n * @returns `String` or `Object`\n */\n ZeroClipboard.prototype.getData = function() {\n if (!_clientMeta[this.id]) {\n throw new Error(\"Attempted to get pending clipboard data from a destroyed ZeroClipboard client instance\");\n }\n return ZeroClipboard.getData.apply(this, _args(arguments));\n };\n if (typeof define === \"function\" && define.amd) {\n define(function() {\n return ZeroClipboard;\n });\n } else if (typeof module === \"object\" && module && typeof module.exports === \"object\" && module.exports) {\n module.exports = ZeroClipboard;\n } else {\n window.ZeroClipboard = ZeroClipboard;\n }\n})(function() {\n return this || window;\n}());"]} \ No newline at end of file diff --git a/static/assets/ZeroClipboard/ZeroClipboard.swf b/static/assets/ZeroClipboard/ZeroClipboard.swf new file mode 100755 index 0000000000000000000000000000000000000000..8bad6a3e34f1b0b055da3ee8e506fe627cf75987 GIT binary patch literal 6580 zcmV;l8B69vS5pqYF8}~|+O;|hc$3$4_xw*umW3pYG4CHRmTj(WK^{#o5R7es9YDkn zLI7j^mVQ|RS#tDCek9Nm66e+C)g+`1B~@Q(+R&s)wsqasbxqrKYqw64hv~YlTf24b z-dp$X9_-xz|0UVRr0w^$##i^=bI(2J+;h%7=Uka7B7Bb!*UN;|0qOFrB80qW`8R-& zo#{w)M_*S!nHozZ^&L3d<%?x9<2%~gCMPFbCvR#^rAOPg-G2M+ZT{_T+qbtMMvFe3 z%&1c>Nqw_#w?Uvw)5GcbcqX1oDr~Nfq_UY^KA%N35-t-R&!!Uw$w;_OOK4+SGNZR` zYu$!~BH{iFe6Y;Rh$hA$i=&@Az^rSkWwL}xD9^2VgL1cR}@k~P7-4RKR zXi6ZVO({1k9hLnCwu!=!BNah+&pW2dcDII8V{PN!wIJ~HIrJ1QG&7cgqj@9s-xQO?nA~}d2Yz4X0+X1T3FeBJ5{#( zx7}=t!Js?a7HQjppaFN2F82@loureycJ10R2agt(unE#fjuGSMt3Pgdp%*RwO~)}U zo$5@)$463XIzql!bGC<p-c3I;L$SZqiB^5t(qr`gxNh!bB<_k@u!j2~AB(!I4v1 zI8$vHq%{)P#}n$b)IXk%XEdh?)Fzl|9S2icUF&9JsXvpBCr538Y%XBvK5Y7BuASOeHH4yVXdO`u_N6tc-<3JJm#DL=B&I zrM0otgjSjgVH^m$mWVkhr~dd#iut z;lAL}p6;&U&W-~I_I7mMIefUUJJ55qYIqoZdMd6(hKFl<`-i(a20Cyl*xB9RAM6_r z9C}EIS{6|dF|6r&7oM<@9g`}$al*qUJe3Y4o0R(%B_358Gt=W*DylFvW!J7<$|e(a zlhV*&09zAUax@cDb}N2kk7A)-Ptsu3)UGIJ6-7(v+S24xhGyS^Jcb0NaY9Wiab)6e z$8P6*OayG*YN4949FGqn=HfFWbg5&vvt4I@HW`(TyOd-$kytDsvK&|9Ndu=W5hG}b z8&mb*WDBe%7q_emf38v$t@ua@d%7~S0*wKGe+jhVI*0zysJduefYZe6j9cI9< zUkL0ndovPtrm#|oqc9s5BK0IO#;a)c3C%=Y^A1GT&d(@2j5D%zH50~sE3#r?x=Npn zmSS&hW67Z!jV%aA2Xc57gl-4kgnAvICQa+AujPKti2XA_xrha+ZQYDO6Yf)y-q*190&8Ii+RlGyi7sI4qR zEy8CfTWhjrv32p5c87qM-Es2zsP$6{@ly#+}WmD%njk|Grp*?qY6nZ%RI&%Xvrqk2{oQj zM-rOLghaH_v>MS^>2w536f}u@!t7hd;`$i7Bo0)qwYDsrN=DXa0YxFT=qRbdp ze7>gEOzJ>tQcHKLx`s+IZx&N1Mk?Jn*=@=KJ+Yj>B-sgOD3h+~Xf`Y1J0!Df`UzK2 zFW<#grMp;BiRHU+$Hvh_YD7)6+=o}HT#=javX+r_JTj_DX6*q~#0VbG2$*6tM?Xt% z9f|m8(l!u0Jba)#Fd(XI>M~aPvGCOnq8{ztM>{$Ph66nVcD)318Yp+6Gh+4<_ICFV z$oHBP8+!hDEFRYFBO2zfKs=Ff7>V@mcq9|6GKTv#ti3a~NLrojLoY#PKY{!U(4uo~V__V-2>}nKK6dTEUHq0ssft4GQaV2$ug-3ff8PTGc-6E2j$lR$- zJ1}RC;YGor%$^D+D49v85)2g1q*-s%WAUho&fXoJsVqK@B8VPO*jW;1b~#!e-6I+2 zI4TdDy*a(dn%?7DST4eF)jXHt(T<3i%3^SF91ITjcMl&79_hA*IO?-o!@&Uy*cH6{ zkj)$p9u_+f^mN|2Y*EIoUXYwU*QN5>r7Hl*ynvD!S-sbnhu-T8Ia?_VOR*FyRH{ef zkvJNO1rar2!)k#=!pO3y^|+5x&;BN6ts&9y!eXtG8e5NT*f2Er}E}=FdY@wDfk;bo8D`|75iEZqrLm`~d)U>-i4;WvM>s15YN3og; z_8sgPkWm(cqeV@KWyTU!`v(plun_okCR#no9`u6)0Vaa(#!S3_cpeRLgn_ZN(RHjn zWTO=7>0)1Agilvv@a<=V0W1bI$^3%e*{P1JBXLa4aZTq^x@g!{#4MSelKQk!e135! zPQWOt0V{^Ew)W)lj+SF;%Y8#u?{B$%c*lvB6Rktd^{7%kBge7knhHi?^SUjF6Hr^C zh%lV%xvkxw>a{@9H~OA6R`*B&(Oz{x;P958%jC`#4woK29V!ZjhWJNYyT3 zncL%CUL)I9faH>EL6RM-aAaRCuajWCt7^k9fef4sybOZONiuJf!7hVChAJ7HvREyP zE?HV8i*8x+$f8#km&;;}EUu7IK5?Zi*2&^3SzImK*2p%mY+EbCIvLi>ut5ezhK(|8 zl3}y#sFxjH8Meq$gA6{|)+F1u%C;8S)+XDw$+qpX?IziAv+TG z!NWa@?J*obj{SSFy${DvVE-hxr?5SZ?HO$E$M!6?=deAG?EYuNt|w%-N&ml*u(V1FAp`Q}J)Dg*x>p6mCK;U8iDZAAZL?EeJY-(vea zY=4hy|B3Mb!uDfqUjVu8f3f`^*q8CL^Fhx35GTkm!{KQJJdI#~1n1JDoGd-Y$!p%r z$!niLHcw)E3dc`l{|vVGbN1)hzUMjn1=hcSun*v#4`M$m!;9Em#CD03ogcpsib-{3@h1K(Qu0}lK94ghBiIKuuo#G1f> zA|V_v@x%sBr!fOTC~sqb0+P+Y4w)YoG0ylWnF!Y3i3AQ^pKt&Y!;px;MrBeQ@I2wn zPvDTd@xk*pNiqrA03VoO^*m4Ji;f=#8pl3(sj@}{JN_f!bPysromGT5oz7}PTu$dQ zBR%wtAcnQM^?T+3N+O0tXqI-fJ94IWdG9av9`1dtIPbGp1{a$Bn0?Q94RvgAiQ7xxb5ZTv<17C2p>KjSypd z*M(*ex_VOt#|=1k;n-X-AeS$Ax0QCDrl-u6^UWS~)F$OTO&Cb!`5@0oCk)a&600(a zacqi|wwEZ4(IgGh6a!aijWf&&DS?sNh&vE01XnV((tG#t!S!68rY*+CQT7p`8?Ofm z5WFY*2;P%+f_GUIc)Q~n$orL{LOGEG=A z)ntxN<>+*d-j}2I=jfRnJ)5KNHq7&$96bk?aRLg=%oV*W2nlToZJ`f9F&DTM0yn`q z-i>EM8BmJCe!Q_Z!S1-sBtrnUIc4T5s^dJ+eMbn@eDstuC@_fw9`vwgOwgohkg)A@ z#pqt^3^;n8J_wh+%L&2p%+=7A*}yH}#mG~bRreO7d&-D=OhhNH;DkN|f&HNFDMmZ# z!*IFTBN<4Y4VR6*4QgjG+QoLPmW&NuY8Mk)7CE~k$gWhVC)%stiT#1-LG=*!!RTT2 zt|6gUK)<|Fi1xKWuph9mC(WUEMF+4A29F4ZHc;cLog5$HvjjUJ;Pf+D?yqvM9h;qA5aNM~2xUsP&P zU5wIPv7nv^4Y7TOxxF64zWJ!57*IF_yB%dfa3eR1!eAj`cf4U5=BhFi77RKC?{kFE z9I)Sy0R1S?j{*HS&`%h@F9ZD~&{vG#PZ__T2Kp+{%RoN^gLWiTPr~Bt`LN_}Lor9B z5pg|IE{q6)lVF($C(&W$)eBw>;l)`tF(B&jc1iSn{n|B~WD|?@b<}Anppu+=qDbEW zbtGSmo+z5fuj0`m6)g zSS&EhY+huU6nHUS;t1)XB`ku>8gr&Km}-{s9M9VkBQ%c72ymAH_nH7t6$m0KFHgS& z3Vj=V^vl@3g6*r|8x&)8M#fsjGM1O;MaK(J%052KD`^&NRXrcA3#Fr(a$r=mCS;=F z^7&FYtBYnYTsW^zhSCkz2Ko)ac!a5K%3X_Y?l1U{k>JJl*isI+8EO|;?lW@PHy3H`Pl0~NC>+e`pRuuEj{h7`#oq<`J)nO9^e=&a zALw5J{Q=M)0@LYV1N|GO*5#&Jg9>17JP%k!k_WIXl*xlYc$qwe<)K7YRr7*)kC7e? zY460mmSXcGp#K8&UxEG`D%5t3xfb zXvXtbStws4ih}s8k^NZ!77E^n&^qj#%URS{@}-?vvbp07R2RL^6T(0b2EMxiL&9w6 zVJNcuA9w`NbXP}&ddL-{kAf4=GE4s(a#!CLMg#^~k-v6r=rI_29OyMB^EoazL}&4c zIr;#X>wO%6p67y(0Sne^F{bkFynpDuz=A4&6xPL@2w#U_0SizZu1E3hk&@4q+${7y zv!Z+gf=>b)a?z)tL45+;x3Zfv%Wh6su&$1==)*;0_%wuE8kYe25Jw;80^9lEGk{l1 z*az;W7TX!_{lH47XVFV|vVk%G5?}H7=YV-|S&HW&dI5qj0I`Izg0{U>IX(ds-s46M z$V4#FLmzX z$QW*NBExNYKOHSZv2=TpD@3t;yNDf@a3A6dfsX^JJV0LJiqt(jDB;G<0w;*|m@`73 zfauF;sd_Q+N#L;hq95fhUx;mDnY$3&%;H=Ly&-!pnmAvKfSY zRyA21Ba3Nb3bU*}WG+@jW6%23S72WK5pop*e()j>HrfUgVF9`0 ziwjHmrV(L+k-(K=u$42V@|y6{li(?K4KI|j+PESfx}g-8K4rxvZe7fUEPR!?)F?{4 z@Cu%&p0HPoQLn9bvKLPwa5JmX9;;MZHp3{NHr%{{6_wE|6BGRg#14X#L6Ph4w-iV literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/build-config.js b/static/assets/ckeditor/build-config.js new file mode 100644 index 0000000..e6e18c4 --- /dev/null +++ b/static/assets/ckeditor/build-config.js @@ -0,0 +1,180 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * This file was added automatically by CKEditor builder. + * You may re-use it at any time to build CKEditor again. + * + * If you would like to build CKEditor online again + * (for example to upgrade), visit one the following links: + * + * (1) http://ckeditor.com/builder + * Visit online builder to build CKEditor from scratch. + * + * (2) http://ckeditor.com/builder/e6b8a045f8f984a69463975ca3e6524a + * Visit online builder to build CKEditor, starting with the same setup as before. + * + * (3) http://ckeditor.com/builder/download/e6b8a045f8f984a69463975ca3e6524a + * Straight download link to the latest version of CKEditor (Optimized) with the same setup as before. + * + * NOTE: + * This file is not used by CKEditor, you may remove it. + * Changing this file will not change your CKEditor configuration. + */ + +var CKBUILDER_CONFIG = { + skin: 'moono', + preset: 'full', + ignore: [ + '.bender', + 'bender.js', + 'bender-err.log', + 'bender-out.log', + 'dev', + '.DS_Store', + '.editorconfig', + '.gitattributes', + '.gitignore', + 'gruntfile.js', + '.idea', + '.jscsrc', + '.jshintignore', + '.jshintrc', + '.mailmap', + 'node_modules', + 'package.json', + 'README.md', + 'tests' + ], + plugins : { + 'a11yhelp' : 1, + 'about' : 1, + 'basicstyles' : 1, + 'bidi' : 1, + 'blockquote' : 1, + 'clipboard' : 1, + 'colorbutton' : 1, + 'colordialog' : 1, + 'contextmenu' : 1, + 'dialogadvtab' : 1, + 'div' : 1, + 'elementspath' : 1, + 'enterkey' : 1, + 'entities' : 1, + 'filebrowser' : 1, + 'find' : 1, + 'flash' : 1, + 'floatingspace' : 1, + 'font' : 1, + 'format' : 1, + 'forms' : 1, + 'horizontalrule' : 1, + 'htmlwriter' : 1, + 'iframe' : 1, + 'image' : 1, + 'indentblock' : 1, + 'indentlist' : 1, + 'justify' : 1, + 'language' : 1, + 'link' : 1, + 'list' : 1, + 'liststyle' : 1, + 'magicline' : 1, + 'maximize' : 1, + 'newpage' : 1, + 'pagebreak' : 1, + 'pastefromword' : 1, + 'pastetext' : 1, + 'preview' : 1, + 'print' : 1, + 'removeformat' : 1, + 'resize' : 1, + 'save' : 1, + 'scayt' : 1, + 'selectall' : 1, + 'showblocks' : 1, + 'showborders' : 1, + 'smiley' : 1, + 'sourcearea' : 1, + 'specialchar' : 1, + 'stylescombo' : 1, + 'tab' : 1, + 'table' : 1, + 'tabletools' : 1, + 'templates' : 1, + 'toolbar' : 1, + 'undo' : 1, + 'wsc' : 1, + 'wysiwygarea' : 1 + }, + languages : { + 'af' : 1, + 'ar' : 1, + 'bg' : 1, + 'bn' : 1, + 'bs' : 1, + 'ca' : 1, + 'cs' : 1, + 'cy' : 1, + 'da' : 1, + 'de' : 1, + 'el' : 1, + 'en' : 1, + 'en-au' : 1, + 'en-ca' : 1, + 'en-gb' : 1, + 'eo' : 1, + 'es' : 1, + 'et' : 1, + 'eu' : 1, + 'fa' : 1, + 'fi' : 1, + 'fo' : 1, + 'fr' : 1, + 'fr-ca' : 1, + 'gl' : 1, + 'gu' : 1, + 'he' : 1, + 'hi' : 1, + 'hr' : 1, + 'hu' : 1, + 'id' : 1, + 'is' : 1, + 'it' : 1, + 'ja' : 1, + 'ka' : 1, + 'km' : 1, + 'ko' : 1, + 'ku' : 1, + 'lt' : 1, + 'lv' : 1, + 'mk' : 1, + 'mn' : 1, + 'ms' : 1, + 'nb' : 1, + 'nl' : 1, + 'no' : 1, + 'pl' : 1, + 'pt' : 1, + 'pt-br' : 1, + 'ro' : 1, + 'ru' : 1, + 'si' : 1, + 'sk' : 1, + 'sl' : 1, + 'sq' : 1, + 'sr' : 1, + 'sr-latn' : 1, + 'sv' : 1, + 'th' : 1, + 'tr' : 1, + 'tt' : 1, + 'ug' : 1, + 'uk' : 1, + 'vi' : 1, + 'zh' : 1, + 'zh-cn' : 1 + } +}; \ No newline at end of file diff --git a/static/assets/ckeditor/ckeditor.js b/static/assets/ckeditor/ckeditor.js new file mode 100644 index 0000000..ed89485 --- /dev/null +++ b/static/assets/ckeditor/ckeditor.js @@ -0,0 +1,1020 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){if(window.CKEDITOR&&window.CKEDITOR.dom)return;window.CKEDITOR||(window.CKEDITOR=function(){var a=/(^|.*[\\\/])ckeditor\.js(?:\?.*|;.*)?$/i,f={timestamp:"F0RD",version:"4.4.7",revision:"3a35b3d",rnd:Math.floor(900*Math.random())+100,_:{pending:[],basePathSrcPattern:a},status:"unloaded",basePath:function(){var e=window.CKEDITOR_BASEPATH||"";if(!e)for(var d=document.getElementsByTagName("script"),c=0;c=0;s--)if(m[s].priority<=k){m.splice(s+1,0,j);return{removeListener:g}}m.unshift(j)}return{removeListener:g}}, +once:function(){var a=Array.prototype.slice.call(arguments),e=a[1];a[1]=function(a){a.removeListener();return e.apply(this,arguments)};return this.on.apply(this,a)},capture:function(){CKEDITOR.event.useCapture=1;var a=this.on.apply(this,arguments);CKEDITOR.event.useCapture=0;return a},fire:function(){var a=0,e=function(){a=1},d=0,b=function(){d=1};return function(k,j,g){var m=f(this)[k],k=a,y=d;a=d=0;if(m){var s=m.listeners;if(s.length)for(var s=s.slice(0),w,q=0;q=0&&d.listeners.splice(b,1)}},removeAllListeners:function(){var a=f(this),e;for(e in a)delete a[e]},hasListeners:function(a){return(a=f(this)[a])&&a.listeners.length> +0}}}());CKEDITOR.editor||(CKEDITOR.editor=function(){CKEDITOR._.pending.push([this,arguments]);CKEDITOR.event.call(this)},CKEDITOR.editor.prototype.fire=function(a,f){a in{instanceReady:1,loaded:1}&&(this[a]=true);return CKEDITOR.event.prototype.fire.call(this,a,f,this)},CKEDITOR.editor.prototype.fireOnce=function(a,f){a in{instanceReady:1,loaded:1}&&(this[a]=true);return CKEDITOR.event.prototype.fireOnce.call(this,a,f,this)},CKEDITOR.event.implementOn(CKEDITOR.editor.prototype)); +CKEDITOR.env||(CKEDITOR.env=function(){var a=navigator.userAgent.toLowerCase(),f={ie:a.indexOf("trident/")>-1,webkit:a.indexOf(" applewebkit/")>-1,air:a.indexOf(" adobeair/")>-1,mac:a.indexOf("macintosh")>-1,quirks:document.compatMode=="BackCompat"&&(!document.documentMode||document.documentMode<10),mobile:a.indexOf("mobile")>-1,iOS:/(ipad|iphone|ipod)/.test(a),isCustomDomain:function(){if(!this.ie)return false;var a=document.domain,d=window.location.hostname;return a!=d&&a!="["+d+"]"},secure:location.protocol== +"https:"};f.gecko=navigator.product=="Gecko"&&!f.webkit&&!f.ie;if(f.webkit)a.indexOf("chrome")>-1?f.chrome=true:f.safari=true;var b=0;if(f.ie){b=f.quirks||!document.documentMode?parseFloat(a.match(/msie (\d+)/)[1]):document.documentMode;f.ie9Compat=b==9;f.ie8Compat=b==8;f.ie7Compat=b==7;f.ie6Compat=b<7||f.quirks}if(f.gecko){var c=a.match(/rv:([\d\.]+)/);if(c){c=c[1].split(".");b=c[0]*1E4+(c[1]||0)*100+(c[2]||0)*1}}f.air&&(b=parseFloat(a.match(/ adobeair\/(\d+)/)[1]));f.webkit&&(b=parseFloat(a.match(/ applewebkit\/(\d+)/)[1])); +f.version=b;f.isCompatible=f.iOS&&b>=534||!f.mobile&&(f.ie&&b>6||f.gecko&&b>=2E4||f.air&&b>=1||f.webkit&&b>=522||false);f.hidpi=window.devicePixelRatio>=2;f.needsBrFiller=f.gecko||f.webkit||f.ie&&b>10;f.needsNbspFiller=f.ie&&b<11;f.cssClass="cke_browser_"+(f.ie?"ie":f.gecko?"gecko":f.webkit?"webkit":"unknown");if(f.quirks)f.cssClass=f.cssClass+" cke_browser_quirks";if(f.ie)f.cssClass=f.cssClass+(" cke_browser_ie"+(f.quirks?"6 cke_browser_iequirks":f.version));if(f.air)f.cssClass=f.cssClass+" cke_browser_air"; +if(f.iOS)f.cssClass=f.cssClass+" cke_browser_ios";if(f.hidpi)f.cssClass=f.cssClass+" cke_hidpi";return f}()); +"unloaded"==CKEDITOR.status&&function(){CKEDITOR.event.implementOn(CKEDITOR);CKEDITOR.loadFullCore=function(){if(CKEDITOR.status!="basic_ready")CKEDITOR.loadFullCore._load=1;else{delete CKEDITOR.loadFullCore;var a=document.createElement("script");a.type="text/javascript";a.src=CKEDITOR.basePath+"ckeditor.js";document.getElementsByTagName("head")[0].appendChild(a)}};CKEDITOR.loadFullCoreTimeout=0;CKEDITOR.add=function(a){(this._.pending||(this._.pending=[])).push(a)};(function(){CKEDITOR.domReady(function(){var a= +CKEDITOR.loadFullCore,f=CKEDITOR.loadFullCoreTimeout;if(a){CKEDITOR.status="basic_ready";a&&a._load?a():f&&setTimeout(function(){CKEDITOR.loadFullCore&&CKEDITOR.loadFullCore()},f*1E3)}})})();CKEDITOR.status="basic_loaded"}();CKEDITOR.dom={}; +(function(){var a=[],f=CKEDITOR.env.gecko?"-moz-":CKEDITOR.env.webkit?"-webkit-":CKEDITOR.env.ie?"-ms-":"",b=/&/g,c=/>/g,e=/"+e+""):d.push('');return d.join("")}, +htmlEncode:function(a){return(""+a).replace(b,"&").replace(c,">").replace(e,"<")},htmlDecode:function(a){return a.replace(h,"&").replace(k,">").replace(j,"<")},htmlEncodeAttr:function(a){return a.replace(d,""").replace(e,"<").replace(c,">")},htmlDecodeAttr:function(a){return a.replace(g,'"').replace(j,"<").replace(k,">")},getNextNumber:function(){var a=0;return function(){return++a}}(),getNextId:function(){return"cke_"+this.getNextNumber()},override:function(a,e){var d=e(a);d.prototype= +a.prototype;return d},setTimeout:function(a,e,d,b,c){c||(c=window);d||(d=c);return c.setTimeout(function(){b?a.apply(d,[].concat(b)):a.apply(d)},e||0)},trim:function(){var a=/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;return function(e){return e.replace(a,"")}}(),ltrim:function(){var a=/^[ \t\n\r]+/g;return function(e){return e.replace(a,"")}}(),rtrim:function(){var a=/[ \t\n\r]+$/g;return function(e){return e.replace(a,"")}}(),indexOf:function(a,e){if(typeof e=="function")for(var d=0,b=a.length;d=0?a[d]:null},bind:function(a,e){return function(){return a.apply(e,arguments)}},createClass:function(a){var e=a.$,d=a.base,b=a.privates||a._,c=a.proto,a=a.statics;!e&&(e=function(){d&&this.base.apply(this,arguments)});if(b)var f=e,e=function(){var a=this._||(this._={}),e;for(e in b){var d=b[e];a[e]=typeof d=="function"?CKEDITOR.tools.bind(d,this):d}f.apply(this,arguments)};if(d){e.prototype= +this.prototypedCopy(d.prototype);e.prototype.constructor=e;e.base=d;e.baseProto=d.prototype;e.prototype.base=function(){this.base=d.prototype.base;d.apply(this,arguments);this.base=arguments.callee}}c&&this.extend(e.prototype,c,true);a&&this.extend(e,a,true);return e},addFunction:function(e,d){return a.push(function(){return e.apply(d||this,arguments)})-1},removeFunction:function(e){a[e]=null},callFunction:function(e){var d=a[e];return d&&d.apply(window,Array.prototype.slice.call(arguments,1))},cssLength:function(){var a= +/^-?\d+\.?\d*px$/,e;return function(d){e=CKEDITOR.tools.trim(d+"")+"px";return a.test(e)?e:d||""}}(),convertToPx:function(){var a;return function(e){if(!a){a=CKEDITOR.dom.element.createFromHtml('
    ',CKEDITOR.document);CKEDITOR.document.getBody().append(a)}if(!/%$/.test(e)){a.setStyle("width",e);return a.$.clientWidth}return e}}(),repeat:function(a,e){return Array(e+1).join(a)},tryThese:function(){for(var a, +e=0,d=arguments.length;e]*?>)|^/i,'$&\n + + + + + + +

    + CKEditor Samples » Using AutoGrow Plugin +

    +
    +

    + This sample shows how to configure CKEditor instances to use the + AutoGrow (autogrow) plugin that lets the editor window expand + and shrink depending on the amount and size of content entered in the editing area. +

    +

    + In its default implementation the AutoGrow feature can expand the + CKEditor window infinitely in order to avoid introducing scrollbars to the editing area. +

    +

    + It is also possible to set a maximum height for the editor window. Once CKEditor + editing area reaches the value in pixels specified in the + autoGrow_maxHeight + configuration setting, scrollbars will be added and the editor window will no longer expand. +

    +

    + To add a CKEditor instance using the autogrow plugin and its + autoGrow_maxHeight attribute, insert the following JavaScript call to your code: +

    +
    +CKEDITOR.replace( 'textarea_id', {
    +	extraPlugins: 'autogrow',
    +	autoGrow_maxHeight: 800,
    +
    +	// Remove the Resize plugin as it does not make sense to use it in conjunction with the AutoGrow plugin.
    +	removePlugins: 'resize'
    +});
    +

    + Note that textarea_id in the code above is the id attribute of + the <textarea> element to be replaced with CKEditor. The maximum height should + be given in pixels. +

    +
    +
    +

    + + + +

    +

    + + + +

    +

    + +

    +
    + + + diff --git a/static/assets/ckeditor/plugins/clipboard/dialogs/paste.js b/static/assets/ckeditor/plugins/clipboard/dialogs/paste.js new file mode 100644 index 0000000..441502b --- /dev/null +++ b/static/assets/ckeditor/plugins/clipboard/dialogs/paste.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("paste",function(c){function h(a){var b=new CKEDITOR.dom.document(a.document),f=b.getBody(),d=b.getById("cke_actscrpt");d&&d.remove();f.setAttribute("contenteditable",!0);if(CKEDITOR.env.ie&&8>CKEDITOR.env.version)b.getWindow().on("blur",function(){b.$.selection.empty()});b.on("keydown",function(a){var a=a.data,b;switch(a.getKeystroke()){case 27:this.hide();b=1;break;case 9:case CKEDITOR.SHIFT+9:this.changeFocus(1),b=1}b&&a.preventDefault()},this);c.fire("ariaWidget",new CKEDITOR.dom.element(a.frameElement)); +b.getWindow().getFrame().removeCustomData("pendingFocus")&&f.focus()}var e=c.lang.clipboard;c.on("pasteDialogCommit",function(a){a.data&&c.fire("paste",{type:"auto",dataValue:a.data})},null,null,1E3);return{title:e.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?370:350,minHeight:CKEDITOR.env.quirks?250:245,onShow:function(){this.parts.dialog.$.offsetHeight;this.setupContent();this.parts.title.setHtml(this.customTitle||e.title);this.customTitle=null},onLoad:function(){(CKEDITOR.env.ie7Compat|| +CKEDITOR.env.ie6Compat)&&"rtl"==c.lang.dir&&this.parts.contents.setStyle("overflow","hidden")},onOk:function(){this.commitContent()},contents:[{id:"general",label:c.lang.common.generalTab,elements:[{type:"html",id:"securityMsg",html:'
    '+e.securityMsg+"
    "},{type:"html",id:"pasteMsg",html:'
    '+e.pasteMsg+"
    "},{type:"html",id:"editing_area",style:"width:100%;height:100%",html:"",focus:function(){var a=this.getInputElement(), +b=a.getFrameDocument().getBody();!b||b.isReadOnly()?a.setCustomData("pendingFocus",1):b.focus()},setup:function(){var a=this.getDialog(),b=' + ``` + +- `tabReplace` and `useBR` that were used in different places are also unified + into the global options object and are to be set using `configure(options)`. + This function is documented in our [API docs][]. Also note that these + parameters are gone from `highlightBlock` and `fixMarkup` which are now also + rely on `configure`. + +- We removed public-facing (though undocumented) object `hljs.LANGUAGES` which + was used to register languages with the library in favor of two new methods: + `registerLanguage` and `getLanguage`. Both are documented in our [API docs][]. + +- Result returned from `highlight` and `highlightAuto` no longer contains two + separate attributes contributing to relevance score, `relevance` and + `keyword_count`. They are now unified in `relevance`. + +Another technically compatible change that nonetheless might need attention: + +- The structure of the NPM package was refactored, so if you had installed it + locally, you'll have to update your paths. The usual `require('highlight.js')` + works as before. This is contributed by [Dmitry Smolin][]. + +New features: + +- Languages now can be recognized by multiple names like "js" for JavaScript or + "html" for, well, HTML (which earlier insisted on calling it "xml"). These + aliases can be specified in the class attribute of the code container in your + HTML as well as in various API calls. For now there are only a few very common + aliases but we'll expand it in the future. All of them are listed in the + [class reference][]. + +- Language detection can now be restricted to a subset of languages relevant in + a given context — a web page or even a single highlighting call. This is + especially useful for node.js build that includes all the known languages. + Another example is a StackOverflow-style site where users specify languages + as tags rather than in the markdown-formatted code snippets. This is + documented in the [API reference][] (see methods `highlightAuto` and + `configure`). + +- Language definition syntax streamlined with [variants][] and + [beginKeywords][]. + +New languages and styles: + +- *Oxygene* by [Carlo Kok][] +- *Mathematica* by [Daniel Kvasnička][] +- *Autohotkey* by [Seongwon Lee][] +- *Atelier* family of styles in 10 variants by [Bram de Haan][] +- *Paraíso* styles by [Jan T. Sott][] + +Miscelleanous improvements: + +- Highlighting `=>` prompts in Clojure. +- [Jeremy Hull][] fixed a lot of styles for consistency. +- Finally, highlighting PHP and HTML [mixed in peculiar ways][php-html]. +- Objective C and C# now properly highlight titles in method definition. +- Big overhaul of relevance counting for a number of languages. Please do report + bugs about mis-detection of non-trivial code snippets! + +[cr]: http://highlightjs.readthedocs.org/en/latest/css-classes-reference.html +[api docs]: http://highlightjs.readthedocs.org/en/latest/api.html +[variants]: https://groups.google.com/d/topic/highlightjs/VoGC9-1p5vk/discussion +[beginKeywords]: https://github.com/isagalaev/highlight.js/commit/6c7fdea002eb3949577a85b3f7930137c7c3038d +[php-html]: https://twitter.com/highlightjs/status/408890903017689088 + +[Carlo Kok]: https://github.com/carlokok +[Bram de Haan]: https://github.com/atelierbram +[Daniel Kvasnička]: https://github.com/dkvasnicka +[Dmitry Smolin]: https://github.com/dimsmol +[Jeremy Hull]: https://github.com/sourrust +[Seongwon Lee]: https://github.com/dlimpid +[Jan T. Sott]: https://github.com/idleberg + + +## Version 7.5 + +A catch-up release dealing with some of the accumulated contributions. This one +is probably will be the last before the 8.0 which will be slightly backwards +incompatible regarding some advanced use-cases. + +One outstanding change in this version is the addition of 6 languages to the +[hosted script][d]: Markdown, ObjectiveC, CoffeeScript, Apache, Nginx and +Makefile. It now weighs about 6K more but we're going to keep it under 30K. + +New languages: + +- OCaml by [Mehdi Dogguy][mehdid] and [Nicolas Braud-Santoni][nbraud] +- [LiveCode Server][lcs] by [Ralf Bitter][revig] +- Scilab by [Sylvestre Ledru][sylvestre] +- basic support for Makefile by [Ivan Sagalaev][isagalaev] + +Improvements: + +- Ruby's got support for characters like `?A`, `?1`, `?\012` etc. and `%r{..}` + regexps. +- Clojure now allows a function call in the beginning of s-expressions + `(($filter "myCount") (arr 1 2 3 4 5))`. +- Haskell's got new keywords and now recognizes more things like pragmas, + preprocessors, modules, containers, FFIs etc. Thanks to [Zena Treep][treep] + for the implementation and to [Jeremy Hull][sourrust] for guiding it. +- Miscelleanous fixes in PHP, Brainfuck, SCSS, Asciidoc, CMake, Python and F#. + +[mehdid]: https://github.com/mehdid +[nbraud]: https://github.com/nbraud +[revig]: https://github.com/revig +[lcs]: http://livecode.com/developers/guides/server/ +[sylvestre]: https://github.com/sylvestre +[isagalaev]: https://github.com/isagalaev +[treep]: https://github.com/treep +[sourrust]: https://github.com/sourrust +[d]: http://highlightjs.org/download/ + + +## New core developers + +The latest long period of almost complete inactivity in the project coincided +with growing interest to it led to a decision that now seems completely obvious: +we need more core developers. + +So without further ado let me welcome to the core team two long-time +contributors: [Jeremy Hull][] and [Oleg +Efimov][]. + +Hope now we'll be able to work through stuff faster! + +P.S. The historical commit is [here][1] for the record. + +[Jeremy Hull]: https://github.com/sourrust +[Oleg Efimov]: https://github.com/sannis +[1]: https://github.com/isagalaev/highlight.js/commit/f3056941bda56d2b72276b97bc0dd5f230f2473f + + +## Version 7.4 + +This long overdue version is a snapshot of the current source tree with all the +changes that happened during the past year. Sorry for taking so long! + +Along with the changes in code highlight.js has finally got its new home at +, moving from its craddle on Software Maniacs which it +outgrew a long time ago. Be sure to report any bugs about the site to +. + +On to what's new… + +New languages: + +- Handlebars templates by [Robin Ward][] +- Oracle Rules Language by [Jason Jacobson][] +- F# by [Joans Follesø][] +- AsciiDoc and Haml by [Dan Allen][] +- Lasso by [Eric Knibbe][] +- SCSS by [Kurt Emch][] +- VB.NET by [Poren Chiang][] +- Mizar by [Kelley van Evert][] + +[Robin Ward]: https://github.com/eviltrout +[Jason Jacobson]: https://github.com/jayce7 +[Joans Follesø]: https://github.com/follesoe +[Dan Allen]: https://github.com/mojavelinux +[Eric Knibbe]: https://github.com/EricFromCanada +[Kurt Emch]: https://github.com/kemch +[Poren Chiang]: https://github.com/rschiang +[Kelley van Evert]: https://github.com/kelleyvanevert + +New style themes: + +- Monokai Sublime by [noformnocontent][] +- Railscasts by [Damien White][] +- Obsidian by [Alexander Marenin][] +- Docco by [Simon Madine][] +- Mono Blue by [Ivan Sagalaev][] (uses a single color hue for everything) +- Foundation by [Dan Allen][] + +[noformnocontent]: http://nn.mit-license.org/ +[Damien White]: https://github.com/visoft +[Alexander Marenin]: https://github.com/ioncreature +[Simon Madine]: https://github.com/thingsinjars +[Ivan Sagalaev]: https://github.com/isagalaev + +Other notable changes: + +- Corrected many corner cases in CSS. +- Dropped Python 2 version of the build tool. +- Implemented building for the AMD format. +- Updated Rust keywords (thanks to [Dmitry Medvinsky][]). +- Literal regexes can now be used in language definitions. +- CoffeeScript highlighting is now significantly more robust and rich due to + input from [Cédric Néhémie][]. + +[Dmitry Medvinsky]: https://github.com/dmedvinsky +[Cédric Néhémie]: https://github.com/abe33 + + +## Version 7.3 + +- Since this version highlight.js no longer works in IE version 8 and older. + It's made it possible to reduce the library size and dramatically improve code + readability and made it easier to maintain. Time to go forward! + +- New languages: AppleScript (by [Nathan Grigg][ng] and [Dr. Drang][dd]) and + Brainfuck (by [Evgeny Stepanischev][bolk]). + +- Improvements to existing languages: + + - interpreter prompt in Python (`>>>` and `...`) + - @-properties and classes in CoffeeScript + - E4X in JavaScript (by [Oleg Efimov][oe]) + - new keywords in Perl (by [Kirk Kimmel][kk]) + - big Ruby syntax update (by [Vasily Polovnyov][vast]) + - small fixes in Bash + +- Also Oleg Efimov did a great job of moving all the docs for language and style + developers and contributors from the old wiki under the source code in the + "docs" directory. Now these docs are nicely presented at + . + +[ng]: https://github.com/nathan11g +[dd]: https://github.com/drdrang +[bolk]: https://github.com/bolknote +[oe]: https://github.com/Sannis +[kk]: https://github.com/kimmel +[vast]: https://github.com/vast + + +## Version 7.2 + +A regular bug-fix release without any significant new features. Enjoy! + + +## Version 7.1 + +A Summer crop: + +- [Marc Fornos][mf] made the definition for Clojure along with the matching + style Rainbow (which, of course, works for other languages too). +- CoffeeScript support continues to improve getting support for regular + expressions. +- Yoshihide Jimbo ported to highlight.js [five Tomorrow styles][tm] from the + [project by Chris Kempson][tm0]. +- Thanks to [Casey Duncun][cd] the library can now be built in the popular + [AMD format][amd]. +- And last but not least, we've got a fair number of correctness and consistency + fixes, including a pretty significant refactoring of Ruby. + +[mf]: https://github.com/mfornos +[tm]: http://jmblog.github.com/color-themes-for-highlightjs/ +[tm0]: https://github.com/ChrisKempson/Tomorrow-Theme +[cd]: https://github.com/caseman +[amd]: http://requirejs.org/docs/whyamd.html + + +## Version 7.0 + +The reason for the new major version update is a global change of keyword syntax +which resulted in the library getting smaller once again. For example, the +hosted build is 2K less than at the previous version while supporting two new +languages. + +Notable changes: + +- The library now works not only in a browser but also with [node.js][]. It is + installable with `npm install highlight.js`. [API][] docs are available on our + wiki. + +- The new unique feature (apparently) among syntax highlighters is highlighting + *HTTP* headers and an arbitrary language in the request body. The most useful + languages here are *XML* and *JSON* both of which highlight.js does support. + Here's [the detailed post][p] about the feature. + +- Two new style themes: a dark "south" *[Pojoaque][]* by Jason Tate and an + emulation of*XCode* IDE by [Angel Olloqui][ao]. + +- Three new languages: *D* by [Aleksandar Ružičić][ar], *R* by [Joe Cheng][jc] + and *GLSL* by [Sergey Tikhomirov][st]. + +- *Nginx* syntax has become a million times smaller and more universal thanks to + remaking it in a more generic manner that doesn't require listing all the + directives in the known universe. + +- Function titles are now highlighted in *PHP*. + +- *Haskell* and *VHDL* were significantly reworked to be more rich and correct + by their respective maintainers [Jeremy Hull][sr] and [Igor Kalnitsky][ik]. + +And last but not least, many bugs have been fixed around correctness and +language detection. + +Overall highlight.js currently supports 51 languages and 20 style themes. + +[node.js]: http://nodejs.org/ +[api]: http://softwaremaniacs.org/wiki/doku.php/highlight.js:api +[p]: http://softwaremaniacs.org/blog/2012/05/10/http-and-json-in-highlight-js/en/ +[pojoaque]: http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html +[ao]: https://github.com/angelolloqui +[ar]: https://github.com/raleksandar +[jc]: https://github.com/jcheng5 +[st]: https://github.com/tikhomirov +[sr]: https://github.com/sourrust +[ik]: https://github.com/ikalnitsky + + +## Version 6.2 + +A lot of things happened in highlight.js since the last version! We've got nine +new contributors, the discussion group came alive, and the main branch on GitHub +now counts more than 350 followers. Here are most significant results coming +from all this activity: + +- 5 (five!) new languages: Rust, ActionScript, CoffeeScript, MatLab and + experimental support for markdown. Thanks go to [Andrey Vlasovskikh][av], + [Alexander Myadzel][am], [Dmytrii Nagirniak][dn], [Oleg Efimov][oe], [Denis + Bardadym][db] and [John Crepezzi][jc]. + +- 2 new style themes: Monokai by [Luigi Maselli][lm] and stylistic imitation of + another well-known highlighter Google Code Prettify by [Aahan Krish][ak]. + +- A vast number of [correctness fixes and code refactorings][log], mostly made + by [Oleg Efimov][oe] and [Evgeny Stepanischev][es]. + +[av]: https://github.com/vlasovskikh +[am]: https://github.com/myadzel +[dn]: https://github.com/dnagir +[oe]: https://github.com/Sannis +[db]: https://github.com/btd +[jc]: https://github.com/seejohnrun +[lm]: http://grigio.org/ +[ak]: https://github.com/geekpanth3r +[es]: https://github.com/bolknote +[log]: https://github.com/isagalaev/highlight.js/commits/ + + +## Version 6.1 — Solarized + +[Jeremy Hull][jh] has implemented my dream feature — a port of [Solarized][] +style theme famous for being based on the intricate color theory to achieve +correct contrast and color perception. It is now available for highlight.js in +both variants — light and dark. + +This version also adds a new original style Arta. Its author pumbur maintains a +[heavily modified fork of highlight.js][pb] on GitHub. + +[jh]: https://github.com/sourrust +[solarized]: http://ethanschoonover.com/solarized +[pb]: https://github.com/pumbur/highlight.js + + +## Version 6.0 + +New major version of the highlighter has been built on a significantly +refactored syntax. Due to this it's even smaller than the previous one while +supporting more languages! + +New languages are: + +- Haskell by [Jeremy Hull][sourrust] +- Erlang in two varieties — module and REPL — made collectively by [Nikolay + Zakharov][desh], [Dmitry Kovega][arhibot] and [Sergey Ignatov][ignatov] +- Objective C by [Valerii Hiora][vhbit] +- Vala by [Antono Vasiljev][antono] +- Go by [Stephan Kountso][steplg] + +[sourrust]: https://github.com/sourrust +[desh]: http://desh.su/ +[arhibot]: https://github.com/arhibot +[ignatov]: https://github.com/ignatov +[vhbit]: https://github.com/vhbit +[antono]: https://github.com/antono +[steplg]: https://github.com/steplg + +Also this version is marginally faster and fixes a number of small long-standing +bugs. + +Developer overview of the new language syntax is available in a [blog post about +recent beta release][beta]. + +[beta]: http://softwaremaniacs.org/blog/2011/04/25/highlight-js-60-beta/en/ + +P.S. New version is not yet available on a Yandex' CDN, so for now you have to +download [your own copy][d]. + +[d]: /soft/highlight/en/download/ + + +## Version 5.14 + +Fixed bugs in HTML/XML detection and relevance introduced in previous +refactoring. + +Also test.html now shows the second best result of language detection by +relevance. + + +## Version 5.13 + +Past weekend began with a couple of simple additions for existing languages but +ended up in a big code refactoring bringing along nice improvements for language +developers. + +### For users + +- Description of C++ has got new keywords from the upcoming [C++ 0x][] standard. +- Description of HTML has got new tags from [HTML 5][]. +- CSS-styles have been unified to use consistent padding and also have lost + pop-outs with names of detected languages. +- [Igor Kalnitsky][ik] has sent two new language descriptions: CMake и VHDL. + +This makes total number of languages supported by highlight.js to reach 35. + +Bug fixes: + +- Custom classes on `
    ` tags are not being overridden anymore
    +- More correct highlighting of code blocks inside non-`
    ` containers:
    +  highlighter now doesn't insist on replacing them with its own container and
    +  just replaces the contents.
    +- Small fixes in browser compatibility and heuristics.
    +
    +[c++ 0x]: http://ru.wikipedia.org/wiki/C%2B%2B0x
    +[html 5]: http://en.wikipedia.org/wiki/HTML5
    +[ik]: http://kalnitsky.org.ua/
    +
    +### For developers
    +
    +The most significant change is the ability to include language submodes right
    +under `contains` instead of defining explicit named submodes in the main array:
    +
    +    contains: [
    +      'string',
    +      'number',
    +      {begin: '\\n', end: hljs.IMMEDIATE_RE}
    +    ]
    +
    +This is useful for auxiliary modes needed only in one place to define parsing.
    +Note that such modes often don't have `className` and hence won't generate a
    +separate `` in the resulting markup. This is similar in effect to
    +`noMarkup: true`. All existing languages have been refactored accordingly.
    +
    +Test file test.html has at last become a real test. Now it not only puts the
    +detected language name under the code snippet but also tests if it matches the
    +expected one. Test summary is displayed right above all language snippets.
    +
    +
    +## CDN
    +
    +Fine people at [Yandex][] agreed to host highlight.js on their big fast servers.
    +[Link up][l]!
    +
    +[yandex]: http://yandex.com/
    +[l]: http://softwaremaniacs.org/soft/highlight/en/download/
    +
    +
    +## Version 5.10 — "Paris".
    +
    +Though I'm on a vacation in Paris, I decided to release a new version with a
    +couple of small fixes:
    +
    +- Tomas Vitvar discovered that TAB replacement doesn't always work when used
    +  with custom markup in code
    +- SQL parsing is even more rigid now and doesn't step over SmallTalk in tests
    +
    +
    +## Version 5.9
    +
    +A long-awaited version is finally released.
    +
    +New languages:
    +
    +- Andrew Fedorov made a definition for Lua
    +- a long-time highlight.js contributor [Peter Leonov][pl] made a definition for
    +  Nginx config
    +- [Vladimir Moskva][vm] made a definition for TeX
    +
    +[pl]: http://kung-fu-tzu.ru/
    +[vm]: http://fulc.ru/
    +
    +Fixes for existing languages:
    +
    +- [Loren Segal][ls] reworked the Ruby definition and added highlighting for
    +  [YARD][] inline documentation
    +- the definition of SQL has become more solid and now it shouldn't be overly
    +  greedy when it comes to language detection
    +
    +[ls]: http://gnuu.org/
    +[yard]: http://yardoc.org/
    +
    +The highlighter has become more usable as a library allowing to do highlighting
    +from initialization code of JS frameworks and in ajax methods (see.
    +readme.eng.txt).
    +
    +Also this version drops support for the [WordPress][wp] plugin. Everyone is
    +welcome to [pick up its maintenance][p] if needed.
    +
    +[wp]: http://wordpress.org/
    +[p]: http://bazaar.launchpad.net/~isagalaev/+junk/highlight/annotate/342/src/wp_highlight.js.php
    +
    +
    +## Version 5.8
    +
    +- Jan Berkel has contributed a definition for Scala. +1 to hotness!
    +- All CSS-styles are rewritten to work only inside `
    ` tags to avoid
    +  conflicts with host site styles.
    +
    +
    +## Version 5.7.
    +
    +Fixed escaping of quotes in VBScript strings.
    +
    +
    +## Version 5.5
    +
    +This version brings a small change: now .ini-files allow digits, underscores and
    +square brackets in key names.
    +
    +
    +## Version 5.4
    +
    +Fixed small but upsetting bug in the packer which caused incorrect highlighting
    +of explicitly specified languages. Thanks to Andrew Fedorov for precise
    +diagnostics!
    +
    +
    +## Version 5.3
    +
    +The version to fulfil old promises.
    +
    +The most significant change is that highlight.js now preserves custom user
    +markup in code along with its own highlighting markup. This means that now it's
    +possible to use, say, links in code. Thanks to [Vladimir Dolzhenko][vd] for the
    +[initial proposal][1] and for making a proof-of-concept patch.
    +
    +Also in this version:
    +
    +- [Vasily Polovnyov][vp] has sent a GitHub-like style and has implemented
    +  support for CSS @-rules and Ruby symbols.
    +- Yura Zaripov has sent two styles: Brown Paper and School Book.
    +- Oleg Volchkov has sent a definition for [Parser 3][p3].
    +
    +[1]: http://softwaremaniacs.org/forum/highlightjs/6612/
    +[p3]: http://www.parser.ru/
    +[vp]: http://vasily.polovnyov.ru/
    +[vd]: http://dolzhenko.blogspot.com/
    +
    +
    +## Version 5.2
    +
    +- at last it's possible to replace indentation TABs with something sensible (e.g. 2 or 4 spaces)
    +- new keywords and built-ins for 1C by Sergey Baranov
    +- a couple of small fixes to Apache highlighting
    +
    +
    +## Version 5.1
    +
    +This is one of those nice version consisting entirely of new and shiny
    +contributions!
    +
    +- [Vladimir Ermakov][vooon] created highlighting for AVR Assembler
    +- [Ruslan Keba][rukeba] created highlighting for Apache config file. Also his
    +  original visual style for it is now available for all highlight.js languages
    +  under the name "Magula".
    +- [Shuen-Huei Guan][drake] (aka Drake) sent new keywords for RenderMan
    +  languages. Also thanks go to [Konstantin Evdokimenko][ke] for his advice on
    +  the matter.
    +
    +[vooon]: http://vehq.ru/about/
    +[rukeba]: http://rukeba.com/
    +[drake]: http://drakeguan.org/
    +[ke]: http://k-evdokimenko.moikrug.ru/
    +
    +
    +## Version 5.0
    +
    +The main change in the new major version of highlight.js is a mechanism for
    +packing several languages along with the library itself into a single compressed
    +file. Now sites using several languages will load considerably faster because
    +the library won't dynamically include additional files while loading.
    +
    +Also this version fixes a long-standing bug with Javascript highlighting that
    +couldn't distinguish between regular expressions and division operations.
    +
    +And as usually there were a couple of minor correctness fixes.
    +
    +Great thanks to all contributors! Keep using highlight.js.
    +
    +
    +## Version 4.3
    +
    +This version comes with two contributions from [Jason Diamond][jd]:
    +
    +- language definition for C# (yes! it was a long-missed thing!)
    +- Visual Studio-like highlighting style
    +
    +Plus there are a couple of minor bug fixes for parsing HTML and XML attributes.
    +
    +[jd]: http://jason.diamond.name/weblog/
    +
    +
    +## Version 4.2
    +
    +The biggest news is highlighting for Lisp, courtesy of Vasily Polovnyov. It's
    +somewhat experimental meaning that for highlighting "keywords" it doesn't use
    +any pre-defined set of a Lisp dialect. Instead it tries to highlight first word
    +in parentheses wherever it makes sense. I'd like to ask people programming in
    +Lisp to confirm if it's a good idea and send feedback to [the forum][f].
    +
    +Other changes:
    +
    +- Smalltalk was excluded from DEFAULT_LANGUAGES to save traffic
    +- [Vladimir Epifanov][voldmar] has implemented javascript style switcher for
    +  test.html
    +- comments now allowed inside Ruby function definition
    +- [MEL][] language from [Shuen-Huei Guan][drake]
    +- whitespace now allowed between `
    ` and ``
    +- better auto-detection of C++ and PHP
    +- HTML allows embedded VBScript (`<% .. %>`)
    +
    +[f]: http://softwaremaniacs.org/forum/highlightjs/
    +[voldmar]: http://voldmar.ya.ru/
    +[mel]: http://en.wikipedia.org/wiki/Maya_Embedded_Language
    +[drake]: http://drakeguan.org/
    +
    +
    +## Version 4.1
    +
    +Languages:
    +
    +- Bash from Vah
    +- DOS bat-files from Alexander Makarov (Sam)
    +- Diff files from Vasily Polovnyov
    +- Ini files from myself though initial idea was from Sam
    +
    +Styles:
    +
    +- Zenburn from Vladimir Epifanov, this is an imitation of a
    +  [well-known theme for Vim][zenburn].
    +- Ascetic from myself, as a realization of ideals of non-flashy highlighting:
    +  just one color in only three gradations :-)
    +
    +In other news. [One small bug][bug] was fixed, built-in keywords were added for
    +Python and C++ which improved auto-detection for the latter (it was shame that
    +[my wife's blog][alenacpp] had issues with it from time to time). And lastly
    +thanks go to Sam for getting rid of my stylistic comments in code that were
    +getting in the way of [JSMin][].
    +
    +[zenburn]: http://en.wikipedia.org/wiki/Zenburn
    +[alenacpp]: http://alenacpp.blogspot.com/
    +[bug]: http://softwaremaniacs.org/forum/viewtopic.php?id=1823
    +[jsmin]: http://code.google.com/p/jsmin-php/
    +
    +
    +## Version 4.0
    +
    +New major version is a result of vast refactoring and of many contributions.
    +
    +Visible new features:
    +
    +- Highlighting of embedded languages. Currently is implemented highlighting of
    +  Javascript and CSS inside HTML.
    +- Bundled 5 ready-made style themes!
    +
    +Invisible new features:
    +
    +- Highlight.js no longer pollutes global namespace. Only one object and one
    +  function for backward compatibility.
    +- Performance is further increased by about 15%.
    +
    +Changing of a major version number caused by a new format of language definition
    +files. If you use some third-party language files they should be updated.
    +
    +
    +## Version 3.5
    +
    +A very nice version in my opinion fixing a number of small bugs and slightly
    +increased speed in a couple of corner cases. Thanks to everybody who reports
    +bugs in he [forum][f] and by email!
    +
    +There is also a new language — XML. A custom XML formerly was detected as HTML
    +and didn't highlight custom tags. In this version I tried to make custom XML to
    +be detected and highlighted by its own rules. Which by the way include such
    +things as CDATA sections and processing instructions (``).
    +
    +[f]: http://softwaremaniacs.org/forum/viewforum.php?id=6
    +
    +
    +## Version 3.3
    +
    +[Vladimir Gubarkov][xonix] has provided an interesting and useful addition.
    +File export.html contains a little program that shows and allows to copy and
    +paste an HTML code generated by the highlighter for any code snippet. This can
    +be useful in situations when one can't use the script itself on a site.
    +
    +
    +[xonix]: http://xonixx.blogspot.com/
    +
    +
    +## Version 3.2 consists completely of contributions:
    +
    +- Vladimir Gubarkov has described SmallTalk
    +- Yuri Ivanov has described 1C
    +- Peter Leonov has packaged the highlighter as a Firefox extension
    +- Vladimir Ermakov has compiled a mod for phpBB
    +
    +Many thanks to you all!
    +
    +
    +## Version 3.1
    +
    +Three new languages are available: Django templates, SQL and Axapta. The latter
    +two are sent by [Dmitri Roudakov][1]. However I've almost entirely rewrote an
    +SQL definition but I'd never started it be it from the ground up :-)
    +
    +The engine itself has got a long awaited feature of grouping keywords
    +("keyword", "built-in function", "literal"). No more hacks!
    +
    +[1]: http://roudakov.ru/
    +
    +
    +## Version 3.0
    +
    +It is major mainly because now highlight.js has grown large and has become
    +modular. Now when you pass it a list of languages to highlight it will
    +dynamically load into a browser only those languages.
    +
    +Also:
    +
    +- Konstantin Evdokimenko of [RibKit][] project has created a highlighting for
    +  RenderMan Shading Language and RenderMan Interface Bytestream. Yay for more
    +  languages!
    +- Heuristics for C++ and HTML got better.
    +- I've implemented (at last) a correct handling of backslash escapes in C-like
    +  languages.
    +
    +There is also a small backwards incompatible change in the new version. The
    +function initHighlighting that was used to initialize highlighting instead of
    +initHighlightingOnLoad a long time ago no longer works. If you by chance still
    +use it — replace it with the new one.
    +
    +[RibKit]: http://ribkit.sourceforge.net/
    +
    +
    +## Version 2.9
    +
    +Highlight.js is a parser, not just a couple of regular expressions. That said
    +I'm glad to announce that in the new version 2.9 has support for:
    +
    +- in-string substitutions for Ruby -- `#{...}`
    +- strings from from numeric symbol codes (like #XX) for Delphi
    +
    +
    +## Version 2.8
    +
    +A maintenance release with more tuned heuristics. Fully backwards compatible.
    +
    +
    +## Version 2.7
    +
    +- Nikita Ledyaev presents highlighting for VBScript, yay!
    +- A couple of bugs with escaping in strings were fixed thanks to Mickle
    +- Ongoing tuning of heuristics
    +
    +Fixed bugs were rather unpleasant so I encourage everyone to upgrade!
    +
    +
    +## Version 2.4
    +
    +- Peter Leonov provides another improved highlighting for Perl
    +- Javascript gets a new kind of keywords — "literals". These are the words
    +  "true", "false" and "null"
    +
    +Also highlight.js homepage now lists sites that use the library. Feel free to
    +add your site by [dropping me a message][mail] until I find the time to build a
    +submit form.
    +
    +[mail]: mailto:Maniac@SoftwareManiacs.Org
    +
    +
    +## Version 2.3
    +
    +This version fixes IE breakage in previous version. My apologies to all who have
    +already downloaded that one!
    +
    +
    +## Version 2.2
    +
    +- added highlighting for Javascript
    +- at last fixed parsing of Delphi's escaped apostrophes in strings
    +- in Ruby fixed highlighting of keywords 'def' and 'class', same for 'sub' in
    +  Perl
    +
    +
    +## Version 2.0
    +
    +- Ruby support by [Anton Kovalyov][ak]
    +- speed increased by orders of magnitude due to new way of parsing
    +- this same way allows now correct highlighting of keywords in some tricky
    +  places (like keyword "End" at the end of Delphi classes)
    +
    +[ak]: http://anton.kovalyov.net/
    +
    +
    +## Version 1.0
    +
    +Version 1.0 of javascript syntax highlighter is released!
    +
    +It's the first version available with English description. Feel free to post
    +your comments and question to [highlight.js forum][forum]. And don't be afraid
    +if you find there some fancy Cyrillic letters -- it's for Russian users too :-)
    +
    +[forum]: http://softwaremaniacs.org/forum/viewforum.php?id=6
    diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/LICENSE b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/LICENSE
    new file mode 100644
    index 0000000..422deb7
    --- /dev/null
    +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/LICENSE
    @@ -0,0 +1,24 @@
    +Copyright (c) 2006, Ivan Sagalaev
    +All rights reserved.
    +Redistribution and use in source and binary forms, with or without
    +modification, are permitted provided that the following conditions are met:
    +
    +    * Redistributions of source code must retain the above copyright
    +      notice, this list of conditions and the following disclaimer.
    +    * Redistributions in binary form must reproduce the above copyright
    +      notice, this list of conditions and the following disclaimer in the
    +      documentation and/or other materials provided with the distribution.
    +    * Neither the name of highlight.js nor the names of its contributors 
    +      may be used to endorse or promote products derived from this software 
    +      without specific prior written permission.
    +
    +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
    +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
    +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    +DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
    +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
    +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
    +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/README.md b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/README.md
    new file mode 100644
    index 0000000..0ee9637
    --- /dev/null
    +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/README.md
    @@ -0,0 +1,167 @@
    +# Highlight.js
    +
    +Highlight.js highlights syntax in code examples on blogs, forums and,
    +in fact, on any web page. It's very easy to use because it works
    +automatically: finds blocks of code, detects a language, highlights it.
    +
    +Autodetection can be fine tuned when it fails by itself (see "Heuristics").
    +
    +
    +## Basic usage
    +
    +Link the library and a stylesheet from your page and hook highlighting to
    +the page load event:
    +
    +```html
    +
    +
    +
    +```
    +
    +This will highlight all code on the page marked up as `
     .. 
    `. +If you use different markup or need to apply highlighting dynamically, read +"Custom initialization" below. + +- You can download your own customized version of "highlight.pack.js" or + use the hosted one as described on the download page: + + +- Style themes are available in the download package or as hosted files. + To create a custom style for your site see the class reference in the file + [CSS classes reference][cr] from the downloaded package. + +[cr]: http://highlightjs.readthedocs.org/en/latest/css-classes-reference.html + + +## node.js + +Highlight.js can be used under node.js. The package with all supported languages is +installable from NPM: + + npm install highlight.js + +Alternatively, you can build it from the source with only languages you need: + + python3 tools/build.py -tnode lang1 lang2 .. + +Using the library: + +```javascript +var hljs = require('highlight.js'); + +// If you know the language +hljs.highlight(lang, code).value; + +// Automatic language detection +hljs.highlightAuto(code).value; +``` + + +## AMD + +Highlight.js can be used with an AMD loader. You will need to build it from +source in order to do so: + +```bash +$ python3 tools/build.py -tamd lang1 lang2 .. +``` + +Which will generate a `build/highlight.pack.js` which will load as an AMD +module with support for the built languages and can be used like so: + +```javascript +require(["highlight.js/build/highlight.pack"], function(hljs){ + + // If you know the language + hljs.highlight(lang, code).value; + + // Automatic language detection + hljs.highlightAuto(code).value; +}); +``` + + +## Tab replacement + +You can replace TAB ('\x09') characters used for indentation in your code +with some fixed number of spaces or with a `` to give them special +styling: + +```html + +``` + +## Custom initialization + +If you use different markup for code blocks you can initialize them manually +with `highlightBlock(code)` function. It takes a DOM element containing the +code to highlight and optionally a string with which to replace TAB +characters. + +Initialization using, for example, jQuery might look like this: + +```javascript +$(document).ready(function() { + $('pre code').each(function(i, e) {hljs.highlightBlock(e)}); +}); +``` + +You can use `highlightBlock` to highlight blocks dynamically inserted into +the page. Just make sure you don't do it twice for already highlighted +blocks. + +If your code container relies on `
    ` tags instead of line breaks (i.e. if +it's not `
    `) set the `useBR` option to `true`:
    +
    +```javascript
    +hljs.configure({useBR: true});
    +$('div.code').each(function(i, e) {hljs.highlightBlock(e)});
    +```
    +
    +
    +## Heuristics
    +
    +Autodetection of a code's language is done using a simple heuristic:
    +the program tries to highlight a fragment with all available languages and
    +counts all syntactic structures that it finds along the way. The language
    +with greatest count wins.
    +
    +This means that in short fragments the probability of an error is high
    +(and it really happens sometimes). In this cases you can set the fragment's
    +language explicitly by assigning a class to the `` element:
    +
    +```html
    +
    ...
    +``` + +You can use class names recommended in HTML5: "language-html", +"language-php". Classes also can be assigned to the `
    ` element.
    +
    +To disable highlighting of a fragment altogether use "no-highlight" class:
    +
    +```html
    +
    ...
    +``` + + +## Export + +File export.html contains a little program that allows you to paste in a code +snippet and then copy and paste the resulting HTML code generated by the +highlighter. This is useful in situations when you can't use the script itself +on a site. + + +## Meta + +- Version: 8.0 +- URL: http://highlightjs.org/ + +For the license terms see LICENSE files. +For authors and contributors see AUTHORS.en.txt file. diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/README.ru.md b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/README.ru.md new file mode 100644 index 0000000..0d0e0fe --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/README.ru.md @@ -0,0 +1,171 @@ +# Highlight.js + +Highlight.js нужен для подсветки синтаксиса в примерах кода в блогах, +форумах и вообще на любых веб-страницах. Пользоваться им очень просто, +потому что работает он автоматически: сам находит блоки кода, сам +определяет язык, сам подсвечивает. + +Автоопределением языка можно управлять, когда оно не справляется само (см. +дальше "Эвристика"). + + +## Простое использование + +Подключите библиотеку и стиль на страницу и повесть вызов подсветки на +загрузку страницы: + +```html + + + +``` + +Весь код на странице, обрамлённый в теги `
     .. 
    ` +будет автоматически подсвечен. Если вы используете другие теги или хотите +подсвечивать блоки кода динамически, читайте "Инициализацию вручную" ниже. + +- Вы можете скачать собственную версию "highlight.pack.js" или сослаться + на захостенный файл, как описано на странице загрузки: + + +- Стилевые темы можно найти в загруженном архиве или также использовать + захостенные. Чтобы сделать собственный стиль для своего сайта, вам + будет полезен [CSS classes reference][cr], который тоже есть в архиве. + +[cr]: http://highlightjs.readthedocs.org/en/latest/css-classes-reference.html + + +## node.js + +Highlight.js можно использовать в node.js. Библиотеку со всеми возможными языками можно +установить с NPM: + + npm install highlight.js + +Также её можно собрать из исходников с только теми языками, которые нужны: + + python3 tools/build.py -tnode lang1 lang2 .. + +Использование библиотеки: + +```javascript +var hljs = require('highlight.js'); + +// Если вы знаете язык +hljs.highlight(lang, code).value; + +// Автоопределение языка +hljs.highlightAuto(code).value; +``` + + +## AMD + +Highlight.js можно использовать с загрузчиком AMD-модулей. Для этого его +нужно собрать из исходников следующей командой: + +```bash +$ python3 tools/build.py -tamd lang1 lang2 .. +``` + +Она создаст файл `build/highlight.pack.js`, который является загружаемым +AMD-модулем и содержит все выбранные при сборке языки. Используется он так: + +```javascript +require(["highlight.js/build/highlight.pack"], function(hljs){ + + // Если вы знаете язык + hljs.highlight(lang, code).value; + + // Автоопределение языка + hljs.highlightAuto(code).value; +}); +``` + + +## Замена TABов + +Также вы можете заменить символы TAB ('\x09'), используемые для отступов, на +фиксированное количество пробелов или на отдельный ``, чтобы задать ему +какой-нибудь специальный стиль: + +```html + +``` + + +## Инициализация вручную + +Если вы используете другие теги для блоков кода, вы можете инициализировать их +явно с помощью функции `highlightBlock(code)`. Она принимает DOM-элемент с +текстом расцвечиваемого кода и опционально - строчку для замены символов TAB. + +Например с использованием jQuery код инициализации может выглядеть так: + +```javascript +$(document).ready(function() { + $('pre code').each(function(i, e) {hljs.highlightBlock(e)}); +}); +``` + +`highlightBlock` можно также использовать, чтобы подсветить блоки кода, +добавленные на страницу динамически. Только убедитесь, что вы не делаете этого +повторно для уже раскрашенных блоков. + +Если ваш блок кода использует `
    ` вместо переводов строки (т.е. если это не +`
    `), включите опцию `useBR`:
    +
    +```javascript
    +hljs.configure({useBR: true});
    +$('div.code').each(function(i, e) {hljs.highlightBlock(e)});
    +```
    +
    +
    +## Эвристика
    +
    +Определение языка, на котором написан фрагмент, делается с помощью
    +довольно простой эвристики: программа пытается расцветить фрагмент всеми
    +языками подряд, и для каждого языка считает количество подошедших
    +синтаксически конструкций и ключевых слов. Для какого языка нашлось больше,
    +тот и выбирается.
    +
    +Это означает, что в коротких фрагментах высока вероятность ошибки, что
    +периодически и случается. Чтобы указать язык фрагмента явно, надо написать
    +его название в виде класса к элементу ``:
    +
    +```html
    +
    ...
    +``` + +Можно использовать рекомендованные в HTML5 названия классов: +"language-html", "language-php". Также можно назначать классы на элемент +`
    `.
    +
    +Чтобы запретить расцветку фрагмента вообще, используется класс "no-highlight":
    +
    +```html
    +
    ...
    +``` + + +## Экспорт + +В файле export.html находится небольшая программка, которая показывает и дает +скопировать непосредственно HTML-код подсветки для любого заданного фрагмента кода. +Это может понадобится например на сайте, на котором нельзя подключить сам скрипт +highlight.js. + + +## Координаты + +- Версия: 8.0 +- URL: http://highlightjs.org/ + +Лицензионное соглашение читайте в файле LICENSE. +Список авторов и соавторов читайте в файле AUTHORS.ru.txt diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/highlight.pack.js b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/highlight.pack.js new file mode 100644 index 0000000..2f0a664 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/highlight.pack.js @@ -0,0 +1,2 @@ +// %LEAVE_UNMINIFIED% %REMOVE_LINE% +var hljs=new function(){function k(v){return v.replace(/&/gm,"&").replace(//gm,">")}function t(v){return v.nodeName.toLowerCase()}function i(w,x){var v=w&&w.exec(x);return v&&v.index==0}function d(v){return Array.prototype.map.call(v.childNodes,function(w){if(w.nodeType==3){return b.useBR?w.nodeValue.replace(/\n/g,""):w.nodeValue}if(t(w)=="br"){return"\n"}return d(w)}).join("")}function r(w){var v=(w.className+" "+(w.parentNode?w.parentNode.className:"")).split(/\s+/);v=v.map(function(x){return x.replace(/^language-/,"")});return v.filter(function(x){return j(x)||x=="no-highlight"})[0]}function o(x,y){var v={};for(var w in x){v[w]=x[w]}if(y){for(var w in y){v[w]=y[w]}}return v}function u(x){var v=[];(function w(y,z){for(var A=y.firstChild;A;A=A.nextSibling){if(A.nodeType==3){z+=A.nodeValue.length}else{if(t(A)=="br"){z+=1}else{if(A.nodeType==1){v.push({event:"start",offset:z,node:A});z=w(A,z);v.push({event:"stop",offset:z,node:A})}}}}return z})(x,0);return v}function q(w,y,C){var x=0;var F="";var z=[];function B(){if(!w.length||!y.length){return w.length?w:y}if(w[0].offset!=y[0].offset){return(w[0].offset"}function E(G){F+=""}function v(G){(G.event=="start"?A:E)(G.node)}while(w.length||y.length){var D=B();F+=k(C.substr(x,D[0].offset-x));x=D[0].offset;if(D==w){z.reverse().forEach(E);do{v(D.splice(0,1)[0]);D=B()}while(D==w&&D.length&&D[0].offset==x);z.reverse().forEach(A)}else{if(D[0].event=="start"){z.push(D[0].node)}else{z.pop()}v(D.splice(0,1)[0])}}return F+k(C.substr(x))}function m(y){function v(z){return(z&&z.source)||z}function w(A,z){return RegExp(v(A),"m"+(y.cI?"i":"")+(z?"g":""))}function x(D,C){if(D.compiled){return}D.compiled=true;D.k=D.k||D.bK;if(D.k){var z={};function E(G,F){if(y.cI){F=F.toLowerCase()}F.split(" ").forEach(function(H){var I=H.split("|");z[I[0]]=[G,I[1]?Number(I[1]):1]})}if(typeof D.k=="string"){E("keyword",D.k)}else{Object.keys(D.k).forEach(function(F){E(F,D.k[F])})}D.k=z}D.lR=w(D.l||/\b[A-Za-z0-9_]+\b/,true);if(C){if(D.bK){D.b=D.bK.split(" ").join("|")}if(!D.b){D.b=/\B|\b/}D.bR=w(D.b);if(!D.e&&!D.eW){D.e=/\B|\b/}if(D.e){D.eR=w(D.e)}D.tE=v(D.e)||"";if(D.eW&&C.tE){D.tE+=(D.e?"|":"")+C.tE}}if(D.i){D.iR=w(D.i)}if(D.r===undefined){D.r=1}if(!D.c){D.c=[]}var B=[];D.c.forEach(function(F){if(F.v){F.v.forEach(function(G){B.push(o(F,G))})}else{B.push(F=="self"?D:F)}});D.c=B;D.c.forEach(function(F){x(F,D)});if(D.starts){x(D.starts,C)}var A=D.c.map(function(F){return F.bK?"\\.?\\b("+F.b+")\\b\\.?":F.b}).concat([D.tE]).concat([D.i]).map(v).filter(Boolean);D.t=A.length?w(A.join("|"),true):{exec:function(F){return null}};D.continuation={}}x(y)}function c(S,L,J,R){function v(U,V){for(var T=0;T";U+=Z+'">';return U+X+Y}function N(){var U=k(C);if(!I.k){return U}var T="";var X=0;I.lR.lastIndex=0;var V=I.lR.exec(U);while(V){T+=U.substr(X,V.index-X);var W=E(I,V);if(W){H+=W[1];T+=w(W[0],V[0])}else{T+=V[0]}X=I.lR.lastIndex;V=I.lR.exec(U)}return T+U.substr(X)}function F(){if(I.sL&&!f[I.sL]){return k(C)}var T=I.sL?c(I.sL,C,true,I.continuation.top):g(C);if(I.r>0){H+=T.r}if(I.subLanguageMode=="continuous"){I.continuation.top=T.top}return w(T.language,T.value,false,true)}function Q(){return I.sL!==undefined?F():N()}function P(V,U){var T=V.cN?w(V.cN,"",true):"";if(V.rB){D+=T;C=""}else{if(V.eB){D+=k(U)+T;C=""}else{D+=T;C=U}}I=Object.create(V,{parent:{value:I}})}function G(T,X){C+=T;if(X===undefined){D+=Q();return 0}var V=v(X,I);if(V){D+=Q();P(V,X);return V.rB?0:X.length}var W=z(I,X);if(W){var U=I;if(!(U.rE||U.eE)){C+=X}D+=Q();do{if(I.cN){D+=""}H+=I.r;I=I.parent}while(I!=W.parent);if(U.eE){D+=k(X)}C="";if(W.starts){P(W.starts,"")}return U.rE?0:X.length}if(A(X,I)){throw new Error('Illegal lexeme "'+X+'" for mode "'+(I.cN||"")+'"')}C+=X;return X.length||1}var M=j(S);if(!M){throw new Error('Unknown language: "'+S+'"')}m(M);var I=R||M;var D="";for(var K=I;K!=M;K=K.parent){if(K.cN){D=w(K.cN,D,true)}}var C="";var H=0;try{var B,y,x=0;while(true){I.t.lastIndex=x;B=I.t.exec(L);if(!B){break}y=G(L.substr(x,B.index-x),B[0]);x=B.index+y}G(L.substr(x));for(var K=I;K.parent;K=K.parent){if(K.cN){D+=""}}return{r:H,value:D,language:S,top:I}}catch(O){if(O.message.indexOf("Illegal")!=-1){return{r:0,value:k(L)}}else{throw O}}}function g(y,x){x=x||b.languages||Object.keys(f);var v={r:0,value:k(y)};var w=v;x.forEach(function(z){if(!j(z)){return}var A=c(z,y,false);A.language=z;if(A.r>w.r){w=A}if(A.r>v.r){w=v;v=A}});if(w.language){v.second_best=w}return v}function h(v){if(b.tabReplace){v=v.replace(/^((<[^>]+>|\t)+)/gm,function(w,z,y,x){return z.replace(/\t/g,b.tabReplace)})}if(b.useBR){v=v.replace(/\n/g,"
    ")}return v}function p(z){var y=d(z);var A=r(z);if(A=="no-highlight"){return}var v=A?c(A,y,true):g(y);var w=u(z);if(w.length){var x=document.createElementNS("http://www.w3.org/1999/xhtml","pre");x.innerHTML=v.value;v.value=q(w,u(x),y)}v.value=h(v.value);z.innerHTML=v.value;z.className+=" hljs "+(!A&&v.language||"");z.result={language:v.language,re:v.r};if(v.second_best){z.second_best={language:v.second_best.language,re:v.second_best.r}}}var b={classPrefix:"hljs-",tabReplace:null,useBR:false,languages:undefined};function s(v){b=o(b,v)}function l(){if(l.called){return}l.called=true;var v=document.querySelectorAll("pre code");Array.prototype.forEach.call(v,p)}function a(){addEventListener("DOMContentLoaded",l,false);addEventListener("load",l,false)}var f={};var n={};function e(v,x){var w=f[v]=x(this);if(w.aliases){w.aliases.forEach(function(y){n[y]=v})}}function j(v){return f[v]||f[n[v]]}this.highlight=c;this.highlightAuto=g;this.fixMarkup=h;this.highlightBlock=p;this.configure=s;this.initHighlighting=l;this.initHighlightingOnLoad=a;this.registerLanguage=e;this.getLanguage=j;this.inherit=o;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE]};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE]};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gim]*/,i:/\n/,c:[this.BE,{b:/\[/,e:/\]/,r:0,c:[this.BE]}]};this.TM={cN:"title",b:this.IR,r:0};this.UTM={cN:"title",b:this.UIR,r:0}}();hljs.registerLanguage("bash",function(b){var a={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)\}/}]};var d={cN:"string",b:/"/,e:/"/,c:[b.BE,a,{cN:"variable",b:/\$\(/,e:/\)/,c:[b.BE]}]};var c={cN:"string",b:/'/,e:/'/};return{l:/-?[a-z\.]+/,k:{keyword:"if then else elif fi for break continue while in do done exit return set declare case esac export exec",literal:"true false",built_in:"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo",operator:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"shebang",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:true,c:[b.inherit(b.TM,{b:/\w[\w\d_]*/})],r:0},b.HCM,b.NM,d,c,a]}});hljs.registerLanguage("cs",function(b){var a="abstract as base bool break byte case catch char checked const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await ascending descending from get group into join let orderby partial select set value var where yield";return{k:a,c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|"},{cN:"xmlDocTag",b:""}]},b.CLCM,b.CBLCLM,{cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line region endregion pragma checksum"},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},b.ASM,b.QSM,b.CNM,{bK:"protected public private internal",e:/[{;=]/,k:a,c:[{bK:"class namespace interface",starts:{c:[b.TM]}},{b:b.IR+"\\s*\\(",rB:true,c:[b.TM]}]}]}});hljs.registerLanguage("ruby",function(e){var h="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g="and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor";var a={cN:"yardoctag",b:"@[A-Za-z]+"};var i={cN:"comment",v:[{b:"#",e:"$",c:[a]},{b:"^\\=begin",e:"^\\=end",c:[a],r:10},{b:"^__END__",e:"\\n$"}]};var c={cN:"subst",b:"#\\{",e:"}",k:g};var d={cN:"string",c:[e.BE,c],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:"%[qw]?\\(",e:"\\)"},{b:"%[qw]?\\[",e:"\\]"},{b:"%[qw]?{",e:"}"},{b:"%[qw]?<",e:">",r:10},{b:"%[qw]?/",e:"/",r:10},{b:"%[qw]?%",e:"%",r:10},{b:"%[qw]?-",e:"-",r:10},{b:"%[qw]?\\|",e:"\\|",r:10},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/}]};var b={cN:"params",b:"\\(",e:"\\)",k:g};var f=[d,i,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]},i]},{cN:"function",bK:"def",e:" |$|;",r:0,c:[e.inherit(e.TM,{b:h}),b,i]},{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:[d,{b:h}],r:0},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:[i,{cN:"regexp",c:[e.BE,c],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}],r:0}];c.c=f;b.c=f;return{k:g,c:f}});hljs.registerLanguage("diff",function(a){return{c:[{cN:"chunk",r:10,v:[{b:/^\@\@ +\-\d+,\d+ +\+\d+,\d+ +\@\@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"header",v:[{b:/Index: /,e:/$/},{b:/=====/,e:/=====$/},{b:/^\-\-\-/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+\+\+/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"change",b:"^\\!",e:"$"}]}});hljs.registerLanguage("javascript",function(a){return{aliases:["js"],k:{keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require"},c:[{cN:"pi",b:/^\s*('|")use strict('|")/,r:10},a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{b:"("+a.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[a.CLCM,a.CBLCLM,a.REGEXP_MODE,{b:/;/,r:0,sL:"xml"}],r:0},{cN:"function",bK:"function",e:/\{/,c:[a.inherit(a.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,c:[a.CLCM,a.CBLCLM],i:/["'\(]/}],i:/\[|%/},{b:/\$[(.]/},{b:"\\."+a.IR,r:0}]}});hljs.registerLanguage("xml",function(a){var c="[A-Za-z0-9\\._:-]+";var d={b:/<\?(php)?(?!\w)/,e:/\?>/,sL:"php",subLanguageMode:"continuous"};var b={eW:true,i:/]+/}]}]}]};return{aliases:["html"],cI:true,c:[{cN:"doctype",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"|$)",e:">",k:{title:"style"},c:[b],starts:{e:"",rE:true,sL:"css"}},{cN:"tag",b:"|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},d,{cN:"pi",b:/<\?\w+/,e:/\?>/,r:10},{cN:"tag",b:"",c:[{cN:"title",b:"[^ /><]+",r:0},b]}]}});hljs.registerLanguage("markdown",function(a){return{c:[{cN:"header",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"blockquote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"`.+?`"},{b:"^( {4}|\t)",e:"$",r:0}]},{cN:"horizontal_rule",b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].+?[\\)\\]]",rB:true,c:[{cN:"link_label",b:"\\[",e:"\\]",eB:true,rE:true,r:0},{cN:"link_url",b:"\\]\\(",e:"\\)",eB:true,eE:true},{cN:"link_reference",b:"\\]\\[",e:"\\]",eB:true,eE:true,}],r:10},{b:"^\\[.+\\]:",e:"$",rB:true,c:[{cN:"link_reference",b:"\\[",e:"\\]",eB:true,eE:true},{cN:"link_url",b:"\\s",e:"$"}]}]}});hljs.registerLanguage("css",function(a){var b="[a-zA-Z-][a-zA-Z0-9_-]*";var c={cN:"function",b:b+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]};return{cI:true,i:"[=/|']",c:[a.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{cN:"at_rule",b:"@",e:"[{;]",c:[{cN:"keyword",b:/\S+/},{b:/\s/,eW:true,eE:true,r:0,c:[c,a.ASM,a.QSM,a.NM]}]},{cN:"tag",b:b,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[a.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[c,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"hexcolor",b:"#[0-9A-Fa-f]+"},{cN:"important",b:"!important"}]}}]}]}]}});hljs.registerLanguage("http",function(a){return{i:"\\S",c:[{cN:"status",b:"^HTTP/[0-9\\.]+",e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{cN:"request",b:"^[A-Z]+ (.*?) HTTP/[0-9\\.]+$",rB:true,e:"$",c:[{cN:"string",b:" ",e:" ",eB:true,eE:true}]},{cN:"attribute",b:"^\\w",e:": ",eE:true,i:"\\n|\\s|=",starts:{cN:"string",e:"$"}},{b:"\\n\\n",starts:{sL:"",eW:true}}]}});hljs.registerLanguage("java",function(b){var a="false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws";return{k:a,i:/<\//,c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"(^|\\s)@[A-Za-z]+"}],r:10},b.CLCM,b.CBLCLM,b.ASM,b.QSM,{bK:"protected public private",e:/[{;=]/,k:a,c:[{cN:"class",bK:"class interface",eW:true,i:/[:"<>]/,c:[{bK:"extends implements",r:10},b.UTM]},{b:b.UIR+"\\s*\\(",rB:true,c:[b.UTM]}]},b.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("php",function(b){var e={cN:"variable",b:"\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"};var a={cN:"preprocessor",b:/<\?(php)?|\?>/};var c={cN:"string",c:[b.BE,a],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},b.inherit(b.ASM,{i:null}),b.inherit(b.QSM,{i:null})]};var d={v:[b.BNM,b.CNM]};return{cI:true,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[b.CLCM,b.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+"},a]},{cN:"comment",b:"__halt_compiler.+?;",eW:true,k:"__halt_compiler",l:b.UIR},{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[b.BE]},a,e,{cN:"function",bK:"function",e:/[;{]/,i:"\\$|\\[|%",c:[b.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",e,b.CBLCLM,c,d]}]},{cN:"class",bK:"class interface",e:"{",i:/[:\(\$"]/,c:[{bK:"extends implements",r:10},b.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[b.UTM]},{bK:"use",e:";",c:[b.UTM]},{b:"=>"},c,d]}});hljs.registerLanguage("python",function(a){var f={cN:"prompt",b:/^(>>>|\.\.\.) /};var b={cN:"string",c:[a.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[f],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[f],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/,},{b:/(b|br)"/,e:/"/,},a.ASM,a.QSM]};var d={cN:"number",r:0,v:[{b:a.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:a.CNR+"[lLjJ]?"}]};var e={cN:"params",b:/\(/,e:/\)/,c:["self",f,d,b]};var c={e:/:/,i:/[${=;\n]/,c:[a.UTM,e]};return{k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},i:/(<\/|->|\?)/,c:[f,d,b,a.HCM,a.inherit(c,{cN:"function",bK:"def",r:10}),a.inherit(c,{cN:"class",bK:"class"}),{cN:"decorator",b:/@/,e:/$/},{b:/\b(print|exec)\(/}]}});hljs.registerLanguage("sql",function(a){return{cI:true,i:/[<>]/,c:[{cN:"operator",b:"\\b(begin|end|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant|merge)\\b(?!:)",e:";",eW:true,k:{keyword:"all partial global month current_timestamp using go revoke smallint indicator end-exec disconnect zone with character assertion to add current_user usage input local alter match collate real then rollback get read timestamp session_user not integer bit unique day minute desc insert execute like ilike|2 level decimal drop continue isolation found where constraints domain right national some module transaction relative second connect escape close system_user for deferred section cast current sqlstate allocate intersect deallocate numeric public preserve full goto initially asc no key output collation group by union session both last language constraint column of space foreign deferrable prior connection unknown action commit view or first into float year primary cascaded except restrict set references names table outer open select size are rows from prepare distinct leading create only next inner authorization schema corresponding option declare precision immediate else timezone_minute external varying translation true case exception join hour default double scroll value cursor descriptor values dec fetch procedure delete and false int is describe char as at in varchar null trailing any absolute current_time end grant privileges when cross check write current_date pad begin temporary exec time update catalog user sql date on identity timezone_hour natural whenever interval work order cascade diagnostics nchar having left call do handler load replace truncate start lock show pragma exists number trigger if before after each row merge matched database",aggregate:"count sum min max avg"},c:[{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[a.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[a.BE]},a.CNM]},a.CBLCLM,{cN:"comment",b:"--",e:"$"}]}});hljs.registerLanguage("ini",function(a){return{cI:true,i:/\S/,c:[{cN:"comment",b:";",e:"$"},{cN:"title",b:"^\\[",e:"\\]"},{cN:"setting",b:"^[a-z0-9\\[\\]_-]+[ \\t]*=[ \\t]*",e:"$",c:[{cN:"value",eW:true,k:"on off true false yes no",c:[a.QSM,a.NM],r:0}]}]}});hljs.registerLanguage("perl",function(c){var d="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when";var f={cN:"subst",b:"[$@]\\{",e:"\\}",k:d};var g={b:"->{",e:"}"};var a={cN:"variable",v:[{b:/\$\d/},{b:/[\$\%\@\*](\^\w\b|#\w+(\:\:\w+)*|{\w+}|\w+(\:\:\w*)*)/},{b:/[\$\%\@\*][^\s\w{]/,r:0}]};var e={cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5};var h=[c.BE,f,a];var b=[a,c.HCM,e,{cN:"comment",b:"^\\=\\w",e:"\\=cut",eW:true},g,{cN:"string",c:h,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[c.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[c.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+c.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[c.HCM,e,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[c.BE],r:0}]},{cN:"sub",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",r:5},{cN:"operator",b:"-\\w\\b",r:0}];f.c=b;g.c=b;return{k:d,c:b}});hljs.registerLanguage("objectivec",function(a){var d={keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign self synchronized id nonatomic super unichar IBOutlet IBAction strong weak @private @protected @public @try @property @end @throw @catch @finally @synthesize @dynamic @selector @optional @required",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController UINavigationBar UINavigationController UITabBarController UIPopoverController UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor UIFont UIApplication NSNotFound NSNotificationCenter NSNotification UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection UIInterfaceOrientation MPMoviePlayerController dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"};var c=/[a-zA-Z@][a-zA-Z0-9_]*/;var b="@interface @class @protocol @implementation";return{k:d,l:c,i:""}]},{cN:"preprocessor",b:"#",e:"$"},{cN:"class",b:"("+b.split(" ").join("|")+")\\b",e:"({|$)",k:b,l:c,c:[a.UTM]},{cN:"variable",b:"\\."+a.UIR,r:0}]}});hljs.registerLanguage("coffeescript",function(c){var b={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",reserved:"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf",built_in:"npm require console print module exports global window document"};var a="[A-Za-z$_][0-9A-Za-z$_]*";var f=c.inherit(c.TM,{b:a});var e={cN:"subst",b:/#\{/,e:/}/,k:b};var d=[c.BNM,c.inherit(c.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[c.BE]},{b:/'/,e:/'/,c:[c.BE]},{b:/"""/,e:/"""/,c:[c.BE,e]},{b:/"/,e:/"/,c:[c.BE,e]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[e,c.HCM]},{b:"//[gim]*",r:0},{b:"/\\S(\\\\.|[^\\n])*?/[gim]*(?=\\s|\\W|$)"}]},{cN:"property",b:"@"+a},{b:"`",e:"`",eB:true,eE:true,sL:"javascript"}];e.c=d;return{k:b,c:d.concat([{cN:"comment",b:"###",e:"###"},c.HCM,{cN:"function",b:"("+a+"\\s*=\\s*)?(\\(.*\\))?\\s*\\B[-=]>",e:"[-=]>",rB:true,c:[f,{cN:"params",b:"\\(",rB:true,c:[{b:/\(/,e:/\)/,k:b,c:["self"].concat(d)}]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:true,i:/[:="\[\]]/,c:[f]},f]},{cN:"attribute",b:a+":",e:":",rB:true,eE:true,r:0}])}});hljs.registerLanguage("nginx",function(c){var b={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+c.UIR}]};var a={eW:true,l:"[a-z/_]+",k:{built_in:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[c.HCM,{cN:"string",c:[c.BE,b],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{cN:"url",b:"([a-z]+):/",e:"\\s",eW:true,eE:true},{cN:"regexp",c:[c.BE,b],v:[{b:"\\s\\^",e:"\\s|{|;",rE:true},{b:"~\\*?\\s+",e:"\\s|{|;",rE:true},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},b]};return{c:[c.HCM,{b:c.UIR+"\\s",e:";|{",rB:true,c:[c.inherit(c.UTM,{starts:a})],r:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("json",function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{c:d,k:e,i:"\\S"}});hljs.registerLanguage("apache",function(a){var b={cN:"number",b:"[\\$%]\\d+"};return{cI:true,c:[a.HCM,{cN:"tag",b:""},{cN:"keyword",b:/\w+/,r:0,k:{common:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"sqbracket",b:"\\s\\[",e:"\\]$"},{cN:"cbracket",b:"[\\$%]\\{",e:"\\}",c:["self",b]},b,a.QSM]}}],i:/\S/}});hljs.registerLanguage("cpp",function(a){var b={keyword:"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex _Complex _Imaginary",built_in:"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf"};return{aliases:["c"],k:b,i:"",i:"\\n"},a.CLCM]},{cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:b,r:10,c:["self"]}]}});hljs.registerLanguage("makefile",function(a){var b={cN:"variable",b:/\$\(/,e:/\)/,c:[a.BE]};return{c:[a.HCM,{b:/^\w+\s*\W*=/,rB:true,r:0,starts:{cN:"constant",e:/\s*\W*=/,eE:true,starts:{e:/$/,r:0,c:[b],}}},{cN:"title",b:/^[\w]+:\s*$/},{cN:"phony",b:/^\.PHONY:/,e:/$/,k:".PHONY",l:/[\.\w]+/},{b:/^\t+/,e:/$/,c:[a.QSM,b]}]}}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/arta.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/arta.css new file mode 100644 index 0000000..02db86a --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/arta.css @@ -0,0 +1,160 @@ +/* +Date: 17.V.2011 +Author: pumbur +*/ + +.hljs +{ + display: block; padding: 0.5em; + background: #222; +} + +.profile .hljs-header *, +.ini .hljs-title, +.nginx .hljs-title +{ + color: #fff; +} + +.hljs-comment, +.hljs-javadoc, +.hljs-preprocessor, +.hljs-preprocessor .hljs-title, +.hljs-pragma, +.hljs-shebang, +.profile .hljs-summary, +.diff, +.hljs-pi, +.hljs-doctype, +.hljs-tag, +.hljs-template_comment, +.css .hljs-rules, +.tex .hljs-special +{ + color: #444; +} + +.hljs-string, +.hljs-symbol, +.diff .hljs-change, +.hljs-regexp, +.xml .hljs-attribute, +.smalltalk .hljs-char, +.xml .hljs-value, +.ini .hljs-value, +.clojure .hljs-attribute, +.coffeescript .hljs-attribute +{ + color: #ffcc33; +} + +.hljs-number, +.hljs-addition +{ + color: #00cc66; +} + +.hljs-built_in, +.hljs-literal, +.vhdl .hljs-typename, +.go .hljs-constant, +.go .hljs-typename, +.ini .hljs-keyword, +.lua .hljs-title, +.perl .hljs-variable, +.php .hljs-variable, +.mel .hljs-variable, +.django .hljs-variable, +.css .funtion, +.smalltalk .method, +.hljs-hexcolor, +.hljs-important, +.hljs-flow, +.hljs-inheritance, +.parser3 .hljs-variable +{ + color: #32AAEE; +} + +.hljs-keyword, +.hljs-tag .hljs-title, +.css .hljs-tag, +.css .hljs-class, +.css .hljs-id, +.css .hljs-pseudo, +.css .hljs-attr_selector, +.lisp .hljs-title, +.clojure .hljs-built_in, +.hljs-winutils, +.tex .hljs-command, +.hljs-request, +.hljs-status +{ + color: #6644aa; +} + +.hljs-title, +.ruby .hljs-constant, +.vala .hljs-constant, +.hljs-parent, +.hljs-deletion, +.hljs-template_tag, +.css .hljs-keyword, +.objectivec .hljs-class .hljs-id, +.smalltalk .hljs-class, +.lisp .hljs-keyword, +.apache .hljs-tag, +.nginx .hljs-variable, +.hljs-envvar, +.bash .hljs-variable, +.go .hljs-built_in, +.vbscript .hljs-built_in, +.lua .hljs-built_in, +.rsl .hljs-built_in, +.tail, +.avrasm .hljs-label, +.tex .hljs-formula, +.tex .hljs-formula * +{ + color: #bb1166; +} + +.hljs-yardoctag, +.hljs-phpdoc, +.profile .hljs-header, +.ini .hljs-title, +.apache .hljs-tag, +.parser3 .hljs-title +{ + font-weight: bold; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata +{ + opacity: 0.6; +} + +.hljs, +.javascript, +.css, +.xml, +.hljs-subst, +.diff .hljs-chunk, +.css .hljs-value, +.css .hljs-attribute, +.lisp .hljs-string, +.lisp .hljs-number, +.tail .hljs-params, +.hljs-container, +.haskell *, +.erlang *, +.erlang_repl * +{ + color: #aaa; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/ascetic.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/ascetic.css new file mode 100644 index 0000000..031c88a --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/ascetic.css @@ -0,0 +1,50 @@ +/* + +Original style from softwaremaniacs.org (c) Ivan Sagalaev + +*/ + +.hljs { + display: block; padding: 0.5em; + background: white; color: black; +} + +.hljs-string, +.hljs-tag .hljs-value, +.hljs-filter .hljs-argument, +.hljs-addition, +.hljs-change, +.apache .hljs-tag, +.apache .hljs-cbracket, +.nginx .hljs-built_in, +.tex .hljs-formula { + color: #888; +} + +.hljs-comment, +.hljs-template_comment, +.hljs-shebang, +.hljs-doctype, +.hljs-pi, +.hljs-javadoc, +.hljs-deletion, +.apache .hljs-sqbracket { + color: #CCC; +} + +.hljs-keyword, +.hljs-tag .hljs-title, +.ini .hljs-title, +.lisp .hljs-title, +.clojure .hljs-title, +.http .hljs-title, +.nginx .hljs-title, +.css .hljs-tag, +.hljs-winutils, +.hljs-flow, +.apache .hljs-tag, +.tex .hljs-command, +.hljs-request, +.hljs-status { + font-weight: bold; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-dune.dark.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-dune.dark.css new file mode 100644 index 0000000..2779601 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-dune.dark.css @@ -0,0 +1,93 @@ +/* Base16 Atelier Dune Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Atelier Dune Dark Comment */ +.hljs-comment, +.hljs-title { + color: #999580; +} + +/* Atelier Dune Dark Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #d73737; +} + +/* Atelier Dune Dark Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #b65611; +} + +/* Atelier Dune Dark Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #cfb017; +} + +/* Atelier Dune Dark Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #60ac39; +} + +/* Atelier Dune Dark Aqua */ +.css .hljs-hexcolor { + color: #1fad83; +} + +/* Atelier Dune Dark Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #6684e1; +} + +/* Atelier Dune Dark Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #b854d4; +} + +.hljs { + display: block; + background: #292824; + color: #a6a28c; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-dune.light.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-dune.light.css new file mode 100644 index 0000000..11c7423 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-dune.light.css @@ -0,0 +1,93 @@ +/* Base16 Atelier Dune Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Atelier Dune Light Comment */ +.hljs-comment, +.hljs-title { + color: #7d7a68; +} + +/* Atelier Dune Light Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #d73737; +} + +/* Atelier Dune Light Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #b65611; +} + +/* Atelier Dune Light Yellow */ +.hljs-ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #cfb017; +} + +/* Atelier Dune Light Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #60ac39; +} + +/* Atelier Dune Light Aqua */ +.css .hljs-hexcolor { + color: #1fad83; +} + +/* Atelier Dune Light Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #6684e1; +} + +/* Atelier Dune Light Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #b854d4; +} + +.hljs { + display: block; + background: #fefbec; + color: #6e6b5e; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-forest.dark.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-forest.dark.css new file mode 100644 index 0000000..c1f7211 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-forest.dark.css @@ -0,0 +1,93 @@ +/* Base16 Atelier Forest Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Atelier Forest Dark Comment */ +.hljs-comment, +.hljs-title { + color: #9c9491; +} + +/* Atelier Forest Dark Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #f22c40; +} + +/* Atelier Forest Dark Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #df5320; +} + +/* Atelier Forest Dark Yellow */ +.hljs-ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #d5911a; +} + +/* Atelier Forest Dark Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #5ab738; +} + +/* Atelier Forest Dark Aqua */ +.css .hljs-hexcolor { + color: #00ad9c; +} + +/* Atelier Forest Dark Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #407ee7; +} + +/* Atelier Forest Dark Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #6666ea; +} + +.hljs { + display: block; + background: #2c2421; + color: #a8a19f; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-forest.light.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-forest.light.css new file mode 100644 index 0000000..806ba73 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-forest.light.css @@ -0,0 +1,93 @@ +/* Base16 Atelier Forest Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Atelier Forest Light Comment */ +.hljs-comment, +.hljs-title { + color: #766e6b; +} + +/* Atelier Forest Light Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #f22c40; +} + +/* Atelier Forest Light Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #df5320; +} + +/* Atelier Forest Light Yellow */ +.hljs-ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #d5911a; +} + +/* Atelier Forest Light Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #5ab738; +} + +/* Atelier Forest Light Aqua */ +.css .hljs-hexcolor { + color: #00ad9c; +} + +/* Atelier Forest Light Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #407ee7; +} + +/* Atelier Forest Light Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #6666ea; +} + +.hljs { + display: block; + background: #f1efee; + color: #68615e; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-heath.dark.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-heath.dark.css new file mode 100644 index 0000000..3670669 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-heath.dark.css @@ -0,0 +1,93 @@ +/* Base16 Atelier Heath Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Atelier Heath Dark Comment */ +.hljs-comment, +.hljs-title { + color: #9e8f9e; +} + +/* Atelier Heath Dark Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #ca402b; +} + +/* Atelier Heath Dark Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #a65926; +} + +/* Atelier Heath Dark Yellow */ +.hljs-ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #bb8a35; +} + +/* Atelier Heath Dark Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #379a37; +} + +/* Atelier Heath Dark Aqua */ +.css .hljs-hexcolor { + color: #159393; +} + +/* Atelier Heath Dark Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #516aec; +} + +/* Atelier Heath Dark Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #7b59c0; +} + +.hljs { + display: block; + background: #292329; + color: #ab9bab; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-heath.light.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-heath.light.css new file mode 100644 index 0000000..e73a0b8 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-heath.light.css @@ -0,0 +1,93 @@ +/* Base16 Atelier Heath Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Atelier Heath Light Comment */ +.hljs-comment, +.hljs-title { + color: #776977; +} + +/* Atelier Heath Light Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #ca402b; +} + +/* Atelier Heath Light Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #a65926; +} + +/* Atelier Heath Light Yellow */ +.hljs-ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #bb8a35; +} + +/* Atelier Heath Light Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #379a37; +} + +/* Atelier Heath Light Aqua */ +.css .hljs-hexcolor { + color: #159393; +} + +/* Atelier Heath Light Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #516aec; +} + +/* Atelier Heath Light Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #7b59c0; +} + +.hljs { + display: block; + background: #f7f3f7; + color: #695d69; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-lakeside.dark.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-lakeside.dark.css new file mode 100644 index 0000000..8506246 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-lakeside.dark.css @@ -0,0 +1,93 @@ +/* Base16 Atelier Lakeside Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside/) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Atelier Lakeside Dark Comment */ +.hljs-comment, +.hljs-title { + color: #7195a8; +} + +/* Atelier Lakeside Dark Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #d22d72; +} + +/* Atelier Lakeside Dark Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #935c25; +} + +/* Atelier Lakeside Dark Yellow */ +.hljs-ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #8a8a0f; +} + +/* Atelier Lakeside Dark Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #568c3b; +} + +/* Atelier Lakeside Dark Aqua */ +.css .hljs-hexcolor { + color: #2d8f6f; +} + +/* Atelier Lakeside Dark Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #257fad; +} + +/* Atelier Lakeside Dark Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #5d5db1; +} + +.hljs { + display: block; + background: #1f292e; + color: #7ea2b4; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-lakeside.light.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-lakeside.light.css new file mode 100644 index 0000000..006ae6d --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-lakeside.light.css @@ -0,0 +1,93 @@ +/* Base16 Atelier Lakeside Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside/) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Atelier Lakeside Light Comment */ +.hljs-comment, +.hljs-title { + color: #5a7b8c; +} + +/* Atelier Lakeside Light Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #d22d72; +} + +/* Atelier Lakeside Light Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #935c25; +} + +/* Atelier Lakeside Light Yellow */ +.hljs-ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #8a8a0f; +} + +/* Atelier Lakeside Light Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #568c3b; +} + +/* Atelier Lakeside Light Aqua */ +.css .hljs-hexcolor { + color: #2d8f6f; +} + +/* Atelier Lakeside Light Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #257fad; +} + +/* Atelier Lakeside Light Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #5d5db1; +} + +.hljs { + display: block; + background: #ebf8ff; + color: #516d7b; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-seaside.dark.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-seaside.dark.css new file mode 100644 index 0000000..cbea6ed --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-seaside.dark.css @@ -0,0 +1,93 @@ +/* Base16 Atelier Seaside Dark - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside/) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Atelier Seaside Dark Comment */ +.hljs-comment, +.hljs-title { + color: #809980; +} + +/* Atelier Seaside Dark Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #e6193c; +} + +/* Atelier Seaside Dark Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #87711d; +} + +/* Atelier Seaside Dark Yellow */ +.hljs-ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #c3c322; +} + +/* Atelier Seaside Dark Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #29a329; +} + +/* Atelier Seaside Dark Aqua */ +.css .hljs-hexcolor { + color: #1999b3; +} + +/* Atelier Seaside Dark Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #3d62f5; +} + +/* Atelier Seaside Dark Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #ad2bee; +} + +.hljs { + display: block; + background: #242924; + color: #8ca68c; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-seaside.light.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-seaside.light.css new file mode 100644 index 0000000..159121e --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-seaside.light.css @@ -0,0 +1,93 @@ +/* Base16 Atelier Seaside Light - Theme */ +/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside/) */ +/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Atelier Seaside Light Comment */ +.hljs-comment, +.hljs-title { + color: #687d68; +} + +/* Atelier Seaside Light Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #e6193c; +} + +/* Atelier Seaside Light Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #87711d; +} + +/* Atelier Seaside Light Yellow */ +.hljs-ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #c3c322; +} + +/* Atelier Seaside Light Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #29a329; +} + +/* Atelier Seaside Light Aqua */ +.css .hljs-hexcolor { + color: #1999b3; +} + +/* Atelier Seaside Light Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #3d62f5; +} + +/* Atelier Seaside Light Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #ad2bee; +} + +.hljs { + display: block; + background: #f0fff0; + color: #5e6e5e; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/brown_paper.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/brown_paper.css new file mode 100644 index 0000000..f9541c3 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/brown_paper.css @@ -0,0 +1,105 @@ +/* + +Brown Paper style from goldblog.com.ua (c) Zaripov Yura + +*/ + +.hljs { + display: block; padding: 0.5em; + background:#b7a68e url(./brown_papersq.png); +} + +.hljs-keyword, +.hljs-literal, +.hljs-change, +.hljs-winutils, +.hljs-flow, +.lisp .hljs-title, +.clojure .hljs-built_in, +.nginx .hljs-title, +.tex .hljs-special, +.hljs-request, +.hljs-status { + color:#005599; + font-weight:bold; +} + +.hljs, +.hljs-subst, +.hljs-tag .hljs-keyword { + color: #363C69; +} + +.hljs-string, +.hljs-title, +.haskell .hljs-type, +.hljs-tag .hljs-value, +.css .hljs-rules .hljs-value, +.hljs-preprocessor, +.hljs-pragma, +.ruby .hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.ruby .hljs-class .hljs-parent, +.hljs-built_in, +.sql .hljs-aggregate, +.django .hljs-template_tag, +.django .hljs-variable, +.smalltalk .hljs-class, +.hljs-javadoc, +.ruby .hljs-string, +.django .hljs-filter .hljs-argument, +.smalltalk .hljs-localvars, +.smalltalk .hljs-array, +.hljs-attr_selector, +.hljs-pseudo, +.hljs-addition, +.hljs-stream, +.hljs-envvar, +.apache .hljs-tag, +.apache .hljs-cbracket, +.tex .hljs-number { + color: #2C009F; +} + +.hljs-comment, +.java .hljs-annotation, +.python .hljs-decorator, +.hljs-template_comment, +.hljs-pi, +.hljs-doctype, +.hljs-deletion, +.hljs-shebang, +.apache .hljs-sqbracket, +.nginx .hljs-built_in, +.tex .hljs-formula { + color: #802022; +} + +.hljs-keyword, +.hljs-literal, +.css .hljs-id, +.hljs-phpdoc, +.hljs-title, +.haskell .hljs-type, +.vbscript .hljs-built_in, +.sql .hljs-aggregate, +.rsl .hljs-built_in, +.smalltalk .hljs-class, +.diff .hljs-header, +.hljs-chunk, +.hljs-winutils, +.bash .hljs-variable, +.apache .hljs-tag, +.tex .hljs-command { + font-weight: bold; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.8; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/brown_papersq.png b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/brown_papersq.png new file mode 100644 index 0000000000000000000000000000000000000000..3813903dbf9fa7b1fb5bd11d9534c06667d9056f GIT binary patch literal 18198 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
    G3S-EN>9CM!{YB*|;6wg-K3V?)eR((z#1 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 literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/dark.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/dark.css new file mode 100644 index 0000000..e479d0a --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/dark.css @@ -0,0 +1,105 @@ +/* + +Dark style from softwaremaniacs.org (c) Ivan Sagalaev + +*/ + +.hljs { + display: block; padding: 0.5em; + background: #444; +} + +.hljs-keyword, +.hljs-literal, +.hljs-change, +.hljs-winutils, +.hljs-flow, +.lisp .hljs-title, +.clojure .hljs-built_in, +.nginx .hljs-title, +.tex .hljs-special { + color: white; +} + +.hljs, +.hljs-subst { + color: #DDD; +} + +.hljs-string, +.hljs-title, +.haskell .hljs-type, +.ini .hljs-title, +.hljs-tag .hljs-value, +.css .hljs-rules .hljs-value, +.hljs-preprocessor, +.hljs-pragma, +.ruby .hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.ruby .hljs-class .hljs-parent, +.hljs-built_in, +.sql .hljs-aggregate, +.django .hljs-template_tag, +.django .hljs-variable, +.smalltalk .hljs-class, +.hljs-javadoc, +.ruby .hljs-string, +.django .hljs-filter .hljs-argument, +.smalltalk .hljs-localvars, +.smalltalk .hljs-array, +.hljs-attr_selector, +.hljs-pseudo, +.hljs-addition, +.hljs-stream, +.hljs-envvar, +.apache .hljs-tag, +.apache .hljs-cbracket, +.tex .hljs-command, +.hljs-prompt, +.coffeescript .hljs-attribute { + color: #D88; +} + +.hljs-comment, +.java .hljs-annotation, +.python .hljs-decorator, +.hljs-template_comment, +.hljs-pi, +.hljs-doctype, +.hljs-deletion, +.hljs-shebang, +.apache .hljs-sqbracket, +.tex .hljs-formula { + color: #777; +} + +.hljs-keyword, +.hljs-literal, +.hljs-title, +.css .hljs-id, +.hljs-phpdoc, +.haskell .hljs-type, +.vbscript .hljs-built_in, +.sql .hljs-aggregate, +.rsl .hljs-built_in, +.smalltalk .hljs-class, +.diff .hljs-header, +.hljs-chunk, +.hljs-winutils, +.bash .hljs-variable, +.apache .hljs-tag, +.tex .hljs-special, +.hljs-request, +.hljs-status { + font-weight: bold; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/default.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/default.css new file mode 100644 index 0000000..3d8485b --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/default.css @@ -0,0 +1,153 @@ +/* + +Original style from softwaremaniacs.org (c) Ivan Sagalaev + +*/ + +.hljs { + display: block; padding: 0.5em; + background: #F0F0F0; +} + +.hljs, +.hljs-subst, +.hljs-tag .hljs-title, +.lisp .hljs-title, +.clojure .hljs-built_in, +.nginx .hljs-title { + color: black; +} + +.hljs-string, +.hljs-title, +.hljs-constant, +.hljs-parent, +.hljs-tag .hljs-value, +.hljs-rules .hljs-value, +.hljs-rules .hljs-value .hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.haml .hljs-symbol, +.ruby .hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.hljs-aggregate, +.hljs-template_tag, +.django .hljs-variable, +.smalltalk .hljs-class, +.hljs-addition, +.hljs-flow, +.hljs-stream, +.bash .hljs-variable, +.apache .hljs-tag, +.apache .hljs-cbracket, +.tex .hljs-command, +.tex .hljs-special, +.erlang_repl .hljs-function_or_atom, +.asciidoc .hljs-header, +.markdown .hljs-header, +.coffeescript .hljs-attribute { + color: #800; +} + +.smartquote, +.hljs-comment, +.hljs-annotation, +.hljs-template_comment, +.diff .hljs-header, +.hljs-chunk, +.asciidoc .hljs-blockquote, +.markdown .hljs-blockquote { + color: #888; +} + +.hljs-number, +.hljs-date, +.hljs-regexp, +.hljs-literal, +.hljs-hexcolor, +.smalltalk .hljs-symbol, +.smalltalk .hljs-char, +.go .hljs-constant, +.hljs-change, +.lasso .hljs-variable, +.makefile .hljs-variable, +.asciidoc .hljs-bullet, +.markdown .hljs-bullet, +.asciidoc .hljs-link_url, +.markdown .hljs-link_url { + color: #080; +} + +.hljs-label, +.hljs-javadoc, +.ruby .hljs-string, +.hljs-decorator, +.hljs-filter .hljs-argument, +.hljs-localvars, +.hljs-array, +.hljs-attr_selector, +.hljs-important, +.hljs-pseudo, +.hljs-pi, +.haml .hljs-bullet, +.hljs-doctype, +.hljs-deletion, +.hljs-envvar, +.hljs-shebang, +.apache .hljs-sqbracket, +.nginx .hljs-built_in, +.tex .hljs-formula, +.erlang_repl .hljs-reserved, +.hljs-prompt, +.asciidoc .hljs-link_label, +.markdown .hljs-link_label, +.vhdl .hljs-attribute, +.clojure .hljs-attribute, +.asciidoc .hljs-attribute, +.lasso .hljs-attribute, +.coffeescript .hljs-property, +.hljs-phony { + color: #88F +} + +.hljs-keyword, +.hljs-id, +.hljs-title, +.hljs-built_in, +.hljs-aggregate, +.css .hljs-tag, +.hljs-javadoctag, +.hljs-phpdoc, +.hljs-yardoctag, +.smalltalk .hljs-class, +.hljs-winutils, +.bash .hljs-variable, +.apache .hljs-tag, +.go .hljs-typename, +.tex .hljs-command, +.asciidoc .hljs-strong, +.markdown .hljs-strong, +.hljs-request, +.hljs-status { + font-weight: bold; +} + +.asciidoc .hljs-emphasis, +.markdown .hljs-emphasis { + font-style: italic; +} + +.nginx .hljs-built_in { + font-weight: normal; +} + +.coffeescript .javascript, +.javascript .xml, +.lasso .markup, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/docco.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/docco.css new file mode 100644 index 0000000..993fd26 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/docco.css @@ -0,0 +1,132 @@ +/* +Docco style used in http://jashkenas.github.com/docco/ converted by Simon Madine (@thingsinjars) +*/ + +.hljs { + display: block; padding: 0.5em; + color: #000; + background: #f8f8ff +} + +.hljs-comment, +.hljs-template_comment, +.diff .hljs-header, +.hljs-javadoc { + color: #408080; + font-style: italic +} + +.hljs-keyword, +.assignment, +.hljs-literal, +.css .rule .hljs-keyword, +.hljs-winutils, +.javascript .hljs-title, +.lisp .hljs-title, +.hljs-subst { + color: #954121; +} + +.hljs-number, +.hljs-hexcolor { + color: #40a070 +} + +.hljs-string, +.hljs-tag .hljs-value, +.hljs-phpdoc, +.tex .hljs-formula { + color: #219161; +} + +.hljs-title, +.hljs-id { + color: #19469D; +} +.hljs-params { + color: #00F; +} + +.javascript .hljs-title, +.lisp .hljs-title, +.hljs-subst { + font-weight: normal +} + +.hljs-class .hljs-title, +.haskell .hljs-label, +.tex .hljs-command { + color: #458; + font-weight: bold +} + +.hljs-tag, +.hljs-tag .hljs-title, +.hljs-rules .hljs-property, +.django .hljs-tag .hljs-keyword { + color: #000080; + font-weight: normal +} + +.hljs-attribute, +.hljs-variable, +.instancevar, +.lisp .hljs-body { + color: #008080 +} + +.hljs-regexp { + color: #B68 +} + +.hljs-class { + color: #458; + font-weight: bold +} + +.hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.ruby .hljs-symbol .hljs-keyword, +.ruby .hljs-symbol .keymethods, +.lisp .hljs-keyword, +.tex .hljs-special, +.input_number { + color: #990073 +} + +.builtin, +.constructor, +.hljs-built_in, +.lisp .hljs-title { + color: #0086b3 +} + +.hljs-preprocessor, +.hljs-pragma, +.hljs-pi, +.hljs-doctype, +.hljs-shebang, +.hljs-cdata { + color: #999; + font-weight: bold +} + +.hljs-deletion { + background: #fdd +} + +.hljs-addition { + background: #dfd +} + +.diff .hljs-change { + background: #0086b3 +} + +.hljs-chunk { + color: #aaa +} + +.tex .hljs-formula { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/far.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/far.css new file mode 100644 index 0000000..ecac3c9 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/far.css @@ -0,0 +1,113 @@ +/* + +FAR Style (c) MajestiC + +*/ + +.hljs { + display: block; padding: 0.5em; + background: #000080; +} + +.hljs, +.hljs-subst { + color: #0FF; +} + +.hljs-string, +.ruby .hljs-string, +.haskell .hljs-type, +.hljs-tag .hljs-value, +.css .hljs-rules .hljs-value, +.css .hljs-rules .hljs-value .hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.ruby .hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.hljs-built_in, +.sql .hljs-aggregate, +.django .hljs-template_tag, +.django .hljs-variable, +.smalltalk .hljs-class, +.hljs-addition, +.apache .hljs-tag, +.apache .hljs-cbracket, +.tex .hljs-command, +.clojure .hljs-title, +.coffeescript .hljs-attribute { + color: #FF0; +} + +.hljs-keyword, +.css .hljs-id, +.hljs-title, +.haskell .hljs-type, +.vbscript .hljs-built_in, +.sql .hljs-aggregate, +.rsl .hljs-built_in, +.smalltalk .hljs-class, +.xml .hljs-tag .hljs-title, +.hljs-winutils, +.hljs-flow, +.hljs-change, +.hljs-envvar, +.bash .hljs-variable, +.tex .hljs-special, +.clojure .hljs-built_in { + color: #FFF; +} + +.hljs-comment, +.hljs-phpdoc, +.hljs-javadoc, +.java .hljs-annotation, +.hljs-template_comment, +.hljs-deletion, +.apache .hljs-sqbracket, +.tex .hljs-formula { + color: #888; +} + +.hljs-number, +.hljs-date, +.hljs-regexp, +.hljs-literal, +.smalltalk .hljs-symbol, +.smalltalk .hljs-char, +.clojure .hljs-attribute { + color: #0F0; +} + +.python .hljs-decorator, +.django .hljs-filter .hljs-argument, +.smalltalk .hljs-localvars, +.smalltalk .hljs-array, +.hljs-attr_selector, +.hljs-pseudo, +.xml .hljs-pi, +.diff .hljs-header, +.hljs-chunk, +.hljs-shebang, +.nginx .hljs-built_in, +.hljs-prompt { + color: #008080; +} + +.hljs-keyword, +.css .hljs-id, +.hljs-title, +.haskell .hljs-type, +.vbscript .hljs-built_in, +.sql .hljs-aggregate, +.rsl .hljs-built_in, +.smalltalk .hljs-class, +.hljs-winutils, +.hljs-flow, +.apache .hljs-tag, +.nginx .hljs-built_in, +.tex .hljs-command, +.tex .hljs-special, +.hljs-request, +.hljs-status { + font-weight: bold; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/foundation.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/foundation.css new file mode 100644 index 0000000..bc8d4df --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/foundation.css @@ -0,0 +1,133 @@ +/* +Description: Foundation 4 docs style for highlight.js +Author: Dan Allen +Website: http://foundation.zurb.com/docs/ +Version: 1.0 +Date: 2013-04-02 +*/ + +.hljs { + display: block; padding: 0.5em; + background: #eee; +} + +.hljs-header, +.hljs-decorator, +.hljs-annotation { + color: #000077; +} + +.hljs-horizontal_rule, +.hljs-link_url, +.hljs-emphasis, +.hljs-attribute { + color: #070; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-link_label, +.hljs-strong, +.hljs-value, +.hljs-string, +.scss .hljs-value .hljs-string { + color: #d14; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-blockquote, +.hljs-comment { + color: #998; + font-style: italic; +} + +.asciidoc .hljs-title, +.hljs-function .hljs-title { + color: #900; +} + +.hljs-class { + color: #458; +} + +.hljs-id, +.hljs-pseudo, +.hljs-constant, +.hljs-hexcolor { + color: teal; +} + +.hljs-variable { + color: #336699; +} + +.hljs-bullet, +.hljs-javadoc { + color: #997700; +} + +.hljs-pi, +.hljs-doctype { + color: #3344bb; +} + +.hljs-code, +.hljs-number { + color: #099; +} + +.hljs-important { + color: #f00; +} + +.smartquote, +.hljs-label { + color: #970; +} + +.hljs-preprocessor, +.hljs-pragma { + color: #579; +} + +.hljs-reserved, +.hljs-keyword, +.scss .hljs-value { + color: #000; +} + +.hljs-regexp { + background-color: #fff0ff; + color: #880088; +} + +.hljs-symbol { + color: #990073; +} + +.hljs-symbol .hljs-string { + color: #a60; +} + +.hljs-tag { + color: #007700; +} + +.hljs-at_rule, +.hljs-at_rule .hljs-keyword { + color: #088; +} + +.hljs-at_rule .hljs-preprocessor { + color: #808; +} + +.scss .hljs-tag, +.scss .hljs-attribute { + color: #339; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/github.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/github.css new file mode 100644 index 0000000..71967a3 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/github.css @@ -0,0 +1,125 @@ +/* + +github.com style (c) Vasily Polovnyov + +*/ + +.hljs { + display: block; padding: 0.5em; + color: #333; + background: #f8f8f8 +} + +.hljs-comment, +.hljs-template_comment, +.diff .hljs-header, +.hljs-javadoc { + color: #998; + font-style: italic +} + +.hljs-keyword, +.css .rule .hljs-keyword, +.hljs-winutils, +.javascript .hljs-title, +.nginx .hljs-title, +.hljs-subst, +.hljs-request, +.hljs-status { + color: #333; + font-weight: bold +} + +.hljs-number, +.hljs-hexcolor, +.ruby .hljs-constant { + color: #099; +} + +.hljs-string, +.hljs-tag .hljs-value, +.hljs-phpdoc, +.tex .hljs-formula { + color: #d14 +} + +.hljs-title, +.hljs-id, +.coffeescript .hljs-params, +.scss .hljs-preprocessor { + color: #900; + font-weight: bold +} + +.javascript .hljs-title, +.lisp .hljs-title, +.clojure .hljs-title, +.hljs-subst { + font-weight: normal +} + +.hljs-class .hljs-title, +.haskell .hljs-type, +.vhdl .hljs-literal, +.tex .hljs-command { + color: #458; + font-weight: bold +} + +.hljs-tag, +.hljs-tag .hljs-title, +.hljs-rules .hljs-property, +.django .hljs-tag .hljs-keyword { + color: #000080; + font-weight: normal +} + +.hljs-attribute, +.hljs-variable, +.lisp .hljs-body { + color: #008080 +} + +.hljs-regexp { + color: #009926 +} + +.hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.lisp .hljs-keyword, +.tex .hljs-special, +.hljs-prompt { + color: #990073 +} + +.hljs-built_in, +.lisp .hljs-title, +.clojure .hljs-built_in { + color: #0086b3 +} + +.hljs-preprocessor, +.hljs-pragma, +.hljs-pi, +.hljs-doctype, +.hljs-shebang, +.hljs-cdata { + color: #999; + font-weight: bold +} + +.hljs-deletion { + background: #fdd +} + +.hljs-addition { + background: #dfd +} + +.diff .hljs-change { + background: #0086b3 +} + +.hljs-chunk { + color: #aaa +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/googlecode.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/googlecode.css new file mode 100644 index 0000000..45b8b3b --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/googlecode.css @@ -0,0 +1,147 @@ +/* + +Google Code style (c) Aahan Krish + +*/ + +.hljs { + display: block; padding: 0.5em; + background: white; color: black; +} + +.hljs-comment, +.hljs-template_comment, +.hljs-javadoc, +.hljs-comment * { + color: #800; +} + +.hljs-keyword, +.method, +.hljs-list .hljs-title, +.clojure .hljs-built_in, +.nginx .hljs-title, +.hljs-tag .hljs-title, +.setting .hljs-value, +.hljs-winutils, +.tex .hljs-command, +.http .hljs-title, +.hljs-request, +.hljs-status { + color: #008; +} + +.hljs-envvar, +.tex .hljs-special { + color: #660; +} + +.hljs-string, +.hljs-tag .hljs-value, +.hljs-cdata, +.hljs-filter .hljs-argument, +.hljs-attr_selector, +.apache .hljs-cbracket, +.hljs-date, +.hljs-regexp, +.coffeescript .hljs-attribute { + color: #080; +} + +.hljs-sub .hljs-identifier, +.hljs-pi, +.hljs-tag, +.hljs-tag .hljs-keyword, +.hljs-decorator, +.ini .hljs-title, +.hljs-shebang, +.hljs-prompt, +.hljs-hexcolor, +.hljs-rules .hljs-value, +.css .hljs-value .hljs-number, +.hljs-literal, +.hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.hljs-number, +.css .hljs-function, +.clojure .hljs-attribute { + color: #066; +} + +.hljs-class .hljs-title, +.haskell .hljs-type, +.smalltalk .hljs-class, +.hljs-javadoctag, +.hljs-yardoctag, +.hljs-phpdoc, +.hljs-typename, +.hljs-tag .hljs-attribute, +.hljs-doctype, +.hljs-class .hljs-id, +.hljs-built_in, +.setting, +.hljs-params, +.hljs-variable, +.clojure .hljs-title { + color: #606; +} + +.css .hljs-tag, +.hljs-rules .hljs-property, +.hljs-pseudo, +.hljs-subst { + color: #000; +} + +.css .hljs-class, +.css .hljs-id { + color: #9B703F; +} + +.hljs-value .hljs-important { + color: #ff7700; + font-weight: bold; +} + +.hljs-rules .hljs-keyword { + color: #C5AF75; +} + +.hljs-annotation, +.apache .hljs-sqbracket, +.nginx .hljs-built_in { + color: #9B859D; +} + +.hljs-preprocessor, +.hljs-preprocessor *, +.hljs-pragma { + color: #444; +} + +.tex .hljs-formula { + background-color: #EEE; + font-style: italic; +} + +.diff .hljs-header, +.hljs-chunk { + color: #808080; + font-weight: bold; +} + +.diff .hljs-change { + background-color: #BCCFF9; +} + +.hljs-addition { + background-color: #BAEEBA; +} + +.hljs-deletion { + background-color: #FFC8BD; +} + +.hljs-comment .hljs-yardoctag { + font-weight: bold; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/idea.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/idea.css new file mode 100644 index 0000000..77352f4 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/idea.css @@ -0,0 +1,122 @@ +/* + +Intellij Idea-like styling (c) Vasily Polovnyov + +*/ + +.hljs { + display: block; padding: 0.5em; + color: #000; + background: #fff; +} + +.hljs-subst, +.hljs-title { + font-weight: normal; + color: #000; +} + +.hljs-comment, +.hljs-template_comment, +.hljs-javadoc, +.diff .hljs-header { + color: #808080; + font-style: italic; +} + +.hljs-annotation, +.hljs-decorator, +.hljs-preprocessor, +.hljs-pragma, +.hljs-doctype, +.hljs-pi, +.hljs-chunk, +.hljs-shebang, +.apache .hljs-cbracket, +.hljs-prompt, +.http .hljs-title { + color: #808000; +} + +.hljs-tag, +.hljs-pi { + background: #efefef; +} + +.hljs-tag .hljs-title, +.hljs-id, +.hljs-attr_selector, +.hljs-pseudo, +.hljs-literal, +.hljs-keyword, +.hljs-hexcolor, +.css .hljs-function, +.ini .hljs-title, +.css .hljs-class, +.hljs-list .hljs-title, +.clojure .hljs-title, +.nginx .hljs-title, +.tex .hljs-command, +.hljs-request, +.hljs-status { + font-weight: bold; + color: #000080; +} + +.hljs-attribute, +.hljs-rules .hljs-keyword, +.hljs-number, +.hljs-date, +.hljs-regexp, +.tex .hljs-special { + font-weight: bold; + color: #0000ff; +} + +.hljs-number, +.hljs-regexp { + font-weight: normal; +} + +.hljs-string, +.hljs-value, +.hljs-filter .hljs-argument, +.css .hljs-function .hljs-params, +.apache .hljs-tag { + color: #008000; + font-weight: bold; +} + +.hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.hljs-char, +.tex .hljs-formula { + color: #000; + background: #d0eded; + font-style: italic; +} + +.hljs-phpdoc, +.hljs-yardoctag, +.hljs-javadoctag { + text-decoration: underline; +} + +.hljs-variable, +.hljs-envvar, +.apache .hljs-sqbracket, +.nginx .hljs-built_in { + color: #660e7a; +} + +.hljs-addition { + background: #baeeba; +} + +.hljs-deletion { + background: #ffc8bd; +} + +.diff .hljs-change { + background: #bccff9; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/ir_black.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/ir_black.css new file mode 100644 index 0000000..cc64ef5 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/ir_black.css @@ -0,0 +1,105 @@ +/* + IR_Black style (c) Vasily Mikhailitchenko +*/ + +.hljs { + display: block; padding: 0.5em; + background: #000; color: #f8f8f8; +} + +.hljs-shebang, +.hljs-comment, +.hljs-template_comment, +.hljs-javadoc { + color: #7c7c7c; +} + +.hljs-keyword, +.hljs-tag, +.tex .hljs-command, +.hljs-request, +.hljs-status, +.clojure .hljs-attribute { + color: #96CBFE; +} + +.hljs-sub .hljs-keyword, +.method, +.hljs-list .hljs-title, +.nginx .hljs-title { + color: #FFFFB6; +} + +.hljs-string, +.hljs-tag .hljs-value, +.hljs-cdata, +.hljs-filter .hljs-argument, +.hljs-attr_selector, +.apache .hljs-cbracket, +.hljs-date, +.coffeescript .hljs-attribute { + color: #A8FF60; +} + +.hljs-subst { + color: #DAEFA3; +} + +.hljs-regexp { + color: #E9C062; +} + +.hljs-title, +.hljs-sub .hljs-identifier, +.hljs-pi, +.hljs-decorator, +.tex .hljs-special, +.haskell .hljs-type, +.hljs-constant, +.smalltalk .hljs-class, +.hljs-javadoctag, +.hljs-yardoctag, +.hljs-phpdoc, +.nginx .hljs-built_in { + color: #FFFFB6; +} + +.hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.hljs-number, +.hljs-variable, +.vbscript, +.hljs-literal { + color: #C6C5FE; +} + +.css .hljs-tag { + color: #96CBFE; +} + +.css .hljs-rules .hljs-property, +.css .hljs-id { + color: #FFFFB6; +} + +.css .hljs-class { + color: #FFF; +} + +.hljs-hexcolor { + color: #C6C5FE; +} + +.hljs-number { + color:#FF73FD; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.7; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/magula.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/magula.css new file mode 100644 index 0000000..cafe3d3 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/magula.css @@ -0,0 +1,123 @@ +/* +Description: Magula style for highligh.js +Author: Ruslan Keba +Website: http://rukeba.com/ +Version: 1.0 +Date: 2009-01-03 +Music: Aphex Twin / Xtal +*/ + +.hljs { + display: block; padding: 0.5em; + background-color: #f4f4f4; +} + +.hljs, +.hljs-subst, +.lisp .hljs-title, +.clojure .hljs-built_in { + color: black; +} + +.hljs-string, +.hljs-title, +.hljs-parent, +.hljs-tag .hljs-value, +.hljs-rules .hljs-value, +.hljs-rules .hljs-value .hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.ruby .hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.hljs-aggregate, +.hljs-template_tag, +.django .hljs-variable, +.smalltalk .hljs-class, +.hljs-addition, +.hljs-flow, +.hljs-stream, +.bash .hljs-variable, +.apache .hljs-cbracket, +.coffeescript .hljs-attribute { + color: #050; +} + +.hljs-comment, +.hljs-annotation, +.hljs-template_comment, +.diff .hljs-header, +.hljs-chunk { + color: #777; +} + +.hljs-number, +.hljs-date, +.hljs-regexp, +.hljs-literal, +.smalltalk .hljs-symbol, +.smalltalk .hljs-char, +.hljs-change, +.tex .hljs-special { + color: #800; +} + +.hljs-label, +.hljs-javadoc, +.ruby .hljs-string, +.hljs-decorator, +.hljs-filter .hljs-argument, +.hljs-localvars, +.hljs-array, +.hljs-attr_selector, +.hljs-pseudo, +.hljs-pi, +.hljs-doctype, +.hljs-deletion, +.hljs-envvar, +.hljs-shebang, +.apache .hljs-sqbracket, +.nginx .hljs-built_in, +.tex .hljs-formula, +.hljs-prompt, +.clojure .hljs-attribute { + color: #00e; +} + +.hljs-keyword, +.hljs-id, +.hljs-phpdoc, +.hljs-title, +.hljs-built_in, +.hljs-aggregate, +.smalltalk .hljs-class, +.hljs-winutils, +.bash .hljs-variable, +.apache .hljs-tag, +.xml .hljs-tag, +.tex .hljs-command, +.hljs-request, +.hljs-status { + font-weight: bold; + color: navy; +} + +.nginx .hljs-built_in { + font-weight: normal; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} + +/* --- */ +.apache .hljs-tag { + font-weight: bold; + color: blue; +} + diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/mono-blue.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/mono-blue.css new file mode 100644 index 0000000..4152d82 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/mono-blue.css @@ -0,0 +1,62 @@ +/* + Five-color theme from a single blue hue. +*/ +.hljs { + display: block; padding: 0.5em; + background: #EAEEF3; color: #00193A; +} + +.hljs-keyword, +.hljs-title, +.hljs-important, +.hljs-request, +.hljs-header, +.hljs-javadoctag { + font-weight: bold; +} + +.hljs-comment, +.hljs-chunk, +.hljs-template_comment { + color: #738191; +} + +.hljs-string, +.hljs-title, +.hljs-parent, +.hljs-built_in, +.hljs-literal, +.hljs-filename, +.hljs-value, +.hljs-addition, +.hljs-tag, +.hljs-argument, +.hljs-link_label, +.hljs-blockquote, +.hljs-header { + color: #0048AB; +} + +.hljs-decorator, +.hljs-prompt, +.hljs-yardoctag, +.hljs-subst, +.hljs-symbol, +.hljs-doctype, +.hljs-regexp, +.hljs-preprocessor, +.hljs-pragma, +.hljs-pi, +.hljs-attribute, +.hljs-attr_selector, +.hljs-javadoc, +.hljs-xmlDocTag, +.hljs-deletion, +.hljs-shebang, +.hljs-string .hljs-variable, +.hljs-link_url, +.hljs-bullet, +.hljs-sqbracket, +.hljs-phony { + color: #4C81C9; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/monokai.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/monokai.css new file mode 100644 index 0000000..4e49bef --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/monokai.css @@ -0,0 +1,127 @@ +/* +Monokai style - ported by Luigi Maselli - http://grigio.org +*/ + +.hljs { + display: block; padding: 0.5em; + background: #272822; +} + +.hljs-tag, +.hljs-tag .hljs-title, +.hljs-keyword, +.hljs-literal, +.hljs-strong, +.hljs-change, +.hljs-winutils, +.hljs-flow, +.lisp .hljs-title, +.clojure .hljs-built_in, +.nginx .hljs-title, +.tex .hljs-special { + color: #F92672; +} + +.hljs { + color: #DDD; +} + +.hljs .hljs-constant, +.asciidoc .hljs-code { + color: #66D9EF; +} + +.hljs-code, +.hljs-class .hljs-title, +.hljs-header { + color: white; +} + +.hljs-link_label, +.hljs-attribute, +.hljs-symbol, +.hljs-symbol .hljs-string, +.hljs-value, +.hljs-regexp { + color: #BF79DB; +} + +.hljs-link_url, +.hljs-tag .hljs-value, +.hljs-string, +.hljs-bullet, +.hljs-subst, +.hljs-title, +.hljs-emphasis, +.haskell .hljs-type, +.hljs-preprocessor, +.hljs-pragma, +.ruby .hljs-class .hljs-parent, +.hljs-built_in, +.sql .hljs-aggregate, +.django .hljs-template_tag, +.django .hljs-variable, +.smalltalk .hljs-class, +.hljs-javadoc, +.django .hljs-filter .hljs-argument, +.smalltalk .hljs-localvars, +.smalltalk .hljs-array, +.hljs-attr_selector, +.hljs-pseudo, +.hljs-addition, +.hljs-stream, +.hljs-envvar, +.apache .hljs-tag, +.apache .hljs-cbracket, +.tex .hljs-command, +.hljs-prompt { + color: #A6E22E; +} + +.hljs-comment, +.java .hljs-annotation, +.smartquote, +.hljs-blockquote, +.hljs-horizontal_rule, +.python .hljs-decorator, +.hljs-template_comment, +.hljs-pi, +.hljs-doctype, +.hljs-deletion, +.hljs-shebang, +.apache .hljs-sqbracket, +.tex .hljs-formula { + color: #75715E; +} + +.hljs-keyword, +.hljs-literal, +.css .hljs-id, +.hljs-phpdoc, +.hljs-title, +.hljs-header, +.haskell .hljs-type, +.vbscript .hljs-built_in, +.sql .hljs-aggregate, +.rsl .hljs-built_in, +.smalltalk .hljs-class, +.diff .hljs-header, +.hljs-chunk, +.hljs-winutils, +.bash .hljs-variable, +.apache .hljs-tag, +.tex .hljs-special, +.hljs-request, +.hljs-status { + font-weight: bold; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/monokai_sublime.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/monokai_sublime.css new file mode 100644 index 0000000..7b0eb2e --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/monokai_sublime.css @@ -0,0 +1,149 @@ +/* + +Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/ + +*/ + +.hljs { + display: block; + padding: 0.5em; + background: #23241f; +} + +.hljs, +.hljs-tag, +.css .hljs-rules, +.css .hljs-value, +.css .hljs-function +.hljs-preprocessor, +.hljs-pragma { + color: #f8f8f2; +} + +.hljs-strongemphasis, +.hljs-strong, +.hljs-emphasis { + color: #a8a8a2; +} + +.hljs-bullet, +.hljs-blockquote, +.hljs-horizontal_rule, +.hljs-number, +.hljs-regexp, +.alias .hljs-keyword, +.hljs-literal, +.hljs-hexcolor { + color: #ae81ff; +} + +.hljs-tag .hljs-value, +.hljs-code, +.hljs-title, +.css .hljs-class, +.hljs-class .hljs-title:last-child { + color: #a6e22e; +} + +.hljs-link_url { + font-size: 80%; +} + +.hljs-strong, +.hljs-strongemphasis { + font-weight: bold; +} + +.hljs-emphasis, +.hljs-strongemphasis, +.hljs-class .hljs-title:last-child { + font-style: italic; +} + +.hljs-keyword, +.hljs-function, +.hljs-change, +.hljs-winutils, +.hljs-flow, +.lisp .hljs-title, +.clojure .hljs-built_in, +.nginx .hljs-title, +.tex .hljs-special, +.hljs-header, +.hljs-attribute, +.hljs-symbol, +.hljs-symbol .hljs-string, +.hljs-tag .hljs-title, +.hljs-value, +.alias .hljs-keyword:first-child, +.css .hljs-tag, +.css .unit, +.css .hljs-important { + color: #F92672; +} + +.hljs-function .hljs-keyword, +.hljs-class .hljs-keyword:first-child, +.hljs-constant, +.css .hljs-attribute { + color: #66d9ef; +} + +.hljs-variable, +.hljs-params, +.hljs-class .hljs-title { + color: #f8f8f2; +} + +.hljs-string, +.css .hljs-id, +.hljs-subst, +.haskell .hljs-type, +.ruby .hljs-class .hljs-parent, +.hljs-built_in, +.sql .hljs-aggregate, +.django .hljs-template_tag, +.django .hljs-variable, +.smalltalk .hljs-class, +.django .hljs-filter .hljs-argument, +.smalltalk .hljs-localvars, +.smalltalk .hljs-array, +.hljs-attr_selector, +.hljs-pseudo, +.hljs-addition, +.hljs-stream, +.hljs-envvar, +.apache .hljs-tag, +.apache .hljs-cbracket, +.tex .hljs-command, +.hljs-prompt, +.hljs-link_label, +.hljs-link_url { + color: #e6db74; +} + +.hljs-comment, +.hljs-javadoc, +.java .hljs-annotation, +.python .hljs-decorator, +.hljs-template_comment, +.hljs-pi, +.hljs-doctype, +.hljs-deletion, +.hljs-shebang, +.apache .hljs-sqbracket, +.tex .hljs-formula { + color: #75715e; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata, +.xml .php, +.php .xml { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/obsidian.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/obsidian.css new file mode 100644 index 0000000..1174e4c --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/obsidian.css @@ -0,0 +1,154 @@ +/** + * Obsidian style + * ported by Alexander Marenin (http://github.com/ioncreature) + */ + +.hljs { + display: block; padding: 0.5em; + background: #282B2E; +} + +.hljs-keyword, +.hljs-literal, +.hljs-change, +.hljs-winutils, +.hljs-flow, +.lisp .hljs-title, +.clojure .hljs-built_in, +.nginx .hljs-title, +.css .hljs-id, +.tex .hljs-special { + color: #93C763; +} + +.hljs-number { + color: #FFCD22; +} + +.hljs { + color: #E0E2E4; +} + +.css .hljs-tag, +.css .hljs-pseudo { + color: #D0D2B5; +} + +.hljs-attribute, +.hljs .hljs-constant { + color: #668BB0; +} + +.xml .hljs-attribute { + color: #B3B689; +} + +.xml .hljs-tag .hljs-value { + color: #E8E2B7; +} + +.hljs-code, +.hljs-class .hljs-title, +.hljs-header { + color: white; +} + +.hljs-class, +.hljs-hexcolor { + color: #93C763; +} + +.hljs-regexp { + color: #D39745; +} + +.hljs-at_rule, +.hljs-at_rule .hljs-keyword { + color: #A082BD; +} + +.hljs-doctype { + color: #557182; +} + +.hljs-link_url, +.hljs-tag, +.hljs-tag .hljs-title, +.hljs-bullet, +.hljs-subst, +.hljs-emphasis, +.haskell .hljs-type, +.hljs-preprocessor, +.hljs-pragma, +.ruby .hljs-class .hljs-parent, +.hljs-built_in, +.sql .hljs-aggregate, +.django .hljs-template_tag, +.django .hljs-variable, +.smalltalk .hljs-class, +.hljs-javadoc, +.django .hljs-filter .hljs-argument, +.smalltalk .hljs-localvars, +.smalltalk .hljs-array, +.hljs-attr_selector, +.hljs-pseudo, +.hljs-addition, +.hljs-stream, +.hljs-envvar, +.apache .hljs-tag, +.apache .hljs-cbracket, +.tex .hljs-command, +.hljs-prompt { + color: #8CBBAD; +} + +.hljs-string { + color: #EC7600; +} + +.hljs-comment, +.java .hljs-annotation, +.hljs-blockquote, +.hljs-horizontal_rule, +.python .hljs-decorator, +.hljs-template_comment, +.hljs-pi, +.hljs-deletion, +.hljs-shebang, +.apache .hljs-sqbracket, +.tex .hljs-formula { + color: #818E96; +} + +.hljs-keyword, +.hljs-literal, +.css .hljs-id, +.hljs-phpdoc, +.hljs-title, +.hljs-header, +.haskell .hljs-type, +.vbscript .hljs-built_in, +.sql .hljs-aggregate, +.rsl .hljs-built_in, +.smalltalk .hljs-class, +.diff .hljs-header, +.hljs-chunk, +.hljs-winutils, +.bash .hljs-variable, +.apache .hljs-tag, +.tex .hljs-special, +.hljs-request, +.hljs-at_rule .hljs-keyword, +.hljs-status { + font-weight: bold; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/paraiso.dark.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/paraiso.dark.css new file mode 100644 index 0000000..bbbccdd --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/paraiso.dark.css @@ -0,0 +1,93 @@ +/* + Paraíso (dark) + Created by Jan T. Sott (http://github.com/idleberg) + Inspired by the art of Rubens LP (http://www.rubenslp.com.br) +*/ + +/* Paraíso Comment */ +.hljs-comment, +.hljs-title { + color: #8d8687; +} + +/* Paraíso Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #ef6155; +} + +/* Paraíso Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #f99b15; +} + +/* Paraíso Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #fec418; +} + +/* Paraíso Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #48b685; +} + +/* Paraíso Aqua */ +.css .hljs-hexcolor { + color: #5bc4bf; +} + +/* Paraíso Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #06b6ef; +} + +/* Paraíso Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #815ba4; +} + +.hljs { + display: block; + background: #2f1e2e; + color: #a39e9b; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/paraiso.light.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/paraiso.light.css new file mode 100644 index 0000000..494fcb4 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/paraiso.light.css @@ -0,0 +1,93 @@ +/* + Paraíso (light) + Created by Jan T. Sott (http://github.com/idleberg) + Inspired by the art of Rubens LP (http://www.rubenslp.com.br) +*/ + +/* Paraíso Comment */ +.hljs-comment, +.hljs-title { + color: #776e71; +} + +/* Paraíso Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #ef6155; +} + +/* Paraíso Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #f99b15; +} + +/* Paraíso Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #fec418; +} + +/* Paraíso Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #48b685; +} + +/* Paraíso Aqua */ +.css .hljs-hexcolor { + color: #5bc4bf; +} + +/* Paraíso Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #06b6ef; +} + +/* Paraíso Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #815ba4; +} + +.hljs { + display: block; + background: #e7e9db; + color: #4f424c; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/pojoaque.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/pojoaque.css new file mode 100644 index 0000000..6ee925d --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/pojoaque.css @@ -0,0 +1,106 @@ +/* + +Pojoaque Style by Jason Tate +http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html +Based on Solarized Style from http://ethanschoonover.com/solarized + +*/ + +.hljs { + display: block; padding: 0.5em; + color: #DCCF8F; + background: url(./pojoaque.jpg) repeat scroll left top #181914; +} + +.hljs-comment, +.hljs-template_comment, +.diff .hljs-header, +.hljs-doctype, +.lisp .hljs-string, +.hljs-javadoc { + color: #586e75; + font-style: italic; +} + +.hljs-keyword, +.css .rule .hljs-keyword, +.hljs-winutils, +.javascript .hljs-title, +.method, +.hljs-addition, +.css .hljs-tag, +.clojure .hljs-title, +.nginx .hljs-title { + color: #B64926; +} + +.hljs-number, +.hljs-command, +.hljs-string, +.hljs-tag .hljs-value, +.hljs-phpdoc, +.tex .hljs-formula, +.hljs-regexp, +.hljs-hexcolor { + color: #468966; +} + +.hljs-title, +.hljs-localvars, +.hljs-function .hljs-title, +.hljs-chunk, +.hljs-decorator, +.hljs-built_in, +.lisp .hljs-title, +.clojure .hljs-built_in, +.hljs-identifier, +.hljs-id { + color: #FFB03B; +} + +.hljs-attribute, +.hljs-variable, +.lisp .hljs-body, +.smalltalk .hljs-number, +.hljs-constant, +.hljs-class .hljs-title, +.hljs-parent, +.haskell .hljs-type { + color: #b58900; +} + +.css .hljs-attribute { + color: #b89859; +} + +.css .hljs-number, +.css .hljs-hexcolor { + color: #DCCF8F; +} + +.css .hljs-class { + color: #d3a60c; +} + +.hljs-preprocessor, +.hljs-pragma, +.hljs-pi, +.hljs-shebang, +.hljs-symbol, +.hljs-symbol .hljs-string, +.diff .hljs-change, +.hljs-special, +.hljs-attr_selector, +.hljs-important, +.hljs-subst, +.hljs-cdata { + color: #cb4b16; +} + +.hljs-deletion { + color: #dc322f; +} + +.tex .hljs-formula { + background: #073642; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/pojoaque.jpg b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/pojoaque.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c07d4ab40b6d77e90ff69f0012bcd33b21d31c3 GIT binary patch literal 1186 zcmZXSe^8Tk9LK-kXFs3)f@f?)Cddzw3v4wdZyXQ;4x3=;Ja*N#%n9ik!UGmt9H3k0 zJST|5jOc(ID$FQt3C?jQZBws#kXolO1lg9Pba9BB=Q+UEBX!nY@6Uhl&+ofe$Q$y5 z@ci`~)&qzDP(lOiQ5p?p z(`j^e7!yUAVHk%K#^GQXn?s0=VLYCI$HRoe=xCuZ>A6A3@sxEP#XqNFpIb=0)KQ#Nss_tD17;m4@$JKL;LR|K|QF3f%!L5+s(9Ft8SQ zG|~pGpEGFW5Z|OA)-O@mNHy-g@7m8JTf?kl@vUKBGmw)Y*9sDRNr3PN!IKefWaydTe1D zjzpyzPnD3}hBNaS4aFX7=0&~I*Hu7#4au@qVBglH#-m;QFOx_`=j z{EqRY#Eh*yoWP^pa4H>8GH{rO?!_+xwL0(k4yL^D%^nBkJ*UI;Lx;ped8d|f*S_s@ z3~ilcRC(&NT#9Gn#UD;o^EYSMXDMf%XcUi3>;WXXD-QX3P9wMyP7eA&RS{)h5{??W3^Rq=goFJ>?lA~J- zdYe>!xvYLW*fPT0RK7wsJRg^?x#W1*GP9_f`6t>QD_X>0d!owyN>nO2?U5}|3?hX_UZYT@^>S!9eB~bZ9U`q;`U)@L670o1g z`Hd}h<_WRvUc|n*%v4Hbb-4tJD40iyF^q%g*&!6>hkYDvi-{Uc4yTM zzcthN4Z{ka!+F_KzYV#yWi;c^X^q6g`pD8cp?$Kl?hCz0s^a|mH%P!CF%*<6k^~i` zT5Mi-t5-frUcHkk^Qh}+N)Kz1&Bi95`oNc|quI>tUi~BY>xcF9(%tv2i{G6kE9*q~ qCoAGl20`)w0rdgp9H%Q=M5|p`hOhFz6$I%Y&ncY8>c?7PXyh+SL&XXJ literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/railscasts.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/railscasts.css new file mode 100644 index 0000000..6a38064 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/railscasts.css @@ -0,0 +1,182 @@ +/* + +Railscasts-like style (c) Visoft, Inc. (Damien White) + +*/ + +.hljs { + display: block; + padding: 0.5em; + background: #232323; + color: #E6E1DC; +} + +.hljs-comment, +.hljs-template_comment, +.hljs-javadoc, +.hljs-shebang { + color: #BC9458; + font-style: italic; +} + +.hljs-keyword, +.ruby .hljs-function .hljs-keyword, +.hljs-request, +.hljs-status, +.nginx .hljs-title, +.method, +.hljs-list .hljs-title { + color: #C26230; +} + +.hljs-string, +.hljs-number, +.hljs-regexp, +.hljs-tag .hljs-value, +.hljs-cdata, +.hljs-filter .hljs-argument, +.hljs-attr_selector, +.apache .hljs-cbracket, +.hljs-date, +.tex .hljs-command, +.markdown .hljs-link_label { + color: #A5C261; +} + +.hljs-subst { + color: #519F50; +} + +.hljs-tag, +.hljs-tag .hljs-keyword, +.hljs-tag .hljs-title, +.hljs-doctype, +.hljs-sub .hljs-identifier, +.hljs-pi, +.input_number { + color: #E8BF6A; +} + +.hljs-identifier { + color: #D0D0FF; +} + +.hljs-class .hljs-title, +.haskell .hljs-type, +.smalltalk .hljs-class, +.hljs-javadoctag, +.hljs-yardoctag, +.hljs-phpdoc { + text-decoration: none; +} + +.hljs-constant { + color: #DA4939; +} + + +.hljs-symbol, +.hljs-built_in, +.ruby .hljs-symbol .hljs-string, +.ruby .hljs-symbol .hljs-identifier, +.markdown .hljs-link_url, +.hljs-attribute { + color: #6D9CBE; +} + +.markdown .hljs-link_url { + text-decoration: underline; +} + + + +.hljs-params, +.hljs-variable, +.clojure .hljs-attribute { + color: #D0D0FF; +} + +.css .hljs-tag, +.hljs-rules .hljs-property, +.hljs-pseudo, +.tex .hljs-special { + color: #CDA869; +} + +.css .hljs-class { + color: #9B703F; +} + +.hljs-rules .hljs-keyword { + color: #C5AF75; +} + +.hljs-rules .hljs-value { + color: #CF6A4C; +} + +.css .hljs-id { + color: #8B98AB; +} + +.hljs-annotation, +.apache .hljs-sqbracket, +.nginx .hljs-built_in { + color: #9B859D; +} + +.hljs-preprocessor, +.hljs-preprocessor *, +.hljs-pragma { + color: #8996A8 !important; +} + +.hljs-hexcolor, +.css .hljs-value .hljs-number { + color: #A5C261; +} + +.hljs-title, +.hljs-decorator, +.css .hljs-function { + color: #FFC66D; +} + +.diff .hljs-header, +.hljs-chunk { + background-color: #2F33AB; + color: #E6E1DC; + display: inline-block; + width: 100%; +} + +.diff .hljs-change { + background-color: #4A410D; + color: #F8F8F8; + display: inline-block; + width: 100%; +} + +.hljs-addition { + background-color: #144212; + color: #E6E1DC; + display: inline-block; + width: 100%; +} + +.hljs-deletion { + background-color: #600; + color: #E6E1DC; + display: inline-block; + width: 100%; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.7; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/rainbow.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/rainbow.css new file mode 100644 index 0000000..d9ffef6 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/rainbow.css @@ -0,0 +1,112 @@ +/* + +Style with support for rainbow parens + +*/ + +.hljs { + display: block; padding: 0.5em; + background: #474949; color: #D1D9E1; +} + + +.hljs-body, +.hljs-collection { + color: #D1D9E1; +} + +.hljs-comment, +.hljs-template_comment, +.diff .hljs-header, +.hljs-doctype, +.lisp .hljs-string, +.hljs-javadoc { + color: #969896; + font-style: italic; +} + +.hljs-keyword, +.clojure .hljs-attribute, +.hljs-winutils, +.javascript .hljs-title, +.hljs-addition, +.css .hljs-tag { + color: #cc99cc; +} + +.hljs-number { color: #f99157; } + +.hljs-command, +.hljs-string, +.hljs-tag .hljs-value, +.hljs-phpdoc, +.tex .hljs-formula, +.hljs-regexp, +.hljs-hexcolor { + color: #8abeb7; +} + +.hljs-title, +.hljs-localvars, +.hljs-function .hljs-title, +.hljs-chunk, +.hljs-decorator, +.hljs-built_in, +.lisp .hljs-title, +.hljs-identifier +{ + color: #b5bd68; +} + +.hljs-class .hljs-keyword +{ + color: #f2777a; +} + +.hljs-variable, +.lisp .hljs-body, +.smalltalk .hljs-number, +.hljs-constant, +.hljs-class .hljs-title, +.hljs-parent, +.haskell .hljs-label, +.hljs-id, +.lisp .hljs-title, +.clojure .hljs-title .hljs-built_in { + color: #ffcc66; +} + +.hljs-tag .hljs-title, +.hljs-rules .hljs-property, +.django .hljs-tag .hljs-keyword, +.clojure .hljs-title .hljs-built_in { + font-weight: bold; +} + +.hljs-attribute, +.clojure .hljs-title { + color: #81a2be; +} + +.hljs-preprocessor, +.hljs-pragma, +.hljs-pi, +.hljs-shebang, +.hljs-symbol, +.hljs-symbol .hljs-string, +.diff .hljs-change, +.hljs-special, +.hljs-attr_selector, +.hljs-important, +.hljs-subst, +.hljs-cdata { + color: #f99157; +} + +.hljs-deletion { + color: #dc322f; +} + +.tex .hljs-formula { + background: #eee8d5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/school_book.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/school_book.css new file mode 100644 index 0000000..98a3bd2 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/school_book.css @@ -0,0 +1,113 @@ +/* + +School Book style from goldblog.com.ua (c) Zaripov Yura + +*/ + +.hljs { + display: block; padding: 15px 0.5em 0.5em 30px; + font-size: 11px !important; + line-height:16px !important; +} + +pre{ + background:#f6f6ae url(./school_book.png); + border-top: solid 2px #d2e8b9; + border-bottom: solid 1px #d2e8b9; +} + +.hljs-keyword, +.hljs-literal, +.hljs-change, +.hljs-winutils, +.hljs-flow, +.lisp .hljs-title, +.clojure .hljs-built_in, +.nginx .hljs-title, +.tex .hljs-special { + color:#005599; + font-weight:bold; +} + +.hljs, +.hljs-subst, +.hljs-tag .hljs-keyword { + color: #3E5915; +} + +.hljs-string, +.hljs-title, +.haskell .hljs-type, +.hljs-tag .hljs-value, +.css .hljs-rules .hljs-value, +.hljs-preprocessor, +.hljs-pragma, +.ruby .hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.ruby .hljs-class .hljs-parent, +.hljs-built_in, +.sql .hljs-aggregate, +.django .hljs-template_tag, +.django .hljs-variable, +.smalltalk .hljs-class, +.hljs-javadoc, +.ruby .hljs-string, +.django .hljs-filter .hljs-argument, +.smalltalk .hljs-localvars, +.smalltalk .hljs-array, +.hljs-attr_selector, +.hljs-pseudo, +.hljs-addition, +.hljs-stream, +.hljs-envvar, +.apache .hljs-tag, +.apache .hljs-cbracket, +.nginx .hljs-built_in, +.tex .hljs-command, +.coffeescript .hljs-attribute { + color: #2C009F; +} + +.hljs-comment, +.java .hljs-annotation, +.python .hljs-decorator, +.hljs-template_comment, +.hljs-pi, +.hljs-doctype, +.hljs-deletion, +.hljs-shebang, +.apache .hljs-sqbracket { + color: #E60415; +} + +.hljs-keyword, +.hljs-literal, +.css .hljs-id, +.hljs-phpdoc, +.hljs-title, +.haskell .hljs-type, +.vbscript .hljs-built_in, +.sql .hljs-aggregate, +.rsl .hljs-built_in, +.smalltalk .hljs-class, +.xml .hljs-tag .hljs-title, +.diff .hljs-header, +.hljs-chunk, +.hljs-winutils, +.bash .hljs-variable, +.apache .hljs-tag, +.tex .hljs-command, +.hljs-request, +.hljs-status { + font-weight: bold; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/school_book.png b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/school_book.png new file mode 100644 index 0000000000000000000000000000000000000000..956e9790a0e2c079b3d568348ff3accd1d9cac30 GIT binary patch literal 486 zcmeAS@N?(olHy`uVBq!ia0y~yV7?7x3vjRjNjAS6Ga$v1?&#~tz_9*=IcwKTAYZb? zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkD0|R4)r;B4q#jQ7Ycl#YS5MfK$ z?b^fh#qmaEhFDxvyThwfhdfkOPApt1lr{NA;Vr%uzxJuVIyzm(ed_8_-0$LLU})H&o5Re&aDemE>EG#(|F^t9_pa-H z_Mf?rMVrs}-M?S|?ZdY@c6s41zy8~}@a{v&#Ea7V)wJ$+#K|u$5UvWCdFLwGac}6w{_s*=8A6L7Rfc|9gboFyt I=akR{0OLZ+qyPW_ literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/solarized_dark.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/solarized_dark.css new file mode 100644 index 0000000..f520533 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/solarized_dark.css @@ -0,0 +1,107 @@ +/* + +Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull + +*/ + +.hljs { + display: block; + padding: 0.5em; + background: #002b36; + color: #839496; +} + +.hljs-comment, +.hljs-template_comment, +.diff .hljs-header, +.hljs-doctype, +.hljs-pi, +.lisp .hljs-string, +.hljs-javadoc { + color: #586e75; +} + +/* Solarized Green */ +.hljs-keyword, +.hljs-winutils, +.method, +.hljs-addition, +.css .hljs-tag, +.hljs-request, +.hljs-status, +.nginx .hljs-title { + color: #859900; +} + +/* Solarized Cyan */ +.hljs-number, +.hljs-command, +.hljs-string, +.hljs-tag .hljs-value, +.hljs-rules .hljs-value, +.hljs-phpdoc, +.tex .hljs-formula, +.hljs-regexp, +.hljs-hexcolor, +.hljs-link_url { + color: #2aa198; +} + +/* Solarized Blue */ +.hljs-title, +.hljs-localvars, +.hljs-chunk, +.hljs-decorator, +.hljs-built_in, +.hljs-identifier, +.vhdl .hljs-literal, +.hljs-id, +.css .hljs-function { + color: #268bd2; +} + +/* Solarized Yellow */ +.hljs-attribute, +.hljs-variable, +.lisp .hljs-body, +.smalltalk .hljs-number, +.hljs-constant, +.hljs-class .hljs-title, +.hljs-parent, +.haskell .hljs-type, +.hljs-link_reference { + color: #b58900; +} + +/* Solarized Orange */ +.hljs-preprocessor, +.hljs-preprocessor .hljs-keyword, +.hljs-pragma, +.hljs-shebang, +.hljs-symbol, +.hljs-symbol .hljs-string, +.diff .hljs-change, +.hljs-special, +.hljs-attr_selector, +.hljs-subst, +.hljs-cdata, +.clojure .hljs-title, +.css .hljs-pseudo, +.hljs-header { + color: #cb4b16; +} + +/* Solarized Red */ +.hljs-deletion, +.hljs-important { + color: #dc322f; +} + +/* Solarized Violet */ +.hljs-link_label { + color: #6c71c4; +} + +.tex .hljs-formula { + background: #073642; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/solarized_light.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/solarized_light.css new file mode 100644 index 0000000..ad70474 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/solarized_light.css @@ -0,0 +1,107 @@ +/* + +Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull + +*/ + +.hljs { + display: block; + padding: 0.5em; + background: #fdf6e3; + color: #657b83; +} + +.hljs-comment, +.hljs-template_comment, +.diff .hljs-header, +.hljs-doctype, +.hljs-pi, +.lisp .hljs-string, +.hljs-javadoc { + color: #93a1a1; +} + +/* Solarized Green */ +.hljs-keyword, +.hljs-winutils, +.method, +.hljs-addition, +.css .hljs-tag, +.hljs-request, +.hljs-status, +.nginx .hljs-title { + color: #859900; +} + +/* Solarized Cyan */ +.hljs-number, +.hljs-command, +.hljs-string, +.hljs-tag .hljs-value, +.hljs-rules .hljs-value, +.hljs-phpdoc, +.tex .hljs-formula, +.hljs-regexp, +.hljs-hexcolor, +.hljs-link_url { + color: #2aa198; +} + +/* Solarized Blue */ +.hljs-title, +.hljs-localvars, +.hljs-chunk, +.hljs-decorator, +.hljs-built_in, +.hljs-identifier, +.vhdl .hljs-literal, +.hljs-id, +.css .hljs-function { + color: #268bd2; +} + +/* Solarized Yellow */ +.hljs-attribute, +.hljs-variable, +.lisp .hljs-body, +.smalltalk .hljs-number, +.hljs-constant, +.hljs-class .hljs-title, +.hljs-parent, +.haskell .hljs-type, +.hljs-link_reference { + color: #b58900; +} + +/* Solarized Orange */ +.hljs-preprocessor, +.hljs-preprocessor .hljs-keyword, +.hljs-pragma, +.hljs-shebang, +.hljs-symbol, +.hljs-symbol .hljs-string, +.diff .hljs-change, +.hljs-special, +.hljs-attr_selector, +.hljs-subst, +.hljs-cdata, +.clojure .hljs-title, +.css .hljs-pseudo, +.hljs-header { + color: #cb4b16; +} + +/* Solarized Red */ +.hljs-deletion, +.hljs-important { + color: #dc322f; +} + +/* Solarized Violet */ +.hljs-link_label { + color: #6c71c4; +} + +.tex .hljs-formula { + background: #eee8d5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/sunburst.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/sunburst.css new file mode 100644 index 0000000..07b30c2 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/sunburst.css @@ -0,0 +1,160 @@ +/* + +Sunburst-like style (c) Vasily Polovnyov + +*/ + +.hljs { + display: block; padding: 0.5em; + background: #000; color: #f8f8f8; +} + +.hljs-comment, +.hljs-template_comment, +.hljs-javadoc { + color: #aeaeae; + font-style: italic; +} + +.hljs-keyword, +.ruby .hljs-function .hljs-keyword, +.hljs-request, +.hljs-status, +.nginx .hljs-title { + color: #E28964; +} + +.hljs-function .hljs-keyword, +.hljs-sub .hljs-keyword, +.method, +.hljs-list .hljs-title { + color: #99CF50; +} + +.hljs-string, +.hljs-tag .hljs-value, +.hljs-cdata, +.hljs-filter .hljs-argument, +.hljs-attr_selector, +.apache .hljs-cbracket, +.hljs-date, +.tex .hljs-command, +.coffeescript .hljs-attribute { + color: #65B042; +} + +.hljs-subst { + color: #DAEFA3; +} + +.hljs-regexp { + color: #E9C062; +} + +.hljs-title, +.hljs-sub .hljs-identifier, +.hljs-pi, +.hljs-tag, +.hljs-tag .hljs-keyword, +.hljs-decorator, +.hljs-shebang, +.hljs-prompt { + color: #89BDFF; +} + +.hljs-class .hljs-title, +.haskell .hljs-type, +.smalltalk .hljs-class, +.hljs-javadoctag, +.hljs-yardoctag, +.hljs-phpdoc { + text-decoration: underline; +} + +.hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.hljs-number { + color: #3387CC; +} + +.hljs-params, +.hljs-variable, +.clojure .hljs-attribute { + color: #3E87E3; +} + +.css .hljs-tag, +.hljs-rules .hljs-property, +.hljs-pseudo, +.tex .hljs-special { + color: #CDA869; +} + +.css .hljs-class { + color: #9B703F; +} + +.hljs-rules .hljs-keyword { + color: #C5AF75; +} + +.hljs-rules .hljs-value { + color: #CF6A4C; +} + +.css .hljs-id { + color: #8B98AB; +} + +.hljs-annotation, +.apache .hljs-sqbracket, +.nginx .hljs-built_in { + color: #9B859D; +} + +.hljs-preprocessor, +.hljs-pragma { + color: #8996A8; +} + +.hljs-hexcolor, +.css .hljs-value .hljs-number { + color: #DD7B3B; +} + +.css .hljs-function { + color: #DAD085; +} + +.diff .hljs-header, +.hljs-chunk, +.tex .hljs-formula { + background-color: #0E2231; + color: #F8F8F8; + font-style: italic; +} + +.diff .hljs-change { + background-color: #4A410D; + color: #F8F8F8; +} + +.hljs-addition { + background-color: #253B22; + color: #F8F8F8; +} + +.hljs-deletion { + background-color: #420E09; + color: #F8F8F8; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-blue.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-blue.css new file mode 100644 index 0000000..dfe2675 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-blue.css @@ -0,0 +1,93 @@ +/* Tomorrow Night Blue Theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-title { + color: #7285b7; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #ff9da4; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #ffc58f; +} + +/* Tomorrow Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #ffeead; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #d1f1a9; +} + +/* Tomorrow Aqua */ +.css .hljs-hexcolor { + color: #99ffff; +} + +/* Tomorrow Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #bbdaff; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #ebbbff; +} + +.hljs { + display: block; + background: #002451; + color: white; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-bright.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-bright.css new file mode 100644 index 0000000..4ad5d25 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-bright.css @@ -0,0 +1,92 @@ +/* Tomorrow Night Bright Theme */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-title { + color: #969896; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #d54e53; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #e78c45; +} + +/* Tomorrow Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #e7c547; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #b9ca4a; +} + +/* Tomorrow Aqua */ +.css .hljs-hexcolor { + color: #70c0b1; +} + +/* Tomorrow Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #7aa6da; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #c397d8; +} + +.hljs { + display: block; + background: black; + color: #eaeaea; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-eighties.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-eighties.css new file mode 100644 index 0000000..08b49c6 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-eighties.css @@ -0,0 +1,92 @@ +/* Tomorrow Night Eighties Theme */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-title { + color: #999999; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #f2777a; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #f99157; +} + +/* Tomorrow Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #ffcc66; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #99cc99; +} + +/* Tomorrow Aqua */ +.css .hljs-hexcolor { + color: #66cccc; +} + +/* Tomorrow Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #6699cc; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #cc99cc; +} + +.hljs { + display: block; + background: #2d2d2d; + color: #cccccc; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night.css new file mode 100644 index 0000000..c269b17 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night.css @@ -0,0 +1,93 @@ +/* Tomorrow Night Theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-title { + color: #969896; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #cc6666; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #de935f; +} + +/* Tomorrow Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #f0c674; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #b5bd68; +} + +/* Tomorrow Aqua */ +.css .hljs-hexcolor { + color: #8abeb7; +} + +/* Tomorrow Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #81a2be; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #b294bb; +} + +.hljs { + display: block; + background: #1d1f21; + color: #c5c8c6; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow.css new file mode 100644 index 0000000..3bdead6 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow.css @@ -0,0 +1,90 @@ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-title { + color: #8e908c; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #c82829; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #f5871f; +} + +/* Tomorrow Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rules .hljs-attribute { + color: #eab700; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #718c00; +} + +/* Tomorrow Aqua */ +.css .hljs-hexcolor { + color: #3e999f; +} + +/* Tomorrow Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #4271ae; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #8959a8; +} + +.hljs { + display: block; + background: white; + color: #4d4d4c; + padding: 0.5em; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/vs.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/vs.css new file mode 100644 index 0000000..bf33f0f --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/vs.css @@ -0,0 +1,89 @@ +/* + +Visual Studio-like style based on original C# coloring by Jason Diamond + +*/ +.hljs { + display: block; padding: 0.5em; + background: white; color: black; +} + +.hljs-comment, +.hljs-annotation, +.hljs-template_comment, +.diff .hljs-header, +.hljs-chunk, +.apache .hljs-cbracket { + color: #008000; +} + +.hljs-keyword, +.hljs-id, +.hljs-built_in, +.smalltalk .hljs-class, +.hljs-winutils, +.bash .hljs-variable, +.tex .hljs-command, +.hljs-request, +.hljs-status, +.nginx .hljs-title, +.xml .hljs-tag, +.xml .hljs-tag .hljs-value { + color: #00f; +} + +.hljs-string, +.hljs-title, +.hljs-parent, +.hljs-tag .hljs-value, +.hljs-rules .hljs-value, +.hljs-rules .hljs-value .hljs-number, +.ruby .hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.hljs-aggregate, +.hljs-template_tag, +.django .hljs-variable, +.hljs-addition, +.hljs-flow, +.hljs-stream, +.apache .hljs-tag, +.hljs-date, +.tex .hljs-formula, +.coffeescript .hljs-attribute { + color: #a31515; +} + +.ruby .hljs-string, +.hljs-decorator, +.hljs-filter .hljs-argument, +.hljs-localvars, +.hljs-array, +.hljs-attr_selector, +.hljs-pseudo, +.hljs-pi, +.hljs-doctype, +.hljs-deletion, +.hljs-envvar, +.hljs-shebang, +.hljs-preprocessor, +.hljs-pragma, +.userType, +.apache .hljs-sqbracket, +.nginx .hljs-built_in, +.tex .hljs-special, +.hljs-prompt { + color: #2b91af; +} + +.hljs-phpdoc, +.hljs-javadoc, +.hljs-xmlDocTag { + color: #808080; +} + +.vhdl .hljs-typename { font-weight: bold; } +.vhdl .hljs-string { color: #666666; } +.vhdl .hljs-literal { color: #a31515; } +.vhdl .hljs-attribute { color: #00B0E8; } + +.xml .hljs-attribute { color: #f00; } diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/xcode.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/xcode.css new file mode 100644 index 0000000..57bd748 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/xcode.css @@ -0,0 +1,158 @@ +/* + +XCode style (c) Angel Garcia + +*/ + +.hljs { + display: block; padding: 0.5em; + background: #fff; color: black; +} + +.hljs-comment, +.hljs-template_comment, +.hljs-javadoc, +.hljs-comment * { + color: #006a00; +} + +.hljs-keyword, +.hljs-literal, +.nginx .hljs-title { + color: #aa0d91; +} +.method, +.hljs-list .hljs-title, +.hljs-tag .hljs-title, +.setting .hljs-value, +.hljs-winutils, +.tex .hljs-command, +.http .hljs-title, +.hljs-request, +.hljs-status { + color: #008; +} + +.hljs-envvar, +.tex .hljs-special { + color: #660; +} + +.hljs-string { + color: #c41a16; +} +.hljs-tag .hljs-value, +.hljs-cdata, +.hljs-filter .hljs-argument, +.hljs-attr_selector, +.apache .hljs-cbracket, +.hljs-date, +.hljs-regexp { + color: #080; +} + +.hljs-sub .hljs-identifier, +.hljs-pi, +.hljs-tag, +.hljs-tag .hljs-keyword, +.hljs-decorator, +.ini .hljs-title, +.hljs-shebang, +.hljs-prompt, +.hljs-hexcolor, +.hljs-rules .hljs-value, +.css .hljs-value .hljs-number, +.hljs-symbol, +.hljs-symbol .hljs-string, +.hljs-number, +.css .hljs-function, +.clojure .hljs-title, +.clojure .hljs-built_in, +.hljs-function .hljs-title, +.coffeescript .hljs-attribute { + color: #1c00cf; +} + +.hljs-class .hljs-title, +.haskell .hljs-type, +.smalltalk .hljs-class, +.hljs-javadoctag, +.hljs-yardoctag, +.hljs-phpdoc, +.hljs-typename, +.hljs-tag .hljs-attribute, +.hljs-doctype, +.hljs-class .hljs-id, +.hljs-built_in, +.setting, +.hljs-params, +.clojure .hljs-attribute { + color: #5c2699; +} + +.hljs-variable { + color: #3f6e74; +} +.css .hljs-tag, +.hljs-rules .hljs-property, +.hljs-pseudo, +.hljs-subst { + color: #000; +} + +.css .hljs-class, +.css .hljs-id { + color: #9B703F; +} + +.hljs-value .hljs-important { + color: #ff7700; + font-weight: bold; +} + +.hljs-rules .hljs-keyword { + color: #C5AF75; +} + +.hljs-annotation, +.apache .hljs-sqbracket, +.nginx .hljs-built_in { + color: #9B859D; +} + +.hljs-preprocessor, +.hljs-preprocessor *, +.hljs-pragma { + color: #643820; +} + +.tex .hljs-formula { + background-color: #EEE; + font-style: italic; +} + +.diff .hljs-header, +.hljs-chunk { + color: #808080; + font-weight: bold; +} + +.diff .hljs-change { + background-color: #BCCFF9; +} + +.hljs-addition { + background-color: #BAEEBA; +} + +.hljs-deletion { + background-color: #FFC8BD; +} + +.hljs-comment .hljs-yardoctag { + font-weight: bold; +} + +.method .hljs-id { + color: #000; +} diff --git a/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/zenburn.css b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/zenburn.css new file mode 100644 index 0000000..f6cb098 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/lib/highlight/styles/zenburn.css @@ -0,0 +1,117 @@ +/* + +Zenburn style from voldmar.ru (c) Vladimir Epifanov +based on dark.css by Ivan Sagalaev + +*/ + +.hljs { + display: block; padding: 0.5em; + background: #3F3F3F; + color: #DCDCDC; +} + +.hljs-keyword, +.hljs-tag, +.css .hljs-class, +.css .hljs-id, +.lisp .hljs-title, +.nginx .hljs-title, +.hljs-request, +.hljs-status, +.clojure .hljs-attribute { + color: #E3CEAB; +} + +.django .hljs-template_tag, +.django .hljs-variable, +.django .hljs-filter .hljs-argument { + color: #DCDCDC; +} + +.hljs-number, +.hljs-date { + color: #8CD0D3; +} + +.dos .hljs-envvar, +.dos .hljs-stream, +.hljs-variable, +.apache .hljs-sqbracket { + color: #EFDCBC; +} + +.dos .hljs-flow, +.diff .hljs-change, +.python .exception, +.python .hljs-built_in, +.hljs-literal, +.tex .hljs-special { + color: #EFEFAF; +} + +.diff .hljs-chunk, +.hljs-subst { + color: #8F8F8F; +} + +.dos .hljs-keyword, +.python .hljs-decorator, +.hljs-title, +.haskell .hljs-type, +.diff .hljs-header, +.ruby .hljs-class .hljs-parent, +.apache .hljs-tag, +.nginx .hljs-built_in, +.tex .hljs-command, +.hljs-prompt { + color: #efef8f; +} + +.dos .hljs-winutils, +.ruby .hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.ruby .hljs-string { + color: #DCA3A3; +} + +.diff .hljs-deletion, +.hljs-string, +.hljs-tag .hljs-value, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.sql .hljs-aggregate, +.hljs-javadoc, +.smalltalk .hljs-class, +.smalltalk .hljs-localvars, +.smalltalk .hljs-array, +.css .hljs-rules .hljs-value, +.hljs-attr_selector, +.hljs-pseudo, +.apache .hljs-cbracket, +.tex .hljs-formula, +.coffeescript .hljs-attribute { + color: #CC9393; +} + +.hljs-shebang, +.diff .hljs-addition, +.hljs-comment, +.java .hljs-annotation, +.hljs-template_comment, +.hljs-pi, +.hljs-doctype { + color: #7F9F7F; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} + diff --git a/static/assets/ckeditor/plugins/codesnippet/plugin.js b/static/assets/ckeditor/plugins/codesnippet/plugin.js new file mode 100644 index 0000000..626aba6 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/plugin.js @@ -0,0 +1,474 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + + /** + * @fileOverview Rich code snippets for CKEditor. + */ + +'use strict'; + +( function() { + var isBrowserSupported = !CKEDITOR.env.ie || CKEDITOR.env.version > 8; + + CKEDITOR.plugins.add( 'codesnippet', { + requires: 'widget,dialog', + lang: 'bg,ca,cs,da,de,el,en,en-gb,eo,es,et,fa,fi,fr,fr-ca,he,hr,hu,it,ja,km,ku,lt,lv,nb,nl,no,pl,pt,pt-br,ro,ru,sk,sl,sq,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% + icons: 'codesnippet', // %REMOVE_LINE_CORE% + hidpi: true, // %REMOVE_LINE_CORE% + + beforeInit: function( editor ) { + editor._.codesnippet = {}; + + /** + * Sets the custom syntax highlighter. See {@link CKEDITOR.plugins.codesnippet.highlighter} + * to learn how to register a custom highlighter. + * + * **Note**: + * + * * This method can only be called while initialising plugins (in one of + * the three callbacks). + * * This method is accessible through the `editor.plugins.codesnippet` namespace only. + * + * @since 4.4 + * @member CKEDITOR.plugins.codesnippet + * @param {CKEDITOR.plugins.codesnippet.highlighter} highlighter + */ + this.setHighlighter = function( highlighter ) { + editor._.codesnippet.highlighter = highlighter; + + var langs = editor._.codesnippet.langs = + editor.config.codeSnippet_languages || highlighter.languages; + + // We might escape special regex chars below, but we expect that there + // should be no crazy values used as lang keys. + editor._.codesnippet.langsRegex = new RegExp( '(?:^|\\s)language-(' + + CKEDITOR.tools.objectKeys( langs ).join( '|' ) + ')(?:\\s|$)' ); + }; + }, + + onLoad: function() { + CKEDITOR.dialog.add( 'codeSnippet', this.path + 'dialogs/codesnippet.js' ); + }, + + init: function( editor ) { + editor.ui.addButton && editor.ui.addButton( 'CodeSnippet', { + label: editor.lang.codesnippet.button, + command: 'codeSnippet', + toolbar: 'insert,10' + } ); + }, + + afterInit: function( editor ) { + var path = this.path; + + registerWidget( editor ); + + // At the very end, if no custom highlighter was set so far (by plugin#setHighlighter) + // we will set default one. + if ( !editor._.codesnippet.highlighter ) { + var hljsHighlighter = new CKEDITOR.plugins.codesnippet.highlighter( { + languages: { + apache: 'Apache', + bash: 'Bash', + coffeescript: 'CoffeeScript', + cpp: 'C++', + cs: 'C#', + css: 'CSS', + diff: 'Diff', + html: 'HTML', + http: 'HTTP', + ini: 'INI', + java: 'Java', + javascript: 'JavaScript', + json: 'JSON', + makefile: 'Makefile', + markdown: 'Markdown', + nginx: 'Nginx', + objectivec: 'Objective-C', + perl: 'Perl', + php: 'PHP', + python: 'Python', + ruby: 'Ruby', + sql: 'SQL', + vbscript: 'VBScript', + xhtml: 'XHTML', + xml: 'XML' + }, + + init: function( callback ) { + var that = this; + + if ( isBrowserSupported ) { + CKEDITOR.scriptLoader.load( path + 'lib/highlight/highlight.pack.js', function() { + that.hljs = window.hljs; + callback(); + } ); + } + + // Note: This will work for framed editor only. + editor.addContentsCss( path + 'lib/highlight/styles/' + editor.config.codeSnippet_theme + '.css' ); + }, + + highlighter: function( code, language, callback ) { + var highlighted = this.hljs.highlightAuto( code, + this.hljs.getLanguage( language ) ? [ language ] : undefined ); + + if ( highlighted ) + callback( highlighted.value ); + } + } ); + + this.setHighlighter( hljsHighlighter ); + } + } + } ); + + /** + * Global helpers and classes of the Code Snippet plugin. + * + * For more information see the [Code Snippet Guide](#!/guide/dev_codesnippet). + * + * @class + * @singleton + */ + CKEDITOR.plugins.codesnippet = { + highlighter: Highlighter + }; + + /** + * A Code Snippet highlighter. It can be set as a default highlighter + * using {@link CKEDITOR.plugins.codesnippet#setHighlighter}, for example: + * + * // Create a new plugin which registers a custom code highlighter + * // based on customEngine in order to replace the one that comes + * // with the Code Snippet plugin. + * CKEDITOR.plugins.add( 'myCustomHighlighter', { + * afterInit: function( editor ) { + * // Create a new instance of the highlighter. + * var myHighlighter = new CKEDITOR.plugins.codesnippet.highlighter( { + * init: function( ready ) { + * // Asynchronous code to load resources and libraries for customEngine. + * customEngine.loadResources( function() { + * // Let the editor know that everything is ready. + * ready(); + * } ); + * }, + * highlighter: function( code, language, callback ) { + * // Let the customEngine highlight the code. + * customEngine.highlight( code, language, function() { + * callback( highlightedCode ); + * } ); + * } + * } ); + * + * // Check how it performs. + * myHighlighter.highlight( 'foo()', 'javascript', function( highlightedCode ) { + * console.log( highlightedCode ); // -> foo() + * } ); + * + * // From now on, myHighlighter will be used as a Code Snippet + * // highlighter, overwriting the default engine. + * editor.plugins.codesnippet.setHighlighter( myHighlighter ); + * } + * } ); + * + * @since 4.4 + * @class CKEDITOR.plugins.codesnippet.highlighter + * @extends CKEDITOR.plugins.codesnippet + * @param {Object} def Highlighter definition. See {@link #highlighter}, {@link #init} and {@link #languages}. + */ + function Highlighter( def ) { + CKEDITOR.tools.extend( this, def ); + + /** + * A queue of {@link #highlight} jobs to be + * done once the highlighter is {@link #ready}. + * + * @readonly + * @property {Array} [=[]] + */ + this.queue = []; + + // Async init – execute jobs when ready. + if ( this.init ) { + this.init( CKEDITOR.tools.bind( function() { + // Execute pending jobs. + var job; + + while ( ( job = this.queue.pop() ) ) + job.call( this ); + + this.ready = true; + }, this ) ); + } else { + this.ready = true; + } + + /** + * If specified, this function should asynchronously load highlighter-specific + * resources and execute `ready` when the highlighter is ready. + * + * @property {Function} [init] + * @param {Function} ready The function to be called once + * the highlighter is {@link #ready}. + */ + + /** + * A function which highlights given plain text `code` in a given `language` and, once done, + * calls the `callback` function with highlighted markup as an argument. + * + * @property {Function} [highlighter] + * @param {String} code Code to be formatted. + * @param {String} lang Language to be used ({@link CKEDITOR.config#codeSnippet_languages}). + * @param {Function} callback Function which accepts highlighted String as an argument. + */ + + /** + * Defines languages supported by the highlighter. + * They can be restricted with the {@link CKEDITOR.config#codeSnippet_languages} configuration option. + * + * **Note**: If {@link CKEDITOR.config#codeSnippet_languages} is set, **it will + * overwrite** the languages listed in `languages`. + * + * languages: { + * coffeescript: 'CoffeeScript', + * cpp: 'C++', + * cs: 'C#', + * css: 'CSS' + * } + * + * More information on how to change the list of languages is available + * in the [Code Snippet documentation](#!/guide/dev_codesnippet-section-changing-languages-list). + * + * @property {Object} languages + */ + + /** + * A flag which indicates whether the highlighter is ready to do jobs + * from the {@link #queue}. + * + * @readonly + * @property {Boolean} ready + */ + } + + /** + * Executes the {@link #highlighter}. If the highlighter is not ready, it defers the job ({@link #queue}) + * and executes it when the highlighter is {@link #ready}. + * + * @param {String} code Code to be formatted. + * @param {String} lang Language to be used ({@link CKEDITOR.config#codeSnippet_languages}). + * @param {Function} callback Function which accepts highlighted String as an argument. + */ + Highlighter.prototype.highlight = function() { + var arg = arguments; + + // Highlighter is ready – do it now. + if ( this.ready ) + this.highlighter.apply( this, arg ); + // Queue the job. It will be done once ready. + else { + this.queue.push( function() { + this.highlighter.apply( this, arg ); + } ); + } + }; + + // Encapsulates snippet widget registration code. + // @param {CKEDITOR.editor} editor + function registerWidget( editor ) { + var codeClass = editor.config.codeSnippet_codeClass, + newLineRegex = /\r?\n/g, + textarea = new CKEDITOR.dom.element( 'textarea' ), + lang = editor.lang.codesnippet; + + editor.widgets.add( 'codeSnippet', { + allowedContent: 'pre; code(language-*)', + // Actually we need both - pre and code, but ACF does not make it possible + // to defire required content with "and" operator. + requiredContent: 'pre', + styleableElements: 'pre', + template: '
    ', + dialog: 'codeSnippet', + pathName: lang.pathName, + mask: true, + + parts: { + pre: 'pre', + code: 'code' + }, + + highlight: function() { + var that = this, + widgetData = this.data, + callback = function( formatted ) { + // IE8 (not supported browser) have issue with new line chars, when using innerHTML. + // It will simply strip it. + that.parts.code.setHtml( isBrowserSupported ? + formatted : formatted.replace( newLineRegex, '
    ' ) ); + }; + + // Set plain code first, so even if custom handler will not call it the code will be there. + callback( CKEDITOR.tools.htmlEncode( widgetData.code ) ); + + // Call higlighter to apply its custom highlighting. + editor._.codesnippet.highlighter.highlight( widgetData.code, widgetData.lang, function( formatted ) { + editor.fire( 'lockSnapshot' ); + callback( formatted ); + editor.fire( 'unlockSnapshot' ); + } ); + }, + + data: function() { + var newData = this.data, + oldData = this.oldData; + + if ( newData.code ) + this.parts.code.setHtml( CKEDITOR.tools.htmlEncode( newData.code ) ); + + // Remove old .language-* class. + if ( oldData && newData.lang != oldData.lang ) + this.parts.code.removeClass( 'language-' + oldData.lang ); + + // Lang needs to be specified in order to apply formatting. + if ( newData.lang ) { + // Apply new .language-* class. + this.parts.code.addClass( 'language-' + newData.lang ); + + this.highlight(); + } + + // Save oldData. + this.oldData = CKEDITOR.tools.copy( newData ); + }, + + // Upcasts
    ...
    + upcast: function( el, data ) { + if ( el.name != 'pre' ) + return; + + var childrenArray = getNonEmptyChildren( el ), + code; + + if ( childrenArray.length != 1 || ( code = childrenArray[ 0 ] ).name != 'code' ) + return; + + // Upcast with text only: http://dev.ckeditor.com/ticket/11926#comment:4 + if ( code.children.length != 1 || code.children[ 0 ].type != CKEDITOR.NODE_TEXT ) + return; + + // Read language-* from class attribute. + var matchResult = editor._.codesnippet.langsRegex.exec( code.attributes[ 'class' ] ); + + if ( matchResult ) + data.lang = matchResult[ 1 ]; + + // Use textarea to decode HTML entities (#11926). + textarea.setHtml( code.getHtml() ); + data.code = textarea.getValue(); + + code.addClass( codeClass ); + + return el; + }, + + // Downcasts to
    ...
    + downcast: function( el ) { + var code = el.getFirst( 'code' ); + + // Remove pretty formatting from .... + code.children.length = 0; + + // Remove config#codeSnippet_codeClass. + code.removeClass( codeClass ); + + // Set raw text inside .... + code.add( new CKEDITOR.htmlParser.text( CKEDITOR.tools.htmlEncode( this.data.code ) ) ); + + return el; + } + } ); + + // Returns an **array** of child elements, with whitespace-only text nodes + // filtered out. + // @param {CKEDITOR.htmlParser.element} parentElement + // @return Array - array of CKEDITOR.htmlParser.node + var whitespaceOnlyRegex = /^[\s\n\r]*$/; + + function getNonEmptyChildren( parentElement ) { + var ret = [], + preChildrenList = parentElement.children, + curNode; + + // Filter out empty text nodes. + for ( var i = preChildrenList.length - 1; i >= 0; i-- ) { + curNode = preChildrenList[ i ]; + + if ( curNode.type != CKEDITOR.NODE_TEXT || !curNode.value.match( whitespaceOnlyRegex ) ) + ret.push( curNode ); + } + + return ret; + } + } +} )(); + +/** + * A CSS class of the `` element used internally for styling + * (by default [highlight.js](http://highlightjs.org) themes, see + * {@link CKEDITOR.config#codeSnippet_theme config.codeSnippet_theme}), + * which means that it is **not present** in the editor output data. + * + * // Changes the class to "myCustomClass". + * config.codeSnippet_codeClass = 'myCustomClass'; + * + * **Note**: The class might need to be changed when you are using a custom + * highlighter (the default is [highlight.js](http://highlightjs.org)). + * See {@link CKEDITOR.plugins.codesnippet.highlighter} to read more. + * + * @since 4.4 + * @cfg {String} [codeSnippet_codeClass='hljs'] + * @member CKEDITOR.config + */ +CKEDITOR.config.codeSnippet_codeClass = 'hljs'; + +/** + * Restricts languages available in the "Code Snippet" dialog window. + * An empty value is always added to the list. + * + * **Note**: If using a custom highlighter library (the default is [highlight.js](http://highlightjs.org)), + * you may need to refer to external documentation to set `config.codeSnippet_languages` properly. + * + * // Restricts languages to JavaScript and PHP. + * config.codeSnippet_languages = { + * javascript: 'JavaScript', + * php: 'PHP' + * }; + * + * More information on how to change the list of languages list is available + * in the [Code Snippet documentation](#!/guide/dev_codesnippet-section-changing-languages-list). + * + * @since 4.4 + * @cfg {Object} [codeSnippet_languages=null] + * @member CKEDITOR.config + */ + +/** + * A theme used to render code snippets. See [available themes](http://highlightjs.org/static/test.html). + * + * **Note**: This will only work with the default highlighter + * ([highlight.js](http://highlightjs.org/static/test.html)). + * + * // Changes the theme to "pojoaque". + * config.codeSnippet_theme = 'pojoaque'; + * + * More information on how to change the highlighter theme is available + * in the [Code Snippet documentation](#!/guide/dev_codesnippet-section-changing-highlighter-theme). + * + * @since 4.4 + * @cfg {String} [codeSnippet_theme='default'] + * @member CKEDITOR.config + */ +CKEDITOR.config.codeSnippet_theme = 'default'; diff --git a/static/assets/ckeditor/plugins/codesnippet/samples/codesnippet.html b/static/assets/ckeditor/plugins/codesnippet/samples/codesnippet.html new file mode 100644 index 0000000..7c51f69 --- /dev/null +++ b/static/assets/ckeditor/plugins/codesnippet/samples/codesnippet.html @@ -0,0 +1,236 @@ + + + + + + Code Snippet — CKEditor Sample + + + + + + + + + + + +

    + CKEditor Samples » Code Snippet Plugin +

    + +
    +

    + This editor is using the Code Snippet plugin which introduces beautiful code snippets. + By default the codesnippet plugin depends on the built-in client-side syntax highlighting + library highlight.js. +

    +

    + You can adjust the appearance of code snippets using the codeSnippet_theme configuration variable + (see available themes). +

    +

    + Select theme: +

    +

    + The CKEditor instance below was created by using the following configuration settings: +

    + +
    +CKEDITOR.replace( 'editor1', {
    +	extraPlugins: 'codesnippet',
    +	codeSnippet_theme: 'monokai_sublime'
    +} );
    +
    + +

    + Please note that this plugin is not compatible with Internet Explorer 8. +

    +
    + + + +

    Inline editor

    + +
    +

    + The following sample shows the Code Snippet plugin running inside + an inline CKEditor instance. The CKEditor instance below was created by using the following configuration settings: +

    + +
    +CKEDITOR.inline( 'editable', {
    +	extraPlugins: 'codesnippet'
    +} );
    +
    + +

    + Note: The highlight.js themes + must be loaded manually to be applied inside an inline editor instance, as the + codeSnippet_theme setting will not work in that case. + You need to include the stylesheet in the <head> section of the page, for example: +

    + +
    +<head>
    +	...
    +	<link href="path/to/highlight.js/styles/monokai_sublime.css" rel="stylesheet">
    +</head>
    +
    + +
    + +
    + +

    JavaScript code:

    + +
    function isEmpty( object ) {
    +	for ( var i in object ) {
    +		if ( object.hasOwnProperty( i ) )
    +			return false;
    +	}
    +	return true;
    +}
    + +

    SQL query:

    + +
    SELECT cust.id, cust.name, loc.city FROM cust LEFT JOIN loc ON ( cust.loc_id = loc.id ) WHERE cust.type IN ( 1, 2 );
    + +

    Unknown markup:

    + +
     ________________
    +/                \
    +| How about moo? |  ^__^
    +\________________/  (oo)\_______
    +                  \ (__)\       )\/\
    +                        ||----w |
    +                        ||     ||
    +
    +
    + +

    Server-side Highlighting and Custom Highlighting Engines

    + +

    + The Code Snippet GeSHi plugin is an + extension of the Code Snippet plugin which uses a server-side highligter. +

    + +

    + It also is possible to replace the default highlighter with any library using + the Highlighter API + and the editor.plugins.codesnippet.setHighlighter() method. +

    + + + + + + diff --git a/static/assets/ckeditor/plugins/colordialog/dialogs/colordialog.js b/static/assets/ckeditor/plugins/colordialog/dialogs/colordialog.js new file mode 100644 index 0000000..51a49f4 --- /dev/null +++ b/static/assets/ckeditor/plugins/colordialog/dialogs/colordialog.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("colordialog",function(t){function n(){f.getById(o).removeStyle("background-color");p.getContentElement("picker","selectedColor").setValue("");j&&j.removeAttribute("aria-selected");j=null}function u(a){var a=a.data.getTarget(),b;if("td"==a.getName()&&(b=a.getChild(0).getHtml()))j=a,j.setAttribute("aria-selected",!0),p.getContentElement("picker","selectedColor").setValue(b)}function y(a){for(var a=a.replace(/^#/,""),b=0,c=[];2>=b;b++)c[b]=parseInt(a.substr(2*b,2),16);return"#"+ +(165<=0.2126*c[0]+0.7152*c[1]+0.0722*c[2]?"000":"fff")}function v(a){!a.name&&(a=new CKEDITOR.event(a));var b=!/mouse/.test(a.name),c=a.data.getTarget(),e;if("td"==c.getName()&&(e=c.getChild(0).getHtml()))q(a),b?g=c:w=c,b&&(c.setStyle("border-color",y(e)),c.setStyle("border-style","dotted")),f.getById(k).setStyle("background-color",e),f.getById(l).setHtml(e)}function q(a){if(a=!/mouse/.test(a.name)&&g){var b=a.getChild(0).getHtml();a.setStyle("border-color",b);a.setStyle("border-style","solid")}!g&& +!w&&(f.getById(k).removeStyle("background-color"),f.getById(l).setHtml(" "))}function z(a){var b=a.data,c=b.getTarget(),e=b.getKeystroke(),d="rtl"==t.lang.dir;switch(e){case 38:if(a=c.getParent().getPrevious())a=a.getChild([c.getIndex()]),a.focus();b.preventDefault();break;case 40:if(a=c.getParent().getNext())(a=a.getChild([c.getIndex()]))&&1==a.type&&a.focus();b.preventDefault();break;case 32:case 13:u(a);b.preventDefault();break;case d?37:39:if(a=c.getNext())1==a.type&&(a.focus(),b.preventDefault(!0)); +else if(a=c.getParent().getNext())if((a=a.getChild([0]))&&1==a.type)a.focus(),b.preventDefault(!0);break;case d?39:37:if(a=c.getPrevious())a.focus(),b.preventDefault(!0);else if(a=c.getParent().getPrevious())a=a.getLast(),a.focus(),b.preventDefault(!0)}}var r=CKEDITOR.dom.element,f=CKEDITOR.document,h=t.lang.colordialog,p,x={type:"html",html:" "},j,g,w,m=function(a){return CKEDITOR.tools.getNextId()+"_"+a},k=m("hicolor"),l=m("hicolortext"),o=m("selhicolor"),i;(function(){function a(a,d){for(var s= +a;sg;g++)b(e.$,"#"+c[f]+c[g]+c[s])}}function b(a,c){var b=new r(a.insertCell(-1));b.setAttribute("class","ColorCell");b.setAttribute("tabIndex",-1);b.setAttribute("role","gridcell");b.on("keydown",z);b.on("click",u);b.on("focus",v);b.on("blur",q);b.setStyle("background-color",c);b.setStyle("border","1px solid "+c);b.setStyle("width","14px");b.setStyle("height","14px");var d=m("color_table_cell"); +b.setAttribute("aria-labelledby",d);b.append(CKEDITOR.dom.element.createFromHtml(''+c+"",CKEDITOR.document))}i=CKEDITOR.dom.element.createFromHtml('
    '+h.options+'
    ');i.on("mouseover",v);i.on("mouseout",q);var c="00 33 66 99 cc ff".split(" ");a(0,0);a(3,0);a(0, +3);a(3,3);var e=new r(i.$.insertRow(-1));e.setAttribute("role","row");for(var d=0;6>d;d++)b(e.$,"#"+c[d]+c[d]+c[d]);for(d=0;12>d;d++)b(e.$,"#000000")})();return{title:h.title,minWidth:360,minHeight:220,onLoad:function(){p=this},onHide:function(){n();var a=g.getChild(0).getHtml();g.setStyle("border-color",a);g.setStyle("border-style","solid");f.getById(k).removeStyle("background-color");f.getById(l).setHtml(" ");g=null},contents:[{id:"picker",label:h.title,accessKey:"I",elements:[{type:"hbox", +padding:0,widths:["70%","10%","30%"],children:[{type:"html",html:"
    ",onLoad:function(){CKEDITOR.document.getById(this.domId).append(i)},focus:function(){(g||this.getElement().getElementsByTag("td").getItem(0)).focus()}},x,{type:"vbox",padding:0,widths:["70%","5%","25%"],children:[{type:"html",html:""+h.highlight+'
     
    '+h.selected+'
    '}, +{type:"text",label:h.selected,labelStyle:"display:none",id:"selectedColor",style:"width: 76px;margin-top:4px",onChange:function(){try{f.getById(o).setStyle("background-color",this.getValue())}catch(a){n()}}},x,{type:"button",id:"clear",label:h.clear,onClick:n}]}]}]}]}}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/devtools/lang/_translationstatus.txt b/static/assets/ckeditor/plugins/devtools/lang/_translationstatus.txt new file mode 100644 index 0000000..5da931c --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/_translationstatus.txt @@ -0,0 +1,27 @@ +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license + +bg.js Found: 5 Missing: 0 +cs.js Found: 5 Missing: 0 +cy.js Found: 5 Missing: 0 +da.js Found: 5 Missing: 0 +de.js Found: 5 Missing: 0 +el.js Found: 5 Missing: 0 +eo.js Found: 5 Missing: 0 +et.js Found: 5 Missing: 0 +fa.js Found: 5 Missing: 0 +fi.js Found: 5 Missing: 0 +fr.js Found: 5 Missing: 0 +gu.js Found: 5 Missing: 0 +he.js Found: 5 Missing: 0 +hr.js Found: 5 Missing: 0 +it.js Found: 5 Missing: 0 +nb.js Found: 5 Missing: 0 +nl.js Found: 5 Missing: 0 +no.js Found: 5 Missing: 0 +pl.js Found: 5 Missing: 0 +tr.js Found: 5 Missing: 0 +ug.js Found: 5 Missing: 0 +uk.js Found: 5 Missing: 0 +vi.js Found: 5 Missing: 0 +zh-cn.js Found: 5 Missing: 0 diff --git a/static/assets/ckeditor/plugins/devtools/lang/ar.js b/static/assets/ckeditor/plugins/devtools/lang/ar.js new file mode 100644 index 0000000..97b24f1 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/ar.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'ar', { + title: 'معلومات العنصر', + dialogName: 'إسم نافذة الحوار', + tabName: 'إسم التبويب', + elementId: 'إسم العنصر', + elementType: 'نوع العنصر' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/bg.js b/static/assets/ckeditor/plugins/devtools/lang/bg.js new file mode 100644 index 0000000..88cfb5f --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/bg.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'bg', { + title: 'Информация за елемента', + dialogName: 'Име на диалоговия прозорец', + tabName: 'Име на таб', + elementId: 'ID на елемента', + elementType: 'Тип на елемента' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/ca.js b/static/assets/ckeditor/plugins/devtools/lang/ca.js new file mode 100644 index 0000000..b372ace --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/ca.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'ca', { + title: 'Informació de l\'element', + dialogName: 'Nom de la finestra de quadre de diàleg', + tabName: 'Nom de la pestanya', + elementId: 'ID de l\'element', + elementType: 'Tipus d\'element' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/cs.js b/static/assets/ckeditor/plugins/devtools/lang/cs.js new file mode 100644 index 0000000..814cee3 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/cs.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'cs', { + title: 'Informace o prvku', + dialogName: 'Název dialogového okna', + tabName: 'Název karty', + elementId: 'ID prvku', + elementType: 'Typ prvku' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/cy.js b/static/assets/ckeditor/plugins/devtools/lang/cy.js new file mode 100644 index 0000000..9b2402c --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/cy.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'cy', { + title: 'Gwybodaeth am yr Elfen', + dialogName: 'Enw ffenestr y deialog', + tabName: 'Enw\'r tab', + elementId: 'ID yr Elfen', + elementType: 'Math yr elfen' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/da.js b/static/assets/ckeditor/plugins/devtools/lang/da.js new file mode 100644 index 0000000..6d591de --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/da.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'da', { + title: 'Information på elementet', + dialogName: 'Dialogboks', + tabName: 'Tab beskrivelse', + elementId: 'ID på element', + elementType: 'Type af element' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/de.js b/static/assets/ckeditor/plugins/devtools/lang/de.js new file mode 100644 index 0000000..d79d8d1 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/de.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'de', { + title: 'Elementinformation', + dialogName: 'Dialogfenstername', + tabName: 'Reitername', + elementId: 'Element ID', + elementType: 'Elementtyp' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/el.js b/static/assets/ckeditor/plugins/devtools/lang/el.js new file mode 100644 index 0000000..dbc5c90 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/el.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'el', { + title: 'Πληροφορίες Στοιχείου', + dialogName: 'Όνομα παραθύρου διαλόγου', + tabName: 'Όνομα καρτέλας', + elementId: 'Αναγνωριστικό Στοιχείου', + elementType: 'Τύπος στοιχείου' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/en-gb.js b/static/assets/ckeditor/plugins/devtools/lang/en-gb.js new file mode 100644 index 0000000..8a2a4e7 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/en-gb.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'en-gb', { + title: 'Element Information', + dialogName: 'Dialogue window name', + tabName: 'Tab name', + elementId: 'Element ID', + elementType: 'Element type' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/en.js b/static/assets/ckeditor/plugins/devtools/lang/en.js new file mode 100644 index 0000000..7a7463e --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/en.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'en', { + title: 'Element Information', + dialogName: 'Dialog window name', + tabName: 'Tab name', + elementId: 'Element ID', + elementType: 'Element type' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/eo.js b/static/assets/ckeditor/plugins/devtools/lang/eo.js new file mode 100644 index 0000000..046f49f --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/eo.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'eo', { + title: 'Informo pri la elemento', + dialogName: 'Nomo de la dialogfenestro', + tabName: 'Langetnomo', + elementId: 'ID de la elemento', + elementType: 'Tipo de la elemento' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/es.js b/static/assets/ckeditor/plugins/devtools/lang/es.js new file mode 100644 index 0000000..e574935 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/es.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'es', { + title: 'Información del Elemento', + dialogName: 'Nombre de la ventana de diálogo', + tabName: 'Nombre de la pestaña', + elementId: 'ID del Elemento', + elementType: 'Tipo del elemento' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/et.js b/static/assets/ckeditor/plugins/devtools/lang/et.js new file mode 100644 index 0000000..bcc138b --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/et.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'et', { + title: 'Elemendi andmed', + dialogName: 'Dialoogiakna nimi', + tabName: 'Saki nimi', + elementId: 'Elemendi ID', + elementType: 'Elemendi liik' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/eu.js b/static/assets/ckeditor/plugins/devtools/lang/eu.js new file mode 100644 index 0000000..7448f16 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/eu.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'eu', { + title: 'Elementuaren Informazioa', + dialogName: 'Elkarrizketa leihoaren izena', + tabName: 'Fitxaren izena', + elementId: 'Elementuaren ID-a', + elementType: 'Elementu mota' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/fa.js b/static/assets/ckeditor/plugins/devtools/lang/fa.js new file mode 100644 index 0000000..4a05206 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/fa.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'fa', { + title: 'اطلاعات عنصر', + dialogName: 'نام پنجره محاوره‌ای', + tabName: 'نام برگه', + elementId: 'ID عنصر', + elementType: 'نوع عنصر' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/fi.js b/static/assets/ckeditor/plugins/devtools/lang/fi.js new file mode 100644 index 0000000..747c026 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/fi.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'fi', { + title: 'Elementin tiedot', + dialogName: 'Dialogi-ikkunan nimi', + tabName: 'Välilehden nimi', + elementId: 'Elementin ID', + elementType: 'Elementin tyyppi' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/fr-ca.js b/static/assets/ckeditor/plugins/devtools/lang/fr-ca.js new file mode 100644 index 0000000..24e87b9 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/fr-ca.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'fr-ca', { + title: 'Information de l\'élément', + dialogName: 'Nom de la fenêtre', + tabName: 'Nom de l\'onglet', + elementId: 'ID de l\'élément', + elementType: 'Type de l\'élément' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/fr.js b/static/assets/ckeditor/plugins/devtools/lang/fr.js new file mode 100644 index 0000000..220187d --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/fr.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'fr', { + title: 'Information sur l\'élément', + dialogName: 'Nom de la fenêtre de dialogue', + tabName: 'Nom de l\'onglet', + elementId: 'ID de l\'élément', + elementType: 'Type de l\'élément' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/gl.js b/static/assets/ckeditor/plugins/devtools/lang/gl.js new file mode 100644 index 0000000..08dd0bb --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/gl.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'gl', { + title: 'Información do elemento', + dialogName: 'Nome da xanela de diálogo', + tabName: 'Nome da lapela', + elementId: 'ID do elemento', + elementType: 'Tipo do elemento' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/gu.js b/static/assets/ckeditor/plugins/devtools/lang/gu.js new file mode 100644 index 0000000..de06dce --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/gu.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'gu', { + title: 'પ્રાથમિક માહિતી', + dialogName: 'વિન્ડોનું નામ', + tabName: 'ટેબનું નામ', + elementId: 'પ્રાથમિક આઈડી', + elementType: 'પ્રાથમિક પ્રકાર' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/he.js b/static/assets/ckeditor/plugins/devtools/lang/he.js new file mode 100644 index 0000000..a9d4817 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/he.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'he', { + title: 'מידע על האלמנט', + dialogName: 'שם הדיאלוג', + tabName: 'שם הטאב', + elementId: 'ID של האלמנט', + elementType: 'סוג האלמנט' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/hr.js b/static/assets/ckeditor/plugins/devtools/lang/hr.js new file mode 100644 index 0000000..d788cbe --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/hr.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'hr', { + title: 'Informacije elementa', + dialogName: 'Naziv prozora za dijalog', + tabName: 'Naziva jahača', + elementId: 'ID elementa', + elementType: 'Vrsta elementa' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/hu.js b/static/assets/ckeditor/plugins/devtools/lang/hu.js new file mode 100644 index 0000000..6399975 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/hu.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'hu', { + title: 'Elem információ', + dialogName: 'Párbeszédablak neve', + tabName: 'Fül neve', + elementId: 'Elem ID', + elementType: 'Elem típusa' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/id.js b/static/assets/ckeditor/plugins/devtools/lang/id.js new file mode 100644 index 0000000..d940226 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/id.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'id', { + title: 'Informasi Elemen', + dialogName: 'Nama jendela dialog', + tabName: 'Nama tab', + elementId: 'ID Elemen', + elementType: 'Tipe elemen' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/it.js b/static/assets/ckeditor/plugins/devtools/lang/it.js new file mode 100644 index 0000000..1b71420 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/it.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'it', { + title: 'Informazioni elemento', + dialogName: 'Nome finestra di dialogo', + tabName: 'Nome Tab', + elementId: 'ID Elemento', + elementType: 'Tipo elemento' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/ja.js b/static/assets/ckeditor/plugins/devtools/lang/ja.js new file mode 100644 index 0000000..2d39768 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/ja.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'ja', { + title: 'エレメント情報', + dialogName: 'ダイアログウィンドウ名', + tabName: 'タブ名', + elementId: 'エレメントID', + elementType: '要素タイプ' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/km.js b/static/assets/ckeditor/plugins/devtools/lang/km.js new file mode 100644 index 0000000..958807b --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/km.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'km', { + title: 'ព័ត៌មាន​នៃ​ធាតុ', + dialogName: 'ឈ្មោះ​ប្រអប់​វីនដូ', + tabName: 'ឈ្មោះ​ផ្ទាំង', + elementId: 'អត្តលេខ​ធាតុ', + elementType: 'ប្រភេទ​ធាតុ' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/ko.js b/static/assets/ckeditor/plugins/devtools/lang/ko.js new file mode 100644 index 0000000..461d31c --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/ko.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'ko', { + title: '구성 요소 정보', + dialogName: '다이얼로그 윈도우 이름', + tabName: '탭 이름', + elementId: '요소 ID', + elementType: '요소 형식' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/ku.js b/static/assets/ckeditor/plugins/devtools/lang/ku.js new file mode 100644 index 0000000..c037b3e --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/ku.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'ku', { + title: 'زانیاری توخم', + dialogName: 'ناوی پەنجەرەی دیالۆگ', + tabName: 'ناوی بازدەر تاب', + elementId: 'ناسنامەی توخم', + elementType: 'جۆری توخم' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/lt.js b/static/assets/ckeditor/plugins/devtools/lang/lt.js new file mode 100644 index 0000000..6f54bbf --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/lt.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'lt', { + title: 'Elemento informacija', + dialogName: 'Dialogo lango pavadinimas', + tabName: 'Auselės pavadinimas', + elementId: 'Elemento ID', + elementType: 'Elemento tipas' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/lv.js b/static/assets/ckeditor/plugins/devtools/lang/lv.js new file mode 100644 index 0000000..3ab66cb --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/lv.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'lv', { + title: 'Elementa informācija', + dialogName: 'Dialoga loga nosaukums', + tabName: 'Cilnes nosaukums', + elementId: 'Elementa ID', + elementType: 'Elementa tips' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/nb.js b/static/assets/ckeditor/plugins/devtools/lang/nb.js new file mode 100644 index 0000000..b563d18 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/nb.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'nb', { + title: 'Elementinformasjon', + dialogName: 'Navn på dialogvindu', + tabName: 'Navn på fane', + elementId: 'Element-ID', + elementType: 'Elementtype' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/nl.js b/static/assets/ckeditor/plugins/devtools/lang/nl.js new file mode 100644 index 0000000..bdf564a --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/nl.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'nl', { + title: 'Elementinformatie', + dialogName: 'Naam dialoogvenster', + tabName: 'Tabnaam', + elementId: 'Element ID', + elementType: 'Elementtype' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/no.js b/static/assets/ckeditor/plugins/devtools/lang/no.js new file mode 100644 index 0000000..7514e46 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/no.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'no', { + title: 'Elementinformasjon', + dialogName: 'Navn på dialogvindu', + tabName: 'Navn på fane', + elementId: 'Element-ID', + elementType: 'Elementtype' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/pl.js b/static/assets/ckeditor/plugins/devtools/lang/pl.js new file mode 100644 index 0000000..9b3d68b --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/pl.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'pl', { + title: 'Informacja o elemencie', + dialogName: 'Nazwa okna dialogowego', + tabName: 'Nazwa zakładki', + elementId: 'ID elementu', + elementType: 'Typ elementu' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/pt-br.js b/static/assets/ckeditor/plugins/devtools/lang/pt-br.js new file mode 100644 index 0000000..96a5c73 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/pt-br.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'pt-br', { + title: 'Informação do Elemento', + dialogName: 'Nome da janela de diálogo', + tabName: 'Nome da aba', + elementId: 'ID do Elemento', + elementType: 'Tipo do elemento' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/pt.js b/static/assets/ckeditor/plugins/devtools/lang/pt.js new file mode 100644 index 0000000..1b01ff3 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/pt.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'pt', { + title: 'Informação do elemento', + dialogName: 'Nome da janela de diálogo', + tabName: 'Nome do separador', + elementId: 'ID do elemento', + elementType: 'Tipo de Elemento' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/ru.js b/static/assets/ckeditor/plugins/devtools/lang/ru.js new file mode 100644 index 0000000..10cee44 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/ru.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'ru', { + title: 'Информация об элементе', + dialogName: 'Имя окна диалога', + tabName: 'Имя вкладки', + elementId: 'ID элемента', + elementType: 'Тип элемента' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/si.js b/static/assets/ckeditor/plugins/devtools/lang/si.js new file mode 100644 index 0000000..f920722 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/si.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'si', { + title: 'මුලද්‍රව්‍ය ', + dialogName: 'දෙබස් කවුළුවේ නම', + tabName: 'තීරුවේ නම', + elementId: 'මුලද්‍රව්‍ය කේතය', + elementType: 'මුලද්‍රව්‍ය වර්ගය' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/sk.js b/static/assets/ckeditor/plugins/devtools/lang/sk.js new file mode 100644 index 0000000..6a773af --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/sk.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'sk', { + title: 'Informácie o prvku', + dialogName: 'Názov okna dialógu', + tabName: 'Názov záložky', + elementId: 'ID prvku', + elementType: 'Typ prvku' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/sl.js b/static/assets/ckeditor/plugins/devtools/lang/sl.js new file mode 100644 index 0000000..f793072 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/sl.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'sl', { + title: 'Podatki elementa', + dialogName: 'Ime pogovornega okna', + tabName: 'Ime zavihka', + elementId: 'ID elementa', + elementType: 'Tip elementa' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/sq.js b/static/assets/ckeditor/plugins/devtools/lang/sq.js new file mode 100644 index 0000000..92d1219 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/sq.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'sq', { + title: 'Të dhënat e elementit', + dialogName: 'Emri i dritares së dialogut', + tabName: 'Emri i fletës', + elementId: 'ID e elementit', + elementType: 'Lloji i elementit' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/sv.js b/static/assets/ckeditor/plugins/devtools/lang/sv.js new file mode 100644 index 0000000..74e15a2 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/sv.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'sv', { + title: 'Elementinformation', + dialogName: 'Dialogrutans namn', + tabName: 'Fliknamn', + elementId: 'Elementet-ID', + elementType: 'Elementet-typ' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/tr.js b/static/assets/ckeditor/plugins/devtools/lang/tr.js new file mode 100644 index 0000000..d9b66f2 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/tr.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'tr', { + title: 'Eleman Bilgisi', + dialogName: 'İletişim pencere ismi', + tabName: 'Sekme adı', + elementId: 'Eleman ID', + elementType: 'Eleman türü' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/tt.js b/static/assets/ckeditor/plugins/devtools/lang/tt.js new file mode 100644 index 0000000..bee7957 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/tt.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'tt', { + title: 'Элемент тасвирламасы', + dialogName: 'Диалог тәрәзәсе исеме', + tabName: 'Өстәмә бит исеме', + elementId: 'Элемент идентификаторы', + elementType: 'Элемент төре' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/ug.js b/static/assets/ckeditor/plugins/devtools/lang/ug.js new file mode 100644 index 0000000..4916338 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/ug.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'ug', { + title: 'ئېلېمېنت ئۇچۇرى', + dialogName: 'سۆزلەشكۈ كۆزنەك ئاتى', + tabName: 'Tab ئاتى', + elementId: 'ئېلېمېنت كىملىكى', + elementType: 'ئېلېمېنت تىپى' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/uk.js b/static/assets/ckeditor/plugins/devtools/lang/uk.js new file mode 100644 index 0000000..aa4f876 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/uk.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'uk', { + title: 'Відомості про Елемент', + dialogName: 'Заголовок діалогового вікна', + tabName: 'Назва вкладки', + elementId: 'Ідентифікатор Елемента', + elementType: 'Тип Елемента' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/vi.js b/static/assets/ckeditor/plugins/devtools/lang/vi.js new file mode 100644 index 0000000..ce67984 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/vi.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'vi', { + title: 'Thông tin thành ph', + dialogName: 'Tên hộp tho', + tabName: 'Tên th', + elementId: 'Mã thành ph', + elementType: 'Loại thành ph' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/zh-cn.js b/static/assets/ckeditor/plugins/devtools/lang/zh-cn.js new file mode 100644 index 0000000..8af11b1 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/zh-cn.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'zh-cn', { + title: '元素信息', + dialogName: '对话框窗口名称', + tabName: '选项卡名称', + elementId: '元素 ID', + elementType: '元素类型' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/lang/zh.js b/static/assets/ckeditor/plugins/devtools/lang/zh.js new file mode 100644 index 0000000..35b1637 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/lang/zh.js @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.setLang( 'devtools', 'zh', { + title: '元件資訊', + dialogName: '對話視窗名稱', + tabName: '標籤名稱', + elementId: '元件 ID', + elementType: '元件類型' +} ); diff --git a/static/assets/ckeditor/plugins/devtools/plugin.js b/static/assets/ckeditor/plugins/devtools/plugin.js new file mode 100644 index 0000000..b971c22 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/plugin.js @@ -0,0 +1,159 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.plugins.add( 'devtools', { + lang: 'ar,bg,ca,cs,cy,da,de,el,en,en-gb,eo,es,et,eu,fa,fi,fr,fr-ca,gl,gu,he,hr,hu,id,it,ja,km,ko,ku,lt,lv,nb,nl,no,pl,pt,pt-br,ru,si,sk,sl,sq,sv,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% + + init: function( editor ) { + editor._.showDialogDefinitionTooltips = 1; + }, + onLoad: function() { + CKEDITOR.document.appendStyleText( CKEDITOR.config.devtools_styles || '#cke_tooltip { padding: 5px; border: 2px solid #333; background: #ffffff }' + + '#cke_tooltip h2 { font-size: 1.1em; border-bottom: 1px solid; margin: 0; padding: 1px; }' + + '#cke_tooltip ul { padding: 0pt; list-style-type: none; }' ); + } +} ); + +( function() { + function defaultCallback( editor, dialog, element, tabName ) { + var lang = editor.lang.devtools, + link = '' + ( element ? element.type : 'content' ) + '', + str = '

    ' + lang.title + '

    ' + + '
      ' + + '
    • ' + lang.dialogName + ' : ' + dialog.getName() + '
    • ' + + '
    • ' + lang.tabName + ' : ' + tabName + '
    • '; + + if ( element ) + str += '
    • ' + lang.elementId + ' : ' + element.id + '
    • '; + + str += '
    • ' + lang.elementType + ' : ' + link + '
    • '; + + return str + '
    '; + } + + function showTooltip( callback, el, editor, dialog, obj, tabName ) { + var pos = el.getDocumentPosition(), + styles = { 'z-index': CKEDITOR.dialog._.currentZIndex + 10, top: ( pos.y + el.getSize( 'height' ) ) + 'px' }; + + tooltip.setHtml( callback( editor, dialog, obj, tabName ) ); + tooltip.show(); + + // Translate coordinate for RTL. + if ( editor.lang.dir == 'rtl' ) { + var viewPaneSize = CKEDITOR.document.getWindow().getViewPaneSize(); + styles.right = ( viewPaneSize.width - pos.x - el.getSize( 'width' ) ) + 'px'; + } else { + styles.left = pos.x + 'px'; + } + + tooltip.setStyles( styles ); + } + + var tooltip; + CKEDITOR.on( 'reset', function() { + tooltip && tooltip.remove(); + tooltip = null; + } ); + + CKEDITOR.on( 'dialogDefinition', function( evt ) { + var editor = evt.editor; + if ( editor._.showDialogDefinitionTooltips ) { + if ( !tooltip ) { + tooltip = CKEDITOR.dom.element.createFromHtml( '
    ', CKEDITOR.document ); + tooltip.hide(); + tooltip.on( 'mouseover', function() { + this.show(); + } ); + tooltip.on( 'mouseout', function() { + this.hide(); + } ); + tooltip.appendTo( CKEDITOR.document.getBody() ); + } + + var dialog = evt.data.definition.dialog, + callback = editor.config.devtools_textCallback || defaultCallback; + + dialog.on( 'load', function() { + var tabs = dialog.parts.tabs.getChildren(), + tab; + for ( var i = 0, len = tabs.count(); i < len; i++ ) { + tab = tabs.getItem( i ); + tab.on( 'mouseover', function() { + var id = this.$.id; + showTooltip( callback, this, editor, dialog, null, id.substring( 4, id.lastIndexOf( '_' ) ) ); + } ); + tab.on( 'mouseout', function() { + tooltip.hide(); + } ); + } + + dialog.foreach( function( obj ) { + if ( obj.type in { hbox: 1, vbox: 1 } ) + return; + + var el = obj.getElement(); + if ( el ) { + el.on( 'mouseover', function() { + showTooltip( callback, this, editor, dialog, obj, dialog._.currentTabId ); + } ); + el.on( 'mouseout', function() { + tooltip.hide(); + } ); + } + } ); + } ); + } + } ); +} )(); + +/** + * A function that returns the text to be displayed inside the Developer Tools + * tooltip when hovering over a dialog UI element. + * + * // This is actually the default value. + * // Show dialog window name, tab ID, and element ID. + * config.devtools_textCallback = function( editor, dialog, element, tabName ) { + * var lang = editor.lang.devtools, + * link = '' + ( element ? element.type : 'content' ) + '', + * str = + * '

    ' + lang.title + '

    ' + + * '
      ' + + * '
    • ' + lang.dialogName + ' : ' + dialog.getName() + '
    • ' + + * '
    • ' + lang.tabName + ' : ' + tabName + '
    • '; + * + * if ( element ) + * str += '
    • ' + lang.elementId + ' : ' + element.id + '
    • '; + * + * str += '
    • ' + lang.elementType + ' : ' + link + '
    • '; + * + * return str + '
    '; + * }; + * + * @since 3.6 + * @cfg {Function} [devtools_textCallback=see example] + * @member CKEDITOR.config + * @param {CKEDITOR.editor} editor + * @param dialog + * @param element + * @param tabName + */ + +/** + * A setting that stores CSS rules to be injected into the page with styles to be applied to the tooltip element. + * + * // This is actually the default value. + * CKEDITOR.config.devtools_styles = + * '#cke_tooltip { padding: 5px; border: 2px solid #333; background: #ffffff }' + + * '#cke_tooltip h2 { font-size: 1.1em; border-bottom: 1px solid; margin: 0; padding: 1px; }' + + * '#cke_tooltip ul { padding: 0pt; list-style-type: none; }'; + * + * @since 3.6 + * @cfg {String} [devtools_styles=see example] + * @member CKEDITOR.config + */ diff --git a/static/assets/ckeditor/plugins/devtools/samples/devtools.html b/static/assets/ckeditor/plugins/devtools/samples/devtools.html new file mode 100644 index 0000000..99dce62 --- /dev/null +++ b/static/assets/ckeditor/plugins/devtools/samples/devtools.html @@ -0,0 +1,83 @@ + + + + + + Using DevTools Plugin — CKEditor Sample + + + + + + + +

    + CKEditor Samples » Using the Developer Tools Plugin +

    +
    +

    + This sample shows how to configure CKEditor instances to use the + Developer Tools (devtools) plugin that displays + information about dialog window elements, including the name of the dialog window, + tab, and UI element. Please note that the tooltip also contains a link to the + CKEditor JavaScript API + documentation for each of the selected elements. +

    +

    + This plugin is aimed at developers who would like to customize their CKEditor + instances and create their own plugins. By default it is turned off; it is + usually useful to only turn it on in the development phase. Note that it works with + all CKEditor dialog windows, including the ones that were created by custom plugins. +

    +

    + To add a CKEditor instance using the devtools plugin, insert + the following JavaScript call into your code: +

    +
    +CKEDITOR.replace( 'textarea_id', {
    +	extraPlugins: 'devtools'
    +});
    +

    + Note that textarea_id in the code above is the id attribute of + the <textarea> element to be replaced with CKEditor. +

    +
    +
    +

    + + + +

    +

    + +

    +
    + + + diff --git a/static/assets/ckeditor/plugins/dialog/dialogDefinition.js b/static/assets/ckeditor/plugins/dialog/dialogDefinition.js new file mode 100644 index 0000000..525bb7a --- /dev/null +++ b/static/assets/ckeditor/plugins/dialog/dialogDefinition.js @@ -0,0 +1,4 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ diff --git a/static/assets/ckeditor/plugins/div/dialogs/div.js b/static/assets/ckeditor/plugins/div/dialogs/div.js new file mode 100644 index 0000000..a813a2a --- /dev/null +++ b/static/assets/ckeditor/plugins/div/dialogs/div.js @@ -0,0 +1,9 @@ +(function(){function p(a,k,o){if(!k.is||!k.getCustomData("block_processed"))k.is&&CKEDITOR.dom.element.setMarker(o,k,"block_processed",!0),a.push(k)}function n(a,k){function o(){this.foreach(function(a){if(/^(?!vbox|hbox)/.test(a.type)&&(a.setup||(a.setup=function(c){a.setValue(c.getAttribute(a.id)||"",1)}),!a.commit))a.commit=function(c){var g=this.getValue();a.id=="dir"&&c.getComputedStyle("direction")==g||(g?c.setAttribute(a.id,g):c.removeAttribute(a.id))}})}var n=function(){var f=CKEDITOR.tools.extend({}, +CKEDITOR.dtd.$blockLimit);a.config.div_wrapTable&&(delete f.td,delete f.th);return f}(),q=CKEDITOR.dtd.div,l={},m=[];return{title:a.lang.div.title,minWidth:400,minHeight:165,contents:[{id:"info",label:a.lang.common.generalTab,title:a.lang.common.generalTab,elements:[{type:"hbox",widths:["50%","50%"],children:[{id:"elementStyle",type:"select",style:"width: 100%;",label:a.lang.div.styleSelectLabel,"default":"",items:[[a.lang.common.notSet,""]],onChange:function(){var f=["info:elementStyle","info:class", +"advanced:dir","advanced:style"],c=this.getDialog(),g=c._element&&c._element.clone()||new CKEDITOR.dom.element("div",a.document);this.commit(g,!0);for(var f=[].concat(f),b=f.length,i,e=0;eb.length){var d=this._.walker.textNode;if(d)a.setStartAfter(d);else return null}else d=b[0],b=b[b.length-1],a.setStart(d.textNode,d.offset),a.setEnd(b.textNode,b.offset+1);return a},updateFromDomRange:function(a){var b=new l(a);this._.cursors=[];do a=b.next(),a.character&&this._.cursors.push(a); +while(a.character);this._.rangeLength=this._.cursors.length},setMatched:function(){this._.isMatched=!0},clearMatched:function(){this._.isMatched=!1},isMatched:function(){return this._.isMatched},highlight:function(){if(!(1>this._.cursors.length)){this._.highlightRange&&this.removeHighlight();var a=this.toDomRange(),b=a.createBookmark();t.applyToRange(a,c);a.moveToBookmark(b);this._.highlightRange=a;b=a.startContainer;b.type!=CKEDITOR.NODE_ELEMENT&&(b=b.getParent());b.scrollIntoView();this.updateFromDomRange(a)}}, +removeHighlight:function(){if(this._.highlightRange){var a=this._.highlightRange.createBookmark();t.removeFromRange(this._.highlightRange,c);this._.highlightRange.moveToBookmark(a);this.updateFromDomRange(this._.highlightRange);this._.highlightRange=null}},isReadOnly:function(){return!this._.highlightRange?0:this._.highlightRange.startContainer.isReadOnly()},moveBack:function(){var a=this._.walker.back(),b=this._.cursors;a.hitMatchBoundary&&(this._.cursors=b=[]);b.unshift(a);b.length>this._.rangeLength&& +b.pop();return a},moveNext:function(){var a=this._.walker.next(),b=this._.cursors;a.hitMatchBoundary&&(this._.cursors=b=[]);b.push(a);b.length>this._.rangeLength&&b.shift();return a},getEndCharacter:function(){var a=this._.cursors;return 1>a.length?null:a[a.length-1].character},getNextCharacterRange:function(a){var b,d;d=this._.cursors;d=(b=d[d.length-1])&&b.textNode?new l(n(b)):this._.walker;return new q(d,a)},getCursors:function(){return this._.cursors}};var v=function(a,b){var d=[-1];b&&(a=a.toLowerCase()); +for(var c=0;c=b||8192<=b&&8202>=b||z.test(a)},e={searchRange:null,matchRange:null,find:function(a,b,d,f,e,A){this.matchRange?(this.matchRange.removeHighlight(),this.matchRange=this.matchRange.getNextCharacterRange(a.length)):this.matchRange=new q(new l(this.searchRange),a.length);for(var i=new v(a,!b),j=0,k="%";null!==k;){for(this.matchRange.moveNext();k=this.matchRange.getEndCharacter();){j=i.feedCharacter(k);if(2==j)break;this.matchRange.moveNext().hitMatchBoundary&& +i.reset()}if(2==j){if(d){var h=this.matchRange.getCursors(),m=h[h.length-1],h=h[0],g=c.createRange();g.setStartAt(c.editable(),CKEDITOR.POSITION_AFTER_START);g.setEnd(h.textNode,h.offset);h=g;m=n(m);h.trim();m.trim();h=new l(h,!0);m=new l(m,!0);if(!w(h.back().character)||!w(m.next().character))continue}this.matchRange.setMatched();!1!==e&&this.matchRange.highlight();return!0}}this.matchRange.clearMatched();this.matchRange.removeHighlight();return f&&!A?(this.searchRange=p(1),this.matchRange=null, +arguments.callee.apply(this,Array.prototype.slice.call(arguments).concat([!0]))):!1},replaceCounter:0,replace:function(a,b,d,f,e,g,i){o=1;a=0;if(this.matchRange&&this.matchRange.isMatched()&&!this.matchRange._.isReplaced&&!this.matchRange.isReadOnly()){this.matchRange.removeHighlight();b=this.matchRange.toDomRange();d=c.document.createText(d);if(!i){var j=c.getSelection();j.selectRanges([b]);c.fire("saveSnapshot")}b.deleteContents();b.insertNode(d);i||(j.selectRanges([b]),c.fire("saveSnapshot")); +this.matchRange.updateFromDomRange(b);i||this.matchRange.highlight();this.matchRange._.isReplaced=!0;this.replaceCounter++;a=1}else a=this.find(b,f,e,g,!i);o=0;return a}},f=c.lang.find;return{title:f.title,resizable:CKEDITOR.DIALOG_RESIZE_NONE,minWidth:350,minHeight:170,buttons:[CKEDITOR.dialog.cancelButton(c,{label:c.lang.common.close})],contents:[{id:"find",label:f.find,title:f.find,accessKey:"",elements:[{type:"hbox",widths:["230px","90px"],children:[{type:"text",id:"txtFindFind",label:f.findWhat, +isChanged:!1,labelLayout:"horizontal",accessKey:"F"},{type:"button",id:"btnFind",align:"left",style:"width:100%",label:f.find,onClick:function(){var a=this.getDialog();e.find(a.getValueOf("find","txtFindFind"),a.getValueOf("find","txtFindCaseChk"),a.getValueOf("find","txtFindWordChk"),a.getValueOf("find","txtFindCyclic"))||alert(f.notFoundMsg)}}]},{type:"fieldset",label:CKEDITOR.tools.htmlEncode(f.findOptions),style:"margin-top:29px",children:[{type:"vbox",padding:0,children:[{type:"checkbox",id:"txtFindCaseChk", +isChanged:!1,label:f.matchCase},{type:"checkbox",id:"txtFindWordChk",isChanged:!1,label:f.matchWord},{type:"checkbox",id:"txtFindCyclic",isChanged:!1,"default":!0,label:f.matchCyclic}]}]}]},{id:"replace",label:f.replace,accessKey:"M",elements:[{type:"hbox",widths:["230px","90px"],children:[{type:"text",id:"txtFindReplace",label:f.findWhat,isChanged:!1,labelLayout:"horizontal",accessKey:"F"},{type:"button",id:"btnFindReplace",align:"left",style:"width:100%",label:f.replace,onClick:function(){var a= +this.getDialog();e.replace(a,a.getValueOf("replace","txtFindReplace"),a.getValueOf("replace","txtReplace"),a.getValueOf("replace","txtReplaceCaseChk"),a.getValueOf("replace","txtReplaceWordChk"),a.getValueOf("replace","txtReplaceCyclic"))||alert(f.notFoundMsg)}}]},{type:"hbox",widths:["230px","90px"],children:[{type:"text",id:"txtReplace",label:f.replaceWith,isChanged:!1,labelLayout:"horizontal",accessKey:"R"},{type:"button",id:"btnReplaceAll",align:"left",style:"width:100%",label:f.replaceAll,isChanged:!1, +onClick:function(){var a=this.getDialog();e.replaceCounter=0;e.searchRange=p(1);e.matchRange&&(e.matchRange.removeHighlight(),e.matchRange=null);for(c.fire("saveSnapshot");e.replace(a,a.getValueOf("replace","txtFindReplace"),a.getValueOf("replace","txtReplace"),a.getValueOf("replace","txtReplaceCaseChk"),a.getValueOf("replace","txtReplaceWordChk"),!1,!0););e.replaceCounter?(alert(f.replaceSuccessMsg.replace(/%1/,e.replaceCounter)),c.fire("saveSnapshot")):alert(f.notFoundMsg)}}]},{type:"fieldset", +label:CKEDITOR.tools.htmlEncode(f.findOptions),children:[{type:"vbox",padding:0,children:[{type:"checkbox",id:"txtReplaceCaseChk",isChanged:!1,label:f.matchCase},{type:"checkbox",id:"txtReplaceWordChk",isChanged:!1,label:f.matchWord},{type:"checkbox",id:"txtReplaceCyclic",isChanged:!1,"default":!0,label:f.matchCyclic}]}]}]}],onLoad:function(){var a=this,b,c=0;this.on("hide",function(){c=0});this.on("show",function(){c=1});this.selectPage=CKEDITOR.tools.override(this.selectPage,function(f){return function(e){f.call(a, +e);var g=a._.tabs[e],i;i="find"===e?"txtFindWordChk":"txtReplaceWordChk";b=a.getContentElement(e,"find"===e?"txtFindFind":"txtFindReplace");a.getContentElement(e,i);g.initialized||(CKEDITOR.document.getById(b._.inputId),g.initialized=!0);if(c){var j,e="find"===e?1:0,g=1-e,k,h=r.length;for(k=0;k",a.getDocument());p.setAttributes({name:h.name,value:l});1>a.getChildCount()?p.appendTo(a):p.insertBefore(a.getFirst())}break;case i:if(!b)continue;l=this.getValue();f||e&&l===h["default"]?b.removeAttribute(h.name):b.setAttribute(h.name,l)}}}for(var g=1,o=2,i=4,n={id:[{type:g,name:"id"}],classid:[{type:g, +name:"classid"}],codebase:[{type:g,name:"codebase"}],pluginspage:[{type:i,name:"pluginspage"}],src:[{type:o,name:"movie"},{type:i,name:"src"},{type:g,name:"data"}],name:[{type:i,name:"name"}],align:[{type:g,name:"align"}],"class":[{type:g,name:"class"},{type:i,name:"class"}],width:[{type:g,name:"width"},{type:i,name:"width"}],height:[{type:g,name:"height"},{type:i,name:"height"}],hSpace:[{type:g,name:"hSpace"},{type:i,name:"hSpace"}],vSpace:[{type:g,name:"vSpace"},{type:i,name:"vSpace"}],style:[{type:g, +name:"style"},{type:i,name:"style"}],type:[{type:i,name:"type"}]},m="play loop menu quality scale salign wmode bgcolor base flashvars allowScriptAccess allowFullScreen".split(" "),j=0;j"+CKEDITOR.tools.htmlEncode(a.lang.common.preview)+ +'
    ';return{title:a.lang.flash.title,minWidth:420,minHeight:310,onShow:function(){this.fakeImage=this.objectNode=this.embedNode=null;k=new CKEDITOR.dom.element("embed",a.document);var e=this.getSelectedElement();if(e&&e.data("cke-real-element-type")&&"flash"==e.data("cke-real-element-type")){this.fakeImage= +e;var d=a.restoreRealElement(e),h=null,b=null,c={};if("cke:object"==d.getName()){h=d;d=h.getElementsByTag("embed","cke");0",a.document),e.setAttributes({classid:"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000",codebase:"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"})),i)d=CKEDITOR.dom.element.createFromHtml("",a.document),d.setAttributes({type:"application/x-shockwave-flash",pluginspage:"http://www.macromedia.com/go/getflashplayer"}),e&&d.appendTo(e);if(e)for(var b={},c=e.getElementsByTag("param", +"cke"),f=0,j=c.count();f')};a.preview=a.getContentElement("info","preview").getElement().getChild(3);this.on("change",function(a){a.data&& +a.data.value&&b(a.data.value)});this.getInputElement().on("change",function(){b(this.getValue())},this)}},{type:"button",id:"browse",filebrowser:"info:src",hidden:!0,style:"display:inline-block;margin-top:14px;",label:a.lang.common.browseServer}]}]},{type:"hbox",widths:["25%","25%","25%","25%","25%"],children:[{type:"text",id:"width",requiredContent:"embed[width]",style:"width:95px",label:a.lang.common.width,validate:CKEDITOR.dialog.validate.htmlLength(a.lang.common.invalidHtmlLength.replace("%1", +a.lang.common.width)),setup:b,commit:c},{type:"text",id:"height",requiredContent:"embed[height]",style:"width:95px",label:a.lang.common.height,validate:CKEDITOR.dialog.validate.htmlLength(a.lang.common.invalidHtmlLength.replace("%1",a.lang.common.height)),setup:b,commit:c},{type:"text",id:"hSpace",requiredContent:"embed[hspace]",style:"width:95px",label:a.lang.flash.hSpace,validate:CKEDITOR.dialog.validate.integer(a.lang.flash.validateHSpace),setup:b,commit:c},{type:"text",id:"vSpace",requiredContent:"embed[vspace]", +style:"width:95px",label:a.lang.flash.vSpace,validate:CKEDITOR.dialog.validate.integer(a.lang.flash.validateVSpace),setup:b,commit:c}]},{type:"vbox",children:[{type:"html",id:"preview",style:"width:95%;",html:f}]}]},{id:"Upload",hidden:!0,filebrowser:"uploadButton",label:a.lang.common.upload,elements:[{type:"file",id:"upload",label:a.lang.common.upload,size:38},{type:"fileButton",id:"uploadButton",label:a.lang.common.uploadSubmit,filebrowser:"info:src","for":["Upload","upload"]}]},{id:"properties", +label:a.lang.flash.propertiesTab,elements:[{type:"hbox",widths:["50%","50%"],children:[{id:"scale",type:"select",requiredContent:"embed[scale]",label:a.lang.flash.scale,"default":"",style:"width : 100%;",items:[[a.lang.common.notSet,""],[a.lang.flash.scaleAll,"showall"],[a.lang.flash.scaleNoBorder,"noborder"],[a.lang.flash.scaleFit,"exactfit"]],setup:b,commit:c},{id:"allowScriptAccess",type:"select",requiredContent:"embed[allowscriptaccess]",label:a.lang.flash.access,"default":"",style:"width : 100%;", +items:[[a.lang.common.notSet,""],[a.lang.flash.accessAlways,"always"],[a.lang.flash.accessSameDomain,"samedomain"],[a.lang.flash.accessNever,"never"]],setup:b,commit:c}]},{type:"hbox",widths:["50%","50%"],children:[{id:"wmode",type:"select",requiredContent:"embed[wmode]",label:a.lang.flash.windowMode,"default":"",style:"width : 100%;",items:[[a.lang.common.notSet,""],[a.lang.flash.windowModeWindow,"window"],[a.lang.flash.windowModeOpaque,"opaque"],[a.lang.flash.windowModeTransparent,"transparent"]], +setup:b,commit:c},{id:"quality",type:"select",requiredContent:"embed[quality]",label:a.lang.flash.quality,"default":"high",style:"width : 100%;",items:[[a.lang.common.notSet,""],[a.lang.flash.qualityBest,"best"],[a.lang.flash.qualityHigh,"high"],[a.lang.flash.qualityAutoHigh,"autohigh"],[a.lang.flash.qualityMedium,"medium"],[a.lang.flash.qualityAutoLow,"autolow"],[a.lang.flash.qualityLow,"low"]],setup:b,commit:c}]},{type:"hbox",widths:["50%","50%"],children:[{id:"align",type:"select",requiredContent:"object[align]", +label:a.lang.common.align,"default":"",style:"width : 100%;",items:[[a.lang.common.notSet,""],[a.lang.common.alignLeft,"left"],[a.lang.flash.alignAbsBottom,"absBottom"],[a.lang.flash.alignAbsMiddle,"absMiddle"],[a.lang.flash.alignBaseline,"baseline"],[a.lang.common.alignBottom,"bottom"],[a.lang.common.alignMiddle,"middle"],[a.lang.common.alignRight,"right"],[a.lang.flash.alignTextTop,"textTop"],[a.lang.common.alignTop,"top"]],setup:b,commit:function(a,b,f,g,i){var j=this.getValue();c.apply(this,arguments); +j&&(i.align=j)}},{type:"html",html:"
    "}]},{type:"fieldset",label:CKEDITOR.tools.htmlEncode(a.lang.flash.flashvars),children:[{type:"vbox",padding:0,children:[{type:"checkbox",id:"menu",label:a.lang.flash.chkMenu,"default":!0,setup:b,commit:c},{type:"checkbox",id:"play",label:a.lang.flash.chkPlay,"default":!0,setup:b,commit:c},{type:"checkbox",id:"loop",label:a.lang.flash.chkLoop,"default":!0,setup:b,commit:c},{type:"checkbox",id:"allowFullScreen",label:a.lang.flash.chkFull,"default":!0, +setup:b,commit:c}]}]}]},{id:"advanced",label:a.lang.common.advancedTab,elements:[{type:"hbox",children:[{type:"text",id:"id",requiredContent:"object[id]",label:a.lang.common.id,setup:b,commit:c}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",id:"bgcolor",requiredContent:"embed[bgcolor]",label:a.lang.flash.bgcolor,setup:b,commit:c},{type:"text",id:"class",requiredContent:"embed(cke-xyz)",label:a.lang.common.cssClass,setup:b,commit:c}]},{type:"text",id:"style",requiredContent:"embed{cke-xyz}", +validate:CKEDITOR.dialog.validate.inlineStyle(a.lang.common.invalidInlineStyle),label:a.lang.common.cssStyle,setup:b,commit:c}]}]}})})(); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/flash/images/placeholder.png b/static/assets/ckeditor/plugins/flash/images/placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..0bc6caa7a6abca57d3f1e1376fbd5067d5cd66d0 GIT binary patch literal 256 zcmV+b0ssDqP)4p_Nnh8Sn%0^H2yKmXs_)2F ztJy_}S7x3Wy+9bua($h3aU$x8vL^9#zi)q&hjjO!f8h;)*e}{WeFK#M0000",d.document),b.copyAttributes(c,{type:1,checked:1}),c.replace(b),d.getSelection().selectElement(c),a.element=c)}else this.getValue()?b.setAttribute("checked","checked"):b.removeAttribute("checked")}}]}]}}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/forms/dialogs/form.js b/static/assets/ckeditor/plugins/forms/dialogs/form.js new file mode 100644 index 0000000..396baf5 --- /dev/null +++ b/static/assets/ckeditor/plugins/forms/dialogs/form.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("form",function(a){var d={action:1,id:1,method:1,enctype:1,target:1};return{title:a.lang.forms.form.title,minWidth:350,minHeight:200,onShow:function(){delete this.form;var b=this.getParentEditor().elementPath().contains("form",1);b&&(this.form=b,this.setupContent(b))},onOk:function(){var b,a=this.form,c=!a;c&&(b=this.getParentEditor(),a=b.document.createElement("form"),a.appendBogus());c&&b.insertElement(a);this.commitContent(a)},onLoad:function(){function a(b){this.setValue(b.getAttribute(this.id)|| +"")}function e(a){this.getValue()?a.setAttribute(this.id,this.getValue()):a.removeAttribute(this.id)}this.foreach(function(c){d[c.id]&&(c.setup=a,c.commit=e)})},contents:[{id:"info",label:a.lang.forms.form.title,title:a.lang.forms.form.title,elements:[{id:"txtName",type:"text",label:a.lang.common.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){this.getValue()?a.data("cke-saved-name",this.getValue()):(a.data("cke-saved-name", +!1),a.removeAttribute("name"))}},{id:"action",type:"text",label:a.lang.forms.form.action,"default":"",accessKey:"T"},{type:"hbox",widths:["45%","55%"],children:[{id:"id",type:"text",label:a.lang.common.id,"default":"",accessKey:"I"},{id:"enctype",type:"select",label:a.lang.forms.form.encoding,style:"width:100%",accessKey:"E","default":"",items:[[""],["text/plain"],["multipart/form-data"],["application/x-www-form-urlencoded"]]}]},{type:"hbox",widths:["45%","55%"],children:[{id:"target",type:"select", +label:a.lang.common.target,style:"width:100%",accessKey:"M","default":"",items:[[a.lang.common.notSet,""],[a.lang.common.targetNew,"_blank"],[a.lang.common.targetTop,"_top"],[a.lang.common.targetSelf,"_self"],[a.lang.common.targetParent,"_parent"]]},{id:"method",type:"select",label:a.lang.forms.form.method,accessKey:"M","default":"GET",items:[["GET","get"],["POST","post"]]}]}]}]}}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/forms/dialogs/hiddenfield.js b/static/assets/ckeditor/plugins/forms/dialogs/hiddenfield.js new file mode 100644 index 0000000..5d84a10 --- /dev/null +++ b/static/assets/ckeditor/plugins/forms/dialogs/hiddenfield.js @@ -0,0 +1,7 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("hiddenfield",function(d){return{title:d.lang.forms.hidden.title,hiddenField:null,minWidth:350,minHeight:110,onShow:function(){delete this.hiddenField;var a=this.getParentEditor(),b=a.getSelection(),c=b.getSelectedElement();c&&(c.data("cke-real-element-type")&&"hiddenfield"==c.data("cke-real-element-type"))&&(this.hiddenField=c,c=a.restoreRealElement(this.hiddenField),this.setupContent(c),b.selectElement(this.hiddenField))},onOk:function(){var a=this.getValueOf("info","_cke_saved_name"), +b=this.getParentEditor(),a=8>CKEDITOR.document.$.documentMode?'':"input",a=CKEDITOR.env.ie&&b.document.createElement(a);a.setAttribute("type","hidden");this.commitContent(a);a=b.createFakeElement(a,"cke_hidden","hiddenfield");this.hiddenField?(a.replace(this.hiddenField),b.getSelection().selectElement(a)):b.insertElement(a);return!0},contents:[{id:"info",label:d.lang.forms.hidden.title,title:d.lang.forms.hidden.title,elements:[{id:"_cke_saved_name",type:"text", +label:d.lang.forms.hidden.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){this.getValue()?a.setAttribute("name",this.getValue()):a.removeAttribute("name")}},{id:"value",type:"text",label:d.lang.forms.hidden.value,"default":"",accessKey:"V",setup:function(a){this.setValue(a.getAttribute("value")||"")},commit:function(a){this.getValue()?a.setAttribute("value",this.getValue()):a.removeAttribute("value")}}]}]}}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/forms/dialogs/radio.js b/static/assets/ckeditor/plugins/forms/dialogs/radio.js new file mode 100644 index 0000000..fd718f2 --- /dev/null +++ b/static/assets/ckeditor/plugins/forms/dialogs/radio.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("radio",function(d){return{title:d.lang.forms.checkboxAndRadio.radioTitle,minWidth:350,minHeight:140,onShow:function(){delete this.radioButton;var a=this.getParentEditor().getSelection().getSelectedElement();a&&("input"==a.getName()&&"radio"==a.getAttribute("type"))&&(this.radioButton=a,this.setupContent(a))},onOk:function(){var a,b=this.radioButton,c=!b;c&&(a=this.getParentEditor(),b=a.document.createElement("input"),b.setAttribute("type","radio"));c&&a.insertElement(b);this.commitContent({element:b})}, +contents:[{id:"info",label:d.lang.forms.checkboxAndRadio.radioTitle,title:d.lang.forms.checkboxAndRadio.radioTitle,elements:[{id:"name",type:"text",label:d.lang.common.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){a=a.element;this.getValue()?a.data("cke-saved-name",this.getValue()):(a.data("cke-saved-name",!1),a.removeAttribute("name"))}},{id:"value",type:"text",label:d.lang.forms.checkboxAndRadio.value,"default":"", +accessKey:"V",setup:function(a){this.setValue(a.getAttribute("value")||"")},commit:function(a){a=a.element;this.getValue()?a.setAttribute("value",this.getValue()):a.removeAttribute("value")}},{id:"checked",type:"checkbox",label:d.lang.forms.checkboxAndRadio.selected,"default":"",accessKey:"S",value:"checked",setup:function(a){this.setValue(a.getAttribute("checked"))},commit:function(a){var b=a.element;if(CKEDITOR.env.ie){var c=b.getAttribute("checked"),e=!!this.getValue();c!=e&&(c=CKEDITOR.dom.element.createFromHtml('",d.document),b.copyAttributes(c,{type:1,checked:1}),c.replace(b),d.getSelection().selectElement(c),a.element=c)}else this.getValue()?b.setAttribute("checked","checked"):b.removeAttribute("checked")}}]}]}}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/forms/dialogs/select.js b/static/assets/ckeditor/plugins/forms/dialogs/select.js new file mode 100644 index 0000000..b78f847 --- /dev/null +++ b/static/assets/ckeditor/plugins/forms/dialogs/select.js @@ -0,0 +1,20 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("select",function(c){function h(a,b,e,d,c){a=f(a);d=d?d.createElement("OPTION"):document.createElement("OPTION");if(a&&d&&"option"==d.getName())CKEDITOR.env.ie?(isNaN(parseInt(c,10))?a.$.options.add(d.$):a.$.options.add(d.$,c),d.$.innerHTML=0c?0:c).insertBeforeMe(d):a.append(d),d.setText(0b)return!1;a=a.getChild(b);a.setText(e);a.setValue(d);return a}function k(a){for(a=f(a);a.getChild(0)&&a.getChild(0).remove(););}function j(a,b,e){var a=f(a),d=g(a);if(0>d)return!1;b=d+b;b=0>b?0:b;b=b>=a.getChildCount()?a.getChildCount()-1:b;if(d==b)return!1;var d=a.getChild(d),c=d.getText(),o=d.getValue();d.remove();d=h(a,c,o,!e?null:e,b);i(a,b);return d}function g(a){return(a=f(a))?a.$.selectedIndex:-1} +function i(a,b){a=f(a);if(0>b)return null;var e=a.getChildren().count();a.$.selectedIndex=b>=e?e-1:b;return a}function l(a){return(a=f(a))?a.getChildren():!1}function f(a){return a&&a.domId&&a.getInputElement().$?a.getInputElement():a&&a.$?a:!1}return{title:c.lang.forms.select.title,minWidth:CKEDITOR.env.ie?460:395,minHeight:CKEDITOR.env.ie?320:300,onShow:function(){delete this.selectBox;this.setupContent("clear");var a=this.getParentEditor().getSelection().getSelectedElement();if(a&&"select"==a.getName()){this.selectBox= +a;this.setupContent(a.getName(),a);for(var a=l(a),b=0;b"+CKEDITOR.tools.htmlEncode(c.lang.forms.select.lines)+""}]},{type:"html",html:""+CKEDITOR.tools.htmlEncode(c.lang.forms.select.opAvail)+""},{type:"hbox",widths:["115px", +"115px","100px"],children:[{type:"vbox",children:[{id:"txtOptName",type:"text",label:c.lang.forms.select.opText,style:"width:115px",setup:function(a){"clear"==a&&this.setValue("")}},{type:"select",id:"cmbName",label:"",title:"",size:5,style:"width:115px;height:75px",items:[],onChange:function(){var a=this.getDialog(),b=a.getContentElement("info","cmbValue"),e=a.getContentElement("info","txtOptName"),a=a.getContentElement("info","txtOptValue"),d=g(this);i(b,d);e.setValue(this.getValue());a.setValue(b.getValue())}, +setup:function(a,b){"clear"==a?k(this):"option"==a&&h(this,b.getText(),b.getText(),this.getDialog().getParentEditor().document)},commit:function(a){var b=this.getDialog(),e=l(this),d=l(b.getContentElement("info","cmbValue")),c=b.getContentElement("info","txtValue").getValue();k(a);for(var f=0;f',b.document),c.copyAttributes(d,{type:1}),d.replace(c),a.element=d)}else c.setAttribute("type",this.getValue())}}]}]}}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/forms/images/hiddenfield.gif b/static/assets/ckeditor/plugins/forms/images/hiddenfield.gif new file mode 100644 index 0000000000000000000000000000000000000000..953f643b60032c36ac92590950577c336f133512 GIT binary patch literal 105 zcmZ?wbhEHb6lM@&n8?8JABg_{Z)j*>U|`SzVg`^n1Cx_W&+?fM`5zlEy44+e;LbT+ zkH8h7N-kQ@I;_|Q}>&=&Wsxvt_U!{00zr0#2QD@sN HCI)K&$9F25 literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/hidecont/dialogs/hidecont.js b/static/assets/ckeditor/plugins/hidecont/dialogs/hidecont.js new file mode 100644 index 0000000..548f80a --- /dev/null +++ b/static/assets/ckeditor/plugins/hidecont/dialogs/hidecont.js @@ -0,0 +1,56 @@ +(function() { + function nl2br(content){ + return content.replace(/\n/g, "
    ") + } + CKEDITOR.dialog.add("hidecont", + function(edt) { + // Size adjustments. + var size = CKEDITOR.document.getWindow().getViewPaneSize(), + // Make it maximum 800px wide, but still fully visible in the viewport. + width = Math.min( size.width - 70, 800 ), + // Make it use 2/3 of the viewport height. + height = size.height / 1.5, + + clientHeight = document.documentElement.clientHeight ; + + // Low resolution settings. + if ( clientHeight < 650 ) { + height = clientHeight - 220; + } + return { + title: "插入隐藏内容", + resizable: CKEDITOR.DIALOG_RESIZE_NONE, + minHeight: 200, + contents: [{ + id: "hidecont", + elements: [ + { + id: 'code', + type: 'textarea', + label: "插入隐藏内容,若插入隐藏内容,那么收费主题将只针对隐藏内容收费,其他部分公开。", + setup: function( widget ) { + this.setValue( widget.data.code ); + }, + commit: function( widget ) { + widget.setData( 'code', this.getValue() ); + }, + inputStyle: 'cursor:auto;' + + 'width:' + width + 'px;' + + 'height:' + height + 'px;' + + 'tab-size:4;' + + 'text-align:left;resize:auto;margin-top:5px;', + 'class': 'cke_source' + } + ] + }], + + onOk: function() { + var content = this.getValueOf('hidecont', 'code'); + content = CKEDITOR.tools.htmlEncode(content); + content = nl2br(content); + edt.insertHtml("[hide]
    "+content+"
    [/hide]"); + } + + } + }) +})(); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/hidecont/hidden.png b/static/assets/ckeditor/plugins/hidecont/hidden.png new file mode 100644 index 0000000000000000000000000000000000000000..6c5a5baa4d522b1d9c6d9428d5e67f7197d7e24c GIT binary patch literal 1025 zcmV+c1pfPpP)zd#?eO>H>h|;X{QUj?)7Hz<FdSA!%>6ElDg@-yS>)h?xVu(mY}KS@cpZ{*z)@StE{hugn{psQ<0I9 z`1<{stJ6Mcx{9>sXO-QZyX~EwophAi;_Uj)&(QSQXoR8Q;^p+>if*x^!BlPlFa_#=IUjs=ic4koVDDRmzdt)@~+3~`s}fcr`6fw@R+sa zw9D$r)ag%8Q0VRXs>k$tq1*F)4z|bchqh@(aLy($&FYJ;;c0=gm7vVa z)$lfs+Bi5kz*->Q==ZyHQb$>+^woT?u&>h8*zEZ7`>#y1(ekRq?B}eR_0?GWbXZzi zT2_P?ld|Kw%H^oW-+xswATGfhx0jeC$+-m zUteFt+Vr5n=w6W8=jrFPw6wX~{cNTQ^2Dy1J>w=zF*TtBoUCTbF0B>W7xYd&BH}s^L{k(Lg}uYTuXZ*}ZGp|M%$Wd(sNuiR zxAgS%MQ*OHuCA!S>eir9dZ+0?dh4sJm-P7ksk!Nkq2xGp*ZW8xWPU{K@7LSs_>iiF z%F4=LjojYk_w&!m>daS}&XMo{0004WQchCb+kheHW=1s|* ziKKlg>6ByyxCELE|E7TPhtjwW5B)dQ$d2ZbjMs!d#O_Y5yKZv@{a}8_zBNdUB^FKQ v4%+#YQImFS3Xi^6e;+=Umg`(y#r>lf3=a(nWSQ8P00000NkvXXu0mjfKd)pe literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/hidecont/plugin.js b/static/assets/ckeditor/plugins/hidecont/plugin.js new file mode 100644 index 0000000..e98ec05 --- /dev/null +++ b/static/assets/ckeditor/plugins/hidecont/plugin.js @@ -0,0 +1,19 @@ +(function() { + CKEDITOR.plugins.add("hidecont", { + requires: "dialog,widget", + init: function(a) { + a.addCommand("hidecont", new CKEDITOR.dialogCommand("hidecont")); + a.ui.addButton("Hidecont", { + label: "插入隐藏内容",//调用dialog时显示的名称 + command: "hidecont", + icon: this.path + "hidden.png"//在toolbar中的图标 + }); + + }, + onLoad: function() { + CKEDITOR.dialog.add( "hidecont", this.path + "dialogs/hidecont.js"); + } + + }); + +})(); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/icons.png b/static/assets/ckeditor/plugins/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..1ec992d9220ecaf92dd8b8f462ad43b0eaef2f8a GIT binary patch literal 20833 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 literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/icons_hidpi.png b/static/assets/ckeditor/plugins/icons_hidpi.png new file mode 100644 index 0000000000000000000000000000000000000000..6e103c05f11690fe3f9fd56dbd67205b58d7e90d GIT binary patch literal 67753 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 z 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 literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/iframe/dialogs/iframe.js b/static/assets/ckeditor/plugins/iframe/dialogs/iframe.js new file mode 100644 index 0000000..db7ecbb --- /dev/null +++ b/static/assets/ckeditor/plugins/iframe/dialogs/iframe.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function c(b){var c=this instanceof CKEDITOR.ui.dialog.checkbox;b.hasAttribute(this.id)&&(b=b.getAttribute(this.id),c?this.setValue(e[this.id]["true"]==b.toLowerCase()):this.setValue(b))}function d(b){var c=""===this.getValue(),a=this instanceof CKEDITOR.ui.dialog.checkbox,d=this.getValue();c?b.removeAttribute(this.att||this.id):a?b.setAttribute(this.id,e[this.id][d]):b.setAttribute(this.att||this.id,d)}var e={scrolling:{"true":"yes","false":"no"},frameborder:{"true":"1","false":"0"}}; +CKEDITOR.dialog.add("iframe",function(b){var f=b.lang.iframe,a=b.lang.common,e=b.plugins.dialogadvtab;return{title:f.title,minWidth:350,minHeight:260,onShow:function(){this.fakeImage=this.iframeNode=null;var a=this.getSelectedElement();a&&(a.data("cke-real-element-type")&&"iframe"==a.data("cke-real-element-type"))&&(this.fakeImage=a,this.iframeNode=a=b.restoreRealElement(a),this.setupContent(a))},onOk:function(){var a;a=this.fakeImage?this.iframeNode:new CKEDITOR.dom.element("iframe");var c={},d= +{};this.commitContent(a,c,d);a=b.createFakeElement(a,"cke_iframe","iframe",!0);a.setAttributes(d);a.setStyles(c);this.fakeImage?(a.replace(this.fakeImage),b.getSelection().selectElement(a)):b.insertElement(a)},contents:[{id:"info",label:a.generalTab,accessKey:"I",elements:[{type:"vbox",padding:0,children:[{id:"src",type:"text",label:a.url,required:!0,validate:CKEDITOR.dialog.validate.notEmpty(f.noUrl),setup:c,commit:d}]},{type:"hbox",children:[{id:"width",type:"text",requiredContent:"iframe[width]", +style:"width:100%",labelLayout:"vertical",label:a.width,validate:CKEDITOR.dialog.validate.htmlLength(a.invalidHtmlLength.replace("%1",a.width)),setup:c,commit:d},{id:"height",type:"text",requiredContent:"iframe[height]",style:"width:100%",labelLayout:"vertical",label:a.height,validate:CKEDITOR.dialog.validate.htmlLength(a.invalidHtmlLength.replace("%1",a.height)),setup:c,commit:d},{id:"align",type:"select",requiredContent:"iframe[align]","default":"",items:[[a.notSet,""],[a.alignLeft,"left"],[a.alignRight, +"right"],[a.alignTop,"top"],[a.alignMiddle,"middle"],[a.alignBottom,"bottom"]],style:"width:100%",labelLayout:"vertical",label:a.align,setup:function(a,b){c.apply(this,arguments);if(b){var d=b.getAttribute("align");this.setValue(d&&d.toLowerCase()||"")}},commit:function(a,b,c){d.apply(this,arguments);this.getValue()&&(c.align=this.getValue())}}]},{type:"hbox",widths:["50%","50%"],children:[{id:"scrolling",type:"checkbox",requiredContent:"iframe[scrolling]",label:f.scrolling,setup:c,commit:d},{id:"frameborder", +type:"checkbox",requiredContent:"iframe[frameborder]",label:f.border,setup:c,commit:d}]},{type:"hbox",widths:["50%","50%"],children:[{id:"name",type:"text",requiredContent:"iframe[name]",label:a.name,setup:c,commit:d},{id:"title",type:"text",requiredContent:"iframe[title]",label:a.advisoryTitle,setup:c,commit:d}]},{id:"longdesc",type:"text",requiredContent:"iframe[longdesc]",label:a.longDescr,setup:c,commit:d}]},e&&e.createAdvancedTab(b,{id:1,classes:1,styles:1},"iframe")]}})})(); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/iframe/images/placeholder.png b/static/assets/ckeditor/plugins/iframe/images/placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..4af09565523acc4a8416b138be66ecca52a4782b GIT binary patch literal 265 zcmV+k0rvihP)XkV883J!H|K$G7!NmbG+#X$bL;o)Z z2G-x)N-|gt|HAb}?!Vz{?gSsK(*G1M`2U|Un|r|=kl~yoK0@(G'+c.lang.image.lockRatio+''+c.lang.image.resetSize+""}]},{type:"vbox",padding:1,children:[{type:"text",id:"txtBorder",requiredContent:"img{border-width}", +width:"60px",label:c.lang.image.border,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateBorder),setup:function(a,b){if(a==f){var d;d=(d=(d=b.getStyle("border-width"))&&d.match(/^(\d+px)(?: \1 \1 \1)?$/))&&parseInt(d[1],10);isNaN(parseInt(d,10))&&(d=b.getAttribute("border"));this.setValue(d)}},commit:function(a,b,d){var c=parseInt(this.getValue(),10);a==f||4==a?(isNaN(c)?!c&& +this.isChanged()&&b.removeStyle("border"):(b.setStyle("border-width",CKEDITOR.tools.cssLength(c)),b.setStyle("border-style","solid")),!d&&a==f&&b.removeAttribute("border")):8==a&&(b.removeAttribute("border"),b.removeStyle("border-width"),b.removeStyle("border-style"),b.removeStyle("border-color"))}},{type:"text",id:"txtHSpace",requiredContent:"img{margin-left,margin-right}",width:"60px",label:c.lang.image.hSpace,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this, +"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateHSpace),setup:function(a,b){if(a==f){var d,c;d=b.getStyle("margin-left");c=b.getStyle("margin-right");d=d&&d.match(o);c=c&&c.match(o);d=parseInt(d,10);c=parseInt(c,10);d=d==c&&d;isNaN(parseInt(d,10))&&(d=b.getAttribute("hspace"));this.setValue(d)}},commit:function(a,b,d){var c=parseInt(this.getValue(),10);a==f||4==a?(isNaN(c)?!c&&this.isChanged()&&(b.removeStyle("margin-left"),b.removeStyle("margin-right")): +(b.setStyle("margin-left",CKEDITOR.tools.cssLength(c)),b.setStyle("margin-right",CKEDITOR.tools.cssLength(c))),!d&&a==f&&b.removeAttribute("hspace")):8==a&&(b.removeAttribute("hspace"),b.removeStyle("margin-left"),b.removeStyle("margin-right"))}},{type:"text",id:"txtVSpace",requiredContent:"img{margin-top,margin-bottom}",width:"60px",label:c.lang.image.vSpace,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateVSpace), +setup:function(a,b){if(a==f){var c,e;c=b.getStyle("margin-top");e=b.getStyle("margin-bottom");c=c&&c.match(o);e=e&&e.match(o);c=parseInt(c,10);e=parseInt(e,10);c=c==e&&c;isNaN(parseInt(c,10))&&(c=b.getAttribute("vspace"));this.setValue(c)}},commit:function(a,b,c){var e=parseInt(this.getValue(),10);a==f||4==a?(isNaN(e)?!e&&this.isChanged()&&(b.removeStyle("margin-top"),b.removeStyle("margin-bottom")):(b.setStyle("margin-top",CKEDITOR.tools.cssLength(e)),b.setStyle("margin-bottom",CKEDITOR.tools.cssLength(e))), +!c&&a==f&&b.removeAttribute("vspace")):8==a&&(b.removeAttribute("vspace"),b.removeStyle("margin-top"),b.removeStyle("margin-bottom"))}},{id:"cmbAlign",requiredContent:"img{float}",type:"select",widths:["35%","65%"],style:"width:90px",label:c.lang.common.align,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.alignLeft,"left"],[c.lang.common.alignRight,"right"]],onChange:function(){g(this.getDialog());i.call(this,"advanced:txtdlgGenStyle")},setup:function(a,b){if(a==f){var c=b.getStyle("float"); +switch(c){case "inherit":case "none":c=""}!c&&(c=(b.getAttribute("align")||"").toLowerCase());this.setValue(c)}},commit:function(a,b,c){var e=this.getValue();if(a==f||4==a){if(e?b.setStyle("float",e):b.removeStyle("float"),!c&&a==f)switch(e=(b.getAttribute("align")||"").toLowerCase(),e){case "left":case "right":b.removeAttribute("align")}}else 8==a&&b.removeStyle("float")}}]}]},{type:"vbox",height:"250px",children:[{type:"html",id:"htmlPreview",style:"width:95%;",html:"
    "+CKEDITOR.tools.htmlEncode(c.lang.common.preview)+ +'
    '+(c.config.image_previewText||"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas feugiat consequat diam. Maecenas metus. Vivamus diam purus, cursus a, commodo non, facilisis vitae, nulla. Aenean dictum lacinia tortor. Nunc iaculis, nibh non iaculis aliquam, orci felis euismod neque, sed ornare massa mauris sed velit. Nulla pretium mi et risus. Fusce mi pede, tempor id, cursus ac, ullamcorper nec, enim. Sed tortor. Curabitur molestie. Duis velit augue, condimentum at, ultrices a, luctus ut, orci. Donec pellentesque egestas eros. Integer cursus, augue in cursus faucibus, eros pede bibendum sem, in tempus tellus justo quis ligula. Etiam eget tortor. Vestibulum rutrum, est ut placerat elementum, lectus nisl aliquam velit, tempor aliquam eros nunc nonummy metus. In eros metus, gravida a, gravida sed, lobortis id, turpis. Ut ultrices, ipsum at venenatis fringilla, sem nulla lacinia tellus, eget aliquet turpis mauris non enim. Nam turpis. Suspendisse lacinia. Curabitur ac tortor ut ipsum egestas elementum. Nunc imperdiet gravida mauris.")+ +"
    "}]}]}]},{id:"Link",requiredContent:"a[href]",label:c.lang.image.linkTab,padding:0,elements:[{id:"txtUrl",type:"text",label:c.lang.common.url,style:"width: 100%","default":"",setup:function(a,b){if(2==a){var c=b.data("cke-saved-href");c||(c=b.getAttribute("href"));this.setValue(c)}},commit:function(a,b){if(2==a&&(this.getValue()||this.isChanged())){var d=this.getValue();b.data("cke-saved-href",d);b.setAttribute("href",d);if(this.getValue()||!c.config.image_removeLinkByEmptyURL)this.getDialog().addLink= +!0}}},{type:"button",id:"browse",filebrowser:{action:"Browse",target:"Link:txtUrl",url:c.config.filebrowserImageBrowseLinkUrl},style:"float:right",hidden:!0,label:c.lang.common.browseServer},{id:"cmbTarget",type:"select",requiredContent:"a[target]",label:c.lang.common.target,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.targetNew,"_blank"],[c.lang.common.targetTop,"_top"],[c.lang.common.targetSelf,"_self"],[c.lang.common.targetParent,"_parent"]],setup:function(a,b){2==a&&this.setValue(b.getAttribute("target")|| +"")},commit:function(a,b){2==a&&(this.getValue()||this.isChanged())&&b.setAttribute("target",this.getValue())}}]},{id:"Upload",hidden:!0,filebrowser:"uploadButton",label:c.lang.image.upload,elements:[{type:"file",id:"upload",label:c.lang.image.btnUpload,style:"height:40px",size:38},{type:"fileButton",id:"uploadButton",filebrowser:"info:txtUrl",label:c.lang.image.btnUpload,"for":["Upload","upload"]}]},{id:"advanced",label:c.lang.common.advancedTab,elements:[{type:"hbox",widths:["50%","25%","25%"], +children:[{type:"text",id:"linkId",requiredContent:"img[id]",label:c.lang.common.id,setup:function(a,b){a==f&&this.setValue(b.getAttribute("id"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("id",this.getValue())}},{id:"cmbLangDir",type:"select",requiredContent:"img[dir]",style:"width : 100px;",label:c.lang.common.langDir,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.langDirLtr,"ltr"],[c.lang.common.langDirRtl,"rtl"]],setup:function(a,b){a==f&&this.setValue(b.getAttribute("dir"))}, +commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("dir",this.getValue())}},{type:"text",id:"txtLangCode",requiredContent:"img[lang]",label:c.lang.common.langCode,"default":"",setup:function(a,b){a==f&&this.setValue(b.getAttribute("lang"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("lang",this.getValue())}}]},{type:"text",id:"txtGenLongDescr",requiredContent:"img[longdesc]",label:c.lang.common.longDescr,setup:function(a,b){a==f&&this.setValue(b.getAttribute("longDesc"))}, +commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("longDesc",this.getValue())}},{type:"hbox",widths:["50%","50%"],children:[{type:"text",id:"txtGenClass",requiredContent:"img(cke-xyz)",label:c.lang.common.cssClass,"default":"",setup:function(a,b){a==f&&this.setValue(b.getAttribute("class"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("class",this.getValue())}},{type:"text",id:"txtGenTitle",requiredContent:"img[title]",label:c.lang.common.advisoryTitle, +"default":"",onChange:function(){g(this.getDialog())},setup:function(a,b){a==f&&this.setValue(b.getAttribute("title"))},commit:function(a,b){a==f?(this.getValue()||this.isChanged())&&b.setAttribute("title",this.getValue()):4==a?b.setAttribute("title",this.getValue()):8==a&&b.removeAttribute("title")}}]},{type:"text",id:"txtdlgGenStyle",requiredContent:"img{cke-xyz}",label:c.lang.common.cssStyle,validate:CKEDITOR.dialog.validate.inlineStyle(c.lang.common.invalidInlineStyle),"default":"",setup:function(a, +b){if(a==f){var c=b.getAttribute("style");!c&&b.$.style.cssText&&(c=b.$.style.cssText);this.setValue(c);var e=b.$.style.height,c=b.$.style.width,e=(e?e:"").match(k),c=(c?c:"").match(k);this.attributesInStyle={height:!!e,width:!!c}}},onChange:function(){i.call(this,"info:cmbFloat info:cmbAlign info:txtVSpace info:txtHSpace info:txtBorder info:txtWidth info:txtHeight".split(" "));g(this)},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("style",this.getValue())}}]}]}}; +CKEDITOR.dialog.add("image",function(c){return r(c,"image")});CKEDITOR.dialog.add("imagebutton",function(c){return r(c,"imagebutton")})})(); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/image/images/noimage.png b/static/assets/ckeditor/plugins/image/images/noimage.png new file mode 100644 index 0000000000000000000000000000000000000000..159811305af7fc78662a53949f9c62bd702785af GIT binary patch literal 2115 zcmV-J2)y@+P)Ho>++t$jfPmRaN!?~<++bkXLqpg`M%qnH+*(@WuCC*= zv+nTj+f!5FhKAvZiQ<}?-*EHQt|a&q5ubK|eC;+&k} zgoNRWitg>}4K<ekfk+}q{E#Me7J>(bHOVPWE?rr?K%;Dm(Xm6h64Q}6Nb*FHY!#>MR6-{6IX-+X-I z%F5>4+~J3Z;f00e!NKCVxZ<&~;;O3SqN3ugtl@%!iP1e z;;ydZ#KhvOtLC({;-aGCtgP(Y+2*ma)hMx z+uH5p;oyjf;E9RksHoz~%Hqq*FIou1*CnBt3z=eoJ#jg8})n&6C#;Ej#qx3}JMbKrV7tBO*{xtyZfK3kwUxgN0tN*J@X6OH7P%ba6R|MjaCq zA3fCS^trNaG^w6x&h;0X}?rKOdWz!A`Z9|xkD8K>f`UV#Y?778OHBSXx=QYf4d zoK}L{Q!~*TtJJk6Fh&?D5QJPX2q1&OfL$*X3k0A6uYHxe2KBE^0~AtRv$6lS_4Mtw zjmdb8w%ey$-|jzKQydZk_OE`ld4h0VagD&R{(3`^$bu@IvWz|F(np;w+L$1T|t*mx13G3-F40Aw`c@9 zL2Z;#D6&TC32e8>&v@;sZF2I)mdogy^|n{%#!lK$`8FOL+{->kqn*o!Q&9ZdT8hya zJJ)vob|e5rp^%1ahwoV6vbpfmrNU;DyYo|7C5b{g9~)~xp8^}MtSyt#I%b%psG&iG zJBt||G?}cda+pLp|0#Mv83t8ePNQkM%(Af1?7Hn1&|J&A%4#b~576<-vaWL11-=d% zjn3E4Bu&oGSEtcv9DHfzU9xYFqYbj3X$xMyvzk620x(KK`!SZ(ByE*QR@b!~_Z6C8;XY$~ zUEONQDrvnAqx;eCz@ACxt*$HG6s>%H00x>89eAybjwzilk+fp83w8hb?EbuE^JAhJ z4EY}FF(BrSQGb)G7>tXRo_^U^P?TAn+Y1rHE_ zni#6(xk`Dp*RS@tv%k3M@Zn7t&6_X1D#9_UszMSrI*i%%e-j6MXo5XJ>^opYKB$zvO6U3O$0= z3qz|IC~Lr`ua^};XHRw(6BB$8(H!zg5bq|pvFFeuV5s|YG-%VelSQAyCZv#&k664V zAt7N4cG)c!6Me{hf)g7X>XnP+d$Dm&DP%HHygT2`jc3lyEx$laRFL^?xRj&toe^}W zHa;0GEXa4`dHDM?hdMhuhnW8UJfP3tD98k-IT0*xQ~{2_R}dFsjM>TMT3T{AmK;ki zcZli18~1!6BBy|?LIZR*fvg}FjN^S6;&M40&uLiiJvkf>m&x=PS74Iv$cEj9I}aw8 z3u^H!bBh8Q6YMezoAmY&mQ&3gCl6I1WNV$>{I@G?DfCd0dk^LaeL t9L{?@PmZPK& + + + + + Widget Drag & Drop with Lineutils — CKEditor Sample + + + + + + +

    + CKEditor Samples » Widget Drag & Drop with Lineutils +

    + +

    Classic (iframe-based) Editor

    + + + +

    Inline Editor

    + +
    + + + + + + + + + + + + + + + +
    This tableis thevery firstelement of the document.
    We are stillable to accesthe space before it. + + + + + + + + + +
    This table is inside of a cell of another table.
    We can type either before or after it though.
    +
    + +
    +
    +
      +
    1. This numbered list...
    2. +
    3. ...is a neighbour of a horizontal line...
    4. +
    5. +
        +
      1. Nested list!
      2. +
      +
    6. +
    + +
    Saturn V +
    Roll out of Saturn V on launch pad
    +
    + +
      +
    • We can type between the lists...
    • +
    • ...thanks to Magicline.
    • +
    + +

    Lorem ipsum dolor sit amet dui. Morbi vel turpis. Nullam et leo. Etiam rutrum, urna tellus dui vel tincidunt mattis egestas, justo fringilla vel, massa. Phasellus.

    + +

    Quisque iaculis, dui lectus varius vitae, tortor. Proin lacus. Pellentesque ac lacus. Aenean nonummy commodo nec, pede. Etiam blandit risus elit.

    + +

    Ut pretium. Vestibulum rutrum in, adipiscing elit. Sed in quam in purus sem vitae pede. Pellentesque bibendum, urna sem vel risus. Vivamus posuere metus. Aliquam gravida iaculis nisl. Nam enim. Aliquam erat ac lacus tellus ac felis.

    + +
    +

    This text is wrapped in a DIV element. We can type after this element though.

    +
    +
    + + + + + + diff --git a/static/assets/ckeditor/plugins/lineutils/dev/magicfinger.html b/static/assets/ckeditor/plugins/lineutils/dev/magicfinger.html new file mode 100644 index 0000000..72cc28e --- /dev/null +++ b/static/assets/ckeditor/plugins/lineutils/dev/magicfinger.html @@ -0,0 +1,285 @@ + + + + + + Lineutils — CKEditor Sample + + + + +

    + CKEditor Samples » Lineutils +

    + +

    Classic (iframe-based) Editor

    + + + +

    Inline Editor

    + +
    + + + + + + + + + + + + + + + +
    This tableis thevery firstelement of the document.
    We are stillable to accesthe space before it. + + + + + + + + + +
    This table is inside of a cell of another table.
    We can type either before or after it though.
    +
    + +

    Two succesive horizontal lines (HR tags). We can access the space in between:

    + +
    +
    +
      +
    1. This numbered list...
    2. +
    3. ...is a neighbour of a horizontal line...
    4. +
    5. +
        +
      1. Nested list!
      2. +
      +
    6. +
    + +
      +
    • We can type between the lists...
    • +
    • ...thanks to Magicline.
    • +
    + +

    Lorem ipsum dolor sit amet dui. Morbi vel turpis. Nullam et leo. Etiam rutrum, urna tellus dui vel tincidunt mattis egestas, justo fringilla vel, massa. Phasellus.

    + +

    Quisque iaculis, dui lectus varius vitae, tortor. Proin lacus. Pellentesque ac lacus. Aenean nonummy commodo nec, pede. Etiam blandit risus elit.

    + +

    Ut pretium. Vestibulum rutrum in, adipiscing elit. Sed in quam in purus sem vitae pede. Pellentesque bibendum, urna sem vel risus. Vivamus posuere metus. Aliquam gravida iaculis nisl. Nam enim. Aliquam erat ac lacus tellus ac felis.

    + +
    +

    This text is wrapped in a DIV element. We can type after this element though.

    +
    +
    + +

    Extreme inline

    + +
    +
    Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies. Curabitur et ligula. Ut molestie a, ultricies porta urna. Vestibulum commodo volutpat a, convallis ac, laoreet enim.
    +
    + Position static +
    foo
    +
    +
    +
    Key
    Value
    +
    +
    Whatever
    +
    +

    Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies

    +
    +
    +

    Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies

    +
    foo
    +
    + +

    Classic (iframe-based) Editor, H-scroll

    + + + + + + + + diff --git a/static/assets/ckeditor/plugins/lineutils/plugin.js b/static/assets/ckeditor/plugins/lineutils/plugin.js new file mode 100644 index 0000000..95c740d --- /dev/null +++ b/static/assets/ckeditor/plugins/lineutils/plugin.js @@ -0,0 +1,935 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + + /** + * @fileOverview A set of utilities to find and make horizontal spaces in edited contents. + */ + +'use strict'; + +( function() { + + CKEDITOR.plugins.add( 'lineutils' ); + + /** + * Determines a position relative to an element in DOM (before). + * + * @readonly + * @property {Number} [=0] + * @member CKEDITOR + */ + CKEDITOR.LINEUTILS_BEFORE = 1; + + /** + * Determines a position relative to an element in DOM (after). + * + * @readonly + * @property {Number} [=2] + * @member CKEDITOR + */ + CKEDITOR.LINEUTILS_AFTER = 2; + + /** + * Determines a position relative to an element in DOM (inside). + * + * @readonly + * @property {Number} [=4] + * @member CKEDITOR + */ + CKEDITOR.LINEUTILS_INSIDE = 4; + + /** + * An utility that traverses DOM tree and discovers elements + * (relations) matching user-defined lookups. + * + * @private + * @class CKEDITOR.plugins.lineutils.finder + * @constructor Creates a Finder class instance. + * @param {CKEDITOR.editor} editor Editor instance that Finder belongs to. + * @param {Object} def Finder's definition. + * @since 4.3 + */ + function Finder( editor, def ) { + CKEDITOR.tools.extend( this, { + editor: editor, + editable: editor.editable(), + doc: editor.document, + win: editor.window + }, def, true ); + + this.inline = this.editable.isInline(); + if ( !this.inline ) + this.frame = this.win.getFrame(); + this.target = this[ this.inline ? 'editable' : 'doc' ]; + } + + Finder.prototype = { + /** + * Initializes searching for elements with every mousemove event fired. + * To stop searching use {@link #stop}. + * + * @param {Function} [callback] Function executed on every iteration. + */ + start: function( callback ) { + var that = this, + editor = this.editor, + doc = this.doc, + el, x, y; + + var moveBuffer = CKEDITOR.tools.eventsBuffer( 50, function() { + if ( editor.readOnly || editor.mode != 'wysiwyg' ) + return; + + that.relations = {}; + + el = new CKEDITOR.dom.element( doc.$.elementFromPoint( x, y ) ); + + that.traverseSearch( el ); + + if ( !isNaN( x + y ) ) + that.pixelSearch( el, x, y ); + + callback && callback( that.relations, x, y ); + } ); + + // Searching starting from element from point on mousemove. + this.listener = this.editable.attachListener( this.target, 'mousemove', function( evt ) { + x = evt.data.$.clientX; + y = evt.data.$.clientY; + + moveBuffer.input(); + } ); + + this.editable.attachListener( this.inline ? this.editable : this.frame, 'mouseout', function() { + moveBuffer.reset(); + } ); + }, + + /** + * Stops observing mouse events attached by {@link #start}. + */ + stop: function() { + if ( this.listener ) + this.listener.removeListener(); + }, + + /** + * Returns a range representing the relation, according to its element + * and type. + * + * @param {Object} location Location containing unique identifier and type. + * @returns {CKEDITOR.dom.range} Range representing the relation. + */ + getRange: ( function() { + var where = {}; + + where[ CKEDITOR.LINEUTILS_BEFORE ] = CKEDITOR.POSITION_BEFORE_START; + where[ CKEDITOR.LINEUTILS_AFTER ] = CKEDITOR.POSITION_AFTER_END; + where[ CKEDITOR.LINEUTILS_INSIDE ] = CKEDITOR.POSITION_AFTER_START; + + return function( location ) { + var range = this.editor.createRange(); + + range.moveToPosition( this.relations[ location.uid ].element, where[ location.type ] ); + + return range; + }; + } )(), + + /** + * Stores given relation in {@link #relations} object. Processes the relation + * to normalize and avoid duplicates. + * + * @param {CKEDITOR.dom.element} el Element of the relation. + * @param {Number} type Relation, one of `CKEDITOR.LINEUTILS_AFTER`, `CKEDITOR.LINEUTILS_BEFORE`, `CKEDITOR.LINEUTILS_INSIDE`. + */ + store: ( function() { + function merge( el, type, relations ) { + var uid = el.getUniqueId(); + + if ( uid in relations ) + relations[ uid ].type |= type; + else + relations[ uid ] = { element: el, type: type }; + } + + return function( el, type ) { + var alt; + + // Normalization to avoid duplicates: + // CKEDITOR.LINEUTILS_AFTER becomes CKEDITOR.LINEUTILS_BEFORE of el.getNext(). + if ( is( type, CKEDITOR.LINEUTILS_AFTER ) && isStatic( alt = el.getNext() ) && alt.isVisible() ) { + merge( alt, CKEDITOR.LINEUTILS_BEFORE, this.relations ); + type ^= CKEDITOR.LINEUTILS_AFTER; + } + + // Normalization to avoid duplicates: + // CKEDITOR.LINEUTILS_INSIDE becomes CKEDITOR.LINEUTILS_BEFORE of el.getFirst(). + if ( is( type, CKEDITOR.LINEUTILS_INSIDE ) && isStatic( alt = el.getFirst() ) && alt.isVisible() ) { + merge( alt, CKEDITOR.LINEUTILS_BEFORE, this.relations ); + type ^= CKEDITOR.LINEUTILS_INSIDE; + } + + merge( el, type, this.relations ); + }; + } )(), + + /** + * Traverses DOM tree towards root, checking all ancestors + * with lookup rules, avoiding duplicates. Stores positive relations + * in {@link #relations} object. + * + * @param {CKEDITOR.dom.element} el Element which is the starting point. + */ + traverseSearch: function( el ) { + var l, type, uid; + + // Go down DOM towards root (or limit). + do { + uid = el.$[ 'data-cke-expando' ]; + + // This element was already visited and checked. + if ( uid && uid in this.relations ) + continue; + + if ( el.equals( this.editable ) ) + return; + + if ( isStatic( el ) ) { + // Collect all addresses yielded by lookups for that element. + for ( l in this.lookups ) { + + if ( ( type = this.lookups[ l ]( el ) ) ) + this.store( el, type ); + } + } + } while ( !isLimit( el ) && ( el = el.getParent() ) ); + }, + + /** + * Iterates vertically pixel-by-pixel within given element starting + * from given coordinates, searching for elements in the neighbourhood. + * Once an element is found it is processed by {@link #traverseSearch}. + * + * @param {CKEDITOR.dom.element} el Element which is the starting point. + * @param {Number} [x] Horizontal mouse coordinate relative to the viewport. + * @param {Number} [y] Vertical mouse coordinate relative to the viewport. + */ + pixelSearch: ( function() { + var contains = CKEDITOR.env.ie || CKEDITOR.env.webkit ? + function( el, found ) { + return el.contains( found ); + } + : + function( el, found ) { + return !!( el.compareDocumentPosition( found ) & 16 ); + }; + + // Iterates pixel-by-pixel from starting coordinates, moving by defined + // step and getting elementFromPoint in every iteration. Iteration stops when: + // * A valid element is found. + // * Condition function returns false (i.e. reached boundaries of viewport). + // * No element is found (i.e. coordinates out of viewport). + // * Element found is ascendant of starting element. + // + // @param {Object} doc Native DOM document. + // @param {Object} el Native DOM element. + // @param {Number} xStart Horizontal starting coordinate to use. + // @param {Number} yStart Vertical starting coordinate to use. + // @param {Number} step Step of the algorithm. + // @param {Function} condition A condition relative to current vertical coordinate. + function iterate( el, xStart, yStart, step, condition ) { + var y = yStart, + tryouts = 0, + found; + + while ( condition( y ) ) { + y += step; + + // If we try and we try, and still nothing's found, let's end + // that party. + if ( ++tryouts == 25 ) + return; + + found = this.doc.$.elementFromPoint( xStart, y ); + + // Nothing found. This is crazy... but... + // It might be that a line, which is in different document, + // covers that pixel (elementFromPoint is doc-sensitive). + // Better let's have another try. + if ( !found ) + continue; + + // Still in the same element. + else if ( found == el ) { + tryouts = 0; + continue; + } + + // Reached the edge of an element and found an ancestor or... + // A line, that covers that pixel. Better let's have another try. + else if ( !contains( el, found ) ) { + continue; + } + + tryouts = 0; + + // Found a valid element. Stop iterating. + if ( isStatic( ( found = new CKEDITOR.dom.element( found ) ) ) ) + return found; + } + } + + return function( el, x, y ) { + var paneHeight = this.win.getViewPaneSize().height, + + // Try to find an element iterating *up* from the starting point. + neg = iterate.call( this, el.$, x, y, -1, function( y ) { + return y > 0; + } ), + + // Try to find an element iterating *down* from the starting point. + pos = iterate.call( this, el.$, x, y, 1, function( y ) { + return y < paneHeight; + } ); + + if ( neg ) { + this.traverseSearch( neg ); + + // Iterate towards DOM root until neg is a direct child of el. + while ( !neg.getParent().equals( el ) ) + neg = neg.getParent(); + } + + if ( pos ) { + this.traverseSearch( pos ); + + // Iterate towards DOM root until pos is a direct child of el. + while ( !pos.getParent().equals( el ) ) + pos = pos.getParent(); + } + + // Iterate forwards starting from neg and backwards from + // pos to harvest all children of el between those elements. + // Stop when neg and pos meet each other or there's none of them. + // TODO (?) reduce number of hops forwards/backwards. + while ( neg || pos ) { + if ( neg ) + neg = neg.getNext( isStatic ); + + if ( !neg || neg.equals( pos ) ) + break; + + this.traverseSearch( neg ); + + if ( pos ) + pos = pos.getPrevious( isStatic ); + + if ( !pos || pos.equals( neg ) ) + break; + + this.traverseSearch( pos ); + } + }; + } )(), + + /** + * Unline {@link #traverseSearch}, it collects **all** elements from editable's DOM tree + * and runs lookups for every one of them, collecting relations. + * + * @returns {Object} {@link #relations}. + */ + greedySearch: function() { + this.relations = {}; + + var all = this.editable.getElementsByTag( '*' ), + i = 0, + el, type, l; + + while ( ( el = all.getItem( i++ ) ) ) { + // Don't consider editable, as it might be inline, + // and i.e. checking it's siblings is pointless. + if ( el.equals( this.editable ) ) + continue; + + // Don't visit non-editable internals, for example widget's + // guts (above wrapper, below nested). Still check editable limits, + // as they are siblings with editable contents. + if ( !el.hasAttribute( 'contenteditable' ) && el.isReadOnly() ) + continue; + + if ( isStatic( el ) && el.isVisible() ) { + // Collect all addresses yielded by lookups for that element. + for ( l in this.lookups ) { + if ( ( type = this.lookups[ l ]( el ) ) ) + this.store( el, type ); + } + } + } + + return this.relations; + } + + /** + * Relations express elements in DOM that match user-defined {@link #lookups}. + * Every relation has its own `type` that determines whether + * it refers to the space before, after or inside of `element`. + * This object stores relations found by {@link #traverseSearch} or {@link #greedySearch}, structured + * in the following way: + * + * relations: { + * // Unique identifier of the element. + * Number: { + * // Element of this relation. + * element: {@link CKEDITOR.dom.element} + * // Conjunction of CKEDITOR.LINEUTILS_BEFORE, CKEDITOR.LINEUTILS_AFTER and CKEDITOR.LINEUTILS_INSIDE. + * type: Number + * }, + * ... + * } + * + * @property {Object} relations + * @readonly + */ + + /** + * A set of user-defined functions used by Finder to check if an element + * is a valid relation, belonging to {@link #relations}. + * When the criterion is met, lookup returns a logical conjunction of `CKEDITOR.LINEUTILS_BEFORE`, + * `CKEDITOR.LINEUTILS_AFTER` or `CKEDITOR.LINEUTILS_INSIDE`. + * + * Lookups are passed along with Finder's definition. + * + * lookups: { + * 'some lookup': function( el ) { + * if ( someCondition ) + * return CKEDITOR.LINEUTILS_BEFORE; + * }, + * ... + * } + * + * @property {Object} lookups + */ + }; + + + /** + * An utility that analyses relations found by + * CKEDITOR.plugins.lineutils.finder and locates them + * in the viewport as horizontal lines of specific coordinates. + * + * @private + * @class CKEDITOR.plugins.lineutils.locator + * @constructor Creates a Locator class instance. + * @param {CKEDITOR.editor} editor Editor instance that Locator belongs to. + * @since 4.3 + */ + function Locator( editor, def ) { + CKEDITOR.tools.extend( this, def, { + editor: editor + }, true ); + } + + Locator.prototype = { + /** + * Localizes Y coordinate for all types of every single relation and stores + * them in the object. + * + * @param {Object} relations {@link CKEDITOR.plugins.lineutils.finder#relations}. + * @returns {Object} {@link #locations}. + */ + locate: ( function() { + function locateSibling( rel, type ) { + var sib = rel.element[ type === CKEDITOR.LINEUTILS_BEFORE ? 'getPrevious' : 'getNext' ](); + + // Return the middle point between siblings. + if ( sib && isStatic( sib ) ) { + rel.siblingRect = sib.getClientRect(); + + if ( type == CKEDITOR.LINEUTILS_BEFORE ) + return ( rel.siblingRect.bottom + rel.elementRect.top ) / 2; + else + return ( rel.elementRect.bottom + rel.siblingRect.top ) / 2; + } + + // If there's no sibling, use the edge of an element. + else { + if ( type == CKEDITOR.LINEUTILS_BEFORE ) + return rel.elementRect.top; + else + return rel.elementRect.bottom; + } + } + + return function( relations ) { + var rel; + + this.locations = {}; + + for ( var uid in relations ) { + rel = relations[ uid ]; + rel.elementRect = rel.element.getClientRect(); + + if ( is( rel.type, CKEDITOR.LINEUTILS_BEFORE ) ) + this.store( uid, CKEDITOR.LINEUTILS_BEFORE, locateSibling( rel, CKEDITOR.LINEUTILS_BEFORE ) ); + + if ( is( rel.type, CKEDITOR.LINEUTILS_AFTER ) ) + this.store( uid, CKEDITOR.LINEUTILS_AFTER, locateSibling( rel, CKEDITOR.LINEUTILS_AFTER ) ); + + // The middle point of the element. + if ( is( rel.type, CKEDITOR.LINEUTILS_INSIDE ) ) + this.store( uid, CKEDITOR.LINEUTILS_INSIDE, ( rel.elementRect.top + rel.elementRect.bottom ) / 2 ); + } + + return this.locations; + }; + } )(), + + /** + * Calculates distances from every location to given vertical coordinate + * and sorts locations according to that distance. + * + * @param {Number} y The vertical coordinate used for sorting, used as a reference. + * @param {Number} [howMany] Determines the number "closest locations" to be returned. + * @returns {Array} Sorted, array representation of {@link #locations}. + */ + sort: ( function() { + var locations, sorted, + dist, i; + + function distance( y, uid, type ) { + return Math.abs( y - locations[ uid ][ type ] ); + } + + return function( y, howMany ) { + locations = this.locations; + sorted = []; + + for ( var uid in locations ) { + for ( var type in locations[ uid ] ) { + dist = distance( y, uid, type ); + + // An array is empty. + if ( !sorted.length ) + sorted.push( { uid: +uid, type: type, dist: dist } ); + else { + // Sort the array on fly when it's populated. + for ( i = 0; i < sorted.length; i++ ) { + if ( dist < sorted[ i ].dist ) { + sorted.splice( i, 0, { uid: +uid, type: type, dist: dist } ); + break; + } + } + + // Nothing was inserted, so the distance is bigger than + // any of already calculated: push to the end. + if ( i == sorted.length ) + sorted.push( { uid: +uid, type: type, dist: dist } ); + } + } + } + + if ( typeof howMany != 'undefined' ) + return sorted.slice( 0, howMany ); + else + return sorted; + }; + } )(), + + /** + * Stores the location in a collection. + * + * @param {Number} uid Unique identifier of the relation. + * @param {Number} type One of `CKEDITOR.LINEUTILS_BEFORE`, `CKEDITOR.LINEUTILS_AFTER` and `CKEDITOR.LINEUTILS_INSIDE`. + * @param {Number} y Vertical position of the relation. + */ + store: function( uid, type, y ) { + if ( !this.locations[ uid ] ) + this.locations[ uid ] = {}; + + this.locations[ uid ][ type ] = y; + } + + /** + * @readonly + * @property {Object} locations + */ + }; + + var tipCss = { + display: 'block', + width: '0px', + height: '0px', + 'border-color': 'transparent', + 'border-style': 'solid', + position: 'absolute', + top: '-6px' + }, + + lineStyle = { + height: '0px', + 'border-top': '1px dashed red', + position: 'absolute', + 'z-index': 9999 + }, + + lineTpl = + '
    ' + + ' ' + + ' ' + + '
    '; + + /** + * An utility that draws horizontal lines in DOM according to locations + * returned by CKEDITOR.plugins.lineutils.locator. + * + * @private + * @class CKEDITOR.plugins.lineutils.liner + * @constructor Creates a Liner class instance. + * @param {CKEDITOR.editor} editor Editor instance that Liner belongs to. + * @param {Object} def Liner's definition. + * @since 4.3 + */ + function Liner( editor, def ) { + var editable = editor.editable(); + + CKEDITOR.tools.extend( this, { + editor: editor, + editable: editable, + doc: editor.document, + win: editor.window, + container: CKEDITOR.document.getBody(), + winTop: CKEDITOR.document.getWindow() + }, def, true ); + + this.hidden = {}; + this.visible = {}; + + this.inline = editable.isInline(); + + if ( !this.inline ) + this.frame = this.win.getFrame(); + + this.queryViewport(); + + // Callbacks must be wrapped. Otherwise they're not attached + // to global DOM objects (i.e. topmost window) for every editor + // because they're treated as duplicates. They belong to the + // same prototype shared among Liner instances. + var queryViewport = CKEDITOR.tools.bind( this.queryViewport, this ), + hideVisible = CKEDITOR.tools.bind( this.hideVisible, this ), + removeAll = CKEDITOR.tools.bind( this.removeAll, this ); + + editable.attachListener( this.winTop, 'resize', queryViewport ); + editable.attachListener( this.winTop, 'scroll', queryViewport ); + + editable.attachListener( this.winTop, 'resize', hideVisible ); + editable.attachListener( this.win, 'scroll', hideVisible ); + + editable.attachListener( this.inline ? editable : this.frame, 'mouseout', function( evt ) { + var x = evt.data.$.clientX, + y = evt.data.$.clientY; + + this.queryViewport(); + + // Check if mouse is out of the element (iframe/editable). + if ( x <= this.rect.left || x >= this.rect.right || y <= this.rect.top || y >= this.rect.bottom ) + this.hideVisible(); + + // Check if mouse is out of the top-window vieport. + if ( x <= 0 || x >= this.winTopPane.width || y <= 0 || y >= this.winTopPane.height ) + this.hideVisible(); + }, this ); + + editable.attachListener( editor, 'resize', queryViewport ); + editable.attachListener( editor, 'mode', removeAll ); + editor.on( 'destroy', removeAll ); + + this.lineTpl = new CKEDITOR.template( lineTpl ).output( { + lineStyle: CKEDITOR.tools.writeCssText( + CKEDITOR.tools.extend( {}, lineStyle, this.lineStyle, true ) + ), + tipLeftStyle: CKEDITOR.tools.writeCssText( + CKEDITOR.tools.extend( {}, tipCss, { + left: '0px', + 'border-left-color': 'red', + 'border-width': '6px 0 6px 6px' + }, this.tipCss, this.tipLeftStyle, true ) + ), + tipRightStyle: CKEDITOR.tools.writeCssText( + CKEDITOR.tools.extend( {}, tipCss, { + right: '0px', + 'border-right-color': 'red', + 'border-width': '6px 6px 6px 0' + }, this.tipCss, this.tipRightStyle, true ) + ) + } ); + } + + Liner.prototype = { + /** + * Permanently removes all lines (both hidden and visible) from DOM. + */ + removeAll: function() { + var l; + + for ( l in this.hidden ) { + this.hidden[ l ].remove(); + delete this.hidden[ l ]; + } + + for ( l in this.visible ) { + this.visible[ l ].remove(); + delete this.visible[ l ]; + } + }, + + /** + * Hides a given line. + * + * @param {CKEDITOR.dom.element} line The line to be hidden. + */ + hideLine: function( line ) { + var uid = line.getUniqueId(); + + line.hide(); + + this.hidden[ uid ] = line; + delete this.visible[ uid ]; + }, + + /** + * Shows a given line. + * + * @param {CKEDITOR.dom.element} line The line to be shown. + */ + showLine: function( line ) { + var uid = line.getUniqueId(); + + line.show(); + + this.visible[ uid ] = line; + delete this.hidden[ uid ]; + }, + + /** + * Hides all visible lines. + */ + hideVisible: function() { + for ( var l in this.visible ) + this.hideLine( this.visible[ l ] ); + }, + + /** + * Shows a line at given location. + * + * @param {Object} location Location object containing unique identifier of the relation + * and its type. Usually returned by {@link CKEDITOR.plugins.lineutils.locator#sort}. + * @param {Function} [callback] A callback to be called once the line is shown. + */ + placeLine: function( location, callback ) { + var styles, line, l; + + // No style means that line would be out of viewport. + if ( !( styles = this.getStyle( location.uid, location.type ) ) ) + return; + + // Search for any visible line of a different hash first. + // It's faster to re-position visible line than to show it. + for ( l in this.visible ) { + if ( this.visible[ l ].getCustomData( 'hash' ) !== this.hash ) { + line = this.visible[ l ]; + break; + } + } + + // Search for any hidden line of a different hash. + if ( !line ) { + for ( l in this.hidden ) { + if ( this.hidden[ l ].getCustomData( 'hash' ) !== this.hash ) { + this.showLine( ( line = this.hidden[ l ] ) ); + break; + } + } + } + + // If no line available, add the new one. + if ( !line ) + this.showLine( ( line = this.addLine() ) ); + + // Mark the line with current hash. + line.setCustomData( 'hash', this.hash ); + + // Mark the line as visible. + this.visible[ line.getUniqueId() ] = line; + + line.setStyles( styles ); + + callback && callback( line ); + }, + + /** + * Creates style set to be used by the line, representing a particular + * relation (location). + * + * @param {Number} uid Unique identifier of the relation. + * @param {Number} type Type of the relation. + * @returns {Object} An object containing styles. + */ + getStyle: function( uid, type ) { + var rel = this.relations[ uid ], + loc = this.locations[ uid ][ type ], + styles = {}, + hdiff; + + // Line should be between two elements. + if ( rel.siblingRect ) + styles.width = Math.max( rel.siblingRect.width, rel.elementRect.width ); + // Line is relative to a single element. + else + styles.width = rel.elementRect.width; + + // Let's calculate the vertical position of the line. + if ( this.inline ) + styles.top = loc + this.winTopScroll.y; + else + styles.top = this.rect.top + this.winTopScroll.y + loc; + + // Check if line would be vertically out of the viewport. + if ( styles.top - this.winTopScroll.y < this.rect.top || styles.top - this.winTopScroll.y > this.rect.bottom ) + return false; + + // Now let's calculate the horizontal alignment (left and width). + if ( this.inline ) + styles.left = rel.elementRect.left; + else { + if ( rel.elementRect.left > 0 ) + styles.left = this.rect.left + rel.elementRect.left; + + // H-scroll case. Left edge of element may be out of viewport. + else { + styles.width += rel.elementRect.left; + styles.left = this.rect.left; + } + + // H-scroll case. Right edge of element may be out of viewport. + if ( ( hdiff = styles.left + styles.width - ( this.rect.left + this.winPane.width ) ) > 0 ) + styles.width -= hdiff; + } + + // Finally include horizontal scroll of the global window. + styles.left += this.winTopScroll.x; + + // Append 'px' to style values. + for ( var style in styles ) + styles[ style ] = CKEDITOR.tools.cssLength( styles[ style ] ); + + return styles; + }, + + /** + * Adds a new line to DOM. + * + * @returns {CKEDITOR.dom.element} A brand-new line. + */ + addLine: function() { + var line = CKEDITOR.dom.element.createFromHtml( this.lineTpl ); + + line.appendTo( this.container ); + + return line; + }, + + /** + * Assigns an unique hash to the instance that is later utilized + * to tell unwanted lines from new ones. This method **must** be called + * before a new set of relations is to be visualized so {@link #cleanup} + * eventually hides obsolete lines. This is because lines + * are re-used between {@link #placeLine} calls and the number of + * necessary ones may vary according to the number of relations. + * + * @param {Object} relations {@link CKEDITOR.plugins.lineutils.finder#relations}. + * @param {Object} locations {@link CKEDITOR.plugins.lineutils.locator#locations}. + */ + prepare: function( relations, locations ) { + this.relations = relations; + this.locations = locations; + this.hash = Math.random(); + }, + + /** + * Hides all visible lines that don't belong to current hash + * and no-longer represent relations (locations). + * + * See also: {@link #prepare}. + */ + cleanup: function() { + var line; + + for ( var l in this.visible ) { + line = this.visible[ l ]; + + if ( line.getCustomData( 'hash' ) !== this.hash ) + this.hideLine( line ); + } + }, + + /** + * Queries dimensions of the viewport, editable, frame etc. + * that are used for correct positioning of the line. + */ + queryViewport: function() { + this.winPane = this.win.getViewPaneSize(); + this.winTopScroll = this.winTop.getScrollPosition(); + this.winTopPane = this.winTop.getViewPaneSize(); + + if ( this.inline ) + this.rect = this.editable.getClientRect(); + else + this.rect = this.frame.getClientRect(); + } + }; + + function is( type, flag ) { + return type & flag; + } + + var floats = { left: 1, right: 1, center: 1 }, + positions = { absolute: 1, fixed: 1 }; + + function isElement( node ) { + return node && node.type == CKEDITOR.NODE_ELEMENT; + } + + function isFloated( el ) { + return !!( floats[ el.getComputedStyle( 'float' ) ] || floats[ el.getAttribute( 'align' ) ] ); + } + + function isPositioned( el ) { + return !!positions[ el.getComputedStyle( 'position' ) ]; + } + + function isLimit( node ) { + return isElement( node ) && node.getAttribute( 'contenteditable' ) == 'true'; + } + + function isStatic( node ) { + return isElement( node ) && !isFloated( node ) && !isPositioned( node ); + } + + /** + * Global namespace holding definitions and global helpers for the lineutils plugin. + * + * @private + * @class + * @singleton + * @since 4.3 + */ + CKEDITOR.plugins.lineutils = { + finder: Finder, + locator: Locator, + liner: Liner + }; +} )(); diff --git a/static/assets/ckeditor/plugins/link/dialogs/anchor.js b/static/assets/ckeditor/plugins/link/dialogs/anchor.js new file mode 100644 index 0000000..f5fe2ea --- /dev/null +++ b/static/assets/ckeditor/plugins/link/dialogs/anchor.js @@ -0,0 +1,7 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("anchor",function(c){function d(a,b){return a.createFakeElement(a.document.createElement("a",{attributes:b}),"cke_anchor","anchor")}return{title:c.lang.link.anchor.title,minWidth:300,minHeight:60,onOk:function(){var a=CKEDITOR.tools.trim(this.getValueOf("info","txtName")),a={id:a,name:a,"data-cke-saved-name":a};if(this._.selectedElement)this._.selectedElement.data("cke-realelement")?(a=d(c,a),a.replace(this._.selectedElement),CKEDITOR.env.ie&&c.getSelection().selectElement(a)): +this._.selectedElement.setAttributes(a);else{var b=c.getSelection(),b=b&&b.getRanges()[0];b.collapsed?(a=d(c,a),b.insertNode(a)):(CKEDITOR.env.ie&&9>CKEDITOR.env.version&&(a["class"]="cke_anchor"),a=new CKEDITOR.style({element:"a",attributes:a}),a.type=CKEDITOR.STYLE_INLINE,c.applyStyle(a))}},onHide:function(){delete this._.selectedElement},onShow:function(){var a=c.getSelection(),b=a.getSelectedElement(),d=b&&b.data("cke-realelement"),e=d?CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,b):CKEDITOR.plugins.link.getSelectedLink(c); +e&&(this._.selectedElement=e,this.setValueOf("info","txtName",e.data("cke-saved-name")||""),!d&&a.selectElement(e),b&&(this._.selectedElement=b));this.getContentElement("info","txtName").focus()},contents:[{id:"info",label:c.lang.link.anchor.title,accessKey:"I",elements:[{type:"text",id:"txtName",label:c.lang.link.anchor.name,required:!0,validate:function(){return!this.getValue()?(alert(c.lang.link.anchor.errorName),!1):!0}}]}]}}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/link/dialogs/link.js b/static/assets/ckeditor/plugins/link/dialogs/link.js new file mode 100644 index 0000000..3ee3209 --- /dev/null +++ b/static/assets/ckeditor/plugins/link/dialogs/link.js @@ -0,0 +1,26 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){CKEDITOR.dialog.add("link",function(g){var l=CKEDITOR.plugins.link,m=function(){var a=this.getDialog(),b=a.getContentElement("target","popupFeatures"),a=a.getContentElement("target","linkTargetName"),k=this.getValue();if(b&&a)switch(b=b.getElement(),b.hide(),a.setValue(""),k){case "frame":a.setLabel(g.lang.link.targetFrameName);a.getElement().show();break;case "popup":b.show();a.setLabel(g.lang.link.targetPopupName);a.getElement().show();break;default:a.setValue(k),a.getElement().hide()}}, +f=function(a){a.target&&this.setValue(a.target[this.id]||"")},h=function(a){a.advanced&&this.setValue(a.advanced[this.id]||"")},i=function(a){a.target||(a.target={});a.target[this.id]=this.getValue()||""},j=function(a){a.advanced||(a.advanced={});a.advanced[this.id]=this.getValue()||""},c=g.lang.common,b=g.lang.link,d;return{title:b.title,minWidth:350,minHeight:230,contents:[{id:"info",label:b.info,title:b.info,elements:[{id:"linkType",type:"select",label:b.type,"default":"url",items:[[b.toUrl,"url"], +[b.toAnchor,"anchor"],[b.toEmail,"email"]],onChange:function(){var a=this.getDialog(),b=["urlOptions","anchorOptions","emailOptions"],k=this.getValue(),e=a.definition.getContents("upload"),e=e&&e.hidden;"url"==k?(g.config.linkShowTargetTab&&a.showPage("target"),e||a.showPage("upload")):(a.hidePage("target"),e||a.hidePage("upload"));for(e=0;e'+CKEDITOR.tools.htmlEncode(b.noAnchors)+"",focus:!0,setup:function(){this.getElement()[d&&d.length?"hide":"show"]()}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().hide()}},{type:"vbox",id:"emailOptions",padding:1,children:[{type:"text",id:"emailAddress", +label:b.emailAddress,required:!0,validate:function(){var a=this.getDialog();return!a.getContentElement("info","linkType")||"email"!=a.getValueOf("info","linkType")?!0:CKEDITOR.dialog.validate.notEmpty(b.noEmail).apply(this)},setup:function(a){a.email&&this.setValue(a.email.address);(a=this.getDialog().getContentElement("info","linkType"))&&"email"==a.getValue()&&this.select()},commit:function(a){a.email||(a.email={});a.email.address=this.getValue()}},{type:"text",id:"emailSubject",label:b.emailSubject, +setup:function(a){a.email&&this.setValue(a.email.subject)},commit:function(a){a.email||(a.email={});a.email.subject=this.getValue()}},{type:"textarea",id:"emailBody",label:b.emailBody,rows:3,"default":"",setup:function(a){a.email&&this.setValue(a.email.body)},commit:function(a){a.email||(a.email={});a.email.body=this.getValue()}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().hide()}}]},{id:"target",requiredContent:"a[target]",label:b.target,title:b.target, +elements:[{type:"hbox",widths:["50%","50%"],children:[{type:"select",id:"linkTargetType",label:c.target,"default":"notSet",style:"width : 100%;",items:[[c.notSet,"notSet"],[b.targetFrame,"frame"],[b.targetPopup,"popup"],[c.targetNew,"_blank"],[c.targetTop,"_top"],[c.targetSelf,"_self"],[c.targetParent,"_parent"]],onChange:m,setup:function(a){a.target&&this.setValue(a.target.type||"notSet");m.call(this)},commit:function(a){a.target||(a.target={});a.target.type=this.getValue()}},{type:"text",id:"linkTargetName", +label:b.targetFrameName,"default":"",setup:function(a){a.target&&this.setValue(a.target.name)},commit:function(a){a.target||(a.target={});a.target.name=this.getValue().replace(/\W/gi,"")}}]},{type:"vbox",width:"100%",align:"center",padding:2,id:"popupFeatures",children:[{type:"fieldset",label:b.popupFeatures,children:[{type:"hbox",children:[{type:"checkbox",id:"resizable",label:b.popupResizable,setup:f,commit:i},{type:"checkbox",id:"status",label:b.popupStatusBar,setup:f,commit:i}]},{type:"hbox", +children:[{type:"checkbox",id:"location",label:b.popupLocationBar,setup:f,commit:i},{type:"checkbox",id:"toolbar",label:b.popupToolbar,setup:f,commit:i}]},{type:"hbox",children:[{type:"checkbox",id:"menubar",label:b.popupMenuBar,setup:f,commit:i},{type:"checkbox",id:"fullscreen",label:b.popupFullScreen,setup:f,commit:i}]},{type:"hbox",children:[{type:"checkbox",id:"scrollbars",label:b.popupScrollBars,setup:f,commit:i},{type:"checkbox",id:"dependent",label:b.popupDependent,setup:f,commit:i}]},{type:"hbox", +children:[{type:"text",widths:["50%","50%"],labelLayout:"horizontal",label:c.width,id:"width",setup:f,commit:i},{type:"text",labelLayout:"horizontal",widths:["50%","50%"],label:b.popupLeft,id:"left",setup:f,commit:i}]},{type:"hbox",children:[{type:"text",labelLayout:"horizontal",widths:["50%","50%"],label:c.height,id:"height",setup:f,commit:i},{type:"text",labelLayout:"horizontal",label:b.popupTop,widths:["50%","50%"],id:"top",setup:f,commit:i}]}]}]}]},{id:"upload",label:b.upload,title:b.upload,hidden:!0, +filebrowser:"uploadButton",elements:[{type:"file",id:"upload",label:c.upload,style:"height:40px",size:29},{type:"fileButton",id:"uploadButton",label:c.uploadSubmit,filebrowser:"info:url","for":["upload","upload"]}]},{id:"advanced",label:b.advanced,title:b.advanced,elements:[{type:"vbox",padding:1,children:[{type:"hbox",widths:["45%","35%","20%"],children:[{type:"text",id:"advId",requiredContent:"a[id]",label:b.id,setup:h,commit:j},{type:"select",id:"advLangDir",requiredContent:"a[dir]",label:b.langDir, +"default":"",style:"width:110px",items:[[c.notSet,""],[b.langDirLTR,"ltr"],[b.langDirRTL,"rtl"]],setup:h,commit:j},{type:"text",id:"advAccessKey",requiredContent:"a[accesskey]",width:"80px",label:b.acccessKey,maxLength:1,setup:h,commit:j}]},{type:"hbox",widths:["45%","35%","20%"],children:[{type:"text",label:b.name,id:"advName",requiredContent:"a[name]",setup:h,commit:j},{type:"text",label:b.langCode,id:"advLangCode",requiredContent:"a[lang]",width:"110px","default":"",setup:h,commit:j},{type:"text", +label:b.tabIndex,id:"advTabIndex",requiredContent:"a[tabindex]",width:"80px",maxLength:5,setup:h,commit:j}]}]},{type:"vbox",padding:1,children:[{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.advisoryTitle,requiredContent:"a[title]","default":"",id:"advTitle",setup:h,commit:j},{type:"text",label:b.advisoryContentType,requiredContent:"a[type]","default":"",id:"advContentType",setup:h,commit:j}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.cssClasses,requiredContent:"a(cke-xyz)", +"default":"",id:"advCSSClasses",setup:h,commit:j},{type:"text",label:b.charset,requiredContent:"a[charset]","default":"",id:"advCharset",setup:h,commit:j}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.rel,requiredContent:"a[rel]","default":"",id:"advRel",setup:h,commit:j},{type:"text",label:b.styles,requiredContent:"a{cke-xyz}","default":"",id:"advStyles",validate:CKEDITOR.dialog.validate.inlineStyle(g.lang.common.invalidInlineStyle),setup:h,commit:j}]}]}]}],onShow:function(){var a= +this.getParentEditor(),b=a.getSelection(),c=null;(c=l.getSelectedLink(a))&&c.hasAttribute("href")?b.getSelectedElement()||b.selectElement(c):c=null;a=l.parseLinkAttributes(a,c);this._.selectedElement=c;this.setupContent(a)},onOk:function(){var a={};this.commitContent(a);var b=g.getSelection(),c=l.getLinkAttributes(g,a);if(this._.selectedElement){var e=this._.selectedElement,d=e.data("cke-saved-href"),f=e.getHtml();e.setAttributes(c.set);e.removeAttributes(c.removed);if(d==f||"email"==a.type&&-1!= +f.indexOf("@"))e.setHtml("email"==a.type?a.email.address:c.set["data-cke-saved-href"]),b.selectElement(e);delete this._.selectedElement}else b=b.getRanges()[0],b.collapsed&&(a=new CKEDITOR.dom.text("email"==a.type?a.email.address:c.set["data-cke-saved-href"],g.document),b.insertNode(a),b.selectNodeContents(a)),c=new CKEDITOR.style({element:"a",attributes:c.set}),c.type=CKEDITOR.STYLE_INLINE,c.applyToRange(b,g),b.select()},onLoad:function(){g.config.linkShowAdvancedTab||this.hidePage("advanced");g.config.linkShowTargetTab|| +this.hidePage("target")},onFocus:function(){var a=this.getContentElement("info","linkType");a&&"url"==a.getValue()&&(a=this.getContentElement("info","url"),a.select())}}})})(); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/link/images/anchor.png b/static/assets/ckeditor/plugins/link/images/anchor.png new file mode 100644 index 0000000000000000000000000000000000000000..6d861a0e7a5cbd98d5cd3264c5fdb6009d43362b GIT binary patch literal 589 zcmV-T0lYbi8H zxR;v-p;YW5F+`iD!^a8X7`mnql`D%A}cEXd`ThDV!W(L6Y>?{CNCnwyhR56s z{71LTH{e&V$AtHc17l_+&XK?f?EDXi4&Js}yaHx`L*Pog&7*dkht(>CK)2hyxGhn_ zM$KiwGpPma0S~s9mMWk2_SkAPuttM3;7-x{Ufx5V=OaOqv@Pjot=U9UNz!9UFD3O4 zR#zqIOww~n)AcmP@;s+nt;)=hM4IOoyvG2UfpY}sxH~_86{rGVKIeHS34z3nlBAI* zIKVl_Frfl87*J2spMshJW6t56D}oe47y&4R5r6@5?$Wr1AuP^a4A4e&vf;hwPgiF4 bR}J+WGDARE%D;pG00000NkvXXu0mjftM3S` literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/link/images/hidpi/anchor.png b/static/assets/ckeditor/plugins/link/images/hidpi/anchor.png new file mode 100644 index 0000000000000000000000000000000000000000..f5048430d57dcf0170a2df9e48ba25a58ba18ef9 GIT binary patch literal 1379 zcmV-p1)TbcP) zF-A!GKzLMwM$i;$$HMNqI?{bUQeCbh z5laT-vz#1n0*%+WcrBBjJa>-L_wUoT{rg|RTp!RW^2Mh&LLuXq zmKI}(NZ@jNyAd58cCHTsdw{wteSO40-w%B0SU1W#S+~MJi?JBJeCUvoKOUuU{#Kjn z>Z0+%LGnu5^NO6@dK%cUZXLZoJ8QQ}68H=F2iO95c<=+rJ}u>ffaY7XM#v+(%XD;f zlsM53Fl89NQIEbK4wu7R0?!(oR}zTK&Cz!l_p^gsyhx2ZcQV)KEg7@NkJCVRHyLHl zPY|&CwqY101g4>^1^+G0%@kW$peU?mV$AFHk_Y5mnnsCuoc@NRC9v+&u3bWrM{bNs zt^n!)UnK(emSs=15!epA)Ye83L`fFpavZW&h_X51@qx8#=~;O8Je>J12(sM`Nq`ju zY=o*3D2Z1l(9l5l5JIfnEO$>J%y=#fOE8fQ>(`Tx4J2U^p5yp6(I1(fE*nCsb0BB! z%yuM(b&*tPJjZL;dMS>1Jo{I#CcocLCdgzkZaR*-!~%-r*0LXgDNSBWvn*nf$;k~o zNJjZ1c+|!US&kLb4_LZ{fHMj#fwd|wQCP!!Rh_U>V^cqlrj|WNCjnKZf=4>=%)w0diPp6=jA zgeg8)|Oy5Q#A^~Yq7#9gQK*k5OqPS>pY9cR) zsvxCHQtZs)zk-EoBJdLwpO?wx8DJx4KolKeT+jca9|J}}V(j*9YDI$D(%4ANOa^@s zO|aZ=NLDGCAO80}a0Yk-cz0rgJX^Oe5peV1LHhB;3A%&+7?fR`nIQ$($UcJIM zRKB_RTF|OH%7&q7i*YUj_hC#bzXWsxUBGEB1vVqscVqsmP>5c@K!dCiLKyoU%ERb$ zaq#xuz4US3x@?TkR2&y?v}zcBn1ALCbfM-u!xb=_mJ7|!!-u(Md`lENn>M}qzG;dL zEnK)jS9b3f^}#k&QqLVYV2PUn-ubn^f5cl~pATs+$&$$7+hs`>2n58+Xf$fQbOShg zwZH#+4>FvFyf26%*@$u-#YvVc=bj#}fc61SDi!8~-tHKUj%?U5} z_O>xwA7It~;_T%203R2Z^VbFk|4hf@pMuEen0}FqC>b=o>#ML{*1d9NQI4k7b`f#C z&*ifw>;2+4i3}~i10alr>hS#WlP3*WXA&EkwAL}%6)08;A1^jJRV~0wRmV%tuOr3! z(&5WU`becU)pLO(%PCSoEzQakkCY2isT4iQwxlf2%I~+rkt{O-`=JC27g6yHuhSDD lkXLxrp)e>uPR-@D!G9=+u`hgA@I?Rs002ovPDHLkV1h$SfwKSr literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/liststyle/dialogs/liststyle.js b/static/assets/ckeditor/plugins/liststyle/dialogs/liststyle.js new file mode 100644 index 0000000..eec0e97 --- /dev/null +++ b/static/assets/ckeditor/plugins/liststyle/dialogs/liststyle.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function d(c,d){var b;try{b=c.getSelection().getRanges()[0]}catch(f){return null}b.shrink(CKEDITOR.SHRINK_TEXT);return c.elementPath(b.getCommonAncestor()).contains(d,1)}function e(c,e){var b=c.lang.liststyle;if("bulletedListStyle"==e)return{title:b.bulletedTitle,minWidth:300,minHeight:50,contents:[{id:"info",accessKey:"I",elements:[{type:"select",label:b.type,id:"type",align:"center",style:"width:150px",items:[[b.notset,""],[b.circle,"circle"],[b.disc,"disc"],[b.square,"square"]],setup:function(a){this.setValue(a.getStyle("list-style-type")|| +h[a.getAttribute("type")]||a.getAttribute("type")||"")},commit:function(a){var b=this.getValue();b?a.setStyle("list-style-type",b):a.removeStyle("list-style-type")}}]}],onShow:function(){var a=this.getParentEditor();(a=d(a,"ul"))&&this.setupContent(a)},onOk:function(){var a=this.getParentEditor();(a=d(a,"ul"))&&this.commitContent(a)}};if("numberedListStyle"==e){var g=[[b.notset,""],[b.lowerRoman,"lower-roman"],[b.upperRoman,"upper-roman"],[b.lowerAlpha,"lower-alpha"],[b.upperAlpha,"upper-alpha"], +[b.decimal,"decimal"]];(!CKEDITOR.env.ie||7&XFui49F#OeC~TM2>NBAD(jbywmmB4AXs^Hw!g3 zrKK6vW(G_+FkzM$n~Q^*56=n#HEv_kCE{7?J&c=}8RCPb`s%g^=>g4S@O1TaS?83{ F1OV9DKgIw6 literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/magicline/images/hidpi/icon.png b/static/assets/ckeditor/plugins/magicline/images/hidpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b981bb5c6c40ef143fbd1dbd92e17c3471a6e635 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9S!VDyfb{13uDTx4|5LY1m9~)4vn;Q?5V=oEv z3ua*W{OkAMe;?PrIs+66_jGX#;kaJgvr+JX0T0vtsZoZl?5FrnGTCjcQM%Pf)^OZeA b(rxbAsq!4pRQ+B7tzhtU^>bP0l+XkKZctCS literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/magicline/images/icon-rtl.png b/static/assets/ckeditor/plugins/magicline/images/icon-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..55b5b5f949a60c8fabc63867fd7827fe33d0ab71 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRQ!3HGLSWET+sX$K`#}En0)_zAW1_cfl(^voJ zzZIFXGf`1QjpGte_M{Gzw|n- mC^o0`vu%>-E46n=xrM(kReto&ct)&&(s=a-t);t=a;c["cke:indent"]=s&&Math.ceil(a/s)+1||1}],[/^mso-list$/,null,function(a){var a=a.split(" "),b=Number(a[0].match(/\d+/)),a=Number(a[1].match(/\d+/));1==a&&(b!==w&&(c["cke:reset"]=1),w=b);c["cke:indent"]=a}]])(c.style,a)||""),c["cke:indent"]||(t=0,c["cke:indent"]= +1),CKEDITOR.tools.extend(c,b.attributes),!0;w=t=s=null;return!1},getStyleComponents:function(){var a=CKEDITOR.dom.element.createFromHtml('
    ',CKEDITOR.document);CKEDITOR.document.getBody().append(a);return function(c,b,f){a.setStyle(c,b);for(var c={},b=f.length,d=0;de)a.push(j=new CKEDITOR.htmlParser.element(l)),j.add(b),h.add(j);else{if(db.size?"small":"medium")),delete b.size),a.name="span",a.addStyle(d.join(";")))}},span:function(a){if(p(a.parent))return!1;a.filterChildren(c);if(n(a))return delete a.name,null;if(p(a)){var b=a.firstChild(function(a){return a.value||"img"==a.name}),e=(b=b&&(b.value||"l."))&&b.match(/^(?:[(]?)([^\s]+?)([.)]?)$/);if(e)return b=i(e,b),(a=a.getAncestor("span"))&&/ mso-hide:\s*all|display:\s*none /.test(a.attributes.style)&&(b.attributes["cke:ignored"]=1),b}if(e=(b=a.attributes)&&b.style)b.style= +j([["line-height"],[/^font-family$/,null,!o?m(d.font_style,"family"):null],[/^font-size$/,null,!o?m(d.fontSize_style,"size"):null],[/^color$/,null,!o?m(d.colorButton_foreStyle,"color"):null],[/^background-color$/,null,!o?m(d.colorButton_backStyle,"color"):null]])(e,a)||"";b.style||delete b.style;CKEDITOR.tools.isEmpty(b)&&delete a.name;return null},b:g(d.coreStyles_bold),i:g(d.coreStyles_italic),u:g(d.coreStyles_underline),s:g(d.coreStyles_strike),sup:g(d.coreStyles_superscript),sub:g(d.coreStyles_subscript), +a:function(a){a=a.attributes;a.href&&a.href.match(/^file:\/\/\/[\S]+#/i)&&(a.href=a.href.replace(/^file:\/\/\/[^#]+/i,""))},"cke:listbullet":function(a){a.getAncestor(/h\d/)&&!d.pasteFromWordNumberedHeadingToList&&delete a.name}},attributeNames:[[/^onmouse(:?out|over)/,""],[/^onload$/,""],[/(?:v|o):\w+/,""],[/^lang/,""]],attributes:{style:j(s?[[/^list-style-type$/,null],[/^margin$|^margin-(?!bottom|top)/,null,function(a,b,c){if(b.name in{p:1,div:1}){b="ltr"==d.contentsLangDirection?"margin-left": +"margin-right";if("margin"==c)a=r(c,a,[b])[b];else if(c!=b)return null;if(a&&!D.test(a))return[b,a]}return null}],[/^clear$/],[/^border.*|margin.*|vertical-align|float$/,null,function(a,b){if("img"==b.name)return a}],[/^width|height$/,null,function(a,b){if(b.name in{table:1,td:1,th:1,img:1})return a}]]:[[/^mso-/],[/-color$/,null,function(a){if("transparent"==a)return!1;if(CKEDITOR.env.gecko)return a.replace(/-moz-use-text-color/g,"transparent")}],[/^margin$/,D],["text-indent","0cm"],["page-break-before"], +["tab-stops"],["display","none"],o?[/font-?/]:null],s),width:function(a,c){if(c.name in b.$tableContent)return!1},border:function(a,c){if(c.name in b.$tableContent)return!1},"class":h,bgcolor:h,valign:s?h:function(a,b){b.addStyle("vertical-align",a);return!1}},comment:!CKEDITOR.env.ie?function(a,b){var c=a.match(//),d=a.match(/^\[if !supportLists\]([\s\S]*?)\[endif\]$/);return d?(d=(c=d[1]||c&&"l.")&&c.match(/>(?:[(]?)([^\s]+?)([.)]?)]*o:href=['"](.*?)['"]/))&&d[1])&&(c.attributes.src=d),c):!1}:h}}},G=function(){this.dataFilter=new CKEDITOR.htmlParser.filter};G.prototype={toHtml:function(a){var a=CKEDITOR.htmlParser.fragment.fromHtml(a),c=new CKEDITOR.htmlParser.basicWriter;a.writeHtml(c,this.dataFilter);return c.getHtml(!0)}};CKEDITOR.cleanWord=function(a,c){CKEDITOR.env.gecko&&(a=a.replace(/(<\!--\[if[^<]*?\])--\>([\S\s]*?)<\!--(\[endif\]--\>)/gi,"$1$2$3"));CKEDITOR.env.webkit&& +(a=a.replace(/(class="MsoListParagraph[^>]+><\!--\[if !supportLists\]--\>)([^<]+)(<\!--\[endif\]--\>)/gi,"$1$2$3"));var b=new G,f=b.dataFilter;f.addRules(CKEDITOR.plugins.pastefromword.getRules(c,f));c.fire("beforeCleanWord",{filter:f});try{a=b.toHtml(a)}catch(d){alert(c.lang.pastefromword.error)}a=a.replace(/cke:.*?".*?"/g,"");a=a.replace(/style=""/g,"");return a=a.replace(//g,"")}})(); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/preview/preview.html b/static/assets/ckeditor/plugins/preview/preview.html new file mode 100644 index 0000000..8c02826 --- /dev/null +++ b/static/assets/ckeditor/plugins/preview/preview.html @@ -0,0 +1,13 @@ + diff --git a/static/assets/ckeditor/plugins/scayt/LICENSE.md b/static/assets/ckeditor/plugins/scayt/LICENSE.md new file mode 100644 index 0000000..844ab4d --- /dev/null +++ b/static/assets/ckeditor/plugins/scayt/LICENSE.md @@ -0,0 +1,28 @@ +Software License Agreement +========================== + +**CKEditor SCAYT Plugin** +Copyright © 2012, [CKSource](http://cksource.com) - Frederico Knabben. All rights reserved. + +Licensed under the terms of any of the following licenses at your choice: + +* GNU General Public License Version 2 or later (the "GPL"): + http://www.gnu.org/licenses/gpl.html + +* GNU Lesser General Public License Version 2.1 or later (the "LGPL"): + http://www.gnu.org/licenses/lgpl.html + +* Mozilla Public License Version 1.1 or later (the "MPL"): + http://www.mozilla.org/MPL/MPL-1.1.html + +You are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled "legal.txt" in your version of this software, indicating your license choice. + +Sources of Intellectual Property Included in this plugin +-------------------------------------------------------- + +Where not otherwise indicated, all plugin content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, the plugin will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. diff --git a/static/assets/ckeditor/plugins/scayt/README.md b/static/assets/ckeditor/plugins/scayt/README.md new file mode 100644 index 0000000..1231d91 --- /dev/null +++ b/static/assets/ckeditor/plugins/scayt/README.md @@ -0,0 +1,25 @@ +CKEditor SCAYT Plugin +===================== + +This plugin brings Spell Check As You Type (SCAYT) into up to CKEditor 4+. + +SCAYT is a "installation-less", using the web-services of [WebSpellChecker.net](http://www.webspellchecker.net/). It's an out of the box solution. + +Installation +------------ + +1. Clone/copy this repository contents in a new "plugins/scayt" folder in your CKEditor installation. +2. Enable the "scayt" plugin in the CKEditor configuration file (config.js): + + config.extraPlugins = 'scayt'; + +That's all. SCAYT will appear on the editor toolbar and will be ready to use. + +License +------- + +Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html). + +See LICENSE.md for more information. + +Developed in cooperation with [WebSpellChecker.net](http://www.webspellchecker.net/). diff --git a/static/assets/ckeditor/plugins/scayt/dialogs/options.js b/static/assets/ckeditor/plugins/scayt/dialogs/options.js new file mode 100644 index 0000000..8178e1a --- /dev/null +++ b/static/assets/ckeditor/plugins/scayt/dialogs/options.js @@ -0,0 +1,17 @@ +CKEDITOR.dialog.add("scaytDialog",function(f){var g=f.scayt,k='

    '+g.getLocal("version")+g.getVersion()+"

    "+g.getLocal("text_copyrights")+"

    ",l=CKEDITOR.document,i={isChanged:function(){return null===this.newLang||this.currentLang===this.newLang?!1:!0},currentLang:g.getLang(),newLang:null,reset:function(){this.currentLang=g.getLang();this.newLang=null},id:"lang"},k=[{id:"options",label:g.getLocal("tab_options"),onShow:function(){},elements:[{type:"vbox", +id:"scaytOptions",children:function(){var a=g.getApplicationConfig(),e=[],c={"ignore-all-caps-words":"label_allCaps","ignore-domain-names":"label_ignoreDomainNames","ignore-words-with-mixed-cases":"label_mixedCase","ignore-words-with-numbers":"label_mixedWithDigits"},d;for(d in a){var b={type:"checkbox"};b.id=d;b.label=g.getLocal(c[d]);e.push(b)}return e}(),onShow:function(){this.getChild();for(var a=f.scayt,e=0;e
    ',onShow:function(){var a=f.scayt.getLang();l.getById("scaytLang_"+a).$.checked=!0}}]}]},{id:"dictionaries",label:g.getLocal("tab_dictionaries"), +elements:[{type:"vbox",id:"rightCol_col__left",children:[{type:"html",id:"dictionaryNote",html:""},{type:"text",id:"dictionaryName",label:g.getLocal("label_fieldNameDic")||"Dictionary name",onShow:function(a){var e=a.sender,c=f.scayt;setTimeout(function(){e.getContentElement("dictionaries","dictionaryNote").getElement().setText("");null!=c.getUserDictionaryName()&&""!=c.getUserDictionaryName()&&e.getContentElement("dictionaries","dictionaryName").setValue(c.getUserDictionaryName())},0)}},{type:"hbox", +id:"notExistDic",align:"left",style:"width:auto;",widths:["50%","50%"],children:[{type:"button",id:"createDic",label:g.getLocal("btn_createDic"),title:g.getLocal("btn_createDic"),onClick:function(){var a=this.getDialog(),e=j,c=f.scayt,d=a.getContentElement("dictionaries","dictionaryName").getValue();c.createUserDictionary(d,function(b){b.error||e.toggleDictionaryButtons.call(a,!0);b.dialog=a;b.command="create";b.name=d;f.fire("scaytUserDictionaryAction",b)},function(b){b.dialog=a;b.command="create"; +b.name=d;f.fire("scaytUserDictionaryActionError",b)})}},{type:"button",id:"restoreDic",label:g.getLocal("btn_restoreDic"),title:g.getLocal("btn_restoreDic"),onClick:function(){var a=this.getDialog(),e=f.scayt,c=j,d=a.getContentElement("dictionaries","dictionaryName").getValue();e.restoreUserDictionary(d,function(b){b.dialog=a;b.error||c.toggleDictionaryButtons.call(a,!0);b.command="restore";b.name=d;f.fire("scaytUserDictionaryAction",b)},function(b){b.dialog=a;b.command="restore";b.name=d;f.fire("scaytUserDictionaryActionError", +b)})}}]},{type:"hbox",id:"existDic",align:"left",style:"width:auto;",widths:["50%","50%"],children:[{type:"button",id:"removeDic",label:g.getLocal("btn_deleteDic"),title:g.getLocal("btn_deleteDic"),onClick:function(){var a=this.getDialog(),e=f.scayt,c=j,d=a.getContentElement("dictionaries","dictionaryName"),b=d.getValue();e.removeUserDictionary(b,function(e){d.setValue("");e.error||c.toggleDictionaryButtons.call(a,!1);e.dialog=a;e.command="remove";e.name=b;f.fire("scaytUserDictionaryAction",e)},function(c){c.dialog= +a;c.command="remove";c.name=b;f.fire("scaytUserDictionaryActionError",c)})}},{type:"button",id:"renameDic",label:g.getLocal("btn_renameDic"),title:g.getLocal("btn_renameDic"),onClick:function(){var a=this.getDialog(),e=f.scayt,c=a.getContentElement("dictionaries","dictionaryName").getValue();e.renameUserDictionary(c,function(d){d.dialog=a;d.command="rename";d.name=c;f.fire("scaytUserDictionaryAction",d)},function(d){d.dialog=a;d.command="rename";d.name=c;f.fire("scaytUserDictionaryActionError",d)})}}]}, +{type:"html",id:"dicInfo",html:'
    '+g.getLocal("text_descriptionDic")+"
    "}]}]},{id:"about",label:g.getLocal("tab_about"),elements:[{type:"html",id:"about",style:"margin: 5px 5px;",html:'
    '+k+"
    "}]}];f.on("scaytUserDictionaryAction",function(a){var e=SCAYT.prototype.UILib,c=a.data.dialog,d=c.getContentElement("dictionaries","dictionaryNote").getElement(),b=a.editor.scayt,f;void 0=== +a.data.error?(f=b.getLocal("message_success_"+a.data.command+"Dic"),f=f.replace("%s",a.data.name),d.setText(f),e.css(d.$,{color:"blue"})):(""===a.data.name?d.setText(b.getLocal("message_info_emptyDic")):(f=b.getLocal("message_error_"+a.data.command+"Dic"),f=f.replace("%s",a.data.name),d.setText(f)),e.css(d.$,{color:"red"}),null!=b.getUserDictionaryName()&&""!=b.getUserDictionaryName()?c.getContentElement("dictionaries","dictionaryName").setValue(b.getUserDictionaryName()):c.getContentElement("dictionaries", +"dictionaryName").setValue(""))});f.on("scaytUserDictionaryActionError",function(a){var e=SCAYT.prototype.UILib,c=a.data.dialog,d=c.getContentElement("dictionaries","dictionaryNote").getElement(),b=a.editor.scayt,f;""===a.data.name?d.setText(b.getLocal("message_info_emptyDic")):(f=b.getLocal("message_error_"+a.data.command+"Dic"),f=f.replace("%s",a.data.name),d.setText(f));e.css(d.$,{color:"red"});null!=b.getUserDictionaryName()&&""!=b.getUserDictionaryName()?c.getContentElement("dictionaries","dictionaryName").setValue(b.getUserDictionaryName()): +c.getContentElement("dictionaries","dictionaryName").setValue("")});var j={title:g.getLocal("text_title"),resizable:CKEDITOR.DIALOG_RESIZE_BOTH,minWidth:340,minHeight:260,onLoad:function(){if(0!=f.config.scayt_uiTabs[1]){var a=j,e=a.getLangBoxes.call(this);e.getParent().setStyle("white-space","normal");a.renderLangList(e);this.definition.minWidth=this.getSize().width;this.resize(this.definition.minWidth,this.definition.minHeight)}},onCancel:function(){i.reset()},onHide:function(){f.unlockSelection()}, +onShow:function(){f.fire("scaytDialogShown",this);if(0!=f.config.scayt_uiTabs[2]){var a=f.scayt,e=this.getContentElement("dictionaries","dictionaryName"),c=this.getContentElement("dictionaries","existDic").getElement().getParent(),d=this.getContentElement("dictionaries","notExistDic").getElement().getParent();c.hide();d.hide();null!=a.getUserDictionaryName()&&""!=a.getUserDictionaryName()?(this.getContentElement("dictionaries","dictionaryName").setValue(a.getUserDictionaryName()),c.show()):(e.setValue(""), +d.show())}},onOk:function(){var a=j,e=f.scayt;this.getContentElement("options","scaytOptions");a=a.getChangedOption.call(this);e.commitOption({changedOptions:a})},toggleDictionaryButtons:function(a){var e=this.getContentElement("dictionaries","existDic").getElement().getParent(),c=this.getContentElement("dictionaries","notExistDic").getElement().getParent();a?(e.show(),c.hide()):(e.hide(),c.show())},getChangedOption:function(){var a={};if(1==f.config.scayt_uiTabs[0])for(var e=this.getContentElement("options", +"scaytOptions").getChild(),c=0;c'),g=new CKEDITOR.dom.element("label"),h=f.scayt;c.setStyles({"white-space":"normal",position:"relative", +"padding-bottom":"2px"});b.on("click",function(a){i.newLang=a.sender.getValue()});g.appendText(a);g.setAttribute("for",d);c.append(b);c.append(g);e===h.getLang()&&(b.setAttribute("checked",!0),b.setAttribute("defaultChecked","defaultChecked"));return c},renderLangList:function(a){var e=a.find("#left-col-"+f.name).getItem(0),a=a.find("#right-col-"+f.name).getItem(0),c=g.getLangList(),d={},b=[],i=0,h;for(h in c.ltr)d[h]=c.ltr[h];for(h in c.rtl)d[h]=c.rtl[h];for(h in d)b.push([h,d[h]]);b.sort(function(a, +c){var b=0;a[1]>c[1]?b=1:a[1]q4ZMIndrud~5RU7~KlqvCB?4CNuN7<8ZM?GWcHwn9gFm;vTD`OGs4A4v z_>p{l_3!U?1~ulpOZhdv&pm(ZrckW485hHzLf=y^Oa(`QMlpE0`njxgN@xNAlu9>b literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/showblocks/images/block_blockquote.png b/static/assets/ckeditor/plugins/showblocks/images/block_blockquote.png new file mode 100644 index 0000000000000000000000000000000000000000..a8f497353cc5abb02cb78b7eba55772e1f5db540 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^RzS?p$P6U=5BZe>DYgKg5Z8u=hX4QnKfl(y1}MT* z666>BpW*3t11})Y(bL5-gyVYh4}L~=2?I&_?;_8ie6x^G__3`z_sgwKzZH&EWg9$J zo>3^H!!)^R)z2HjbAs=bOXQrh-_iK(#@Yr$22;7jhW_~%%z%b5c)I$ztaD0e0sySo BH~atq literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/showblocks/images/block_div.png b/static/assets/ckeditor/plugins/showblocks/images/block_div.png new file mode 100644 index 0000000000000000000000000000000000000000..87b3c17146e79e8dcced15939f24a0f16ad50c61 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{g$P6S6r-*3)DYgKg5Z8u=hX4QnKfl(y1}MT* z666>BpW*3t11}&?&C|s(gyVYhkN^MKnR)8>#2x&=+p)i$x$p|V!M`$YjXLp#Y@Eyt Y)8}f)Oi$*s1L|P#boFyt=akR{0Dd1P761SM literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/showblocks/images/block_h1.png b/static/assets/ckeditor/plugins/showblocks/images/block_h1.png new file mode 100644 index 0000000000000000000000000000000000000000..3933325c08f3f4eacec46c97600f7cba01ead54f GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^fbHRe*aCb)TpJo1{{R2~{95lCpa@e* zkYDhBhNs&NynsA;PZ!4!j_b)k{_k&OY}>z={n2NEUx%wTFVdQ&MBb@0O>s@^8f$< literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/showblocks/images/block_h2.png b/static/assets/ckeditor/plugins/showblocks/images/block_h2.png new file mode 100644 index 0000000000000000000000000000000000000000..c99894c2650ae1745e0e4156d775fe84d00efff0 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^fbHRe*aCb)TpJo1{{R2~{95lCpa@e* zkYDhBhNs&NynsA4PZ!4!j_b)k{_k&OY}-GV{n1;8KYJS=G7HpK^B?)%xI=a!8z(b^ XbHRe*aCb)TpJo1{{R2~{95lCpa@e* zkYDhBhNs&Nyns9BpW*3t11}&?$FVdQ&MBb@02`Vnr2qf` literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/showblocks/images/block_h5.png b/static/assets/ckeditor/plugins/showblocks/images/block_h5.png new file mode 100644 index 0000000000000000000000000000000000000000..ce5bec16cfa84d461672f8b0721911d90a06e445 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^fbHRe*aCb)TpJo1{{R2~{95lCpa@e* zkYDhBhNs&NynsAaPZ!4!j_b)k{_k&OY}>z;`D2~JyZnS78)QA|*^>lnbHRe*aCb)TpJo1{{R2~{95lCpa@e* zkYDhBhNs&Nyns9#|GfK-CPMu6{1-oD!M|04nb literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/showblocks/images/block_pre.png b/static/assets/ckeditor/plugins/showblocks/images/block_pre.png new file mode 100644 index 0000000000000000000000000000000000000000..955a8689a13a394a9e715673d23750a6847eb617 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^VnEE#$P6TJEnce)q}T#{LR=df8vg(P|NL6-8lVVM zNswRge}<>q4ZMInbx#+^5RU7~KmPycXXdGYvoZ00=t{@C}8pCx}|qC*(_ aQHD7O)qh-UDHQ^0VeoYIb6Mw<&;$Unq%6+> literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/dialogs/smiley.js b/static/assets/ckeditor/plugins/smiley/dialogs/smiley.js new file mode 100644 index 0000000..54250ab --- /dev/null +++ b/static/assets/ckeditor/plugins/smiley/dialogs/smiley.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("smiley",function(f){for(var e=f.config,a=f.lang.smiley,h=e.smiley_images,g=e.smiley_columns||8,i,k=function(j){var c=j.data.getTarget(),b=c.getName();if("a"==b)c=c.getChild(0);else if("img"!=b)return;var b=c.getAttribute("cke_src"),a=c.getAttribute("title"),c=f.document.createElement("img",{attributes:{src:b,"data-cke-saved-src":b,title:a,alt:a,width:c.$.width,height:c.$.height}});f.insertElement(c);i.hide();j.data.preventDefault()},n=CKEDITOR.tools.addFunction(function(a,c){var a= +new CKEDITOR.dom.event(a),c=new CKEDITOR.dom.element(c),b;b=a.getKeystroke();var d="rtl"==f.lang.dir;switch(b){case 38:if(b=c.getParent().getParent().getPrevious())b=b.getChild([c.getParent().getIndex(),0]),b.focus();a.preventDefault();break;case 40:if(b=c.getParent().getParent().getNext())(b=b.getChild([c.getParent().getIndex(),0]))&&b.focus();a.preventDefault();break;case 32:k({data:a});a.preventDefault();break;case d?37:39:if(b=c.getParent().getNext())b=b.getChild(0),b.focus(),a.preventDefault(!0); +else if(b=c.getParent().getParent().getNext())(b=b.getChild([0,0]))&&b.focus(),a.preventDefault(!0);break;case d?39:37:if(b=c.getParent().getPrevious())b=b.getChild(0),b.focus(),a.preventDefault(!0);else if(b=c.getParent().getParent().getPrevious())b=b.getLast().getChild(0),b.focus(),a.preventDefault(!0)}}),d=CKEDITOR.tools.getNextId()+"_smiley_emtions_label",d=['
    '+a.options+"",'"],l=h.length,a=0;a');var m="cke_smile_label_"+a+"_"+CKEDITOR.tools.getNextNumber();d.push('");a%g==g-1&&d.push("")}if(a");d.push("")}d.push("
    "); +e={type:"html",id:"smileySelector",html:d.join(""),onLoad:function(a){i=a.sender},focus:function(){var a=this;setTimeout(function(){a.getElement().getElementsByTag("a").getItem(0).focus()},0)},onClick:k,style:"width: 100%; border-collapse: separate;"};return{title:f.lang.smiley.title,minWidth:270,minHeight:120,contents:[{id:"tab1",label:"",title:"",expand:!0,padding:0,elements:[e]}],buttons:[CKEDITOR.dialog.cancelButton]}}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/smiley/images/angel_smile.gif b/static/assets/ckeditor/plugins/smiley/images/angel_smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..21f81a2fab5b772bf1dcef0fe0a5f1965a08927d GIT binary patch literal 1245 zcmeH`{ZrBh9Du(lA_^p;f{GZh*>#>vg-WcpVe_qxHdcBkoV$~DTj}X$YrA=EDa>g& z&*{`%<>ta9P8XRelEYV&Qp))T8!O927}m5CoeM?2-_Nc;VZZPB{rTm&dom8C3zB6F zgn_sb2b2H6P=zl~MZ2{D;a2Jzo;_r2&>&;$%H}zL_%76gqX0@u--14#&){LIjEU~ z{`wM3?SSc*!4~Ve7Z3Mdf&1~x6Z=q8qI-&m&LnNkC4f}`c0OuIfq}PSP>kJr(`yuC z4|2V?3tiScn0tS9uFz{cwed$W*h;{12D6ody#O4iVet%1%fWIM?pA=c3g#|ge>QvP zFJkjQtvf0)XEiL;V#~Ger$2(@61Jq;c&70#x5Hl@n5z{W-LTN(eXIwk0hW3_t}f4N zH~P;Y_WYLDZARU9yc=e8;|{D?QO_*qv0xq>tlov^53sF=nAZ-QiLTo&>ABenv;5hD-eD`W%;^8#U8LFm)N%ET{bOMdwzM#Rc2N$sz)D(i+t+^<6; zMzWL^_O4tV(X1G)7I2TzCUkA-_`t9PaUGR&uqI7P;vKVQ(lo+Cy^?yp;xJp3%1n$U z5~|K8e@={%UP+o!?LTE=XwEvaqHG;_3p{Uif_K#{+dwiL(8l~ zQi51oVP#aZx~DQw6vvSTQk(O95Jb)nBOO1_nJea!Ig;SC)ZmJvV&TcAf_S9Ss z!Fu%FBF$Gt%=@kix^y$en7>OUl;g;`#W-JovP<#Nd&=P%VRcTYq98WTj;H4cPMQd^ qnmi+y@WBWnC*p*PN$AgJ8}WtsBW_ zEeI{UvbD07r3Ffnvgoy?Q1G%SU|8D=m;24nGxOaGTuK^WeE28d%$)O^Gv}OdCcrtf z6!3q^ZvelAur~NC?*7*-x8pPAnW)2>y@6Ub8xGnw+E#qTx6NAZ!{h22^MkwRD=oA8+NhhM zuc0Vjc^vQHnJvO{zK0rqSx&tl21P@!!uUzJJq*q~C{9w^N3D&oYKD8E#^VQ{y>j64 z%0Gp^<6*hFv2Hb?=JQdr0-DN(u{Yr6F#*bElb@qzen8!pgRb_k`)P(|`KM*c@zVU@ zQD!Sw%8iBf}F)U&F;Mw$j zD3y8G_*Cv&Tn&)eZqP> z73<)t7)fgyo{>{`z$Goui=pJaHFZNe%9brq6K$eInPA%+aI_GjQ1$!pTt1FrZAwcv zS3iKCA_bD{RT95`5y@y?tUuHjtrY*y+z19vhKXMkluM^I9>l792E*D^&_g(@;7o`O z@oK7OH-&HQpgt#*k=!U2%VJq9jbZfL2%2+3`0>pk#!Hh7n6d~wEk{r#a$?Qe)Qa*G ztxZw=gdM$(PD{FBZRk;YPbE=%BAnC50y+J9AT{rYapjvt+}E@0KuW?Q@t+gs!XVSI(L?MoyJ zaVTqyfltIloQp%fK%LWVpl5=`E>I+6?W28#ahGQfX$1nL>lU miK<1DUR8VN4sT7vR{aZh|2Vqsev4870000v5$^6lp{j(L@cWd@v)@&bbIe*!4{2R~Nk+whll|Kio{Rvd~AE5XvNcDG+ z>i=Ms|G{d%Lbd*fY5$AR{t>13KT_{~gu&-n_*H+!FG`#I74bCTuP zB&%;}cK;Kt{-#*|O11x=Vmmd`V`{YLg$%EY*?w0_qyDEmeam$Enc?_9!})Kn^WSWj z|Jm;Uvpv2P`g|?&{aWJxx5)p0ap1r5;6IhYe`>@3RY(7+kNR5^d#x(rMnn3E&cb_> z>%R77|L@5B*_;1$V*bCrqL;I4e@!g^Ke6=3^t#`(>wnE`_%W;D$Lz+xGaG-*YyGjH z{r94-zl(c+EbD)|YUZzHlm4%t{bI|~7u#0+*|PA@wncxpFa5i7`I`en7bZLUvj}rN5l-fsqRGU-@L~cBCwnJj z-5Z7}?);8k5-BGv91b-1YUkeLNorZz$j389s7h!`bAY^2{EmXc87!w3`TDacioDP~ z!=vQU$`aYte1w^Wm8Yjb(6w*ILQZSbOTui&x(%wON`o{$PZCzIQYd_6!Z~4@+Vl-# zDVtJ#r|HCO@_E?Fk~zVpYX;9(mS&Ghhl}rA33OKBm}Qms;Kc$(6``Jmy&8XBG#+M< zcAm;7btEL=sH8-1%DeCmfJ?>^>=`)j04$ zp-6|{OrvtH)Tk*=E1bO4-YjAKth(G;!?RCdLFZ=8R@J6{p9wp)pB@v^2$-Uv8N}?t zuQYR>jgnSd`=lSt9wDqk?g5Gy8LTfPuqlPtI!Oq)yL7aOdzy$H;dgSGxPaSErD&!@ z^&9~ge(|mY4vc&eAK8>=NhBTMip|(~++nW7!9#q~5sI@i+BGg57I1swCZZs^BjE|B sstbc7GndMS1FXUfMKXa?Bmx^*C2Kw~P7#uDJUJ!hEypqkMn(o}0F!L1cmMzZ literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/angry_smile.png b/static/assets/ckeditor/plugins/smiley/images/angry_smile.png new file mode 100644 index 0000000000000000000000000000000000000000..c05d2be3a7972ec4f2d9f5354a9c1dae719d1805 GIT binary patch literal 1220 zcmV;#1UvhQP)3$g6vq)-cAK&zV!#CqTMKRJ22-XBFbvCp1xi~f6p+QnASfX&h4R5DCScGI0!>sv zs_~1dwxE7MBPC)83Q80bAgxls*4UJ1JJXr>-p_O1Oq*6(gNZNs=e^u}&hMUk&w1ze z`mNFE)t!JCkw;W2sua~nR2do5xtN~(RXu@ySk~>(xi1O4`x-4T`nc;I<4C`COy|@_ zZSM;%hC@Wht-7li>(Xdhmrn3-8CK0n__G0;8nMowCUopgTDN35HfpOr>f0mS0o!(6 zpyDm=<_xz3hjw9}sm40K4}1T1cww1nDIC}VpOnL`TC6WV#F#(IRv-2K=K`JK#{(z! zW8_XGSn;-P9o_@a`=De#Y|ep=nXthH#p$pn1=h>^)CbUTlh#ccsIM~af$OC z8EXd*?6mDy3I*y3gSX6uO_R54o9nRjab3!1zemaQ76OGiBK>dR!xHylc4%2)~ORHLs{)rq;OBD zrWzwN7HhjN0&^1-;Dvk_O~tNo#O>hKi8QU6&IMmQ!4;EX`IEB9R3`_m8#7RrGTY&$ zf$}~0y<@{?svwDSjXRaNq-5enhrAL|Q8?m5o3=)^Cn?_ z`?;+wWp;(YTL5Cz#t0V_oD?<~va!NRPQmXcq(hRVJOQqp>_7v)$7!55hU=~&{E#$&Gt>I;-SlXhvWH3fMq;l|rET9< zl-2oIO8rN6nhqBZgHpT1n1(T zVBRpS=d$rXn@QkES(k)*LT5h1nBCvmGPx6IT|Az%64lQyujNj41+Bkcqr1mnUrWuj z-jFjC^QBx2X>7{sT#7N6q1%SkZ`-^P&NxQ^|`Nbig78EN4ijpZ37xfn*XJC+7l3^&sTaa~}) zBt>&^Mjx&wMiFxLvy9ZcAxkc& z%)#Iu2pRopOOK*if>9s!?Xl%X77!8@=Cz;X{1Pxyqwvc@!3;Sr_aNJzGr$hc>We?E z4@U9>j*Z%?kNV#4HMd+6)2Nx(($d=1pF^eJTDneEh>hC*r#rOMl_zZy?L<|gTM<=7 i#(dpfZTAKLKlC@^jn9nmDT4q20000*pUa&T;8X5PrcvW10Z2NTmi28K-> z99w~ihiA2bz$!t(wPIpxB_-F($*q@{-zzA%K}l(guI>(V^PM&}yX@_c@bO(>WxdSF zd7Y2%pn$+p0fFN}LWe{}kBEt#78gG&BXdzu@QR4YO+mriLPB@M#O{lWUz3);C@+6g zTKb-(R`4+WMcZ?SDJFJx)%0-Q4zhcpMB0Ivf^uI3nUmWaP29xRaTgr}OeI zR8?K9tGm?DaJjYhYFF3wzP{`I{kNu1zcXjf-TCwHFIn+|z>vkD12PE| zCl2iY8?u_3TUy(iGWo3SdV1~Tg89w+daU^}TQj}cW#`V5j?&nb-`Qx0y&dJ-O1)8hR;%({Z!f zSw-G0Ide8BcU)X-%~fNm^jIT^^PRzw7mi!m`&TpS^*ng^Sc`v^p;3a7@I%+$&FS$B z42|1zyE#NG1rs?ZEJ|<`mU<%=V)&rzSg#-790$iAEs2M@XZ=xaIo83*H$hQaqv_cq VDI+l!4S|Hlo~KE&(^;7qtO2)m5uX46 literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/broken_heart.png b/static/assets/ckeditor/plugins/smiley/images/broken_heart.png new file mode 100644 index 0000000000000000000000000000000000000000..a711c0d8d8505409f0285fd92257eda1ba3a42cd GIT binary patch literal 1139 zcmV-(1dRKMP)@G9Ar!Qd8U24;$Cpiyu=eyrI zbMEBYM#544uW&4UD9%?4f!)A6KoO7xt^!|Zy3w_OYXIxFS5&aMyZavCSAh3N zIy)<3eSOrdT$%A;lJPh|`IDg`3Ot^SVt}=!rI^>Q@#xH%Rlo-hplSHzNqj{`NGgRa zfM0St*<4*sZ+km{yR5B^YtbmCX<}EDj0LKSigi$t(YGh>D(CP-Qqv$t-s((7H6vrLmeA`zCgv;g$mL}ZmYHTCN^m6dM4 z-A=CCoz~4nEXMWGQOfi3D9_8wJdQc;w#~+yLqjo#s`?a7H|{xeaz3d$c8r1XaiXzU z`XM=;c-?MNsnnte8I8pVhQrhyKaN9HKh|_(c>aI-w5YYUr}pSk`p3qYiN{Hr<}+EM zsz@r8ww^Ri;)w+PV`J0=0=&FsOAqiFfC8ZD#w_qwSzB9Q#i2t4b)ER^>@%G$vD@+3 z?P(n+Op}3dnAHakP`+o+O<i&rnp1&?$q`0+}lASvZ zo88`~=|;yt?R}wquD}}LJ-`nP0LL}mxc{Pk|4RN}<8SCtmNuhtj6nbZ002ovPDHLk FV1m;NClUYv literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/confused_smile.gif b/static/assets/ckeditor/plugins/smiley/images/confused_smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..0e420cba4af510c616dbfcad2b48acddc94da29f GIT binary patch literal 1202 zcmeH`{ZrEg0EfSuV{dG-$zU%q+QtG-5g|_*LB}>d*gWYlIj^$rT$8esy7S7e@XDDiyjSv78BwnbPCKBc7Y5TDa4v^_I9rBav}SEKb`+XKlS_r&)swPR2nNZ zB_=T;CgKFqeu!u{5#6uT`i{}Re2?#ai*d!0bk)iXG_xj8@#a6_{?y5z>JUwJrmu8z z=bWOY9_cSG9^4ynaRb~ebTRQc6K*yxa?rIAJ#6%F(94CFhk=w8PwHx)IQE4Ao=xbM zp(lgvm9O^8R=<|VeVgDDkOM*tr(z@(qiMJ-#$ZN#RDvrKjLE5fC3Q)OAqCl=58rlb zvq^44xDtV>+2#_WsK z;tPrI>TuhIi-t!u?s?58=-+9xNgr#lw4`)&Yw6pZ}_W za*aVFh!!IMk?_$IS~iFjPNru1L)|V$D!0bnaN?tuT!JVx=~ZlT!GUu{=4OS0C$CWt z|D`szZj@_|c)iZu&E*{auv5vZ66HSKk!O77u(4BDvZN3l$!k5SFj(^@gD*{T(}bCC z`h_`D(`V{KhowcTR@qZcq5$twcIBsKHujon)?Df6Njh$b+*H5P$Sjo>YGsXfxqKJ@ z6kC7c{fKIxi_M|07z159{`o-C-PMqsF5Q=}Ewm5}^#PY4vRrFBf97aG-Lk)9oSB@y z+2HUp`@*+}%nzP(H!(O{k3J0B*D4s&vRC~z9@WcsM`^ZgGw-x%ulQWa@f@XI9c zq6(?Up=WLL7cJ=JjITttEjEXRMpwsZtg=JSfVSzL-@2bAidlp;&qi#5Ebq=nezCvS qkdbCPP2badOmMdDHD1f|W5tGQU6Qv-VPzC2Oc(Slx$U5qDE$}COQpd8 literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/confused_smile.png b/static/assets/ckeditor/plugins/smiley/images/confused_smile.png new file mode 100644 index 0000000000000000000000000000000000000000..e0b8e5c6f11467dbe09785ebf3aafcdc9c581e1f GIT binary patch literal 1101 zcmV-T1hV^yP)4^ zUWYx{4*}Ue^73GgnR!>qSdt0#UH_41XsWqa81?H2(hEkxf@2Fg}a`DzSmDB z?ELd}@K_|YkKEPMoEa8p+tW12b)`%aL_9TSWe3JU`!47`4qpulyMIu$Zrs1r10^D@ zhW?rQ7$R-K9gS!w4aV_Ob`6<~<26wrlXb~t-RgN>Jh%ur3rPGVta}X77XEG!00yzg zp(zNiQ#Yq~b~h4T-{O6DHG)XZIS7l3UgSm~VkyBA%U0`4i)p;O2C-*0oku zU~#%Ga}8L82Vh}QFV*^X)HsHjRGG_va>=Xo*(!@d3O z^z^pV5^X^TG~@~}mxsA|C{@4+(iBBli`Hvk&u9`A*qE^Mx$637Cr)!_2-+GAT5G4X zoj^|n3JX540ELoYrln>IA{q&VjV{e<_WT0v{nhoaySOIaJIKYiA=GRLG-wQ9+-lux zr)J5z#^8!(+i~bWT6b~jn#nm#-;p?5jzO-XDHOq}tUfWuK*a&mpxOE^^c{%n4%KSdo|VdqI`-~2i7YQoOXt_rVlasY8o@b@EKzN|4Jx|!Ez$*zm|HZ!`tHFH-9l#^NHekTF0KWm_zCCyA({@|%|3m%(uJ36& TLW+k600000NkvXXu0mjf7P}Gl literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/cry_smile.gif b/static/assets/ckeditor/plugins/smiley/images/cry_smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..b51334278289b1429515bdc44d559c768e7de4bd GIT binary patch literal 795 zcmV+$1LXWiNk%w1VHW@w0QLX?mtX*!WCEXR1fy*Pr*j9bdI`6B1-N|&v3?7-h!MSu z5XXrK$&3ohnikWb71gU8|D*)}sRsY03;wJM|FRDMsulmM8|Sqf{%2Grvors@HvhIc|GYl;#2){`8vn^3@4z7M&MW`SBLC7R{?#e} z+AjXYGXKgm|I0o7(Kr9qIQ`-^|GiEBzEJqdP5stH{@6kP&`tcoQ2*0i{@q;r&2IkM zWdG4<`Ok9w)^zdPbpPIT|JHo{;%xondKah59H+}0tIr#((I2+lA*swUvCl29&^Wc# zJ-XK=zU4!@)k3}5Cd2D7#_V0g+Tb|Kg(l>#Y9dwEyP1|LeGx(7~6|%B$4Jj@|H{b1|med z2tRLz~DRs6Vy)7@y5v>KTnio`Ed1U0RaXDAeb;ALI)3XmLT!NB#IUfSFg61 z!Ffgt3K1q)kRXT3WI1s7fPp{(L)z9D8b^o#0RpZ#SG0A35J9i(*|odm(pD!#ZQjQr Zgs3w-m6|RzCea|Grg@`9ix33@06R_ikOlw% literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/cry_smile.png b/static/assets/ckeditor/plugins/smiley/images/cry_smile.png new file mode 100644 index 0000000000000000000000000000000000000000..a1891a3428126f340fec3df988921ff98e60b36b GIT binary patch literal 1214 zcmV;v1VQ_WP)svZ)kglo^9&wutlMWAZX#D_n7@0qo}S+myKGf~0N z<*5Hl|2PRGN=u|n$tU$j#cfpec2r+bwmoCBvH zf#!#yaXOrO2u`HI@hOtNd$+>1ZtZX(*4HwIz}+18pMji2GZ4ry=FBsK&Xj||EdncVY;^Avcw#O_mY=li{oT9 z9V8{Ej!F3qY-*~dqg<&u^{5Iv(<@%p1h=5qTW8ZzkD)3=KAV!LPw3u z67x=Y)p+OIhAO7}dsug-M`>B;70p6z;cR{nC3`#E@1=tBB!X?SMEtv#1 z6X+-xe7@IO7Ix5+vws}NzlOR%8yp)iHxAUmJ(BN6@|ZxnK$t2v;p9zvURS_cYLb zWuU-yH1ODk>tdT|nkYe(|^8?m>*+gHWm%Z%qnzJ&8amO{!&`*36p;4JRi1SQl@6w?K*DH+k93eL8lh%ou~8WNmq1B zfmvSEc_T2n@i>L44m%U54qal#kr2u1I17)j?EAfNW9Oxw%VE<%%LdpPt3^gR6eoH) z^=bP)J@;uLJ614K(T>o`sh?=qFl+CS6@%-ma&GIn+MU_h7aV%z8s{9%pXqFqbDo^{ zBt&u=KNOl1C%b4#-`2iLhn-nBo6m3_BkcFx+!_P<=vqup~J>`7E2osXy_GPdmQ ctL=9E0q?RJ6Dta$D*ylh07*qoM6N<$g2RVY9smFU literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/devil_smile.gif b/static/assets/ckeditor/plugins/smiley/images/devil_smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..9b2a10055beadd67b13405cafb86829f57fffb2a GIT binary patch literal 1239 zcma*m`%hB`7{>7fltL|qLuo0r6uDI^K~PYv!&{ZmO~v3Ak*P$`Y372{4cTyWA|Qhq z7lb*@s7@{7L<=%*BDKiHsR-5rm(L%TN~c_1XWiT^QfZf$u-nV?A0MAFxqM0{qh+#}At7VI!4`$$ zY#ebmp1Ab6^`(8*m-pLTIl#J+!qcVL-AQ3r9I>xF%9-2}h`n+g4wzP{#13|2(fLPtcSnY-W1SwduU;;|rnzHP?Kei!(yxilMPazBM#9$hScO zQ#%x}aK#pXFxa?ii>quDGVE~84*B*d;Glpzp>@JFdt7I5=)yVBa!|ySiy|(H=b)I2 z8w>}OFnIWrhf+tBF`Q8DG@v1ewW85t(L@o6YhwDk7}q6Kk#w|FJX$V!TH!HzQ;G@_ zmCm@y;G@a~w_H%o5I`ryZ6Wlos1f0g2$hm)og41BK`*6Cy;0>wl?I?Jgf0t3`4U>U z7`jkYet_zglzugCub!@#PT%!JtsCkX?x<&o(ICcM3Dw{M#$O(|FU5UNJn%&0-0272 z)B`W7(HjrF(8TaYvp4m~7ms{k@I|8xkNohMF%L#Rw8+rPn1?pTe3<5=U5*aM0(AJJ z)Bjyh5PBA(I|#i&=nJA+md!p{1d{^o3Jio`FoddBLLUkJCe%dH_tsM#;dGbMQWu4` zSh{bA`KPe*qK zOg~xrFVOwJV>lZ_c^FZnBOgN=%d0}XD8^73hAS*1l^CtY%PQ2?!el~wJG#0s-iC1# zUUy@v4{!TnHdEtfOqntB6z`sao&{|IO#vYO-+9lltO#O~2zWn#{}Y5gO^h_ERV5ee z(rs-Gzno1NP^QkA8@l6a+>ZJKhOZC5PHXC3mN`+s(oLRCu#zSWZwJ>UY!CZ(Kx6eH zaZ|s7?f79JX^dl?jPE%`<;ph1EIrh{D@#ER*ff%a^}%D`Xxj@vxws@Yt^Bz-j3n5n z4pwQ2w7A>FY1?!{zHfL>`|Ku&spv74v1%bcuUm|C!JzaNLs z;+!CrhI65Zj8-qAOFngv+!pk6ssr0$Bp|V?WO20CU3s{wCnj(I^VSUR8Na@0Q$(bD ztm$CRo3yMPS;UvIxA@H`wu}ewd6hgFd?d;z;-p{!e?=8f^0#rQVq<;{xz&9vD{yBt zZ`JzKD{GItB)IM|#JR-uB-=p~E|8~meY{cG`|9FO$?lkAb)4 zYfM~46vqjaS1GU*S&)}YUt*)8t*MQPX*9+*O|&&pn;1=eB#j!4ADSkmo-{nDf# zGy$;|gqF8FTcInDR!d7;3cDH_ukI1l7oz!7zONVbEH*s`*Yx@y+B!tlKe}bjEN0x%{gD9r3E*(Y!Obk z1;0L?mInX!?SR)S0|WT8A82?CXxaw!z7PDy$SshwcpaE#1p5g;vqRa4EiekV8*>{s zVtVUVX}4SOUvFe)VsPzR=p4jHF9KgBz~6fS{@+WWjeQ7x=w`rH6!G-C$_GJp*6A7G!AtTsr34(w5szgtkylF6>ML{u%}vABVvr(}HKC>r-Yv zj^3GDH#K>Ruvdc&P1dDgvL<=CU75(Tq|PJ&KgL7vJ;dFz{DnoP1+RwlS>=JmGeFwq z^{C2;Hl$t1fY$Cg~1}zf={3{S(2mSe7Z`ONdC`ryF;v) zYgsCJt&H)&14;p4)Z2K0IN+aX&*&AS9LDkXFn;wS$BF~1f0>YAwtDgWr ztWjmvtYBA;uE9uw?N+GeEtBufkAmw+1m{KbUS*{@cR*|8`4Cn>LU&=T7B~^6Af~43 zQ&IfhDm3MUV>mw=vlTYXmd9cwFAB{$Vfg;t5R8{68emjJ!QZ+UdKq^ttbkICf$p0^ z-6P6-@lM2Q@C`nM&SQyaI24KFZw2G{o5866I0Bb=h!zL3lp|%4&}&#pH9SDV5SDd_ zmaf=y;W$dVmlPg#AB-4R1#=0aNI2k7P8VdMM$Xqf4ADlpV954S- zxW1qXCzpnsK#A#XpeI6U7fi7&b7U?Vw}qPvuoO^?85c{8AtHSA(DUTlQFTO?VTR%|9Z*ej6?%+6V*|Z irs~YTJuAboQvU$jo*OjDtdS-F0000k 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 LNkvXXu0mjfxmX{o literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/envelope.gif b/static/assets/ckeditor/plugins/smiley/images/envelope.gif new file mode 100644 index 0000000000000000000000000000000000000000..5294ec488dbe44117f3ae6836b932fd3b6a27b52 GIT binary patch literal 506 zcmZ?wbhEHb6lV};_{zYre8tk$>z1uszh>j64O_Qu*|u}z_8nVy?%cj>@3vjLcI@7> zbI<-A2M+8zcKqn^lZTI=ICkRHkyB@mpFMZx-1)QTFPy!0{qogoSMJ`ubMOA0hmY<* ze)90ilgCe9ZG4U%q<&^7YHtZ(hB9`}*DcH}BuSegFR5`w#CvetiGw)2Gj0 zK79e9&)>d%{r>&i&!69a{QU9z_wPS{fauTv|Nj|?0E$0Z7#SE$7<52tL4I;z`|mKT zz(Yr>ee>xC(`>8x`qR2icbv&EcF5r_niBEApqoW7H@QK(@L0teuLXS1jk9%9j=l*C zakTxfDVmlMF3v5fs;aE2(%aXsBFQc8Zlcf5FmooC{!}MpAx^^pEj0xdLr&qW2qp!e z`i*{?3QWFH=^CsYI{Ny-9IP7YEme9_N*d~?G|ryUP?XVY@z`{2&D2fvT=iGgi*Op; zF6Hsn*HBTAQz+%VF<*>Df0MqZinczBSeCIgQ{DABKb#a34zCqgu{y*3V-Yi_WagI~ zL&k&7EesNdZZ8-P9+}y(V_QN*Lz8RwWZeKCCAOk&E=R4TO&XHHt{q%j+gxlIm|8o; eg&mr?cz+2WY1B5-lelnX%Stt7@ejaYvIYP(9Oujc literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/envelope.png b/static/assets/ckeditor/plugins/smiley/images/envelope.png new file mode 100644 index 0000000000000000000000000000000000000000..44398ad137f1d9591692ef073059d709bac99762 GIT binary patch literal 760 zcmbu+>rYZ)90%}|sHtfs)0IYVDqC(=uKA*+wKS|OBd=S%NS)@IT29m1T$$Q(D)Z7T zEnbwh%*#~NMDPHnP=GPO6olp!Cs(;03qM%wc`lE`TjcV7|6Jt% zTI6&10-jJL5G@Ip{s<+~l~t)^Rkk9Pi8nUZr=K7XmQ>ofgsgx?ULZw!!H7bo( zt=U#udnclx4YJ<}iC9hqo?{7gljfL_J5iE1FkCjux|?)+F#xxO5Oa=8EYgscZUTb5h&- z1;LV4O!#1Uj-a?wJ8N z1O-n?Nu80Fz9}epTS(}(sOWuh@$1skcO)e4NlM<9m3=HNeMM36mV&}vRn`0I>dzDu zUa6`+)YN>Uqw`Kv^Odgd2YvlddV22+489r}eKs@uYHt41-28{7S1y*DOJx;b^~ z?U^(0E?jtj$&v>vS3X+1_R;$FFZS(wd*;lCYuCQNeEH+`>!0u6|Nivp&$n-XfByXc z?;itQfZ|UUMh1pB1|5)Xpg3`0|KAYT)ZEhA))dQPWZKi)*WY6(5ZfB-#4a^cdbSk1 z>y)W>a@I?hm~q>4n=iGomUUbZ7sRNhvu*p1?JCS6?JY6B;{F@=#l`wL2#UFdO^FS4 z5oWdZ-5BejZDnnB=kDDl_qCm4V?AUHUc7wu`URiYHBTm`&tH_(KPxhMA8Cscxab`2807v|h#c9;71X`w=M^maDEh84CgtxOFp3|c9U86FD{IxtuR08VrG Am;e9( literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/heart.png b/static/assets/ckeditor/plugins/smiley/images/heart.png new file mode 100644 index 0000000000000000000000000000000000000000..df409e62f55f9915efc6b88d3543786ada9c2897 GIT binary patch literal 999 zcmVy=EE0+jENy_ca@j?ofHzuh@e-|#F+P|WlD;$zCVk-#;IW1m6Vq6W z5q+R(qBeCC64H7>h>&Olkt!=1O9|{r5IHP#_qgDm<^1{rhRcdX(r@y6n3?Z8-MF*NcLMkd*b8I=eZW27CrvkkZ-9ZRFoCHs zBC<;?>-qE6R=IohsQi|lEuCd$@}RL%W}iF}5&2O>wu{Km)BXL@*U%uoyga$;a>?zw zI(c^fyohCui^#qu<`TGOZgSG>I&?^WPfeAvf&vLwR*GI)DnmIra^2~akt=FANKKVH2M);m%a<_``64hCMiG%j;IFQO2lHKiKV`YO zD2lS;>_U+U-F`nQH8s5I>7mBs!I_k_!XqN|kBkthsG!>Cdjgc$fbYhxUCW>A>x&Bp zNKHqDcO%o%*tZy>Q#Vh2T(lw=n<~;bYijC1}@n8N=Zs$=HWvCuLDRmLm_P2wh=SU zO~Vxt%uoox=>UdY9#7Tm#02SEw{99fV;H1)JOGbvz+h%o730AmG1J_1jR%8dR#yWI zDkAc6bar;AW5+Ei8!>+2$nr>*e#n6`Q?@{?FYR&X2^h`g%{E z%nJE@}i00BlK5i%MY*nRnO0NAJLMqs&T4SX@6(27Ry-92(7J=WcgJ0W3>XDk{e z`S4+?Z`=qfc6*hk8^fzTap8*ryJF#R*X{cHWc$DXnRfe|v5AERY literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/kiss.gif b/static/assets/ckeditor/plugins/smiley/images/kiss.gif new file mode 100644 index 0000000000000000000000000000000000000000..ffb23db05a76e7e530ce7a26d658152a37028ef1 GIT binary patch literal 683 zcmZ?wbhEHb6lV};_{PAnjFE92GxKUTwsq|6E4jGVaB!^R=ikiEzMYkIFFX4N4vtMc zJllbYmv;vT$39NZwc_IIq@_0~DeW*f-(_cah?DauKmSQCt~1=+S9y642n!z)6+I&$ za6(M%l$h87Ny(#fa;K%G&&kMK6coHIB643|{(+?ABRRPz^75yZm2c_kJylS6tgik{ zP3@(!@=G9y? zCQZ6Ib?WWev;WSV`FHm0e{<*FU%K?+nl=9xF8sHA`QwcnpKRLnY{!m&yLZ1iefr(` z^B=BW{dn`{*T;{)J$?G)&6_{pzWx3A^Z)<<47h>fPZmZ7hH?fSkP=XwII#b3C~sDsNi*seQi3)VEpJ;D4#m?5=hS?>)tgWmlAxM~&MIify)8%EMTozuQmWs?umd@UeQX(ZS+044;#%6}n+)NBi z+|v5S@Aa9}ww0Hz zPfS!-6obZaqZ~!60w9*;zw}97x7lvs~?8Fe6H4k|81Hjj*c>Hr~ zYRV~875Cx8e*>MskHAO3r!U6GOKi)+<@b{v2n+$uhH3r0D?H%U4*`9~-Ma?|o0`xp zi&Q!d#l^hd*vNs?rVoEeqM( z%RpZr+L<#{x3z_UZ-I6prTiw;+WN)p{rfCDc)-bEknHMeWGsf9oP=~5q}(js=5EUw zfSpRw`|KIHb#)Y@41M=QwutYCljX!t+Z6ym~h9@V6^hs>9c=QR(-i2(jKz0!7mhstT%# zOeT@GO*)ZS3u_wbl@+F=QDWugob2oSN2uyC!?ga|+KN7;9C*~&SZZ~35%hRaoKA$x z1**DMS1CbJQ1bF{`2EOuoYj#LOv_?AD~pexK25obias<<>nGSU{)TDI1-yFwySHxj zKZd+tJ31(HyKxJFT3U+3=R?WQN6~ds^Yhr#)2xh*5st-(78deBcQ>x0qOUf<+lFXE z0k8fx@ZBG`Z&wVRKhM79WpY%NY(*hkQILR@N@1l^M3YI}b#>Hsbl6$@_kU@aR_j*Q zOYn6A4QPqa%ru9)yOqfBFpDE2L`O#f@Kjadt*N1~wwB`hdP6uIpBbh#kjdE*zQrU6 zybl}&jv{5blu{9jG6+0cUk?q_THY!DmGB+R1Rye>-`%w9d%lwl(~@Ki?W^?v{pR)* Z{vUNCpEyW^ic0_h002ovPDHLkV1jyk-jo0U literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/lightbulb.gif b/static/assets/ckeditor/plugins/smiley/images/lightbulb.gif new file mode 100644 index 0000000000000000000000000000000000000000..ceb6e2d9ea3a6496e3df43e6f815567f0d840bb8 GIT binary patch literal 660 zcmZ?wbhEHb6lV};_{P96J%M3XD#yGmftA%dYn#lkbuixUW4_bNc%z^1_C)@h69jKh z6}dZI`uQ~G7c*GDEMWb=lKsOXj*m;Z|F7lxznTC47XCM@1io(-`LkKz|8~JY+lBw{ z6#lHM-|*f7r zmHB@{{@X#N|ECoGpI82WR_*^O-T#-={$JMme?|ZQ3A6v#?RQKL+%+|H-|YBj8=N1n z3p~6y=g89h6RXNkuBm#qHSyVwwC6iB{@-x?f79*%Eua5)!hc=L_;V}c%caWykBa|4 zsXxE9^YWg_HxAE#eXQlpiO#pD`@dXmd3SEw_d7HGKArUc<>Y@)XZ(IL_x6cpA1*KW zbaU;a%R3)m-TmeMu0OB0JimSP<=vCto*euB;@rEZSAV{}`S0tse_wBZdh_7x`)9vC zJ^uIO@&BJszkPc3|Nnmm(t+Yn7Dfh!d%H`LbF z(b3b>*VB^E>*{Q8&q$dyyCsz;&CO`V3NsJR)J3hOotEe~}YXBE>LOcKf literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/lightbulb.png b/static/assets/ckeditor/plugins/smiley/images/lightbulb.png new file mode 100644 index 0000000000000000000000000000000000000000..0c4a92400d0bb454a1f32a54b0ae0bf6a782a960 GIT binary patch literal 919 zcmV;I18Dq-P)WvN&!5cw07D#C~!Zp0GtE9mSpvpW?G>UJQfM~fDiQb`4{q6KSIy`ikVO14h`ZF zA0#yVBA&jHkAYVtS=HNy$0C6+RDP0wem7CP_8HM5Z_q71g3#&1DbAy3XUP8e3A;vK zC35i1-$59YWL2r%8Ojna!2&G<*xOk_00BU_J+9bv2Rbm6C4ixJ;F(Up7`Jm*>2kWk(RVcBZ2#~1-)oaVFum2EQdJf87FfA}`u&Q6v0?WRYSJzd1{f7W%+ks!`9X-KDGKo>h zgI%sd?JD&4SkITpWy^!5Do{ zonh1U0E;P;#gxHf%4CE4h&(ohxBnnO!)LeIlj{ajKy+umQYoV3Cy6g^-9cSy2o z)MM1UL;y&#YQ`b~CB5)%^!nm=6xLU`v6ke<#-BKr&gkU(grWzoGy*q;SK}W;%iUYt zTqPtX7#Ne+RmP3CWNT%b66*oEFTT z71E&>)uk8bp$zAw5C5VA|Dyx{r33$_1^=lB|Dy>1r3?S34*#kM|Emc9tPB6I3;(kY z|FaMOv=8R37yqde|Ee1Qs~i2T9pDoE)W;EJ9cX%GthW2Hooqdi*mz?dS%i4q&4+UQb6 zD9k!#s)Ptpr3@Xb3Ww^!aU;x}K7H<-p@KsX*r7O>WI-ZjNs^pI@*Yt_;qZP^f5n!a;xl4We#HxkUsWm}n?W(4ZlO5+x-j zNO&N@%-gWIa~HH@#!3hgR?OJBT~N&jFmlLnfda*gn>}$rsJX4j!j~utgg8m!kjRrE z45sjr0ilOroeWKk95G@LEImB&;Wr15?sLK0}s%E2XP7=bP#R<0RTHW+Mxab literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/omg_smile.png b/static/assets/ckeditor/plugins/smiley/images/omg_smile.png new file mode 100644 index 0000000000000000000000000000000000000000..abc4e2d0fd657fdb681356a836a798f6b97255c8 GIT binary patch literal 1122 zcmV-o1fBbdP)&{j}T+buSenpo44P)$uX$!0s7P4<#xcW2J=VP-a)CRM=$-wgk`{LVMu zoQs&bo92G4A?T|Hx`9rh!x4b)Xc&k@jZA8*_r?9-4ME>=l>C&~_aTg7Foq#9Y~KuY zLeNp@XbhqCM~%$Tzrq`WzFOcTQj;gSavHoQG&}`?F4*xn2m#BZus8xU-$A|rJ)c4K zBZI(eQ6rPw5^jUlD7QY`!;SOGI&fOBvkS30hR9DN)^39WDq5hb75vXZ;tE`SQ_=di zVBhQ0AP%`5+zbDln;)E1Qy*jPKcg1s#>B$p&&2*p(b5)RcViV;5;JG=!^IdiwUvbS zpCH_Mma<>Y!0zYa(KiO8M&{H8ctg;4oYcfueAA`Owii+P3Gv&tTZA8~!5{YFHP;Yp z1&|V?!m6zyZLBc&#}a;jE1@F;@O6jcnI8q!d;6kBW=PE3P1~bFSrdGFIHY#uQGP#~ zH3QW?Fipr6AfE?I7U5_bRF*?!1te2Y{|;CcFn$4!U5+8j_G(Td-OODIv3diw-HVo+ z2FrrvGNiKT5d&RM6~X#g7X5k}l4+QYLwW@!&%@3q!0Uy%OCg}!)Pbwga$hrx&DJ zuY(@Qt%0RLN<``=R#QloC3H~=x0~z2ZAzh87Ja9hZMU;=P>Q~n9<-ylGjBU~or?nG z7K*RCvFHTaVI`-PMp9HX4$+16`p!H|&6h-COL^c!9{TS$o_bs3hbsvpZ1Ajzod-)S@k3gMDWK zhF#|o!o4xJAArp27EUc9W2?jyCh>$x3uX zfUE@tQ*MgJTk`MAy&%``DJf6|Q)=lc=otXv>5m$jlz}r{7f|K}W-kUwj8GKVL(NsV*Fbn)i5i(N?`7Ndy$hvS~s0{{R307*qoM6N<$f*}_dBLDyZ literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/regular_smile.gif b/static/assets/ckeditor/plugins/smiley/images/regular_smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..fdcf5c33e3973c6fd0bf87b615ba4bbdc3b7e38b GIT binary patch literal 1209 zcmeH`{ZrF*0LMT3GPk)0SsSu7wzZuPkcY8=Y@XxXkYJc`vj^-hEJ-UX(mJTq4h7@} zjUQyoJ9$VW2By-gAwv-k-DKK8PKQ$-N{I24m7O=PYbE=B-<|(NKlSN zvYC?tv{5(}hc+%wb8u!EI=DC`!08o>u6T6t;1a+sM5hQ{@$ke?JH>M@8O}=3Aw!1( z-z3rBsuny+3l~(l@ECfe=uJR>BF-m8`{cMRN56_Wr)4}^`dliyGT_N%`kqGL26XGu zn??6;j$Tnk{c3pS7*N2UL=Px&Rf&KagHJ>QS~{S?kOntaVQ>v@u0?P)LTeF9#%K!0 z);;_&4R_Npna23j>5*q~M~`p@-D^UB0WMjXYg_5j9A?}U^H~tu$xIf-hDz|$?xl&h zVq>KkJAlw3X6!IMQ$o*vieM#1st~HhgcY}KxN{Vv^|7fIX6nnOa5d)YG24v!FEHJT zS!eA2S^V}LX1g%g9h*OogZQd7@HIva4&>uUZTg?QT8tZfND3d6gQisHn52 zRCf2+0^cUtaqIrYo$ePt(|s~r)|5W~ywdn_uID2C3ngE_tuZBk#%;D=Dxz%1|K6gj z=R9e)uYO#j@vcz)@!Fnp7VihOv#^jIdEIZWqMj2+evWq(M`~WNir@^!_%t qkE1T}vTO=}p^q(bnUvZ?!^Fpy?lJmG#KS@EM|@S8cpr;JHvJ1$jidMg literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/regular_smile.png b/static/assets/ckeditor/plugins/smiley/images/regular_smile.png new file mode 100644 index 0000000000000000000000000000000000000000..0f2649b78af3e4e11df8026e70531a9e0c81b117 GIT binary patch literal 1084 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 literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/shades_smile.gif b/static/assets/ckeditor/plugins/smiley/images/shades_smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..7d93474c32aa7d066bde566fdd746483f5dd0aea GIT binary patch literal 1231 zcmd^;{ZrBh9Du*Rqo#-COCgz}9k}mLE)5)f;Ya`Ll)G~LSHB&!Zf5)C5p5LDzp2OUDlq&K;e2`ZN zauAKC(kU^FC~6EE!$9ebkLXO4!J;zbqFL-{_MxbxqvWJxlsGoZj;FEMA0{6o%TK*u zm=T&Oj?5C$awXx4%*YG!=<_+~`CNJmpLvoWo01ZDQos^^&K3&eMW;DwX&iC-QIR-7 zB2AEHCKY6H#8STW+;K&ryhDa)FF95gMwBTcM~j^Xl)=+C+*cZKOW)!_Wd|*G(E6X9 zpv?i)j?jXER@aSAH|W4Xw=4YM3cYUgE!fp|EVSdG0}r=-x4ZViPdK=<8?;_9;=Q0f zuyV(LM-#BqAF!75=;lfTp0Wjx;+-NHbYsPiCUkbtj|*5&j>K1 zU^xg@3OtFfE=pBaoKRNqm0t=PYSS8T3LEQ1b@h^_`qOQV8O`5hshZEIROzag4DIc7 zZP!_?CR24QZ+j>fMiOC^XX=rd`ZJ6JXN`k0(~!(Kn!TmxJ)Qbw=TWN3kZ-z|Z@OP# zG!||>5W~Z?t(iQSQEbo4wyhUnsu-p#VXhp^Rq$Ii{C@4t<5F0-28;DzRc)=d!*VxR z`(R-Jo(#dtAgq~TeHJzz!K-=LT!Ni9u(O5yKM458-UdPXkdU{zZ=Yad07-WyaC(~b z#qGozwb_Z+iral^Sj{Z?wJ}D?<1s1WUn}=>stHduaphdE(Ban>y`joe;2YW?J5+{IC3Z}B%e=xIb zn$z5+PB6(`ygN^Pw<}q?==*{CfQsBq?YpsSZ>WSb(%E5arg+*0ZmfEUnB2cewoEl6 z+2YJk#MpYMSd~0~#Ac6Bx4-m7FekuXPMqZVT%5#^z9Qpn9aB literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/shades_smile.png b/static/assets/ckeditor/plugins/smiley/images/shades_smile.png new file mode 100644 index 0000000000000000000000000000000000000000..fdaa28b786cef4fdbd48a3f1fbf7c7aafc456d97 GIT binary patch literal 1204 zcmV;l1WWsgP)O_$|bO}9oX#bzD? z1cc;fz$uc@1Tu?2Nt-RX2#Mxgo0W3jPrv7V&(VX*W^MiP-QM?kzrWA(Jip)b{9c!? z{y$v)FAezt@DN3dvPI>h9=pozW9pm7zlKXtESjyC^L6m!TTs6QO1urJXEmn2DUW#X z3NFU6qCBpghC}nf8UP)caG?zT7S6Rk=&ym(0{dr44kf zXW(KHwyw=+XIH{WGqj6-PJ(XnTs;e27AT&m=`kwymI<8Ud7RvVRyBp|=ibz8ooTYd zS#W9wv`vTB$Kk{@I6eiM9~H@aPcHn~DLb5xidBr;;Cha){6zmAFKtssG?7vBh=??i zneIzp8|eFZlBO8WH84(vHqhHwXeKzs zOk(mPcI{4KS8fW)s}~X!96-1A2?PA?Wcq5SiZ6h~Rng*0*1gGV;s^?PmhOB>o3I?G z$VER=-PLS(VJ0bS7SYs{MZw-wT}@4ytVxe0J=vG)4`xuEGo5uQvkl*|%$vS%#P{+t zG7_Y~!ct5JJe$_7goc~2SXN`LNN2~EmAb4IX;|`7nQJx?800T2_9H0NjAh?TSWDO5 z^p&i}^67f!hX$fpis^ut^W|c~Bh7r0yNagzSJ?A@k}mbUH#d>MU^9O;Ji@iZ-h_#7 z??(wV)ui3@Rj*~=?hHaA1THMabijKkp2X%2CK3{&Xtt))d~B1Ux-^oKqIvCA$z|gt zXn4@@y%A)bbzhb) z_9r&RpKY1GT<-9PqYue;C&;ZFuTOGC#O#z)fOZ9wbphuU%QxtB3f$4uz7`%XTEtuYu|T^Kscsi4txRYIYg z0ddGWp0*D?xLD+AKx+hgNIFEdCsz-Qp)=3ZSWuZel)5v}umr6{QleN+M^P@(^6{BK@YPt3aq-qp!xeY3PB~VsW;A#}R$W3Fvt498CW85;#@F=f}k=VQa z%`KC{^y`&ZM@yYubvcyOvl>(1lt;Y()e5EkM=kneMl8{Y(*&Xdix=zRUZP!^Sxr3T8vcT~$o+Co#{RP(N>%i&Mj0vv6D zzg?k22N}A^(2c@X3Utz-I{>cI-Mw`9F$nsC;ASwWLhM}(M;~kLItD$V(943}NVv}N z{S@s`aU4HK|31KWXRpGkJ@jXu;0vH9{3P$ zXE`*V5_hG1OXz8?n^7V=IT{dRS?3o34Si9qb)mR}Vbx1N#6h4|-SB z8`j(4(7@`@=HoGsa~jr+TdQ-h_5jxBVci0oOW?7?_LH5>r(Vw=zU{w&*a0Ar|MwpX z;M=Glf;1xh=Z@!}NTC5D2#6B)E61cLGw_Sfyi8>k4?$u@;yh}E;Ka2|d!@A_kW{T^KUlDD1Pa@!w+o={LShVfi25`t;l60a!f>7T)VDC{ZanZ zXW7mpEJmDWBpw~+T@E=#^t1CPr0h59yrs?_#RW=IPOG8t8J3xg=f#xeq-9~135Of^ z)FsC;^dU8g8+VJAQw`I6fkK~gi<^RQ(_A6BGh0EeJ&i~>%0TH1IabnLBqCF3hEo5R z7Z?_CD^&QdYk}EQ1!0BQM nSLqg&lireGWl>tn5RD#+GA6>_JupT>h1}y^V*X?}hP?g{8;sL8 literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/teeth_smile.png b/static/assets/ckeditor/plugins/smiley/images/teeth_smile.png new file mode 100644 index 0000000000000000000000000000000000000000..5e63785e42152e16329c5156f444b06f411f1c00 GIT binary patch literal 1183 zcmV;Q1YrA#P)=u{*lMB(f;3ChP1fr1n8RxV@-_5S4w{Ll{JnkVH?VP|!=1 zfr1Y$WJJ(|m81p{)~-S`n-iPLs*)SxXPued|9t%a_xA9g{g@c7hYlRhy&09{xD8fGE`J)643(KE^ zo;Q!D_2Tn&@JP_Jll<5TzTc$G*wZwrYeL8jC}pdZjU7k{OSeJy`|w@AV*6QvZ}qOZ z8VIG74`q#UYHL`vRZxCEnwbItC`iPoK|%ip4@gPk!VIA3?{P0U?LG*W8!jG!Cx$YJ zrqyY^nAd>KOq>a0jH0|wv~p@bveImo#LyiQ!*?hdCMClnaek7-d7YABfvjb7N~vg4E?M}4E;O#b2LUM+y_FCIXOT`N>pb|i zdz(R3P>y!Asb68uey}Gd8gP!TfehaDP&B}jw0DP?x^VQqV5KakMh?>+^`V>{h`ZMi zEz6;6AOoBO(9(J_k8tc`%OK2HP&K7L;HEHkj9l{AJ;66mzKFw_qP1E!`k7pQq2@0do6@+C$yMqN#FyQ7S z+?j&5Uf4PaOV@n~yq4CBQ;Vps6ng#d`7^&Hx|M|83C;0y%e*?UTJd8_R+}i*E002ovPDHLkV1fcuF z@pzT*({({l*N42=81Z6L?8_}NH&!Lw-&Oy5d%~OTiEno%z1@}i=}`Wc!^K~Y08z=8 zqa|ODReU{ByL`pcRVx;(TCs4=+EtGZbUr@Z_w7`}x6{p^PqltK)AIdX`}gx*KQ8n< zIXd~-$yv`&&;4;};?K*Ie_oyb>-y|p*XRDaG5^Jx1+Oo!{e5%c@7v4%++F$S{@S-U zwqL(>`R1K#_wV2PaPQ#V2e&^yIQHq$sn1W(J$iEg>&t78A3uEd{K@kdPhY=z_3qu9 zUteDR{{H^Qk01a4|7V~*Q2fcl$iNWKpaZfB6ekYs{~O|)np;}in&R}M!Xu*ewI*om znp!((urkhM4eE%SH{X?0V}i6~TzhAfk5Au(by|A5I$CmE(akHPcJ*uN=vml1dpNJt zl#y88-ekui#9?EY@jo8!z9vd!5dd zgO=-sOyc8=Vr@!06Bjslc?h#qFe@BjXw^E!;_3N->%fi<3FW$9Px2QZcly8P#U>_Y z$5uX7x07BUA07~PS~<(aF?~H72g6Jz7msOOT%xmdYM$Qsc#4Hl@1IEKNv18XeezCG zd#VytR<5g>5Ow2*;FA-*bMEO?1a*~8;!|*$q!Cys(8?+}Ph(l=ZZTFyP7h6mFCQu{ hP7vo6<(n69!F;hen_@^yLcom=B67h}^_(mW)&Q&yJ3RmZ literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/thumbs_down.png b/static/assets/ckeditor/plugins/smiley/images/thumbs_down.png new file mode 100644 index 0000000000000000000000000000000000000000..1823481f2f05404a08fcc9357ec930911ff28ca8 GIT binary patch literal 985 zcmV;~119{5P)&g8FSwa4`@0CXJpO@c*)LSW(_eh~ zxvyh;2fD5UkV>Vv-1j}3MvhXu{tooodc3{>9=!%BRfN=VoIDgA?CIYb=|4~Fp|1%v zJ@}?+*(Vm@67c16IdokoVNH^-Ced}B0vfHm4iRqIL10}IRsJASs^u&dAyg1x)NP<~ z>!S>QdXQY|<{Oca@z4TXUD}3}$}LPuK}eOEKgYR#x!ZMg<-^@d+mYDmNXUqqmYs0H zRaFCAGg;1-DoB-@a0}6WuPpkVVu7K)GfZ51tG;2^v6H}lxinEzRW!A78C+LAh=h!F?#dMnA;cP0YbDK9AH_nBUoW1dkk2f}NJV4L8o?iF zZ*;*unrC%U%2h91qImt>z57L1$nXzm$t1_|N7@@)vPdaWq|3GRw7emuO%Xyts`|1h zk1xP{avY#RU3R*H38|FiC=XOfm3+}*;9M6t?tY8D2$9ZLZyk=*TwtVzwR zziwP(ChG-Qzmf(OV5MAnS#P11HpW}yt~j4%K9xlA=m3riq%}>euC6xldQ0zCCX+!S z&o39=r*Z3J1a5Dln4N{}ECs+E>?JW8TPBC%F)+gS(7gAU19S_=aZbhKV~3YLTy5J3 zia)q|Y9GxVPvY~}Ekfc07YN>ag!=8zSN1ps3_o1@&>`7DZ3`oOG-tE35X*E6TjnwI_4N@|MLeio6C;Rj+vpB-*i?CXSEc9djG z&v5O>^W69P#FS~-p_TGi9jIy9v%qs3?th8t$>Bx6x4MSx>?A9@DbZ{|Ub2k|@v#^qQ94zgGM|?gu;u literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/thumbs_up.gif b/static/assets/ckeditor/plugins/smiley/images/thumbs_up.gif new file mode 100644 index 0000000000000000000000000000000000000000..9cc37029a9dc201ab9e0bd3a7cba4083cf56b874 GIT binary patch literal 714 zcmZ?wbhEHb6lV};_{P9+u!8w;CG){bmP6GXN9%Zw)bSr};6L6dc%nu0c&p6mcFB{S z$|pNjPWNhG=u^HjMfdDP!)wzGZ_GBoFvI@VT+7?@ZLciwySgOw+VZIDE8`w4_jtU@ z_vzZ87aJp9Y>IukCFaJeg!{YdUvE!%vpwKd`*OJW%aP(Q$I8AQuljnT z=G)2oJi*oo@birsezD*6(NAzn|;;e!lDbh3+30 zdY>Gf{Oshc=cniXxHR$Sm8n0kPXBd%_OBcBUz}O+`tsV}Hy8fCz3k83m4EK9eS2g3 z^;?&3-nn-F{=E*IrCpB|n1{Pf(TC-=X;y!QCkrMWMO1rh-c6NSp|v{2loFB@lDMwt!>RA!mJEE3`|1m z8k1yL^kd`VVh!Tr;|#gfG}YBjO|>RY($J0a_m9$@(-z0Dk|VIa*+_7uhMBX2g^uRR z)ltVbw8VMwF!eI?iYW&A8tCd8_-<^oV;5w%+wm|?LTZv4hs%stGvb7a@XARFl0qu&8#;doRc(B5UYKO)& i+9x_2`2^c%N*rutViFJS3B4&2{A`z>(S8;t25SHSpFQOO literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/thumbs_up.png b/static/assets/ckeditor/plugins/smiley/images/thumbs_up.png new file mode 100644 index 0000000000000000000000000000000000000000..d4e8b22a3cc95d0d6e7e2de697e9e7fe910ce9ff GIT binary patch literal 959 zcmV;w13>(VP){U?kWlzfV zL6}8_flmtBt?C|RR2^u$tg zC4YQ!u($L2xo+lu@8$ZrZYBqNp90?4jB>4#Ev6Cr6L+K^CQgt)z8$>=PkfzrV;8jjgV~`Aysczw;3Uur z)Za;uB)Z7`b{1pT9ss;vABpzEjP|`vjq$+IoZ89I)j?d>1;FR?)poQWI3ABTdNiff zA!qu}zR|BwYSzRx3QKD$Ow))aIxt(yEuNhkBQ^X3<82@F{E=h${eA%Q`8<6WzTw5A zFF88UlfHaL3;HFAXI{gjZ(9Kb?tdJlK)Mb}I7rts@DBH^y~?A>7teuS5Pg4i&Bb!KTrlw)fi1k%}ZNX z5B}i2Ws{UxfRfirio3#Hu~d3ng?lntYg!LP`Wm|5;nvmub)HJGh+3`^?%thD|=u6{?gEg?cUvO z2MOta*LZ)HP9K zG!u;NqyE9e%!qo1l0$bkE;`x|5RW&W-w3V&?*p#_=9-@jut)pI&@VyM6!w002ovPDHLkV1lw`)rbH9 literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/tongue_smile.gif b/static/assets/ckeditor/plugins/smiley/images/tongue_smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..81e05b0f6adccdc330a951fbc4f7f109da3d2ebc GIT binary patch literal 1210 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 literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.png b/static/assets/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.png new file mode 100644 index 0000000000000000000000000000000000000000..f9714d1b3ba5e9324a1a1663549ba28b45af9638 GIT binary patch literal 1039 zcmV+q1n~QbP)4=F;lf`~OS)ZA#arZuHf*sO8W+|6z`n`}0F?;IcQ-DJ0{X&*drm^%#jcjlb` zoEbH{utX(miPY8s2Y_Cn$9DkB_X*&qxSh>Z1OTcMyd_e56fvKY_%4b)0rmtWC%na` zUWoV}J(NJ{m*RHz%uV4fk=h2}BQlqdGj;-k4zxT9O?^h2u^2I6)$RT1uiWr|B5-pPeQard53H20x$zoFJ*sMRYVK&TyRI-v0hNRGky8$!oh ziaoE!K;2&&pcMW&7e6>IS3kzR??usSUg_MA;O4;JU*I0RkgsxYD?h@P%_N1bz8@#)x1fDOH{OsNwygnCj4WjE%>1j&g z0bqirZn(4tweEUK-=9lkFBaI$BH=0?>DmGU5@ z{=8==Y^~W8&eAgc{udI8BHV`7Tj0oe0u^YD+u6)U`=_Ue8R>=kYJ=8#UC`ncAZ&;# zMKJ{tjRcyEUR~52IS=9X_4d~QaXWj4aQhJZ-hu1Onu24>>+0)Z+;TmPK{;ziFVAWA zy$#{^q0+lumn1nr+sPPv2O(3?YY_+KrDzBk&37Kb~gv z1xQapmG&M9jUWQ9Q5e5m4V`fCG=w|80A7jP*~R~amjpS6IH&mgn+VBC)*ZZ~R`i{Z z*{HzFaXb5ECA}-c{QwQXLqHeM?T-Mz0F(ZB?#8F>mf-(~{R;@jTLnf*B0a2 literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/wink_smile.gif b/static/assets/ckeditor/plugins/smiley/images/wink_smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..6d3d64bd126a56382452a47faa20e3e0e8185a01 GIT binary patch literal 1202 zcmeH`drwmb07q|2ffgD%3r#Ptv=s!@suUKf%GMUUQ4Mni_oAx}+P+B#W9t zc`384uRy9(c??$YRj7s02u08!1_wiIJA=Vix``y#Y!e&W`&;}H`)lV5oa7{@c-Onq zZ5lqoCsqierJVS&lGb*B-mYa_Js8{b9n*0r)_#aN(#-L+ut&{nMo;tZT9W)0=1i{u z9dxuup(6_2F|fvjPqd%W= zO5ogz>ryzjW9Y4wo9P%!!L2mh5d>~;h)f7^SA;1M?ySSFS(wfY&The64%}jR#Q1#^ zyj!U8yvR(!>ciYu^ZAkaT+B)FI4?4!z>Pf^R#UfkM;<6Ck0Ly(#_VU*{HNhbEgn{^ zdMm^3D!8jLdzf+`iTJb;|M!^IW2Oeb)x%ql`$sWn!~;|K(FN+!`PIh;JTbvZ2Jw6r&+p@f2QTNb;zQ^UP^$n%{Lg<|Konxo2%?@4 zzt+BfLe2yc&q|Y;&59yMVw|$7wrMO{VU|{x(g}TnMdb>`1%8$FIrV-+gD(uoXDH;IDdB|9~>2iP04OUyz2P0L_K z)idKS*;BkVYp-;A4LiO#%h4>iKFzC~Y?11h>b~3?Hbv)ttP6b0tg~@8*T`L_wAR?M z#EfE95~(LtoaW7zd&GDKr*z|n1~#qlRMQDTkx=d8OpIwfjrot4!hSyC|6!7HG{yai$rao}e-0@~E!k<%WdMdG-dz-lMHG mG1sQDXpDj5@2CU?g~HL3TxHM|Rq%J|xf8L;ou9~w9sdH=NT%Qb literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/smiley/images/wink_smile.png b/static/assets/ckeditor/plugins/smiley/images/wink_smile.png new file mode 100644 index 0000000000000000000000000000000000000000..7c99c3fc54c753dcfe19ff73e225733a2ad7261e GIT binary patch literal 1114 zcmV-g1f~0lP)kxuNha}UkKykNhbfsO}d(O{?d$--fh(36dZ+^M==6-(X zoZt6%jv5`CWUi4)G)IB8Krhha3n1-l0Qf2E6bo|#05umpm1y3I*bm4ZPvQ)KGXVJk z?_<0d626ifb13~n)+v7eukci&xgB_y!ucJX+zDY9QV&CXHMFh)rQq6WxH<@<-$1nn z>pp_$y@!BZS*JKYC)@+eX?}a>9?tF+vtp-W{%TbD462$zOg@Vw<4vDY)}- z=zQf+)+s(y2TvuMw^A5B%#qdNu6lw7xuBHIfruw-=T2ZPv~7f?`{2tSVbcjkblJA) z8YmHoB4(Jc*C(a5io{}QHv=Z(Y_q2VOiEG z7BsMyOUIIw&mt{hbR`4UGWzFrK0TD-;D;l8|LqvIW|%4)(*0wk`yHmrW;W^hy)gel z2#4X)v7~QdG|)>v4f7h&ZXT=)#xn9(mG#>ev*r0NVvE|CELp}UjK3NfpY&HG0&WS( z9Ds!nK|YP&8-#!!oI!|$!MHOv+OVz_Y#FA?tXL9;N|ly*jU+o-0Jvj*7%CNiy9CD5 zNOC)Bsbr|tEUnQ{z%hOty%H#JAgUTvuGDp?2GYd4p;XZr&thZOgs+a~sg@1X?{1Q< zmxLF9GpLAngLn1>;Fa3Uj~!hJQj1$Seqx-;TnTLOS-@CCM^O_)+z1~a-VNm{7~|>k z7;7KvU|w5pC7-Y2x&lBf)=1A1MJler3KB^o+>X|_!RG!PDzq%?6brNMKQVNe zBfZetXwh0D9*9^J+N03aNX1ozG3a6$MlM3tMMNW^xYbivHJg8iwyxRsuRFMg-rB*L z*P*$|qLrR$|7j_}we{{X)?!4nY9Dm%sXMrIz&X3<+?`>?UMSQw<%(Z}K=Ep(zNj@9 zY=dUyo6xyC1MCV~@y5#{2E5P2uTRqVEKHn+2JKxE8u4eUu>OkLSHk)O(6;#j!}ROrR5Q~c~E$gSXhf_7j7unOq*Bfu$O(2qad gc(wf}`2R8f0lW)%aFGbSlmGw#07*qoM6N<$f??$muK)l5 literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt new file mode 100644 index 0000000..0fabcea --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt @@ -0,0 +1,20 @@ +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license + +cs.js Found: 118 Missing: 0 +cy.js Found: 118 Missing: 0 +de.js Found: 118 Missing: 0 +el.js Found: 16 Missing: 102 +eo.js Found: 118 Missing: 0 +et.js Found: 31 Missing: 87 +fa.js Found: 24 Missing: 94 +fi.js Found: 23 Missing: 95 +fr.js Found: 118 Missing: 0 +hr.js Found: 23 Missing: 95 +it.js Found: 118 Missing: 0 +nb.js Found: 118 Missing: 0 +nl.js Found: 118 Missing: 0 +no.js Found: 118 Missing: 0 +tr.js Found: 118 Missing: 0 +ug.js Found: 39 Missing: 79 +zh-cn.js Found: 118 Missing: 0 diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/af.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/af.js new file mode 100644 index 0000000..27bb901 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/af.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","af",{euro:"Euroteken",lsquo:"Linker enkelkwotasie",rsquo:"Regter enkelkwotasie",ldquo:"Linker dubbelkwotasie",rdquo:"Regter dubbelkwotasie",ndash:"Kortkoppelteken",mdash:"Langkoppelteken",iexcl:"Omgekeerdeuitroepteken",cent:"Centteken",pound:"Pondteken",curren:"Geldeenheidteken",yen:"Yenteken",brvbar:"Gebreekte balk",sect:"Afdeelingsteken",uml:"Deelteken",copy:"Kopieregteken",ordf:"Vroulikekenteken",laquo:"Linkgeoorienteerde aanhaalingsteken",not:"Verbodeteken", +reg:"Regestrasieteken",macr:"Lengteteken",deg:"Gradeteken",sup2:"Kwadraatteken",sup3:"Kubiekteken",acute:"Akuutaksentteken",micro:"Mikroteken",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/ar.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/ar.js new file mode 100644 index 0000000..8c3cc20 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/ar.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ar",{euro:"رمز اليورو",lsquo:"علامة تنصيص فردية علي اليسار",rsquo:"علامة تنصيص فردية علي اليمين",ldquo:"علامة تنصيص مزدوجة علي اليسار",rdquo:"علامة تنصيص مزدوجة علي اليمين",ndash:"En dash",mdash:"Em dash",iexcl:"علامة تعجب مقلوبة",cent:"رمز السنت",pound:"رمز الاسترليني",curren:"رمز العملة",yen:"رمز الين",brvbar:"شريط مقطوع",sect:"رمز القسم",uml:"Diaeresis",copy:"علامة حقوق الطبع",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"ليست علامة",reg:"علامة مسجّلة",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"علامة الإستفهام غير صحيحة",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/bg.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/bg.js new file mode 100644 index 0000000..74cc149 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/bg.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","bg",{euro:"Евро знак",lsquo:"Лява маркировка за цитат",rsquo:"Дясна маркировка за цитат",ldquo:"Лява двойна кавичка за цитат",rdquo:"Дясна двойна кавичка за цитат",ndash:"\\\\",mdash:"/",iexcl:"Обърната питанка",cent:"Знак за цент",pound:"Знак за паунд",curren:"Валутен знак",yen:"Знак за йена",brvbar:"Прекъсната линия",sect:"Знак за секция",uml:"Diaeresis",copy:"Знак за Copyright",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/ca.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/ca.js new file mode 100644 index 0000000..46dcb0a --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/ca.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ca",{euro:"Símbol d'euro",lsquo:"Signe de cometa simple esquerra",rsquo:"Signe de cometa simple dreta",ldquo:"Signe de cometa doble esquerra",rdquo:"Signe de cometa doble dreta",ndash:"Guió",mdash:"Guió baix",iexcl:"Signe d'exclamació inversa",cent:"Símbol de percentatge",pound:"Símbol de lliura",curren:"Símbol de moneda",yen:"Símbol de Yen",brvbar:"Barra trencada",sect:"Símbol de secció",uml:"Dièresi",copy:"Símbol de Copyright",ordf:"Indicador ordinal femení", +laquo:"Signe de cometes angulars esquerra",not:"Símbol de negació",reg:"Símbol registrat",macr:"Macron",deg:"Símbol de grau",sup2:"Superíndex dos",sup3:"Superíndex tres",acute:"Accent agut",micro:"Símbol de micro",para:"Símbol de calderó",middot:"Punt volat",cedil:"Ce trencada",sup1:"Superíndex u",ordm:"Indicador ordinal masculí",raquo:"Signe de cometes angulars dreta",frac14:"Fracció vulgar un quart",frac12:"Fracció vulgar una meitat",frac34:"Fracció vulgar tres quarts",iquest:"Símbol d'interrogació invertit", +Agrave:"Lletra majúscula llatina A amb accent greu",Aacute:"Lletra majúscula llatina A amb accent agut",Acirc:"Lletra majúscula llatina A amb circumflex",Atilde:"Lletra majúscula llatina A amb titlla",Auml:"Lletra majúscula llatina A amb dièresi",Aring:"Lletra majúscula llatina A amb anell superior",AElig:"Lletra majúscula llatina Æ",Ccedil:"Lletra majúscula llatina C amb ce trencada",Egrave:"Lletra majúscula llatina E amb accent greu",Eacute:"Lletra majúscula llatina E amb accent agut",Ecirc:"Lletra majúscula llatina E amb circumflex", +Euml:"Lletra majúscula llatina E amb dièresi",Igrave:"Lletra majúscula llatina I amb accent greu",Iacute:"Lletra majúscula llatina I amb accent agut",Icirc:"Lletra majúscula llatina I amb circumflex",Iuml:"Lletra majúscula llatina I amb dièresi",ETH:"Lletra majúscula llatina Eth",Ntilde:"Lletra majúscula llatina N amb titlla",Ograve:"Lletra majúscula llatina O amb accent greu",Oacute:"Lletra majúscula llatina O amb accent agut",Ocirc:"Lletra majúscula llatina O amb circumflex",Otilde:"Lletra majúscula llatina O amb titlla", +Ouml:"Lletra majúscula llatina O amb dièresi",times:"Símbol de multiplicació",Oslash:"Lletra majúscula llatina O amb barra",Ugrave:"Lletra majúscula llatina U amb accent greu",Uacute:"Lletra majúscula llatina U amb accent agut",Ucirc:"Lletra majúscula llatina U amb circumflex",Uuml:"Lletra majúscula llatina U amb dièresi",Yacute:"Lletra majúscula llatina Y amb accent agut",THORN:"Lletra majúscula llatina Thorn",szlig:"Lletra minúscula llatina sharp s",agrave:"Lletra minúscula llatina a amb accent greu", +aacute:"Lletra minúscula llatina a amb accent agut",acirc:"Lletra minúscula llatina a amb circumflex",atilde:"Lletra minúscula llatina a amb titlla",auml:"Lletra minúscula llatina a amb dièresi",aring:"Lletra minúscula llatina a amb anell superior",aelig:"Lletra minúscula llatina æ",ccedil:"Lletra minúscula llatina c amb ce trencada",egrave:"Lletra minúscula llatina e amb accent greu",eacute:"Lletra minúscula llatina e amb accent agut",ecirc:"Lletra minúscula llatina e amb circumflex",euml:"Lletra minúscula llatina e amb dièresi", +igrave:"Lletra minúscula llatina i amb accent greu",iacute:"Lletra minúscula llatina i amb accent agut",icirc:"Lletra minúscula llatina i amb circumflex",iuml:"Lletra minúscula llatina i amb dièresi",eth:"Lletra minúscula llatina eth",ntilde:"Lletra minúscula llatina n amb titlla",ograve:"Lletra minúscula llatina o amb accent greu",oacute:"Lletra minúscula llatina o amb accent agut",ocirc:"Lletra minúscula llatina o amb circumflex",otilde:"Lletra minúscula llatina o amb titlla",ouml:"Lletra minúscula llatina o amb dièresi", +divide:"Símbol de divisió",oslash:"Lletra minúscula llatina o amb barra",ugrave:"Lletra minúscula llatina u amb accent greu",uacute:"Lletra minúscula llatina u amb accent agut",ucirc:"Lletra minúscula llatina u amb circumflex",uuml:"Lletra minúscula llatina u amb dièresi",yacute:"Lletra minúscula llatina y amb accent agut",thorn:"Lletra minúscula llatina thorn",yuml:"Lletra minúscula llatina y amb dièresi",OElig:"Lligadura majúscula llatina OE",oelig:"Lligadura minúscula llatina oe",372:"Lletra majúscula llatina W amb circumflex", +374:"Lletra majúscula llatina Y amb circumflex",373:"Lletra minúscula llatina w amb circumflex",375:"Lletra minúscula llatina y amb circumflex",sbquo:"Signe de cita simple baixa-9",8219:"Signe de cita simple alta-invertida-9",bdquo:"Signe de cita doble baixa-9",hellip:"Punts suspensius",trade:"Símbol de marca registrada",9658:"Punter negre apuntant cap a la dreta",bull:"Vinyeta",rarr:"Fletxa cap a la dreta",rArr:"Doble fletxa cap a la dreta",hArr:"Doble fletxa esquerra dreta",diams:"Vestit negre diamant", +asymp:"Gairebé igual a"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/cs.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/cs.js new file mode 100644 index 0000000..c8d129e --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/cs.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","cs",{euro:"Znak eura",lsquo:"Počáteční uvozovka jednoduchá",rsquo:"Koncová uvozovka jednoduchá",ldquo:"Počáteční uvozovka dvojitá",rdquo:"Koncová uvozovka dvojitá",ndash:"En pomlčka",mdash:"Em pomlčka",iexcl:"Obrácený vykřičník",cent:"Znak centu",pound:"Znak libry",curren:"Znak měny",yen:"Znak jenu",brvbar:"Přerušená svislá čára",sect:"Znak oddílu",uml:"Přehláska",copy:"Znak copyrightu",ordf:"Ženský indikátor rodu",laquo:"Znak dvojitých lomených uvozovek vlevo", +not:"Logistický zápor",reg:"Znak registrace",macr:"Pomlčka nad",deg:"Znak stupně",sup2:"Dvojka jako horní index",sup3:"Trojka jako horní index",acute:"Čárka nad vpravo",micro:"Znak mikro",para:"Znak odstavce",middot:"Tečka uprostřed",cedil:"Ocásek vlevo",sup1:"Jednička jako horní index",ordm:"Mužský indikátor rodu",raquo:"Znak dvojitých lomených uvozovek vpravo",frac14:"Obyčejný zlomek jedna čtvrtina",frac12:"Obyčejný zlomek jedna polovina",frac34:"Obyčejný zlomek tři čtvrtiny",iquest:"Znak obráceného otazníku", +Agrave:"Velké písmeno latinky A s čárkou nad vlevo",Aacute:"Velké písmeno latinky A s čárkou nad vpravo",Acirc:"Velké písmeno latinky A s vokáněm",Atilde:"Velké písmeno latinky A s tildou",Auml:"Velké písmeno latinky A s dvěma tečkami",Aring:"Velké písmeno latinky A s kroužkem nad",AElig:"Velké písmeno latinky Ae",Ccedil:"Velké písmeno latinky C s ocáskem vlevo",Egrave:"Velké písmeno latinky E s čárkou nad vlevo",Eacute:"Velké písmeno latinky E s čárkou nad vpravo",Ecirc:"Velké písmeno latinky E s vokáněm", +Euml:"Velké písmeno latinky E s dvěma tečkami",Igrave:"Velké písmeno latinky I s čárkou nad vlevo",Iacute:"Velké písmeno latinky I s čárkou nad vpravo",Icirc:"Velké písmeno latinky I s vokáněm",Iuml:"Velké písmeno latinky I s dvěma tečkami",ETH:"Velké písmeno latinky Eth",Ntilde:"Velké písmeno latinky N s tildou",Ograve:"Velké písmeno latinky O s čárkou nad vlevo",Oacute:"Velké písmeno latinky O s čárkou nad vpravo",Ocirc:"Velké písmeno latinky O s vokáněm",Otilde:"Velké písmeno latinky O s tildou", +Ouml:"Velké písmeno latinky O s dvěma tečkami",times:"Znak násobení",Oslash:"Velké písmeno latinky O přeškrtnuté",Ugrave:"Velké písmeno latinky U s čárkou nad vlevo",Uacute:"Velké písmeno latinky U s čárkou nad vpravo",Ucirc:"Velké písmeno latinky U s vokáněm",Uuml:"Velké písmeno latinky U s dvěma tečkami",Yacute:"Velké písmeno latinky Y s čárkou nad vpravo",THORN:"Velké písmeno latinky Thorn",szlig:"Malé písmeno latinky ostré s",agrave:"Malé písmeno latinky a s čárkou nad vlevo",aacute:"Malé písmeno latinky a s čárkou nad vpravo", +acirc:"Malé písmeno latinky a s vokáněm",atilde:"Malé písmeno latinky a s tildou",auml:"Malé písmeno latinky a s dvěma tečkami",aring:"Malé písmeno latinky a s kroužkem nad",aelig:"Malé písmeno latinky ae",ccedil:"Malé písmeno latinky c s ocáskem vlevo",egrave:"Malé písmeno latinky e s čárkou nad vlevo",eacute:"Malé písmeno latinky e s čárkou nad vpravo",ecirc:"Malé písmeno latinky e s vokáněm",euml:"Malé písmeno latinky e s dvěma tečkami",igrave:"Malé písmeno latinky i s čárkou nad vlevo",iacute:"Malé písmeno latinky i s čárkou nad vpravo", +icirc:"Malé písmeno latinky i s vokáněm",iuml:"Malé písmeno latinky i s dvěma tečkami",eth:"Malé písmeno latinky eth",ntilde:"Malé písmeno latinky n s tildou",ograve:"Malé písmeno latinky o s čárkou nad vlevo",oacute:"Malé písmeno latinky o s čárkou nad vpravo",ocirc:"Malé písmeno latinky o s vokáněm",otilde:"Malé písmeno latinky o s tildou",ouml:"Malé písmeno latinky o s dvěma tečkami",divide:"Znak dělení",oslash:"Malé písmeno latinky o přeškrtnuté",ugrave:"Malé písmeno latinky u s čárkou nad vlevo", +uacute:"Malé písmeno latinky u s čárkou nad vpravo",ucirc:"Malé písmeno latinky u s vokáněm",uuml:"Malé písmeno latinky u s dvěma tečkami",yacute:"Malé písmeno latinky y s čárkou nad vpravo",thorn:"Malé písmeno latinky thorn",yuml:"Malé písmeno latinky y s dvěma tečkami",OElig:"Velká ligatura latinky OE",oelig:"Malá ligatura latinky OE",372:"Velké písmeno latinky W s vokáněm",374:"Velké písmeno latinky Y s vokáněm",373:"Malé písmeno latinky w s vokáněm",375:"Malé písmeno latinky y s vokáněm",sbquo:"Dolní 9 uvozovka jednoduchá", +8219:"Horní obrácená 9 uvozovka jednoduchá",bdquo:"Dolní 9 uvozovka dvojitá",hellip:"Trojtečkový úvod",trade:"Obchodní značka",9658:"Černý ukazatel směřující vpravo",bull:"Kolečko",rarr:"Šipka vpravo",rArr:"Dvojitá šipka vpravo",hArr:"Dvojitá šipka vlevo a vpravo",diams:"Černé piky",asymp:"Téměř se rovná"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/cy.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/cy.js new file mode 100644 index 0000000..b873ac9 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/cy.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","cy",{euro:"Arwydd yr Ewro",lsquo:"Dyfynnod chwith unigol",rsquo:"Dyfynnod dde unigol",ldquo:"Dyfynnod chwith dwbl",rdquo:"Dyfynnod dde dwbl",ndash:"Cysylltnod en",mdash:"Cysylltnod em",iexcl:"Ebychnod gwrthdro",cent:"Arwydd sent",pound:"Arwydd punt",curren:"Arwydd arian cyfred",yen:"Arwydd yen",brvbar:"Bar toriedig",sect:"Arwydd adran",uml:"Didolnod",copy:"Arwydd hawlfraint",ordf:"Dangosydd benywaidd",laquo:"Dyfynnod dwbl ar ongl i'r chwith",not:"Arwydd Nid", +reg:"Arwydd cofrestredig",macr:"Macron",deg:"Arwydd gradd",sup2:"Dau uwchsgript",sup3:"Tri uwchsgript",acute:"Acen ddyrchafedig",micro:"Arwydd micro",para:"Arwydd pilcrow",middot:"Dot canol",cedil:"Sedila",sup1:"Un uwchsgript",ordm:"Dangosydd gwrywaidd",raquo:"Dyfynnod dwbl ar ongl i'r dde",frac14:"Ffracsiwn cyffredin un cwarter",frac12:"Ffracsiwn cyffredin un hanner",frac34:"Ffracsiwn cyffredin tri chwarter",iquest:"Marc cwestiwn gwrthdroëdig",Agrave:"Priflythyren A Lladinaidd gydag acen ddisgynedig", +Aacute:"Priflythyren A Lladinaidd gydag acen ddyrchafedig",Acirc:"Priflythyren A Lladinaidd gydag acen grom",Atilde:"Priflythyren A Lladinaidd gyda thild",Auml:"Priflythyren A Lladinaidd gyda didolnod",Aring:"Priflythyren A Lladinaidd gyda chylch uwchben",AElig:"Priflythyren Æ Lladinaidd",Ccedil:"Priflythyren C Lladinaidd gyda sedila",Egrave:"Priflythyren E Lladinaidd gydag acen ddisgynedig",Eacute:"Priflythyren E Lladinaidd gydag acen ddyrchafedig",Ecirc:"Priflythyren E Lladinaidd gydag acen grom", +Euml:"Priflythyren E Lladinaidd gyda didolnod",Igrave:"Priflythyren I Lladinaidd gydag acen ddisgynedig",Iacute:"Priflythyren I Lladinaidd gydag acen ddyrchafedig",Icirc:"Priflythyren I Lladinaidd gydag acen grom",Iuml:"Priflythyren I Lladinaidd gyda didolnod",ETH:"Priflythyren Eth",Ntilde:"Priflythyren N Lladinaidd gyda thild",Ograve:"Priflythyren O Lladinaidd gydag acen ddisgynedig",Oacute:"Priflythyren O Lladinaidd gydag acen ddyrchafedig",Ocirc:"Priflythyren O Lladinaidd gydag acen grom",Otilde:"Priflythyren O Lladinaidd gyda thild", +Ouml:"Priflythyren O Lladinaidd gyda didolnod",times:"Arwydd lluosi",Oslash:"Priflythyren O Lladinaidd gyda strôc",Ugrave:"Priflythyren U Lladinaidd gydag acen ddisgynedig",Uacute:"Priflythyren U Lladinaidd gydag acen ddyrchafedig",Ucirc:"Priflythyren U Lladinaidd gydag acen grom",Uuml:"Priflythyren U Lladinaidd gyda didolnod",Yacute:"Priflythyren Y Lladinaidd gydag acen ddyrchafedig",THORN:"Priflythyren Thorn",szlig:"Llythyren s fach Lladinaidd siarp ",agrave:"Llythyren a fach Lladinaidd gydag acen ddisgynedig", +aacute:"Llythyren a fach Lladinaidd gydag acen ddyrchafedig",acirc:"Llythyren a fach Lladinaidd gydag acen grom",atilde:"Llythyren a fach Lladinaidd gyda thild",auml:"Llythyren a fach Lladinaidd gyda didolnod",aring:"Llythyren a fach Lladinaidd gyda chylch uwchben",aelig:"Llythyren æ fach Lladinaidd",ccedil:"Llythyren c fach Lladinaidd gyda sedila",egrave:"Llythyren e fach Lladinaidd gydag acen ddisgynedig",eacute:"Llythyren e fach Lladinaidd gydag acen ddyrchafedig",ecirc:"Llythyren e fach Lladinaidd gydag acen grom", +euml:"Llythyren e fach Lladinaidd gyda didolnod",igrave:"Llythyren i fach Lladinaidd gydag acen ddisgynedig",iacute:"Llythyren i fach Lladinaidd gydag acen ddyrchafedig",icirc:"Llythyren i fach Lladinaidd gydag acen grom",iuml:"Llythyren i fach Lladinaidd gyda didolnod",eth:"Llythyren eth fach",ntilde:"Llythyren n fach Lladinaidd gyda thild",ograve:"Llythyren o fach Lladinaidd gydag acen ddisgynedig",oacute:"Llythyren o fach Lladinaidd gydag acen ddyrchafedig",ocirc:"Llythyren o fach Lladinaidd gydag acen grom", +otilde:"Llythyren o fach Lladinaidd gyda thild",ouml:"Llythyren o fach Lladinaidd gyda didolnod",divide:"Arwydd rhannu",oslash:"Llythyren o fach Lladinaidd gyda strôc",ugrave:"Llythyren u fach Lladinaidd gydag acen ddisgynedig",uacute:"Llythyren u fach Lladinaidd gydag acen ddyrchafedig",ucirc:"Llythyren u fach Lladinaidd gydag acen grom",uuml:"Llythyren u fach Lladinaidd gyda didolnod",yacute:"Llythyren y fach Lladinaidd gydag acen ddisgynedig",thorn:"Llythyren o fach Lladinaidd gyda strôc",yuml:"Llythyren y fach Lladinaidd gyda didolnod", +OElig:"Priflythyren cwlwm OE Lladinaidd ",oelig:"Priflythyren cwlwm oe Lladinaidd ",372:"Priflythyren W gydag acen grom",374:"Priflythyren Y gydag acen grom",373:"Llythyren w fach gydag acen grom",375:"Llythyren y fach gydag acen grom",sbquo:"Dyfynnod sengl 9-isel",8219:"Dyfynnod sengl 9-uchel cildro",bdquo:"Dyfynnod dwbl 9-isel",hellip:"Coll geiriau llorweddol",trade:"Arwydd marc masnachol",9658:"Pwyntydd du i'r dde",bull:"Bwled",rarr:"Saeth i'r dde",rArr:"Saeth ddwbl i'r dde",hArr:"Saeth ddwbl i'r chwith", +diams:"Siwt diemwnt du",asymp:"Bron yn hafal iddo"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/da.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/da.js new file mode 100644 index 0000000..e20f604 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/da.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","da",{euro:"Euro-tegn",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"Bindestreg",mdash:"Tankestreg",iexcl:"Inverted exclamation mark",cent:"Cent-tegn",pound:"Pund-tegn",curren:"Kurs-tegn",yen:"Yen-tegn",brvbar:"Brudt streg",sect:"Paragraftegn",uml:"Diaeresis",copy:"Copyright-tegn",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Registreret varemærke tegn",macr:"Macron",deg:"Grad-tegn",sup2:"Superscript to",sup3:"Superscript tre",acute:"Acute accent",micro:"Mikro-tegn",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript et",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Varemærke-tegn",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/de.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/de.js new file mode 100644 index 0000000..a056347 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/de.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","de",{euro:"Euro Zeichen",lsquo:"Hochkomma links",rsquo:"Hochkomma rechts",ldquo:"Anführungszeichen links",rdquo:"Anführungszeichen rechts",ndash:"kleiner Strich",mdash:"mittlerer Strich",iexcl:"invertiertes Ausrufezeichen",cent:"Cent",pound:"Pfund",curren:"Währung",yen:"Yen",brvbar:"gestrichelte Linie",sect:"§ Zeichen",uml:"Diäresis",copy:"Copyright",ordf:"Feminine ordinal Anzeige",laquo:"Nach links zeigenden Doppel-Winkel Anführungszeichen",not:"Not-Zeichen", +reg:"Registriert",macr:"Längezeichen",deg:"Grad",sup2:"Hoch 2",sup3:"Hoch 3",acute:"Akzentzeichen ",micro:"Micro",para:"Pilcrow-Zeichen",middot:"Mittelpunkt",cedil:"Cedilla",sup1:"Hoch 1",ordm:"Männliche Ordnungszahl Anzeige",raquo:"Nach rechts zeigenden Doppel-Winkel Anführungszeichen",frac14:"ein Viertel",frac12:"Hälfte",frac34:"Dreiviertel",iquest:"Umgekehrtes Fragezeichen",Agrave:"Lateinischer Buchstabe A mit AkzentGrave",Aacute:"Lateinischer Buchstabe A mit Akutakzent",Acirc:"Lateinischer Buchstabe A mit Zirkumflex", +Atilde:"Lateinischer Buchstabe A mit Tilde",Auml:"Lateinischer Buchstabe A mit Trema",Aring:"Lateinischer Buchstabe A mit Ring oben",AElig:"Lateinischer Buchstabe Æ",Ccedil:"Lateinischer Buchstabe C mit Cedille",Egrave:"Lateinischer Buchstabe E mit AkzentGrave",Eacute:"Lateinischer Buchstabe E mit Akutakzent",Ecirc:"Lateinischer Buchstabe E mit Zirkumflex",Euml:"Lateinischer Buchstabe E Trema",Igrave:"Lateinischer Buchstabe I mit AkzentGrave",Iacute:"Lateinischer Buchstabe I mit Akutakzent",Icirc:"Lateinischer Buchstabe I mit Zirkumflex", +Iuml:"Lateinischer Buchstabe I mit Trema",ETH:"Lateinischer Buchstabe Eth",Ntilde:"Lateinischer Buchstabe N mit Tilde",Ograve:"Lateinischer Buchstabe O mit AkzentGrave",Oacute:"Lateinischer Buchstabe O mit Akutakzent",Ocirc:"Lateinischer Buchstabe O mit Zirkumflex",Otilde:"Lateinischer Buchstabe O mit Tilde",Ouml:"Lateinischer Buchstabe O mit Trema",times:"Multiplikation",Oslash:"Lateinischer Buchstabe O durchgestrichen",Ugrave:"Lateinischer Buchstabe U mit Akzentgrave",Uacute:"Lateinischer Buchstabe U mit Akutakzent", +Ucirc:"Lateinischer Buchstabe U mit Zirkumflex",Uuml:"Lateinischer Buchstabe a mit Trema",Yacute:"Lateinischer Buchstabe a mit Akzent",THORN:"Lateinischer Buchstabe mit Dorn",szlig:"Kleiner lateinischer Buchstabe scharfe s",agrave:"Kleiner lateinischer Buchstabe a mit Accent grave",aacute:"Kleiner lateinischer Buchstabe a mit Akut",acirc:"Lateinischer Buchstabe a mit Zirkumflex",atilde:"Lateinischer Buchstabe a mit Tilde",auml:"Kleiner lateinischer Buchstabe a mit Trema",aring:"Kleiner lateinischer Buchstabe a mit Ring oben", +aelig:"Lateinischer Buchstabe æ",ccedil:"Kleiner lateinischer Buchstabe c mit Cedille",egrave:"Kleiner lateinischer Buchstabe e mit Accent grave",eacute:"Kleiner lateinischer Buchstabe e mit Akut",ecirc:"Kleiner lateinischer Buchstabe e mit Zirkumflex",euml:"Kleiner lateinischer Buchstabe e mit Trema",igrave:"Kleiner lateinischer Buchstabe i mit AkzentGrave",iacute:"Kleiner lateinischer Buchstabe i mit Akzent",icirc:"Kleiner lateinischer Buchstabe i mit Zirkumflex",iuml:"Kleiner lateinischer Buchstabe i mit Trema", +eth:"Kleiner lateinischer Buchstabe eth",ntilde:"Kleiner lateinischer Buchstabe n mit Tilde",ograve:"Kleiner lateinischer Buchstabe o mit Accent grave",oacute:"Kleiner lateinischer Buchstabe o mit Akzent",ocirc:"Kleiner lateinischer Buchstabe o mit Zirkumflex",otilde:"Lateinischer Buchstabe i mit Tilde",ouml:"Kleiner lateinischer Buchstabe o mit Trema",divide:"Divisionszeichen",oslash:"Kleiner lateinischer Buchstabe o durchgestrichen",ugrave:"Kleiner lateinischer Buchstabe u mit Accent grave",uacute:"Kleiner lateinischer Buchstabe u mit Akut", +ucirc:"Kleiner lateinischer Buchstabe u mit Zirkumflex",uuml:"Kleiner lateinischer Buchstabe u mit Trema",yacute:"Kleiner lateinischer Buchstabe y mit Akut",thorn:"Kleiner lateinischer Buchstabe Dorn",yuml:"Kleiner lateinischer Buchstabe y mit Trema",OElig:"Lateinischer Buchstabe Ligatur OE",oelig:"Kleiner lateinischer Buchstabe Ligatur OE",372:"Lateinischer Buchstabe W mit Zirkumflex",374:"Lateinischer Buchstabe Y mit Zirkumflex",373:"Kleiner lateinischer Buchstabe w mit Zirkumflex",375:"Kleiner lateinischer Buchstabe y mit Zirkumflex", +sbquo:"Tiefergestelltes Komma",8219:"Rumgedrehtes Komma",bdquo:"Doppeltes Anführungszeichen unten",hellip:"horizontale Auslassungspunkte",trade:"Handelszeichen",9658:"Dreickspfeil rechts",bull:"Bullet",rarr:"Pfeil rechts",rArr:"Doppelpfeil rechts",hArr:"Doppelpfeil links",diams:"Karo",asymp:"Ungefähr"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/el.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/el.js new file mode 100644 index 0000000..31e69ab --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/el.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","el",{euro:"Σύμβολο Ευρώ",lsquo:"Αριστερός χαρακτήρας μονού εισαγωγικού",rsquo:"Δεξιός χαρακτήρας μονού εισαγωγικού",ldquo:"Αριστερός χαρακτήρας διπλού εισαγωγικού",rdquo:"Δεξιός χαρακτήρας διπλού εισαγωγικού",ndash:"Παύλα en",mdash:"Παύλα em",iexcl:"Ανάποδο θαυμαστικό",cent:"Σύμβολο σεντ",pound:"Σύμβολο λίρας",curren:"Σύμβολο συναλλαγματικής μονάδας",yen:"Σύμβολο Γιεν",brvbar:"Σπασμένη μπάρα",sect:"Σύμβολο τμήματος",uml:"Διαίρεση",copy:"Σύμβολο πνευματικών δικαιωμάτων", +ordf:"Feminine ordinal indicator",laquo:"Αριστερός χαρακτήρας διπλού εισαγωγικού",not:"Σύμβολο άρνησης",reg:"Σύμβολο σημάτων κατατεθέν",macr:"Μακρόν",deg:"Σύμβολο βαθμού",sup2:"Εκτεθειμένο δύο",sup3:"Εκτεθειμένο τρία",acute:"Οξεία",micro:"Σύμβολο μικρού",para:"Σύμβολο παραγράφου",middot:"Μέση τελεία",cedil:"Υπογεγραμμένη",sup1:"Εκτεθειμένο ένα",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Γνήσιο κλάσμα ενός τετάρτου",frac12:"Γνήσιο κλάσμα ενός δεύτερου", +frac34:"Γνήσιο κλάσμα τριών τετάρτων",iquest:"Ανάποδο θαυμαστικό",Agrave:"Λατινικό κεφαλαίο γράμμα A με βαρεία",Aacute:"Λατινικό κεφαλαίο γράμμα A με οξεία",Acirc:"Λατινικό κεφαλαίο γράμμα A με περισπωμένη",Atilde:"Λατινικό κεφαλαίο γράμμα A με περισπωμένη",Auml:"Λατινικό κεφαλαίο γράμμα A με διαλυτικά",Aring:"Λατινικό κεφαλαίο γράμμα A με δακτύλιο επάνω",AElig:"Λατινικό κεφαλαίο γράμμα Æ",Ccedil:"Λατινικό κεφαλαίο γράμμα C με υπογεγραμμένη",Egrave:"Λατινικό κεφαλαίο γράμμα E με βαρεία",Eacute:"Λατινικό κεφαλαίο γράμμα E με οξεία", +Ecirc:"Λατινικό κεφαλαίο γράμμα Ε με περισπωμένη ",Euml:"Λατινικό κεφαλαίο γράμμα Ε με διαλυτικά",Igrave:"Λατινικό κεφαλαίο γράμμα I με βαρεία",Iacute:"Λατινικό κεφαλαίο γράμμα I με οξεία",Icirc:"Λατινικό κεφαλαίο γράμμα I με περισπωμένη",Iuml:"Λατινικό κεφαλαίο γράμμα I με διαλυτικά ",ETH:"Λατινικό κεφαλαίο γράμμα Eth",Ntilde:"Λατινικό κεφαλαίο γράμμα N με περισπωμένη",Ograve:"Λατινικό κεφαλαίο γράμμα O με βαρεία",Oacute:"Λατινικό κεφαλαίο γράμμα O με οξεία",Ocirc:"Λατινικό κεφαλαίο γράμμα O με περισπωμένη ", +Otilde:"Λατινικό κεφαλαίο γράμμα O με περισπωμένη",Ouml:"Λατινικό κεφαλαίο γράμμα O με διαλυτικά",times:"Σύμβολο πολλαπλασιασμού",Oslash:"Λατινικό κεφαλαίο γράμμα O με μολυβιά",Ugrave:"Λατινικό κεφαλαίο γράμμα U με βαρεία",Uacute:"Λατινικό κεφαλαίο γράμμα U με οξεία",Ucirc:"Λατινικό κεφαλαίο γράμμα U με περισπωμένη",Uuml:"Λατινικό κεφαλαίο γράμμα U με διαλυτικά",Yacute:"Λατινικό κεφαλαίο γράμμα Y με οξεία",THORN:"Λατινικό κεφαλαίο γράμμα Thorn",szlig:"Λατινικό μικρό γράμμα απότομο s",agrave:"Λατινικό μικρό γράμμα a με βαρεία", +aacute:"Λατινικό μικρό γράμμα a με οξεία",acirc:"Λατινικό μικρό γράμμα a με περισπωμένη",atilde:"Λατινικό μικρό γράμμα a με περισπωμένη",auml:"Λατινικό μικρό γράμμα a με διαλυτικά",aring:"Λατινικό μικρό γράμμα a με δακτύλιο πάνω",aelig:"Λατινικό μικρό γράμμα æ",ccedil:"Λατινικό μικρό γράμμα c με υπογεγραμμένη",egrave:"Λατινικό μικρό γράμμα ε με βαρεία",eacute:"Λατινικό μικρό γράμμα e με οξεία",ecirc:"Λατινικό μικρό γράμμα e με περισπωμένη",euml:"Λατινικό μικρό γράμμα e με διαλυτικά",igrave:"Λατινικό μικρό γράμμα i με βαρεία", +iacute:"Λατινικό μικρό γράμμα i με οξεία",icirc:"Λατινικό μικρό γράμμα i με περισπωμένη",iuml:"Λατινικό μικρό γράμμα i με διαλυτικά",eth:"Λατινικό μικρό γράμμα eth",ntilde:"Λατινικό μικρό γράμμα n με περισπωμένη",ograve:"Λατινικό μικρό γράμμα o με βαρεία",oacute:"Λατινικό μικρό γράμμα o με οξεία ",ocirc:"Λατινικό πεζό γράμμα o με περισπωμένη",otilde:"Λατινικό μικρό γράμμα o με περισπωμένη ",ouml:"Λατινικό μικρό γράμμα o με διαλυτικά",divide:"Σύμβολο διαίρεσης",oslash:"Λατινικό μικρό γράμμα o με περισπωμένη", +ugrave:"Λατινικό μικρό γράμμα u με βαρεία",uacute:"Λατινικό μικρό γράμμα u με οξεία",ucirc:"Λατινικό μικρό γράμμα u με περισπωμένη",uuml:"Λατινικό μικρό γράμμα u με διαλυτικά",yacute:"Λατινικό μικρό γράμμα y με οξεία",thorn:"Λατινικό μικρό γράμμα thorn",yuml:"Λατινικό μικρό γράμμα y με διαλυτικά",OElig:"Λατινικό κεφαλαίο σύμπλεγμα ΟΕ",oelig:"Λατινικό μικρό σύμπλεγμα oe",372:"Λατινικό κεφαλαίο γράμμα W με περισπωμένη",374:"Λατινικό κεφαλαίο γράμμα Y με περισπωμένη",373:"Λατινικό μικρό γράμμα w με περισπωμένη", +375:"Λατινικό μικρό γράμμα y με περισπωμένη",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Οριζόντια αποσιωπητικά",trade:"Σύμβολο εμπορικού κατατεθέν",9658:"Μαύρος δείκτης που δείχνει προς τα δεξιά",bull:"Κουκκίδα",rarr:"Δεξί βελάκι",rArr:"Διπλό δεξί βελάκι",hArr:"Διπλό βελάκι αριστερά-δεξιά",diams:"Μαύρο διαμάντι",asymp:"Σχεδόν ίσο με"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/en-gb.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/en-gb.js new file mode 100644 index 0000000..08de561 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/en-gb.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","en-gb",{euro:"Euro sign",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"Currency sign",yen:"Yen sign",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/en.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/en.js new file mode 100644 index 0000000..418406d --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/en.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","en",{euro:"Euro sign",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"Currency sign",yen:"Yen sign",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/eo.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/eo.js new file mode 100644 index 0000000..c5803d5 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/eo.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","eo",{euro:"Eŭrosigno",lsquo:"Supra 6-citilo",rsquo:"Supra 9-citilo",ldquo:"Supra 66-citilo",rdquo:"Supra 99-citilo",ndash:"Streketo",mdash:"Substreko",iexcl:"Renversita krisigno",cent:"Cendosigno",pound:"Pundosigno",curren:"Monersigno",yen:"Enosigno",brvbar:"Rompita vertikala streko",sect:"Kurba paragrafo",uml:"Tremao",copy:"Kopirajtosigno",ordf:"Adjektiva numerfinaĵo",laquo:"Duobla malplio-citilo",not:"Negohoko",reg:"Registrita marko",macr:"Superstreko",deg:"Gradosigno", +sup2:"Supra indico 2",sup3:"Supra indico 3",acute:"Dekstra korno",micro:"Mikrosigno",para:"Rekta paragrafo",middot:"Meza punkto",cedil:"Zoeto",sup1:"Supra indico 1",ordm:"Substantiva numerfinaĵo",raquo:"Duobla plio-citilo",frac14:"Kvaronosigno",frac12:"Duonosigno",frac34:"Trikvaronosigno",iquest:"renversita demandosigno",Agrave:"Latina ĉeflitero A kun liva korno",Aacute:"Latina ĉeflitero A kun dekstra korno",Acirc:"Latina ĉeflitero A kun ĉapelo",Atilde:"Latina ĉeflitero A kun tildo",Auml:"Latina ĉeflitero A kun tremao", +Aring:"Latina ĉeflitero A kun superringo",AElig:"Latina ĉeflitera ligaturo Æ",Ccedil:"Latina ĉeflitero C kun zoeto",Egrave:"Latina ĉeflitero E kun liva korno",Eacute:"Latina ĉeflitero E kun dekstra korno",Ecirc:"Latina ĉeflitero E kun ĉapelo",Euml:"Latina ĉeflitero E kun tremao",Igrave:"Latina ĉeflitero I kun liva korno",Iacute:"Latina ĉeflitero I kun dekstra korno",Icirc:"Latina ĉeflitero I kun ĉapelo",Iuml:"Latina ĉeflitero I kun tremao",ETH:"Latina ĉeflitero islanda edo",Ntilde:"Latina ĉeflitero N kun tildo", +Ograve:"Latina ĉeflitero O kun liva korno",Oacute:"Latina ĉeflitero O kun dekstra korno",Ocirc:"Latina ĉeflitero O kun ĉapelo",Otilde:"Latina ĉeflitero O kun tildo",Ouml:"Latina ĉeflitero O kun tremao",times:"Multipliko",Oslash:"Latina ĉeflitero O trastrekita",Ugrave:"Latina ĉeflitero U kun liva korno",Uacute:"Latina ĉeflitero U kun dekstra korno",Ucirc:"Latina ĉeflitero U kun ĉapelo",Uuml:"Latina ĉeflitero U kun tremao",Yacute:"Latina ĉeflitero Y kun dekstra korno",THORN:"Latina ĉeflitero islanda dorno", +szlig:"Latina etlitero germana sozo (akra s)",agrave:"Latina etlitero a kun liva korno",aacute:"Latina etlitero a kun dekstra korno",acirc:"Latina etlitero a kun ĉapelo",atilde:"Latina etlitero a kun tildo",auml:"Latina etlitero a kun tremao",aring:"Latina etlitero a kun superringo",aelig:"Latina etlitera ligaturo æ",ccedil:"Latina etlitero c kun zoeto",egrave:"Latina etlitero e kun liva korno",eacute:"Latina etlitero e kun dekstra korno",ecirc:"Latina etlitero e kun ĉapelo",euml:"Latina etlitero e kun tremao", +igrave:"Latina etlitero i kun liva korno",iacute:"Latina etlitero i kun dekstra korno",icirc:"Latina etlitero i kun ĉapelo",iuml:"Latina etlitero i kun tremao",eth:"Latina etlitero islanda edo",ntilde:"Latina etlitero n kun tildo",ograve:"Latina etlitero o kun liva korno",oacute:"Latina etlitero o kun dekstra korno",ocirc:"Latina etlitero o kun ĉapelo",otilde:"Latina etlitero o kun tildo",ouml:"Latina etlitero o kun tremao",divide:"Dividosigno",oslash:"Latina etlitero o trastrekita",ugrave:"Latina etlitero u kun liva korno", +uacute:"Latina etlitero u kun dekstra korno",ucirc:"Latina etlitero u kun ĉapelo",uuml:"Latina etlitero u kun tremao",yacute:"Latina etlitero y kun dekstra korno",thorn:"Latina etlitero islanda dorno",yuml:"Latina etlitero y kun tremao",OElig:"Latina ĉeflitera ligaturo Œ",oelig:"Latina etlitera ligaturo œ",372:"Latina ĉeflitero W kun ĉapelo",374:"Latina ĉeflitero Y kun ĉapelo",373:"Latina etlitero w kun ĉapelo",375:"Latina etlitero y kun ĉapelo",sbquo:"Suba 9-citilo",8219:"Supra renversita 9-citilo", +bdquo:"Suba 99-citilo",hellip:"Tripunkto",trade:"Varmarka signo",9658:"Nigra sago dekstren",bull:"Bulmarko",rarr:"Sago dekstren",rArr:"Duobla sago dekstren",hArr:"Duobla sago maldekstren",diams:"Nigra kvadrato",asymp:"Preskaŭ egala"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/es.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/es.js new file mode 100644 index 0000000..e91f1a0 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/es.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","es",{euro:"Símbolo de euro",lsquo:"Comilla simple izquierda",rsquo:"Comilla simple derecha",ldquo:"Comilla doble izquierda",rdquo:"Comilla doble derecha",ndash:"Guión corto",mdash:"Guión medio largo",iexcl:"Signo de admiración invertido",cent:"Símbolo centavo",pound:"Símbolo libra",curren:"Símbolo moneda",yen:"Símbolo yen",brvbar:"Barra vertical rota",sect:"Símbolo sección",uml:"Diéresis",copy:"Signo de derechos de autor",ordf:"Indicador ordinal femenino",laquo:"Abre comillas angulares", +not:"Signo negación",reg:"Signo de marca registrada",macr:"Guión alto",deg:"Signo de grado",sup2:"Superíndice dos",sup3:"Superíndice tres",acute:"Acento agudo",micro:"Signo micro",para:"Signo de pi",middot:"Punto medio",cedil:"Cedilla",sup1:"Superíndice uno",ordm:"Indicador orginal masculino",raquo:"Cierra comillas angulares",frac14:"Fracción ordinaria de un quarto",frac12:"Fracción ordinaria de una mitad",frac34:"Fracción ordinaria de tres cuartos",iquest:"Signo de interrogación invertido",Agrave:"Letra A latina mayúscula con acento grave", +Aacute:"Letra A latina mayúscula con acento agudo",Acirc:"Letra A latina mayúscula con acento circunflejo",Atilde:"Letra A latina mayúscula con tilde",Auml:"Letra A latina mayúscula con diéresis",Aring:"Letra A latina mayúscula con aro arriba",AElig:"Letra Æ latina mayúscula",Ccedil:"Letra C latina mayúscula con cedilla",Egrave:"Letra E latina mayúscula con acento grave",Eacute:"Letra E latina mayúscula con acento agudo",Ecirc:"Letra E latina mayúscula con acento circunflejo",Euml:"Letra E latina mayúscula con diéresis", +Igrave:"Letra I latina mayúscula con acento grave",Iacute:"Letra I latina mayúscula con acento agudo",Icirc:"Letra I latina mayúscula con acento circunflejo",Iuml:"Letra I latina mayúscula con diéresis",ETH:"Letra Eth latina mayúscula",Ntilde:"Letra N latina mayúscula con tilde",Ograve:"Letra O latina mayúscula con acento grave",Oacute:"Letra O latina mayúscula con acento agudo",Ocirc:"Letra O latina mayúscula con acento circunflejo",Otilde:"Letra O latina mayúscula con tilde",Ouml:"Letra O latina mayúscula con diéresis", +times:"Signo de multiplicación",Oslash:"Letra O latina mayúscula con barra inclinada",Ugrave:"Letra U latina mayúscula con acento grave",Uacute:"Letra U latina mayúscula con acento agudo",Ucirc:"Letra U latina mayúscula con acento circunflejo",Uuml:"Letra U latina mayúscula con diéresis",Yacute:"Letra Y latina mayúscula con acento agudo",THORN:"Letra Thorn latina mayúscula",szlig:"Letra s latina fuerte pequeña",agrave:"Letra a latina pequeña con acento grave",aacute:"Letra a latina pequeña con acento agudo", +acirc:"Letra a latina pequeña con acento circunflejo",atilde:"Letra a latina pequeña con tilde",auml:"Letra a latina pequeña con diéresis",aring:"Letra a latina pequeña con aro arriba",aelig:"Letra æ latina pequeña",ccedil:"Letra c latina pequeña con cedilla",egrave:"Letra e latina pequeña con acento grave",eacute:"Letra e latina pequeña con acento agudo",ecirc:"Letra e latina pequeña con acento circunflejo",euml:"Letra e latina pequeña con diéresis",igrave:"Letra i latina pequeña con acento grave", +iacute:"Letra i latina pequeña con acento agudo",icirc:"Letra i latina pequeña con acento circunflejo",iuml:"Letra i latina pequeña con diéresis",eth:"Letra eth latina pequeña",ntilde:"Letra n latina pequeña con tilde",ograve:"Letra o latina pequeña con acento grave",oacute:"Letra o latina pequeña con acento agudo",ocirc:"Letra o latina pequeña con acento circunflejo",otilde:"Letra o latina pequeña con tilde",ouml:"Letra o latina pequeña con diéresis",divide:"Signo de división",oslash:"Letra o latina minúscula con barra inclinada", +ugrave:"Letra u latina pequeña con acento grave",uacute:"Letra u latina pequeña con acento agudo",ucirc:"Letra u latina pequeña con acento circunflejo",uuml:"Letra u latina pequeña con diéresis",yacute:"Letra u latina pequeña con acento agudo",thorn:"Letra thorn latina minúscula",yuml:"Letra y latina pequeña con diéresis",OElig:"Diptongo OE latino en mayúscula",oelig:"Diptongo oe latino en minúscula",372:"Letra W latina mayúscula con acento circunflejo",374:"Letra Y latina mayúscula con acento circunflejo", +373:"Letra w latina pequeña con acento circunflejo",375:"Letra y latina pequeña con acento circunflejo",sbquo:"Comilla simple baja-9",8219:"Comilla simple alta invertida-9",bdquo:"Comillas dobles bajas-9",hellip:"Puntos suspensivos horizontales",trade:"Signo de marca registrada",9658:"Apuntador negro apuntando a la derecha",bull:"Viñeta",rarr:"Flecha a la derecha",rArr:"Flecha doble a la derecha",hArr:"Flecha izquierda derecha doble",diams:"Diamante negro",asymp:"Casi igual a"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/et.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/et.js new file mode 100644 index 0000000..2a20883 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/et.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","et",{euro:"Euromärk",lsquo:"Alustav ühekordne jutumärk",rsquo:"Lõpetav ühekordne jutumärk",ldquo:"Alustav kahekordne jutumärk",rdquo:"Lõpetav kahekordne jutumärk",ndash:"Enn-kriips",mdash:"Emm-kriips",iexcl:"Pööratud hüüumärk",cent:"Sendimärk",pound:"Naela märk",curren:"Valuutamärk",yen:"Jeeni märk",brvbar:"Katkestatud kriips",sect:"Lõigu märk",uml:"Täpid",copy:"Autoriõiguse märk",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Ei-märk",reg:"Registered sign",macr:"Macron",deg:"Kraadimärk",sup2:"Ülaindeks kaks",sup3:"Ülaindeks kolm",acute:"Acute accent",micro:"Mikro-märk",para:"Pilcrow sign",middot:"Keskpunkt",cedil:"Cedilla",sup1:"Ülaindeks üks",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Ladina suur A tildega",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Täppidega ladina suur O",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Kandilise katusega suur ladina U",Uuml:"Täppidega ladina suur U",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Ladina väike terav s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Kandilise katusega ladina väike a",atilde:"Tildega ladina väike a",auml:"Täppidega ladina väike a",aring:"Latin small letter a with ring above", +aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde", +ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Jagamismärk",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent", +thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Kaubamärgi märk",9658:"Black right-pointing pointer", +bull:"Kuul",rarr:"Nool paremale",rArr:"Topeltnool paremale",hArr:"Topeltnool vasakule",diams:"Black diamond suit",asymp:"Ligikaudu võrdne"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/fa.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/fa.js new file mode 100644 index 0000000..c3efb3c --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/fa.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","fa",{euro:"نشان یورو",lsquo:"علامت نقل قول تکی چپ",rsquo:"علامت نقل قول تکی راست",ldquo:"علامت نقل قول دوتایی چپ",rdquo:"علامت نقل قول دوتایی راست",ndash:"خط تیره En",mdash:"خط تیره Em",iexcl:"علامت تعجب وارونه",cent:"نشان سنت",pound:"نشان پوند",curren:"نشان ارز",yen:"نشان ین",brvbar:"نوار شکسته",sect:"نشان بخش",uml:"نشان سواگیری",copy:"نشان کپی رایت",ordf:"شاخص ترتیبی مونث",laquo:"اشاره چپ مکرر برای زاویه علامت نقل قول",not:"نشان ثبت نشده",reg:"نشان ثبت شده", +macr:"نشان خط بالای حرف",deg:"نشان درجه",sup2:"بالانویس دو",sup3:"بالانویس سه",acute:"لهجه غلیظ",micro:"نشان مایکرو",para:"نشان محل بند",middot:"نقطه میانی",cedil:"سدیل",sup1:"بالانویس 1",ordm:"شاخص ترتیبی مذکر",raquo:"نشان زاویه‌دار دوتایی نقل قول راست چین",frac14:"واحد عامیانه 1/4",frac12:"واحد عامینه نصف",frac34:"واحد عامیانه 3/4",iquest:"علامت سوال معکوس",Agrave:"حرف A بزرگ لاتین با تلفظ غلیظ",Aacute:"حرف A بزرگ لاتین با تلفظ شدید",Acirc:"حرف A بزرگ لاتین با دور",Atilde:"حرف A بزرگ لاتین با صدای کامی", +Auml:"حرف A بزرگ لاتین با نشان سواگیری",Aring:"حرف A بزرگ لاتین با حلقه بالا",AElig:"حرف Æ بزرگ لاتین",Ccedil:"حرف C بزرگ لاتین با نشان سواگیری",Egrave:"حرف E بزرگ لاتین با تلفظ درشت",Eacute:"حرف E بزرگ لاتین با تلفظ زیر",Ecirc:"حرف E بزرگ لاتین با خمان",Euml:"حرف E بزرگ لاتین با نشان سواگیری",Igrave:"حرف I بزرگ لاتین با تلفظ درشت",Iacute:"حرف I بزرگ لاتین با تلفظ ریز",Icirc:"حرف I بزرگ لاتین با خمان",Iuml:"حرف I بزرگ لاتین با نشان سواگیری",ETH:"حرف لاتین بزرگ واکه ترتیبی",Ntilde:"حرف N بزرگ لاتین با مد", +Ograve:"حرف O بزرگ لاتین با تلفظ درشت",Oacute:"حرف O بزرگ لاتین با تلفظ ریز",Ocirc:"حرف O بزرگ لاتین با خمان",Otilde:"حرف O بزرگ لاتین با مد",Ouml:"حرف O بزرگ لاتین با نشان سواگیری",times:"نشان ضربدر",Oslash:"حرف O بزرگ لاتین با میان خط",Ugrave:"حرف U بزرگ لاتین با تلفظ درشت",Uacute:"حرف U بزرگ لاتین با تلفظ ریز",Ucirc:"حرف U بزرگ لاتین با خمان",Uuml:"حرف U بزرگ لاتین با نشان سواگیری",Yacute:"حرف Y بزرگ لاتین با تلفظ ریز",THORN:"حرف بزرگ لاتین خاردار",szlig:"حرف کوچک لاتین شارپ s",agrave:"حرف a کوچک لاتین با تلفظ درشت", +aacute:"حرف a کوچک لاتین با تلفظ ریز",acirc:"حرف a کوچک لاتین با خمان",atilde:"حرف a کوچک لاتین با صدای کامی",auml:"حرف a کوچک لاتین با نشان سواگیری",aring:"حرف a کوچک لاتین گوشواره دار",aelig:"حرف کوچک لاتین æ",ccedil:"حرف c کوچک لاتین با نشان سدیل",egrave:"حرف e کوچک لاتین با تلفظ درشت",eacute:"حرف e کوچک لاتین با تلفظ ریز",ecirc:"حرف e کوچک لاتین با خمان",euml:"حرف e کوچک لاتین با نشان سواگیری",igrave:"حرف i کوچک لاتین با تلفظ درشت",iacute:"حرف i کوچک لاتین با تلفظ ریز",icirc:"حرف i کوچک لاتین با خمان", +iuml:"حرف i کوچک لاتین با نشان سواگیری",eth:"حرف کوچک لاتین eth",ntilde:"حرف n کوچک لاتین با صدای کامی",ograve:"حرف o کوچک لاتین با تلفظ درشت",oacute:"حرف o کوچک لاتین با تلفظ زیر",ocirc:"حرف o کوچک لاتین با خمان",otilde:"حرف o کوچک لاتین با صدای کامی",ouml:"حرف o کوچک لاتین با نشان سواگیری",divide:"نشان بخش",oslash:"حرف o کوچک لاتین با میان خط",ugrave:"حرف u کوچک لاتین با تلفظ درشت",uacute:"حرف u کوچک لاتین با تلفظ ریز",ucirc:"حرف u کوچک لاتین با خمان",uuml:"حرف u کوچک لاتین با نشان سواگیری",yacute:"حرف y کوچک لاتین با تلفظ ریز", +thorn:"حرف کوچک لاتین خاردار",yuml:"حرف y کوچک لاتین با نشان سواگیری",OElig:"بند بزرگ لاتین OE",oelig:"بند کوچک لاتین oe",372:"حرف W بزرگ لاتین با خمان",374:"حرف Y بزرگ لاتین با خمان",373:"حرف w کوچک لاتین با خمان",375:"حرف y کوچک لاتین با خمان",sbquo:"نشان نقل قول تکی زیر-9",8219:"نشان نقل قول تکی high-reversed-9",bdquo:"نقل قول دوتایی پایین-9",hellip:"حذف افقی",trade:"نشان تجاری",9658:"نشانگر سیاه جهت راست",bull:"گلوله",rarr:"فلش راست",rArr:"فلش دوتایی راست",hArr:"فلش دوتایی چپ راست",diams:"نشان الماس سیاه", +asymp:"تقریبا برابر با"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/fi.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/fi.js new file mode 100644 index 0000000..79f4a7d --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/fi.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","fi",{euro:"Euron merkki",lsquo:"Vasen yksittäinen lainausmerkki",rsquo:"Oikea yksittäinen lainausmerkki",ldquo:"Vasen kaksoislainausmerkki",rdquo:"Oikea kaksoislainausmerkki",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Sentin merkki",pound:"Punnan merkki",curren:"Valuuttamerkki",yen:"Yenin merkki",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Rekisteröity merkki",macr:"Macron",deg:"Asteen merkki",sup2:"Yläindeksi kaksi",sup3:"Yläindeksi kolme",acute:"Acute accent",micro:"Mikron merkki",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Yläindeksi yksi",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Ylösalaisin oleva kysymysmerkki",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Kertomerkki",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Jakomerkki",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Tavaramerkki merkki",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Nuoli oikealle",rArr:"Kaksoisnuoli oikealle",hArr:"Kaksoisnuoli oikealle ja vasemmalle",diams:"Black diamond suit",asymp:"Noin"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js new file mode 100644 index 0000000..24a0d0d --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","fr-ca",{euro:"Symbole Euro",lsquo:"Guillemet simple ouvrant",rsquo:"Guillemet simple fermant",ldquo:"Guillemet double ouvrant",rdquo:"Guillemet double fermant",ndash:"Tiret haut",mdash:"Tiret",iexcl:"Point d'exclamation inversé",cent:"Symbole de cent",pound:"Symbole de Livre Sterling",curren:"Symbole monétaire",yen:"Symbole du Yen",brvbar:"Barre scindée",sect:"Symbole de section",uml:"Tréma",copy:"Symbole de copyright",ordf:"Indicateur ordinal féminin",laquo:"Guillemet français ouvrant", +not:"Indicateur de négation",reg:"Symbole de marque déposée",macr:"Macron",deg:"Degré",sup2:"Exposant 2",sup3:"Exposant 3",acute:"Accent aigüe",micro:"Symbole micro",para:"Paragraphe",middot:"Point médian",cedil:"Cédille",sup1:"Exposant 1",ordm:"Indicateur ordinal masculin",raquo:"Guillemet français fermant",frac14:"Un quart",frac12:"Une demi",frac34:"Trois quart",iquest:"Point d'interrogation inversé",Agrave:"A accent grave",Aacute:"A accent aigüe",Acirc:"A circonflexe",Atilde:"A tilde",Auml:"A tréma", +Aring:"A avec un rond au dessus",AElig:"Æ majuscule",Ccedil:"C cédille",Egrave:"E accent grave",Eacute:"E accent aigüe",Ecirc:"E accent circonflexe",Euml:"E tréma",Igrave:"I accent grave",Iacute:"I accent aigüe",Icirc:"I accent circonflexe",Iuml:"I tréma",ETH:"Lettre majuscule islandaise ED",Ntilde:"N tilde",Ograve:"O accent grave",Oacute:"O accent aigüe",Ocirc:"O accent circonflexe",Otilde:"O tilde",Ouml:"O tréma",times:"Symbole de multiplication",Oslash:"O barré",Ugrave:"U accent grave",Uacute:"U accent aigüe", +Ucirc:"U accent circonflexe",Uuml:"U tréma",Yacute:"Y accent aigüe",THORN:"Lettre islandaise Thorn majuscule",szlig:"Lettre minuscule allemande s dur",agrave:"a accent grave",aacute:"a accent aigüe",acirc:"a accent circonflexe",atilde:"a tilde",auml:"a tréma",aring:"a avec un cercle au dessus",aelig:"æ",ccedil:"c cédille",egrave:"e accent grave",eacute:"e accent aigüe",ecirc:"e accent circonflexe",euml:"e tréma",igrave:"i accent grave",iacute:"i accent aigüe",icirc:"i accent circonflexe",iuml:"i tréma", +eth:"Lettre minuscule islandaise ED",ntilde:"n tilde",ograve:"o accent grave",oacute:"o accent aigüe",ocirc:"O accent circonflexe",otilde:"O tilde",ouml:"O tréma",divide:"Symbole de division",oslash:"o barré",ugrave:"u accent grave",uacute:"u accent aigüe",ucirc:"u accent circonflexe",uuml:"u tréma",yacute:"y accent aigüe",thorn:"Lettre islandaise thorn minuscule",yuml:"y tréma",OElig:"ligature majuscule latine Œ",oelig:"ligature minuscule latine œ",372:"W accent circonflexe",374:"Y accent circonflexe", +373:"w accent circonflexe",375:"y accent circonflexe",sbquo:"Guillemet simple fermant",8219:"Guillemet-virgule supérieur culbuté",bdquo:"Guillemet-virgule double inférieur",hellip:"Points de suspension",trade:"Symbole de marque déposée",9658:"Flèche noire pointant vers la droite",bull:"Puce",rarr:"Flèche vers la droite",rArr:"Flèche double vers la droite",hArr:"Flèche double vers la gauche",diams:"Carreau",asymp:"Presque égal"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/fr.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/fr.js new file mode 100644 index 0000000..b224b1e --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/fr.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","fr",{euro:"Symbole Euro",lsquo:"Guillemet simple ouvrant",rsquo:"Guillemet simple fermant",ldquo:"Guillemet double ouvrant",rdquo:"Guillemet double fermant",ndash:"Tiret haut",mdash:"Tiret cadratin",iexcl:"Point d'exclamation inversé",cent:"Symbole Cent",pound:"Symbole Livre Sterling",curren:"Symbole monétaire",yen:"Symbole Yen",brvbar:"Barre verticale scindée",sect:"Section",uml:"Tréma",copy:"Symbole Copyright",ordf:"Indicateur ordinal féminin",laquo:"Guillemet français ouvrant", +not:"Crochet de négation",reg:"Marque déposée",macr:"Macron",deg:"Degré",sup2:"Exposant 2",sup3:"\\tExposant 3",acute:"Accent aigu",micro:"Omicron",para:"Paragraphe",middot:"Point médian",cedil:"Cédille",sup1:"\\tExposant 1",ordm:"Indicateur ordinal masculin",raquo:"Guillemet français fermant",frac14:"Un quart",frac12:"Un demi",frac34:"Trois quarts",iquest:"Point d'interrogation inversé",Agrave:"A majuscule accent grave",Aacute:"A majuscule accent aigu",Acirc:"A majuscule accent circonflexe",Atilde:"A majuscule avec caron", +Auml:"A majuscule tréma",Aring:"A majuscule avec un rond au-dessus",AElig:"Æ majuscule ligaturés",Ccedil:"C majuscule cédille",Egrave:"E majuscule accent grave",Eacute:"E majuscule accent aigu",Ecirc:"E majuscule accent circonflexe",Euml:"E majuscule tréma",Igrave:"I majuscule accent grave",Iacute:"I majuscule accent aigu",Icirc:"I majuscule accent circonflexe",Iuml:"I majuscule tréma",ETH:"Lettre majuscule islandaise ED",Ntilde:"N majuscule avec caron",Ograve:"O majuscule accent grave",Oacute:"O majuscule accent aigu", +Ocirc:"O majuscule accent circonflexe",Otilde:"O majuscule avec caron",Ouml:"O majuscule tréma",times:"Multiplication",Oslash:"O majuscule barré",Ugrave:"U majuscule accent grave",Uacute:"U majuscule accent aigu",Ucirc:"U majuscule accent circonflexe",Uuml:"U majuscule tréma",Yacute:"Y majuscule accent aigu",THORN:"Lettre islandaise Thorn majuscule",szlig:"Lettre minuscule allemande s dur",agrave:"a minuscule accent grave",aacute:"a minuscule accent aigu",acirc:"a minuscule accent circonflexe",atilde:"a minuscule avec caron", +auml:"a minuscule tréma",aring:"a minuscule avec un rond au-dessus",aelig:"æ minuscule ligaturés",ccedil:"c minuscule cédille",egrave:"e minuscule accent grave",eacute:"e minuscule accent aigu",ecirc:"e minuscule accent circonflexe",euml:"e minuscule tréma",igrave:"i minuscule accent grave",iacute:"i minuscule accent aigu",icirc:"i minuscule accent circonflexe",iuml:"i minuscule tréma",eth:"Lettre minuscule islandaise ED",ntilde:"n minuscule avec caron",ograve:"o minuscule accent grave",oacute:"o minuscule accent aigu", +ocirc:"o minuscule accent circonflexe",otilde:"o minuscule avec caron",ouml:"o minuscule tréma",divide:"Division",oslash:"o minuscule barré",ugrave:"u minuscule accent grave",uacute:"u minuscule accent aigu",ucirc:"u minuscule accent circonflexe",uuml:"u minuscule tréma",yacute:"y minuscule accent aigu",thorn:"Lettre islandaise thorn minuscule",yuml:"y minuscule tréma",OElig:"ligature majuscule latine Œ",oelig:"ligature minuscule latine œ",372:"W majuscule accent circonflexe",374:"Y majuscule accent circonflexe", +373:"w minuscule accent circonflexe",375:"y minuscule accent circonflexe",sbquo:"Guillemet simple fermant (anglais)",8219:"Guillemet-virgule supérieur culbuté",bdquo:"Guillemet-virgule double inférieur",hellip:"Points de suspension",trade:"Marque commerciale (trade mark)",9658:"Flèche noire pointant vers la droite",bull:"Gros point médian",rarr:"Flèche vers la droite",rArr:"Double flèche vers la droite",hArr:"Double flèche vers la gauche",diams:"Carreau noir",asymp:"Presque égal"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/gl.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/gl.js new file mode 100644 index 0000000..797ecc5 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/gl.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","gl",{euro:"Símbolo do euro",lsquo:"Comiña simple esquerda",rsquo:"Comiña simple dereita",ldquo:"Comiñas dobres esquerda",rdquo:"Comiñas dobres dereita",ndash:"Guión",mdash:"Raia",iexcl:"Signo de admiración invertido",cent:"Símbolo do centavo",pound:"Símbolo da libra",curren:"Símbolo de moeda",yen:"Símbolo do yen",brvbar:"Barra vertical rota",sect:"Símbolo de sección",uml:"Diérese",copy:"Símbolo de dereitos de autoría",ordf:"Indicador ordinal feminino",laquo:"Comiñas latinas, apertura", +not:"Signo negación",reg:"Símbolo de marca rexistrada",macr:"Guión alto",deg:"Signo de grao",sup2:"Superíndice dous",sup3:"Superíndice tres",acute:"Acento agudo",micro:"Signo de micro",para:"Signo de pi",middot:"Punto medio",cedil:"Cedilla",sup1:"Superíndice un",ordm:"Indicador ordinal masculino",raquo:"Comiñas latinas, peche",frac14:"Fracción ordinaria de un cuarto",frac12:"Fracción ordinaria de un medio",frac34:"Fracción ordinaria de tres cuartos",iquest:"Signo de interrogación invertido",Agrave:"Letra A latina maiúscula con acento grave", +Aacute:"Letra A latina maiúscula con acento agudo",Acirc:"Letra A latina maiúscula con acento circunflexo",Atilde:"Letra A latina maiúscula con til",Auml:"Letra A latina maiúscula con diérese",Aring:"Letra A latina maiúscula con aro enriba",AElig:"Letra Æ latina maiúscula",Ccedil:"Letra C latina maiúscula con cedilla",Egrave:"Letra E latina maiúscula con acento grave",Eacute:"Letra E latina maiúscula con acento agudo",Ecirc:"Letra E latina maiúscula con acento circunflexo",Euml:"Letra E latina maiúscula con diérese", +Igrave:"Letra I latina maiúscula con acento grave",Iacute:"Letra I latina maiúscula con acento agudo",Icirc:"Letra I latina maiúscula con acento circunflexo",Iuml:"Letra I latina maiúscula con diérese",ETH:"Letra Ed latina maiúscula",Ntilde:"Letra N latina maiúscula con til",Ograve:"Letra O latina maiúscula con acento grave",Oacute:"Letra O latina maiúscula con acento agudo",Ocirc:"Letra O latina maiúscula con acento circunflexo",Otilde:"Letra O latina maiúscula con til",Ouml:"Letra O latina maiúscula con diérese", +times:"Signo de multiplicación",Oslash:"Letra O latina maiúscula con barra transversal",Ugrave:"Letra U latina maiúscula con acento grave",Uacute:"Letra U latina maiúscula con acento agudo",Ucirc:"Letra U latina maiúscula con acento circunflexo",Uuml:"Letra U latina maiúscula con diérese",Yacute:"Letra Y latina maiúscula con acento agudo",THORN:"Letra Thorn latina maiúscula",szlig:"Letra s latina forte minúscula",agrave:"Letra a latina minúscula con acento grave",aacute:"Letra a latina minúscula con acento agudo", +acirc:"Letra a latina minúscula con acento circunflexo",atilde:"Letra a latina minúscula con til",auml:"Letra a latina minúscula con diérese",aring:"Letra a latina minúscula con aro enriba",aelig:"Letra æ latina minúscula",ccedil:"Letra c latina minúscula con cedilla",egrave:"Letra e latina minúscula con acento grave",eacute:"Letra e latina minúscula con acento agudo",ecirc:"Letra e latina minúscula con acento circunflexo",euml:"Letra e latina minúscula con diérese",igrave:"Letra i latina minúscula con acento grave", +iacute:"Letra i latina minúscula con acento agudo",icirc:"Letra i latina minúscula con acento circunflexo",iuml:"Letra i latina minúscula con diérese",eth:"Letra ed latina minúscula",ntilde:"Letra n latina minúscula con til",ograve:"Letra o latina minúscula con acento grave",oacute:"Letra o latina minúscula con acento agudo",ocirc:"Letra o latina minúscula con acento circunflexo",otilde:"Letra o latina minúscula con til",ouml:"Letra o latina minúscula con diérese",divide:"Signo de división",oslash:"Letra o latina minúscula con barra transversal", +ugrave:"Letra u latina minúscula con acento grave",uacute:"Letra u latina minúscula con acento agudo",ucirc:"Letra u latina minúscula con acento circunflexo",uuml:"Letra u latina minúscula con diérese",yacute:"Letra y latina minúscula con acento agudo",thorn:"Letra Thorn latina minúscula",yuml:"Letra y latina minúscula con diérese",OElig:"Ligadura OE latina maiúscula",oelig:"Ligadura oe latina minúscula",372:"Letra W latina maiúscula con acento circunflexo",374:"Letra Y latina maiúscula con acento circunflexo", +373:"Letra w latina minúscula con acento circunflexo",375:"Letra y latina minúscula con acento circunflexo",sbquo:"Comiña simple baixa, de apertura",8219:"Comiña simple alta, de peche",bdquo:"Comiñas dobres baixas, de apertura",hellip:"Elipse, puntos suspensivos",trade:"Signo de marca rexistrada",9658:"Apuntador negro apuntando á dereita",bull:"Viñeta",rarr:"Frecha á dereita",rArr:"Frecha dobre á dereita",hArr:"Frecha dobre da esquerda á dereita",diams:"Diamante negro",asymp:"Case igual a"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/he.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/he.js new file mode 100644 index 0000000..7593589 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/he.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","he",{euro:"יורו",lsquo:"סימן ציטוט יחיד שמאלי",rsquo:"סימן ציטוט יחיד ימני",ldquo:"סימן ציטוט כפול שמאלי",rdquo:"סימן ציטוט כפול ימני",ndash:"קו מפריד קצר",mdash:"קו מפריד ארוך",iexcl:"סימן קריאה הפוך",cent:"סנט",pound:"פאונד",curren:"מטבע",yen:"ין",brvbar:"קו שבור",sect:"סימן מקטע",uml:"שתי נקודות אופקיות (Diaeresis)",copy:"סימן זכויות יוצרים (Copyright)",ordf:"סימן אורדינאלי נקבי",laquo:"סימן ציטוט זווית כפולה לשמאל",not:"סימן שלילה מתמטי",reg:"סימן רשום", +macr:"מקרון (הגיה ארוכה)",deg:"מעלות",sup2:"2 בכתיב עילי",sup3:"3 בכתיב עילי",acute:"סימן דגוש (Acute)",micro:"מיקרו",para:"סימון פסקה",middot:"נקודה אמצעית",cedil:"סדיליה",sup1:"1 בכתיב עילי",ordm:"סימן אורדינאלי זכרי",raquo:"סימן ציטוט זווית כפולה לימין",frac14:"רבע בשבר פשוט",frac12:"חצי בשבר פשוט",frac34:"שלושה רבעים בשבר פשוט",iquest:"סימן שאלה הפוך",Agrave:"אות לטינית A עם גרש (Grave)",Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde", +Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"אות לטינית Æ גדולה",Ccedil:"Latin capital letter C with cedilla",Egrave:"אות לטינית E עם גרש (Grave)",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"אות לטינית I עם גרש (Grave)",Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis", +ETH:"אות לטינית Eth גדולה",Ntilde:"Latin capital letter N with tilde",Ograve:"אות לטינית O עם גרש (Grave)",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"סימן כפל",Oslash:"Latin capital letter O with stroke",Ugrave:"אות לטינית U עם גרש (Grave)",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis", +Yacute:"Latin capital letter Y with acute accent",THORN:"אות לטינית Thorn גדולה",szlig:"אות לטינית s חדה קטנה",agrave:"אות לטינית a עם גרש (Grave)",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",aelig:"אות לטינית æ קטנה",ccedil:"Latin small letter c with cedilla",egrave:"אות לטינית e עם גרש (Grave)",eacute:"Latin small letter e with acute accent", +ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"אות לטינית i עם גרש (Grave)",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"אות לטינית eth קטנה",ntilde:"Latin small letter n with tilde",ograve:"אות לטינית o עם גרש (Grave)",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis", +divide:"סימן חלוקה",oslash:"Latin small letter o with stroke",ugrave:"אות לטינית u עם גרש (Grave)",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",thorn:"אות לטינית thorn קטנה",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex", +373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"סימן ציטוט נמוך יחיד",8219:"סימן ציטוט",bdquo:"סימן ציטוט נמוך כפול",hellip:"שלוש נקודות",trade:"סימן טריידמארק",9658:"סמן שחור לצד ימין",bull:"תבליט (רשימה)",rarr:"חץ לימין",rArr:"חץ כפול לימין",hArr:"חץ כפול לימין ושמאל",diams:"יהלום מלא",asymp:"כמעט שווה"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/hr.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/hr.js new file mode 100644 index 0000000..6575432 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/hr.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","hr",{euro:"Euro znak",lsquo:"Lijevi jednostruki navodnik",rsquo:"Desni jednostruki navodnik",ldquo:"Lijevi dvostruki navodnik",rdquo:"Desni dvostruki navodnik",ndash:"En crtica",mdash:"Em crtica",iexcl:"Naopaki uskličnik",cent:"Cent znak",pound:"Funta znak",curren:"Znak valute",yen:"Yen znak",brvbar:"Potrgana prečka",sect:"Znak odjeljka",uml:"Prijeglasi",copy:"Copyright znak",ordf:"Feminine ordinal indicator",laquo:"Lijevi dvostruki uglati navodnik",not:"Not znak", +reg:"Registered znak",macr:"Macron",deg:"Stupanj znak",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Mikro znak",para:"Pilcrow sign",middot:"Srednja točka",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Desni dvostruku uglati navodnik",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Naopaki upitnik",Agrave:"Veliko latinsko slovo A s akcentom",Aacute:"Latinično veliko slovo A sa oštrim naglaskom", +Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent", +Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent", +Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above", +aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde", +ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent", +thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer", +bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/hu.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/hu.js new file mode 100644 index 0000000..4455483 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/hu.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","hu",{euro:"Euró jel",lsquo:"Bal szimpla idézőjel",rsquo:"Jobb szimpla idézőjel",ldquo:"Bal dupla idézőjel",rdquo:"Jobb dupla idézőjel",ndash:"Rövid gondolatjel",mdash:"Hosszú gondolatjel",iexcl:"Fordított felkiáltójel",cent:"Cent jel",pound:"Font jel",curren:"Valuta jel",yen:"Yen jel",brvbar:"Hosszú kettőspont",sect:"Paragrafus jel",uml:"Kettős hangzó jel",copy:"Szerzői jog jel",ordf:"Női sorrend mutatója",laquo:"Balra mutató duplanyíl",not:"Feltételes kötőjel", +reg:"Bejegyzett védjegy jele",macr:"Hosszúsági jel",deg:"Fok jel",sup2:"Négyzeten jel",sup3:"Köbön jel",acute:"Éles ékezet",micro:"Mikro-jel",para:"Bekezdés jel",middot:"Közép pont",cedil:"Cédille",sup1:"Elsőn jel",ordm:"Férfi sorrend mutatója",raquo:"Jobbra mutató duplanyíl",frac14:"Egy negyed jel",frac12:"Egy ketted jel",frac34:"Három negyed jel",iquest:"Fordított kérdőjel",Agrave:"Latin nagy A fordított ékezettel",Aacute:"Latin nagy A normál ékezettel",Acirc:"Latin nagy A hajtott ékezettel",Atilde:"Latin nagy A hullámjellel", +Auml:"Latin nagy A kettőspont ékezettel",Aring:"Latin nagy A gyűrű ékezettel",AElig:"Latin nagy Æ betű",Ccedil:"Latin nagy C cedillával",Egrave:"Latin nagy E fordított ékezettel",Eacute:"Latin nagy E normál ékezettel",Ecirc:"Latin nagy E hajtott ékezettel",Euml:"Latin nagy E dupla kettőspont ékezettel",Igrave:"Latin nagy I fordított ékezettel",Iacute:"Latin nagy I normál ékezettel",Icirc:"Latin nagy I hajtott ékezettel",Iuml:"Latin nagy I kettőspont ékezettel",ETH:"Latin nagy Eth betű",Ntilde:"Latin nagy N hullámjellel", +Ograve:"Latin nagy O fordított ékezettel",Oacute:"Latin nagy O normál ékezettel",Ocirc:"Latin nagy O hajtott ékezettel",Otilde:"Latin nagy O hullámjellel",Ouml:"Latin nagy O kettőspont ékezettel",times:"Szorzás jel",Oslash:"Latin O betű áthúzással",Ugrave:"Latin nagy U fordított ékezettel",Uacute:"Latin nagy U normál ékezettel",Ucirc:"Latin nagy U hajtott ékezettel",Uuml:"Latin nagy U kettőspont ékezettel",Yacute:"Latin nagy Y normál ékezettel",THORN:"Latin nagy Thorn betű",szlig:"Latin kis s betű", +agrave:"Latin kis a fordított ékezettel",aacute:"Latin kis a normál ékezettel",acirc:"Latin kis a hajtott ékezettel",atilde:"Latin kis a hullámjellel",auml:"Latin kis a kettőspont ékezettel",aring:"Latin kis a gyűrű ékezettel",aelig:"Latin kis æ betű",ccedil:"Latin kis c cedillával",egrave:"Latin kis e fordított ékezettel",eacute:"Latin kis e normál ékezettel",ecirc:"Latin kis e hajtott ékezettel",euml:"Latin kis e dupla kettőspont ékezettel",igrave:"Latin kis i fordított ékezettel",iacute:"Latin kis i normál ékezettel", +icirc:"Latin kis i hajtott ékezettel",iuml:"Latin kis i kettőspont ékezettel",eth:"Latin kis eth betű",ntilde:"Latin kis n hullámjellel",ograve:"Latin kis o fordított ékezettel",oacute:"Latin kis o normál ékezettel",ocirc:"Latin kis o hajtott ékezettel",otilde:"Latin kis o hullámjellel",ouml:"Latin kis o kettőspont ékezettel",divide:"Osztásjel",oslash:"Latin kis o betű áthúzással",ugrave:"Latin kis u fordított ékezettel",uacute:"Latin kis u normál ékezettel",ucirc:"Latin kis u hajtott ékezettel", +uuml:"Latin kis u kettőspont ékezettel",yacute:"Latin kis y normál ékezettel",thorn:"Latin kis thorn jel",yuml:"Latin kis y kettőspont ékezettel",OElig:"Latin nagy OE-jel",oelig:"Latin kis oe-jel",372:"Latin nagy W hajtott ékezettel",374:"Latin nagy Y hajtott ékezettel",373:"Latin kis w hajtott ékezettel",375:"Latin kis y hajtott ékezettel",sbquo:"Nyitó nyomdai szimpla idézőjel",8219:"Záró nyomdai záró idézőjel",bdquo:"Nyitó nyomdai dupla idézőjel",hellip:"Három pont",trade:"Kereskedelmi védjegy jele", +9658:"Jobbra mutató fekete mutató",bull:"Golyó",rarr:"Jobbra mutató nyíl",rArr:"Jobbra mutató duplanyíl",hArr:"Bal-jobb duplanyíl",diams:"Fekete gyémánt jel",asymp:"Majdnem egyenlő jel"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/id.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/id.js new file mode 100644 index 0000000..1b4bd67 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/id.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","id",{euro:"Tanda Euro",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"Currency sign",yen:"Tanda Yen",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Tanda Hak Cipta",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Tanda Telah Terdaftar",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/it.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/it.js new file mode 100644 index 0000000..6b09097 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/it.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","it",{euro:"Simbolo Euro",lsquo:"Virgoletta singola sinistra",rsquo:"Virgoletta singola destra",ldquo:"Virgolette aperte",rdquo:"Virgolette chiuse",ndash:"Trattino",mdash:"Trattino lungo",iexcl:"Punto esclavamativo invertito",cent:"Simbolo Cent",pound:"Simbolo Sterlina",curren:"Simbolo Moneta",yen:"Simbolo Yen",brvbar:"Barra interrotta",sect:"Simbolo di sezione",uml:"Dieresi",copy:"Simbolo Copyright",ordf:"Indicatore ordinale femminile",laquo:"Virgolette basse aperte", +not:"Nessun segno",reg:"Simbolo Registrato",macr:"Macron",deg:"Simbolo Grado",sup2:"Apice Due",sup3:"Apice Tre",acute:"Accento acuto",micro:"Simbolo Micro",para:"Simbolo Paragrafo",middot:"Punto centrale",cedil:"Cediglia",sup1:"Apice Uno",ordm:"Indicatore ordinale maschile",raquo:"Virgolette basse chiuse",frac14:"Frazione volgare un quarto",frac12:"Frazione volgare un mezzo",frac34:"Frazione volgare tre quarti",iquest:"Punto interrogativo invertito",Agrave:"Lettera maiuscola latina A con accento grave", +Aacute:"Lettera maiuscola latina A con accento acuto",Acirc:"Lettera maiuscola latina A con accento circonflesso",Atilde:"Lettera maiuscola latina A con tilde",Auml:"Lettera maiuscola latina A con dieresi",Aring:"Lettera maiuscola latina A con anello sopra",AElig:"Lettera maiuscola latina AE",Ccedil:"Lettera maiuscola latina C con cediglia",Egrave:"Lettera maiuscola latina E con accento grave",Eacute:"Lettera maiuscola latina E con accento acuto",Ecirc:"Lettera maiuscola latina E con accento circonflesso", +Euml:"Lettera maiuscola latina E con dieresi",Igrave:"Lettera maiuscola latina I con accento grave",Iacute:"Lettera maiuscola latina I con accento acuto",Icirc:"Lettera maiuscola latina I con accento circonflesso",Iuml:"Lettera maiuscola latina I con dieresi",ETH:"Lettera maiuscola latina Eth",Ntilde:"Lettera maiuscola latina N con tilde",Ograve:"Lettera maiuscola latina O con accento grave",Oacute:"Lettera maiuscola latina O con accento acuto",Ocirc:"Lettera maiuscola latina O con accento circonflesso", +Otilde:"Lettera maiuscola latina O con tilde",Ouml:"Lettera maiuscola latina O con dieresi",times:"Simbolo di moltiplicazione",Oslash:"Lettera maiuscola latina O barrata",Ugrave:"Lettera maiuscola latina U con accento grave",Uacute:"Lettera maiuscola latina U con accento acuto",Ucirc:"Lettera maiuscola latina U con accento circonflesso",Uuml:"Lettera maiuscola latina U con accento circonflesso",Yacute:"Lettera maiuscola latina Y con accento acuto",THORN:"Lettera maiuscola latina Thorn",szlig:"Lettera latina minuscola doppia S", +agrave:"Lettera minuscola latina a con accento grave",aacute:"Lettera minuscola latina a con accento acuto",acirc:"Lettera minuscola latina a con accento circonflesso",atilde:"Lettera minuscola latina a con tilde",auml:"Lettera minuscola latina a con dieresi",aring:"Lettera minuscola latina a con anello superiore",aelig:"Lettera minuscola latina ae",ccedil:"Lettera minuscola latina c con cediglia",egrave:"Lettera minuscola latina e con accento grave",eacute:"Lettera minuscola latina e con accento acuto", +ecirc:"Lettera minuscola latina e con accento circonflesso",euml:"Lettera minuscola latina e con dieresi",igrave:"Lettera minuscola latina i con accento grave",iacute:"Lettera minuscola latina i con accento acuto",icirc:"Lettera minuscola latina i con accento circonflesso",iuml:"Lettera minuscola latina i con dieresi",eth:"Lettera minuscola latina eth",ntilde:"Lettera minuscola latina n con tilde",ograve:"Lettera minuscola latina o con accento grave",oacute:"Lettera minuscola latina o con accento acuto", +ocirc:"Lettera minuscola latina o con accento circonflesso",otilde:"Lettera minuscola latina o con tilde",ouml:"Lettera minuscola latina o con dieresi",divide:"Simbolo di divisione",oslash:"Lettera minuscola latina o barrata",ugrave:"Lettera minuscola latina u con accento grave",uacute:"Lettera minuscola latina u con accento acuto",ucirc:"Lettera minuscola latina u con accento circonflesso",uuml:"Lettera minuscola latina u con dieresi",yacute:"Lettera minuscola latina y con accento acuto",thorn:"Lettera minuscola latina thorn", +yuml:"Lettera minuscola latina y con dieresi",OElig:"Legatura maiuscola latina OE",oelig:"Legatura minuscola latina oe",372:"Lettera maiuscola latina W con accento circonflesso",374:"Lettera maiuscola latina Y con accento circonflesso",373:"Lettera minuscola latina w con accento circonflesso",375:"Lettera minuscola latina y con accento circonflesso",sbquo:"Singola virgoletta bassa low-9",8219:"Singola virgoletta bassa low-9 inversa",bdquo:"Doppia virgoletta bassa low-9",hellip:"Ellissi orizzontale", +trade:"Simbolo TM",9658:"Puntatore nero rivolto verso destra",bull:"Punto",rarr:"Freccia verso destra",rArr:"Doppia freccia verso destra",hArr:"Doppia freccia sinistra destra",diams:"Simbolo nero diamante",asymp:"Quasi uguale a"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/ja.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/ja.js new file mode 100644 index 0000000..b32e890 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/ja.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ja",{euro:"ユーロ記号",lsquo:"左シングル引用符",rsquo:"右シングル引用符",ldquo:"左ダブル引用符",rdquo:"右ダブル引用符",ndash:"半角ダッシュ",mdash:"全角ダッシュ",iexcl:"逆さ感嘆符",cent:"セント記号",pound:"ポンド記号",curren:"通貨記号",yen:"円記号",brvbar:"上下に分かれた縦棒",sect:"節記号",uml:"分音記号(ウムラウト)",copy:"著作権表示記号",ordf:"女性序数標識",laquo:" 始め二重山括弧引用記号",not:"論理否定記号",reg:"登録商標記号",macr:"長音符",deg:"度記号",sup2:"上つき2, 2乗",sup3:"上つき3, 3乗",acute:"揚音符",micro:"ミクロン記号",para:"段落記号",middot:"中黒",cedil:"セディラ",sup1:"上つき1",ordm:"男性序数標識",raquo:"終わり二重山括弧引用記号", +frac14:"四分の一",frac12:"二分の一",frac34:"四分の三",iquest:"逆疑問符",Agrave:"抑音符つき大文字A",Aacute:"揚音符つき大文字A",Acirc:"曲折アクセントつき大文字A",Atilde:"チルダつき大文字A",Auml:"分音記号つき大文字A",Aring:"リングつき大文字A",AElig:"AとEの合字",Ccedil:"セディラつき大文字C",Egrave:"抑音符つき大文字E",Eacute:"揚音符つき大文字E",Ecirc:"曲折アクセントつき大文字E",Euml:"分音記号つき大文字E",Igrave:"抑音符つき大文字I",Iacute:"揚音符つき大文字I",Icirc:"曲折アクセントつき大文字I",Iuml:"分音記号つき大文字I",ETH:"[アイスランド語]大文字ETH",Ntilde:"チルダつき大文字N",Ograve:"抑音符つき大文字O",Oacute:"揚音符つき大文字O",Ocirc:"曲折アクセントつき大文字O",Otilde:"チルダつき大文字O",Ouml:" 分音記号つき大文字O", +times:"乗算記号",Oslash:"打ち消し線つき大文字O",Ugrave:"抑音符つき大文字U",Uacute:"揚音符つき大文字U",Ucirc:"曲折アクセントつき大文字U",Uuml:"分音記号つき大文字U",Yacute:"揚音符つき大文字Y",THORN:"[アイスランド語]大文字THORN",szlig:"ドイツ語エスツェット",agrave:"抑音符つき小文字a",aacute:"揚音符つき小文字a",acirc:"曲折アクセントつき小文字a",atilde:"チルダつき小文字a",auml:"分音記号つき小文字a",aring:"リングつき小文字a",aelig:"aとeの合字",ccedil:"セディラつき小文字c",egrave:"抑音符つき小文字e",eacute:"揚音符つき小文字e",ecirc:"曲折アクセントつき小文字e",euml:"分音記号つき小文字e",igrave:"抑音符つき小文字i",iacute:"揚音符つき小文字i",icirc:"曲折アクセントつき小文字i",iuml:"分音記号つき小文字i",eth:"アイスランド語小文字eth", +ntilde:"チルダつき小文字n",ograve:"抑音符つき小文字o",oacute:"揚音符つき小文字o",ocirc:"曲折アクセントつき小文字o",otilde:"チルダつき小文字o",ouml:"分音記号つき小文字o",divide:"除算記号",oslash:"打ち消し線つき小文字o",ugrave:"抑音符つき小文字u",uacute:"揚音符つき小文字u",ucirc:"曲折アクセントつき小文字u",uuml:"分音記号つき小文字u",yacute:"揚音符つき小文字y",thorn:"アイスランド語小文字thorn",yuml:"分音記号つき小文字y",OElig:"OとEの合字",oelig:"oとeの合字",372:"曲折アクセントつき大文字W",374:"曲折アクセントつき大文字Y",373:"曲折アクセントつき小文字w",375:"曲折アクセントつき小文字y",sbquo:"シングル下引用符",8219:"左右逆の左引用符",bdquo:"ダブル下引用符",hellip:"三点リーダ",trade:"商標記号",9658:"右黒三角ポインタ",bull:"黒丸", +rarr:"右矢印",rArr:"右二重矢印",hArr:"左右二重矢印",diams:"ダイヤ",asymp:"漸近"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/km.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/km.js new file mode 100644 index 0000000..8d6a3d1 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/km.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","km",{euro:"សញ្ញា​អឺរ៉ូ",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"សញ្ញា​សេន",pound:"សញ្ញា​ផោន",curren:"សញ្ញា​រូបិយបណ្ណ",yen:"សញ្ញា​យ៉េន",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"សញ្ញា​រក្សា​សិទ្ធិ",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"សញ្ញា​ដឺក្រេ",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"សញ្ញា​មីក្រូ",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/ku.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/ku.js new file mode 100644 index 0000000..5bed679 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/ku.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ku",{euro:"نیشانەی یۆرۆ",lsquo:"نیشانەی فاریزەی سەرووژێری تاکی چەپ",rsquo:"نیشانەی فاریزەی سەرووژێری تاکی ڕاست",ldquo:"نیشانەی فاریزەی سەرووژێری دووهێندەی چه‌پ",rdquo:"نیشانەی فاریزەی سەرووژێری دووهێندەی ڕاست",ndash:"تەقەڵی کورت",mdash:"تەقەڵی درێژ",iexcl:"نیشانەی هەڵەوگێڕی سەرسوڕهێنەر",cent:"نیشانەی سەنت",pound:"نیشانەی پاوەند",curren:"نیشانەی دراو",yen:"نیشانەی یەنی ژاپۆنی",brvbar:"شریتی ئەستوونی پچڕاو",sect:"نیشانەی دوو s لەسەریەک",uml:"خاڵ",copy:"نیشانەی مافی چاپ", +ordf:"هێڵ لەسەر پیتی a",laquo:"دوو تیری بەدووایەکی چەپ",not:"نیشانەی نەخێر",reg:"نیشانەی R لەناو بازنەدا",macr:"ماکڕۆن",deg:"نیشانەی پلە",sup2:"سەرنووسی دوو",sup3:"سەرنووسی سێ",acute:"لاری تیژ",micro:"نیشانەی u لق درێژی چەپی خواروو",para:"نیشانەی پەڕەگراف",middot:"ناوەڕاستی خاڵ",cedil:"نیشانەی c ژێر چووکرە",sup1:"سەرنووسی یەک",ordm:"هێڵ لەژێر پیتی o",raquo:"دوو تیری بەدووایەکی ڕاست",frac14:"یەک لەسەر چووار",frac12:"یەک لەسەر دوو",frac34:"سێ لەسەر چووار",iquest:"هێمای هەڵەوگێری پرسیار",Agrave:"پیتی لاتینی A-ی گەورە لەگەڵ ڕوومەتداری لار", +Aacute:"پیتی لاتینی A-ی گەورە لەگەڵ ڕوومەتداری تیژ",Acirc:"پیتی لاتینی A-ی گەورە لەگەڵ نیشانە لەسەری",Atilde:"پیتی لاتینی A-ی گەورە لەگەڵ زەڕە",Auml:"پیتی لاتینی A-ی گەورە لەگەڵ نیشانە لەسەری",Aring:"پیتی لاتینی گەورەی Å",AElig:"پیتی لاتینی گەورەی Æ",Ccedil:"پیتی لاتینی C-ی گەورە لەگەڵ ژێر چووکرە",Egrave:"پیتی لاتینی E-ی گەورە لەگەڵ ڕوومەتداری لار",Eacute:"پیتی لاتینی E-ی گەورە لەگەڵ ڕوومەتداری تیژ",Ecirc:"پیتی لاتینی E-ی گەورە لەگەڵ نیشانە لەسەری",Euml:"پیتی لاتینی E-ی گەورە لەگەڵ نیشانە لەسەری", +Igrave:"پیتی لاتینی I-ی گەورە لەگەڵ ڕوومەتداری لار",Iacute:"پیتی لاتینی I-ی گەورە لەگەڵ ڕوومەتداری تیژ",Icirc:"پیتی لاتینی I-ی گەورە لەگەڵ نیشانە لەسەری",Iuml:"پیتی لاتینی I-ی گەورە لەگەڵ نیشانە لەسەری",ETH:"پیتی لاتینی E-ی گەورەی",Ntilde:"پیتی لاتینی N-ی گەورە لەگەڵ زەڕە",Ograve:"پیتی لاتینی O-ی گەورە لەگەڵ ڕوومەتداری لار",Oacute:"پیتی لاتینی O-ی گەورە لەگەڵ ڕوومەتداری تیژ",Ocirc:"پیتی لاتینی O-ی گەورە لەگەڵ نیشانە لەسەری",Otilde:"پیتی لاتینی O-ی گەورە لەگەڵ زەڕە",Ouml:"پیتی لاتینی O-ی گەورە لەگەڵ نیشانە لەسەری", +times:"نیشانەی لێکدان",Oslash:"پیتی لاتینی گەورەی Ø لەگەڵ هێمای دڵ وەستان",Ugrave:"پیتی لاتینی U-ی گەورە لەگەڵ ڕوومەتداری لار",Uacute:"پیتی لاتینی U-ی گەورە لەگەڵ ڕوومەتداری تیژ",Ucirc:"پیتی لاتینی U-ی گەورە لەگەڵ نیشانە لەسەری",Uuml:"پیتی لاتینی U-ی گەورە لەگەڵ نیشانە لەسەری",Yacute:"پیتی لاتینی Y-ی گەورە لەگەڵ ڕوومەتداری تیژ",THORN:"پیتی لاتینی دڕکی گەورە",szlig:"پیتی لاتنی نووک تیژی s",agrave:"پیتی لاتینی a-ی بچووک لەگەڵ ڕوومەتداری لار",aacute:"پیتی لاتینی a-ی بچووك لەگەڵ ڕوومەتداری تیژ",acirc:"پیتی لاتینی a-ی بچووك لەگەڵ نیشانە لەسەری", +atilde:"پیتی لاتینی a-ی بچووك لەگەڵ زەڕە",auml:"پیتی لاتینی a-ی بچووك لەگەڵ نیشانە لەسەری",aring:"پیتی لاتینی å-ی بچووك",aelig:"پیتی لاتینی æ-ی بچووك",ccedil:"پیتی لاتینی c-ی بچووك لەگەڵ ژێر چووکرە",egrave:"پیتی لاتینی e-ی بچووك لەگەڵ ڕوومەتداری لار",eacute:"پیتی لاتینی e-ی بچووك لەگەڵ ڕوومەتداری تیژ",ecirc:"پیتی لاتینی e-ی بچووك لەگەڵ نیشانە لەسەری",euml:"پیتی لاتینی e-ی بچووك لەگەڵ نیشانە لەسەری",igrave:"پیتی لاتینی i-ی بچووك لەگەڵ ڕوومەتداری لار",iacute:"پیتی لاتینی i-ی بچووك لەگەڵ ڕوومەتداری تیژ", +icirc:"پیتی لاتینی i-ی بچووك لەگەڵ نیشانە لەسەری",iuml:"پیتی لاتینی i-ی بچووك لەگەڵ نیشانە لەسەری",eth:"پیتی لاتینی e-ی بچووك",ntilde:"پیتی لاتینی n-ی بچووك لەگەڵ زەڕە",ograve:"پیتی لاتینی o-ی بچووك لەگەڵ ڕوومەتداری لار",oacute:"پیتی لاتینی o-ی بچووك له‌گەڵ ڕوومەتداری تیژ",ocirc:"پیتی لاتینی o-ی بچووك لەگەڵ نیشانە لەسەری",otilde:"پیتی لاتینی o-ی بچووك لەگەڵ زەڕە",ouml:"پیتی لاتینی o-ی بچووك لەگەڵ نیشانە لەسەری",divide:"نیشانەی دابەش",oslash:"پیتی لاتینی گەورەی ø لەگەڵ هێمای دڵ وەستان",ugrave:"پیتی لاتینی u-ی بچووك لەگەڵ ڕوومەتداری لار", +uacute:"پیتی لاتینی u-ی بچووك لەگەڵ ڕوومەتداری تیژ",ucirc:"پیتی لاتینی u-ی بچووك لەگەڵ نیشانە لەسەری",uuml:"پیتی لاتینی u-ی بچووك لەگەڵ نیشانە لەسەری",yacute:"پیتی لاتینی y-ی بچووك لەگەڵ ڕوومەتداری تیژ",thorn:"پیتی لاتینی دڕکی بچووك",yuml:"پیتی لاتینی y-ی بچووك لەگەڵ نیشانە لەسەری",OElig:"پیتی لاتینی گەورەی پێکەوەنووسراوی OE",oelig:"پیتی لاتینی بچووکی پێکەوەنووسراوی oe",372:"پیتی لاتینی W-ی گەورە لەگەڵ نیشانە لەسەری",374:"پیتی لاتینی Y-ی گەورە لەگەڵ نیشانە لەسەری",373:"پیتی لاتینی w-ی بچووکی لەگەڵ نیشانە لەسەری", +375:"پیتی لاتینی y-ی بچووکی لەگەڵ نیشانە لەسەری",sbquo:"نیشانەی فاریزەی نزم",8219:"نیشانەی فاریزەی بەرزی پێچەوانە",bdquo:"دوو فاریزەی تەنیش یەك",hellip:"ئاسۆیی بازنە",trade:"نیشانەی بازرگانی",9658:"ئاراستەی ڕەشی دەستی ڕاست",bull:"فیشەك",rarr:"تیری دەستی ڕاست",rArr:"دووتیری دەستی ڕاست",hArr:"دوو تیری ڕاست و چەپ",diams:"ڕەشی پاقڵاوەیی",asymp:"نیشانەی یەکسانە"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/lt.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/lt.js new file mode 100644 index 0000000..f575dfd --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/lt.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","lt",{euro:"Euro ženklas",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cento ženklas",pound:"Svaro ženklas",curren:"Valiutos ženklas",yen:"Jenos ženklas",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Ne ženklas",reg:"Registered sign",macr:"Makronas",deg:"Laipsnio ženklas",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Mikro ženklas",para:"Pilcrow sign",middot:"Vidurinis taškas",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/lv.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/lv.js new file mode 100644 index 0000000..7ea58a0 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/lv.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","lv",{euro:"Euro zīme",lsquo:"Kreisā vienkārtīga pēdiņa",rsquo:"Labā vienkārtīga pēdiņa",ldquo:"Kreisā dubult pēdiņa",rdquo:"Labā dubult pēdiņa",ndash:"En svītra",mdash:"Em svītra",iexcl:"Apgriezta izsaukuma zīme",cent:"Centu naudas zīme",pound:"Sterliņu mārciņu naudas zīme",curren:"Valūtas zīme",yen:"Jenu naudas zīme",brvbar:"Vertikāla pārrauta līnija",sect:"Paragrāfa zīme",uml:"Diakritiska zīme",copy:"Autortiesību zīme",ordf:"Sievišķas kārtas rādītājs", +laquo:"Kreisā dubult stūra pēdiņu zīme",not:"Neparakstīts",reg:"Reģistrēta zīme",macr:"Garumzīme",deg:"Grādu zīme",sup2:"Augšraksts divi",sup3:"Augšraksts trīs",acute:"Akūta uzsvara zīme",micro:"Mikro zīme",para:"Rindkopas zīme ",middot:"Vidējs punkts",cedil:"Āķītis zem burta",sup1:"Augšraksts viens",ordm:"Vīrišķīgas kārtas rādītājs",raquo:"Labā dubult stūra pēdiņu zīme",frac14:"Vulgāra frakcija 1/4",frac12:"Vulgāra frakcija 1/2",frac34:"Vulgāra frakcija 3/4",iquest:"Apgriezta jautājuma zīme",Agrave:"Lielais latīņu burts A ar uzsvara zīmi", +Aacute:"Lielais latīņu burts A ar akūtu uzsvara zīmi",Acirc:"Lielais latīņu burts A ar diakritisku zīmi",Atilde:"Lielais latīņu burts A ar tildi ",Auml:"Lielais latīņu burts A ar diakritisko zīmi",Aring:"Lielais latīņu burts A ar aplīti augšā",AElig:"Lielais latīņu burts Æ",Ccedil:"Lielais latīņu burts C ar āķīti zem burta",Egrave:"Lielais latīņu burts E ar apostrofu",Eacute:"Lielais latīņu burts E ar akūtu uzsvara zīmi",Ecirc:"Lielais latīņu burts E ar diakritisko zīmi",Euml:"Lielais latīņu burts E ar diakritisko zīmi", +Igrave:"Lielais latīņu burts I ar uzsvaras zīmi",Iacute:"Lielais latīņu burts I ar akūtu uzsvara zīmi",Icirc:"Lielais latīņu burts I ar diakritisko zīmi",Iuml:"Lielais latīņu burts I ar diakritisko zīmi",ETH:"Lielais latīņu burts Eth",Ntilde:"Lielais latīņu burts N ar tildi",Ograve:"Lielais latīņu burts O ar uzsvara zīmi",Oacute:"Lielais latīņu burts O ar akūto uzsvara zīmi",Ocirc:"Lielais latīņu burts O ar diakritisko zīmi",Otilde:"Lielais latīņu burts O ar tildi",Ouml:"Lielais latīņu burts O ar diakritisko zīmi", +times:"Reizināšanas zīme ",Oslash:"Lielais latīņu burts O ar iesvītrojumu",Ugrave:"Lielais latīņu burts U ar uzsvaras zīmi",Uacute:"Lielais latīņu burts U ar akūto uzsvars zīmi",Ucirc:"Lielais latīņu burts U ar diakritisko zīmi",Uuml:"Lielais latīņu burts U ar diakritisko zīmi",Yacute:"Lielais latīņu burts Y ar akūto uzsvaras zīmi",THORN:"Lielais latīņu burts torn",szlig:"Mazs latīņu burts ar ligatūru",agrave:"Mazs latīņu burts a ar uzsvara zīmi",aacute:"Mazs latīņu burts a ar akūto uzsvara zīmi", +acirc:"Mazs latīņu burts a ar diakritisko zīmi",atilde:"Mazs latīņu burts a ar tildi",auml:"Mazs latīņu burts a ar diakritisko zīmi",aring:"Mazs latīņu burts a ar aplīti augšā",aelig:"Mazs latīņu burts æ",ccedil:"Mazs latīņu burts c ar āķīti zem burta",egrave:"Mazs latīņu burts e ar uzsvara zīmi ",eacute:"Mazs latīņu burts e ar akūtu uzsvara zīmi",ecirc:"Mazs latīņu burts e ar diakritisko zīmi",euml:"Mazs latīņu burts e ar diakritisko zīmi",igrave:"Mazs latīņu burts i ar uzsvara zīmi ",iacute:"Mazs latīņu burts i ar akūtu uzsvara zīmi", +icirc:"Mazs latīņu burts i ar diakritisko zīmi",iuml:"Mazs latīņu burts i ar diakritisko zīmi",eth:"Mazs latīņu burts eth",ntilde:"Mazs latīņu burts n ar tildi",ograve:"Mazs latīņu burts o ar uzsvara zīmi ",oacute:"Mazs latīņu burts o ar akūtu uzsvara zīmi",ocirc:"Mazs latīņu burts o ar diakritisko zīmi",otilde:"Mazs latīņu burts o ar tildi",ouml:"Mazs latīņu burts o ar diakritisko zīmi",divide:"Dalīšanas zīme",oslash:"Mazs latīņu burts o ar iesvītrojumu",ugrave:"Mazs latīņu burts u ar uzsvara zīmi ", +uacute:"Mazs latīņu burts u ar akūtu uzsvara zīmi",ucirc:"Mazs latīņu burts u ar diakritisko zīmi",uuml:"Mazs latīņu burts u ar diakritisko zīmi",yacute:"Mazs latīņu burts y ar akūtu uzsvaras zīmi",thorn:"Mazs latīņu burts torns",yuml:"Mazs latīņu burts y ar diakritisko zīmi",OElig:"Liela latīņu ligatūra OE",oelig:"Maza latīņu ligatūra oe",372:"Liels latīņu burts W ar diakritisko zīmi ",374:"Liels latīņu burts Y ar diakritisko zīmi ",373:"Mazs latīņu burts w ar diakritisko zīmi ",375:"Mazs latīņu burts y ar diakritisko zīmi ", +sbquo:"Mazas-9 vienkārtīgas pēdiņas",8219:"Lielas-9 vienkārtīgas apgrieztas pēdiņas",bdquo:"Mazas-9 dubultas pēdiņas",hellip:"Horizontāli daudzpunkti",trade:"Preču zīmes zīme",9658:"Melns pa labi pagriezts radītājs",bull:"Lode",rarr:"Bulta pa labi",rArr:"Dubulta Bulta pa labi",hArr:"Bulta pa kreisi",diams:"Dubulta Bulta pa kreisi",asymp:"Gandrīz vienāds ar"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/nb.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/nb.js new file mode 100644 index 0000000..f9fd879 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/nb.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","nb",{euro:"Eurosymbol",lsquo:"Venstre enkelt anførselstegn",rsquo:"Høyre enkelt anførselstegn",ldquo:"Venstre dobbelt anførselstegn",rdquo:"Høyre anførsesltegn",ndash:"Kort tankestrek",mdash:"Lang tankestrek",iexcl:"Omvendt utropstegn",cent:"Centsymbol",pound:"Pundsymbol",curren:"Valutategn",yen:"Yensymbol",brvbar:"Brutt loddrett strek",sect:"Paragraftegn",uml:"Tøddel",copy:"Copyrighttegn",ordf:"Feminin ordensindikator",laquo:"Venstre anførselstegn",not:"Negasjonstegn", +reg:"Registrert varemerke-tegn",macr:"Makron",deg:"Gradsymbol",sup2:"Hevet totall",sup3:"Hevet tretall",acute:"Akutt aksent",micro:"Mikrosymbol",para:"Avsnittstegn",middot:"Midtstilt prikk",cedil:"Cedille",sup1:"Hevet ettall",ordm:"Maskulin ordensindikator",raquo:"Høyre anførselstegn",frac14:"Fjerdedelsbrøk",frac12:"Halvbrøk",frac34:"Tre fjerdedelers brøk",iquest:"Omvendt spørsmålstegn",Agrave:"Stor A med grav aksent",Aacute:"Stor A med akutt aksent",Acirc:"Stor A med cirkumfleks",Atilde:"Stor A med tilde", +Auml:"Stor A med tøddel",Aring:"Stor Å",AElig:"Stor Æ",Ccedil:"Stor C med cedille",Egrave:"Stor E med grav aksent",Eacute:"Stor E med akutt aksent",Ecirc:"Stor E med cirkumfleks",Euml:"Stor E med tøddel",Igrave:"Stor I med grav aksent",Iacute:"Stor I med akutt aksent",Icirc:"Stor I med cirkumfleks",Iuml:"Stor I med tøddel",ETH:"Stor Edd/stungen D",Ntilde:"Stor N med tilde",Ograve:"Stor O med grav aksent",Oacute:"Stor O med akutt aksent",Ocirc:"Stor O med cirkumfleks",Otilde:"Stor O med tilde",Ouml:"Stor O med tøddel", +times:"Multiplikasjonstegn",Oslash:"Stor Ø",Ugrave:"Stor U med grav aksent",Uacute:"Stor U med akutt aksent",Ucirc:"Stor U med cirkumfleks",Uuml:"Stor U med tøddel",Yacute:"Stor Y med akutt aksent",THORN:"Stor Thorn",szlig:"Liten dobbelt-s/Eszett",agrave:"Liten a med grav aksent",aacute:"Liten a med akutt aksent",acirc:"Liten a med cirkumfleks",atilde:"Liten a med tilde",auml:"Liten a med tøddel",aring:"Liten å",aelig:"Liten æ",ccedil:"Liten c med cedille",egrave:"Liten e med grav aksent",eacute:"Liten e med akutt aksent", +ecirc:"Liten e med cirkumfleks",euml:"Liten e med tøddel",igrave:"Liten i med grav aksent",iacute:"Liten i med akutt aksent",icirc:"Liten i med cirkumfleks",iuml:"Liten i med tøddel",eth:"Liten edd/stungen d",ntilde:"Liten n med tilde",ograve:"Liten o med grav aksent",oacute:"Liten o med akutt aksent",ocirc:"Liten o med cirkumfleks",otilde:"Liten o med tilde",ouml:"Liten o med tøddel",divide:"Divisjonstegn",oslash:"Liten ø",ugrave:"Liten u med grav aksent",uacute:"Liten u med akutt aksent",ucirc:"Liten u med cirkumfleks", +uuml:"Liten u med tøddel",yacute:"Liten y med akutt aksent",thorn:"Liten thorn",yuml:"Liten y med tøddel",OElig:"Stor ligatur av O og E",oelig:"Liten ligatur av o og e",372:"Stor W med cirkumfleks",374:"Stor Y med cirkumfleks",373:"Liten w med cirkumfleks",375:"Liten y med cirkumfleks",sbquo:"Enkelt lavt 9-anførselstegn",8219:"Enkelt høyt reversert 9-anførselstegn",bdquo:"Dobbelt lavt 9-anførselstegn",hellip:"Ellipse",trade:"Varemerkesymbol",9658:"Svart høyrevendt peker",bull:"Tykk interpunkt",rarr:"Høyrevendt pil", +rArr:"Dobbel høyrevendt pil",hArr:"Dobbel venstrevendt pil",diams:"Svart ruter",asymp:"Omtrent likhetstegn"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/nl.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/nl.js new file mode 100644 index 0000000..ba75bf3 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/nl.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","nl",{euro:"Euro-teken",lsquo:"Linker enkel aanhalingsteken",rsquo:"Rechter enkel aanhalingsteken",ldquo:"Linker dubbel aanhalingsteken",rdquo:"Rechter dubbel aanhalingsteken",ndash:"En dash",mdash:"Em dash",iexcl:"Omgekeerd uitroepteken",cent:"Cent-teken",pound:"Pond-teken",curren:"Valuta-teken",yen:"Yen-teken",brvbar:"Gebroken streep",sect:"Paragraaf-teken",uml:"Trema",copy:"Copyright-teken",ordf:"Vrouwelijk ordinaal",laquo:"Linker guillemet",not:"Ongelijk-teken", +reg:"Geregistreerd handelsmerk-teken",macr:"Macron",deg:"Graden-teken",sup2:"Superscript twee",sup3:"Superscript drie",acute:"Accent aigu",micro:"Micro-teken",para:"Alinea-teken",middot:"Halfhoge punt",cedil:"Cedille",sup1:"Superscript een",ordm:"Mannelijk ordinaal",raquo:"Rechter guillemet",frac14:"Breuk kwart",frac12:"Breuk half",frac34:"Breuk driekwart",iquest:"Omgekeerd vraagteken",Agrave:"Latijnse hoofdletter A met een accent grave",Aacute:"Latijnse hoofdletter A met een accent aigu",Acirc:"Latijnse hoofdletter A met een circonflexe", +Atilde:"Latijnse hoofdletter A met een tilde",Auml:"Latijnse hoofdletter A met een trema",Aring:"Latijnse hoofdletter A met een corona",AElig:"Latijnse hoofdletter Æ",Ccedil:"Latijnse hoofdletter C met een cedille",Egrave:"Latijnse hoofdletter E met een accent grave",Eacute:"Latijnse hoofdletter E met een accent aigu",Ecirc:"Latijnse hoofdletter E met een circonflexe",Euml:"Latijnse hoofdletter E met een trema",Igrave:"Latijnse hoofdletter I met een accent grave",Iacute:"Latijnse hoofdletter I met een accent aigu", +Icirc:"Latijnse hoofdletter I met een circonflexe",Iuml:"Latijnse hoofdletter I met een trema",ETH:"Latijnse hoofdletter Eth",Ntilde:"Latijnse hoofdletter N met een tilde",Ograve:"Latijnse hoofdletter O met een accent grave",Oacute:"Latijnse hoofdletter O met een accent aigu",Ocirc:"Latijnse hoofdletter O met een circonflexe",Otilde:"Latijnse hoofdletter O met een tilde",Ouml:"Latijnse hoofdletter O met een trema",times:"Maal-teken",Oslash:"Latijnse hoofdletter O met een schuine streep",Ugrave:"Latijnse hoofdletter U met een accent grave", +Uacute:"Latijnse hoofdletter U met een accent aigu",Ucirc:"Latijnse hoofdletter U met een circonflexe",Uuml:"Latijnse hoofdletter U met een trema",Yacute:"Latijnse hoofdletter Y met een accent aigu",THORN:"Latijnse hoofdletter Thorn",szlig:"Latijnse kleine ringel-s",agrave:"Latijnse kleine letter a met een accent grave",aacute:"Latijnse kleine letter a met een accent aigu",acirc:"Latijnse kleine letter a met een circonflexe",atilde:"Latijnse kleine letter a met een tilde",auml:"Latijnse kleine letter a met een trema", +aring:"Latijnse kleine letter a met een corona",aelig:"Latijnse kleine letter æ",ccedil:"Latijnse kleine letter c met een cedille",egrave:"Latijnse kleine letter e met een accent grave",eacute:"Latijnse kleine letter e met een accent aigu",ecirc:"Latijnse kleine letter e met een circonflexe",euml:"Latijnse kleine letter e met een trema",igrave:"Latijnse kleine letter i met een accent grave",iacute:"Latijnse kleine letter i met een accent aigu",icirc:"Latijnse kleine letter i met een circonflexe", +iuml:"Latijnse kleine letter i met een trema",eth:"Latijnse kleine letter eth",ntilde:"Latijnse kleine letter n met een tilde",ograve:"Latijnse kleine letter o met een accent grave",oacute:"Latijnse kleine letter o met een accent aigu",ocirc:"Latijnse kleine letter o met een circonflexe",otilde:"Latijnse kleine letter o met een tilde",ouml:"Latijnse kleine letter o met een trema",divide:"Deel-teken",oslash:"Latijnse kleine letter o met een schuine streep",ugrave:"Latijnse kleine letter u met een accent grave", +uacute:"Latijnse kleine letter u met een accent aigu",ucirc:"Latijnse kleine letter u met een circonflexe",uuml:"Latijnse kleine letter u met een trema",yacute:"Latijnse kleine letter y met een accent aigu",thorn:"Latijnse kleine letter thorn",yuml:"Latijnse kleine letter y met een trema",OElig:"Latijnse hoofdletter Œ",oelig:"Latijnse kleine letter œ",372:"Latijnse hoofdletter W met een circonflexe",374:"Latijnse hoofdletter Y met een circonflexe",373:"Latijnse kleine letter w met een circonflexe", +375:"Latijnse kleine letter y met een circonflexe",sbquo:"Lage enkele aanhalingsteken",8219:"Hoge omgekeerde enkele aanhalingsteken",bdquo:"Lage dubbele aanhalingsteken",hellip:"Beletselteken",trade:"Trademark-teken",9658:"Zwarte driehoek naar rechts",bull:"Bullet",rarr:"Pijl naar rechts",rArr:"Dubbele pijl naar rechts",hArr:"Dubbele pijl naar links",diams:"Zwart ruitje",asymp:"Benaderingsteken"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/no.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/no.js new file mode 100644 index 0000000..404b4fd --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/no.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","no",{euro:"Eurosymbol",lsquo:"Venstre enkelt anførselstegn",rsquo:"Høyre enkelt anførselstegn",ldquo:"Venstre dobbelt anførselstegn",rdquo:"Høyre anførsesltegn",ndash:"Kort tankestrek",mdash:"Lang tankestrek",iexcl:"Omvendt utropstegn",cent:"Centsymbol",pound:"Pundsymbol",curren:"Valutategn",yen:"Yensymbol",brvbar:"Brutt loddrett strek",sect:"Paragraftegn",uml:"Tøddel",copy:"Copyrighttegn",ordf:"Feminin ordensindikator",laquo:"Venstre anførselstegn",not:"Negasjonstegn", +reg:"Registrert varemerke-tegn",macr:"Makron",deg:"Gradsymbol",sup2:"Hevet totall",sup3:"Hevet tretall",acute:"Akutt aksent",micro:"Mikrosymbol",para:"Avsnittstegn",middot:"Midtstilt prikk",cedil:"Cedille",sup1:"Hevet ettall",ordm:"Maskulin ordensindikator",raquo:"Høyre anførselstegn",frac14:"Fjerdedelsbrøk",frac12:"Halvbrøk",frac34:"Tre fjerdedelers brøk",iquest:"Omvendt spørsmålstegn",Agrave:"Stor A med grav aksent",Aacute:"Stor A med akutt aksent",Acirc:"Stor A med cirkumfleks",Atilde:"Stor A med tilde", +Auml:"Stor A med tøddel",Aring:"Stor Å",AElig:"Stor Æ",Ccedil:"Stor C med cedille",Egrave:"Stor E med grav aksent",Eacute:"Stor E med akutt aksent",Ecirc:"Stor E med cirkumfleks",Euml:"Stor E med tøddel",Igrave:"Stor I med grav aksent",Iacute:"Stor I med akutt aksent",Icirc:"Stor I med cirkumfleks",Iuml:"Stor I med tøddel",ETH:"Stor Edd/stungen D",Ntilde:"Stor N med tilde",Ograve:"Stor O med grav aksent",Oacute:"Stor O med akutt aksent",Ocirc:"Stor O med cirkumfleks",Otilde:"Stor O med tilde",Ouml:"Stor O med tøddel", +times:"Multiplikasjonstegn",Oslash:"Stor Ø",Ugrave:"Stor U med grav aksent",Uacute:"Stor U med akutt aksent",Ucirc:"Stor U med cirkumfleks",Uuml:"Stor U med tøddel",Yacute:"Stor Y med akutt aksent",THORN:"Stor Thorn",szlig:"Liten dobbelt-s/Eszett",agrave:"Liten a med grav aksent",aacute:"Liten a med akutt aksent",acirc:"Liten a med cirkumfleks",atilde:"Liten a med tilde",auml:"Liten a med tøddel",aring:"Liten å",aelig:"Liten æ",ccedil:"Liten c med cedille",egrave:"Liten e med grav aksent",eacute:"Liten e med akutt aksent", +ecirc:"Liten e med cirkumfleks",euml:"Liten e med tøddel",igrave:"Liten i med grav aksent",iacute:"Liten i med akutt aksent",icirc:"Liten i med cirkumfleks",iuml:"Liten i med tøddel",eth:"Liten edd/stungen d",ntilde:"Liten n med tilde",ograve:"Liten o med grav aksent",oacute:"Liten o med akutt aksent",ocirc:"Liten o med cirkumfleks",otilde:"Liten o med tilde",ouml:"Liten o med tøddel",divide:"Divisjonstegn",oslash:"Liten ø",ugrave:"Liten u med grav aksent",uacute:"Liten u med akutt aksent",ucirc:"Liten u med cirkumfleks", +uuml:"Liten u med tøddel",yacute:"Liten y med akutt aksent",thorn:"Liten thorn",yuml:"Liten y med tøddel",OElig:"Stor ligatur av O og E",oelig:"Liten ligatur av o og e",372:"Stor W med cirkumfleks",374:"Stor Y med cirkumfleks",373:"Liten w med cirkumfleks",375:"Liten y med cirkumfleks",sbquo:"Enkelt lavt 9-anførselstegn",8219:"Enkelt høyt reversert 9-anførselstegn",bdquo:"Dobbelt lavt 9-anførselstegn",hellip:"Ellipse",trade:"Varemerkesymbol",9658:"Svart høyrevendt peker",bull:"Tykk interpunkt",rarr:"Høyrevendt pil", +rArr:"Dobbel høyrevendt pil",hArr:"Dobbel venstrevendt pil",diams:"Svart ruter",asymp:"Omtrent likhetstegn"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/pl.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/pl.js new file mode 100644 index 0000000..76e2acd --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/pl.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","pl",{euro:"Znak euro",lsquo:"Cudzysłów pojedynczy otwierający",rsquo:"Cudzysłów pojedynczy zamykający",ldquo:"Cudzysłów apostrofowy otwierający",rdquo:"Cudzysłów apostrofowy zamykający",ndash:"Półpauza",mdash:"Pauza",iexcl:"Odwrócony wykrzyknik",cent:"Znak centa",pound:"Znak funta",curren:"Znak waluty",yen:"Znak jena",brvbar:"Przerwana pionowa kreska",sect:"Paragraf",uml:"Diereza",copy:"Znak praw autorskich",ordf:"Wskaźnik rodzaju żeńskiego liczebnika porządkowego", +laquo:"Lewy cudzysłów ostrokątny",not:"Znak negacji",reg:"Zastrzeżony znak towarowy",macr:"Makron",deg:"Znak stopnia",sup2:"Druga potęga",sup3:"Trzecia potęga",acute:"Akcent ostry",micro:"Znak mikro",para:"Znak akapitu",middot:"Kropka środkowa",cedil:"Cedylla",sup1:"Pierwsza potęga",ordm:"Wskaźnik rodzaju męskiego liczebnika porządkowego",raquo:"Prawy cudzysłów ostrokątny",frac14:"Ułamek zwykły jedna czwarta",frac12:"Ułamek zwykły jedna druga",frac34:"Ułamek zwykły trzy czwarte",iquest:"Odwrócony znak zapytania", +Agrave:"Wielka litera A z akcentem ciężkim",Aacute:"Wielka litera A z akcentem ostrym",Acirc:"Wielka litera A z akcentem przeciągłym",Atilde:"Wielka litera A z tyldą",Auml:"Wielka litera A z dierezą",Aring:"Wielka litera A z kółkiem",AElig:"Wielka ligatura Æ",Ccedil:"Wielka litera C z cedyllą",Egrave:"Wielka litera E z akcentem ciężkim",Eacute:"Wielka litera E z akcentem ostrym",Ecirc:"Wielka litera E z akcentem przeciągłym",Euml:"Wielka litera E z dierezą",Igrave:"Wielka litera I z akcentem ciężkim", +Iacute:"Wielka litera I z akcentem ostrym",Icirc:"Wielka litera I z akcentem przeciągłym",Iuml:"Wielka litera I z dierezą",ETH:"Wielka litera Eth",Ntilde:"Wielka litera N z tyldą",Ograve:"Wielka litera O z akcentem ciężkim",Oacute:"Wielka litera O z akcentem ostrym",Ocirc:"Wielka litera O z akcentem przeciągłym",Otilde:"Wielka litera O z tyldą",Ouml:"Wielka litera O z dierezą",times:"Znak mnożenia wektorowego",Oslash:"Wielka litera O z przekreśleniem",Ugrave:"Wielka litera U z akcentem ciężkim",Uacute:"Wielka litera U z akcentem ostrym", +Ucirc:"Wielka litera U z akcentem przeciągłym",Uuml:"Wielka litera U z dierezą",Yacute:"Wielka litera Y z akcentem ostrym",THORN:"Wielka litera Thorn",szlig:"Mała litera ostre s (eszet)",agrave:"Mała litera a z akcentem ciężkim",aacute:"Mała litera a z akcentem ostrym",acirc:"Mała litera a z akcentem przeciągłym",atilde:"Mała litera a z tyldą",auml:"Mała litera a z dierezą",aring:"Mała litera a z kółkiem",aelig:"Mała ligatura æ",ccedil:"Mała litera c z cedyllą",egrave:"Mała litera e z akcentem ciężkim", +eacute:"Mała litera e z akcentem ostrym",ecirc:"Mała litera e z akcentem przeciągłym",euml:"Mała litera e z dierezą",igrave:"Mała litera i z akcentem ciężkim",iacute:"Mała litera i z akcentem ostrym",icirc:"Mała litera i z akcentem przeciągłym",iuml:"Mała litera i z dierezą",eth:"Mała litera eth",ntilde:"Mała litera n z tyldą",ograve:"Mała litera o z akcentem ciężkim",oacute:"Mała litera o z akcentem ostrym",ocirc:"Mała litera o z akcentem przeciągłym",otilde:"Mała litera o z tyldą",ouml:"Mała litera o z dierezą", +divide:"Anglosaski znak dzielenia",oslash:"Mała litera o z przekreśleniem",ugrave:"Mała litera u z akcentem ciężkim",uacute:"Mała litera u z akcentem ostrym",ucirc:"Mała litera u z akcentem przeciągłym",uuml:"Mała litera u z dierezą",yacute:"Mała litera y z akcentem ostrym",thorn:"Mała litera thorn",yuml:"Mała litera y z dierezą",OElig:"Wielka ligatura OE",oelig:"Mała ligatura oe",372:"Wielka litera W z akcentem przeciągłym",374:"Wielka litera Y z akcentem przeciągłym",373:"Mała litera w z akcentem przeciągłym", +375:"Mała litera y z akcentem przeciągłym",sbquo:"Pojedynczy apostrof dolny",8219:"Pojedynczy apostrof górny",bdquo:"Podwójny apostrof dolny",hellip:"Wielokropek",trade:"Znak towarowy",9658:"Czarny wskaźnik wskazujący w prawo",bull:"Punktor",rarr:"Strzałka w prawo",rArr:"Podwójna strzałka w prawo",hArr:"Podwójna strzałka w lewo",diams:"Czarny znak karo",asymp:"Znak prawie równe"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js new file mode 100644 index 0000000..41f8c33 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","pt-br",{euro:"Euro",lsquo:"Aspas simples esquerda",rsquo:"Aspas simples direita",ldquo:"Aspas duplas esquerda",rdquo:"Aspas duplas direita",ndash:"Traço",mdash:"Travessão",iexcl:"Ponto de exclamação invertido",cent:"Cent",pound:"Cerquilha",curren:"Dinheiro",yen:"Yen",brvbar:"Bara interrompida",sect:"Símbolo de Parágrafo",uml:"Trema",copy:"Direito de Cópia",ordf:"Indicador ordinal feminino",laquo:"Aspas duplas angulares esquerda",not:"Negação",reg:"Marca Registrada", +macr:"Mácron",deg:"Grau",sup2:"2 Superscrito",sup3:"3 Superscrito",acute:"Acento agudo",micro:"Micro",para:"Pé de mosca",middot:"Ponto mediano",cedil:"Cedilha",sup1:"1 Superscrito",ordm:"Indicador ordinal masculino",raquo:"Aspas duplas angulares direita",frac14:"Um quarto",frac12:"Um meio",frac34:"Três quartos",iquest:"Interrogação invertida",Agrave:"A maiúsculo com acento grave",Aacute:"A maiúsculo com acento agudo",Acirc:"A maiúsculo com acento circunflexo",Atilde:"A maiúsculo com til",Auml:"A maiúsculo com trema", +Aring:"A maiúsculo com anel acima",AElig:"Æ maiúsculo",Ccedil:"Ç maiúlculo",Egrave:"E maiúsculo com acento grave",Eacute:"E maiúsculo com acento agudo",Ecirc:"E maiúsculo com acento circumflexo",Euml:"E maiúsculo com trema",Igrave:"I maiúsculo com acento grave",Iacute:"I maiúsculo com acento agudo",Icirc:"I maiúsculo com acento circunflexo",Iuml:"I maiúsculo com crase",ETH:"Eth maiúsculo",Ntilde:"N maiúsculo com til",Ograve:"O maiúsculo com acento grave",Oacute:"O maiúsculo com acento agudo",Ocirc:"O maiúsculo com acento circunflexo", +Otilde:"O maiúsculo com til",Ouml:"O maiúsculo com trema",times:"Multiplicação",Oslash:"Diâmetro",Ugrave:"U maiúsculo com acento grave",Uacute:"U maiúsculo com acento agudo",Ucirc:"U maiúsculo com acento circunflexo",Uuml:"U maiúsculo com trema",Yacute:"Y maiúsculo com acento agudo",THORN:"Thorn maiúsculo",szlig:"Eszett minúsculo",agrave:"a minúsculo com acento grave",aacute:"a minúsculo com acento agudo",acirc:"a minúsculo com acento circunflexo",atilde:"a minúsculo com til",auml:"a minúsculo com trema", +aring:"a minúsculo com anel acima",aelig:"æ minúsculo",ccedil:"ç minúsculo",egrave:"e minúsculo com acento grave",eacute:"e minúsculo com acento agudo",ecirc:"e minúsculo com acento circunflexo",euml:"e minúsculo com trema",igrave:"i minúsculo com acento grave",iacute:"i minúsculo com acento agudo",icirc:"i minúsculo com acento circunflexo",iuml:"i minúsculo com trema",eth:"eth minúsculo",ntilde:"n minúsculo com til",ograve:"o minúsculo com acento grave",oacute:"o minúsculo com acento agudo",ocirc:"o minúsculo com acento circunflexo", +otilde:"o minúsculo com til",ouml:"o minúsculo com trema",divide:"Divisão",oslash:"o minúsculo com cortado ou diâmetro",ugrave:"u minúsculo com acento grave",uacute:"u minúsculo com acento agudo",ucirc:"u minúsculo com acento circunflexo",uuml:"u minúsculo com trema",yacute:"y minúsculo com acento agudo",thorn:"thorn minúsculo",yuml:"y minúsculo com trema",OElig:"Ligação tipográfica OE maiúscula",oelig:"Ligação tipográfica oe minúscula",372:"W maiúsculo com acento circunflexo",374:"Y maiúsculo com acento circunflexo", +373:"w minúsculo com acento circunflexo",375:"y minúsculo com acento circunflexo",sbquo:"Aspas simples inferior direita",8219:"Aspas simples superior esquerda",bdquo:"Aspas duplas inferior direita",hellip:"Reticências",trade:"Trade mark",9658:"Ponta de seta preta para direita",bull:"Ponto lista",rarr:"Seta para direita",rArr:"Seta dupla para direita",hArr:"Seta dupla direita e esquerda",diams:"Ouros",asymp:"Aproximadamente"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/pt.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/pt.js new file mode 100644 index 0000000..9c73f0c --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/pt.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","pt",{euro:"Símbolo do Euro",lsquo:"Aspa esquerda simples",rsquo:"Aspa direita simples",ldquo:"Aspa esquerda dupla",rdquo:"Aspa direita dupla",ndash:"Travessão Simples",mdash:"Travessão Longo",iexcl:"Ponto de exclamação invertido",cent:"Símbolo do Cêntimo",pound:"Símbolo da Libra",curren:"Símbolo de Moeda",yen:"Símbolo do Iene",brvbar:"Barra quebrada",sect:"Símbolo de Secção",uml:"Trema",copy:"Símbolo dos Direitos de Autor",ordf:"Indicador ordinal feminino", +laquo:"Aspa esquerda ângulo duplo",not:"Não Símbolo",reg:"Símbolo de Registado",macr:"Mácron",deg:"Símbolo de Grau",sup2:"Expoente 2",sup3:"Expoente 3",acute:"Acento agudo",micro:"Símbolo de Micro",para:"Símbolo de Parágrafo",middot:"Ponto do Meio",cedil:"Cedilha",sup1:"Expoente 1",ordm:"Indicador ordinal masculino",raquo:"Aspas ângulo duplo pra Direita",frac14:"Fração vulgar 1/4",frac12:"Fração vulgar 1/2",frac34:"Fração vulgar 3/4",iquest:"Ponto de interrogação invertido",Agrave:"Letra maiúscula latina A com acento grave", +Aacute:"Letra maiúscula latina A com acento agudo",Acirc:"Letra maiúscula latina A com circunflexo",Atilde:"Letra maiúscula latina A com til",Auml:"Letra maiúscula latina A com trema",Aring:"Letra maiúscula latina A com sinal diacrítico",AElig:"Letra maiúscula latina Æ",Ccedil:"Letra maiúscula latina C com cedilha",Egrave:"Letra maiúscula latina E com acento grave",Eacute:"Letra maiúscula latina E com acento agudo",Ecirc:"Letra maiúscula latina E com circunflexo",Euml:"Letra maiúscula latina E com trema", +Igrave:"Letra maiúscula latina I com acento grave",Iacute:"Letra maiúscula latina I com acento agudo",Icirc:"Letra maiúscula latina I com cincunflexo",Iuml:"Letra maiúscula latina I com trema",ETH:"Letra maiúscula latina Eth (Ðð)",Ntilde:"Letra maiúscula latina N com til",Ograve:"Letra maiúscula latina O com acento grave",Oacute:"Letra maiúscula latina O com acento agudo",Ocirc:"Letra maiúscula latina I com circunflexo",Otilde:"Letra maiúscula latina O com til",Ouml:"Letra maiúscula latina O com trema", +times:"Símbolo de multiplicação",Oslash:"Letra maiúscula O com barra",Ugrave:"Letra maiúscula latina U com acento grave",Uacute:"Letra maiúscula latina U com acento agudo",Ucirc:"Letra maiúscula latina U com circunflexo",Uuml:"Letra maiúscula latina E com trema",Yacute:"Letra maiúscula latina Y com acento agudo",THORN:"Letra maiúscula latina Rúnico",szlig:"Letra minúscula latina s forte",agrave:"Letra minúscula latina a com acento grave",aacute:"Letra minúscula latina a com acento agudo",acirc:"Letra minúscula latina a com circunflexo", +atilde:"Letra minúscula latina a com til",auml:"Letra minúscula latina a com trema",aring:"Letra minúscula latina a com sinal diacrítico",aelig:"Letra minúscula latina æ",ccedil:"Letra minúscula latina c com cedilha",egrave:"Letra minúscula latina e com acento grave",eacute:"Letra minúscula latina e com acento agudo",ecirc:"Letra minúscula latina e com circunflexo",euml:"Letra minúscula latina e com trema",igrave:"Letra minúscula latina i com acento grave",iacute:"Letra minúscula latina i com acento agudo", +icirc:"Letra minúscula latina i com circunflexo",iuml:"Letra pequena latina i com trema",eth:"Letra minúscula latina eth",ntilde:"Letra minúscula latina n com til",ograve:"Letra minúscula latina o com acento grave",oacute:"Letra minúscula latina o com acento agudo",ocirc:"Letra minúscula latina o com circunflexo",otilde:"Letra minúscula latina o com til",ouml:"Letra minúscula latina o com trema",divide:"Símbolo de divisão",oslash:"Letra minúscula latina o com barra",ugrave:"Letra minúscula latina u com acento grave", +uacute:"Letra minúscula latina u com acento agudo",ucirc:"Letra minúscula latina u com circunflexo",uuml:"Letra minúscula latina u com trema",yacute:"Letra minúscula latina y com acento agudo",thorn:"Letra minúscula latina Rúnico",yuml:"Letra minúscula latina y com trema",OElig:"Ligadura maiúscula latina OE",oelig:"Ligadura minúscula latina oe",372:"Letra maiúscula latina W com circunflexo",374:"Letra maiúscula latina Y com circunflexo",373:"Letra minúscula latina w com circunflexo",375:"Letra minúscula latina y com circunflexo", +sbquo:"Aspa Simples inferior-9",8219:"Aspa Simples superior invertida-9",bdquo:"Aspa duplas inferior-9",hellip:"Elipse Horizontal ",trade:"Símbolo de Marca Registada",9658:"Ponteiro preto direito",bull:"Marca",rarr:"Seta para a direita",rArr:"Seta dupla para a direita",hArr:"Seta dupla direita esquerda",diams:"Naipe diamante preto",asymp:"Quase igual a "}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/ru.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/ru.js new file mode 100644 index 0000000..30633fd --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/ru.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ru",{euro:"Знак евро",lsquo:"Левая одинарная кавычка",rsquo:"Правая одинарная кавычка",ldquo:"Левая двойная кавычка",rdquo:"Левая двойная кавычка",ndash:"Среднее тире",mdash:"Длинное тире",iexcl:"перевёрнутый восклицательный знак",cent:"Цент",pound:"Фунт",curren:"Знак валюты",yen:"Йена",brvbar:"Вертикальная черта с разрывом",sect:"Знак параграфа",uml:"Умлаут",copy:"Знак охраны авторского права",ordf:"Указатель окончания женского рода ...ая",laquo:"Левая кавычка-«ёлочка»", +not:"Отрицание",reg:"Знак охраны смежных прав\\t",macr:"Макрон",deg:"Градус",sup2:"Надстрочное два",sup3:"Надстрочное три",acute:"Акут",micro:"Микро",para:"Абзац",middot:"Интерпункт",cedil:"Седиль",sup1:"Надстрочная единица",ordm:"Порядковое числительное",raquo:"Правая кавычка-«ёлочка»",frac14:"Одна четвертая",frac12:"Одна вторая",frac34:"Три четвёртых",iquest:"Перевёрнутый вопросительный знак",Agrave:"Латинская заглавная буква А с апострофом",Aacute:"Латинская заглавная буква A с ударением",Acirc:"Латинская заглавная буква А с циркумфлексом", +Atilde:"Латинская заглавная буква А с тильдой",Auml:"Латинская заглавная буква А с тремой",Aring:"Латинская заглавная буква А с кольцом над ней",AElig:"Латинская большая буква Æ",Ccedil:"Латинская заглавная буква C с седилью",Egrave:"Латинская заглавная буква Е с апострофом",Eacute:"Латинская заглавная буква Е с ударением",Ecirc:"Латинская заглавная буква Е с циркумфлексом",Euml:"Латинская заглавная буква Е с тремой",Igrave:"Латинская заглавная буква I с апострофом",Iacute:"Латинская заглавная буква I с ударением", +Icirc:"Латинская заглавная буква I с циркумфлексом",Iuml:"Латинская заглавная буква I с тремой",ETH:"Латинская большая буква Eth",Ntilde:"Латинская заглавная буква N с тильдой",Ograve:"Латинская заглавная буква O с апострофом",Oacute:"Латинская заглавная буква O с ударением",Ocirc:"Латинская заглавная буква O с циркумфлексом",Otilde:"Латинская заглавная буква O с тильдой",Ouml:"Латинская заглавная буква O с тремой",times:"Знак умножения",Oslash:"Латинская большая перечеркнутая O",Ugrave:"Латинская заглавная буква U с апострофом", +Uacute:"Латинская заглавная буква U с ударением",Ucirc:"Латинская заглавная буква U с циркумфлексом",Uuml:"Латинская заглавная буква U с тремой",Yacute:"Латинская заглавная буква Y с ударением",THORN:"Латинская заглавная буква Thorn",szlig:"Знак диеза",agrave:"Латинская маленькая буква a с апострофом",aacute:"Латинская маленькая буква a с ударением",acirc:"Латинская маленькая буква a с циркумфлексом",atilde:"Латинская маленькая буква a с тильдой",auml:"Латинская маленькая буква a с тремой",aring:"Латинская маленькая буква a с кольцом", +aelig:"Латинская маленькая буква æ",ccedil:"Латинская маленькая буква с с седилью",egrave:"Латинская маленькая буква е с апострофом",eacute:"Латинская маленькая буква е с ударением",ecirc:"Латинская маленькая буква е с циркумфлексом",euml:"Латинская маленькая буква е с тремой",igrave:"Латинская маленькая буква i с апострофом",iacute:"Латинская маленькая буква i с ударением",icirc:"Латинская маленькая буква i с циркумфлексом",iuml:"Латинская маленькая буква i с тремой",eth:"Латинская маленькая буква eth", +ntilde:"Латинская маленькая буква n с тильдой",ograve:"Латинская маленькая буква o с апострофом",oacute:"Латинская маленькая буква o с ударением",ocirc:"Латинская маленькая буква o с циркумфлексом",otilde:"Латинская маленькая буква o с тильдой",ouml:"Латинская маленькая буква o с тремой",divide:"Знак деления",oslash:"Латинская строчная перечеркнутая o",ugrave:"Латинская маленькая буква u с апострофом",uacute:"Латинская маленькая буква u с ударением",ucirc:"Латинская маленькая буква u с циркумфлексом", +uuml:"Латинская маленькая буква u с тремой",yacute:"Латинская маленькая буква y с ударением",thorn:"Латинская маленькая буква thorn",yuml:"Латинская маленькая буква y с тремой",OElig:"Латинская прописная лигатура OE",oelig:"Латинская строчная лигатура oe",372:"Латинская заглавная буква W с циркумфлексом",374:"Латинская заглавная буква Y с циркумфлексом",373:"Латинская маленькая буква w с циркумфлексом",375:"Латинская маленькая буква y с циркумфлексом",sbquo:"Нижняя одинарная кавычка",8219:"Правая одинарная кавычка", +bdquo:"Левая двойная кавычка",hellip:"Горизонтальное многоточие",trade:"Товарный знак",9658:"Черный указатель вправо",bull:"Маркер списка",rarr:"Стрелка вправо",rArr:"Двойная стрелка вправо",hArr:"Двойная стрелка влево-вправо",diams:"Черный ромб",asymp:"Примерно равно"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/si.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/si.js new file mode 100644 index 0000000..12789fb --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/si.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","si",{euro:"යුරෝ සලකුණ",lsquo:"වමේ තනි උපුටා දක්වීම ",rsquo:"දකුණේ තනි උපුටා දක්වීම ",ldquo:"වමේ දිත්ව උපුටා දක්වීම ",rdquo:"දකුණේ දිත්ව උපුටා දක්වීම ",ndash:"En dash",mdash:"Em dash",iexcl:"යටිකුරු හර්ෂදී ",cent:"Cent sign",pound:"Pound sign",curren:"මුල්‍යමය ",yen:"යෙන් ",brvbar:"Broken bar",sect:"තෙරේම් ",uml:"Diaeresis",copy:"පිටපත් අයිතිය ",ordf:"දර්ශකය",laquo:"Left-pointing double angle quotation mark",not:"සලකුණක් නොවේ",reg:"සලකුණක් ලියාපදිංචි කිරීම", +macr:"මුද්‍රිත ",deg:"සලකුණේ ",sup2:"උඩු ලකුණු දෙක",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",Aacute:"Latin capital letter A with acute accent", +Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent", +Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent", +Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above", +aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde", +ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent", +thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer", +bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/sk.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/sk.js new file mode 100644 index 0000000..6e5b534 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/sk.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","sk",{euro:"Znak eura",lsquo:"Ľavá jednoduchá úvodzovka",rsquo:"Pravá jednoduchá úvodzovka",ldquo:"Pravá dvojitá úvodzovka",rdquo:"Pravá dvojitá úvodzovka",ndash:"En pomlčka",mdash:"Em pomlčka",iexcl:"Obrátený výkričník",cent:"Znak centu",pound:"Znak libry",curren:"Znak meny",yen:"Znak jenu",brvbar:"Prerušená zvislá čiara",sect:"Znak odseku",uml:"Prehláska",copy:"Znak copyrightu",ordf:"Ženský indikátor rodu",laquo:"Znak dvojitých lomených úvodzoviek vľavo",not:"Logistický zápor", +reg:"Znak registrácie",macr:"Pomlčka nad",deg:"Znak stupňa",sup2:"Dvojka ako horný index",sup3:"Trojka ako horný index",acute:"Dĺžeň",micro:"Znak mikro",para:"Znak odstavca",middot:"Bodka uprostred",cedil:"Chvost vľavo",sup1:"Jednotka ako horný index",ordm:"Mužský indikátor rodu",raquo:"Znak dvojitých lomených úvodzoviek vpravo",frac14:"Obyčajný zlomok jedna štvrtina",frac12:"Obyčajný zlomok jedna polovica",frac34:"Obyčajný zlomok tri štvrtiny",iquest:"Otočený otáznik",Agrave:"Veľké písmeno latinky A s accentom", +Aacute:"Veľké písmeno latinky A s dĺžňom",Acirc:"Veľké písmeno latinky A s mäkčeňom",Atilde:"Veľké písmeno latinky A s tildou",Auml:"Veľké písmeno latinky A s dvoma bodkami",Aring:"Veľké písmeno latinky A s krúžkom nad",AElig:"Veľké písmeno latinky Æ",Ccedil:"Veľké písmeno latinky C s chvostom vľavo",Egrave:"Veľké písmeno latinky E s accentom",Eacute:"Veľké písmeno latinky E s dĺžňom",Ecirc:"Veľké písmeno latinky E s mäkčeňom",Euml:"Veľké písmeno latinky E s dvoma bodkami",Igrave:"Veľké písmeno latinky I s accentom", +Iacute:"Veľké písmeno latinky I s dĺžňom",Icirc:"Veľké písmeno latinky I s mäkčeňom",Iuml:"Veľké písmeno latinky I s dvoma bodkami",ETH:"Veľké písmeno latinky Eth",Ntilde:"Veľké písmeno latinky N s tildou",Ograve:"Veľké písmeno latinky O s accentom",Oacute:"Veľké písmeno latinky O s dĺžňom",Ocirc:"Veľké písmeno latinky O s mäkčeňom",Otilde:"Veľké písmeno latinky O s tildou",Ouml:"Veľké písmeno latinky O s dvoma bodkami",times:"Znak násobenia",Oslash:"Veľké písmeno latinky O preškrtnuté",Ugrave:"Veľké písmeno latinky U s accentom", +Uacute:"Veľké písmeno latinky U s dĺžňom",Ucirc:"Veľké písmeno latinky U s mäkčeňom",Uuml:"Veľké písmeno latinky U s dvoma bodkami",Yacute:"Veľké písmeno latinky Y s dĺžňom",THORN:"Veľké písmeno latinky Thorn",szlig:"Malé písmeno latinky ostré s",agrave:"Malé písmeno latinky a s accentom",aacute:"Malé písmeno latinky a s dĺžňom",acirc:"Malé písmeno latinky a s mäkčeňom",atilde:"Malé písmeno latinky a s tildou",auml:"Malé písmeno latinky a s dvoma bodkami",aring:"Malé písmeno latinky a s krúžkom nad", +aelig:"Malé písmeno latinky æ",ccedil:"Malé písmeno latinky c s chvostom vľavo",egrave:"Malé písmeno latinky e s accentom",eacute:"Malé písmeno latinky e s dĺžňom",ecirc:"Malé písmeno latinky e s mäkčeňom",euml:"Malé písmeno latinky e s dvoma bodkami",igrave:"Malé písmeno latinky i s accentom",iacute:"Malé písmeno latinky i s dĺžňom",icirc:"Malé písmeno latinky i s mäkčeňom",iuml:"Malé písmeno latinky i s dvoma bodkami",eth:"Malé písmeno latinky eth",ntilde:"Malé písmeno latinky n s tildou",ograve:"Malé písmeno latinky o s accentom", +oacute:"Malé písmeno latinky o s dĺžňom",ocirc:"Malé písmeno latinky o s mäkčeňom",otilde:"Malé písmeno latinky o s tildou",ouml:"Malé písmeno latinky o s dvoma bodkami",divide:"Znak delenia",oslash:"Malé písmeno latinky o preškrtnuté",ugrave:"Malé písmeno latinky u s accentom",uacute:"Malé písmeno latinky u s dĺžňom",ucirc:"Malé písmeno latinky u s mäkčeňom",uuml:"Malé písmeno latinky u s dvoma bodkami",yacute:"Malé písmeno latinky y s dĺžňom",thorn:"Malé písmeno latinky thorn",yuml:"Malé písmeno latinky y s dvoma bodkami", +OElig:"Veľká ligatúra latinky OE",oelig:"Malá ligatúra latinky OE",372:"Veľké písmeno latinky W s mäkčeňom",374:"Veľké písmeno latinky Y s mäkčeňom",373:"Malé písmeno latinky w s mäkčeňom",375:"Malé písmeno latinky y s mäkčeňom",sbquo:"Dolná jednoduchá 9-úvodzovka",8219:"Horná jednoduchá otočená 9-úvodzovka",bdquo:"Dolná dvojitá 9-úvodzovka",hellip:"Trojbodkový úvod",trade:"Znak ibchodnej značky",9658:"Čierny ukazovateľ smerujúci vpravo",bull:"Kruh",rarr:"Šípka vpravo",rArr:"Dvojitá šipka vpravo", +hArr:"Dvojitá šipka vľavo a vpravo",diams:"Čierne piky",asymp:"Skoro sa rovná"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/sl.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/sl.js new file mode 100644 index 0000000..bdebbd1 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/sl.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","sl",{euro:"Evro znak",lsquo:"Levi enojni narekovaj",rsquo:"Desni enojni narekovaj",ldquo:"Levi dvojni narekovaj",rdquo:"Desni dvojni narekovaj",ndash:"En pomišljaj",mdash:"Em pomišljaj",iexcl:"Obrnjen klicaj",cent:"Cent znak",pound:"Funt znak",curren:"Znak valute",yen:"Jen znak",brvbar:"Zlomljena črta",sect:"Znak oddelka",uml:"Diaeresis",copy:"Znak avtorskih pravic",ordf:"Ženski zaporedni kazalnik",laquo:"Levi obrnjen dvojni kotni narekovaj",not:"Ne znak",reg:"Registrirani znak", +macr:"Macron",deg:"Znak stopinj",sup2:"Nadpisano dva",sup3:"Nadpisano tri",acute:"Ostrivec",micro:"Mikro znak",para:"Pilcrow znak",middot:"Sredinska pika",cedil:"Cedilla",sup1:"Nadpisano ena",ordm:"Moški zaporedni kazalnik",raquo:"Desno obrnjen dvojni kotni narekovaj",frac14:"Ena četrtina",frac12:"Ena polovica",frac34:"Tri četrtine",iquest:"Obrnjen vprašaj",Agrave:"Velika latinska črka A s krativcem",Aacute:"Velika latinska črka A z ostrivcem",Acirc:"Velika latinska črka A s strešico",Atilde:"Velika latinska črka A z tildo", +Auml:"Velika latinska črka A z diaeresis-om",Aring:"Velika latinska črka A z obročem",AElig:"Velika latinska črka Æ",Ccedil:"Velika latinska črka C s cedillo",Egrave:"Velika latinska črka E s krativcem",Eacute:"Velika latinska črka E z ostrivcem",Ecirc:"Velika latinska črka E s strešico",Euml:"Velika latinska črka E z diaeresis-om",Igrave:"Velika latinska črka I s krativcem",Iacute:"Velika latinska črka I z ostrivcem",Icirc:"Velika latinska črka I s strešico",Iuml:"Velika latinska črka I z diaeresis-om", +ETH:"Velika latinska črka Eth",Ntilde:"Velika latinska črka N s tildo",Ograve:"Velika latinska črka O s krativcem",Oacute:"Velika latinska črka O z ostrivcem",Ocirc:"Velika latinska črka O s strešico",Otilde:"Velika latinska črka O s tildo",Ouml:"Velika latinska črka O z diaeresis-om",times:"Znak za množenje",Oslash:"Velika prečrtana latinska črka O",Ugrave:"Velika latinska črka U s krativcem",Uacute:"Velika latinska črka U z ostrivcem",Ucirc:"Velika latinska črka U s strešico",Uuml:"Velika latinska črka U z diaeresis-om", +Yacute:"Velika latinska črka Y z ostrivcem",THORN:"Velika latinska črka Thorn",szlig:"Mala ostra latinska črka s",agrave:"Mala latinska črka a s krativcem",aacute:"Mala latinska črka a z ostrivcem",acirc:"Mala latinska črka a s strešico",atilde:"Mala latinska črka a s tildo",auml:"Mala latinska črka a z diaeresis-om",aring:"Mala latinska črka a z obročem",aelig:"Mala latinska črka æ",ccedil:"Mala latinska črka c s cedillo",egrave:"Mala latinska črka e s krativcem",eacute:"Mala latinska črka e z ostrivcem", +ecirc:"Mala latinska črka e s strešico",euml:"Mala latinska črka e z diaeresis-om",igrave:"Mala latinska črka i s krativcem",iacute:"Mala latinska črka i z ostrivcem",icirc:"Mala latinska črka i s strešico",iuml:"Mala latinska črka i z diaeresis-om",eth:"Mala latinska črka eth",ntilde:"Mala latinska črka n s tildo",ograve:"Mala latinska črka o s krativcem",oacute:"Mala latinska črka o z ostrivcem",ocirc:"Mala latinska črka o s strešico",otilde:"Mala latinska črka o s tildo",ouml:"Mala latinska črka o z diaeresis-om", +divide:"Znak za deljenje",oslash:"Mala prečrtana latinska črka o",ugrave:"Mala latinska črka u s krativcem",uacute:"Mala latinska črka u z ostrivcem",ucirc:"Mala latinska črka u s strešico",uuml:"Mala latinska črka u z diaeresis-om",yacute:"Mala latinska črka y z ostrivcem",thorn:"Mala latinska črka thorn",yuml:"Mala latinska črka y z diaeresis-om",OElig:"Velika latinska ligatura OE",oelig:"Mala latinska ligatura oe",372:"Velika latinska črka W s strešico",374:"Velika latinska črka Y s strešico", +373:"Mala latinska črka w s strešico",375:"Mala latinska črka y s strešico",sbquo:"Enojni nizki-9 narekovaj",8219:"Enojni visoki-obrnjen-9 narekovaj",bdquo:"Dvojni nizki-9 narekovaj",hellip:"Horizontalni izpust",trade:"Znak blagovne znamke",9658:"Črni desno-usmerjen kazalec",bull:"Krogla",rarr:"Desno-usmerjena puščica",rArr:"Desno-usmerjena dvojna puščica",hArr:"Leva in desna dvojna puščica",diams:"Črna kara",asymp:"Skoraj enako"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/sq.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/sq.js new file mode 100644 index 0000000..967a048 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/sq.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","sq",{euro:"Shenja e Euros",lsquo:"Thonjëza majtas me një vi",rsquo:"Thonjëza djathtas me një vi",ldquo:"Thonjëza majtas",rdquo:"Thonjëza djathtas",ndash:"En viza lidhëse",mdash:"Em viza lidhëse",iexcl:"Pikëçuditëse e përmbysur",cent:"Shenja e Centit",pound:"Shejna e Funtit",curren:"Shenja e valutës",yen:"Shenja e Jenit",brvbar:"Viza e këputur",sect:"Shenja e pjesës",uml:"Diaeresis",copy:"Shenja e të drejtave të kopjimit",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Nuk ka shenjë",reg:"Shenja e të regjistruarit",macr:"Macron",deg:"Shenja e shkallës",sup2:"Super-skripta dy",sup3:"Super-skripta tre",acute:"Theks i mprehtë",micro:"Shjenja e Mikros",para:"Pilcrow sign",middot:"Pika e Mesme",cedil:"Hark nën shkronja",sup1:"Super-skripta një",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Thyesa një të katrat",frac12:"Thyesa një të dytat",frac34:"Thyesa tre të katrat",iquest:"Pikëpyetje e përmbysur",Agrave:"Shkronja e madhe latine A me theks të rëndë", +Aacute:"Shkronja e madhe latine A me theks akute",Acirc:"Shkronja e madhe latine A me theks lakor",Atilde:"Shkronja e madhe latine A me tildë",Auml:"Shkronja e madhe latine A me dy pika",Aring:"Shkronja e madhe latine A me unazë mbi",AElig:"Shkronja e madhe latine Æ",Ccedil:"Shkronja e madhe latine C me hark poshtë",Egrave:"Shkronja e madhe latine E me theks të rëndë",Eacute:"Shkronja e madhe latine E me theks akute",Ecirc:"Shkronja e madhe latine E me theks lakor",Euml:"Shkronja e madhe latine E me dy pika", +Igrave:"Shkronja e madhe latine I me theks të rëndë",Iacute:"Shkronja e madhe latine I me theks akute",Icirc:"Shkronja e madhe latine I me theks lakor",Iuml:"Shkronja e madhe latine I me dy pika",ETH:"Shkronja e madhe latine Eth",Ntilde:"Shkronja e madhe latine N me tildë",Ograve:"Shkronja e madhe latine O me theks të rëndë",Oacute:"Shkronja e madhe latine O me theks akute",Ocirc:"Shkronja e madhe latine O me theks lakor",Otilde:"Shkronja e madhe latine O me tildë",Ouml:"Shkronja e madhe latine O me dy pika", +times:"Shenja e shumëzimit",Oslash:"Shkronja e madhe latine O me vizë në mes",Ugrave:"Shkronja e madhe latine U me theks të rëndë",Uacute:"Shkronja e madhe latine U me theks akute",Ucirc:"Shkronja e madhe latine U me theks lakor",Uuml:"Shkronja e madhe latine U me dy pika",Yacute:"Shkronja e madhe latine Y me theks akute",THORN:"Shkronja e madhe latine Thorn",szlig:"Shkronja e vogë latine s e mprehtë",agrave:"Shkronja e vogë latine a me theks të rëndë",aacute:"Shkronja e vogë latine a me theks të mprehtë", +acirc:"Shkronja e vogël latine a me theks lakor",atilde:"Shkronja e vogël latine a me tildë",auml:"Shkronja e vogël latine a me dy pika",aring:"Shkronja e vogë latine a me unazë mbi",aelig:"Shkronja e vogë latine æ",ccedil:"Shkronja e vogël latine c me hark poshtë",egrave:"Shkronja e vogë latine e me theks të rëndë",eacute:"Shkronja e vogë latine e me theks të mprehtë",ecirc:"Shkronja e vogël latine e me theks lakor",euml:"Shkronja e vogël latine e me dy pika",igrave:"Shkronja e vogë latine i me theks të rëndë", +iacute:"Shkronja e vogë latine i me theks të mprehtë",icirc:"Shkronja e vogël latine i me theks lakor",iuml:"Shkronja e vogël latine i me dy pika",eth:"Shkronja e vogë latine eth",ntilde:"Shkronja e vogël latine n me tildë",ograve:"Shkronja e vogë latine o me theks të rëndë",oacute:"Shkronja e vogë latine o me theks të mprehtë",ocirc:"Shkronja e vogël latine o me theks lakor",otilde:"Shkronja e vogël latine o me tildë",ouml:"Shkronja e vogël latine o me dy pika",divide:"Shenja ndarëse",oslash:"Shkronja e vogël latine o me vizë në mes", +ugrave:"Shkronja e vogë latine u me theks të rëndë",uacute:"Shkronja e vogë latine u me theks të mprehtë",ucirc:"Shkronja e vogël latine u me theks lakor",uuml:"Shkronja e vogël latine u me dy pika",yacute:"Shkronja e vogë latine y me theks të mprehtë",thorn:"Shkronja e vogël latine thorn",yuml:"Shkronja e vogël latine y me dy pika",OElig:"Shkronja e madhe e bashkuar latine OE",oelig:"Shkronja e vogël e bashkuar latine oe",372:"Shkronja e madhe latine W me theks lakor",374:"Shkronja e madhe latine Y me theks lakor", +373:"Shkronja e vogël latine w me theks lakor",375:"Shkronja e vogël latine y me theks lakor",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Shenja e Simbolit Tregtarë",9658:"Black right-pointing pointer",bull:"Pulla",rarr:"Shigjeta djathtas",rArr:"Shenja të dyfishta djathtas",hArr:"Shigjeta e dyfishë majtas-djathtas",diams:"Black diamond suit",asymp:"Gati e barabar me"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/sv.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/sv.js new file mode 100644 index 0000000..d177c86 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/sv.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","sv",{euro:"Eurotecken",lsquo:"Enkelt vänster citattecken",rsquo:"Enkelt höger citattecken",ldquo:"Dubbelt vänster citattecken",rdquo:"Dubbelt höger citattecken",ndash:"Snedstreck",mdash:"Långt tankstreck",iexcl:"Inverterad utropstecken",cent:"Centtecken",pound:"Pundtecken",curren:"Valutatecken",yen:"Yentecken",brvbar:"Brutet lodrätt streck",sect:"Paragraftecken",uml:"Diaeresis",copy:"Upphovsrättstecken",ordf:"Feminit ordningstalsindikator",laquo:"Vänsterställt dubbelt vinkelcitationstecken", +not:"Icke-tecken",reg:"Registrerad",macr:"Macron",deg:"Grader",sup2:"Upphöjt två",sup3:"Upphöjt tre",acute:"Akut accent",micro:"Mikrotecken",para:"Alinea",middot:"Centrerad prick",cedil:"Cedilj",sup1:"Upphöjt en",ordm:"Maskulina ordningsändelsen",raquo:"Högerställt dubbelt vinkelcitationstecken",frac14:"Bråktal - en kvart",frac12:"Bråktal - en halv",frac34:"Bråktal - tre fjärdedelar",iquest:"Inverterat frågetecken",Agrave:"Stort A med grav accent",Aacute:"Stort A med akutaccent",Acirc:"Stort A med circumflex", +Atilde:"Stort A med tilde",Auml:"Stort A med diaresis",Aring:"Stort A med ring ovan",AElig:"Stort Æ",Ccedil:"Stort C med cedilj",Egrave:"Stort E med grav accent",Eacute:"Stort E med aktuaccent",Ecirc:"Stort E med circumflex",Euml:"Stort E med diaeresis",Igrave:"Stort I med grav accent",Iacute:"Stort I med akutaccent",Icirc:"Stort I med circumflex",Iuml:"Stort I med diaeresis",ETH:"Stort Eth",Ntilde:"Stort N med tilde",Ograve:"Stort O med grav accent",Oacute:"Stort O med aktuaccent",Ocirc:"Stort O med circumflex", +Otilde:"Stort O med tilde",Ouml:"Stort O med diaeresis",times:"Multiplicera",Oslash:"Stor Ø",Ugrave:"Stort U med grav accent",Uacute:"Stort U med akutaccent",Ucirc:"Stort U med circumflex",Uuml:"Stort U med diaeresis",Yacute:"Stort Y med akutaccent",THORN:"Stort Thorn",szlig:"Litet dubbel-s/Eszett",agrave:"Litet a med grav accent",aacute:"Litet a med akutaccent",acirc:"Litet a med circumflex",atilde:"Litet a med tilde",auml:"Litet a med diaeresis",aring:"Litet a med ring ovan",aelig:"Bokstaven æ", +ccedil:"Litet c med cedilj",egrave:"Litet e med grav accent",eacute:"Litet e med akutaccent",ecirc:"Litet e med circumflex",euml:"Litet e med diaeresis",igrave:"Litet i med grav accent",iacute:"Litet i med akutaccent",icirc:"LItet i med circumflex",iuml:"Litet i med didaeresis",eth:"Litet eth",ntilde:"Litet n med tilde",ograve:"LItet o med grav accent",oacute:"LItet o med akutaccent",ocirc:"Litet o med circumflex",otilde:"LItet o med tilde",ouml:"Litet o med diaeresis",divide:"Division",oslash:"ø", +ugrave:"Litet u med grav accent",uacute:"Litet u med akutaccent",ucirc:"LItet u med circumflex",uuml:"Litet u med diaeresis",yacute:"Litet y med akutaccent",thorn:"Litet thorn",yuml:"Litet y med diaeresis",OElig:"Stor ligatur av OE",oelig:"Liten ligatur av oe",372:"Stort W med circumflex",374:"Stort Y med circumflex",373:"Litet w med circumflex",375:"Litet y med circumflex",sbquo:"Enkelt lågt 9-citationstecken",8219:"Enkelt högt bakvänt 9-citationstecken",bdquo:"Dubbelt lågt 9-citationstecken",hellip:"Horisontellt uteslutningstecken", +trade:"Varumärke",9658:"Svart högervänd pekare",bull:"Listpunkt",rarr:"Högerpil",rArr:"Dubbel högerpil",hArr:"Dubbel vänsterpil",diams:"Svart ruter",asymp:"Ungefär lika med"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/th.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/th.js new file mode 100644 index 0000000..1d43ac9 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/th.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","th",{euro:"Euro sign",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"สัญลักษณ์สกุลเงิน",yen:"สัญลักษณ์เงินเยน",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"สัญลักษณ์หัวข้อย่อย",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/tr.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/tr.js new file mode 100644 index 0000000..65c1a19 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/tr.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","tr",{euro:"Euro işareti",lsquo:"Sol tek tırnak işareti",rsquo:"Sağ tek tırnak işareti",ldquo:"Sol çift tırnak işareti",rdquo:"Sağ çift tırnak işareti",ndash:"En tire",mdash:"Em tire",iexcl:"Ters ünlem işareti",cent:"Cent işareti",pound:"Pound işareti",curren:"Para birimi işareti",yen:"Yen işareti",brvbar:"Kırık bar",sect:"Bölüm işareti",uml:"İki sesli harfin ayrılması",copy:"Telif hakkı işareti",ordf:"Dişil sıralı gösterge",laquo:"Sol-işaret çift açı tırnak işareti", +not:"Not işareti",reg:"Kayıtlı işareti",macr:"Makron",deg:"Derece işareti",sup2:"İkili üstsimge",sup3:"Üçlü üstsimge",acute:"Aksan işareti",micro:"Mikro işareti",para:"Pilcrow işareti",middot:"Orta nokta",cedil:"Kedilla",sup1:"Üstsimge",ordm:"Eril sıralı gösterge",raquo:"Sağ işaret çift açı tırnak işareti",frac14:"Bayağı kesrin dörtte biri",frac12:"Bayağı kesrin bir yarım",frac34:"Bayağı kesrin dörtte üç",iquest:"Ters soru işareti",Agrave:"Aksanlı latin harfi",Aacute:"Aşırı aksanıyla Latin harfi", +Acirc:"Çarpık Latin harfi",Atilde:"Tilde latin harfi",Auml:"Sesli harf ayrılımlıı latin harfi",Aring:"Halkalı latin büyük A harfi",AElig:"Latin büyük Æ harfi",Ccedil:"Latin büyük C harfi ile kedilla",Egrave:"Aksanlı latin büyük E harfi",Eacute:"Aşırı vurgulu latin büyük E harfi",Ecirc:"Çarpık latin büyük E harfi",Euml:"Sesli harf ayrılımlıı latin büyük E harfi",Igrave:"Aksanlı latin büyük I harfi",Iacute:"Aşırı aksanlı latin büyük I harfi",Icirc:"Çarpık latin büyük I harfi",Iuml:"Sesli harf ayrılımlıı latin büyük I harfi", +ETH:"Latin büyük Eth harfi",Ntilde:"Tildeli latin büyük N harfi",Ograve:"Aksanlı latin büyük O harfi",Oacute:"Aşırı aksanlı latin büyük O harfi",Ocirc:"Çarpık latin büyük O harfi",Otilde:"Tildeli latin büyük O harfi",Ouml:"Sesli harf ayrılımlı latin büyük O harfi",times:"Çarpma işareti",Oslash:"Vurgulu latin büyük O harfi",Ugrave:"Aksanlı latin büyük U harfi",Uacute:"Aşırı aksanlı latin büyük U harfi",Ucirc:"Çarpık latin büyük U harfi",Uuml:"Sesli harf ayrılımlı latin büyük U harfi",Yacute:"Aşırı aksanlı latin büyük Y harfi", +THORN:"Latin büyük Thorn harfi",szlig:"Latin küçük keskin s harfi",agrave:"Aksanlı latin küçük a harfi",aacute:"Aşırı aksanlı latin küçük a harfi",acirc:"Çarpık latin küçük a harfi",atilde:"Tildeli latin küçük a harfi",auml:"Sesli harf ayrılımlı latin küçük a harfi",aring:"Halkalı latin küçük a harfi",aelig:"Latin büyük æ harfi",ccedil:"Kedillalı latin küçük c harfi",egrave:"Aksanlı latin küçük e harfi",eacute:"Aşırı aksanlı latin küçük e harfi",ecirc:"Çarpık latin küçük e harfi",euml:"Sesli harf ayrılımlı latin küçük e harfi", +igrave:"Aksanlı latin küçük i harfi",iacute:"Aşırı aksanlı latin küçük i harfi",icirc:"Çarpık latin küçük i harfi",iuml:"Sesli harf ayrılımlı latin küçük i harfi",eth:"Latin küçük eth harfi",ntilde:"Tildeli latin küçük n harfi",ograve:"Aksanlı latin küçük o harfi",oacute:"Aşırı aksanlı latin küçük o harfi",ocirc:"Çarpık latin küçük o harfi",otilde:"Tildeli latin küçük o harfi",ouml:"Sesli harf ayrılımlı latin küçük o harfi",divide:"Bölme işareti",oslash:"Vurgulu latin küçük o harfi",ugrave:"Aksanlı latin küçük u harfi", +uacute:"Aşırı aksanlı latin küçük u harfi",ucirc:"Çarpık latin küçük u harfi",uuml:"Sesli harf ayrılımlı latin küçük u harfi",yacute:"Aşırı aksanlı latin küçük y harfi",thorn:"Latin küçük thorn harfi",yuml:"Sesli harf ayrılımlı latin küçük y harfi",OElig:"Latin büyük bağlı OE harfi",oelig:"Latin küçük bağlı oe harfi",372:"Çarpık latin büyük W harfi",374:"Çarpık latin büyük Y harfi",373:"Çarpık latin küçük w harfi",375:"Çarpık latin küçük y harfi",sbquo:"Tek düşük-9 tırnak işareti",8219:"Tek yüksek-ters-9 tırnak işareti", +bdquo:"Çift düşük-9 tırnak işareti",hellip:"Yatay elips",trade:"Marka tescili işareti",9658:"Siyah sağ işaret işaretçisi",bull:"Koyu nokta",rarr:"Sağa doğru ok",rArr:"Sağa doğru çift ok",hArr:"Sol, sağ çift ok",diams:"Siyah elmas takımı",asymp:"Hemen hemen eşit"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/tt.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/tt.js new file mode 100644 index 0000000..303d655 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/tt.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","tt",{euro:"Евро тамгасы",lsquo:"Сул бер иңле куштырнаклар",rsquo:"Уң бер иңле куштырнаклар",ldquo:"Сул ике иңле куштырнаклар",rdquo:"Уң ике иңле куштырнаклар",ndash:"Кыска сызык",mdash:"Озын сызык",iexcl:"Әйләндерелгән өндәү билгесе",cent:"Цент тамгасы",pound:"Фунт тамгасы",curren:"Акча берәмлеге тамгасы",yen:"Иена тамгасы",brvbar:"Broken bar",sect:"Параграф билгесе",uml:"Диерезис",copy:"Хокук иясе булу билгесе",ordf:"Feminine ordinal indicator",laquo:"Ачылучы чыршысыман җәя", +not:"Юклык ишарəсе",reg:"Теркәләнгән булу билгесе",macr:"Макрон",deg:"Градус билгесе",sup2:"Икенче өске индекс",sup3:"Өченче өске индекс",acute:"Басым билгесе",micro:"Микро билгесе",para:"Параграф билгесе",middot:"Уртадагы нокта",cedil:"Седиль",sup1:"Беренче өске индекс",ordm:"Masculine ordinal indicator",raquo:"Ябылучы чыршысыман җәя",frac14:"Гади дүрттән бер билгесе",frac12:"Гади икедән бер билгесе",frac34:"Гади дүрттән өч билгесе",iquest:"Әйләндерелгән өндәү билгесе",Agrave:"Гравис белән латин A баш хәрефе", +Aacute:"Басым билгесе белән латин A баш хәрефе",Acirc:"Циркумфлекс белән латин A баш хәрефе",Atilde:"Тильда белән латин A баш хәрефе",Auml:"Диерезис белән латин A баш хәрефе",Aring:"Өстендә боҗра булган латин A баш хәрефе",AElig:"Латин Æ баш хәрефе",Ccedil:"Седиль белән латин C баш хәрефе",Egrave:"Гравис белән латин E баш хәрефе",Eacute:"Басым билгесе белән латин E баш хәрефе",Ecirc:"Циркумфлекс белән латин E баш хәрефе",Euml:"Диерезис белән латин E баш хәрефе",Igrave:"Гравис белән латин I баш хәрефе", +Iacute:"Басым билгесе белән латин I баш хәрефе",Icirc:"Циркумфлекс белән латин I баш хәрефе",Iuml:"Диерезис белән латин I баш хәрефе",ETH:"Латин Eth баш хәрефе",Ntilde:"Тильда белән латин N баш хәрефе",Ograve:"Гравис белән латин O баш хәрефе",Oacute:"Басым билгесе белән латин O баш хәрефе",Ocirc:"Циркумфлекс белән латин O баш хәрефе",Otilde:"Тильда белән латин O баш хәрефе",Ouml:"Диерезис белән латин O баш хәрефе",times:"Тапкырлау билгесе",Oslash:"Сызык белән латин O баш хәрефе",Ugrave:"Гравис белән латин U баш хәрефе", +Uacute:"Басым билгесе белән латин U баш хәрефе",Ucirc:"Циркумфлекс белән латин U баш хәрефе",Uuml:"Диерезис белән латин U баш хәрефе",Yacute:"Басым билгесе белән латин Y баш хәрефе",THORN:"Латин Thorn баш хәрефе",szlig:"Латин beta юл хәрефе",agrave:"Гравис белән латин a юл хәрефе",aacute:"Басым билгесе белән латин a юл хәрефе",acirc:"Циркумфлекс белән латин a юл хәрефе",atilde:"Тильда белән латин a юл хәрефе",auml:"Диерезис белән латин a юл хәрефе",aring:"Өстендә боҗра булган латин a юл хәрефе",aelig:"Латин æ юл хәрефе", +ccedil:"Седиль белән латин c юл хәрефе",egrave:"Гравис белән латин e юл хәрефе",eacute:"Басым билгесе белән латин e юл хәрефе",ecirc:"Циркумфлекс белән латин e юл хәрефе",euml:"Диерезис белән латин e юл хәрефе",igrave:"Гравис белән латин i юл хәрефе",iacute:"Басым билгесе белән латин i юл хәрефе",icirc:"Циркумфлекс белән латин i юл хәрефе",iuml:"Диерезис белән латин i юл хәрефе",eth:"Латин eth юл хәрефе",ntilde:"Тильда белән латин n юл хәрефе",ograve:"Гравис белән латин o юл хәрефе",oacute:"Басым билгесе белән латин o юл хәрефе", +ocirc:"Циркумфлекс белән латин o юл хәрефе",otilde:"Тильда белән латин o юл хәрефе",ouml:"Диерезис белән латин o юл хәрефе",divide:"Бүлү билгесе",oslash:"Сызык белән латин o юл хәрефе",ugrave:"Гравис белән латин u юл хәрефе",uacute:"Басым билгесе белән латин u юл хәрефе",ucirc:"Циркумфлекс белән латин u юл хәрефе",uuml:"Диерезис белән латин u юл хәрефе",yacute:"Басым билгесе белән латин y юл хәрефе",thorn:"Латин thorn юл хәрефе",yuml:"Диерезис белән латин y юл хәрефе",OElig:"Латин лигатура OE баш хәрефе", +oelig:"Латин лигатура oe юл хәрефе",372:"Циркумфлекс белән латин W баш хәрефе",374:"Циркумфлекс белән латин Y баш хәрефе",373:"Циркумфлекс белән латин w юл хәрефе",375:"Циркумфлекс белән латин y юл хәрефе",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Ятма эллипс",trade:"Сәүдә маркасы билгесе",9658:"Black right-pointing pointer",bull:"Маркер",rarr:"Уң якка ук",rArr:"Уң якка икеләтә ук",hArr:"Ике якка икеләтә ук",diams:"Black diamond suit", +asymp:"якынча"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/ug.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/ug.js new file mode 100644 index 0000000..757e83f --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/ug.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ug",{euro:"ياۋرو بەلگىسى",lsquo:"يالاڭ پەش سول",rsquo:"يالاڭ پەش ئوڭ",ldquo:"قوش پەش سول",rdquo:"قوش پەش ئوڭ",ndash:"سىزىقچە",mdash:"سىزىق",iexcl:"ئۈندەش",cent:"تىيىن بەلگىسى",pound:"فوند ستېرلىڭ",curren:"پۇل بەلگىسى",yen:"ياپونىيە يىنى",brvbar:"ئۈزۈك بالداق",sect:"پاراگراف بەلگىسى",uml:"تاۋۇش ئايرىش بەلگىسى",copy:"نەشر ھوقۇقى بەلگىسى",ordf:"Feminine ordinal indicator",laquo:"قوش تىرناق سول",not:"غەيرى بەلگە",reg:"خەتلەتكەن تاۋار ماركىسى",macr:"سوزۇش بەلگىسى", +deg:"گىرادۇس بەلگىسى",sup2:"يۇقىرى ئىندېكىس 2",sup3:"يۇقىرى ئىندېكىس 3",acute:"ئۇرغۇ بەلگىسى",micro:"Micro sign",para:"ئابزاس بەلگىسى",middot:"ئوتتۇرا چېكىت",cedil:"ئاستىغا قوشۇلىدىغان بەلگە",sup1:"يۇقىرى ئىندېكىس 1",ordm:"Masculine ordinal indicator",raquo:"قوش تىرناق ئوڭ",frac14:"ئاددىي كەسىر تۆتتىن بىر",frac12:"ئاددىي كەسىر ئىككىدىن بىر",frac34:"ئاددىي كەسىر ئۈچتىن تۆرت",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",Aacute:"Latin capital letter A with acute accent", +Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent", +Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"قوش پەش ئوڭ",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent", +Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",aelig:"Latin small letter æ", +ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"تىك موللاق سوئال بەلگىسى",ograve:"Latin small letter o with grave accent", +oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"بۆلۈش بەلگىسى",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn", +yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"خەتلەتكەن تاۋار ماركىسى بەلگىسى",9658:"Black right-pointing pointer", +bull:"Bullet",rarr:"ئوڭ يا ئوق",rArr:"ئوڭ قوش سىزىق يا ئوق",hArr:"ئوڭ سول قوش سىزىق يا ئوق",diams:"ئۇيۇل غىچ",asymp:"تەخمىنەن تەڭ"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/uk.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/uk.js new file mode 100644 index 0000000..2343e56 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/uk.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","uk",{euro:"Знак євро",lsquo:"Ліві одинарні лапки",rsquo:"Праві одинарні лапки",ldquo:"Ліві подвійні лапки",rdquo:"Праві подвійні лапки",ndash:"Середнє тире",mdash:"Довге тире",iexcl:"Перевернутий знак оклику",cent:"Знак цента",pound:"Знак фунта",curren:"Знак валюти",yen:"Знак єни",brvbar:"Переривчаста вертикальна лінія",sect:"Знак параграфу",uml:"Умлаут",copy:"Знак авторських прав",ordf:"Жіночий порядковий вказівник",laquo:"ліві вказівні подвійні кутові дужки", +not:"Заперечення",reg:"Знак охорони суміжних прав",macr:"Макрон",deg:"Знак градуса",sup2:"два у верхньому індексі",sup3:"три у верхньому індексі",acute:"Знак акута",micro:"Знак мікро",para:"Знак абзацу",middot:"Інтерпункт",cedil:"Седиль",sup1:"Один у верхньому індексі",ordm:"Чоловічий порядковий вказівник",raquo:"праві вказівні подвійні кутові дужки",frac14:"Одна четвертина",frac12:"Одна друга",frac34:"три четвертих",iquest:"Перевернутий знак питання",Agrave:"Велика латинська A з гравісом",Aacute:"Велика латинська А з акутом", +Acirc:"Велика латинська А з циркумфлексом",Atilde:"Велика латинська А з тильдою",Auml:"Велике латинське А з умлаутом",Aring:"Велика латинська A з кільцем згори",AElig:"Велика латинська Æ",Ccedil:"Велика латинська C з седиллю",Egrave:"Велика латинська E з гравісом",Eacute:"Велика латинська E з акутом",Ecirc:"Велика латинська E з циркумфлексом",Euml:"Велика латинська А з умлаутом",Igrave:"Велика латинська I з гравісом",Iacute:"Велика латинська I з акутом",Icirc:"Велика латинська I з циркумфлексом", +Iuml:"Велика латинська І з умлаутом",ETH:"Велика латинська Eth",Ntilde:"Велика латинська N з тильдою",Ograve:"Велика латинська O з гравісом",Oacute:"Велика латинська O з акутом",Ocirc:"Велика латинська O з циркумфлексом",Otilde:"Велика латинська O з тильдою",Ouml:"Велика латинська О з умлаутом",times:"Знак множення",Oslash:"Велика латинська перекреслена O ",Ugrave:"Велика латинська U з гравісом",Uacute:"Велика латинська U з акутом",Ucirc:"Велика латинська U з циркумфлексом",Uuml:"Велика латинська U з умлаутом", +Yacute:"Велика латинська Y з акутом",THORN:"Велика латинська Торн",szlig:"Мала латинська есцет",agrave:"Мала латинська a з гравісом",aacute:"Мала латинська a з акутом",acirc:"Мала латинська a з циркумфлексом",atilde:"Мала латинська a з тильдою",auml:"Мала латинська a з умлаутом",aring:"Мала латинська a з кільцем згори",aelig:"Мала латинська æ",ccedil:"Мала латинська C з седиллю",egrave:"Мала латинська e з гравісом",eacute:"Мала латинська e з акутом",ecirc:"Мала латинська e з циркумфлексом",euml:"Мала латинська e з умлаутом", +igrave:"Мала латинська i з гравісом",iacute:"Мала латинська i з акутом",icirc:"Мала латинська i з циркумфлексом",iuml:"Мала латинська i з умлаутом",eth:"Мала латинська Eth",ntilde:"Мала латинська n з тильдою",ograve:"Мала латинська o з гравісом",oacute:"Мала латинська o з акутом",ocirc:"Мала латинська o з циркумфлексом",otilde:"Мала латинська o з тильдою",ouml:"Мала латинська o з умлаутом",divide:"Знак ділення",oslash:"Мала латинська перекреслена o",ugrave:"Мала латинська u з гравісом",uacute:"Мала латинська u з акутом", +ucirc:"Мала латинська u з циркумфлексом",uuml:"Мала латинська u з умлаутом",yacute:"Мала латинська y з акутом",thorn:"Мала латинська торн",yuml:"Мала латинська y з умлаутом",OElig:"Велика латинська лігатура OE",oelig:"Мала латинська лігатура oe",372:"Велика латинська W з циркумфлексом",374:"Велика латинська Y з циркумфлексом",373:"Мала латинська w з циркумфлексом",375:"Мала латинська y з циркумфлексом",sbquo:"Одиничні нижні лабки",8219:"Верхні одиничні обернені лабки",bdquo:"Подвійні нижні лабки", +hellip:"Три крапки",trade:"Знак торгової марки",9658:"Чорний правий вказівник",bull:"Маркер списку",rarr:"Стрілка вправо",rArr:"Подвійна стрілка вправо",hArr:"Подвійна стрілка вліво-вправо",diams:"Чорний діамонт",asymp:"Наближено дорівнює"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/vi.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/vi.js new file mode 100644 index 0000000..a71305b --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/vi.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","vi",{euro:"Ký hiệu Euro",lsquo:"Dấu ngoặc đơn trái",rsquo:"Dấu ngoặc đơn phải",ldquo:"Dấu ngoặc đôi trái",rdquo:"Dấu ngoặc đôi phải",ndash:"Gạch ngang tiếng anh",mdash:"Gạch ngang Em",iexcl:"Chuyển đổi dấu chấm than",cent:"Ký tự tiền Mỹ",pound:"Ký tự tiền Anh",curren:"Ký tự tiền tệ",yen:"Ký tự tiền Yên Nhật",brvbar:"Thanh hỏng",sect:"Ký tự khu vực",uml:"Dấu tách đôi",copy:"Ký tự bản quyền",ordf:"Phần chỉ thị giống cái",laquo:"Chọn dấu ngoặc đôi trái",not:"Không có ký tự", +reg:"Ký tự đăng ký",macr:"Dấu nguyên âm dài",deg:"Ký tự độ",sup2:"Chữ trồi lên trên dạng 2",sup3:"Chữ trồi lên trên dạng 3",acute:"Dấu trọng âm",micro:"Ký tự micro",para:"Ký tự đoạn văn",middot:"Dấu chấm tròn",cedil:"Dấu móc lưới",sup1:"Ký tự trồi lên cấp 1",ordm:"Ký tự biểu hiện giống đực",raquo:"Chọn dấu ngoặc đôi phải",frac14:"Tỉ lệ một phần tư",frac12:"Tỉ lệ một nửa",frac34:"Tỉ lệ ba phần tư",iquest:"Chuyển đổi dấu chấm hỏi",Agrave:"Ký tự la-tinh viết hoa A với dấu huyền",Aacute:"Ký tự la-tinh viết hoa A với dấu sắc", +Acirc:"Ký tự la-tinh viết hoa A với dấu mũ",Atilde:"Ký tự la-tinh viết hoa A với dấu ngã",Auml:"Ký tự la-tinh viết hoa A với dấu hai chấm trên đầu",Aring:"Ký tự la-tinh viết hoa A với biểu tượng vòng tròn trên đầu",AElig:"Ký tự la-tinh viết hoa của Æ",Ccedil:"Ký tự la-tinh viết hoa C với dấu móc bên dưới",Egrave:"Ký tự la-tinh viết hoa E với dấu huyền",Eacute:"Ký tự la-tinh viết hoa E với dấu sắc",Ecirc:"Ký tự la-tinh viết hoa E với dấu mũ",Euml:"Ký tự la-tinh viết hoa E với dấu hai chấm trên đầu", +Igrave:"Ký tự la-tinh viết hoa I với dấu huyền",Iacute:"Ký tự la-tinh viết hoa I với dấu sắc",Icirc:"Ký tự la-tinh viết hoa I với dấu mũ",Iuml:"Ký tự la-tinh viết hoa I với dấu hai chấm trên đầu",ETH:"Viết hoa của ký tự Eth",Ntilde:"Ký tự la-tinh viết hoa N với dấu ngã",Ograve:"Ký tự la-tinh viết hoa O với dấu huyền",Oacute:"Ký tự la-tinh viết hoa O với dấu sắc",Ocirc:"Ký tự la-tinh viết hoa O với dấu mũ",Otilde:"Ký tự la-tinh viết hoa O với dấu ngã",Ouml:"Ký tự la-tinh viết hoa O với dấu hai chấm trên đầu", +times:"Ký tự phép toán nhân",Oslash:"Ký tự la-tinh viết hoa A với dấu ngã xuống",Ugrave:"Ký tự la-tinh viết hoa U với dấu huyền",Uacute:"Ký tự la-tinh viết hoa U với dấu sắc",Ucirc:"Ký tự la-tinh viết hoa U với dấu mũ",Uuml:"Ký tự la-tinh viết hoa U với dấu hai chấm trên đầu",Yacute:"Ký tự la-tinh viết hoa Y với dấu sắc",THORN:"Phần viết hoa của ký tự Thorn",szlig:"Ký tự viết nhỏ la-tinh của chữ s",agrave:"Ký tự la-tinh thường với dấu huyền",aacute:"Ký tự la-tinh thường với dấu sắc",acirc:"Ký tự la-tinh thường với dấu mũ", +atilde:"Ký tự la-tinh thường với dấu ngã",auml:"Ký tự la-tinh thường với dấu hai chấm trên đầu",aring:"Ký tự la-tinh viết thường với biểu tượng vòng tròn trên đầu",aelig:"Ký tự la-tinh viết thường của æ",ccedil:"Ký tự la-tinh viết thường của c với dấu móc bên dưới",egrave:"Ký tự la-tinh viết thường e với dấu huyền",eacute:"Ký tự la-tinh viết thường e với dấu sắc",ecirc:"Ký tự la-tinh viết thường e với dấu mũ",euml:"Ký tự la-tinh viết thường e với dấu hai chấm trên đầu",igrave:"Ký tự la-tinh viết thường i với dấu huyền", +iacute:"Ký tự la-tinh viết thường i với dấu sắc",icirc:"Ký tự la-tinh viết thường i với dấu mũ",iuml:"Ký tự la-tinh viết thường i với dấu hai chấm trên đầu",eth:"Ký tự la-tinh viết thường của eth",ntilde:"Ký tự la-tinh viết thường n với dấu ngã",ograve:"Ký tự la-tinh viết thường o với dấu huyền",oacute:"Ký tự la-tinh viết thường o với dấu sắc",ocirc:"Ký tự la-tinh viết thường o với dấu mũ",otilde:"Ký tự la-tinh viết thường o với dấu ngã",ouml:"Ký tự la-tinh viết thường o với dấu hai chấm trên đầu", +divide:"Ký hiệu phép tính chia",oslash:"Ký tự la-tinh viết thường o với dấu ngã",ugrave:"Ký tự la-tinh viết thường u với dấu huyền",uacute:"Ký tự la-tinh viết thường u với dấu sắc",ucirc:"Ký tự la-tinh viết thường u với dấu mũ",uuml:"Ký tự la-tinh viết thường u với dấu hai chấm trên đầu",yacute:"Ký tự la-tinh viết thường y với dấu sắc",thorn:"Ký tự la-tinh viết thường của chữ thorn",yuml:"Ký tự la-tinh viết thường y với dấu hai chấm trên đầu",OElig:"Ký tự la-tinh viết hoa gạch nối OE",oelig:"Ký tự la-tinh viết thường gạch nối OE", +372:"Ký tự la-tinh viết hoa W với dấu mũ",374:"Ký tự la-tinh viết hoa Y với dấu mũ",373:"Ký tự la-tinh viết thường w với dấu mũ",375:"Ký tự la-tinh viết thường y với dấu mũ",sbquo:"Dấu ngoặc đơn thấp số-9",8219:"Dấu ngoặc đơn đảo ngược số-9",bdquo:"Gấp đôi dấu ngoặc đơn số-9",hellip:"Tĩnh dược chiều ngang",trade:"Ký tự thương hiệu",9658:"Ký tự trỏ về hướng bên phải màu đen",bull:"Ký hiệu",rarr:"Mũi tên hướng bên phải",rArr:"Mũi tên hướng bên phải dạng đôi",hArr:"Mũi tên hướng bên trái dạng đôi",diams:"Ký hiệu hình thoi", +asymp:"Gần bằng với"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js new file mode 100644 index 0000000..d794a3d --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","zh-cn",{euro:"欧元符号",lsquo:"左单引号",rsquo:"右单引号",ldquo:"左双引号",rdquo:"右双引号",ndash:"短划线",mdash:"长划线",iexcl:"竖翻叹号",cent:"分币符号",pound:"英镑符号",curren:"货币符号",yen:"日元符号",brvbar:"间断条",sect:"节标记",uml:"分音符",copy:"版权所有标记",ordf:"阴性顺序指示符",laquo:"左指双尖引号",not:"非标记",reg:"注册标记",macr:"长音符",deg:"度标记",sup2:"上标二",sup3:"上标三",acute:"锐音符",micro:"微符",para:"段落标记",middot:"中间点",cedil:"下加符",sup1:"上标一",ordm:"阳性顺序指示符",raquo:"右指双尖引号",frac14:"普通分数四分之一",frac12:"普通分数二分之一",frac34:"普通分数四分之三",iquest:"竖翻问号", +Agrave:"带抑音符的拉丁文大写字母 A",Aacute:"带锐音符的拉丁文大写字母 A",Acirc:"带扬抑符的拉丁文大写字母 A",Atilde:"带颚化符的拉丁文大写字母 A",Auml:"带分音符的拉丁文大写字母 A",Aring:"带上圆圈的拉丁文大写字母 A",AElig:"拉丁文大写字母 Ae",Ccedil:"带下加符的拉丁文大写字母 C",Egrave:"带抑音符的拉丁文大写字母 E",Eacute:"带锐音符的拉丁文大写字母 E",Ecirc:"带扬抑符的拉丁文大写字母 E",Euml:"带分音符的拉丁文大写字母 E",Igrave:"带抑音符的拉丁文大写字母 I",Iacute:"带锐音符的拉丁文大写字母 I",Icirc:"带扬抑符的拉丁文大写字母 I",Iuml:"带分音符的拉丁文大写字母 I",ETH:"拉丁文大写字母 Eth",Ntilde:"带颚化符的拉丁文大写字母 N",Ograve:"带抑音符的拉丁文大写字母 O",Oacute:"带锐音符的拉丁文大写字母 O",Ocirc:"带扬抑符的拉丁文大写字母 O",Otilde:"带颚化符的拉丁文大写字母 O", +Ouml:"带分音符的拉丁文大写字母 O",times:"乘号",Oslash:"带粗线的拉丁文大写字母 O",Ugrave:"带抑音符的拉丁文大写字母 U",Uacute:"带锐音符的拉丁文大写字母 U",Ucirc:"带扬抑符的拉丁文大写字母 U",Uuml:"带分音符的拉丁文大写字母 U",Yacute:"带抑音符的拉丁文大写字母 Y",THORN:"拉丁文大写字母 Thorn",szlig:"拉丁文小写字母清音 S",agrave:"带抑音符的拉丁文小写字母 A",aacute:"带锐音符的拉丁文小写字母 A",acirc:"带扬抑符的拉丁文小写字母 A",atilde:"带颚化符的拉丁文小写字母 A",auml:"带分音符的拉丁文小写字母 A",aring:"带上圆圈的拉丁文小写字母 A",aelig:"拉丁文小写字母 Ae",ccedil:"带下加符的拉丁文小写字母 C",egrave:"带抑音符的拉丁文小写字母 E",eacute:"带锐音符的拉丁文小写字母 E",ecirc:"带扬抑符的拉丁文小写字母 E",euml:"带分音符的拉丁文小写字母 E",igrave:"带抑音符的拉丁文小写字母 I", +iacute:"带锐音符的拉丁文小写字母 I",icirc:"带扬抑符的拉丁文小写字母 I",iuml:"带分音符的拉丁文小写字母 I",eth:"拉丁文小写字母 Eth",ntilde:"带颚化符的拉丁文小写字母 N",ograve:"带抑音符的拉丁文小写字母 O",oacute:"带锐音符的拉丁文小写字母 O",ocirc:"带扬抑符的拉丁文小写字母 O",otilde:"带颚化符的拉丁文小写字母 O",ouml:"带分音符的拉丁文小写字母 O",divide:"除号",oslash:"带粗线的拉丁文小写字母 O",ugrave:"带抑音符的拉丁文小写字母 U",uacute:"带锐音符的拉丁文小写字母 U",ucirc:"带扬抑符的拉丁文小写字母 U",uuml:"带分音符的拉丁文小写字母 U",yacute:"带抑音符的拉丁文小写字母 Y",thorn:"拉丁文小写字母 Thorn",yuml:"带分音符的拉丁文小写字母 Y",OElig:"拉丁文大写连字 Oe",oelig:"拉丁文小写连字 Oe",372:"带扬抑符的拉丁文大写字母 W",374:"带扬抑符的拉丁文大写字母 Y", +373:"带扬抑符的拉丁文小写字母 W",375:"带扬抑符的拉丁文小写字母 Y",sbquo:"单下 9 形引号",8219:"单高横翻 9 形引号",bdquo:"双下 9 形引号",hellip:"水平省略号",trade:"商标标志",9658:"实心右指指针",bull:"加重号",rarr:"向右箭头",rArr:"向右双线箭头",hArr:"左右双线箭头",diams:"实心方块纸牌",asymp:"约等于"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/lang/zh.js b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/zh.js new file mode 100644 index 0000000..94c0cfb --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/lang/zh.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","zh",{euro:"歐元符號",lsquo:"左單引號",rsquo:"右單引號",ldquo:"左雙引號",rdquo:"右雙引號",ndash:"短破折號",mdash:"長破折號",iexcl:"倒置的驚嘆號",cent:"美分符號",pound:"英鎊符號",curren:"貨幣符號",yen:"日圓符號",brvbar:"Broken bar",sect:"章節符號",uml:"分音符號",copy:"版權符號",ordf:"雌性符號",laquo:"左雙角括號",not:"Not 符號",reg:"註冊商標符號",macr:"長音符號",deg:"度數符號",sup2:"上標字 2",sup3:"上標字 3",acute:"尖音符號",micro:"Micro sign",para:"段落符號",middot:"中間點",cedil:"字母 C 下面的尾型符號 ",sup1:"上標",ordm:"雄性符號",raquo:"右雙角括號",frac14:"四分之一符號",frac12:"Vulgar fraction one half", +frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"拉丁大寫字母 E 帶分音符號",Aring:"拉丁大寫字母 A 帶上圓圈",AElig:"拉丁大寫字母 Æ",Ccedil:"拉丁大寫字母 C 帶下尾符號",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis", +Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis", +times:"乘號",Oslash:"拉丁大寫字母 O 帶粗線符號",Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde", +auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis", +eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex", +uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark", +hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/specialchar/dialogs/specialchar.js b/static/assets/ckeditor/plugins/specialchar/dialogs/specialchar.js new file mode 100644 index 0000000..b343a83 --- /dev/null +++ b/static/assets/ckeditor/plugins/specialchar/dialogs/specialchar.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("specialchar",function(i){var e,l=i.lang.specialchar,k=function(c){var b,c=c.data?c.data.getTarget():new CKEDITOR.dom.element(c);if("a"==c.getName()&&(b=c.getChild(0).getHtml()))c.removeClass("cke_light_background"),e.hide(),c=i.document.createElement("span"),c.setHtml(b),i.insertText(c.getText())},m=CKEDITOR.tools.addFunction(k),j,g=function(c,b){var a,b=b||c.data.getTarget();"span"==b.getName()&&(b=b.getParent());if("a"==b.getName()&&(a=b.getChild(0).getHtml())){j&&d(null,j); +var f=e.getContentElement("info","htmlPreview").getElement();e.getContentElement("info","charPreview").getElement().setHtml(a);f.setHtml(CKEDITOR.tools.htmlEncode(a));b.getParent().addClass("cke_light_background");j=b}},d=function(c,b){b=b||c.data.getTarget();"span"==b.getName()&&(b=b.getParent());"a"==b.getName()&&(e.getContentElement("info","charPreview").getElement().setHtml(" "),e.getContentElement("info","htmlPreview").getElement().setHtml(" "),b.getParent().removeClass("cke_light_background"), +j=void 0)},n=CKEDITOR.tools.addFunction(function(c){var c=new CKEDITOR.dom.event(c),b=c.getTarget(),a;a=c.getKeystroke();var f="rtl"==i.lang.dir;switch(a){case 38:if(a=b.getParent().getParent().getPrevious())a=a.getChild([b.getParent().getIndex(),0]),a.focus(),d(null,b),g(null,a);c.preventDefault();break;case 40:if(a=b.getParent().getParent().getNext())if((a=a.getChild([b.getParent().getIndex(),0]))&&1==a.type)a.focus(),d(null,b),g(null,a);c.preventDefault();break;case 32:k({data:c});c.preventDefault(); +break;case f?37:39:if(a=b.getParent().getNext())a=a.getChild(0),1==a.type?(a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):d(null,b);else if(a=b.getParent().getParent().getNext())(a=a.getChild([0,0]))&&1==a.type?(a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):d(null,b);break;case f?39:37:(a=b.getParent().getPrevious())?(a=a.getChild(0),a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):(a=b.getParent().getParent().getPrevious())?(a=a.getLast().getChild(0),a.focus(),d(null,b),g(null,a),c.preventDefault(!0)): +d(null,b)}});return{title:l.title,minWidth:430,minHeight:280,buttons:[CKEDITOR.dialog.cancelButton],charColumns:17,onLoad:function(){for(var c=this.definition.charColumns,b=i.config.specialChars,a=CKEDITOR.tools.getNextId()+"_specialchar_table_label",f=[''],d=0,g=b.length,h,e;d');for(var j=0;j'+h+''+e+"")}else f.push('")}f.push("")}f.push("
     ');f.push("
    ",''+l.options+"");this.getContentElement("info","charContainer").getElement().setHtml(f.join(""))},contents:[{id:"info",label:i.lang.common.generalTab, +title:i.lang.common.generalTab,padding:0,align:"top",elements:[{type:"hbox",align:"top",widths:["320px","90px"],children:[{type:"html",id:"charContainer",html:"",onMouseover:g,onMouseout:d,focus:function(){var c=this.getElement().getElementsByTag("a").getItem(0);setTimeout(function(){c.focus();g(null,c)},0)},onShow:function(){var c=this.getElement().getChild([0,0,0,0,0]);setTimeout(function(){c.focus();g(null,c)},0)},onLoad:function(c){e=c.sender}},{type:"hbox",align:"top",widths:["100%"],children:[{type:"vbox", +align:"top",children:[{type:"html",html:"
    "},{type:"html",id:"charPreview",className:"cke_dark_background",style:"border:1px solid #eeeeee;font-size:28px;height:40px;width:70px;padding-top:9px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;",html:"
     
    "},{type:"html",id:"htmlPreview",className:"cke_dark_background",style:"border:1px solid #eeeeee;font-size:14px;height:20px;width:70px;padding-top:2px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;", +html:"
     
    "}]}]}]}]}]}}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/table/dialogs/table.js b/static/assets/ckeditor/plugins/table/dialogs/table.js new file mode 100644 index 0000000..2a33528 --- /dev/null +++ b/static/assets/ckeditor/plugins/table/dialogs/table.js @@ -0,0 +1,21 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function r(a){for(var e=0,l=0,k=0,m,g=a.$.rows.length;kl&&(l=e)}return l}function o(a){return function(){var e=this.getValue(),e=!!(CKEDITOR.dialog.validate.integer()(e)&&0n.getSize("width")?"100%":500:0,getValue:q,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",a.lang.common.width)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles");a&& +a.updateStyle("width",this.getValue())},setup:function(a){this.setValue(a.getStyle("width"))},commit:k}]},{type:"hbox",widths:["5em"],children:[{type:"text",id:"txtHeight",requiredContent:"table{height}",controlStyle:"width:5em",label:a.lang.common.height,title:a.lang.common.cssLengthTooltip,"default":"",getValue:q,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",a.lang.common.height)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles"); +a&&a.updateStyle("height",this.getValue())},setup:function(a){(a=a.getStyle("height"))&&this.setValue(a)},commit:k}]},{type:"html",html:" "},{type:"text",id:"txtCellSpace",requiredContent:"table[cellspacing]",controlStyle:"width:3em",label:a.lang.table.cellSpace,"default":a.filter.check("table[cellspacing]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellSpacing),setup:function(a){this.setValue(a.getAttribute("cellSpacing")||"")},commit:function(a,d){this.getValue()?d.setAttribute("cellSpacing", +this.getValue()):d.removeAttribute("cellSpacing")}},{type:"text",id:"txtCellPad",requiredContent:"table[cellpadding]",controlStyle:"width:3em",label:a.lang.table.cellPad,"default":a.filter.check("table[cellpadding]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellPadding),setup:function(a){this.setValue(a.getAttribute("cellPadding")||"")},commit:function(a,d){this.getValue()?d.setAttribute("cellPadding",this.getValue()):d.removeAttribute("cellPadding")}}]}]},{type:"html",align:"right", +html:""},{type:"vbox",padding:0,children:[{type:"text",id:"txtCaption",requiredContent:"caption",label:a.lang.table.caption,setup:function(a){this.enable();a=a.getElementsByTag("caption");if(0"+h.widthPx}]},f,{type:"select",id:"wordWrap",label:c.wordWrap,"default":"yes",items:[[c.yes,"yes"],[c.no,"no"]],setup:d(function(a){var b=a.getAttribute("noWrap");if("nowrap"==a.getStyle("white-space")|| +b)return"no"}),commit:function(a){"no"==this.getValue()?a.setStyle("white-space","nowrap"):a.removeStyle("white-space");a.removeAttribute("noWrap")}},f,{type:"select",id:"hAlign",label:c.hAlign,"default":"",items:[[e.notSet,""],[e.alignLeft,"left"],[e.alignCenter,"center"],[e.alignRight,"right"],[e.alignJustify,"justify"]],setup:d(function(a){var b=a.getAttribute("align");return a.getStyle("text-align")||b||""}),commit:function(a){var b=this.getValue();b?a.setStyle("text-align",b):a.removeStyle("text-align"); +a.removeAttribute("align")}},{type:"select",id:"vAlign",label:c.vAlign,"default":"",items:[[e.notSet,""],[e.alignTop,"top"],[e.alignMiddle,"middle"],[e.alignBottom,"bottom"],[c.alignBaseline,"baseline"]],setup:d(function(a){var b=a.getAttribute("vAlign"),a=a.getStyle("vertical-align");switch(a){case "top":case "middle":case "bottom":case "baseline":break;default:a=""}return a||b||""}),commit:function(a){var b=this.getValue();b?a.setStyle("vertical-align",b):a.removeStyle("vertical-align");a.removeAttribute("vAlign")}}]}, +f,{type:"vbox",padding:0,children:[{type:"select",id:"cellType",label:c.cellType,"default":"td",items:[[c.data,"td"],[c.header,"th"]],setup:d(function(a){return a.getName()}),commit:function(a){a.renameNode(this.getValue())}},f,{type:"text",id:"rowSpan",label:c.rowSpan,"default":"",validate:i.integer(c.invalidRowSpan),setup:d(function(a){if((a=parseInt(a.getAttribute("rowSpan"),10))&&1!=a)return a}),commit:function(a){var b=parseInt(this.getValue(),10);b&&1!=b?a.setAttribute("rowSpan",this.getValue()): +a.removeAttribute("rowSpan")}},{type:"text",id:"colSpan",label:c.colSpan,"default":"",validate:i.integer(c.invalidColSpan),setup:d(function(a){if((a=parseInt(a.getAttribute("colSpan"),10))&&1!=a)return a}),commit:function(a){var b=parseInt(this.getValue(),10);b&&1!=b?a.setAttribute("colSpan",this.getValue()):a.removeAttribute("colSpan")}},f,{type:"hbox",padding:0,widths:["60%","40%"],children:[{type:"text",id:"bgColor",label:c.bgColor,"default":"",setup:d(function(a){var b=a.getAttribute("bgColor"); +return a.getStyle("background-color")||b}),commit:function(a){this.getValue()?a.setStyle("background-color",this.getValue()):a.removeStyle("background-color");a.removeAttribute("bgColor")}},k?{type:"button",id:"bgColorChoose","class":"colorChooser",label:c.chooseColor,onLoad:function(){this.getElement().getParent().setStyle("vertical-align","bottom")},onClick:function(){g.getColorFromDialog(function(a){a&&this.getDialog().getContentElement("info","bgColor").setValue(a);this.focus()},this)}}:f]},f, +{type:"hbox",padding:0,widths:["60%","40%"],children:[{type:"text",id:"borderColor",label:c.borderColor,"default":"",setup:d(function(a){var b=a.getAttribute("borderColor");return a.getStyle("border-color")||b}),commit:function(a){this.getValue()?a.setStyle("border-color",this.getValue()):a.removeStyle("border-color");a.removeAttribute("borderColor")}},k?{type:"button",id:"borderColorChoose","class":"colorChooser",label:c.chooseColor,style:(m?"margin-right":"margin-left")+": 10px",onLoad:function(){this.getElement().getParent().setStyle("vertical-align", +"bottom")},onClick:function(){g.getColorFromDialog(function(a){a&&this.getDialog().getContentElement("info","borderColor").setValue(a);this.focus()},this)}}:f]}]}]}]}],onShow:function(){this.cells=CKEDITOR.plugins.tabletools.getSelectedCells(this._.editor.getSelection());this.setupContent(this.cells)},onOk:function(){for(var a=this._.editor.getSelection(),b=a.createBookmarks(),c=this.cells,d=0;d
    '),d='';a.image&&b&&(d+='');d+='");k.on("click",function(){p(a.html)});return k}function p(a){var b=CKEDITOR.dialog.getCurrent();b.getValueOf("selectTpl","chkInsertOpt")?(c.fire("saveSnapshot"),c.setData(a,function(){b.hide();var a=c.createRange();a.moveToElementEditStart(c.editable());a.select();setTimeout(function(){c.fire("saveSnapshot")},0)})):(c.insertHtml(a),b.hide())}function i(a){var b=a.data.getTarget(), +c=g.equals(b);if(c||g.contains(b)){var d=a.data.getKeystroke(),f=g.getElementsByTag("a"),e;if(f){if(c)e=f.getItem(0);else switch(d){case 40:e=b.getNext();break;case 38:e=b.getPrevious();break;case 13:case 32:b.fire("click")}e&&(e.focus(),a.data.preventDefault())}}}var h=CKEDITOR.plugins.get("templates");CKEDITOR.document.appendStyleSheet(CKEDITOR.getUrl(h.path+"dialogs/templates.css"));var g,h="cke_tpl_list_label_"+CKEDITOR.tools.getNextNumber(),f=c.lang.templates,l=c.config;return{title:c.lang.templates.title, +minWidth:CKEDITOR.env.ie?440:400,minHeight:340,contents:[{id:"selectTpl",label:f.title,elements:[{type:"vbox",padding:5,children:[{id:"selectTplText",type:"html",html:""+f.selectPromptMsg+""},{id:"templatesList",type:"html",focus:!0,html:'
    '+f.options+""},{id:"chkInsertOpt",type:"checkbox",label:f.insertOption, +"default":l.templates_replaceContent}]}]}],buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var a=this.getContentElement("selectTpl","templatesList");g=a.getElement();CKEDITOR.loadTemplates(l.templates_files,function(){var b=(l.templates||"default").split(",");if(b.length){var c=g;c.setHtml("");for(var d=0,h=b.length;d'+f.emptyListMsg+"")});this._.element.on("keydown",i)},onHide:function(){this._.element.removeListener("keydown",i)}}})})(); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/templates/templates/default.js b/static/assets/ckeditor/plugins/templates/templates/default.js new file mode 100644 index 0000000..0878290 --- /dev/null +++ b/static/assets/ckeditor/plugins/templates/templates/default.js @@ -0,0 +1,6 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.addTemplates("default",{imagesPath:CKEDITOR.getUrl(CKEDITOR.plugins.getPath("templates")+"templates/images/"),templates:[{title:"Image and Title",image:"template1.gif",description:"One main image with a title and text that surround the image.",html:'

    Type the title here

    Type the text here

    '},{title:"Strange Template",image:"template2.gif",description:"A template that defines two colums, each one with a title, and some text.", +html:'

    Title 1

    Title 2

    Text 1Text 2

    More text goes here.

    '},{title:"Text and Table",image:"template3.gif",description:"A title with some text and a table.",html:'

    Title goes here

    Table title
       
       
       

    Type the text here

    '}]}); \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/templates/templates/images/template1.gif b/static/assets/ckeditor/plugins/templates/templates/images/template1.gif new file mode 100644 index 0000000000000000000000000000000000000000..efdabbebd4503ceb55c948fa73b9b83cbd373e57 GIT binary patch literal 375 zcmV--0f_!bNk%w1VPpVC0FeLyva+%O00960{{R30A^8LV00000EC2ui0Av7000092 zgpaAq?GK}zwAu@W-n{z{hT=$;9b%^H%BpA!$8!13_AS@=&Xal%3~GMDB95pDD3{Ep z^T{;k4xj+g%7JRP+$IPq!1Bb&uKB$DQa@x|8x8NO4b`hO25#TOnRw~9=3yE0xyeE4CQ8$(2)Mz>8udZCXX=BRr7DZbW_#-a zYZEHlJM(KAEc4dditDMnJ4(CC+&uK06fIp0D*Z|wX5EYpGb{?;a*WKVoEoWp!Y!`y zeo4*}FFC(bZf@duda#%D-q zaHzPUxA@lRm;@PFNk%w1VPpVC0FeLyva+%O00960{{R30A^8LV00000EC2ui0Av7000092 zgpaAq?GK}zwAu@W-n{z{hT=$;9b%^H%BpA!$8!13_AS@=&Xal%3~GMDB93TG#*l%g z^9hYgr_`$T`us4l+^+W<)gC_JviY3#AeC&_xD98m<8-m1jvsB&<_@0q~XXRsCap^IRqK$(K#c!N9pBf82AawVH$?WN){q&IjedXiz+EX zOS+od%WDgp+d909toAG5`lTy-9D18rOxWx+T}>D*o&1Qa9n5V^96nACtqfi*?*05t zZSMX~zfpQ^<%jRPUfiDEO8=eEuB)DKv}S_cJW8uTxqL`=(AMXYB~Aenu4SM=e_ zrj6M`kqsZ_xrlC}y^5evW>krApudqWP2zFM5Fo{b%sA$2wGU)SI5vkKVQCad(WEn$ zGF`IFr&KONpB8ayRSwduHn4I{;q@zxs8h=VDkqjl*t8(;n#c+zd*_U=jy QeEa(S3plV~2n7HDJNoX*`2YX_ literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/widget/dev/assets/contents.css b/static/assets/ckeditor/plugins/widget/dev/assets/contents.css new file mode 100644 index 0000000..c2b51d3 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/dev/assets/contents.css @@ -0,0 +1,23 @@ +.mediumBorder { + border-width: 2px; +} +.thickBorder { + border-width: 5px; +} +img.thickBorder, img.mediumBorder { + border-style: solid; + border-color: #CCC; +} +.important.soMuch { + margin: 25px; + padding: 25px; + background: red; + border: none; +} + +span.redMarker { + background-color: red; +} +.invisible { + opacity: 0.1; +} \ No newline at end of file diff --git a/static/assets/ckeditor/plugins/widget/dev/assets/sample.jpg b/static/assets/ckeditor/plugins/widget/dev/assets/sample.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a4a77fae83b0f66e77a97f172b4f184e1edac8e7 GIT binary patch literal 17932 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 literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/widget/dev/assets/simplebox/plugin.js b/static/assets/ckeditor/plugins/widget/dev/assets/simplebox/plugin.js new file mode 100644 index 0000000..6b28e10 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/dev/assets/simplebox/plugin.js @@ -0,0 +1,114 @@ +'use strict'; + +// Register the plugin within the editor. +CKEDITOR.plugins.add( 'simplebox', { + // This plugin requires the Widgets System defined in the 'widget' plugin. + requires: 'widget', + + // Register the icon used for the toolbar button. It must be the same + // as the name of the widget. + icons: 'simplebox', + + // The plugin initialization logic goes inside this method. + init: function( editor ) { + // Register the editing dialog. + CKEDITOR.dialog.add( 'simplebox', this.path + 'dialogs/simplebox.js' ); + + // Register the simplebox widget. + editor.widgets.add( 'simplebox', { + // Allow all HTML elements, classes, and styles that this widget requires. + // Read more about the Advanced Content Filter here: + // * http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter + // * http://docs.ckeditor.com/#!/guide/plugin_sdk_integration_with_acf + allowedContent: + 'div(!simplebox,align-left,align-right,align-center){width};' + + 'div(!simplebox-content); h2(!simplebox-title)', + + // Minimum HTML which is required by this widget to work. + requiredContent: 'div(simplebox)', + + // Define two nested editable areas. + editables: { + title: { + // Define CSS selector used for finding the element inside widget element. + selector: '.simplebox-title', + // Define content allowed in this nested editable. Its content will be + // filtered accordingly and the toolbar will be adjusted when this editable + // is focused. + allowedContent: 'br strong em' + }, + content: { + selector: '.simplebox-content' + } + }, + + // Define the template of a new Simple Box widget. + // The template will be used when creating new instances of the Simple Box widget. + template: + '
    ' + + '

    Title

    ' + + '

    Content...

    ' + + '
    ', + + // Define the label for a widget toolbar button which will be automatically + // created by the Widgets System. This button will insert a new widget instance + // created from the template defined above, or will edit selected widget + // (see second part of this tutorial to learn about editing widgets). + // + // Note: In order to be able to translate your widget you should use the + // editor.lang.simplebox.* property. A string was used directly here to simplify this tutorial. + button: 'Create a simple box', + + // Set the widget dialog window name. This enables the automatic widget-dialog binding. + // This dialog window will be opened when creating a new widget or editing an existing one. + dialog: 'simplebox', + + // Check the elements that need to be converted to widgets. + // + // Note: The "element" argument is an instance of http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.element + // so it is not a real DOM element yet. This is caused by the fact that upcasting is performed + // during data processing which is done on DOM represented by JavaScript objects. + upcast: function( element ) { + // Return "true" (that element needs to converted to a Simple Box widget) + // for all
    elements with a "simplebox" class. + return element.name == 'div' && element.hasClass( 'simplebox' ); + }, + + // When a widget is being initialized, we need to read the data ("align" and "width") + // from DOM and set it by using the widget.setData() method. + // More code which needs to be executed when DOM is available may go here. + init: function() { + var width = this.element.getStyle( 'width' ); + if ( width ) + this.setData( 'width', width ); + + if ( this.element.hasClass( 'align-left' ) ) + this.setData( 'align', 'left' ); + if ( this.element.hasClass( 'align-right' ) ) + this.setData( 'align', 'right' ); + if ( this.element.hasClass( 'align-center' ) ) + this.setData( 'align', 'center' ); + }, + + // Listen on the widget#data event which is fired every time the widget data changes + // and updates the widget's view. + // Data may be changed by using the widget.setData() method, which we use in the + // Simple Box dialog window. + data: function() { + // Check whether "width" widget data is set and remove or set "width" CSS style. + // The style is set on widget main element (div.simplebox). + if ( !this.data.width ) + this.element.removeStyle( 'width' ); + else + this.element.setStyle( 'width', this.data.width ); + + // Brutally remove all align classes and set a new one if "align" widget data is set. + this.element.removeClass( 'align-left' ); + this.element.removeClass( 'align-right' ); + this.element.removeClass( 'align-center' ); + if ( this.data.align ) + this.element.addClass( 'align-' + this.data.align ); + } + } ); + } +} ); diff --git a/static/assets/ckeditor/plugins/widget/dev/console.js b/static/assets/ckeditor/plugins/widget/dev/console.js new file mode 100644 index 0000000..7bd4bd0 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/dev/console.js @@ -0,0 +1,131 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/* global CKCONSOLE */ + +'use strict'; + +( function() { + + CKCONSOLE.add( 'widget', { + panels: [ + { + type: 'box', + content: '
      ', + + refresh: function( editor ) { + var instances = obj2Array( editor.widgets.instances ); + + return { + header: 'Instances (' + instances.length + ')', + instances: generateInstancesList( instances ) + }; + }, + + refreshOn: function( editor, refresh ) { + editor.widgets.on( 'instanceCreated', function( evt ) { + refresh(); + + evt.data.on( 'data', refresh ); + } ); + + editor.widgets.on( 'instanceDestroyed', refresh ); + } + }, + + { + type: 'box', + content: + '
        ' + + '
      • focused:
      • ' + + '
      • selected:
      • ' + + '
      ', + + refresh: function( editor ) { + var focused = editor.widgets.focused, + selected = editor.widgets.selected, + selectedIds = []; + + for ( var i = 0; i < selected.length; ++i ) + selectedIds.push( selected[ i ].id ); + + return { + header: 'Focus & selection', + focused: focused ? 'id: ' + focused.id : '-', + selected: selectedIds.length ? 'id: ' + selectedIds.join( ', id: ' ) : '-' + }; + }, + + refreshOn: function( editor, refresh ) { + editor.on( 'selectionCheck', refresh, null, null, 999 ); + } + }, + + { + type: 'log', + + on: function( editor, log, logFn ) { + // Add all listeners with high priorities to log + // messages in the correct order when one event depends on another. + // E.g. selectionChange triggers widget selection - if this listener + // for selectionChange will be executed later than that one, then order + // will be incorrect. + + editor.on( 'selectionChange', function( evt ) { + var msg = 'selection change', + sel = evt.data.selection, + el = sel.getSelectedElement(), + widget; + + if ( el && ( widget = editor.widgets.getByElement( el, true ) ) ) + msg += ' (id: ' + widget.id + ')'; + + log( msg ); + }, null, null, 1 ); + + editor.widgets.on( 'instanceDestroyed', function( evt ) { + log( 'instance destroyed (id: ' + evt.data.id + ')' ); + }, null, null, 1 ); + + editor.widgets.on( 'instanceCreated', function( evt ) { + log( 'instance created (id: ' + evt.data.id + ')' ); + }, null, null, 1 ); + + editor.widgets.on( 'widgetFocused', function( evt ) { + log( 'widget focused (id: ' + evt.data.widget.id + ')' ); + }, null, null, 1 ); + + editor.widgets.on( 'widgetBlurred', function( evt ) { + log( 'widget blurred (id: ' + evt.data.widget.id + ')' ); + }, null, null, 1 ); + + editor.widgets.on( 'checkWidgets', logFn( 'checking widgets' ), null, null, 1 ); + editor.widgets.on( 'checkSelection', logFn( 'checking selection' ), null, null, 1 ); + } + } + ] + } ); + + function generateInstancesList( instances ) { + var html = '', + instance; + + for ( var i = 0; i < instances.length; ++i ) { + instance = instances[ i ]; + html += itemTpl.output( { id: instance.id, name: instance.name, data: JSON.stringify( instance.data ) } ); + } + return html; + } + + function obj2Array( obj ) { + var arr = []; + for ( var id in obj ) + arr.push( obj[ id ] ); + + return arr; + } + + var itemTpl = new CKEDITOR.template( '
    • id: {id}, name: {name}, data: {data}
    • ' ); +} )(); diff --git a/static/assets/ckeditor/plugins/widget/dev/nestedwidgets.html b/static/assets/ckeditor/plugins/widget/dev/nestedwidgets.html new file mode 100644 index 0000000..f7cb0cf --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/dev/nestedwidgets.html @@ -0,0 +1,135 @@ + + + + + + Nested widgets — CKEditor Sample + + + + + + + + + + +

      Nested widgets

      + +

      Classic (iframe-based) Sample

      + + +

      Inline Sample

      +
      +

      Simple Box Sample

      + +
      +

      Title

      +
      +

      Apollo 11 was the spaceflight that landed the first humans, Americans Neil Armstrong and Buzz Aldrin, on the Moon on [[July 20, 1969, at 20:18 UTC]]. Armstrong became the first to step onto the lunar surface 6 hours later on [[July 21 at 02:56 UTC]].

      + +
      + The Eagle +
      The Eagle in lunar orbit
      +
      + +
        +
      • Foo!
      • +
      • Bar!
      • +
      + +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur sit amet orci ut nisi adipiscing ultrices. Sed pellentesque iaculis malesuada. Pellentesque scelerisque, purus non porta dictum, neque urna bibendum dolor, eget tristique ipsum metus fringilla dolor. Nullam sed accumsan sapien. Vestibulum in placerat magna. Sed justo lacus, volutpat rhoncus odio luctus, ornare adipiscing mauris. Vivamus erat sem, egestas et lectus eget, varius cursus odio. Duis posuere lacus sit amet urna bibendum, id iaculis eros ultrices. Vestibulum a ultrices ante.

      +
      +
      + +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur sit amet orci ut nisi adipiscing ultrices. Sed pellentesque iaculis malesuada. Pellentesque scelerisque, purus non porta dictum, neque urna bibendum dolor, eget tristique ipsum metus fringilla dolor. Nullam sed accumsan sapien. Vestibulum in placerat magna. Sed justo lacus, volutpat rhoncus odio luctus, ornare adipiscing mauris. Vivamus erat sem, egestas et lectus eget, varius cursus odio. Duis posuere lacus sit amet urna bibendum, id iaculis eros ultrices. Vestibulum a ultrices ante.

      + +

      Pellentesque vitae eleifend nisl, non accumsan tellus. Maecenas nec libero non tellus tincidunt mollis porttitor sed arcu. Donec ultricies nulla vitae eros lacinia, vel congue sem auctor. Vivamus convallis, urna ac tincidunt malesuada, lectus erat convallis metus, a hendrerit massa augue accumsan magna. Nulla mattis tellus elit, nec congue magna scelerisque eget. Aliquam posuere nisi augue, posuere sodales nisi iaculis eu. Donec fermentum urna id nibh sagittis fermentum sit amet sed enim. Aliquam neque elit, pretium elementum nunc a, faucibus accumsan lorem. Etiam pulvinar odio et hendrerit tincidunt. Suspendisse tempus eros lacus, in convallis velit mollis ut. Aenean congue, justo eleifend ultricies malesuada, nunc nunc molestie mauris, eget placerat libero eros vel nisi. Quisque diam arcu, mollis ac laoreet vitae, varius et sem. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis in vehicula sapien. Nunc feugiat porta elit nec volutpat.

      + +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur sit amet orci ut nisi adipiscing ultrices. Sed pellentesque iaculis malesuada. Pellentesque scelerisque, purus non porta dictum, neque urna bibendum dolor, eget tristique ipsum metus fringilla dolor. Nullam sed accumsan sapien. Vestibulum in placerat magna. Sed justo lacus, volutpat rhoncus odio luctus, ornare adipiscing mauris. Vivamus erat sem, egestas et lectus eget, varius cursus odio. Duis posuere lacus sit amet urna bibendum, id iaculis eros ultrices. Vestibulum a ultrices ante.

      + +
      +

      Title

      +
      +

      The EagleApollo 11 was the spaceflight that landed the first humans, Americans Neil Armstrong and Buzz Aldrin, on the Moon on [[July 20, 1969, at 20:18 UTC]]. Armstrong became the first to step onto the lunar surface 6 hours later on [[July 21 at 02:56 UTC]].

      + +
        +
      • Foo!
      • +
      • Bar!
      • +
      +
      +
      + +

      Ut eget ipsum a sapien porta ultrices. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus mi lacus, pharetra eu bibendum blandit, tristique sit amet leo. Integer eu nulla nec magna vulputate blandit. Praesent mattis quis ante eget adipiscing. Nulla vel tempus risus, in placerat velit. Mauris sed nibh at elit posuere laoreet. Morbi non sapien sed nunc fringilla imperdiet.

      +
      + + + + diff --git a/static/assets/ckeditor/plugins/widget/dev/widgetstyles.html b/static/assets/ckeditor/plugins/widget/dev/widgetstyles.html new file mode 100644 index 0000000..9abfedd --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/dev/widgetstyles.html @@ -0,0 +1,145 @@ + + + + + + Applying styles to widgets — CKEditor Sample + + + + + + + +

      Applying styles to widgets

      + +

      Classic (iframe-based) Sample

      + + +

      Inline Sample

      +
      +

      Apollo 11

      + +
      + Saturn V +
      Roll out of Saturn V on launch pad
      +
      + +

      Apollo 11 was the spaceflight that landed the first humans, Americans Neil Armstrong and Buzz Aldrin, on the Moon on [[July 20, 1969, at 20:18 UTC]]. Armstrong became the first to step onto the lunar surface 6 hours later on [[July 21 at 02:56 UTC]].

      + +

      Armstrong spent about three and a half two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5 kg) of lunar material for return to Earth. A third member of the mission, Michael Collins, piloted the command spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.

      + +

      Broadcasting and quotes

      + +

      Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:

      + +
      +

      One small step for [a] man, one giant leap for mankind.

      +
      + +

      \( \left( \sum_{k=1}^n a_k b_k \right)^2 \leq \left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right) \)

      + +

      Apollo 11 effectively ended the Space Race and fulfilled a national goal proposed in 1961 by the late U.S. President John F. Kennedy in a speech before the United States Congress:

      + +
      +

      [...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.

      +
      + +
      + The Eagle +
      The Eagle in lunar orbit
      +
      + +

      Technical details

      + +

      Launched by a Saturn V rocket from Kennedy Space Center in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of NASA's Apollo program. The Apollo spacecraft had three parts:

      + +
        +
      1. Command Module with a cabin for the three astronauts which was the only part which landed back on Earth
      2. +
      3. Service Module which supported the Command Module with propulsion, electrical power, oxygen and water
      4. +
      5. Lunar Module for landing on the Moon.
      6. +
      + +

      After being sent to the Moon by the Saturn V's upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the Sea of Tranquility. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the Pacific Ocean on July 24.

      +
      + + + + diff --git a/static/assets/ckeditor/plugins/widget/images/handle.png b/static/assets/ckeditor/plugins/widget/images/handle.png new file mode 100644 index 0000000000000000000000000000000000000000..ba8cda5b30650babdd9e9b439bf92dd78e7e3425 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^{2Q&R(y%F4>B zs;Uq!kbwq_7Top+>f$X4@(X6LuyOG4sc+bE;L!1t|K@(+14@K=x;Tb#Tu;8Rb9cks z#J94nZHsw$wz2W7VVBS|FgP>!0K<|7o;WsvWX2Z8B?>%jY}0rZj)}3g-PxTm;lP0# v3__VH4l5d8H_c`?|H*MfZyGa?!EHvRt#Zd+?pApQG@rrK)z4*}Q$iB}(WFB8 literal 0 HcmV?d00001 diff --git a/static/assets/ckeditor/plugins/widget/lang/af.js b/static/assets/ckeditor/plugins/widget/lang/af.js new file mode 100644 index 0000000..a8a352c --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/af.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'af', { + 'move': 'Klik en trek on te beweeg' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/ar.js b/static/assets/ckeditor/plugins/widget/lang/ar.js new file mode 100644 index 0000000..c0315b2 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/ar.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'ar', { + 'move': 'Click and drag to move' // MISSING +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/ca.js b/static/assets/ckeditor/plugins/widget/lang/ca.js new file mode 100644 index 0000000..66415ee --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/ca.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'ca', { + 'move': 'Clicar i arrossegar per moure' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/cs.js b/static/assets/ckeditor/plugins/widget/lang/cs.js new file mode 100644 index 0000000..1a2f82a --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/cs.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'cs', { + 'move': 'Klepněte a táhněte pro přesunutí' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/cy.js b/static/assets/ckeditor/plugins/widget/lang/cy.js new file mode 100644 index 0000000..1863cb6 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/cy.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'cy', { + 'move': 'Clcio a llusgo i symud' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/da.js b/static/assets/ckeditor/plugins/widget/lang/da.js new file mode 100644 index 0000000..9a928c0 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/da.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'da', { + 'move': 'Klik og træk for at flytte' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/de.js b/static/assets/ckeditor/plugins/widget/lang/de.js new file mode 100644 index 0000000..3ca7e53 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/de.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'de', { + 'move': 'Zum verschieben anwählen und ziehen' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/el.js b/static/assets/ckeditor/plugins/widget/lang/el.js new file mode 100644 index 0000000..35acba4 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/el.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'el', { + 'move': 'Κάνετε κλικ και σύρετε το ποντίκι για να μετακινήστε' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/en-gb.js b/static/assets/ckeditor/plugins/widget/lang/en-gb.js new file mode 100644 index 0000000..363a547 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/en-gb.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'en-gb', { + 'move': 'Click and drag to move' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/en.js b/static/assets/ckeditor/plugins/widget/lang/en.js new file mode 100644 index 0000000..38e5a93 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/en.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'en', { + 'move': 'Click and drag to move' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/eo.js b/static/assets/ckeditor/plugins/widget/lang/eo.js new file mode 100644 index 0000000..a13e9ac --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/eo.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'eo', { + 'move': 'klaki kaj treni por movi' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/es.js b/static/assets/ckeditor/plugins/widget/lang/es.js new file mode 100644 index 0000000..8299f1d --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/es.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'es', { + 'move': 'Dar clic y arrastrar para mover' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/fa.js b/static/assets/ckeditor/plugins/widget/lang/fa.js new file mode 100644 index 0000000..2d315f3 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/fa.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'fa', { + 'move': 'کلیک و کشیدن برای جابجایی' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/fi.js b/static/assets/ckeditor/plugins/widget/lang/fi.js new file mode 100644 index 0000000..579c9f9 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/fi.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'fi', { + 'move': 'Siirrä klikkaamalla ja raahaamalla' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/fr.js b/static/assets/ckeditor/plugins/widget/lang/fr.js new file mode 100644 index 0000000..421a478 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/fr.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'fr', { + 'move': 'Cliquer et glisser pour déplacer' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/gl.js b/static/assets/ckeditor/plugins/widget/lang/gl.js new file mode 100644 index 0000000..470e96f --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/gl.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'gl', { + 'move': 'Prema e arrastre para mover' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/he.js b/static/assets/ckeditor/plugins/widget/lang/he.js new file mode 100644 index 0000000..f295eae --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/he.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'he', { + 'move': 'לחץ וגרור להזזה' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/hr.js b/static/assets/ckeditor/plugins/widget/lang/hr.js new file mode 100644 index 0000000..c6c322e --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/hr.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'hr', { + 'move': 'Klikni i povuci da pomakneš' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/hu.js b/static/assets/ckeditor/plugins/widget/lang/hu.js new file mode 100644 index 0000000..3b99f84 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/hu.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'hu', { + 'move': 'Kattints és húzd a mozgatáshoz' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/it.js b/static/assets/ckeditor/plugins/widget/lang/it.js new file mode 100644 index 0000000..72ca994 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/it.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'it', { + 'move': 'Fare clic e trascinare per spostare' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/ja.js b/static/assets/ckeditor/plugins/widget/lang/ja.js new file mode 100644 index 0000000..7a6e47a --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/ja.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'ja', { + 'move': 'ドラッグして移動' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/km.js b/static/assets/ckeditor/plugins/widget/lang/km.js new file mode 100644 index 0000000..a142362 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/km.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'km', { + 'move': 'ចុច​ហើយ​ទាញ​ដើម្បី​ផ្លាស់​ទី' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/ko.js b/static/assets/ckeditor/plugins/widget/lang/ko.js new file mode 100644 index 0000000..01d6c64 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/ko.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'ko', { + 'move': '움직이려면 클릭 후 드래그 하세요' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/ku.js b/static/assets/ckeditor/plugins/widget/lang/ku.js new file mode 100644 index 0000000..622e365 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/ku.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'ku', { + 'move': 'کرتەبکە و ڕایبکێشە بۆ جوڵاندن' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/nb.js b/static/assets/ckeditor/plugins/widget/lang/nb.js new file mode 100644 index 0000000..6bb5a37 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/nb.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'nb', { + 'move': 'Klikk og dra for å flytte' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/nl.js b/static/assets/ckeditor/plugins/widget/lang/nl.js new file mode 100644 index 0000000..cab2834 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/nl.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'nl', { + 'move': 'Klik en sleep om te verplaatsen' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/no.js b/static/assets/ckeditor/plugins/widget/lang/no.js new file mode 100644 index 0000000..dd2f957 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/no.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'no', { + 'move': 'Klikk og dra for å flytte' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/pl.js b/static/assets/ckeditor/plugins/widget/lang/pl.js new file mode 100644 index 0000000..9f3b834 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/pl.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'pl', { + 'move': 'Kliknij i przeciągnij, by przenieść.' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/pt-br.js b/static/assets/ckeditor/plugins/widget/lang/pt-br.js new file mode 100644 index 0000000..6b40cc9 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/pt-br.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'pt-br', { + 'move': 'Click e arraste para mover' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/pt.js b/static/assets/ckeditor/plugins/widget/lang/pt.js new file mode 100644 index 0000000..078d93f --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/pt.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'pt', { + 'move': 'Clique e arraste para mover' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/ru.js b/static/assets/ckeditor/plugins/widget/lang/ru.js new file mode 100644 index 0000000..205c5de --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/ru.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'ru', { + 'move': 'Нажмите и перетащите' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/sk.js b/static/assets/ckeditor/plugins/widget/lang/sk.js new file mode 100644 index 0000000..182d3a1 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/sk.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'sk', { + 'move': 'Kliknite a potiahnite pre presunutie' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/sl.js b/static/assets/ckeditor/plugins/widget/lang/sl.js new file mode 100644 index 0000000..b617e75 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/sl.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'sl', { + 'move': 'Kliknite in povlecite, da premaknete' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/sq.js b/static/assets/ckeditor/plugins/widget/lang/sq.js new file mode 100644 index 0000000..fdb4811 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/sq.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'sq', { + 'move': 'Kliko dhe tërhiqe për ta lëvizur' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/sv.js b/static/assets/ckeditor/plugins/widget/lang/sv.js new file mode 100644 index 0000000..da3572c --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/sv.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'sv', { + 'move': 'Klicka och drag för att flytta' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/tr.js b/static/assets/ckeditor/plugins/widget/lang/tr.js new file mode 100644 index 0000000..e061d61 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/tr.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'tr', { + 'move': 'Taşımak için, tıklayın ve sürükleyin' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/tt.js b/static/assets/ckeditor/plugins/widget/lang/tt.js new file mode 100644 index 0000000..5ffacb4 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/tt.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'tt', { + 'move': 'Күчереп куер өчен басып шудырыгыз' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/uk.js b/static/assets/ckeditor/plugins/widget/lang/uk.js new file mode 100644 index 0000000..c5047c0 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/uk.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'uk', { + 'move': 'Клікніть і потягніть для переміщення' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/vi.js b/static/assets/ckeditor/plugins/widget/lang/vi.js new file mode 100644 index 0000000..39bcb22 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/vi.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'vi', { + 'move': 'Nhấp chuột và kéo để di chuyển' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/zh-cn.js b/static/assets/ckeditor/plugins/widget/lang/zh-cn.js new file mode 100644 index 0000000..94ef945 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/zh-cn.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'zh-cn', { + 'move': '点击并拖拽以移动' +} ); diff --git a/static/assets/ckeditor/plugins/widget/lang/zh.js b/static/assets/ckeditor/plugins/widget/lang/zh.js new file mode 100644 index 0000000..8bd75d5 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/lang/zh.js @@ -0,0 +1,7 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ +CKEDITOR.plugins.setLang( 'widget', 'zh', { + 'move': '拖曳以移動' +} ); diff --git a/static/assets/ckeditor/plugins/widget/plugin.js b/static/assets/ckeditor/plugins/widget/plugin.js new file mode 100644 index 0000000..a80ec51 --- /dev/null +++ b/static/assets/ckeditor/plugins/widget/plugin.js @@ -0,0 +1,3744 @@ +/** + * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +/** + * @fileOverview [Widget](http://ckeditor.com/addon/widget) plugin. + */ + +'use strict'; + +( function() { + + var DRAG_HANDLER_SIZE = 15; + + CKEDITOR.plugins.add( 'widget', { + // jscs:disable maximumLineLength + lang: 'af,ar,ca,cs,cy,da,de,el,en,en-gb,eo,es,fa,fi,fr,gl,he,hr,hu,it,ja,km,ko,ku,nb,nl,no,pl,pt,pt-br,ru,sk,sl,sq,sv,tr,tt,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% + // jscs:enable maximumLineLength + requires: 'lineutils,clipboard', + onLoad: function() { + CKEDITOR.addCss( + '.cke_widget_wrapper{' + + 'position:relative;' + + 'outline:none' + + '}' + + '.cke_widget_inline{' + + 'display:inline-block' + + '}' + + '.cke_widget_wrapper:hover>.cke_widget_element{' + + 'outline:2px solid yellow;' + + 'cursor:default' + + '}' + + '.cke_widget_wrapper:hover .cke_widget_editable{' + + 'outline:2px solid yellow' + + '}' + + '.cke_widget_wrapper.cke_widget_focused>.cke_widget_element,' + + // We need higher specificity than hover style. + '.cke_widget_wrapper .cke_widget_editable.cke_widget_editable_focused{' + + 'outline:2px solid #ace' + + '}' + + '.cke_widget_editable{' + + 'cursor:text' + + '}' + + '.cke_widget_drag_handler_container{' + + 'position:absolute;' + + 'width:' + DRAG_HANDLER_SIZE + 'px;' + + 'height:0;' + + // Initially drag handler should not be visible, until its position will be + // repositioned. #11177 + 'left:-9999px;' + + 'opacity:0.75;' + + 'transition:height 0s 0.2s;' + // Delay hiding drag handler. + // Prevent drag handler from being misplaced (#11198). + 'line-height:0' + + '}' + + '.cke_widget_wrapper:hover>.cke_widget_drag_handler_container{' + + 'height:' + DRAG_HANDLER_SIZE + 'px;' + + 'transition:none' + + '}' + + '.cke_widget_drag_handler_container:hover{' + + 'opacity:1' + + '}' + + 'img.cke_widget_drag_handler{' + + 'cursor:move;' + + 'width:' + DRAG_HANDLER_SIZE + 'px;' + + 'height:' + DRAG_HANDLER_SIZE + 'px;' + + 'display:inline-block' + + '}' + + '.cke_widget_mask{' + + 'position:absolute;' + + 'top:0;' + + 'left:0;' + + 'width:100%;' + + 'height:100%;' + + 'display:block' + + '}' + + '.cke_editable.cke_widget_dragging, .cke_editable.cke_widget_dragging *{' + + 'cursor:move !important' + + '}' + ); + }, + + beforeInit: function( editor ) { + /** + * An instance of widget repository. It contains all + * {@link CKEDITOR.plugins.widget.repository#registered registered widget definitions} and + * {@link CKEDITOR.plugins.widget.repository#instances initialized instances}. + * + * editor.widgets.add( 'someName', { + * // Widget definition... + * } ); + * + * editor.widgets.registered.someName; // -> Widget definition + * + * @since 4.3 + * @readonly + * @property {CKEDITOR.plugins.widget.repository} widgets + * @member CKEDITOR.editor + */ + editor.widgets = new Repository( editor ); + }, + + afterInit: function( editor ) { + addWidgetButtons( editor ); + setupContextMenu( editor ); + } + } ); + + /** + * Widget repository. It keeps track of all {@link #registered registered widget definitions} and + * {@link #instances initialized instances}. An instance of the repository is available under + * the {@link CKEDITOR.editor#widgets} property. + * + * @class CKEDITOR.plugins.widget.repository + * @mixins CKEDITOR.event + * @constructor Creates a widget repository instance. Note that the widget plugin automatically + * creates a repository instance which is available under the {@link CKEDITOR.editor#widgets} property. + * @param {CKEDITOR.editor} editor The editor instance for which the repository will be created. + */ + function Repository( editor ) { + /** + * The editor instance for which this repository was created. + * + * @readonly + * @property {CKEDITOR.editor} editor + */ + this.editor = editor; + + /** + * A hash of registered widget definitions (definition name => {@link CKEDITOR.plugins.widget.definition}). + * + * To register a definition use the {@link #add} method. + * + * @readonly + */ + this.registered = {}; + + /** + * An object containing initialized widget instances (widget id => {@link CKEDITOR.plugins.widget}). + * + * @readonly + */ + this.instances = {}; + + /** + * An array of selected widget instances. + * + * @readonly + * @property {CKEDITOR.plugins.widget[]} selected + */ + this.selected = []; + + /** + * The focused widget instance. See also {@link CKEDITOR.plugins.widget#event-focus} + * and {@link CKEDITOR.plugins.widget#event-blur} events. + * + * editor.on( 'selectionChange', function() { + * if ( editor.widgets.focused ) { + * // Do something when a widget is focused... + * } + * } ); + * + * @readonly + * @property {CKEDITOR.plugins.widget} focused + */ + this.focused = null; + + /** + * The widget instance that contains the nested editable which is currently focused. + * + * @readonly + * @property {CKEDITOR.plugins.widget} widgetHoldingFocusedEditable + */ + this.widgetHoldingFocusedEditable = null; + + this._ = { + nextId: 0, + upcasts: [], + upcastCallbacks: [], + filters: {} + }; + + setupWidgetsLifecycle( this ); + setupSelectionObserver( this ); + setupMouseObserver( this ); + setupKeyboardObserver( this ); + setupDragAndDrop( this ); + setupNativeCutAndCopy( this ); + } + + Repository.prototype = { + /** + * Minimum interval between selection checks. + * + * @private + */ + MIN_SELECTION_CHECK_INTERVAL: 500, + + /** + * Adds a widget definition to the repository. Fires the {@link CKEDITOR.editor#widgetDefinition} event + * which allows to modify the widget definition which is going to be registered. + * + * @param {String} name The name of the widget definition. + * @param {CKEDITOR.plugins.widget.definition} widgetDef Widget definition. + * @returns {CKEDITOR.plugins.widget.definition} + */ + add: function( name, widgetDef ) { + // Create prototyped copy of original widget definition, so we won't modify it. + widgetDef = CKEDITOR.tools.prototypedCopy( widgetDef ); + widgetDef.name = name; + + widgetDef._ = widgetDef._ || {}; + + this.editor.fire( 'widgetDefinition', widgetDef ); + + if ( widgetDef.template ) + widgetDef.template = new CKEDITOR.template( widgetDef.template ); + + addWidgetCommand( this.editor, widgetDef ); + addWidgetProcessors( this, widgetDef ); + + this.registered[ name ] = widgetDef; + + return widgetDef; + }, + + /** + * Adds a callback for element upcasting. Each callback will be executed + * for every element which is later tested by upcast methods. If a callback + * returns `false`, the element will not be upcasted. + * + * // Images with the "banner" class will not be upcasted (e.g. to the image widget). + * editor.widgets.addUpcastCallback( function( element ) { + * if ( element.name == 'img' && element.hasClass( 'banner' ) ) + * return false; + * } ); + * + * @param {Function} callback + * @param {CKEDITOR.htmlParser.element} callback.element + */ + addUpcastCallback: function( callback ) { + this._.upcastCallbacks.push( callback ); + }, + + /** + * Checks the selection to update widget states (selection and focus). + * + * This method is triggered by the {@link #event-checkSelection} event. + */ + checkSelection: function() { + var sel = this.editor.getSelection(), + selectedElement = sel.getSelectedElement(), + updater = stateUpdater( this ), + widget; + + // Widget is focused so commit and finish checking. + if ( selectedElement && ( widget = this.getByElement( selectedElement, true ) ) ) + return updater.focus( widget ).select( widget ).commit(); + + var range = sel.getRanges()[ 0 ]; + + // No ranges or collapsed range mean that nothing is selected, so commit and finish checking. + if ( !range || range.collapsed ) + return updater.commit(); + + // Range is not empty, so create walker checking for wrappers. + var walker = new CKEDITOR.dom.walker( range ), + wrapper; + + walker.evaluator = isDomWidgetWrapper; + + while ( ( wrapper = walker.next() ) ) + updater.select( this.getByElement( wrapper ) ); + + updater.commit(); + }, + + /** + * Checks if all widget instances are still present in the DOM. + * Destroys those instances that are not present. + * Reinitializes widgets on widget wrappers for which widget instances + * cannot be found. + * + * This method triggers the {@link #event-checkWidgets} event whose listeners + * can cancel the method's execution or modify its options. + * + * @param [options] The options object. + * @param {Boolean} [options.initOnlyNew] Initializes widgets only on newly wrapped + * widget elements (those which still have the `cke_widget_new` class). When this option is + * set to `true`, widgets which were invalidated (e.g. by replacing with a cloned DOM structure) + * will not be reinitialized. This makes the check faster. + * @param {Boolean} [options.focusInited] If only one widget is initialized by + * the method, it will be focused. + */ + checkWidgets: function( options ) { + this.fire( 'checkWidgets', CKEDITOR.tools.copy( options || {} ) ); + }, + + /** + * Removes the widget from the editor and moves the selection to the closest + * editable position if the widget was focused before. + * + * @param {CKEDITOR.plugins.widget} widget The widget instance to be deleted. + */ + del: function( widget ) { + if ( this.focused === widget ) { + var editor = widget.editor, + range = editor.createRange(), + found; + + // If haven't found place for caret on the default side, + // try to find it on the other side. + if ( !( found = range.moveToClosestEditablePosition( widget.wrapper, true ) ) ) + found = range.moveToClosestEditablePosition( widget.wrapper, false ); + + if ( found ) + editor.getSelection().selectRanges( [ range ] ); + } + + widget.wrapper.remove(); + this.destroy( widget, true ); + }, + + /** + * Destroys the widget instance. + * + * @param {CKEDITOR.plugins.widget} widget The widget instance to be destroyed. + * @param {Boolean} [offline] Whether the widget is offline (detached from the DOM tree) — + * in this case the DOM (attributes, classes, etc.) will not be cleaned up. + */ + destroy: function( widget, offline ) { + if ( this.widgetHoldingFocusedEditable === widget ) + setFocusedEditable( this, widget, null, offline ); + + widget.destroy( offline ); + delete this.instances[ widget.id ]; + this.fire( 'instanceDestroyed', widget ); + }, + + /** + * Destroys all widget instances. + * + * @param {Boolean} [offline] Whether the widgets are offline (detached from the DOM tree) — + * in this case the DOM (attributes, classes, etc.) will not be cleaned up. + */ + destroyAll: function( offline ) { + var instances = this.instances, + widget; + + for ( var id in instances ) { + widget = instances[ id ]; + this.destroy( widget, offline ); + } + }, + + /** + * Finalizes a process of widget creation. This includes: + * + * * inserting widget element into editor, + * * marking widget instance as ready (see {@link CKEDITOR.plugins.widget#event-ready}), + * * focusing widget instance. + * + * This method is used by the default widget's command and is called + * after widget's dialog (if set) is closed. It may also be used in a + * customized process of widget creation and insertion. + * + * widget.once( 'edit', function() { + * // Finalize creation only of not ready widgets. + * if ( widget.isReady() ) + * return; + * + * // Cancel edit event to prevent automatic widget insertion. + * evt.cancel(); + * + * CustomDialog.open( widget.data, function saveCallback( savedData ) { + * // Cache the container, because widget may be destroyed while saving data, + * // if this process will require some deep transformations. + * var container = widget.wrapper.getParent(); + * + * widget.setData( savedData ); + * + * // Widget will be retrieved from container and inserted into editor. + * editor.widgets.finalizeCreation( container ); + * } ); + * } ); + * + * @param {CKEDITOR.dom.element/CKEDITOR.dom.documentFragment} container The element + * or document fragment which contains widget wrapper. The container is used, so before + * finalizing creation the widget can be freely transformed (even destroyed and reinitialized). + */ + finalizeCreation: function( container ) { + var wrapper = container.getFirst(); + if ( wrapper && isDomWidgetWrapper( wrapper ) ) { + this.editor.insertElement( wrapper ); + + var widget = this.getByElement( wrapper ); + // Fire postponed #ready event. + widget.ready = true; + widget.fire( 'ready' ); + widget.focus(); + } + }, + + /** + * Finds a widget instance which contains a given element. The element will be the {@link CKEDITOR.plugins.widget#wrapper wrapper} + * of the returned widget or a descendant of this {@link CKEDITOR.plugins.widget#wrapper wrapper}. + * + * editor.widgets.getByElement( someWidget.wrapper ); // -> someWidget + * editor.widgets.getByElement( someWidget.parts.caption ); // -> someWidget + * + * // Check wrapper only: + * editor.widgets.getByElement( someWidget.wrapper, true ); // -> someWidget + * editor.widgets.getByElement( someWidget.parts.caption, true ); // -> null + * + * @param {CKEDITOR.dom.element} element The element to be checked. + * @param {Boolean} [checkWrapperOnly] If set to `true`, the method will not check wrappers' descendants. + * @returns {CKEDITOR.plugins.widget} The widget instance or `null`. + */ + getByElement: ( function() { + var validWrapperElements = { div: 1, span: 1 }; + function getWidgetId( element ) { + return element.is( validWrapperElements ) && element.data( 'cke-widget-id' ); + } + + return function( element, checkWrapperOnly ) { + if ( !element ) + return null; + + var id = getWidgetId( element ); + + // There's no need to check element parents if element is a wrapper. + if ( !checkWrapperOnly && !id ) { + var limit = this.editor.editable(); + + // Try to find a closest ascendant which is a widget wrapper. + do { + element = element.getParent(); + } while ( element && !element.equals( limit ) && !( id = getWidgetId( element ) ) ); + } + + return this.instances[ id ] || null; + }; + } )(), + + /** + * Initializes a widget on a given element if the widget has not been initialized on it yet. + * + * @param {CKEDITOR.dom.element} element The future widget element. + * @param {String/CKEDITOR.plugins.widget.definition} [widgetDef] Name of a widget or a widget definition. + * The widget definition should be previously registered by using the + * {@link CKEDITOR.plugins.widget.repository#add} method. + * @param [startupData] Widget startup data (has precedence over default one). + * @returns {CKEDITOR.plugins.widget} The widget instance or `null` if a widget could not be initialized on + * a given element. + */ + initOn: function( element, widgetDef, startupData ) { + if ( !widgetDef ) + widgetDef = this.registered[ element.data( 'widget' ) ]; + else if ( typeof widgetDef == 'string' ) + widgetDef = this.registered[ widgetDef ]; + + if ( !widgetDef ) + return null; + + // Wrap element if still wasn't wrapped (was added during runtime by method that skips dataProcessor). + var wrapper = this.wrapElement( element, widgetDef.name ); + + if ( wrapper ) { + // Check if widget wrapper is new (widget hasn't been initialized on it yet). + // This class will be removed by widget constructor to avoid locking snapshot twice. + if ( wrapper.hasClass( 'cke_widget_new' ) ) { + var widget = new Widget( this, this._.nextId++, element, widgetDef, startupData ); + + // Widget could be destroyed when initializing it. + if ( widget.isInited() ) { + this.instances[ widget.id ] = widget; + + return widget; + } else { + return null; + } + } + + // Widget already has been initialized, so try to get widget by element. + // Note - it may happen that other instance will returned than the one created above, + // if for example widget was destroyed and reinitialized. + return this.getByElement( element ); + } + + // No wrapper means that there's no widget for this element. + return null; + }, + + /** + * Initializes widgets on all elements which were wrapped by {@link #wrapElement} and + * have not been initialized yet. + * + * @param {CKEDITOR.dom.element} [container=editor.editable()] The container which will be checked for not + * initialized widgets. Defaults to editor's {@link CKEDITOR.editor#editable editable} element. + * @returns {CKEDITOR.plugins.widget[]} Array of widget instances which have been initialized. + * Note: Only first-level widgets are returned — without nested widgets. + */ + initOnAll: function( container ) { + var newWidgets = ( container || this.editor.editable() ).find( '.cke_widget_new' ), + newInstances = [], + instance; + + for ( var i = newWidgets.count(); i--; ) { + instance = this.initOn( newWidgets.getItem( i ).getFirst( isDomWidgetElement ) ); + if ( instance ) + newInstances.push( instance ); + } + + return newInstances; + }, + + /** + * Parses element classes string and returns an object + * whose keys contain class names. Skips all `cke_*` classes. + * + * This method is used by the {@link CKEDITOR.plugins.widget#getClasses} method and + * may be used when overriding that method. + * + * @since 4.4 + * @param {String} classes String (value of `class` attribute). + * @returns {Object} Object containing classes or `null` if no classes found. + */ + parseElementClasses: function( classes ) { + if ( !classes ) + return null; + + classes = CKEDITOR.tools.trim( classes ).split( /\s+/ ); + + var cl, + obj = {}, + hasClasses = 0; + + while ( ( cl = classes.pop() ) ) { + if ( cl.indexOf( 'cke_' ) == -1 ) + obj[ cl ] = hasClasses = 1; + } + + return hasClasses ? obj : null; + }, + + /** + * Wraps an element with a widget's non-editable container. + * + * If this method is called on an {@link CKEDITOR.htmlParser.element}, then it will + * also take care of fixing the DOM after wrapping (the wrapper may not be allowed in element's parent). + * + * @param {CKEDITOR.dom.element/CKEDITOR.htmlParser.element} element The widget element to be wrapped. + * @param {String} [widgetName] The name of the widget definition. Defaults to element's `data-widget` + * attribute value. + * @returns {CKEDITOR.dom.element/CKEDITOR.htmlParser.element} The wrapper element or `null` if + * the widget definition of this name is not registered. + */ + wrapElement: function( element, widgetName ) { + var wrapper = null, + widgetDef, + isInline; + + if ( element instanceof CKEDITOR.dom.element ) { + widgetDef = this.registered[ widgetName || element.data( 'widget' ) ]; + if ( !widgetDef ) + return null; + + // Do not wrap already wrapped element. + wrapper = element.getParent(); + if ( wrapper && wrapper.type == CKEDITOR.NODE_ELEMENT && wrapper.data( 'cke-widget-wrapper' ) ) + return wrapper; + + // If attribute isn't already set (e.g. for pasted widget), set it. + if ( !element.hasAttribute( 'data-cke-widget-keep-attr' ) ) + element.data( 'cke-widget-keep-attr', element.data( 'widget' ) ? 1 : 0 ); + if ( widgetName ) + element.data( 'widget', widgetName ); + + isInline = isWidgetInline( widgetDef, element.getName() ); + + wrapper = new CKEDITOR.dom.element( isInline ? 'span' : 'div' ); + wrapper.setAttributes( getWrapperAttributes( isInline ) ); + + wrapper.data( 'cke-display-name', widgetDef.pathName ? widgetDef.pathName : element.getName() ); + + // Replace element unless it is a detached one. + if ( element.getParent( true ) ) + wrapper.replace( element ); + element.appendTo( wrapper ); + } + else if ( element instanceof CKEDITOR.htmlParser.element ) { + widgetDef = this.registered[ widgetName || element.attributes[ 'data-widget' ] ]; + if ( !widgetDef ) + return null; + + wrapper = element.parent; + if ( wrapper && wrapper.type == CKEDITOR.NODE_ELEMENT && wrapper.attributes[ 'data-cke-widget-wrapper' ] ) + return wrapper; + + // If attribute isn't already set (e.g. for pasted widget), set it. + if ( !( 'data-cke-widget-keep-attr' in element.attributes ) ) + element.attributes[ 'data-cke-widget-keep-attr' ] = element.attributes[ 'data-widget' ] ? 1 : 0; + if ( widgetName ) + element.attributes[ 'data-widget' ] = widgetName; + + isInline = isWidgetInline( widgetDef, element.name ); + + wrapper = new CKEDITOR.htmlParser.element( isInline ? 'span' : 'div', getWrapperAttributes( isInline ) ); + + wrapper.attributes[ 'data-cke-display-name' ] = widgetDef.pathName ? widgetDef.pathName : element.name; + + var parent = element.parent, + index; + + // Don't detach already detached element. + if ( parent ) { + index = element.getIndex(); + element.remove(); + } + + wrapper.add( element ); + + // Insert wrapper fixing DOM (splitting parents if wrapper is not allowed inside them). + parent && insertElement( parent, index, wrapper ); + } + + return wrapper; + }, + + // Expose for tests. + _tests_getNestedEditable: getNestedEditable, + _tests_createEditableFilter: createEditableFilter + }; + + CKEDITOR.event.implementOn( Repository.prototype ); + + /** + * An event fired when a widget instance is created, but before it is fully initialized. + * + * @event instanceCreated + * @param {CKEDITOR.plugins.widget} data The widget instance. + */ + + /** + * An event fired when a widget instance was destroyed. + * + * See also {@link CKEDITOR.plugins.widget#event-destroy}. + * + * @event instanceDestroyed + * @param {CKEDITOR.plugins.widget} data The widget instance. + */ + + /** + * An event fired to trigger the selection check. + * + * See the {@link #method-checkSelection} method. + * + * @event checkSelection + */ + + /** + * An event fired by the the {@link #method-checkWidgets} method. + * + * It can be canceled in order to stop the {@link #method-checkWidgets} + * method execution or the event listener can modify the method's options. + * + * @event checkWidgets + * @param [data] + * @param {Boolean} [data.initOnlyNew] Initialize widgets only on newly wrapped + * widget elements (those which still have the `cke_widget_new` class). When this option is + * set to `true`, widgets which were invalidated (e.g. by replacing with a cloned DOM structure) + * will not be reinitialized. This makes the check faster. + * @param {Boolean} [data.focusInited] If only one widget is initialized by + * the method, it will be focused. + */ + + + /** + * An instance of a widget. Together with {@link CKEDITOR.plugins.widget.repository} these + * two classes constitute the core of the Widget System. + * + * Note that neither the repository nor the widget instances can be created by using their constructors. + * A repository instance is automatically set up by the Widget plugin and is accessible under + * {@link CKEDITOR.editor#widgets}, while widget instances are created and destroyed by the repository. + * + * To create a widget, first you need to {@link CKEDITOR.plugins.widget.repository#add register} its + * {@link CKEDITOR.plugins.widget.definition definition}: + * + * editor.widgets.add( 'simplebox', { + * upcast: function( element ) { + * // Defines which elements will become widgets. + * if ( element.hasClass( 'simplebox' ) ) + * return true; + * }, + * init: function() { + * // ... + * } + * } ); + * + * Once the widget definition is registered, widgets will be automatically + * created when loading data: + * + * editor.setData( '
      foo
      ', function() { + * console.log( editor.widgets.instances ); // -> An object containing one instance. + * } ); + * + * It is also possible to create instances during runtime by using a command + * (if a {@link CKEDITOR.plugins.widget.definition#template} property was defined): + * + * // You can execute an automatically defined command to + * // insert a new simplebox widget or edit the one currently focused. + * editor.execCommand( 'simplebox' ); + * + * Or in a completely custom way: + * + * var element = editor.createElement( 'div' ); + * editor.insertElement( element ); + * var widget = editor.widgets.initOn( element, 'simplebox' ); + * + * @since 4.3 + * @class CKEDITOR.plugins.widget + * @mixins CKEDITOR.event + * @extends CKEDITOR.plugins.widget.definition + * @constructor Creates an instance of the widget class. Do not use it directly, but instead initialize widgets + * by using the {@link CKEDITOR.plugins.widget.repository#initOn} method or by the upcasting system. + * @param {CKEDITOR.plugins.widget.repository} widgetsRepo + * @param {Number} id Unique ID of this widget instance. + * @param {CKEDITOR.dom.element} element The widget element. + * @param {CKEDITOR.plugins.widget.definition} widgetDef Widget's registered definition. + * @param [startupData] Initial widget data. This data object will overwrite the default data and + * the data loaded from the DOM. + */ + function Widget( widgetsRepo, id, element, widgetDef, startupData ) { + var editor = widgetsRepo.editor; + + // Extend this widget with widgetDef-specific methods and properties. + CKEDITOR.tools.extend( this, widgetDef, { + /** + * The editor instance. + * + * @readonly + * @property {CKEDITOR.editor} + */ + editor: editor, + + /** + * This widget's unique (per editor instance) ID. + * + * @readonly + * @property {Number} + */ + id: id, + + /** + * Whether this widget is an inline widget (based on an inline element unless + * forced otherwise by {@link CKEDITOR.plugins.widget.definition#inline}). + * + * **Note:** This option does not allow to turn a block element into an inline widget. + * However, it makes it possible to turn an inline element into a block widget or to + * force a correct type in case when automatic recognition fails. + * + * @readonly + * @property {Boolean} + */ + inline: element.getParent().getName() == 'span', + + /** + * The widget element — the element on which the widget was initialized. + * + * @readonly + * @property {CKEDITOR.dom.element} element + */ + element: element, + + /** + * Widget's data object. + * + * The data can only be set by using the {@link #setData} method. + * Changes made to the data fire the {@link #event-data} event. + * + * @readonly + */ + data: CKEDITOR.tools.extend( {}, typeof widgetDef.defaults == 'function' ? widgetDef.defaults() : widgetDef.defaults ), + + /** + * Indicates if a widget is data-ready. Set to `true` when data from all sources + * ({@link CKEDITOR.plugins.widget.definition#defaults}, set in the + * {@link #init} method, loaded from the widget's element and startup data coming from the constructor) + * are finally loaded. This is immediately followed by the first {@link #event-data}. + * + * @readonly + */ + dataReady: false, + + /** + * Whether a widget instance was initialized. This means that: + * + * * An instance was created, + * * Its properties were set, + * * The `init` method was executed. + * + * **Note**: The first {@link #event-data} event could not be fired yet which + * means that the widget's DOM has not been set up yet. Wait for the {@link #event-ready} + * event to be notified when a widget is fully initialized and ready. + * + * **Note**: Use the {@link #isInited} method to check whether a widget is initialized and + * has not been destroyed. + * + * @readonly + */ + inited: false, + + /** + * Whether a widget instance is ready. This means that the widget is {@link #inited} and + * that its DOM was finally set up. + * + * **Note:** Use the {@link #isReady} method to check whether a widget is ready and + * has not been destroyed. + * + * @readonly + */ + ready: false, + + // Revert what widgetDef could override (automatic #edit listener). + edit: Widget.prototype.edit, + + /** + * The nested editable element which is currently focused. + * + * @readonly + * @property {CKEDITOR.plugins.widget.nestedEditable} + */ + focusedEditable: null, + + /** + * The widget definition from which this instance was created. + * + * @readonly + * @property {CKEDITOR.plugins.widget.definition} definition + */ + definition: widgetDef, + + /** + * Link to the widget repository which created this instance. + * + * @readonly + * @property {CKEDITOR.plugins.widget.repository} repository + */ + repository: widgetsRepo, + + draggable: widgetDef.draggable !== false, + + // WAAARNING: Overwrite widgetDef's priv object, because otherwise violent unicorn's gonna visit you. + _: { + downcastFn: ( widgetDef.downcast && typeof widgetDef.downcast == 'string' ) ? + widgetDef.downcasts[ widgetDef.downcast ] : widgetDef.downcast + } + }, true ); + + /** + * An object of widget component elements. + * + * For every `partName => selector` pair in {@link CKEDITOR.plugins.widget.definition#parts}, + * one `partName => element` pair is added to this object during the widget initialization. + * + * @readonly + * @property {Object} parts + */ + + /** + * The template which will be used to create a new widget element (when the widget's command is executed). + * It will be populated with {@link #defaults default values}. + * + * @readonly + * @property {CKEDITOR.template} template + */ + + /** + * The widget wrapper — a non-editable `div` or `span` element (depending on {@link #inline}) + * which is a parent of the {@link #element} and widget compontents like the drag handler and the {@link #mask}. + * It is the outermost widget element. + * + * @readonly + * @property {CKEDITOR.dom.element} wrapper + */ + + widgetsRepo.fire( 'instanceCreated', this ); + + setupWidget( this, widgetDef ); + + this.init && this.init(); + + // Finally mark widget as inited. + this.inited = true; + + setupWidgetData( this, startupData ); + + // If at some point (e.g. in #data listener) widget hasn't been destroyed + // and widget is already attached to document then fire #ready. + if ( this.isInited() && editor.editable().contains( this.wrapper ) ) { + this.ready = true; + this.fire( 'ready' ); + } + } + + Widget.prototype = { + /** + * Adds a class to the widget element. This method is used by + * the {@link #applyStyle} method and should be overriden by widgets + * which should handle classes differently (e.g. add them to other elements). + * + * **Note**: This method should not be used directly. Use the {@link #setData} method to + * set the `classes` property. Read more in the {@link #setData} documentation. + * + * See also: {@link #removeClass}, {@link #hasClass}, {@link #getClasses}. + * + * @since 4.4 + * @param {String} className The class name to be added. + */ + addClass: function( className ) { + this.element.addClass( className ); + }, + + /** + * Applies the specified style to the widget. It is highly recommended to use the + * {@link CKEDITOR.editor#applyStyle} or {@link CKEDITOR.style#apply} methods instead of + * using this method directly, because unlike editor's and style's methods, this one + * does not perform any checks. + * + * By default this method handles only classes defined in the style. It clones existing + * classes which are stored in the {@link #property-data widget data}'s `classes` property, + * adds new classes, and calls the {@link #setData} method if at least one new class was added. + * Then, using the {@link #event-data} event listener widget applies modifications passing + * new classes to the {@link #addClass} method. + * + * If you need to handle classes differently than in the default way, you can override the + * {@link #addClass} and related methods. You can also handle other style properties than `classes` + * by overriding this method. + * + * See also: {@link #checkStyleActive}, {@link #removeStyle}. + * + * @since 4.4 + * @param {CKEDITOR.style} style The custom widget style to be applied. + */ + applyStyle: function( style ) { + applyRemoveStyle( this, style, 1 ); + }, + + /** + * Checks if the specified style is applied to this widget. It is highly recommended to use the + * {@link CKEDITOR.style#checkActive} method instead of using this method directly, + * because unlike style's method, this one does not perform any checks. + * + * By default this method handles only classes defined in the style and passes + * them to the {@link #hasClass} method. You can override these methods to handle classes + * differently or to handle more of the style properties. + * + * See also: {@link #applyStyle}, {@link #removeStyle}. + * + * @since 4.4 + * @param {CKEDITOR.style} style The custom widget style to be checked. + * @returns {Boolean} Whether the style is applied to this widget. + */ + checkStyleActive: function( style ) { + var classes = getStyleClasses( style ), + cl; + + if ( !classes ) + return false; + + while ( ( cl = classes.pop() ) ) { + if ( !this.hasClass( cl ) ) + return false; + } + return true; + }, + + /** + * Destroys this widget instance. + * + * Use {@link CKEDITOR.plugins.widget.repository#destroy} when possible instead of this method. + * + * This method fires the {#event-destroy} event. + * + * @param {Boolean} [offline] Whether a widget is offline (detached from the DOM tree) — + * in this case the DOM (attributes, classes, etc.) will not be cleaned up. + */ + destroy: function( offline ) { + this.fire( 'destroy' ); + + if ( this.editables ) { + for ( var name in this.editables ) + this.destroyEditable( name, offline ); + } + + if ( !offline ) { + if ( this.element.data( 'cke-widget-keep-attr' ) == '0' ) + this.element.removeAttribute( 'data-widget' ); + this.element.removeAttributes( [ 'data-cke-widget-data', 'data-cke-widget-keep-attr' ] ); + this.element.removeClass( 'cke_widget_element' ); + this.element.replace( this.wrapper ); + } + + this.wrapper = null; + }, + + /** + * Destroys a nested editable. + * + * @param {String} editableName Nested editable name. + * @param {Boolean} [offline] See {@link #method-destroy} method. + */ + destroyEditable: function( editableName, offline ) { + var editable = this.editables[ editableName ]; + + editable.removeListener( 'focus', onEditableFocus ); + editable.removeListener( 'blur', onEditableBlur ); + this.editor.focusManager.remove( editable ); + + if ( !offline ) { + editable.removeClass( 'cke_widget_editable' ); + editable.removeClass( 'cke_widget_editable_focused' ); + editable.removeAttributes( [ 'contenteditable', 'data-cke-widget-editable', 'data-cke-enter-mode' ] ); + } + + delete this.editables[ editableName ]; + }, + + /** + * Starts widget editing. + * + * This method fires the {@link CKEDITOR.plugins.widget#event-edit} event + * which may be canceled in order to prevent it from opening a dialog window. + * + * The dialog window name is obtained from the event's data `dialog` property or + * from {@link CKEDITOR.plugins.widget.definition#dialog}. + * + * @returns {Boolean} Returns `true` if a dialog window was opened. + */ + edit: function() { + var evtData = { dialog: this.dialog }, + that = this; + + // Edit event was blocked, but there's no dialog to be automatically opened. + if ( this.fire( 'edit', evtData ) === false || !evtData.dialog ) + return false; + + this.editor.openDialog( evtData.dialog, function( dialog ) { + var showListener, + okListener; + + // Allow to add a custom dialog handler. + if ( that.fire( 'dialog', dialog ) === false ) + return; + + showListener = dialog.on( 'show', function() { + dialog.setupContent( that ); + } ); + + okListener = dialog.on( 'ok', function() { + // Commit dialog's fields, but prevent from + // firing data event for every field. Fire only one, + // bulk event at the end. + var dataChanged, + dataListener = that.on( 'data', function( evt ) { + dataChanged = 1; + evt.cancel(); + }, null, null, 0 ); + + // Create snapshot preceeding snapshot with changed widget... + // TODO it should not be required, but it is and I found similar + // code in dialog#ok listener in dialog/plugin.js. + that.editor.fire( 'saveSnapshot' ); + dialog.commitContent( that ); + + dataListener.removeListener(); + if ( dataChanged ) { + that.fire( 'data', that.data ); + that.editor.fire( 'saveSnapshot' ); + } + } ); + + dialog.once( 'hide', function() { + showListener.removeListener(); + okListener.removeListener(); + } ); + } ); + + return true; + }, + + /** + * Returns widget element classes parsed to an object. This method + * is used to populate the `classes` property of widget's {@link #property-data}. + * + * This method reuses {@link CKEDITOR.plugins.widget.repository#parseElementClasses}. + * It should be overriden if a widget should handle classes differently (e.g. on other elements). + * + * See also: {@link #removeClass}, {@link #addClass}, {@link #hasClass}. + * + * @since 4.4 + * @returns {Object} + */ + getClasses: function() { + return this.repository.parseElementClasses( this.element.getAttribute( 'class' ) ); + }, + + /** + * Checks if the widget element has specified class. This method is used by + * the {@link #checkStyleActive} method and should be overriden by widgets + * which should handle classes differently (e.g. on other elements). + * + * See also: {@link #removeClass}, {@link #addClass}, {@link #getClasses}. + * + * @since 4.4 + * @param {String} className The class to be checked. + * @param {Boolean} Whether a widget has specified class. + */ + hasClass: function( className ) { + return this.element.hasClass( className ); + }, + + /** + * Initializes a nested editable. + * + * **Note**: Only elements from {@link CKEDITOR.dtd#$editable} may become editables. + * + * @param {String} editableName The nested editable name. + * @param {CKEDITOR.plugins.widget.nestedEditable.definition} definition The definition of the nested editable. + * @returns {Boolean} Whether an editable was successfully initialized. + */ + initEditable: function( editableName, definition ) { + var editable = this.wrapper.findOne( definition.selector ); + + if ( editable && editable.is( CKEDITOR.dtd.$editable ) ) { + editable = new NestedEditable( this.editor, editable, { + filter: createEditableFilter.call( this.repository, this.name, editableName, definition ) + } ); + this.editables[ editableName ] = editable; + + editable.setAttributes( { + contenteditable: 'true', + 'data-cke-widget-editable': editableName, + 'data-cke-enter-mode': editable.enterMode + } ); + + if ( editable.filter ) + editable.data( 'cke-filter', editable.filter.id ); + + editable.addClass( 'cke_widget_editable' ); + // This class may be left when d&ding widget which + // had focused editable. Clean this class here, not in + // cleanUpWidgetElement for performance and code size reasons. + editable.removeClass( 'cke_widget_editable_focused' ); + + if ( definition.pathName ) + editable.data( 'cke-display-name', definition.pathName ); + + this.editor.focusManager.add( editable ); + editable.on( 'focus', onEditableFocus, this ); + CKEDITOR.env.ie && editable.on( 'blur', onEditableBlur, this ); + + // Finally, process editable's data. This data wasn't processed when loading + // editor's data, becuase they need to be processed separately, with its own filters and settings. + editable.setData( editable.getHtml() ); + + return true; + } + + return false; + }, + + /** + * Checks if a widget has already been initialized and has not been destroyed yet. + * + * See {@link #inited} for more details. + * + * @returns {Boolean} + */ + isInited: function() { + return !!( this.wrapper && this.inited ); + }, + + /** + * Checks if a widget is ready and has not been destroyed yet. + * + * See {@link #property-ready} for more details. + * + * @returns {Boolean} + */ + isReady: function() { + return this.isInited() && this.ready; + }, + + /** + * Focuses a widget by selecting it. + */ + focus: function() { + var sel = this.editor.getSelection(); + + // Fake the selection before focusing editor, to avoid unpreventable viewports scrolling + // on Webkit/Blink/IE which is done because there's no selection or selection was somewhere else than widget. + if ( sel ) { + var isDirty = this.editor.checkDirty(); + + sel.fake( this.wrapper ); + + !isDirty && this.editor.resetDirty(); + } + + // Always focus editor (not only when focusManger.hasFocus is false) (because of #10483). + this.editor.focus(); + }, + + /** + * Removes a class from the widget element. This method is used by + * the {@link #removeStyle} method and should be overriden by widgets + * which should handle classes differently (e.g. on other elements). + * + * **Note**: This method should not be used directly. Use the {@link #setData} method to + * set the `classes` property. Read more in the {@link #setData} documentation. + * + * See also: {@link #hasClass}, {@link #addClass}. + * + * @since 4.4 + * @param {String} className The class to be removed. + */ + removeClass: function( className ) { + this.element.removeClass( className ); + }, + + /** + * Removes the specified style from the widget. It is highly recommended to use the + * {@link CKEDITOR.editor#removeStyle} or {@link CKEDITOR.style#remove} methods instead of + * using this method directly, because unlike editor's and style's methods, this one + * does not perform any checks. + * + * Read more about how applying/removing styles works in the {@link #applyStyle} method documentation. + * + * See also {@link #checkStyleActive}, {@link #applyStyle}, {@link #getClasses}. + * + * @since 4.4 + * @param {CKEDITOR.style} style The custom widget style to be removed. + */ + removeStyle: function( style ) { + applyRemoveStyle( this, style, 0 ); + }, + + /** + * Sets widget value(s) in the {@link #property-data} object. + * If the given value(s) modifies current ones, the {@link #event-data} event is fired. + * + * this.setData( 'align', 'left' ); + * this.data.align; // -> 'left' + * + * this.setData( { align: 'right', opened: false } ); + * this.data.align; // -> 'right' + * this.data.opened; // -> false + * + * Set values are stored in {@link #element}'s attribute (`data-cke-widget-data`), + * in a JSON string, therefore {@link #property-data} should contain + * only serializable data. + * + * **Note:** A special data property, `classes`, exists. It contains an object with + * classes which were returned by the {@link #getClasses} method during the widget initialization. + * This property is then used by the {@link #applyStyle} and {@link #removeStyle} methods. + * When it is changed (the reference to object must be changed!), the widget updates its classes by + * using the {@link #addClass} and {@link #removeClass} methods. + * + * // Adding a new class. + * var classes = CKEDITOR.tools.clone( widget.data.classes ); + * classes.newClass = 1; + * widget.setData( 'classes', classes ); + * + * // Removing a class. + * var classes = CKEDITOR.tools.clone( widget.data.classes ); + * delete classes.newClass; + * widget.setData( 'classes', classes ); + * + * @param {String/Object} keyOrData + * @param {Object} value + * @chainable + */ + setData: function( key, value ) { + var data = this.data, + modified = 0; + + if ( typeof key == 'string' ) { + if ( data[ key ] !== value ) { + data[ key ] = value; + modified = 1; + } + } + else { + var newData = key; + + for ( key in newData ) { + if ( data[ key ] !== newData[ key ] ) { + modified = 1; + data[ key ] = newData[ key ]; + } + } + } + + // Block firing data event and overwriting data element before setupWidgetData is executed. + if ( modified && this.dataReady ) { + writeDataToElement( this ); + this.fire( 'data', data ); + } + + return this; + }, + + /** + * Changes the widget's focus state. This method is executed automatically after + * a widget has been focused by the {@link #method-focus} method or a selection was moved + * out of the widget. + * + * @param {Boolean} selected Whether to select or deselect this widget. + * @chainable + */ + setFocused: function( focused ) { + this.wrapper[ focused ? 'addClass' : 'removeClass' ]( 'cke_widget_focused' ); + this.fire( focused ? 'focus' : 'blur' ); + return this; + }, + + /** + * Changes the widget's select state. This method is executed automatically after + * a widget has been selected by the {@link #method-focus} method or the selection + * was moved out of widget. + * + * @param {Boolean} selected Whether to select or deselect this widget. + * @chainable + */ + setSelected: function( selected ) { + this.wrapper[ selected ? 'addClass' : 'removeClass' ]( 'cke_widget_selected' ); + this.fire( selected ? 'select' : 'deselect' ); + return this; + }, + + /** + * Repositions drag handler according to the widget's element position. Should be called from events, like mouseover. + */ + updateDragHandlerPosition: function() { + var editor = this.editor, + domElement = this.element.$, + oldPos = this._.dragHandlerOffset, + newPos = { + x: domElement.offsetLeft, + y: domElement.offsetTop - DRAG_HANDLER_SIZE + }; + + if ( oldPos && newPos.x == oldPos.x && newPos.y == oldPos.y ) + return; + + // We need to make sure that dirty state is not changed (#11487). + var initialDirty = editor.checkDirty(); + + editor.fire( 'lockSnapshot' ); + this.dragHandlerContainer.setStyles( { + top: newPos.y + 'px', + left: newPos.x + 'px' + } ); + editor.fire( 'unlockSnapshot' ); + !initialDirty && editor.resetDirty(); + + this._.dragHandlerOffset = newPos; + } + }; + + CKEDITOR.event.implementOn( Widget.prototype ); + + /** + * An event fired when a widget is ready (fully initialized). This event is fired after: + * + * * {@link #init} is called, + * * The first {@link #event-data} event is fired, + * * A widget is attached to the document. + * + * Therefore, in case of widget creation with a command which opens a dialog window, this event + * will be delayed after the dialog window is closed and the widget is finally inserted into the document. + * + * **Note**: If your widget does not use automatic dialog window binding (i.e. you open the dialog window manually) + * or another situation in which the widget wrapper is not attached to document at the time when it is + * initialized occurs, you need to take care of firing {@link #event-ready} yourself. + * + * See also {@link #property-ready} and {@link #property-inited} properties, and + * {@link #isReady} and {@link #isInited} methods. + * + * @event ready + */ + + /** + * An event fired when a widget is about to be destroyed, but before it is + * fully torn down. + * + * @event destroy + */ + + /** + * An event fired when a widget is focused. + * + * Widget can be focused by executing {@link #method-focus}. + * + * @event focus + */ + + /** + * An event fired when a widget is blurred. + * + * @event blur + */ + + /** + * An event fired when a widget is selected. + * + * @event select + */ + + /** + * An event fired when a widget is deselected. + * + * @event deselect + */ + + /** + * An event fired by the {@link #method-edit} method. It can be canceled + * in order to stop the default action (opening a dialog window and/or + * {@link CKEDITOR.plugins.widget.repository#finalizeCreation finalizing widget creation}). + * + * @event edit + * @param data + * @param {String} data.dialog Defaults to {@link CKEDITOR.plugins.widget.definition#dialog} + * and can be changed or set by the listener. + */ + + /** + * An event fired when a dialog window for widget editing is opened. + * This event can be canceled in order to handle the editing dialog in a custom manner. + * + * @event dialog + * @param {CKEDITOR.dialog} data The opened dialog window instance. + */ + + /** + * An event fired when a key is pressed on a focused widget. + * This event is forwarded from the {@link CKEDITOR.editor#key} event and + * has the ability to block editor keystrokes if it is canceled. + * + * @event key + * @param data + * @param {Number} data.keyCode A number representing the key code (or combination). + */ + + /** + * An event fired when a widget is double clicked. + * + * **Note:** If a default editing action is executed on double click (i.e. a widget has a + * {@link CKEDITOR.plugins.widget.definition#dialog dialog} defined and the {@link #event-doubleclick} event was not + * canceled), this event will be automatically canceled, so a listener added with the default priority (10) + * will not be executed. Use a listener with low priority (e.g. 5) to be sure that it will be executed. + * + * widget.on( 'doubleclick', function( evt ) { + * console.log( 'widget#doubleclick' ); + * }, null, null, 5 ); + * + * If your widget handles double click in a special way (so the default editing action is not executed), + * make sure you cancel this event, because otherwise it will be propagated to {@link CKEDITOR.editor#doubleclick} + * and another feature may step in (e.g. a Link dialog window may be opened if your widget was inside a link). + * + * @event doubleclick + * @param data + * @param {CKEDITOR.dom.element} data.element The double-clicked element. + */ + + /** + * An event fired when the context menu is opened for a widget. + * + * @event contextMenu + * @param data The object containing context menu options to be added + * for this widget. See {@link CKEDITOR.plugins.contextMenu#addListener}. + */ + + /** + * An event fired when the widget data changed. See the {@link #setData} method and the {@link #property-data} property. + * + * @event data + */ + + + + /** + * The wrapper class for editable elements inside widgets. + * + * Do not use directly. Use {@link CKEDITOR.plugins.widget.definition#editables} or + * {@link CKEDITOR.plugins.widget#initEditable}. + * + * @class CKEDITOR.plugins.widget.nestedEditable + * @extends CKEDITOR.dom.element + * @constructor + * @param {CKEDITOR.editor} editor + * @param {CKEDITOR.dom.element} element + * @param config + * @param {CKEDITOR.filter} [config.filter] + */ + function NestedEditable( editor, element, config ) { + // Call the base constructor. + CKEDITOR.dom.element.call( this, element.$ ); + this.editor = editor; + var filter = this.filter = config.filter; + + // If blockless editable - always use BR mode. + if ( !CKEDITOR.dtd[ this.getName() ].p ) + this.enterMode = this.shiftEnterMode = CKEDITOR.ENTER_BR; + else { + this.enterMode = filter ? filter.getAllowedEnterMode( editor.enterMode ) : editor.enterMode; + this.shiftEnterMode = filter ? filter.getAllowedEnterMode( editor.shiftEnterMode, true ) : editor.shiftEnterMode; + } + } + + NestedEditable.prototype = CKEDITOR.tools.extend( CKEDITOR.tools.prototypedCopy( CKEDITOR.dom.element.prototype ), { + /** + * Sets the editable data. The data will be passed through the {@link CKEDITOR.editor#dataProcessor} + * and the {@link CKEDITOR.editor#filter}. This ensures that the data was filtered and prepared to be + * edited like the {@link CKEDITOR.editor#method-setData editor data}. + * + * @param {String} data + */ + setData: function( data ) { + data = this.editor.dataProcessor.toHtml( data, { + context: this.getName(), + filter: this.filter, + enterMode: this.enterMode + } ); + this.setHtml( data ); + + this.editor.widgets.initOnAll( this ); + }, + + /** + * Gets the editable data. Like {@link #setData}, this method will process and filter the data. + * + * @returns {String} + */ + getData: function() { + return this.editor.dataProcessor.toDataFormat( this.getHtml(), { + context: this.getName(), + filter: this.filter, + enterMode: this.enterMode + } ); + } + } ); + + /** + * The editor instance. + * + * @readonly + * @property {CKEDITOR.editor} editor + */ + + /** + * The filter instance if allowed content rules were defined. + * + * @readonly + * @property {CKEDITOR.filter} filter + */ + + /** + * The enter mode active in this editable. + * It is determined from editable's name (whether it is a blockless editable), + * its allowed content rules (if defined) and the default editor's mode. + * + * @readonly + * @property {Number} enterMode + */ + + /** + * The shift enter move active in this editable. + * + * @readonly + * @property {Number} shiftEnterMode + */ + + + // + // REPOSITORY helpers ----------------------------------------------------- + // + + function addWidgetButtons( editor ) { + var widgets = editor.widgets.registered, + widget, + widgetName, + widgetButton; + + for ( widgetName in widgets ) { + widget = widgets[ widgetName ]; + + // Create button if defined. + widgetButton = widget.button; + if ( widgetButton && editor.ui.addButton ) { + editor.ui.addButton( CKEDITOR.tools.capitalize( widget.name, true ), { + label: widgetButton, + command: widget.name, + toolbar: 'insert,10' + } ); + } + } + } + + // Create a command creating and editing widget. + // + // @param editor + // @param {CKEDITOR.plugins.widget.definition} widgetDef + function addWidgetCommand( editor, widgetDef ) { + editor.addCommand( widgetDef.name, { + exec: function() { + var focused = editor.widgets.focused; + // If a widget of the same type is focused, start editing. + if ( focused && focused.name == widgetDef.name ) + focused.edit(); + // Otherwise... + // ... use insert method is was defined. + else if ( widgetDef.insert ) + widgetDef.insert(); + // ... or create a brand-new widget from template. + else if ( widgetDef.template ) { + var defaults = typeof widgetDef.defaults == 'function' ? widgetDef.defaults() : widgetDef.defaults, + element = CKEDITOR.dom.element.createFromHtml( widgetDef.template.output( defaults ) ), + instance, + wrapper = editor.widgets.wrapElement( element, widgetDef.name ), + temp = new CKEDITOR.dom.documentFragment( wrapper.getDocument() ); + + // Append wrapper to a temporary document. This will unify the environment + // in which #data listeners work when creating and editing widget. + temp.append( wrapper ); + instance = editor.widgets.initOn( element, widgetDef ); + + // Instance could be destroyed during initialization. + // In this case finalize creation if some new widget + // was left in temporary document fragment. + if ( !instance ) { + finalizeCreation(); + return; + } + + // Listen on edit to finalize widget insertion. + // + // * If dialog was set, then insert widget after dialog was successfully saved or destroy this + // temporary instance. + // * If dialog wasn't set and edit wasn't canceled, insert widget. + var editListener = instance.once( 'edit', function( evt ) { + if ( evt.data.dialog ) { + instance.once( 'dialog', function( evt ) { + var dialog = evt.data, + okListener, + cancelListener; + + // Finalize creation AFTER (20) new data was set. + okListener = dialog.once( 'ok', finalizeCreation, null, null, 20 ); + + cancelListener = dialog.once( 'cancel', function() { + editor.widgets.destroy( instance, true ); + } ); + + dialog.once( 'hide', function() { + okListener.removeListener(); + cancelListener.removeListener(); + } ); + } ); + } else { + // Dialog hasn't been set, so insert widget now. + finalizeCreation(); + } + }, null, null, 999 ); + + instance.edit(); + + // Remove listener in case someone canceled it before this + // listener was executed. + editListener.removeListener(); + } + + function finalizeCreation() { + editor.widgets.finalizeCreation( temp ); + } + }, + + refresh: function( editor, path ) { + // Disable widgets' commands inside nested editables - + // check if blockLimit is a nested editable or a descendant of any. + this.setState( getNestedEditable( editor.editable(), path.blockLimit ) ? CKEDITOR.TRISTATE_DISABLED : CKEDITOR.TRISTATE_OFF ); + }, + // A hack to force command refreshing on context change. + context: 'div', + + allowedContent: widgetDef.allowedContent, + requiredContent: widgetDef.requiredContent, + contentForms: widgetDef.contentForms, + contentTransformations: widgetDef.contentTransformations + } ); + } + + function addWidgetProcessors( widgetsRepo, widgetDef ) { + var upcast = widgetDef.upcast, + upcasts; + + if ( !upcast ) + return; + + // Multiple upcasts defined in string. + if ( typeof upcast == 'string' ) { + upcasts = upcast.split( ',' ); + while ( upcasts.length ) + widgetsRepo._.upcasts.push( [ widgetDef.upcasts[ upcasts.pop() ], widgetDef.name ] ); + } else { + // Single rule which is automatically activated. + widgetsRepo._.upcasts.push( [ upcast, widgetDef.name ] ); + } + } + + function blurWidget( widgetsRepo, widget ) { + widgetsRepo.focused = null; + + if ( widget.isInited() ) { + var isDirty = widget.editor.checkDirty(); + + // Widget could be destroyed in the meantime - e.g. data could be set. + widgetsRepo.fire( 'widgetBlurred', { widget: widget } ); + widget.setFocused( false ); + + !isDirty && widget.editor.resetDirty(); + } + } + + function checkWidgets( evt ) { + var options = evt.data; + + if ( this.editor.mode != 'wysiwyg' ) + return; + + var editable = this.editor.editable(), + instances = this.instances, + newInstances, i, count, wrapper; + + if ( !editable ) + return; + + // Remove widgets which have no corresponding elements in DOM. + for ( i in instances ) { + if ( !editable.contains( instances[ i ].wrapper ) ) + this.destroy( instances[ i ], true ); + } + + // Init on all (new) if initOnlyNew option was passed. + if ( options && options.initOnlyNew ) + newInstances = this.initOnAll(); + else { + var wrappers = editable.find( '.cke_widget_wrapper' ); + newInstances = []; + + // Create widgets on existing wrappers if they do not exists. + for ( i = 0, count = wrappers.count(); i < count; i++ ) { + wrapper = wrappers.getItem( i ); + + // Check if there's no instance for this widget and that + // wrapper is not inside some temporary element like copybin (#11088). + if ( !this.getByElement( wrapper, true ) && !findParent( wrapper, isDomTemp ) ) { + // Add cke_widget_new class because otherwise + // widget will not be created on such wrapper. + wrapper.addClass( 'cke_widget_new' ); + newInstances.push( this.initOn( wrapper.getFirst( isDomWidgetElement ) ) ); + } + } + } + + // If only single widget was initialized and focusInited was passed, focus it. + if ( options && options.focusInited && newInstances.length == 1 ) + newInstances[ 0 ].focus(); + } + + // Unwraps widget element and clean up element. + // + // This function is used to clean up pasted widgets. + // It should have similar result to widget#destroy plus + // some additional adjustments, specific for pasting. + // + // @param {CKEDITOR.htmlParser.element} el + function cleanUpWidgetElement( el ) { + var parent = el.parent; + if ( parent.type == CKEDITOR.NODE_ELEMENT && parent.attributes[ 'data-cke-widget-wrapper' ] ) + parent.replaceWith( el ); + } + + // Similar to cleanUpWidgetElement, but works on DOM and finds + // widget elements by its own. + // + // Unlike cleanUpWidgetElement it will wrap element back. + // + // @param {CKEDITOR.dom.element} container + function cleanUpAllWidgetElements( widgetsRepo, container ) { + var wrappers = container.find( '.cke_widget_wrapper' ), + wrapper, element, + i = 0, + l = wrappers.count(); + + for ( ; i < l; ++i ) { + wrapper = wrappers.getItem( i ); + element = wrapper.getFirst( isDomWidgetElement ); + // If wrapper contains widget element - unwrap it and wrap again. + if ( element.type == CKEDITOR.NODE_ELEMENT && element.data( 'widget' ) ) { + element.replace( wrapper ); + widgetsRepo.wrapElement( element ); + } else { + // Otherwise - something is wrong... clean this up. + wrapper.remove(); + } + } + } + + // Creates {@link CKEDITOR.filter} instance for given widget, editable and rules. + // + // Once filter for widget-editable pair is created it is cached, so the same instance + // will be returned when method is executed again. + // + // @param {String} widgetName + // @param {String} editableName + // @param {CKEDITOR.plugins.widget.nestedEditableDefinition} editableDefinition The nested editable definition. + // @returns {CKEDITOR.filter} Filter instance or `null` if rules are not defined. + // @context CKEDITOR.plugins.widget.repository + function createEditableFilter( widgetName, editableName, editableDefinition ) { + if ( !editableDefinition.allowedContent ) + return null; + + var editables = this._.filters[ widgetName ]; + + if ( !editables ) + this._.filters[ widgetName ] = editables = {}; + + var filter = editables[ editableName ]; + + if ( !filter ) + editables[ editableName ] = filter = new CKEDITOR.filter( editableDefinition.allowedContent ); + + return filter; + } + + // Creates an iterator function which when executed on all + // elements in DOM tree will gather elements that should be wrapped + // and initialized as widgets. + function createUpcastIterator( widgetsRepo ) { + var toBeWrapped = [], + upcasts = widgetsRepo._.upcasts, + upcastCallbacks = widgetsRepo._.upcastCallbacks; + + return { + toBeWrapped: toBeWrapped, + + iterator: function( element ) { + var upcast, upcasted, + data, + i, + upcastsLength, + upcastCallbacksLength; + + // Wrapper found - find widget element, add it to be + // cleaned up (unwrapped) and wrapped and stop iterating in this branch. + if ( 'data-cke-widget-wrapper' in element.attributes ) { + element = element.getFirst( isParserWidgetElement ); + + if ( element ) + toBeWrapped.push( [ element ] ); + + // Do not iterate over descendants. + return false; + } + // Widget element found - add it to be cleaned up (just in case) + // and wrapped and stop iterating in this branch. + else if ( 'data-widget' in element.attributes ) { + toBeWrapped.push( [ element ] ); + + // Do not iterate over descendants. + return false; + } + else if ( ( upcastsLength = upcasts.length ) ) { + // Ignore elements with data-cke-widget-upcasted to avoid multiple upcasts (#11533). + // Do not iterate over descendants. + if ( element.attributes[ 'data-cke-widget-upcasted' ] ) + return false; + + // Check element with upcast callbacks first. + // If any of them return false abort upcasting. + for ( i = 0, upcastCallbacksLength = upcastCallbacks.length; i < upcastCallbacksLength; ++i ) { + if ( upcastCallbacks[ i ]( element ) === false ) + return; + // Return nothing in order to continue iterating over ascendants. + // See http://dev.ckeditor.com/ticket/11186#comment:6 + } + + for ( i = 0; i < upcastsLength; ++i ) { + upcast = upcasts[ i ]; + data = {}; + + if ( ( upcasted = upcast[ 0 ]( element, data ) ) ) { + // If upcast function returned element, upcast this one. + // It can be e.g. a new element wrapping the original one. + if ( upcasted instanceof CKEDITOR.htmlParser.element ) + element = upcasted; + + // Set initial data attr with data from upcast method. + element.attributes[ 'data-cke-widget-data' ] = encodeURIComponent( JSON.stringify( data ) ); + element.attributes[ 'data-cke-widget-upcasted' ] = 1; + + toBeWrapped.push( [ element, upcast[ 1 ] ] ); + + // Do not iterate over descendants. + return false; + } + } + } + } + }; + } + + // Finds a first parent that matches query. + // + // @param {CKEDITOR.dom.element} element + // @param {Function} query + function findParent( element, query ) { + var parent = element; + + while ( ( parent = parent.getParent() ) ) { + if ( query( parent ) ) + return true; + } + return false; + } + + // Gets nested editable if node is its descendant or the editable itself. + // + // @param {CKEDITOR.dom.element} guard Stop ancestor search on this node (usually editor's editable). + // @param {CKEDITOR.dom.node} node Start search from this node. + // @returns {CKEDITOR.dom.element} Element or null. + function getNestedEditable( guard, node ) { + if ( !node || node.equals( guard ) ) + return null; + + if ( isDomNestedEditable( node ) ) + return node; + + return getNestedEditable( guard, node.getParent() ); + } + + function getWrapperAttributes( inlineWidget ) { + return { + // tabindex="-1" means that it can receive focus by code. + tabindex: -1, + contenteditable: 'false', + 'data-cke-widget-wrapper': 1, + 'data-cke-filter': 'off', + // Class cke_widget_new marks widgets which haven't been initialized yet. + 'class': 'cke_widget_wrapper cke_widget_new cke_widget_' + + ( inlineWidget ? 'inline' : 'block' ) + }; + } + + // Inserts element at given index. + // It will check DTD and split ancestor elements up to the first + // that can contain this element. + // + // @param {CKEDITOR.htmlParser.element} parent + // @param {Number} index + // @param {CKEDITOR.htmlParser.element} element + function insertElement( parent, index, element ) { + // Do not split doc fragment... + if ( parent.type == CKEDITOR.NODE_ELEMENT ) { + var parentAllows = CKEDITOR.dtd[ parent.name ]; + // Parent element is known (included in DTD) and cannot contain + // this element. + if ( parentAllows && !parentAllows[ element.name ] ) { + var parent2 = parent.split( index ), + parentParent = parent.parent; + + // Element will now be inserted at right parent's index. + index = parent2.getIndex(); + + // If left part of split is empty - remove it. + if ( !parent.children.length ) { + index -= 1; + parent.remove(); + } + + // If right part of split is empty - remove it. + if ( !parent2.children.length ) + parent2.remove(); + + // Try inserting as grandpas' children. + return insertElement( parentParent, index, element ); + } + } + + // Finally we can add this element. + parent.add( element, index ); + } + + // @param {CKEDITOR.htmlParser.element} + function isParserWidgetElement( element ) { + return element.type == CKEDITOR.NODE_ELEMENT && !!element.attributes[ 'data-widget' ]; + } + + // @param {CKEDITOR.dom.element} + function isDomWidgetElement( element ) { + return element.type == CKEDITOR.NODE_ELEMENT && element.hasAttribute( 'data-widget' ); + } + + // Whether for this definition and element widget should be created in inline or block mode. + function isWidgetInline( widgetDef, elementName ) { + return typeof widgetDef.inline == 'boolean' ? widgetDef.inline : !!CKEDITOR.dtd.$inline[ elementName ]; + } + + // @param {CKEDITOR.htmlParser.element} + function isParserWidgetWrapper( element ) { + return element.type == CKEDITOR.NODE_ELEMENT && element.attributes[ 'data-cke-widget-wrapper' ]; + } + + // @param {CKEDITOR.dom.element} + function isDomWidgetWrapper( element ) { + return element.type == CKEDITOR.NODE_ELEMENT && element.hasAttribute( 'data-cke-widget-wrapper' ); + } + + // @param {CKEDITOR.dom.element} + function isDomNestedEditable( node ) { + return node.type == CKEDITOR.NODE_ELEMENT && node.hasAttribute( 'data-cke-widget-editable' ); + } + + // @param {CKEDITOR.dom.element} + function isDomTemp( element ) { + return element.hasAttribute( 'data-cke-temp' ); + } + + // @param {CKEDITOR.dom.element} + function isDomDragHandler( element ) { + return element.type == CKEDITOR.NODE_ELEMENT && element.hasAttribute( 'data-cke-widget-drag-handler' ); + } + + // @param {CKEDITOR.dom.element} + function isDomDragHandlerContainer( element ) { + return element.type == CKEDITOR.NODE_ELEMENT && element.hasClass( 'cke_widget_drag_handler_container' ); + } + + function finalizeNativeDrop( editor, sourceWidget, range ) { + // Save the snapshot with the state before moving widget. + // Focus widget, so when we'll undo the DnD, widget will be focused. + sourceWidget.focus(); + editor.fire( 'saveSnapshot' ); + + // Lock snapshot to group all steps of moving widget from the original place to the new one. + editor.fire( 'lockSnapshot', { dontUpdate: true } ); + + range.select(); + + var widgetHtml = sourceWidget.wrapper.getOuterHtml(); + sourceWidget.wrapper.remove(); + editor.widgets.destroy( sourceWidget, true ); + editor.execCommand( 'paste', widgetHtml ); + + editor.fire( 'unlockSnapshot' ); + } + + function getRangeAtDropPosition( editor, dropEvt ) { + var $evt = dropEvt.data.$, + $range, + range = editor.createRange(); + + // Make testing possible. + if ( dropEvt.data.testRange ) + return dropEvt.data.testRange; + + // Webkits. + if ( document.caretRangeFromPoint ) { + $range = editor.document.$.caretRangeFromPoint( $evt.clientX, $evt.clientY ); + range.setStart( CKEDITOR.dom.node( $range.startContainer ), $range.startOffset ); + range.collapse( true ); + } + // FF. + else if ( $evt.rangeParent ) { + range.setStart( CKEDITOR.dom.node( $evt.rangeParent ), $evt.rangeOffset ); + range.collapse( true ); + } + // IEs. + else if ( document.body.createTextRange ) { + $range = editor.document.getBody().$.createTextRange(); + $range.moveToPoint( $evt.clientX, $evt.clientY ); + var id = 'cke-temp-' + ( new Date() ).getTime(); + $range.pasteHTML( '\u200b' ); + + var span = editor.document.getById( id ); + range.moveToPosition( span, CKEDITOR.POSITION_BEFORE_START ); + span.remove(); + } else { + return null; + } + + return range; + } + + function onEditableKey( widget, keyCode ) { + var focusedEditable = widget.focusedEditable, + range; + + // CTRL+A. + if ( keyCode == CKEDITOR.CTRL + 65 ) { + var bogus = focusedEditable.getBogus(); + + range = widget.editor.createRange(); + range.selectNodeContents( focusedEditable ); + // Exclude bogus if exists. + if ( bogus ) + range.setEndAt( bogus, CKEDITOR.POSITION_BEFORE_START ); + + range.select(); + // Cancel event - block default. + return false; + } + // DEL or BACKSPACE. + else if ( keyCode == 8 || keyCode == 46 ) { + var ranges = widget.editor.getSelection().getRanges(); + + range = ranges[ 0 ]; + + // Block del or backspace if at editable's boundary. + return !( ranges.length == 1 && range.collapsed && + range.checkBoundaryOfElement( focusedEditable, CKEDITOR[ keyCode == 8 ? 'START' : 'END' ] ) ); + } + } + + function setFocusedEditable( widgetsRepo, widget, editableElement, offline ) { + var editor = widgetsRepo.editor; + + editor.fire( 'lockSnapshot' ); + + if ( editableElement ) { + var editableName = editableElement.data( 'cke-widget-editable' ), + editableInstance = widget.editables[ editableName ]; + + widgetsRepo.widgetHoldingFocusedEditable = widget; + widget.focusedEditable = editableInstance; + editableElement.addClass( 'cke_widget_editable_focused' ); + + if ( editableInstance.filter ) + editor.setActiveFilter( editableInstance.filter ); + editor.setActiveEnterMode( editableInstance.enterMode, editableInstance.shiftEnterMode ); + } else { + if ( !offline ) + widget.focusedEditable.removeClass( 'cke_widget_editable_focused' ); + + widget.focusedEditable = null; + widgetsRepo.widgetHoldingFocusedEditable = null; + editor.setActiveFilter( null ); + editor.setActiveEnterMode( null, null ); + } + + editor.fire( 'unlockSnapshot' ); + } + + function setupContextMenu( editor ) { + if ( !editor.contextMenu ) + return; + + editor.contextMenu.addListener( function( element ) { + var widget = editor.widgets.getByElement( element, true ); + + if ( widget ) + return widget.fire( 'contextMenu', {} ); + } ); + } + + // And now we've got two problems - original problem and RegExp. + // Some softeners: + // * FF tends to copy all blocks up to the copybin container. + // * IE tends to copy only the copybin, without its container. + // * We use spans on IE and blockless editors, but divs in other cases. + var pasteReplaceRegex = new RegExp( + '^' + + '(?:<(?:div|span)(?: data-cke-temp="1")?(?: id="cke_copybin")?(?: data-cke-temp="1")?>)?' + + '(?:<(?:div|span)(?: style="[^"]+")?>)?' + + ']*data-cke-copybin-start="1"[^>]*>.?([\\s\\S]+)]*data-cke-copybin-end="1"[^>]*>.?' + + '(?:)?' + + '(?:)?' + + '$' + ); + + function pasteReplaceFn( match, wrapperHtml ) { + // Avoid polluting pasted data with any whitspaces, + // what's going to break check whether only one widget was pasted. + return CKEDITOR.tools.trim( wrapperHtml ); + } + + function setupDragAndDrop( widgetsRepo ) { + var editor = widgetsRepo.editor, + lineutils = CKEDITOR.plugins.lineutils; + + editor.on( 'contentDom', function() { + var editable = editor.editable(), + // #11123 Firefox needs to listen on document, because otherwise event won't be fired. + // #11086 IE8 cannot listen on document. + dropTarget = ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 ) || editable.isInline() ? editable : editor.document; + + editable.attachListener( dropTarget, 'drop', function( evt ) { + var dataStr = evt.data.$.dataTransfer.getData( 'text' ), + dataObj, + sourceWidget, + range; + + if ( !dataStr ) + return; + + try { + dataObj = JSON.parse( dataStr ); + } catch ( e ) { + // Do nothing - data couldn't be parsed so it's not a CKEditor's data. + return; + } + + if ( dataObj.type != 'cke-widget' ) + return; + + evt.data.preventDefault(); + + // Something went wrong... maybe someone is dragging widgets between editors/windows/tabs/browsers/frames. + if ( dataObj.editor != editor.name || !( sourceWidget = widgetsRepo.instances[ dataObj.id ] ) ) + return; + + // Try to determine a DOM position at which drop happened. If none of methods + // which we support succeeded abort. + range = getRangeAtDropPosition( editor, evt ); + if ( !range ) + return; + + // #11132 Hack to prevent cursor loss on Firefox. Without timeout widget is + // correctly pasted but then cursor is invisible (although it works) and can be restored + // only by blurring editable. + if ( CKEDITOR.env.gecko ) + setTimeout( finalizeNativeDrop, 0, editor, sourceWidget, range ); + else + finalizeNativeDrop( editor, sourceWidget, range ); + } ); + + // Register Lineutils's utilities as properties of repo. + CKEDITOR.tools.extend( widgetsRepo, { + finder: new lineutils.finder( editor, { + lookups: { + // Element is block but not list item and not in nested editable. + 'default': function( el ) { + if ( el.is( CKEDITOR.dtd.$listItem ) ) + return; + + if ( !el.is( CKEDITOR.dtd.$block ) ) + return; + + while ( el ) { + if ( isDomNestedEditable( el ) ) + return; + + el = el.getParent(); + } + + return CKEDITOR.LINEUTILS_BEFORE | CKEDITOR.LINEUTILS_AFTER; + } + } + } ), + locator: new lineutils.locator( editor ), + liner: new lineutils.liner( editor, { + lineStyle: { + cursor: 'move !important', + 'border-top-color': '#666' + }, + tipLeftStyle: { + 'border-left-color': '#666' + }, + tipRightStyle: { + 'border-right-color': '#666' + } + } ) + }, true ); + } ); + } + + // Setup mouse observer which will trigger: + // * widget focus on widget click, + // * widget#doubleclick forwarded from editor#doubleclick. + function setupMouseObserver( widgetsRepo ) { + var editor = widgetsRepo.editor; + + editor.on( 'contentDom', function() { + var editable = editor.editable(), + evtRoot = editable.isInline() ? editable : editor.document, + widget, + mouseDownOnDragHandler; + + editable.attachListener( evtRoot, 'mousedown', function( evt ) { + var target = evt.data.getTarget(); + + // #10887 Clicking scrollbar in IE8 will invoke event with empty target object. + if ( !target.type ) + return false; + + widget = widgetsRepo.getByElement( target ); + mouseDownOnDragHandler = 0; // Reset. + + // Widget was clicked, but not editable nested in it. + if ( widget ) { + // Ignore mousedown on drag and drop handler if the widget is inline. + // Block widgets are handled by Lineutils. + if ( widget.inline && target.type == CKEDITOR.NODE_ELEMENT && target.hasAttribute( 'data-cke-widget-drag-handler' ) ) { + mouseDownOnDragHandler = 1; + return; + } + + if ( !getNestedEditable( widget.wrapper, target ) ) { + evt.data.preventDefault(); + if ( !CKEDITOR.env.ie ) + widget.focus(); + } else { + // Reset widget so mouseup listener is not confused. + widget = null; + } + } + } ); + + // Focus widget on mouseup if mousedown was fired on drag handler. + // Note: mouseup won't be fired at all if widget was dragged and dropped, so + // this code will be executed only when drag handler was clicked. + editable.attachListener( evtRoot, 'mouseup', function() { + if ( widget && mouseDownOnDragHandler ) { + mouseDownOnDragHandler = 0; + widget.focus(); + } + } ); + + // On IE it is not enough to block mousedown. If widget wrapper (element with + // contenteditable=false attribute) is clicked directly (it is a target), + // then after mouseup/click IE will select that element. + // It is not possible to prevent that default action, + // so we force fake selection after everything happened. + if ( CKEDITOR.env.ie ) { + editable.attachListener( evtRoot, 'mouseup', function() { + if ( widget ) { + setTimeout( function() { + widget.focus(); + widget = null; + } ); + } + } ); + } + } ); + + editor.on( 'doubleclick', function( evt ) { + var widget = widgetsRepo.getByElement( evt.data.element ); + + // Not in widget or in nested editable. + if ( !widget || getNestedEditable( widget.wrapper, evt.data.element ) ) + return; + + return widget.fire( 'doubleclick', { element: evt.data.element } ); + }, null, null, 1 ); + } + + // Setup editor#key observer which will forward it + // to focused widget. + function setupKeyboardObserver( widgetsRepo ) { + var editor = widgetsRepo.editor; + + editor.on( 'key', function( evt ) { + var focused = widgetsRepo.focused, + widgetHoldingFocusedEditable = widgetsRepo.widgetHoldingFocusedEditable, + ret; + + if ( focused ) + ret = focused.fire( 'key', { keyCode: evt.data.keyCode } ); + else if ( widgetHoldingFocusedEditable ) + ret = onEditableKey( widgetHoldingFocusedEditable, evt.data.keyCode ); + + return ret; + }, null, null, 1 ); + } + + // Setup copybin on native copy and cut events in order to handle copy and cut commands + // if user accepted security alert on IEs. + // Note: when copying or cutting using keystroke, copySingleWidget will be first executed + // by the keydown listener. Conflict between two calls will be resolved by copy_bin existence check. + function setupNativeCutAndCopy( widgetsRepo ) { + var editor = widgetsRepo.editor; + + editor.on( 'contentDom', function() { + var editable = editor.editable(); + + editable.attachListener( editable, 'copy', eventListener ); + editable.attachListener( editable, 'cut', eventListener ); + } ); + + function eventListener( evt ) { + if ( widgetsRepo.focused ) + copySingleWidget( widgetsRepo.focused, evt.name == 'cut' ); + } + } + + // Setup selection observer which will trigger: + // * widget select & focus on selection change, + // * nested editable focus (related properites and classes) on selection change, + // * deselecting and blurring all widgets on data, + // * blurring widget on editor blur. + function setupSelectionObserver( widgetsRepo ) { + var editor = widgetsRepo.editor; + + editor.on( 'selectionCheck', function() { + widgetsRepo.fire( 'checkSelection' ); + } ); + + widgetsRepo.on( 'checkSelection', widgetsRepo.checkSelection, widgetsRepo ); + + editor.on( 'selectionChange', function( evt ) { + var nestedEditable = getNestedEditable( editor.editable(), evt.data.selection.getStartElement() ), + newWidget = nestedEditable && widgetsRepo.getByElement( nestedEditable ), + oldWidget = widgetsRepo.widgetHoldingFocusedEditable; + + if ( oldWidget ) { + if ( oldWidget !== newWidget || !oldWidget.focusedEditable.equals( nestedEditable ) ) { + setFocusedEditable( widgetsRepo, oldWidget, null ); + + if ( newWidget && nestedEditable ) + setFocusedEditable( widgetsRepo, newWidget, nestedEditable ); + } + } + // It may happen that there's no widget even if editable was found - + // e.g. if selection was automatically set in editable although widget wasn't initialized yet. + else if ( newWidget && nestedEditable ) { + setFocusedEditable( widgetsRepo, newWidget, nestedEditable ); + } + } ); + + // Invalidate old widgets early - immediately on dataReady. + editor.on( 'dataReady', function() { + // Deselect and blur all widgets. + stateUpdater( widgetsRepo ).commit(); + } ); + + editor.on( 'blur', function() { + var widget; + + if ( ( widget = widgetsRepo.focused ) ) + blurWidget( widgetsRepo, widget ); + + if ( ( widget = widgetsRepo.widgetHoldingFocusedEditable ) ) + setFocusedEditable( widgetsRepo, widget, null ); + } ); + } + + // Set up actions like: + // * processing in toHtml/toDataFormat, + // * pasting handling, + // * insertion handling, + // * editable reload handling (setData, mode switch, undo/redo), + // * DOM invalidation handling, + // * widgets checks. + function setupWidgetsLifecycle( widgetsRepo ) { + setupWidgetsLifecycleStart( widgetsRepo ); + setupWidgetsLifecycleEnd( widgetsRepo ); + + widgetsRepo.on( 'checkWidgets', checkWidgets ); + widgetsRepo.editor.on( 'contentDomInvalidated', widgetsRepo.checkWidgets, widgetsRepo ); + } + + function setupWidgetsLifecycleEnd( widgetsRepo ) { + var editor = widgetsRepo.editor, + downcastingSessions = {}; + + // Listen before htmlDP#htmlFilter is applied to cache all widgets, because we'll + // loose data-cke-* attributes. + editor.on( 'toDataFormat', function( evt ) { + // To avoid conflicts between htmlDP#toDF calls done at the same time + // (e.g. nestedEditable#getData called during downcasting some widget) + // mark every toDataFormat event chain with the downcasting session id. + var id = CKEDITOR.tools.getNextNumber(), + toBeDowncasted = []; + evt.data.downcastingSessionId = id; + downcastingSessions[ id ] = toBeDowncasted; + + evt.data.dataValue.forEach( function( element ) { + var attrs = element.attributes, + widget, widgetElement; + + // Wrapper. + // Perform first part of downcasting (cleanup) and cache widgets, + // because after applying DP's filter all data-cke-* attributes will be gone. + if ( 'data-cke-widget-id' in attrs ) { + widget = widgetsRepo.instances[ attrs[ 'data-cke-widget-id' ] ]; + if ( widget ) { + widgetElement = element.getFirst( isParserWidgetElement ); + toBeDowncasted.push( { + wrapper: element, + element: widgetElement, + widget: widget, + editables: {} + } ); + + // If widget did not have data-cke-widget attribute before upcasting remove it. + if ( widgetElement.attributes[ 'data-cke-widget-keep-attr' ] != '1' ) + delete widgetElement.attributes[ 'data-widget' ]; + } + } + // Nested editable. + else if ( 'data-cke-widget-editable' in attrs ) { + // Save the reference to this nested editable in the closest widget to be downcasted. + // Nested editables are downcasted in the successive toDataFormat to create an opportunity + // for dataFilter's "excludeNestedEditable" option to do its job (that option relies on + // contenteditable="true" attribute) (#11372). + toBeDowncasted[ toBeDowncasted.length - 1 ].editables[ attrs[ 'data-cke-widget-editable' ] ] = element; + + // Don't check children - there won't be next wrapper or nested editable which we + // should process in this session. + return false; + } + }, CKEDITOR.NODE_ELEMENT, true ); + }, null, null, 8 ); + + // Listen after dataProcessor.htmlFilter and ACF were applied + // so wrappers securing widgets' contents are removed after all filtering was done. + editor.on( 'toDataFormat', function( evt ) { + // Ignore some unmarked sessions. + if ( !evt.data.downcastingSessionId ) + return; + + var toBeDowncasted = downcastingSessions[ evt.data.downcastingSessionId ], + toBe, widget, widgetElement, retElement, editableElement, e; + + while ( ( toBe = toBeDowncasted.shift() ) ) { + widget = toBe.widget; + widgetElement = toBe.element; + retElement = widget._.downcastFn && widget._.downcastFn.call( widget, widgetElement ); + + // Replace nested editables' content with their output data. + for ( e in toBe.editables ) { + editableElement = toBe.editables[ e ]; + + delete editableElement.attributes.contenteditable; + editableElement.setHtml( widget.editables[ e ].getData() ); + } + + // Returned element always defaults to widgetElement. + if ( !retElement ) + retElement = widgetElement; + + toBe.wrapper.replaceWith( retElement ); + } + }, null, null, 13 ); + + + editor.on( 'contentDomUnload', function() { + widgetsRepo.destroyAll( true ); + } ); + } + + function setupWidgetsLifecycleStart( widgetsRepo ) { + var editor = widgetsRepo.editor, + processedWidgetOnly, + snapshotLoaded; + + // Listen after ACF (so data are filtered), + // but before dataProcessor.dataFilter was applied (so we can secure widgets' internals). + editor.on( 'toHtml', function( evt ) { + var upcastIterator = createUpcastIterator( widgetsRepo ), + toBeWrapped; + + evt.data.dataValue.forEach( upcastIterator.iterator, CKEDITOR.NODE_ELEMENT, true ); + + // Clean up and wrap all queued elements. + while ( ( toBeWrapped = upcastIterator.toBeWrapped.pop() ) ) { + cleanUpWidgetElement( toBeWrapped[ 0 ] ); + widgetsRepo.wrapElement( toBeWrapped[ 0 ], toBeWrapped[ 1 ] ); + } + + // Used to determine whether only widget was pasted. + processedWidgetOnly = evt.data.dataValue.children.length == 1 && + isParserWidgetWrapper( evt.data.dataValue.children[ 0 ] ); + }, null, null, 8 ); + + editor.on( 'dataReady', function() { + // Clean up all widgets loaded from snapshot. + if ( snapshotLoaded ) + cleanUpAllWidgetElements( widgetsRepo, editor.editable() ); + snapshotLoaded = 0; + + // Some widgets were destroyed on contentDomUnload, + // some on loadSnapshot, but that does not include + // e.g. setHtml on inline editor or widgets removed just + // before setting data. + widgetsRepo.destroyAll( true ); + widgetsRepo.initOnAll(); + } ); + + // Set flag so dataReady will know that additional + // cleanup is needed, because snapshot containing widgets was loaded. + editor.on( 'loadSnapshot', function( evt ) { + // Primitive but sufficient check which will prevent from executing + // heavier cleanUpAllWidgetElements if not needed. + if ( ( /data-cke-widget/ ).test( evt.data ) ) + snapshotLoaded = 1; + + widgetsRepo.destroyAll( true ); + }, null, null, 9 ); + + // Handle pasted single widget. + editor.on( 'paste', function( evt ) { + evt.data.dataValue = evt.data.dataValue.replace( pasteReplaceRegex, pasteReplaceFn ); + } ); + + // Listen with high priority to check widgets after data was inserted. + editor.on( 'insertText', checkNewWidgets, null, null, 999 ); + editor.on( 'insertHtml', checkNewWidgets, null, null, 999 ); + + function checkNewWidgets() { + editor.fire( 'lockSnapshot' ); + + // Init only new for performance reason. + // Focus inited if only widget was processed. + widgetsRepo.checkWidgets( { initOnlyNew: true, focusInited: processedWidgetOnly } ); + + editor.fire( 'unlockSnapshot' ); + } + } + + // Helper for coordinating which widgets should be + // selected/deselected and which one should be focused/blurred. + function stateUpdater( widgetsRepo ) { + var currentlySelected = widgetsRepo.selected, + toBeSelected = [], + toBeDeselected = currentlySelected.slice( 0 ), + focused = null; + + return { + select: function( widget ) { + if ( CKEDITOR.tools.indexOf( currentlySelected, widget ) < 0 ) + toBeSelected.push( widget ); + + var index = CKEDITOR.tools.indexOf( toBeDeselected, widget ); + if ( index >= 0 ) + toBeDeselected.splice( index, 1 ); + + return this; + }, + + focus: function( widget ) { + focused = widget; + return this; + }, + + commit: function() { + var focusedChanged = widgetsRepo.focused !== focused, + widget, isDirty; + + widgetsRepo.editor.fire( 'lockSnapshot' ); + + if ( focusedChanged && ( widget = widgetsRepo.focused ) ) + blurWidget( widgetsRepo, widget ); + + while ( ( widget = toBeDeselected.pop() ) ) { + currentlySelected.splice( CKEDITOR.tools.indexOf( currentlySelected, widget ), 1 ); + // Widget could be destroyed in the meantime - e.g. data could be set. + if ( widget.isInited() ) { + isDirty = widget.editor.checkDirty(); + + widget.setSelected( false ); + + !isDirty && widget.editor.resetDirty(); + } + } + + if ( focusedChanged && focused ) { + isDirty = widgetsRepo.editor.checkDirty(); + + widgetsRepo.focused = focused; + widgetsRepo.fire( 'widgetFocused', { widget: focused } ); + focused.setFocused( true ); + + !isDirty && widgetsRepo.editor.resetDirty(); + } + + while ( ( widget = toBeSelected.pop() ) ) { + currentlySelected.push( widget ); + widget.setSelected( true ); + } + + widgetsRepo.editor.fire( 'unlockSnapshot' ); + } + }; + } + + + // + // WIDGET helpers --------------------------------------------------------- + // + + // LEFT, RIGHT, UP, DOWN, DEL, BACKSPACE - unblock default fake sel handlers. + var keystrokesNotBlockedByWidget = { 37: 1, 38: 1, 39: 1, 40: 1, 8: 1, 46: 1 }; + + // Applies or removes style's classes from widget. + // @param {CKEDITOR.style} style Custom widget style. + // @param {Boolean} apply Whether to apply or remove style. + function applyRemoveStyle( widget, style, apply ) { + var changed = 0, + classes = getStyleClasses( style ), + updatedClasses = widget.data.classes || {}, + cl; + + // Ee... Something is wrong with this style. + if ( !classes ) + return; + + // Clone, because we need to break reference. + updatedClasses = CKEDITOR.tools.clone( updatedClasses ); + + while ( ( cl = classes.pop() ) ) { + if ( apply ) { + if ( !updatedClasses[ cl ] ) + changed = updatedClasses[ cl ] = 1; + } else { + if ( updatedClasses[ cl ] ) { + delete updatedClasses[ cl ]; + changed = 1; + } + } + } + if ( changed ) + widget.setData( 'classes', updatedClasses ); + } + + function cancel( evt ) { + evt.cancel(); + } + + function copySingleWidget( widget, isCut ) { + var editor = widget.editor, + doc = editor.document; + + // We're still handling previous copy/cut. + // When keystroke is used to copy/cut this will also prevent + // conflict with copySingleWidget called again for native copy/cut event. + if ( doc.getById( 'cke_copybin' ) ) + return; + + // [IE] Use span for copybin and its container to avoid bug with expanding editable height by + // absolutely positioned element. + var copybinName = ( editor.blockless || CKEDITOR.env.ie ) ? 'span' : 'div', + copybin = doc.createElement( copybinName ), + copybinContainer = doc.createElement( copybinName ), + // IE8 always jumps to the end of document. + needsScrollHack = CKEDITOR.env.ie && CKEDITOR.env.version < 9; + + copybinContainer.setAttributes( { + id: 'cke_copybin', + 'data-cke-temp': '1' + } ); + + // Position copybin element outside current viewport. + copybin.setStyles( { + position: 'absolute', + width: '1px', + height: '1px', + overflow: 'hidden' + } ); + + copybin.setStyle( editor.config.contentsLangDirection == 'ltr' ? 'left' : 'right', '-5000px' ); + + copybin.setHtml( '\u200b' + widget.wrapper.getOuterHtml() + '\u200b' ); + + // Save snapshot with the current state. + editor.fire( 'saveSnapshot' ); + + // Ignore copybin. + editor.fire( 'lockSnapshot' ); + + copybinContainer.append( copybin ); + editor.editable().append( copybinContainer ); + + var listener1 = editor.on( 'selectionChange', cancel, null, null, 0 ), + listener2 = widget.repository.on( 'checkSelection', cancel, null, null, 0 ); + + if ( needsScrollHack ) { + var docElement = doc.getDocumentElement().$, + scrollTop = docElement.scrollTop; + } + + // Once the clone of the widget is inside of copybin, select + // the entire contents. This selection will be copied by the + // native browser's clipboard system. + var range = editor.createRange(); + range.selectNodeContents( copybin ); + range.select(); + + if ( needsScrollHack ) + docElement.scrollTop = scrollTop; + + setTimeout( function() { + // [IE] Focus widget before removing copybin to avoid scroll jump. + if ( !isCut ) + widget.focus(); + + copybinContainer.remove(); + + listener1.removeListener(); + listener2.removeListener(); + + editor.fire( 'unlockSnapshot' ); + + if ( isCut ) { + widget.repository.del( widget ); + editor.fire( 'saveSnapshot' ); + } + }, 100 ); // Use 100ms, so Chrome (@Mac) will be able to grab the content. + } + + // Extracts classes array from style instance. + function getStyleClasses( style ) { + var attrs = style.getDefinition().attributes, + classes = attrs && attrs[ 'class' ]; + + return classes ? classes.split( /\s+/ ) : null; + } + + // [IE] Force keeping focus because IE sometimes forgets to fire focus on main editable + // when blurring nested editable. + // @context widget + function onEditableBlur() { + var active = CKEDITOR.document.getActive(), + editor = this.editor, + editable = editor.editable(); + + // If focus stays within editor override blur and set currentActive because it should be + // automatically changed to editable on editable#focus but it is not fired. + if ( ( editable.isInline() ? editable : editor.document.getWindow().getFrame() ).equals( active ) ) + editor.focusManager.focus( editable ); + } + + // Force selectionChange when editable was focused. + // Similar to hack in selection.js#~620. + // @context widget + function onEditableFocus() { + // Gecko does not support 'DOMFocusIn' event on which we unlock selection + // in selection.js to prevent selection locking when entering nested editables. + if ( CKEDITOR.env.gecko ) + this.editor.unlockSelection(); + + // We don't need to force selectionCheck on Webkit, because on Webkit + // we do that on DOMFocusIn in selection.js. + if ( !CKEDITOR.env.webkit ) { + this.editor.forceNextSelectionCheck(); + this.editor.selectionChange( 1 ); + } + } + + // Setup listener on widget#data which will update (remove/add) classes + // by comparing newly set classes with the old ones. + function setupDataClassesListener( widget ) { + // Note: previousClasses and newClasses may be null! + // Tip: for ( cl in null ) is correct. + var previousClasses = null; + + widget.on( 'data', function() { + var newClasses = this.data.classes, + cl; + + // When setting new classes one need to remember + // that he must break reference. + if ( previousClasses == newClasses ) + return; + + for ( cl in previousClasses ) { + // Avoid removing and adding classes again. + if ( !( newClasses && newClasses[ cl ] ) ) + this.removeClass( cl ); + } + for ( cl in newClasses ) + this.addClass( cl ); + + previousClasses = newClasses; + } ); + } + + function setupDragHandler( widget ) { + if ( !widget.draggable ) + return; + + var editor = widget.editor, + // Use getLast to find wrapper's direct descendant (#12022). + container = widget.wrapper.getLast( isDomDragHandlerContainer ), + img; + + // Reuse drag handler if already exists (#11281). + if ( container ) + img = container.findOne( 'img' ); + else { + container = new CKEDITOR.dom.element( 'span', editor.document ); + container.setAttributes( { + 'class': 'cke_reset cke_widget_drag_handler_container', + // Split background and background-image for IE8 which will break on rgba(). + style: 'background:rgba(220,220,220,0.5);background-image:url(' + editor.plugins.widget.path + 'images/handle.png)' + } ); + + img = new CKEDITOR.dom.element( 'img', editor.document ); + img.setAttributes( { + 'class': 'cke_reset cke_widget_drag_handler', + 'data-cke-widget-drag-handler': '1', + src: CKEDITOR.tools.transparentImageData, + width: DRAG_HANDLER_SIZE, + title: editor.lang.widget.move, + height: DRAG_HANDLER_SIZE + } ); + widget.inline && img.setAttribute( 'draggable', 'true' ); + + container.append( img ); + widget.wrapper.append( container ); + } + + widget.wrapper.on( 'mouseenter', widget.updateDragHandlerPosition, widget ); + setTimeout( function() { + widget.on( 'data', widget.updateDragHandlerPosition, widget ); + }, 50 ); + + if ( widget.inline ) { + img.on( 'dragstart', function( evt ) { + evt.data.$.dataTransfer.setData( 'text', JSON.stringify( { type: 'cke-widget', editor: editor.name, id: widget.id } ) ); + } ); + } else { + img.on( 'mousedown', onBlockWidgetDrag, widget ); + } + + widget.dragHandlerContainer = container; + } + + function onBlockWidgetDrag() { + var finder = this.repository.finder, + locator = this.repository.locator, + liner = this.repository.liner, + editor = this.editor, + editable = editor.editable(), + listeners = [], + sorted = [], + + // Harvest all possible relations and display some closest. + relations = finder.greedySearch(), + + buffer = CKEDITOR.tools.eventsBuffer( 50, function() { + locations = locator.locate( relations ); + + // There's only a single line displayed for D&D. + sorted = locator.sort( y, 1 ); + + if ( sorted.length ) { + liner.prepare( relations, locations ); + liner.placeLine( sorted[ 0 ] ); + liner.cleanup(); + } + } ), + + locations, y; + + // Let's have the "dragging cursor" over entire editable. + editable.addClass( 'cke_widget_dragging' ); + + // Cache mouse position so it is re-used in events buffer. + listeners.push( editable.on( 'mousemove', function( evt ) { + y = evt.data.$.clientY; + buffer.input(); + } ) ); + + function onMouseUp() { + var l; + + buffer.reset(); + + // Stop observing events. + while ( ( l = listeners.pop() ) ) + l.removeListener(); + + onBlockWidgetDrop.call( this, sorted ); + } + + // Mouseup means "drop". This is when the widget is being detached + // from DOM and placed at range determined by the line (location). + listeners.push( editor.document.once( 'mouseup', onMouseUp, this ) ); + + // Mouseup may occur when user hovers the line, which belongs to + // the outer document. This is, of course, a valid listener too. + listeners.push( CKEDITOR.document.once( 'mouseup', onMouseUp, this ) ); + } + + function onBlockWidgetDrop( sorted ) { + var finder = this.repository.finder, + liner = this.repository.liner, + editor = this.editor, + editable = this.editor.editable(); + + if ( !CKEDITOR.tools.isEmpty( liner.visible ) ) { + // Retrieve range for the closest location. + var range = finder.getRange( sorted[ 0 ] ); + + // Focus widget (it could lost focus after mousedown+mouseup) + // and save this state as the one where we want to be taken back when undoing. + this.focus(); + editor.fire( 'saveSnapshot' ); + // Group all following operations in one snapshot. + editor.fire( 'lockSnapshot', { dontUpdate: 1 } ); + + // Reset the fake selection, which will be invalidated by insertElementIntoRange. + // This avoids a situation when getSelection() still returns a fake selection made + // on widget which in the meantime has been moved to other place. That could cause + // an error thrown e.g. by saveSnapshot or stateUpdater. + editor.getSelection().reset(); + + // Attach widget at the place determined by range. + editable.insertElementIntoRange( this.wrapper, range ); + + // Focus again the dropped widget. + this.focus(); + + // Unlock snapshot and save new one, which will contain all changes done + // in this method. + editor.fire( 'unlockSnapshot' ); + editor.fire( 'saveSnapshot' ); + } + + // Clean-up custom cursor for editable. + editable.removeClass( 'cke_widget_dragging' ); + + // Clean-up all remaining lines. + liner.hideVisible(); + } + + function setupEditables( widget ) { + var editableName, + editableDef, + definedEditables = widget.editables; + + widget.editables = {}; + + if ( !widget.editables ) + return; + + for ( editableName in definedEditables ) { + editableDef = definedEditables[ editableName ]; + widget.initEditable( editableName, typeof editableDef == 'string' ? { selector: editableDef } : editableDef ); + } + } + + function setupMask( widget ) { + if ( !widget.mask ) + return; + + // Reuse mask if already exists (#11281). + var img = widget.wrapper.findOne( '.cke_widget_mask' ); + + if ( !img ) { + img = new CKEDITOR.dom.element( 'img', widget.editor.document ); + img.setAttributes( { + src: CKEDITOR.tools.transparentImageData, + 'class': 'cke_reset cke_widget_mask' + } ); + widget.wrapper.append( img ); + } + + widget.mask = img; + } + + // Replace parts object containing: + // partName => selector pairs + // with: + // partName => element pairs + function setupParts( widget ) { + if ( widget.parts ) { + var parts = {}, + el, partName; + + for ( partName in widget.parts ) { + el = widget.wrapper.findOne( widget.parts[ partName ] ); + parts[ partName ] = el; + } + widget.parts = parts; + } + } + + function setupWidget( widget, widgetDef ) { + setupWrapper( widget ); + setupParts( widget ); + setupEditables( widget ); + setupMask( widget ); + setupDragHandler( widget ); + setupDataClassesListener( widget ); + + // #11145: [IE8] Non-editable content of widget is draggable. + if ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 ) { + widget.wrapper.on( 'dragstart', function( evt ) { + var target = evt.data.getTarget(); + + // Allow text dragging inside nested editables or dragging inline widget's drag handler. + if ( !getNestedEditable( widget, target ) && !( widget.inline && isDomDragHandler( target ) ) ) + evt.data.preventDefault(); + } ); + } + + widget.wrapper.removeClass( 'cke_widget_new' ); + widget.element.addClass( 'cke_widget_element' ); + + widget.on( 'key', function( evt ) { + var keyCode = evt.data.keyCode; + + // ENTER. + if ( keyCode == 13 ) { + widget.edit(); + // CTRL+C or CTRL+X. + } else if ( keyCode == CKEDITOR.CTRL + 67 || keyCode == CKEDITOR.CTRL + 88 ) { + copySingleWidget( widget, keyCode == CKEDITOR.CTRL + 88 ); + return; // Do not preventDefault. + } else if ( keyCode in keystrokesNotBlockedByWidget || ( CKEDITOR.CTRL & keyCode ) || ( CKEDITOR.ALT & keyCode ) ) { + // Pass chosen keystrokes to other plugins or default fake sel handlers. + // Pass all CTRL/ALT keystrokes. + return; + } + + return false; + }, null, null, 999 ); + // Listen with high priority so it's possible + // to overwrite this callback. + + widget.on( 'doubleclick', function( evt ) { + if ( widget.edit() ) { + // We have to cancel event if edit method opens a dialog, otherwise + // link plugin may open extra dialog (#12140). + evt.cancel(); + } + } ); + + if ( widgetDef.data ) + widget.on( 'data', widgetDef.data ); + + if ( widgetDef.edit ) + widget.on( 'edit', widgetDef.edit ); + } + + function setupWidgetData( widget, startupData ) { + var widgetDataAttr = widget.element.data( 'cke-widget-data' ); + + if ( widgetDataAttr ) + widget.setData( JSON.parse( decodeURIComponent( widgetDataAttr ) ) ); + if ( startupData ) + widget.setData( startupData ); + + // Populate classes if they are not preset. + if ( !widget.data.classes ) + widget.setData( 'classes', widget.getClasses() ); + + // Unblock data and... + widget.dataReady = true; + + // Write data to element because this was blocked when data wasn't ready. + writeDataToElement( widget ); + + // Fire data event first time, because this was blocked when data wasn't ready. + widget.fire( 'data', widget.data ); + } + + function setupWrapper( widget ) { + // Retrieve widget wrapper. Assign an id to it. + var wrapper = widget.wrapper = widget.element.getParent(); + wrapper.setAttribute( 'data-cke-widget-id', widget.id ); + } + + function writeDataToElement( widget ) { + widget.element.data( 'cke-widget-data', encodeURIComponent( JSON.stringify( widget.data ) ) ); + } + + // + // WIDGET STYLE HANDLER --------------------------------------------------- + // + + ( function() { + + /** + * The class representing a widget style. It is an {@link CKEDITOR#STYLE_OBJECT object} like + * the styles handler for widgets. + * + * **Note:** This custom style handler does not support all methods of the {@link CKEDITOR.style} class. + * Not supported methods: {@link #applyToRange}, {@link #removeFromRange}, {@link #applyToObject}. + * + * @since 4.4 + * @class CKEDITOR.style.customHandlers.widget + * @extends CKEDITOR.style + */ + CKEDITOR.style.addCustomHandler( { + type: 'widget', + + setup: function( styleDefinition ) { + /** + * The name of widget to which this style can be applied. + * It is extracted from style definition's `widget` property. + * + * @property {String} widget + */ + this.widget = styleDefinition.widget; + }, + + apply: function( editor ) { + // Before CKEditor 4.4 wasn't a required argument, so we need to + // handle a case when it wasn't provided. + if ( !( editor instanceof CKEDITOR.editor ) ) + return; + + // Theoretically we could bypass checkApplicable, get widget from + // widgets.focused and check its name, what would be faster, but then + // this custom style would work differently than the default style + // which checks if it's applicable before applying or removeing itself. + if ( this.checkApplicable( editor.elementPath(), editor ) ) + editor.widgets.focused.applyStyle( this ); + }, + + remove: function( editor ) { + // Before CKEditor 4.4 wasn't a required argument, so we need to + // handle a case when it wasn't provided. + if ( !( editor instanceof CKEDITOR.editor ) ) + return; + + if ( this.checkApplicable( editor.elementPath(), editor ) ) + editor.widgets.focused.removeStyle( this ); + }, + + checkActive: function( elementPath, editor ) { + return this.checkElementMatch( elementPath.lastElement, 0, editor ); + }, + + checkApplicable: function( elementPath, editor ) { + // Before CKEditor 4.4 wasn't a required argument, so we need to + // handle a case when it wasn't provided. + if ( !( editor instanceof CKEDITOR.editor ) ) + return false; + + return this.checkElement( elementPath.lastElement ); + }, + + checkElementMatch: checkElementMatch, + + checkElementRemovable: checkElementMatch, + + /** + * Checks if an element is a {@link CKEDITOR.plugins.widget#wrapper wrapper} of a + * widget whose name matches the {@link #widget widget name} specified in the style definition. + * + * @param {CKEDITOR.dom.element} element + * @returns {Boolean} + */ + checkElement: function( element ) { + if ( !isDomWidgetWrapper( element ) ) + return false; + + var widgetElement = element.getFirst( isDomWidgetElement ); + return widgetElement && widgetElement.data( 'widget' ) == this.widget; + }, + + buildPreview: function( label ) { + return label || this._.definition.name; + }, + + /** + * Returns allowed content rules which should be registered for this style. + * Uses widget's {@link CKEDITOR.plugins.widget.definition#styleableElements} to make a rule + * allowing classes on specified elements or use widget's + * {@link CKEDITOR.plugins.widget.definition#styleToAllowedContentRules} method to transform a style + * into allowed content rules. + * + * @param {CKEDITOR.editor} The editor instance. + * @returns {CKEDITOR.filter.allowedContentRules} + */ + toAllowedContentRules: function( editor ) { + if ( !editor ) + return null; + + var widgetDef = editor.widgets.registered[ this.widget ], + classes, + rule = {}; + + if ( !widgetDef ) + return null; + + if ( widgetDef.styleableElements ) { + classes = this.getClassesArray(); + if ( !classes ) + return null; + + rule[ widgetDef.styleableElements ] = { + classes: classes, + propertiesOnly: true + }; + return rule; + } + if ( widgetDef.styleToAllowedContentRules ) + return widgetDef.styleToAllowedContentRules( this ); + return null; + }, + + /** + * Returns classes defined in the style in form of an array. + * + * @returns {String[]} + */ + getClassesArray: function() { + var classes = this._.definition.attributes && this._.definition.attributes[ 'class' ]; + + return classes ? CKEDITOR.tools.trim( classes ).split( /\s+/ ) : null; + }, + + /** + * Not implemented. + * + * @method applyToRange + */ + applyToRange: notImplemented, + + /** + * Not implemented. + * + * @method removeFromRange + */ + removeFromRange: notImplemented, + + /** + * Not implemented. + * + * @method applyToObject + */ + applyToObject: notImplemented + } ); + + function notImplemented() {} + + // @context style + function checkElementMatch( element, fullMatch, editor ) { + // Before CKEditor 4.4 wasn't a required argument, so we need to + // handle a case when it wasn't provided. + if ( !editor ) + return false; + + if ( !this.checkElement( element ) ) + return false; + + var widget = editor.widgets.getByElement( element, true ); + return widget && widget.checkStyleActive( this ); + } + + } )(); + + // + // EXPOSE PUBLIC API ------------------------------------------------------ + // + + CKEDITOR.plugins.widget = Widget; + Widget.repository = Repository; + Widget.nestedEditable = NestedEditable; +} )(); + +/** + * An event fired when a widget definition is registered by the {@link CKEDITOR.plugins.widget.repository#add} method. + * It is possible to modify the definition being registered. + * + * @event widgetDefinition + * @member CKEDITOR.editor + * @param {CKEDITOR.plugins.widget.definition} data Widget definition. + */ + +/** + * This is an abstract class that describes the definition of a widget. + * It is a type of {@link CKEDITOR.plugins.widget.repository#add} method's second argument. + * + * Widget instances inherit from registered widget definitions, although not in a prototypal way. + * They are simply extended with corresponding widget definitions. Note that not all properties of + * the widget definition become properties of a widget. Some, like {@link #data} or {@link #edit}, become + * widget's events listeners. + * + * @class CKEDITOR.plugins.widget.definition + * @abstract + * @mixins CKEDITOR.feature + */ + +/** + * Widget definition name. It is automatically set when the definition is + * {@link CKEDITOR.plugins.widget.repository#add registered}. + * + * @property {String} name + */ + +/** + * The method executed while initializing a widget, after a widget instance + * is created, but before it is ready. It is executed before the first + * {@link CKEDITOR.plugins.widget#event-data} is fired so it is common to + * use the `init` method to populate widget data with information loaded from + * the DOM, like for exmaple: + * + * init: function() { + * this.setData( 'width', this.element.getStyle( 'width' ) ); + * + * if ( this.parts.caption.getStyle( 'display' ) != 'none' ) + * this.setData( 'showCaption', true ); + * } + * + * @property {Function} init + */ + +/** + * The function to be used to upcast an element to this widget or a + * comma-separated list of upcast methods from the {@link #upcasts} object. + * + * The upcast function **is not** executed in the widget context (because the widget + * does not exist yet) and two arguments are passed: + * + * * `element` ({@link CKEDITOR.htmlParser.element}) – The element to be checked. + * * `data` (`Object`) – The object which can be extended with data which will then be passed to the widget. + * + * An element will be upcasted if a function returned `true` or an instance of + * a {@link CKEDITOR.htmlParser.element} if upcasting meant DOM structure changes + * (in this case the widget will be initialized on the returned element). + * + * @property {String/Function} upcast + */ + +/** + * The object containing functions which can be used to upcast this widget. + * Only those pointed by the {@link #upcast} property will be used. + * + * In most cases it is appropriate to use {@link #upcast} directly, + * because majority of widgets need just one method. + * However, in some cases the widget author may want to expose more than one variant + * and then this property may be used. + * + * upcasts: { + * // This function may upcast only figure elements. + * figure: function() { + * // ... + * }, + * // This function may upcast only image elements. + * image: function() { + * // ... + * }, + * // More variants... + * } + * + * // Then, widget user may choose which upcast methods will be enabled. + * editor.on( 'widgetDefinition', function( evt ) { + * if ( evt.data.name == 'image' ) + * evt.data.upcast = 'figure,image'; // Use both methods. + * } ); + * + * @property {Object} upcasts + */ + +/** + * The function to be used to downcast this widget or + * a name of the downcast option from the {@link #downcasts} object. + * + * The downcast funciton will be executed in the {@link CKEDITOR.plugins.widget} context + * and with `widgetElement` ({@link CKEDITOR.htmlParser.element}) argument which is + * the widget's main element. + * + * The function may return an instance of the {@link CKEDITOR.htmlParser.node} class if the widget + * needs to be downcasted to a different node than the widget's main element. + * + * @property {String/Function} downcast + */ + +/** + * The object containing functions which can be used to downcast this widget. + * Only the one pointed by the {@link #downcast} property will be used. + * + * In most cases it is appropriate to use {@link #downcast} directly, + * because majority of widgets have just one variant of downcasting (or none at all). + * However, in some cases the widget author may want to expose more than one variant + * and then this property may be used. + * + * downcasts: { + * // This downcast may transform the widget into the figure element. + * figure: function() { + * // ... + * }, + * // This downcast may transform the widget into the image element with data-* attributes. + * image: function() { + * // ... + * } + * } + * + * // Then, the widget user may choose one of the downcast options when setting up his editor. + * editor.on( 'widgetDefinition', function( evt ) { + * if ( evt.data.name == 'image' ) + * evt.data.downcast = 'figure'; + * } ); + * + * @property downcasts + */ + +/** + * If set, it will be added as the {@link CKEDITOR.plugins.widget#event-edit} event listener. + * This means that it will be executed when a widget is being edited. + * See the {@link CKEDITOR.plugins.widget#method-edit} method. + * + * @property {Function} edit + */ + +/** + * If set, it will be added as the {@link CKEDITOR.plugins.widget#event-data} event listener. + * This means that it will be executed every time the {@link CKEDITOR.plugins.widget#property-data widget data} changes. + * + * @property {Function} data + */ + +/** + * The method to be executed when the widget's command is executed in order to insert a new widget + * (widget of this type is not focused). If not defined, then the default action will be + * performed which means that: + * + * * An instance of the widget will be created in a detached {@link CKEDITOR.dom.documentFragment document fragment}, + * * The {@link CKEDITOR.plugins.widget#method-edit} method will be called to trigger widget editing, + * * The widget element will be inserted into DOM. + * + * @property {Function} insert + */ + +/** + * The name of a dialog window which will be opened on {@link CKEDITOR.plugins.widget#method-edit}. + * If not defined, then the {@link CKEDITOR.plugins.widget#method-edit} method will not perform any action and + * widget's command will insert a new widget without opening a dialog window first. + * + * @property {String} dialog + */ + +/** + * The template which will be used to create a new widget element (when the widget's command is executed). + * This string is populated with {@link #defaults default values} by using the {@link CKEDITOR.template} format. + * Therefore it has to be a valid {@link CKEDITOR.template} argument. + * + * @property {String} template + */ + +/** + * The data object which will be used to populate the data of a newly created widget. + * See {@link CKEDITOR.plugins.widget#property-data}. + * + * defaults: { + * showCaption: true, + * align: 'none' + * } + * + * @property defaults + */ + +/** + * An object containing definitions of widget components (part name => CSS selector). + * + * parts: { + * image: 'img', + * caption: 'div.caption' + * } + * + * @property parts + */ + +/** + * An object containing definitions of nested editables (editable name => {@link CKEDITOR.plugins.widget.nestedEditable.definition}). + * + * editables: { + * header: 'h1', + * content: { + * selector: 'div.content', + * allowedContent: 'p strong em; a[!href]' + * } + * } + * + * @property editables + */ + +/** + * Widget name displayed in elements path. + * + * @property {String} pathName + */ + +/** + * If set to `true`, the widget's element will be covered with a transparent mask. + * This will prevent its content from being clickable, which matters in case + * of special elements like embedded Flash or iframes that generate a separate "context". + * + * @property {Boolean} mask + */ + +/** + * If set to `true/false`, it will force the widget to be either an inline or a block widget. + * If not set, the widget type will be determined from the widget element. + * + * Widget type influences whether a block (`div`) or an inline (`span`) element is used + * for the wrapper. + * + * @property {Boolean} inline + */ + +/** + * The label for the widget toolbar button. + * + * editor.widgets.add( 'simplebox', { + * button: 'Create a simple box' + * } ); + * + * editor.widgets.add( 'simplebox', { + * button: editor.lang.simplebox.title + * } ); + * + * @property {String} button + */ + +/** + * Whether widget should be draggable. Defaults to `true`. + * If set to `false` drag handler will not be displayed when hovering widget. + * + * @property {Boolean} draggable + */ + +/** + * Names of element(s) (separated by spaces) for which the {@link CKEDITOR.filter} should allow classes + * defined in the widget styles. For example if your widget is upcasted from a simple `
      ` + * element, then in order to make it styleable you can set: + * + * editor.widgets.add( 'customWidget', { + * upcast: function( element ) { + * return element.name == 'div'; + * }, + * + * // ... + * + * styleableElements: 'div' + * } ); + * + * Then, when the following style is defined: + * + * { + * name: 'Thick border', type: 'widget', widget: 'customWidget', + * attributes: { 'class': 'thickBorder' } + * } + * + * a rule allowing the `thickBorder` class for `div` elements will be registered in the {@link CKEDITOR.filter}. + * + * If you need to have more freedom when transforming widget style to allowed content rules, + * you can use the {@link #styleToAllowedContentRules} callback. + * + * @since 4.4 + * @property {String} styleableElements + */ + +/** + * Function transforming custom widget's {@link CKEDITOR.style} instance into + * {@link CKEDITOR.filter.allowedContentRules}. It may be used when a static + * {@link #styleableElements} property is not enough to inform the {@link CKEDITOR.filter} + * what HTML features should be enabled when allowing the given style. + * + * In most cases, when style's classes just have to be added to element name(s) used by + * the widget element, it is recommended to use simpler {@link #styleableElements} property. + * + * In order to get parsed classes from the style definition you can use + * {@link CKEDITOR.style.customHandlers.widget#getClassesArray}. + * + * For example, if you want to use the [object format of allowed content rules](#!/guide/dev_allowed_content_rules-section-object-format), + * to specify `match` validator, your implementation could look like this: + * + * editor.widgets.add( 'customWidget', { + * // ... + * + * styleToAllowedContentRules: funciton( style ) { + * // Retrieve classes defined in the style. + * var classes = style.getClassesArray(); + * + * // Do something crazy - for example return allowed content rules in object format, + * // with custom match property and propertiesOnly flag. + * return { + * h1: { + * match: isWidgetElement, + * propertiesOnly: true, + * classes: classes + * } + * }; + * } + * } ); + * + * @since 4.4 + * @property {Function} styleToAllowedContentRules + * @param {CKEDITOR.style.customHandlers.widget} style The style to be transformed. + * @returns {CKEDITOR.filter.allowedContentRules} + */ + +/** + * This is an abstract class that describes the definition of a widget's nested editable. + * It is a type of values in the {@link CKEDITOR.plugins.widget.definition#editables} object. + * + * In the simplest case the definition is a string which is a CSS selector used to + * find an element that will become a nested editable inside the widget. Note that + * the widget element can be a nested editable, too. + * + * In the more advanced case a definition is an object with a required `selector` property. + * + * editables: { + * header: 'h1', + * content: { + * selector: 'div.content', + * allowedContent: 'p strong em; a[!href]' + * } + * } + * + * @class CKEDITOR.plugins.widget.nestedEditable.definition + * @abstract + */ + +/** + * The CSS selector used to find an element which will become a nested editable. + * + * @property {String} selector + */ + +/** + * The [Advanced Content Filter](#!/guide/dev_advanced_content_filter) rules + * which will be used to limit the content allowed in this nested editable. + * This option is similar to {@link CKEDITOR.config#allowedContent} and one can + * use it to limit the editor features available in the nested editable. + * + * @property {CKEDITOR.filter.allowedContentRules} allowedContent + */ + +/** + * Nested editable name displayed in elements path. + * + * @property {String} pathName + */ diff --git a/static/assets/ckeditor/plugins/wsc/LICENSE.md b/static/assets/ckeditor/plugins/wsc/LICENSE.md new file mode 100644 index 0000000..6096de2 --- /dev/null +++ b/static/assets/ckeditor/plugins/wsc/LICENSE.md @@ -0,0 +1,28 @@ +Software License Agreement +========================== + +**CKEditor WSC Plugin** +Copyright © 2012, [CKSource](http://cksource.com) - Frederico Knabben. All rights reserved. + +Licensed under the terms of any of the following licenses at your choice: + +* GNU General Public License Version 2 or later (the "GPL"): + http://www.gnu.org/licenses/gpl.html + +* GNU Lesser General Public License Version 2.1 or later (the "LGPL"): + http://www.gnu.org/licenses/lgpl.html + +* Mozilla Public License Version 1.1 or later (the "MPL"): + http://www.mozilla.org/MPL/MPL-1.1.html + +You are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled "legal.txt" in your version of this software, indicating your license choice. + +Sources of Intellectual Property Included in this plugin +-------------------------------------------------------- + +Where not otherwise indicated, all plugin content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, the plugin will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. diff --git a/static/assets/ckeditor/plugins/wsc/README.md b/static/assets/ckeditor/plugins/wsc/README.md new file mode 100644 index 0000000..346e2ab --- /dev/null +++ b/static/assets/ckeditor/plugins/wsc/README.md @@ -0,0 +1,25 @@ +CKEditor WebSpellChecker Plugin +=============================== + +This plugin brings Web Spell Checker (WSC) into CKEditor. + +WSC is "installation-less", using the web-services of [WebSpellChecker.net](http://www.webspellchecker.net/). It's an out of the box solution. + +Installation +------------ + +1. Clone/copy this repository contents in a new "plugins/wsc" folder in your CKEditor installation. +2. Enable the "wsc" plugin in the CKEditor configuration file (config.js): + + config.extraPlugins = 'wsc'; + +That's all. WSC will appear on the editor toolbar and will be ready to use. + +License +------- + +Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html). + +See LICENSE.md for more information. + +Developed in cooperation with [WebSpellChecker.net](http://www.webspellchecker.net/). diff --git a/static/assets/ckeditor/plugins/wsc/dialogs/ciframe.html b/static/assets/ckeditor/plugins/wsc/dialogs/ciframe.html new file mode 100644 index 0000000..8e0a10d --- /dev/null +++ b/static/assets/ckeditor/plugins/wsc/dialogs/ciframe.html @@ -0,0 +1,66 @@ + + + + + + + + +

      + diff --git a/static/assets/ckeditor/plugins/wsc/dialogs/tmpFrameset.html b/static/assets/ckeditor/plugins/wsc/dialogs/tmpFrameset.html new file mode 100644 index 0000000..61203e0 --- /dev/null +++ b/static/assets/ckeditor/plugins/wsc/dialogs/tmpFrameset.html @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + diff --git a/static/assets/ckeditor/plugins/wsc/dialogs/wsc.css b/static/assets/ckeditor/plugins/wsc/dialogs/wsc.css new file mode 100644 index 0000000..da2f174 --- /dev/null +++ b/static/assets/ckeditor/plugins/wsc/dialogs/wsc.css @@ -0,0 +1,82 @@ +/* +Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ + +html, body +{ + background-color: transparent; + margin: 0px; + padding: 0px; +} + +body +{ + padding: 10px; +} + +body, td, input, select, textarea +{ + font-size: 11px; + font-family: 'Microsoft Sans Serif' , Arial, Helvetica, Verdana; +} + +.midtext +{ + padding:0px; + margin:10px; +} + +.midtext p +{ + padding:0px; + margin:10px; +} + +.Button +{ + border: #737357 1px solid; + color: #3b3b1f; + background-color: #c7c78f; +} + +.PopupTabArea +{ + color: #737357; + background-color: #e3e3c7; +} + +.PopupTitleBorder +{ + border-bottom: #d5d59d 1px solid; +} +.PopupTabEmptyArea +{ + padding-left: 10px; + border-bottom: #d5d59d 1px solid; +} + +.PopupTab, .PopupTabSelected +{ + border-right: #d5d59d 1px solid; + border-top: #d5d59d 1px solid; + border-left: #d5d59d 1px solid; + padding: 3px 5px 3px 5px; + color: #737357; +} + +.PopupTab +{ + margin-top: 1px; + border-bottom: #d5d59d 1px solid; + cursor: pointer; +} + +.PopupTabSelected +{ + font-weight: bold; + cursor: default; + padding-top: 4px; + border-bottom: #f1f1e3 1px solid; + background-color: #f1f1e3; +} diff --git a/static/assets/ckeditor/plugins/wsc/dialogs/wsc.js b/static/assets/ckeditor/plugins/wsc/dialogs/wsc.js new file mode 100644 index 0000000..b53a48c --- /dev/null +++ b/static/assets/ckeditor/plugins/wsc/dialogs/wsc.js @@ -0,0 +1,74 @@ +/* + Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +(function(){function q(a){return a&&a.domId&&a.getInputElement().$?a.getInputElement():a&&a.$?a:!1}function z(a){if(!a)throw"Languages-by-groups list are required for construct selectbox";var c=[],d="",f;for(f in a)for(var g in a[f]){var h=a[f][g];"en_US"==h?d=h:c.push(h)}c.sort();d&&c.unshift(d);return{getCurrentLangGroup:function(c){a:{for(var d in a)for(var f in a[d])if(f.toUpperCase()===c.toUpperCase()){c=d;break a}c=""}return c},setLangList:function(){var c={},d;for(d in a)for(var f in a[d])c[a[d][f]]= +f;return c}()}}var e=function(){var a=function(a,b,f){var f=f||{},g=f.expires;if("number"==typeof g&&g){var h=new Date;h.setTime(h.getTime()+1E3*g);g=f.expires=h}g&&g.toUTCString&&(f.expires=g.toUTCString());var b=encodeURIComponent(b),a=a+"="+b,e;for(e in f)b=f[e],a+="; "+e,!0!==b&&(a+="="+b);document.cookie=a};return{postMessage:{init:function(a){window.addEventListener?window.addEventListener("message",a,!1):window.attachEvent("onmessage",a)},send:function(a){var b=Object.prototype.toString,f= +a.fn||null,g=a.id||"",e=a.target||window,i=a.message||{id:g};a.message&&"[object Object]"==b.call(a.message)&&(a.message.id||(a.message.id=g),i=a.message);a=window.JSON.stringify(i,f);e.postMessage(a,"*")},unbindHandler:function(a){window.removeEventListener?window.removeEventListener("message",a,!1):window.detachEvent("onmessage",a)}},hash:{create:function(){},parse:function(){}},cookie:{set:a,get:function(a){return(a=document.cookie.match(RegExp("(?:^|; )"+a.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, +"\\$1")+"=([^;]*)")))?decodeURIComponent(a[1]):void 0},remove:function(c){a(c,"",{expires:-1})}},misc:{findFocusable:function(a){var b=null;a&&(b=a.find("a[href], area[href], input, select, textarea, button, *[tabindex], *[contenteditable]"));return b},isVisible:function(a){return!(0===a.offsetWidth||0==a.offsetHeight||"none"===(document.defaultView&&document.defaultView.getComputedStyle?document.defaultView.getComputedStyle(a,null).display:a.currentStyle?a.currentStyle.display:a.style.display))}, +hasClass:function(a,b){return!(!a.className||!a.className.match(RegExp("(\\s|^)"+b+"(\\s|$)")))}}}}(),a=a||{};a.TextAreaNumber=null;a.load=!0;a.cmd={SpellTab:"spell",Thesaurus:"thes",GrammTab:"grammar"};a.dialog=null;a.optionNode=null;a.selectNode=null;a.grammerSuggest=null;a.textNode={};a.iframeMain=null;a.dataTemp="";a.div_overlay=null;a.textNodeInfo={};a.selectNode={};a.selectNodeResponce={};a.langList=null;a.langSelectbox=null;a.banner="";a.show_grammar=null;a.div_overlay_no_check=null;a.targetFromFrame= +{};a.onLoadOverlay=null;a.LocalizationComing={};a.OverlayPlace=null;a.LocalizationButton={ChangeTo:{instance:null,text:"Change to"},ChangeAll:{instance:null,text:"Change All"},IgnoreWord:{instance:null,text:"Ignore word"},IgnoreAllWords:{instance:null,text:"Ignore all words"},Options:{instance:null,text:"Options",optionsDialog:{instance:null}},AddWord:{instance:null,text:"Add word"},FinishChecking:{instance:null,text:"Finish Checking"}};a.LocalizationLabel={ChangeTo:{instance:null,text:"Change to"}, +Suggestions:{instance:null,text:"Suggestions"}};var A=function(b){var c,d;for(d in b)c=b[d].instance.getElement().getFirst()||b[d].instance.getElement(),c.setText(a.LocalizationComing[d])},B=function(b){for(var c in b){if(!b[c].instance.setLabel)break;b[c].instance.setLabel(a.LocalizationComing[c])}},j,r;a.framesetHtml=function(b){return"'}; +a.setIframe=function(b,c){var d;d=a.framesetHtml(c);var f=a.iframeNumber+"_"+c;b.getElement().setHtml(d);d=document.getElementById(f);d=d.contentWindow?d.contentWindow:d.contentDocument.document?d.contentDocument.document:d.contentDocument;d.document.open();d.document.write('iframe
      +{% end %} \ No newline at end of file diff --git a/templates/admin/base.htm b/templates/admin/base.htm new file mode 100644 index 0000000..d54eb63 --- /dev/null +++ b/templates/admin/base.htm @@ -0,0 +1,54 @@ + + + + + + {% block header_title %}Site Title{% end %} + + + + + + + + + + {% block header_static %}{% end %} + + + + +
      +
      + Minos 后台管理面板 +
      + + + +
      + + +
      +
      + +{% block body %}Hello world{% end %} + +
      +
      +

      © 2015 Minos, Inc. Licensed under MIT license.

      +
      + + + + + +{% block footer_static %}{% end %} + + + + \ No newline at end of file diff --git a/templates/admin/error.htm b/templates/admin/error.htm new file mode 100644 index 0000000..7fa7ec1 --- /dev/null +++ b/templates/admin/error.htm @@ -0,0 +1,32 @@ +{% extends "base.htm" %} +{% block header_title %}提示 - 后台管理页面{% end %} + +{% block body %} +
      + {% include "sidebar.htm" %} + + +
      + +
      +
      提示页面 / {{ error_title }}
      +
      + +
      +
      +
      + +

      {{ error_info }}

      +
      +

      点击返回...

      +
      +
      + +
      + + +
      + + + +{% end %} \ No newline at end of file diff --git a/templates/admin/index.htm b/templates/admin/index.htm new file mode 100644 index 0000000..474aeb7 --- /dev/null +++ b/templates/admin/index.htm @@ -0,0 +1,60 @@ +{% extends "base.htm" %} +{% block header_title %}后台管理首页{% end %} + +{% block body %} +
      + {% include "sidebar.htm" %} + + +
      + +
      +
      首页 / 站点统计
      +
      + + + +
      +
      新注册的用户
      +
      + +
      +
      + + + + + + + + {% set i = 1 %} + {% for user in newusers %} + + + + + + + + {% set i += 1 %} + {% end %} + +
      ID用户名最近登录时间金币管理
      {{ i }}{{ user["username"] }}{{ humantime(user.get('logintime', user.get('time'))) }}{{ user['money'] }} + 查看详情 +
      +
      +
      + +
      + + +
      + + + +{% end %} \ No newline at end of file diff --git a/templates/admin/invite.htm b/templates/admin/invite.htm new file mode 100644 index 0000000..2426ba6 --- /dev/null +++ b/templates/admin/invite.htm @@ -0,0 +1,91 @@ +{% extends "base.htm" %} +{% block header_title %}邀请码管理 - 后台管理页面{% end %} + +{% block body %} +
      + {% include "sidebar.htm" %} + + +
      + +
      +
      首页 / 邀请码列表
      +
      + +
      +
      +
      +
      + + +
      + + +
      +
      + + {% raw xsrf_form_html() %} +
      +
      +
      + + + + + + + + {% set i = 1 %} + {% for invite in invites %} + + + + + + + + {% set i += 1 %} + {% end %} + +
      ID邀请码生成时间使用者管理
      {{ i }}{{ invite["code"] }}{{ humantime(invite.get('time')) }} + {% if invite.get('used') %} + {{ invite['user'] }} + {% else %} + 尚未使用 + {% end %} + +
      +
      + + + + +
      + {% raw xsrf_form_html() %} +
      +
      + {% raw pagenav(count = count, url = '/manage/invite/%d', each = each, now = page, + end = '
      ') %} +
      +
      +
      + +
      + + +
      + + + +{% end %} +{% block footer_static %} + +{% end %} \ No newline at end of file diff --git a/templates/admin/setting.htm b/templates/admin/setting.htm new file mode 100644 index 0000000..4812ce2 --- /dev/null +++ b/templates/admin/setting.htm @@ -0,0 +1,116 @@ +{% extends "base.htm" %} +{% block header_title %}网站设置 - 后台管理页面{% end %} + +{% block body %} +
      + {% include "sidebar.htm" %} + + +
      + +
      +
      首页 / + 网站设置
      +
      + +
      + +
      +
      +
      +
      +
      +

      网站设置

      + +
      +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      + +
      + +
      + + 重新设置后网站所有用户将需要重新登录 +
      +
      + +
      + +
      + + + +
      +
      + +
      + +
      + + 新用户注册后送金币 +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      +
      + +
      +
      + {% raw xsrf_form_html() %} +
      +
      +
      + +
      + + +
      + + + +{% end %} \ No newline at end of file diff --git a/templates/admin/sidebar.htm b/templates/admin/sidebar.htm new file mode 100644 index 0000000..520c405 --- /dev/null +++ b/templates/admin/sidebar.htm @@ -0,0 +1,26 @@ + +
      +
      + + +
      +
      +

      公告

      +

      这是Minos第一版的论坛,各种功能尚待完善

      +
      +
      +
      +
      + \ No newline at end of file diff --git a/templates/admin/sort.htm b/templates/admin/sort.htm new file mode 100644 index 0000000..f1c51d7 --- /dev/null +++ b/templates/admin/sort.htm @@ -0,0 +1,51 @@ +{% extends "base.htm" %} +{% block header_title %}板块(节点)管理 - 后台管理页面{% end %} + +{% block body %} +
      + {% include "sidebar.htm" %} + + +
      + +
      +
      首页 / 板块(节点)管理
      +
      + +
      +
      + + + + + + + + {% set i = 1 %} + {% for sort in sorts %} + + + + + + + + {% set i += 1 %} + {% end %} + +
      ID版块名称首页显示文章数量管理
      {{ i }}{{ sort['name'] }}{% if sort['show'] %}是{% else %}否{% end %}{{ sort.get('article') }} + 查看详情 +
      + {% raw pagenav(count = count, url = '/manage/sort/%d', each = each, now = page, + end = '
      ') %} +
      +
      + +
      + + +
      + + + +{% end %} \ No newline at end of file diff --git a/templates/admin/sortdetail.htm b/templates/admin/sortdetail.htm new file mode 100644 index 0000000..ed4f7b5 --- /dev/null +++ b/templates/admin/sortdetail.htm @@ -0,0 +1,95 @@ +{% extends "base.htm" %} +{% block header_title %}板块 {{ sort["name"] }} 管理 - 后台管理页面{% end %} + +{% block body %} +
      + {% include "sidebar.htm" %} + + +
      + +
      +
      首页 / + 板块 / + 板块 {{ sort["name"] }} 管理
      +
      + +
      + +
      +
      +
      +
      +
      +

      用户头像

      +
      +
      +
      +
      + +
      +
      + + +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      +
      + +
      +
      + + {% raw xsrf_form_html() %} +
      +
      +
      + +
      + + +
      + + + +{% end %} \ No newline at end of file diff --git a/templates/admin/userdetail.htm b/templates/admin/userdetail.htm new file mode 100644 index 0000000..2097f05 --- /dev/null +++ b/templates/admin/userdetail.htm @@ -0,0 +1,138 @@ +{% extends "base.htm" %} +{% block header_title %}{{ user["username"] }}的资料 - 后台管理页面{% end %} + +{% block body %} +
      + {% include "sidebar.htm" %} + + +
      + +
      +
      首页 / {{ user['username'] }} 的资料
      +
      + +
      + +
      +
      +
      +
      +
      + +
      +
      +

      用户头像

      +
      +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + + 20为管理员,0为普通用户,-1为禁用 +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      +
      + +
      +
      + + {% raw xsrf_form_html() %} +
      +
      +
      + +
      + + +
      + + + +{% end %} \ No newline at end of file diff --git a/templates/admin/userlist.htm b/templates/admin/userlist.htm new file mode 100644 index 0000000..9a42865 --- /dev/null +++ b/templates/admin/userlist.htm @@ -0,0 +1,61 @@ +{% extends "base.htm" %} +{% block header_title %}用户管理 - 后台管理页面{% end %} + +{% block body %} +
      + {% include "sidebar.htm" %} + + +
      + +
      +
      首页 / 用户列表
      +
      + +
      +
      +
      +
      + + + + +
      +
      +
      +
      + + + + + + + + {% set i = 1 %} + {% for user in users %} + + + + + + + + {% set i += 1 %} + {% end %} + +
      ID用户名最近登录时间金币管理
      {{ i }}{{ user["username"] }}{{ humantime(user.get('logintime', user.get('time'))) }}{{ user['money'] }} + 查看详情 +
      + {% raw pagenav(count = count, url = '/manage/user/%d' + search, each = each, now = page, + end = '
      ') %} +
      +
      + +
      + + +
      + + + +{% end %} \ No newline at end of file diff --git a/templates/base.htm b/templates/base.htm new file mode 100644 index 0000000..f0bfec6 --- /dev/null +++ b/templates/base.htm @@ -0,0 +1,37 @@ + + + + + + + + {% block header_title %}Site Title{% end %} - {{ handler.settings['site']['webname'] }} + + + + + + {% block header_static %}{% end %} + + +
      +{% block body %}Hello world! {% end %} +
      + + + + + + + +{% block footer_static %}{% end %} + + \ No newline at end of file diff --git a/templates/bookmark.htm b/templates/bookmark.htm new file mode 100644 index 0000000..9bbdba3 --- /dev/null +++ b/templates/bookmark.htm @@ -0,0 +1,59 @@ +{% extends "base.htm" %} + +{% block header_title %}{{ current_user.get('username') }}的书签{% end %} +{% block body %} +{% include "header.htm" %} + +
      +
      +
      +
      +
      +
        +
      1. 首页
      2. +
      3. {{ current_user.get('username') }} 的书签
      4. +
      +
      +
      + 总共收藏了{{ count }}篇文章 +
      + + + + + + + + {% for post in bookmark %} + + + + + + + {% end %} +
      作者标题板块操作
      {{ post['title'] }}{{ post.get("sort").get("name") }} +
      + 取消 + + {% raw xsrf_form_html() %} +
      +
      + +
      +
      +
      + {% include "self.htm" %} +
      +
      +
      + + +{% end %} +{% block footer_static %} + + +{% end %} \ No newline at end of file diff --git a/templates/dashboard.htm b/templates/dashboard.htm new file mode 100644 index 0000000..5982178 --- /dev/null +++ b/templates/dashboard.htm @@ -0,0 +1,124 @@ +{% extends "base.htm" %} + +{% block header_title %}控制面板{% end %} +{% block body %} +{% include "header.htm" %} +
      + + +
      + +
      +
      任务 / Task
      +
      + +
      + + +
      +
      +
      +
      + + + + + + + + + + + + {% set i = 1 %} + {% for task in tasks %} + + + + + + + + {% set i += 1 %} + {% end %} + +
      #文件名大小进度管理
      {{ i }}{{ task['filename'] }}{{ getsize(task['savepath']) }}已完成{% else %}warning">未完成{% + end %} + + +
      +
      +
      +
      + +
      +
      + +
      +
      + +
      +
      + 下载链接 +
      +
      + +
      +
      + +
      +
      + 储存文件名 +
      +
      + +
      +
      为空则随机生成文件名
      +
      + +
      +
      +
      + +
      +
      + {% raw xsrf_form_html() %} +
      +
      + +
      +
      +
      + + +
      +
      +
      MessageBox
      +
      + 确定删除这个任务? +
      + +
      +
      + +
      +{% end %} +{% block footer_static %} + +{% end %} \ No newline at end of file diff --git a/templates/edit.htm b/templates/edit.htm new file mode 100644 index 0000000..cdec286 --- /dev/null +++ b/templates/edit.htm @@ -0,0 +1,54 @@ +{% extends "base.htm" %} + +{% block header_title %}文章编辑{% end %} +{% block body %} +{% include "header.htm" %} + +
      +
      +
      +
      + 文章标题 + +
      +
      +
      板块
      +
      + +
      + +
      + {% set text = flash['article'] %} + +
      +
      +
      + 收费 + + 金币 +
      +
      + 免费时段 + + + +
      +
      +
      + + + {% raw xsrf_form_html() %} +
      +
      +
      + + +{% end %} +{% block footer_static %} + + +{% end %} \ No newline at end of file diff --git a/templates/error.htm b/templates/error.htm new file mode 100644 index 0000000..d4437d3 --- /dev/null +++ b/templates/error.htm @@ -0,0 +1,18 @@ +{% extends "base.htm" %} + +{% block header_title %}{{ error_title }}{% end %} +{% block body %} +{% include "header.htm" %} +
      +
      + +

      {{ error_title }}

      +

      {{ error_info }}

      + 点击返回 +
      +
      + +{% end %} +{% block footer_static %} + +{% end %} \ No newline at end of file diff --git a/templates/face.htm b/templates/face.htm new file mode 100644 index 0000000..8ca35d1 --- /dev/null +++ b/templates/face.htm @@ -0,0 +1,52 @@ +{% extends "base.htm" %} + +{% block header_title %}头像上传{% end %} +{% block header_static %} + +{% end %} +{% block body %} +{% include "header.htm" %} +
      +
      +
      +
      +
      +
      Loading...
      +
      +
      + + + + +
      +
      +
      +
      +
      +
      + +
      +
      +
      + +
      +
      +
      上传出错
      +
      + 上传出错,请重试 +
      + +
      +
      + +{% end %} +{% block footer_static %} + + +{% end %} \ No newline at end of file diff --git a/templates/forgetpwd.htm b/templates/forgetpwd.htm new file mode 100644 index 0000000..bda59b7 --- /dev/null +++ b/templates/forgetpwd.htm @@ -0,0 +1,55 @@ +{% extends "base.htm" %} + +{% block header_title %}找回密码{% end %} +{% block body %} +{% include "header.htm" %} +
      +
      +
      找回密码 填写了邮箱的用户可以找回密码
      +
      + +
      + {% if success %} +
      + +

      邮件已经发送到你的邮箱啦,请进入邮箱修改密码。

      +
      + {% end %} + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      +
      + +
      +
      +
      +
      +
      + 返回 + +
      +
      +
      + {% raw xsrf_form_html() %} +
      + +
      +
      +
      +{% end %} +{% block footer_static %} + +{% end %} \ No newline at end of file diff --git a/templates/header.htm b/templates/header.htm new file mode 100644 index 0000000..59adc1e --- /dev/null +++ b/templates/header.htm @@ -0,0 +1,54 @@ +
      +
      +

      + Minos +

      + + + +
      + + + + +
      +
      +
      \ No newline at end of file diff --git a/templates/like.htm b/templates/like.htm new file mode 100644 index 0000000..8312663 --- /dev/null +++ b/templates/like.htm @@ -0,0 +1,58 @@ +{% extends "base.htm" %} + +{% block header_title %}{{ current_user.get('username') }}喜欢的文章{% end %} +{% block body %} +{% include "header.htm" %} + +
      +
      +
      +
      +
      +
        +
      1. 首页
      2. +
      3. {{ current_user.get('username') }} 喜欢的文章
      4. +
      +
      +
      + 你总共顶过{{ count }}篇文章 +
      + + + + + + + + {% for post in posts %} + + + + + + + {% end %} +
      作者标题板块操作
      {{ post['title'] }}{{ post.get('sort').get('name') }} +
      + + + {% raw xsrf_form_html() %} +
      +
      + +
      +
      +
      + {% include "self.htm" %} +
      +
      +
      + +{% end %} +{% block footer_static %} + + +{% end %} \ No newline at end of file diff --git a/templates/login.htm b/templates/login.htm new file mode 100644 index 0000000..b50406b --- /dev/null +++ b/templates/login.htm @@ -0,0 +1,64 @@ +{% extends "base.htm" %} + +{% block header_title %}用户登录{% end %} +{% block body %} +{% include "header.htm" %} +
      +
      +

      登录

      +
      + +
      +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + + {% if handler.settings['captcha']['login'] %} +
      + +
      + +
      +
      + +
      +
      + {% end %} + +
      +
      + +
      +
      + +
      +
      +
      + +
      +
      +
      + {% raw xsrf_form_html() %} +
      + +
      +
      +
      +{% end %} +{% block footer_static %} + +{% end %} \ No newline at end of file diff --git a/templates/main.htm b/templates/main.htm new file mode 100644 index 0000000..7932e24 --- /dev/null +++ b/templates/main.htm @@ -0,0 +1,58 @@ +{% extends "base.htm" %} + +{% block header_title %}主页{% end %} +{% block body %} +{% include "header.htm" %} +
      +
      +
      +
      +

      福利の社

      +
      +
      + {% for sort in sorts %} + {{ sort["name"] }} + {% end %} + +
      + + + + + + + + {% for post in posts %} + + + + + + + {% end %} +
      时间标题状态作者
      + {% if post.get('star') %}[精华]{% end %} + + {{ post['title'] }} + + + {% if post['charge'] and current_user["username"] not in post["buyer"] %} + {{ post['charge'] }}金币 + {% elif current_user["username"] in post["buyer"] %} + 已购买 + {% else %} + 免费 + {% end %} + {{ post['user'] }}
      + +
      +
      +
      + +{% end %} +{% block footer_static %} + +{% end %} \ No newline at end of file diff --git a/templates/message.htm b/templates/message.htm new file mode 100644 index 0000000..699ca1d --- /dev/null +++ b/templates/message.htm @@ -0,0 +1,67 @@ +{% extends "base.htm" %} + +{% block header_title %}{{ current_user["username"] }}的信箱{% end %} +{% block body %} +{% include "header.htm" %} + +
      +
      +
      +
      +
      +
        +
      1. 首页
      2. +
      3. {{ current_user['username'] }} 的信箱
      4. +
      +
      + {% if messages %} +
        + {% for message in messages %} + {% if not message['from'] %} + {% set message['from'] = '系统' %} + {% end %} + {% if not message['read'] %} +
      • {{ message['from'] }} 给 {{ message['to'] }} 的消息: + {{ message['content'] }}
      • + {% else %} +
      • {{ message['from'] }} 给 {{ message['to'] }} 的消息: + {{ message['content'] }}
      • + {% end %} + {% end %} +
      + {% else %} +
      + 没有短消息哦 +
      + {% end %} +
      +
      +
      + {% include "self.htm" %} +
      +
      短消息管理
      + + +
      +
      +
      +
      + + +{% end %} +{% block footer_static %} + + +{% end %} \ No newline at end of file diff --git a/templates/msgdetail.htm b/templates/msgdetail.htm new file mode 100644 index 0000000..bf54b3e --- /dev/null +++ b/templates/msgdetail.htm @@ -0,0 +1,40 @@ +{% extends "base.htm" %} + +{% block header_title %}短消息详情{% end %} +{% block body %} +{% include "header.htm" %} + {% if not message['from'] %} + {% set message['from'] = '系统' %} + {% end %} +
      +
      +
      +
      +
      +
        +
      1. 首页
      2. +
      3. 短消息
      4. +
      5. {{ message['from'] }} 给 {{ message['to'] }} 的短消息
      6. +
      +
      +
      + {{ message['content'] }} +
      + {% if message.get('jump') %} + + {% end %} +
      +
      +
      + {% include "self.htm" %} +
      +
      +
      + + +{% end %} +{% block footer_static %} + +{% end %} \ No newline at end of file diff --git a/templates/open_list.htm b/templates/open_list.htm new file mode 100644 index 0000000..00ca2fd --- /dev/null +++ b/templates/open_list.htm @@ -0,0 +1,53 @@ +{% extends "base.htm" %} + +{% block header_title %}主页{% end %} +{% block body %} +{% include "header.htm" %} +
      +
      +
      +
      +

      福利の社

      +
      +
      + Minos社区是一个平等、自由的社区,并通过各种有意思的安全知识、漏洞分享,来提高每个成员。 +
      + + + + + + + + {% for post in posts %} + + + + + + + {% end %} +
      时间标题状态作者
      + {% if post.get('star') %}[精华]{% end %} + + {{ post['title'] }} + + + {% if post['charge'] %} + {{ post['charge'] }}金币 + {% else %} + 免费 + {% end %} + {{ post['user'] }}
      + +
      +
      +
      + +{% end %} +{% block footer_static %} + +{% end %} \ No newline at end of file diff --git a/templates/open_post.htm b/templates/open_post.htm new file mode 100644 index 0000000..717f380 --- /dev/null +++ b/templates/open_post.htm @@ -0,0 +1,139 @@ +{% extends "base.htm" %} + +{% block header_title %}{{ post["title"] }}{% end %} +{% block header_static %} + +{% end %} +{% block body %} +{% include "header.htm" %} + +
      +
      +
      +
      +
      +
      +
      +
      + {{ post["title"] }}
      + + {{ user.get('username') }} 发表于 {{ humantime(post['time'], span = True) }} +  {{ post["sort"]["name"] }} +
      +
      +
      +
      +
      +
      +
      + {% raw post["content"] %} +
      +
      +
      +
        + {% if post.get("rank") != 0 or post.get('star') %} +
      • + {% if post.get("rank") > 0 %}奖励{{ post.get('rank') }}金币{% end %} + {% if post.get("rank") < 0 %}惩罚{{ -post.get('rank') }}金币{% end %} + {% if post.get('star') %}加精{% end %} + 管理员对帖子进行了操作 +
      • + {% end %} + {% if len(post['thanks']) %} +
      • + 共{{ len(post['thanks']) }}个感谢 + {% set thx_user = ','.join(post['thanks']) %} + 他们感谢过作者:{{ thx_user }} +
      • + {% end %} + {% if post['charge'] and len(post['buyer']) %} +
      • + 共{{ len(post['buyer']) }}次购买 + {% set buy_user = ','.join(post['buyer']) %} + 他们购买了帖子:{{ buy_user }} +
      • + {% end %} +
      +
      +
      + 分享到: + + + +
      +
      +
      +
      + {% if len(post["comment"]) %} +
        + {% for comment in post["comment"] %} +
      • + + + + +
        +
        +
        + {{ comment['user']['username'] }} 评论于 {{ humantime(comment['time']) }} +
        +
        +
        +

        {% raw nl2br(comment['content']) %}

        +
        +
        +
      • + {% end %} +
      + {% else %} + 还没有人评论,你不要顶一下楼主么? + {% end %} +
      +
      +
      + 登录以后才可以发表评论~ 点击注册 点击登录 +
      +
      +
      + +
      + +
      +
      +

      + + {{ user["username"] }} + +

      + +

      +

      {{ user.get('signal') }}
      +

      +
      +
      + +
      +
      +
      + +
      +
      +
      微信扫描分享 + × +
      +
      +
      +
      +
      +
      + +{% end %} +{% block footer_static %} + + + + +{% end %} \ No newline at end of file diff --git a/templates/post.htm b/templates/post.htm new file mode 100644 index 0000000..7df3114 --- /dev/null +++ b/templates/post.htm @@ -0,0 +1,209 @@ +{% extends "base.htm" %} + +{% block header_title %}{{ post["title"] }}{% end %} +{% block header_static %} + +{% end %} +{% block body %} +{% include "header.htm" %} + +
      +
      +
      +
      +
      +
      +
      +
      + {{ post["title"] }}
      + + {{ user.get('username') }} 发表于 {{ humantime(post['time'], span = True) }} +  {{ post["sort"]["name"] }} +
      + +
      +
      +
      +
      + {% raw post["content"] %} +
      +
      +
      +
        + {% if post.get("rank") != 0 or post.get('star') %} +
      • + {% if post.get("rank") > 0 %}奖励{{ post.get('rank') }}金币{% end %} + {% if post.get("rank") < 0 %}惩罚{{ -post.get('rank') }}金币{% end %} + {% if post.get('star') %}加精{% end %} + 管理员对帖子进行了操作 +
      • + {% end %} + {% if len(post['thanks']) %} +
      • + 共{{ len(post['thanks']) }}个感谢 + {% set thx_user = ','.join(post['thanks']) %} + 他们感谢过作者:{{ thx_user }} +
      • + {% end %} + {% if post['charge'] and len(post['buyer']) %} +
      • + 共{{ len(post['buyer']) }}次购买 + {% set buy_user = ','.join(post['buyer']) %} + 他们购买了帖子:{{ buy_user }} +
      • + {% end %} +
      +
      +
      + 收藏: +   + 感谢: +   + 分享到: + + + +
      +
      +
      +
      + {% if len(post["comment"]) %} +
        + {% for comment in post["comment"] %} +
      • + + + + +
        +
        +
        + {{ comment['user']['username'] }} 评论于 {{ humantime(comment['time']) }} +
        +
        +
         
        +
        + {% if power == "admin" %} +
        + 删除 + + + {% raw xsrf_form_html() %} +
        + {% end %} +
        +
        + 回复 +
        +
        +
        +
        +

        {% raw nl2br(comment['content']) %}

        +
        +
        +
      • + {% end %} +
      + {% else %} + 还没有人评论,你不要顶一下楼主么? + {% end %} +
      +
      +
      +
      +
      + + +
      + {% if handler.settings["captcha"]["comment"] %} +
      +
      +
      + +
      +
      + +
      +
      +
      +
      + {% end %} + + + {% raw xsrf_form_html() %} +
      +
      +
      +
      + +
      + {% include "self.htm" %} + {% if is_edit(post) or power == "admin" %} +
      +
      编辑文章
      + +
      + {% end %} +
      +
      +
      + +
      +
      +
      微信扫描分享 + × +
      +
      +
      +
      +
      +
      + +{% end %} +{% block footer_static %} + + + +{% end %} \ No newline at end of file diff --git a/templates/profile.htm b/templates/profile.htm new file mode 100644 index 0000000..9d24581 --- /dev/null +++ b/templates/profile.htm @@ -0,0 +1,190 @@ +{% extends "base.htm" %} + +{% block header_title %}{{ user["username"] }}的资料{% end %} +{% block body %} +{% include "header.htm" %} + +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      + +
      +
      +
      + +
      + +
      + +
      +
      +
      + +
      + +
      + +
      +
      +
      + +
      + +
      + +
      +
      +
      + +
      + +
      + +
      +
      +
      + +
      + +
      + +
      + +
      +
      +
      +
      + +
      + +
      +
      +
      +
      + +
      + +
      +
      +
      + +
      +
      + +
      +
      + {% raw xsrf_form_html() %} +
      +
      +
      +
      +
      + +
      + + +
      +
      +
      +
      + +
      + + +
      +
      +
      +
      + +
      + + +
      +
      +
      +
      + +
      + + +
      +
      +
      +
      +
      + +
      +
      + {% raw xsrf_form_html() %} +
      +
      +
      +
      +
      +
      + +
      +
      +
      + +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      +
      +
      + {% include "self.htm" %} +
      +
      +
      + + +{% end %} +{% block footer_static %} + +{% end %} \ No newline at end of file diff --git a/templates/publish.htm b/templates/publish.htm new file mode 100644 index 0000000..a01dd4c --- /dev/null +++ b/templates/publish.htm @@ -0,0 +1,60 @@ +{% extends "base.htm" %} + +{% block header_title %}文章发表{% end %} +{% block body %} +{% include "header.htm" %} + +
      +
      +
      +
      + 文章标题 + +
      +
      +
      板块
      +
      + +
      + +
      + {% set text = flash["article"] %} + +
      +
      +
      + 收费 + + 金币 +
      +
      +
      + 免费时段 + +
      +
      + + +
      + +
      +
      +
      + 立即发布 + 临时保存 + {% raw xsrf_form_html() %} +
      +
      +
      + + +{% end %} +{% block footer_static %} + + + +{% end %} \ No newline at end of file diff --git a/templates/register.htm b/templates/register.htm new file mode 100644 index 0000000..a73f320 --- /dev/null +++ b/templates/register.htm @@ -0,0 +1,82 @@ +{% extends "base.htm" %} + +{% block header_title %}用户注册{% end %} +{% block body %} +{% include "header.htm" %} +
      +
      +

      注册

      +
      + +
      + {% if error %} +
      + +

      {{ error }}

      +
      + {% end %} + + {% if method == "invite" %} +
      + +
      + +
      +
      + {% end %} + {% set user_reg = flash['user_reg'] %} + {% if type(user_reg) is not dict %} + {% set user_reg = {'username':'','password':'','repassword':''} %} + {% end %} + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + + {% if handler.settings['captcha']['register'] %} +
      + +
      + +
      +
      + +
      +
      + {% end %} + +
      +
      + 登录 + +
      +
      + {% raw xsrf_form_html() %} +
      + +
      +
      +
      +{% end %} +{% block footer_static %} + +{% end %} \ No newline at end of file diff --git a/templates/renewpwd.htm b/templates/renewpwd.htm new file mode 100644 index 0000000..7c92278 --- /dev/null +++ b/templates/renewpwd.htm @@ -0,0 +1,45 @@ +{% extends "base.htm" %} + +{% block header_title %}更换新密码{% end %} +{% block body %} +{% include "header.htm" %} +
      +
      +

      填写新密码

      +
      + +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      +
      +
      +
      + +
      +
      +
      + + {% raw xsrf_form_html() %} +
      + +
      +
      +
      +{% end %} +{% block footer_static %} + +{% end %} \ No newline at end of file diff --git a/templates/search.htm b/templates/search.htm new file mode 100644 index 0000000..8a34e0a --- /dev/null +++ b/templates/search.htm @@ -0,0 +1,47 @@ +{% extends "base.htm" %} + +{% block header_title %}{{ keyword }}的搜索结果{% end %} +{% block body %} +{% include "header.htm" %} +
      +
      +
      +
      +
      +

      首页 > {{ keyword }}的搜索结果

      +
      +
      + 总共找到{{ count }}篇相关文章 +
      + + + + + + + + {% for post in posts %} + + + + + + + {% end %} +
      时间标题状态作者
      {{ post['title'] }}公开{{ post['user'] }}
      + +
      +
      +
      + {% include "self.htm" %} +
      +
      +
      + +{% end %} +{% block footer_static %} + +{% end %} \ No newline at end of file diff --git a/templates/self.htm b/templates/self.htm new file mode 100644 index 0000000..7ec0e34 --- /dev/null +++ b/templates/self.htm @@ -0,0 +1,16 @@ +
      +
      +

      + + {{ current_user["username"] }} + +

      + +

      + 我的金币:{{ current_user["money"] }}
      + 等级:{% if power == 'admin' %}管理员{% else %}普通白帽子{% end %}
      + 我的收藏 | 我的喜欢 +

      +
      +
      \ No newline at end of file diff --git a/templates/sort.htm b/templates/sort.htm new file mode 100644 index 0000000..74f8d9c --- /dev/null +++ b/templates/sort.htm @@ -0,0 +1,58 @@ +{% extends "base.htm" %} + +{% block header_title %}文章列表{% end %} +{% block body %} +{% include "header.htm" %} +
      +
      +
      +
      +
      +
        +
      1. 首页
      2. +
      3. {{ sort["name"] }}
      4. +
      +
      +
      + {{ sort.get('intro') }} +
      + + + + + + + + {% for post in posts %} + + + + + + + {% end %} +
      时间标题状态作者
      {{ post['title'] }} + {% if post['charge'] and current_user["username"] not in post["buyer"] %} + {{ post['charge'] }}金币 + {% elif current_user["username"] in post["buyer"] %} + 已购买 + {% else %} + 免费 + {% end %} + {{ post['user'] }}
      + +
      +
      +
      + {% include "self.htm" %} +
      +
      +
      + +{% end %} +{% block footer_static %} + +{% end %} \ No newline at end of file diff --git a/templates/upload.htm b/templates/upload.htm new file mode 100644 index 0000000..5e00d31 --- /dev/null +++ b/templates/upload.htm @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/templates/user.htm b/templates/user.htm new file mode 100644 index 0000000..092b0f4 --- /dev/null +++ b/templates/user.htm @@ -0,0 +1,81 @@ +{% extends "base.htm" %} + +{% block header_title %}{{ user["username"] }}的资料{% end %} +{% block body %} +{% include "header.htm" %} + +
      +
      +
      +
      +
      +
        +
      1. 首页
      2. +
      3. {{ user.get('username') }} 的主页
      4. +
      +
      +
      +
      {{ user.get('signal') }}
      + {% if user.get('website') and user.get('openwebsite') %} + 主页:{{ user.get('website') }} +
      + {% end %} + {% if user.get('email') and user.get('openemail') %} + Email:{{ user.get('email') }} +
      + {% end %} + {% if user.get('qq') and user.get('openqq') %} + QQ:{{ user.get('qq') }} + {% end %} +
      + + + + + + + {% for post in posts %} + + + + + + {% end %} +
      时间标题板块
      + {% if post.get('star') %}[精华]{% end %} + {{ post.get('title') }} + {{ post['sort']['name'] }}
      + +
      +
      +
      + {% if user["username"] != current_user["username"] %} +
      +
      +

      + + {{ user["username"] }} + +

      + +

      + 等级:{% if user["power"] == 20 %}管理员{% else %}普通白帽子{% end %}
      +

      +
      +
      + {% else %} + {% include "self.htm" %} + {% end %} +
      +
      +
      + + +{% end %} +{% block footer_static %} + +{% end %} \ No newline at end of file diff --git a/util/__init__.py b/util/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/util/captcha.orgin.py b/util/captcha.orgin.py new file mode 100644 index 0000000..d100d15 --- /dev/null +++ b/util/captcha.orgin.py @@ -0,0 +1,86 @@ +#!/usr/bin/python +#build by evan +#-*- coding=utf-8 -*- +import random, Image, ImageDraw, ImageFont, ImageFilter + + +_letter_cases = "23456789abcdefghjkmnpqrstuvwxy" +_upper_cases = _letter_cases.upper() +_numbers = ''.join(map(str, range(3, 10))) +init_chars = ''.join((_letter_cases, _upper_cases, _numbers)) + +def CreatePPCaptcha(size=(180, 50), + chars = init_chars, + img_type = "JPG", + mode = "RGBA", + bg_color = (255, 255, 255), + font_size = (50, 60), + font_type = './static/assets/fonts/captcha.ttf', + length = 4, + draw_lines = True, + n_line = (3, 6), + draw_points = True, + point_chance = 2): + + bg_color=(random.randint(157,255), random.randint(157,255), random.randint(157,255)) + + width, height = size + img = Image.new(mode, size, bg_color) + draw = ImageDraw.Draw(img) + + def get_chars(): + return random.sample(chars, length) + + def create_lines(): + line_num = random.randint(*n_line) + for i in range(line_num): + begin = (random.randint(0, size[0]), random.randint(0, size[1])) + + end = (random.randint(2, size[0]), random.randint(2, size[1])) + draw.line([begin, end], fill=(random.randint(0,156),random.randint(0,156),random.randint(0,156)), width=random.randint(1,4)) + + def create_points(): + for w in xrange(width): + for h in xrange(height): + tmp = random.randint(0, 100) + if tmp < point_chance: + font = ImageFont.truetype(font_type, 30) + draw.text((w, h), "*", font=font, fill=(random.randint(200,255),random.randint(200,255),random.randint(200,255))) + + def create_strs(): + c_chars = get_chars() + for i in xrange(length): + font = ImageFont.truetype(font_type, random.randint(*font_size)) + c = c_chars[i] + draw.text((random.randint(35,50)*i, random.randint(0,5)), c, + font=font, fill=(random.randint(0,156),random.randint(0,156),random.randint(0,156))) + + return ''.join(c_chars) + + if draw_points: + create_points() + + if draw_lines: + create_lines() + + + params = [1 - float(random.randint(1, 2)) / 100, + 0, + 0, + 0, + 1 - float(random.randint(1, 10)) / 100, + float(random.randint(1, 2)) / 500, + 0.001, + float(random.randint(1, 2)) / 500 + ] + img = img.transform(size, Image.PERSPECTIVE, params) + #img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) + + strs = create_strs() + return img, strs + + +if __name__ == "__main__": + code_img = CreatePPCaptcha(font_type = '../static/assets/fonts/captcha.ttf', img_type = 'PNG') + print code_img[1] + code_img[0].save("mycode.png", "PNG") \ No newline at end of file diff --git a/util/captcha.py b/util/captcha.py new file mode 100644 index 0000000..062ca68 --- /dev/null +++ b/util/captcha.py @@ -0,0 +1,55 @@ +#!/usr/bin/python +# coding: utf-8 + +__author__ = 'outofmemory.cn' + +from wheezy.captcha.image import captcha + +from wheezy.captcha.image import background +from wheezy.captcha.image import curve +from wheezy.captcha.image import noise +from wheezy.captcha.image import smooth +from wheezy.captcha.image import text + +from wheezy.captcha.image import offset +from wheezy.captcha.image import rotate +from wheezy.captcha.image import warp + +import random +from os import path + +_chars = 'ABCDEFGHJKMNPQRSTWXYZ23456789' + +class Captcha: + '''验证码''' + _fontsDir = "./static/assets/fonts" + _session_name_ = "captcha" + + @staticmethod + def check(input, request): + if input.upper() == request.session.get(Captcha._session_name_): + request.session.delete(Captcha._session_name_) + return True + else: + return False + + @staticmethod + def get(request): + captcha_image = captcha(drawings=[ + background(), + text(fonts=[ + path.join(Captcha._fontsDir,'captcha.ttf')], + drawings=[ + warp(), + rotate(), + offset() + ]), + curve(), + noise(), + smooth() + ]) + chars = random.sample(_chars, 4) + image = captcha_image(chars) + request.session[Captcha._session_name_] = ''.join(chars) + #print request.session[Captcha._session_name_] + return image, ''.join(chars) diff --git a/util/error.py b/util/error.py new file mode 100644 index 0000000..6cd2905 --- /dev/null +++ b/util/error.py @@ -0,0 +1,8 @@ +__author__ = 'phithon' + +class SpecialError(Exception): + def __init__(self, message): + self.message = message + + def __str__(self): + return repr(self.message) \ No newline at end of file diff --git a/util/flash.py b/util/flash.py new file mode 100644 index 0000000..cc49f55 --- /dev/null +++ b/util/flash.py @@ -0,0 +1,26 @@ +__author__ = 'phithon' + +class flash(dict): + def __init__(self, request): + dict.__init__(self) + self.request = request + + def __getitem__(self, item): + item = "flash_%s" % item + if item in self.request.session: + value = self.request.session.get(item) + self.request.session.delete(item) + else: + value = "" + return value + + def get(self, k, d = None): + return self.__getitem__(k) + + def __delattr__(self, item): + item = "flash_%s" % item + self.request.session.delete(item) + + def __setitem__(self, key, value): + key = "flash_%s" % key + self.request.session[key] = value \ No newline at end of file diff --git a/util/function.py b/util/function.py new file mode 100644 index 0000000..e8106f7 --- /dev/null +++ b/util/function.py @@ -0,0 +1,150 @@ +#coding=utf-8 +import bcrypt, os, string, random, hashlib, time, re, tornado.escape, datetime + +class hash: + ''' + crypt哈希加密类 + ''' + @staticmethod + def get(str): + str = str.encode("utf-8") + return bcrypt.hashpw(str, bcrypt.gensalt()) + + @staticmethod + def verify(str, hashed): + str = str.encode("utf-8") + hashed = hashed.encode("utf-8") + return bcrypt.hashpw(str, hashed) == hashed + +def md5(str): + ''' + 计算简单的md5 hex格式字符串 + + :param str: 原字符串 + :return: 返回的32尾hex字符串 + ''' + m = hashlib.md5() + m.update(str) + return m.hexdigest() + +def not_need_login(func): + ''' + 修饰器,修饰prepare方法,使其不需要登录即可使用。 + + :param func: prepare方法 + :return: 处理过的prepare方法 + ''' + def do_prepare(self, *args, **kwargs): + before = self.current_user + self.current_user = {'username': 'guest', 'power': -1} + func(self, *args, **kwargs) + self.current_user = before + return do_prepare + +def humansize(file): + ''' + 计算文件大小并输出为可读的格式(如 1.3MB) + + :param file: 文件路径 + :return: 可读的文件大小 + ''' + if os.path.exists(file): + nbytes = os.path.getsize(file) + suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'] + if nbytes == 0: return '0 B' + i = 0 + while nbytes >= 1024 and i < len(suffixes)-1: + nbytes /= 1024. + i += 1 + f = ('%.2f' % nbytes).rstrip('0').rstrip('.') + return '%s %s' % (f, suffixes[i]) + else: + return u"未知" + +def humantime(t = None, format = "%Y-%m-%d %H:%M:%S", span = False): + ''' + + %y 两位数的年份表示(00-99) + %Y 四位数的年份表示(000-9999) + %m 月份(01-12) + %d 月内中的一天(0-31) + %H 24小时制小时数(0-23) + %I 12小时制小时数(01-12) + %M 分钟数(00=59) + %S 秒(00-59) + + %a 本地简化星期名称 + %A 本地完整星期名称 + %b 本地简化的月份名称 + %B 本地完整的月份名称 + %c 本地相应的日期表示和时间表示 + %j 年内的一天(001-366) + %p 本地A.M.或P.M.的等价符 + %U 一年中的星期数(00-53)星期天为星期的开始 + %w 星期(0-6),星期天为星期的开始 + %W 一年中的星期数(00-53)星期一为星期的开始 + %x 本地相应的日期表示 + %X 本地相应的时间表示 + %Z 当前时区的名称 + %% %号本身 + + :param t: 时间戳,默认为当前时间 + :param format: 格式化字符串 + :return: 当前时间字符串 + ''' + if not t: + t = time.time() + if span: + return time_span(t) + return time.strftime(format, time.localtime(t)) + +def time_span(ts): + ''' + 计算传入的时间戳与现在相隔的时间 + + :param ts: 传入时间戳 + :return: 人性化时间差 + ''' + delta = datetime.datetime.now() - datetime.datetime.fromtimestamp(ts) + if delta.days >= 365: + return '%d年前' % int(delta.days / 365) + elif delta.days >= 30: + return '%d个月前' % int(delta.days / 30) + elif delta.days > 0: + return '%d天前' % delta.days + elif delta.seconds < 60: + return "%d秒前" % delta.seconds + elif delta.seconds < 60 * 60: + return "%d分钟前" % int(delta.seconds / 60) + else: + return "%d小时前" % int(delta.seconds / 60 / 60) + +def random_str(randomlength = 12): + ''' + 获得随机字符串,包含所有大小写字母+数字 + + :param randomlength: 字符串长度,默认12 + :return: 随机字符串 + ''' + a = list(string.ascii_letters + string.digits) + random.shuffle(a) + return ''.join(a[:randomlength]) + +def intval(str): + ''' + 如php中的intval,将字符串强制转换成数字 + + :param str: 输入的字符串 + :return: 数字 + ''' + if type(str) is int: return str + try: + ret = re.match(r"^(\-?\d+)[^\d]?.*$", str).group(1) + ret = int(ret) + except: + ret = 0 + return ret + +def nl2br(str): + str = tornado.escape.xhtml_escape(str) + return str.replace("\n", "
      ") \ No newline at end of file diff --git a/util/pxfilter.py b/util/pxfilter.py new file mode 100644 index 0000000..8cd9e6f --- /dev/null +++ b/util/pxfilter.py @@ -0,0 +1,200 @@ +# -*- coding: utf-8 -*- +""" +Python 富文本XSS过滤类 +@package XssHtml +@version 0.1 +@link http://phith0n.github.io/python-xss-filter +@since 20150407 +@copyright (c) Phithon All Rights Reserved + +Based on native Python module HTMLParser purifier of HTML, To Clear all javascript in html +You can use it in all python web framework +Written by Phithon in 2015 and placed in the public domain. +phithon 编写于20150407 +From: XDSEC & 离别歌 +GitHub Pages: https://github.com/phith0n/python-xss-filter +Usage: + parser = XssHtml() + parser.feed('') + parser.close() + html = parser.getHtml() + print html + +Requirements +Python 2.6+ or 3.2+ +Cannot defense xss in browser which is belowed IE7 +浏览器版本:IE7+ 或其他浏览器,无法防御IE6及以下版本浏览器中的XSS +""" +import re +try: + from html.parser import HTMLParser +except: + from HTMLParser import HTMLParser + +class XssHtml(HTMLParser): + allow_tags = ['a', 'img', 'br', 'strong', 'b', 'code', 'pre', + 'p', 'div', 'em', 'span', 'h1', 'h2', 'h3', 'h4', + 'h5', 'h6', 'blockquote', 'ul', 'ol', 'tr', 'th', 'td', + 'hr', 'li', 'u', 'embed', 's', 'table', 'thead', 'tbody', + 'caption', 'small', 'q', 'sup', 'sub'] + common_attrs = ["id", "style", "class", "name"] + nonend_tags = ["img", "hr", "br", "embed"] + tags_own_attrs = { + "img": ["src", "width", "height", "alt", "align"], + "a": ["href", "target", "rel", "title"], + "embed": ["src", "width", "height", "type", "allowfullscreen", "loop", "play", "wmode", "menu"], + "table": ["border", "cellpadding", "cellspacing"], + } + + def __init__(self, allows = []): + HTMLParser.__init__(self) + self.allow_tags = allows if allows else self.allow_tags + self.result = [] + self.start = [] + self.data = [] + + def getHtml(self): + """ + Get the safe html code + """ + for i in range(0, len(self.result)): + tmp = self.result[i].rstrip('\n') + tmp = tmp.lstrip('\n') + if tmp: + self.data.append(tmp) + return ''.join(self.data) + + def handle_startendtag(self, tag, attrs): + self.handle_starttag(tag, attrs) + + def handle_starttag(self, tag, attrs): + if tag not in self.allow_tags: + return + end_diagonal = ' /' if tag in self.nonend_tags else '' + if not end_diagonal: + self.start.append(tag) + attdict = {} + for attr in attrs: + attdict[attr[0]] = attr[1] + + attdict = self.__wash_attr(attdict, tag) + if hasattr(self, "node_%s" % tag): + attdict = getattr(self, "node_%s" % tag)(attdict) + else: + attdict = self.node_default(attdict) + + attrs = [] + for (key, value) in attdict.items(): + attrs.append('%s="%s"' % (key, self.__htmlspecialchars(value))) + attrs = (' ' + ' '.join(attrs)) if attrs else '' + self.result.append('<' + tag + attrs + end_diagonal + '>') + + def handle_endtag(self, tag): + if self.start and tag == self.start[len(self.start) - 1]: + self.result.append('') + self.start.pop() + + def handle_data(self, data): + self.result.append(self.__htmlspecialchars(data)) + + def handle_entityref(self, name): + if name.isalpha(): + self.result.append("&%s;" % name) + + def handle_charref(self, name): + if name.isdigit(): + self.result.append("&#%s;" % name) + + def node_default(self, attrs): + attrs = self.__common_attr(attrs) + return attrs + + def node_a(self, attrs): + attrs = self.__common_attr(attrs) + attrs = self.__get_link(attrs, "href") + attrs = self.__set_attr_default(attrs, "target", "_blank") + attrs = self.__limit_attr(attrs, { + "target": ["_blank", "_self"] + }) + return attrs + + def node_embed(self, attrs): + attrs = self.__common_attr(attrs) + attrs = self.__get_link(attrs, "src") + attrs = self.__limit_attr(attrs, { + "type": ["application/x-shockwave-flash"], + "wmode": ["transparent", "window", "opaque"], + "play": ["true", "false"], + "loop": ["true", "false"], + "menu": ["true", "false"], + "allowfullscreen": ["true", "false"] + }) + attrs["allowscriptaccess"] = "never" + attrs["allownetworking"] = "none" + return attrs + + def __true_url(self, url): + prog = re.compile(r"^(http|https|ftp)://.+", re.I | re.S) + if prog.match(url): + return url + else: + return "http://%s" % url + + def __true_style(self, style): + if style: + style = re.sub(r"(\\|&#|/\*|\*/)", "_", style) + style = re.sub(r"e.*x.*p.*r.*e.*s.*s.*i.*o.*n", "_", style) + return style + + def __get_style(self, attrs): + if "style" in attrs: + attrs["style"] = self.__true_style(attrs.get("style")) + return attrs + + def __get_link(self, attrs, name): + if name in attrs: + attrs[name] = self.__true_url(attrs[name]) + return attrs + + def __wash_attr(self, attrs, tag): + if tag in self.tags_own_attrs: + other = self.tags_own_attrs.get(tag) + else: + other = [] + if attrs: + for (key, value) in attrs.items(): + if key not in self.common_attrs + other: + del attrs[key] + return attrs + + def __common_attr(self, attrs): + attrs = self.__get_style(attrs) + return attrs + + def __set_attr_default(self, attrs, name, default = ''): + if name not in attrs: + attrs[name] = default + return attrs + + def __limit_attr(self, attrs, limit = {}): + for (key, value) in limit.items(): + if key in attrs and attrs[key] not in value: + del attrs[key] + return attrs + + def __htmlspecialchars(self, html): + return html.replace("<", "<")\ + .replace(">", ">")\ + .replace('"', """)\ + .replace("'", "'") + + +if "__main__" == __name__: + parser = XssHtml() + parser.feed("""

      +
      hehe
      +

      >M + MM

      + """) + parser.close() + print(parser.getHtml()) \ No newline at end of file diff --git a/util/sendemail.py b/util/sendemail.py new file mode 100644 index 0000000..0985b9d --- /dev/null +++ b/util/sendemail.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +__author__ = 'phithon' +from tornado.httpclient import AsyncHTTPClient, HTTPRequest +from tornado.escape import url_escape +from tornado import ioloop + +def callback(self): + pass + +class Sendemail: + def __init__(self, setting): + AsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient") + self.url = setting.get("url") + self.key = setting.get("key") + self.sender = setting.get("sender") + self.http_client = AsyncHTTPClient() + + def _parseurl(self, dic): + ret = [] + for k, v in dic.items(): + ret.append("%s=%s" % (k, url_escape(v, False))) + return "&".join(ret) + + def send(self, title, content, to, orgin = None, callback = callback): + orgin = self.sender if not orgin else orgin + url = "%s/messages" % self.url + data = self._parseurl({ + "from": orgin, + "to": to, + "subject": title, + "html": content + }) + self.http_client.fetch(url, method = "POST", body = data, callback = callback, auth_username = "api", auth_password = self.key, + follow_redirects = True, validate_cert = False) + +if __name__ == "__main__": + def main(): + setting = { + "url": "https://api.mailgun.net/v3/domain", + "key": "key-xxxxx" + } + Sendemail(setting).send( + title = u"你好,test", + content=u"这是一封测试邮件", + to=u"test@qq.com", + orgin=u"postmaster@domain" + ) + + io_loop = ioloop.IOLoop.instance() + io_loop.run_sync(main) + io_loop.start()