From a9daa6a7924df527a1c3fdaaa1817a16417db052 Mon Sep 17 00:00:00 2001 From: Timothy Allen Date: Fri, 25 Sep 2026 22:58:05 +0200 Subject: [PATCH] Replace TinyMCE 4.2.8 with a small local editor. TinyMCE 4.2.8 has known XSS bugs. publish/editor.js has the same toolbar and writes the same HTML. The textarea still posts the story. --- 20151121-tinymce-xxx-skin.zip | Bin 91514 -> 0 bytes lib/purify.inc.php | 6 +- publish/edit.php | 2 +- publish/editor.css | 270 +++ publish/editor.inc.php | 15 + publish/editor.js | 1065 +++++++++ publish/index.php | 2 +- publish/tinymce_init.inc.php | 38 - publish/utilities.js | 44 +- tinymce | 1 - tinymce-4.2.8/LICENSE.TXT | 504 ----- tinymce-4.2.8/changelog.txt | 883 -------- tinymce-4.2.8/js/tinymce/langs/readme.md | 3 - tinymce-4.2.8/js/tinymce/license.txt | 504 ----- .../js/tinymce/plugins/advlist/plugin.min.js | 1 - .../js/tinymce/plugins/anchor/plugin.min.js | 1 - .../js/tinymce/plugins/autolink/plugin.min.js | 1 - .../tinymce/plugins/autoresize/plugin.min.js | 1 - .../js/tinymce/plugins/autosave/plugin.min.js | 1 - .../js/tinymce/plugins/bbcode/plugin.min.js | 1 - .../js/tinymce/plugins/charmap/plugin.min.js | 1 - .../js/tinymce/plugins/code/plugin.min.js | 1 - .../tinymce/plugins/colorpicker/plugin.min.js | 1 - .../tinymce/plugins/contextmenu/plugin.min.js | 1 - .../plugins/directionality/plugin.min.js | 1 - .../plugins/emoticons/img/smiley-cool.gif | Bin 354 -> 0 bytes .../plugins/emoticons/img/smiley-cry.gif | Bin 329 -> 0 bytes .../emoticons/img/smiley-embarassed.gif | Bin 331 -> 0 bytes .../emoticons/img/smiley-foot-in-mouth.gif | Bin 342 -> 0 bytes .../plugins/emoticons/img/smiley-frown.gif | Bin 340 -> 0 bytes .../plugins/emoticons/img/smiley-innocent.gif | Bin 336 -> 0 bytes .../plugins/emoticons/img/smiley-kiss.gif | Bin 338 -> 0 bytes .../plugins/emoticons/img/smiley-laughing.gif | Bin 343 -> 0 bytes .../emoticons/img/smiley-money-mouth.gif | Bin 321 -> 0 bytes .../plugins/emoticons/img/smiley-sealed.gif | Bin 323 -> 0 bytes .../plugins/emoticons/img/smiley-smile.gif | Bin 344 -> 0 bytes .../emoticons/img/smiley-surprised.gif | Bin 338 -> 0 bytes .../emoticons/img/smiley-tongue-out.gif | Bin 328 -> 0 bytes .../emoticons/img/smiley-undecided.gif | Bin 337 -> 0 bytes .../plugins/emoticons/img/smiley-wink.gif | Bin 350 -> 0 bytes .../plugins/emoticons/img/smiley-yell.gif | Bin 336 -> 0 bytes .../tinymce/plugins/emoticons/plugin.min.js | 1 - .../js/tinymce/plugins/example/dialog.html | 8 - .../js/tinymce/plugins/example/plugin.min.js | 1 - .../plugins/example_dependency/plugin.min.js | 1 - .../js/tinymce/plugins/fullpage/plugin.min.js | 1 - .../tinymce/plugins/fullscreen/plugin.min.js | 1 - .../js/tinymce/plugins/hr/plugin.min.js | 1 - .../js/tinymce/plugins/image/plugin.min.js | 1 - .../tinymce/plugins/imagetools/plugin.min.js | 1 - .../tinymce/plugins/importcss/plugin.min.js | 1 - .../plugins/insertdatetime/plugin.min.js | 1 - .../js/tinymce/plugins/layer/plugin.min.js | 1 - .../plugins/legacyoutput/plugin.min.js | 1 - .../js/tinymce/plugins/link/plugin.min.js | 1 - .../js/tinymce/plugins/lists/plugin.min.js | 1 - .../js/tinymce/plugins/media/moxieplayer.swf | Bin 20017 -> 0 bytes .../js/tinymce/plugins/media/plugin.min.js | 1 - .../tinymce/plugins/nonbreaking/plugin.min.js | 1 - .../tinymce/plugins/noneditable/plugin.min.js | 1 - .../tinymce/plugins/pagebreak/plugin.min.js | 1 - .../js/tinymce/plugins/paste/plugin.min.js | 1 - .../js/tinymce/plugins/preview/plugin.min.js | 1 - .../js/tinymce/plugins/print/plugin.min.js | 1 - .../js/tinymce/plugins/save/plugin.min.js | 1 - .../plugins/searchreplace/plugin.min.js | 1 - .../plugins/spellchecker/plugin.min.js | 1 - .../js/tinymce/plugins/tabfocus/plugin.min.js | 1 - .../js/tinymce/plugins/table/plugin.min.js | 1 - .../js/tinymce/plugins/template/plugin.min.js | 1 - .../tinymce/plugins/textcolor/plugin.min.js | 1 - .../tinymce/plugins/textpattern/plugin.min.js | 1 - .../plugins/visualblocks/css/visualblocks.css | 135 -- .../plugins/visualblocks/plugin.min.js | 1 - .../tinymce/plugins/visualchars/plugin.min.js | 1 - .../tinymce/plugins/wordcount/plugin.min.js | 1 - .../skins/lightgray/content.inline.min.css | 1 - .../tinymce/skins/lightgray/content.min.css | 1 - .../skins/lightgray/fonts/tinymce-small.eot | Bin 9112 -> 0 bytes .../skins/lightgray/fonts/tinymce-small.svg | 62 - .../skins/lightgray/fonts/tinymce-small.ttf | Bin 8924 -> 0 bytes .../skins/lightgray/fonts/tinymce-small.woff | Bin 9000 -> 0 bytes .../tinymce/skins/lightgray/fonts/tinymce.eot | Bin 12044 -> 0 bytes .../tinymce/skins/lightgray/fonts/tinymce.svg | 83 - .../tinymce/skins/lightgray/fonts/tinymce.ttf | Bin 11880 -> 0 bytes .../skins/lightgray/fonts/tinymce.woff | Bin 11956 -> 0 bytes .../js/tinymce/skins/lightgray/img/anchor.gif | Bin 53 -> 0 bytes .../js/tinymce/skins/lightgray/img/loader.gif | Bin 2608 -> 0 bytes .../js/tinymce/skins/lightgray/img/object.gif | Bin 152 -> 0 bytes .../js/tinymce/skins/lightgray/img/trans.gif | Bin 43 -> 0 bytes .../tinymce/skins/lightgray/skin.ie7.min.css | 1 - .../js/tinymce/skins/lightgray/skin.min.css | 1 - .../js/tinymce/skins/xxx/Variables.less | 165 -- .../tinymce/skins/xxx/content.inline.min.css | 1 - .../js/tinymce/skins/xxx/content.min.css | 1 - .../js/tinymce/skins/xxx/fonts/readme.md | 1 - .../tinymce/skins/xxx/fonts/tinymce-small.eot | Bin 9112 -> 0 bytes .../skins/xxx/fonts/tinymce-small.json | 1194 ---------- .../tinymce/skins/xxx/fonts/tinymce-small.svg | 62 - .../tinymce/skins/xxx/fonts/tinymce-small.ttf | Bin 8924 -> 0 bytes .../skins/xxx/fonts/tinymce-small.woff | Bin 9000 -> 0 bytes .../js/tinymce/skins/xxx/fonts/tinymce.eot | Bin 12044 -> 0 bytes .../js/tinymce/skins/xxx/fonts/tinymce.json | 1981 ----------------- .../js/tinymce/skins/xxx/fonts/tinymce.svg | 83 - .../js/tinymce/skins/xxx/fonts/tinymce.ttf | Bin 11880 -> 0 bytes .../js/tinymce/skins/xxx/fonts/tinymce.woff | Bin 11956 -> 0 bytes .../js/tinymce/skins/xxx/img/anchor.gif | Bin 53 -> 0 bytes .../js/tinymce/skins/xxx/img/loader.gif | Bin 2608 -> 0 bytes .../js/tinymce/skins/xxx/img/object.gif | Bin 152 -> 0 bytes .../js/tinymce/skins/xxx/img/trans.gif | Bin 43 -> 0 bytes .../js/tinymce/skins/xxx/img/wline.gif | Bin 46 -> 0 bytes .../js/tinymce/skins/xxx/skin.ie7.min.css | 1 - tinymce-4.2.8/js/tinymce/skins/xxx/skin.json | 58 - .../js/tinymce/skins/xxx/skin.min.css | 1 - .../js/tinymce/themes/modern/theme.min.js | 1 - tinymce-4.2.8/js/tinymce/tinymce.min.js | 12 - 116 files changed, 1371 insertions(+), 5862 deletions(-) delete mode 100644 20151121-tinymce-xxx-skin.zip create mode 100644 publish/editor.css create mode 100644 publish/editor.inc.php create mode 100644 publish/editor.js delete mode 100644 publish/tinymce_init.inc.php delete mode 120000 tinymce delete mode 100644 tinymce-4.2.8/LICENSE.TXT delete mode 100644 tinymce-4.2.8/changelog.txt delete mode 100644 tinymce-4.2.8/js/tinymce/langs/readme.md delete mode 100644 tinymce-4.2.8/js/tinymce/license.txt delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/advlist/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/anchor/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/autolink/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/autoresize/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/autosave/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/bbcode/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/charmap/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/code/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/colorpicker/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/contextmenu/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/directionality/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-cool.gif delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-cry.gif delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-embarassed.gif delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-foot-in-mouth.gif delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-frown.gif delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-innocent.gif delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-kiss.gif delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-laughing.gif delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-money-mouth.gif delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-sealed.gif delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-smile.gif delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-surprised.gif delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-tongue-out.gif delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-undecided.gif delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-wink.gif delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-yell.gif delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/emoticons/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/example/dialog.html delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/example/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/example_dependency/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/fullpage/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/fullscreen/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/hr/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/image/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/imagetools/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/importcss/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/insertdatetime/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/layer/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/legacyoutput/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/link/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/lists/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/media/moxieplayer.swf delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/media/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/nonbreaking/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/noneditable/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/pagebreak/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/paste/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/preview/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/print/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/save/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/searchreplace/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/spellchecker/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/tabfocus/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/table/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/template/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/textcolor/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/textpattern/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/visualblocks/css/visualblocks.css delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/visualblocks/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/visualchars/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/plugins/wordcount/plugin.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/skins/lightgray/content.inline.min.css delete mode 100644 tinymce-4.2.8/js/tinymce/skins/lightgray/content.min.css delete mode 100644 tinymce-4.2.8/js/tinymce/skins/lightgray/fonts/tinymce-small.eot delete mode 100644 tinymce-4.2.8/js/tinymce/skins/lightgray/fonts/tinymce-small.svg delete mode 100644 tinymce-4.2.8/js/tinymce/skins/lightgray/fonts/tinymce-small.ttf delete mode 100644 tinymce-4.2.8/js/tinymce/skins/lightgray/fonts/tinymce-small.woff delete mode 100644 tinymce-4.2.8/js/tinymce/skins/lightgray/fonts/tinymce.eot delete mode 100644 tinymce-4.2.8/js/tinymce/skins/lightgray/fonts/tinymce.svg delete mode 100644 tinymce-4.2.8/js/tinymce/skins/lightgray/fonts/tinymce.ttf delete mode 100644 tinymce-4.2.8/js/tinymce/skins/lightgray/fonts/tinymce.woff delete mode 100644 tinymce-4.2.8/js/tinymce/skins/lightgray/img/anchor.gif delete mode 100644 tinymce-4.2.8/js/tinymce/skins/lightgray/img/loader.gif delete mode 100644 tinymce-4.2.8/js/tinymce/skins/lightgray/img/object.gif delete mode 100644 tinymce-4.2.8/js/tinymce/skins/lightgray/img/trans.gif delete mode 100644 tinymce-4.2.8/js/tinymce/skins/lightgray/skin.ie7.min.css delete mode 100644 tinymce-4.2.8/js/tinymce/skins/lightgray/skin.min.css delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/Variables.less delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/content.inline.min.css delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/content.min.css delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/fonts/readme.md delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/fonts/tinymce-small.eot delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/fonts/tinymce-small.json delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/fonts/tinymce-small.svg delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/fonts/tinymce-small.ttf delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/fonts/tinymce-small.woff delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/fonts/tinymce.eot delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/fonts/tinymce.json delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/fonts/tinymce.svg delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/fonts/tinymce.ttf delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/fonts/tinymce.woff delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/img/anchor.gif delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/img/loader.gif delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/img/object.gif delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/img/trans.gif delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/img/wline.gif delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/skin.ie7.min.css delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/skin.json delete mode 100644 tinymce-4.2.8/js/tinymce/skins/xxx/skin.min.css delete mode 100644 tinymce-4.2.8/js/tinymce/themes/modern/theme.min.js delete mode 100644 tinymce-4.2.8/js/tinymce/tinymce.min.js diff --git a/20151121-tinymce-xxx-skin.zip b/20151121-tinymce-xxx-skin.zip deleted file mode 100644 index c56391b3a4dd462c42693865952abacb49fb7081..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91514 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 diff --git a/lib/purify.inc.php b/lib/purify.inc.php index e2628a7..2782ae2 100644 --- a/lib/purify.inc.php +++ b/lib/purify.inc.php @@ -1,8 +1,8 @@ - + :first-child { + margin-top: 1em; +} +.xed-area blockquote { + margin: 1em 40px; +} + +.xed-toolbar { + display: flex; + flex-wrap: wrap; + flex: none; + padding: 2px 0 4px; + border-bottom: 1px dashed #006633; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} +.xed-group { + display: flex; + gap: 2px; + margin: 2px 0 0 2px; +} +.xed-group + .xed-group { + margin-left: 3px; + padding-left: 3px; + border-left: 1px solid #9ef89e; +} + +.xed-btn { + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: center; + width: 28px; + height: 24px; + margin: 0; + padding: 0; + border: 1px solid transparent; + border-radius: 0; + background-color: #e0efe0; + color: #333333; + cursor: pointer; +} +.xed-btn:hover, +.xed-btn:focus-visible { + background-color: #cde8cd; + border-color: #86f686; + outline: none; +} +.xed-btn.xed-active { + background-color: #bfe7bf; + border-color: #86f686; +} +.xed-btn svg { + display: block; + filter: drop-shadow(0 1px 1px rgba(255, 255, 255, 0.75)); +} + +/* Dialogs */ +.xed-modal-block { + position: fixed; + inset: 0; + z-index: 1000; + background-color: rgba(0, 0, 0, 0.3); +} +.xed-window { + position: fixed; + top: 50%; + left: 50%; + z-index: 1001; + transform: translate(-50%, -50%); + box-sizing: border-box; + max-width: calc(100vw - 20px); + max-height: calc(100vh - 20px); + overflow: auto; + border: 1px dashed #006633; + background-color: #e5fde5; + color: #333333; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + text-align: left; +} +.xed-window-head { + display: flex; + align-items: center; + padding: 9px 15px; + border-bottom: 1px dashed #006633; +} +.xed-title { + flex: 1; + padding-right: 10px; + font-size: 20px; + font-weight: bold; + line-height: 20px; +} +.xed-close { + padding: 0; + border: 0; + background: none; + color: #6d6d6d; + font: bold 20px/20px "Helvetica Neue", Helvetica, Arial, sans-serif; + cursor: pointer; +} +.xed-close:hover { + color: #333333; +} +.xed-window-body { + padding: 20px; +} +.xed-foot { + display: flex; + justify-content: flex-end; + gap: 3px; + padding: 10px; + border-top: 1px dashed #006633; +} +.xed-button { + box-sizing: border-box; + height: 30px; + padding: 4px 8px; + border: 1px solid transparent; + border-radius: 0; + background-color: #e0efe0; + color: #333333; + font: 14px/20px "Helvetica Neue", Helvetica, Arial, sans-serif; + cursor: pointer; +} +.xed-button:hover, +.xed-button:focus-visible { + background-color: #cde8cd; + border-color: #86f686; + outline: none; +} +.xed-button.xed-primary { + min-width: 52px; + background-color: #006dcc; + color: #ffffff; +} +.xed-button.xed-primary:hover, +.xed-button.xed-primary:focus-visible { + background-color: #005fb3; + border-color: transparent; +} + +/* Link dialog */ +.xed-form { + width: 409px; + max-width: 100%; +} +.xed-row { + display: flex; + align-items: center; + margin-bottom: 10px; +} +.xed-row:last-child { + margin-bottom: 0; +} +.xed-row label { + flex: 0 0 120px; + line-height: 16px; +} +.xed-textbox { + box-sizing: border-box; + flex: 1; + min-width: 0; + height: 30px; + padding: 0 4px; + border: 1px solid #c5c5c5; + border-radius: 0; + background-color: #ffffff; + color: #333333; + font: 14px "Helvetica Neue", Helvetica, Arial, sans-serif; +} +.xed-textbox:focus { + border-color: #59a5e1; + outline: none; +} + +/* Special character dialog */ +.xed-window-body:has(.xed-charmap-body) { + padding: 10px; +} +.xed-charmap-body { + display: flex; + gap: 20px; + align-items: flex-start; +} +.xed-charmap { + border-collapse: collapse; +} +.xed-charmap td { + min-width: 12px; + height: 20px; + padding: 2px; + border: 1px dashed #006633; + line-height: 20px; + text-align: center; + vertical-align: middle; + cursor: default; +} +.xed-charmap td:hover, +.xed-charmap td:focus-visible { + background-color: #9ec49e; + outline: none; +} +.xed-charmap-preview { + width: 120px; + text-align: center; +} +.xed-charmap-char { + height: 80px; + font-size: 40px; + line-height: 80px; +} +.xed-charmap-name { + margin-top: 10px; + font-size: 14px; +} + +/* Source code dialog */ +.xed-source { + box-sizing: border-box; + display: block; + width: 600px; + max-width: 100%; + height: 500px; + max-height: calc(100vh - 160px); + padding: 4px; + border: 1px solid #59a5e1; + border-radius: 0; + background-color: #ffffff; + color: #333333; + font: 14px "Helvetica Neue", Helvetica, Arial, sans-serif; + resize: none; +} +.xed-source:focus { + outline: none; +} diff --git a/publish/editor.inc.php b/publish/editor.inc.php new file mode 100644 index 0000000..7b95f94 --- /dev/null +++ b/publish/editor.inc.php @@ -0,0 +1,15 @@ + + + + diff --git a/publish/editor.js b/publish/editor.js new file mode 100644 index 0000000..864534b --- /dev/null +++ b/publish/editor.js @@ -0,0 +1,1065 @@ +/* + * A small rich-text editor for the story field, in place of TinyMCE. + * + * The textarea stays in the form and is what gets posted. The editor hides + * it, shows a contenteditable box with the same content, and copies the + * box back into the textarea after every change. Without JavaScript the + * plain textarea is still there. + * + * The toolbar has the buttons that the TinyMCE setup had: bold, italic, + * the four alignments, blockquote, outdent, indent, link, unlink, special + * characters and the HTML source. The HTML it writes is the same as + * TinyMCE wrote, for example

and + * padding-left steps of 30px. The server cleans the story with HTML + * Purifier in any case. + * + * Usage: XxxEditor.attach(textarea) returns an object with getContent(), + * setContent(html) and focus(). + */ +var XxxEditor = (function () { + "use strict"; + + var SVG_NS = "http://www.w3.org/2000/svg"; + + // Icons in a 16-unit box. "fill" paths are solid shapes; "stroke" paths + // are lines, in their own box size. + var ICONS = { + bold: { fill: ["M4 2h4.8c2 0 3.4 1.2 3.4 3 0 1.1-.6 2-1.5 2.4 1.2.4 2 1.4 2 2.8 0 2.1-1.6 3.8-3.9 3.8H4z" + + "M6.5 4.1v2.9h2c.9 0 1.5-.6 1.5-1.45S9.4 4.1 8.5 4.1z" + + "M6.5 9v3.9h2.4c1 0 1.7-.8 1.7-1.95S9.9 9 8.9 9z"] }, + italic: { fill: ["M6.5 2h6v1.8h-2.1L8.1 12.2h2.1V14h-6v-1.8h2.1l2.3-8.4H6.5z"] }, + alignleft: { fill: ["M1 2h14v2H1zM1 6h9v2H1zM1 10h14v2H1zM1 14h9v2H1z"] }, + aligncenter: { fill: ["M1 2h14v2H1zM3.5 6h9v2h-9zM1 10h14v2H1zM3.5 14h9v2h-9z"] }, + alignright: { fill: ["M1 2h14v2H1zM6 6h9v2H6zM1 10h14v2H1zM6 14h9v2H6z"] }, + alignjustify: { fill: ["M1 2h14v2H1zM1 6h14v2H1zM1 10h14v2H1zM1 14h14v2H1z"] }, + blockquote: { fill: ["M7.5 10.5a3 3 0 1 1-6 0C1.5 6.8 3.4 4.3 7 3.6v1.8C5.3 5.9 4.4 6.9 4.2 7.6A3 3 0 0 1 7.5 10.5z" + + "M14.5 10.5a3 3 0 1 1-6 0C8.5 6.8 10.4 4.3 14 3.6v1.8c-1.7.5-2.6 1.5-2.8 2.2a3 3 0 0 1 3.3 2.9z"] }, + outdent: { fill: ["M1 2h14v2H1zM1 6h8v2H1zM1 10h8v2H1zM1 14h14v2H1zM15 5.5v5L11 8z"] }, + indent: { fill: ["M1 2h14v2H1zM7 6h8v2H7zM7 10h8v2H7zM1 14h14v2H1zM1 5.5v5L5 8z"] }, + link: { box: 24, stroke: ["M10 13a5 5 0 0 0 7.5.5l2-2a5 5 0 0 0-7-7l-1 1", + "M14 11a5 5 0 0 0-7.5-.5l-2 2a5 5 0 0 0 7 7l1-1"] }, + unlink: { box: 24, stroke: ["M16.4 13.3L18.9 10.7A4 4 0 0 0 13.3 5.1L10.7 7.6", + "M13.3 16.4L10.7 18.9A4 4 0 0 1 5.1 13.3L7.6 10.7"] }, + charmap: { box: 16, width: 1.7, stroke: ["M2 14.2h3.9v-1.7a5 5 0 1 1 4.2 0v1.7H14"] }, + code: { box: 16, width: 1.6, stroke: ["M5.5 5L2.5 8l3 3", "M10.5 5l3 3-3 3"] } + }; + + // Toolbar groups, in the same order as the TinyMCE toolbar + var TOOLBAR = [ + [{ command: "bold", title: "Bold", key: "b" }, + { command: "italic", title: "Italic", key: "i" }], + [{ command: "alignleft", title: "Align left" }, + { command: "aligncenter", title: "Align center" }, + { command: "alignright", title: "Align right" }, + { command: "alignjustify", title: "Justify" }], + [{ command: "blockquote", title: "Blockquote" }], + [{ command: "outdent", title: "Decrease indent" }, + { command: "indent", title: "Increase indent" }], + [{ command: "link", title: "Insert/edit link", key: "k" }, + { command: "unlink", title: "Remove link" }], + [{ command: "charmap", title: "Special character" }, + { command: "code", title: "Source code" }] + ]; + + var ALIGN = { alignleft: "left", aligncenter: "center", alignright: "right", alignjustify: "justify" }; + var INDENT_STEP = 30; // pixels, as TinyMCE used + + // The special characters, as in the TinyMCE charmap plugin + var CHARMAP = [ + [160, "no-break space"], [173, "soft hyphen"], [34, "quotation mark"], + [162, "cent sign"], [8364, "euro sign"], [163, "pound sign"], + [165, "yen sign"], [169, "copyright sign"], [174, "registered sign"], + [8482, "trade mark sign"], [8240, "per mille sign"], [181, "micro sign"], + [183, "middle dot"], [8226, "bullet"], [8230, "three dot leader"], + [8242, "minutes / feet"], [8243, "seconds / inches"], + [167, "section sign"], [182, "paragraph sign"], [223, "sharp s / ess-zed"], + [8249, "single left-pointing angle quotation mark"], + [8250, "single right-pointing angle quotation mark"], + [171, "left pointing guillemet"], [187, "right pointing guillemet"], + [8216, "left single quotation mark"], + [8217, "right single quotation mark"], + [8220, "left double quotation mark"], + [8221, "right double quotation mark"], + [8218, "single low-9 quotation mark"], + [8222, "double low-9 quotation mark"], [60, "less-than sign"], + [62, "greater-than sign"], [8804, "less-than or equal to"], + [8805, "greater-than or equal to"], [8211, "en dash"], [8212, "em dash"], + [175, "macron"], [8254, "overline"], [164, "currency sign"], + [166, "broken bar"], [168, "diaeresis"], + [161, "inverted exclamation mark"], [191, "turned question mark"], + [710, "circumflex accent"], [732, "small tilde"], [176, "degree sign"], + [8722, "minus sign"], [177, "plus-minus sign"], [247, "division sign"], + [8260, "fraction slash"], [215, "multiplication sign"], + [185, "superscript one"], [178, "superscript two"], + [179, "superscript three"], [188, "fraction one quarter"], + [189, "fraction one half"], [190, "fraction three quarters"], + [402, "function / florin"], [8747, "integral"], [8721, "n-ary sumation"], + [8734, "infinity"], [8730, "square root"], [8764, "similar to"], + [8773, "approximately equal to"], [8776, "almost equal to"], + [8800, "not equal to"], [8801, "identical to"], [8712, "element of"], + [8713, "not an element of"], [8715, "contains as member"], + [8719, "n-ary product"], [8743, "logical and"], [8744, "logical or"], + [172, "not sign"], [8745, "intersection"], [8746, "union"], + [8706, "partial differential"], [8704, "for all"], [8707, "there exists"], + [8709, "diameter"], [8711, "backward difference"], + [8727, "asterisk operator"], [8733, "proportional to"], [8736, "angle"], + [180, "acute accent"], [184, "cedilla"], + [170, "feminine ordinal indicator"], [186, "masculine ordinal indicator"], + [8224, "dagger"], [8225, "double dagger"], [192, "A - grave"], + [193, "A - acute"], [194, "A - circumflex"], [195, "A - tilde"], + [196, "A - diaeresis"], [197, "A - ring above"], [198, "ligature AE"], + [199, "C - cedilla"], [200, "E - grave"], [201, "E - acute"], + [202, "E - circumflex"], [203, "E - diaeresis"], [204, "I - grave"], + [205, "I - acute"], [206, "I - circumflex"], [207, "I - diaeresis"], + [208, "ETH"], [209, "N - tilde"], [210, "O - grave"], [211, "O - acute"], + [212, "O - circumflex"], [213, "O - tilde"], [214, "O - diaeresis"], + [216, "O - slash"], [338, "ligature OE"], [352, "S - caron"], + [217, "U - grave"], [218, "U - acute"], [219, "U - circumflex"], + [220, "U - diaeresis"], [221, "Y - acute"], [376, "Y - diaeresis"], + [222, "THORN"], [224, "a - grave"], [225, "a - acute"], + [226, "a - circumflex"], [227, "a - tilde"], [228, "a - diaeresis"], + [229, "a - ring above"], [230, "ligature ae"], [231, "c - cedilla"], + [232, "e - grave"], [233, "e - acute"], [234, "e - circumflex"], + [235, "e - diaeresis"], [236, "i - grave"], [237, "i - acute"], + [238, "i - circumflex"], [239, "i - diaeresis"], [240, "eth"], + [241, "n - tilde"], [242, "o - grave"], [243, "o - acute"], + [244, "o - circumflex"], [245, "o - tilde"], [246, "o - diaeresis"], + [248, "o slash"], [339, "ligature oe"], [353, "s - caron"], + [249, "u - grave"], [250, "u - acute"], [251, "u - circumflex"], + [252, "u - diaeresis"], [253, "y - acute"], [254, "thorn"], + [255, "y - diaeresis"], [913, "Alpha"], [914, "Beta"], [915, "Gamma"], + [916, "Delta"], [917, "Epsilon"], [918, "Zeta"], [919, "Eta"], + [920, "Theta"], [921, "Iota"], [922, "Kappa"], [923, "Lambda"], + [924, "Mu"], [925, "Nu"], [926, "Xi"], [927, "Omicron"], [928, "Pi"], + [929, "Rho"], [931, "Sigma"], [932, "Tau"], [933, "Upsilon"], [934, "Phi"], + [935, "Chi"], [936, "Psi"], [937, "Omega"], [945, "alpha"], [946, "beta"], + [947, "gamma"], [948, "delta"], [949, "epsilon"], [950, "zeta"], + [951, "eta"], [952, "theta"], [953, "iota"], [954, "kappa"], + [955, "lambda"], [956, "mu"], [957, "nu"], [958, "xi"], [959, "omicron"], + [960, "pi"], [961, "rho"], [962, "final sigma"], [963, "sigma"], + [964, "tau"], [965, "upsilon"], [966, "phi"], [967, "chi"], [968, "psi"], + [969, "omega"], [8501, "alef symbol"], [982, "pi symbol"], + [8476, "real part symbol"], [978, "upsilon - hook symbol"], + [8472, "Weierstrass p"], [8465, "imaginary part"], + [8592, "leftwards arrow"], [8593, "upwards arrow"], + [8594, "rightwards arrow"], [8595, "downwards arrow"], + [8596, "left right arrow"], [8629, "carriage return"], + [8656, "leftwards double arrow"], [8657, "upwards double arrow"], + [8658, "rightwards double arrow"], [8659, "downwards double arrow"], + [8660, "left right double arrow"], [8756, "therefore"], + [8834, "subset of"], [8835, "superset of"], [8836, "not a subset of"], + [8838, "subset of or equal to"], [8839, "superset of or equal to"], + [8853, "circled plus"], [8855, "circled times"], [8869, "perpendicular"], + [8901, "dot operator"], [8968, "left ceiling"], [8969, "right ceiling"], + [8970, "left floor"], [8971, "right floor"], + [9001, "left-pointing angle bracket"], + [9002, "right-pointing angle bracket"], [9674, "lozenge"], + [9824, "black spade suit"], [9827, "black club suit"], + [9829, "black heart suit"], [9830, "black diamond suit"], + [8194, "en space"], [8195, "em space"], [8201, "thin space"], + [8204, "zero width non-joiner"], [8205, "zero width joiner"], + [8206, "left-to-right mark"], [8207, "right-to-left mark"] + ]; + + // The markup that is kept, the same as the HTML Purifier allowlist in + // lib/purify.inc.php. Other tags are removed and their contents kept. + var ALLOWED = { + P: ["style", "align"], BR: [], STRONG: [], B: [], EM: [], I: [], U: [], SUP: [], SUB: [], + HR: [], PRE: [], CODE: [], BLOCKQUOTE: ["style"], DIV: ["style", "align"], SPAN: ["style"], + UL: [], OL: [], LI: [], A: ["href", "title"] + }; + var RENAME = { B: "STRONG", I: "EM" }; + var DROP = { SCRIPT: 1, STYLE: 1, TEMPLATE: 1, IFRAME: 1, OBJECT: 1, EMBED: 1, HEAD: 1, TITLE: 1, META: 1, LINK: 1 }; + var STYLES = ["text-align", "padding-left", "margin-left"]; + var BLOCK = /^(P|DIV|LI|PRE|BLOCKQUOTE|UL|OL|HR|H[1-6])$/; + var VOID = { BR: 1, HR: 1 }; + + function icon(name) { + var spec = ICONS[name]; + var svg = document.createElementNS(SVG_NS, "svg"); + svg.setAttribute("viewBox", "0 0 " + (spec.box || 16) + " " + (spec.box || 16)); + svg.setAttribute("width", "16"); + svg.setAttribute("height", "16"); + svg.setAttribute("aria-hidden", "true"); + svg.setAttribute("focusable", "false"); + if (spec.fill) { + svg.setAttribute("fill", "currentColor"); + svg.setAttribute("fill-rule", "evenodd"); + } else { + svg.setAttribute("fill", "none"); + svg.setAttribute("stroke", "currentColor"); + svg.setAttribute("stroke-width", String(spec.width || 2.5)); + svg.setAttribute("stroke-linecap", "round"); + svg.setAttribute("stroke-linejoin", "round"); + } + (spec.fill || spec.stroke).forEach(function (d) { + var path = document.createElementNS(SVG_NS, "path"); + path.setAttribute("d", d); + svg.appendChild(path); + }); + return svg; + } + + function el(tag, className, text) { + var node = document.createElement(tag); + if (className) node.className = className; + if (text !== undefined) node.textContent = text; + return node; + } + + function safeUrl(url) { + url = String(url || "").trim(); + // Relative links, and only these schemes + return /^(https?:|mailto:|[\/#?.]|[^:]*$)/i.test(url) ? url : ""; + } + + // Keep only the allowed properties of a style attribute + function cleanStyle(style) { + var out = []; + String(style || "").split(";").forEach(function (rule) { + var i = rule.indexOf(":"); + if (i < 0) return; + var name = rule.slice(0, i).trim().toLowerCase(); + var value = rule.slice(i + 1).trim(); + if (STYLES.indexOf(name) >= 0 && /^[\w .%-]+$/.test(value)) out.push(name + ": " + value + ";"); + }); + return out.join(" "); + } + + /* + * Copy the allowed markup from *source* into *target*. The source nodes + * come from an inert document (DOMParser), so nothing in them runs. + */ + function cleanInto(source, target) { + Array.prototype.forEach.call(source.childNodes, function (node) { + if (node.nodeType === 3) { + target.appendChild(document.createTextNode(node.nodeValue)); + return; + } + if (node.nodeType !== 1 || DROP[node.nodeName]) return; + var name = node.nodeName; + if (/^H[1-6]$/.test(name)) name = "P"; + if (!ALLOWED[name]) { + cleanInto(node, target); + return; + } + var copy = document.createElement(RENAME[name] || name); + ALLOWED[name].forEach(function (attr) { + var value = node.getAttribute(attr); + if (value === null) return; + if (attr === "style") value = cleanStyle(value); + if (attr === "href") value = safeUrl(value); + if (attr === "align" && !/^(left|right|center|justify)$/i.test(value)) value = ""; + if (value) copy.setAttribute(attr, value); + }); + // A span with no style left is just its contents + if (name === "SPAN" && !copy.hasAttribute("style")) { + cleanInto(node, target); + return; + } + cleanInto(node, copy); + target.appendChild(copy); + }); + return target; + } + + function parse(html) { + var doc = new DOMParser().parseFromString("" + String(html || "") + "", "text/html"); + return cleanInto(doc.body, document.createDocumentFragment()); + } + + function escapeText(text) { + return text.replace(/&/g, "&").replace(//g, ">").replace(/\u00a0/g, " "); + } + + function escapeAttr(text) { + return escapeText(text).replace(/"/g, """); + } + + function isEmptyBlock(node) { + return !node.textContent.replace(/[\s\u00a0\u200b]/g, "") && !node.querySelector("hr"); + } + + /* + * The HTML for the textarea, written the way TinyMCE wrote it: + * and , one block per line, "
", and " " in an empty + * paragraph. An editor with no words in it gives "". + */ + function serialize(root) { + function inner(node, depth) { + var html = ""; + Array.prototype.forEach.call(node.childNodes, function (child) { + html += outer(child, depth); + }); + return html; + } + function outer(node, depth) { + if (node.nodeType === 3) { + // Whitespace between blocks is only layout + if (depth === 0 && !node.nodeValue.trim()) return ""; + return escapeText(node.nodeValue); + } + if (node.nodeType !== 1) return ""; + var name = RENAME[node.nodeName] || node.nodeName; + if (!ALLOWED[name]) return inner(node, depth); + // Chrome can leave a behind; keep only allowed styles + var attrs = ""; + (ALLOWED[name] || []).forEach(function (attr) { + var value = node.getAttribute(attr); + if (attr === "style") value = cleanStyle(value); + if (attr === "href") value = safeUrl(value); + if (value) attrs += " " + attr + '="' + escapeAttr(value) + '"'; + }); + if (name === "SPAN" && !attrs) return inner(node, depth); + var tag = name.toLowerCase(); + if (VOID[name]) return "<" + tag + attrs + " />"; + var block = BLOCK.test(name); + var body; + if (/^(P|DIV|LI|PRE)$/.test(name) && isEmptyBlock(node)) { + body = " "; + } else { + body = inner(node, /^(BLOCKQUOTE|UL|OL)$/.test(name) ? 0 : depth + 1); + // A trailing
that the browser keeps to hold the caret + if (block) body = body.replace(/
$/, ""); + } + if (/^(BLOCKQUOTE|UL|OL)$/.test(name)) body = "\n" + body; + return "<" + tag + attrs + ">" + body + "" + (block ? "\n" : ""); + } + if (isEmptyBlock(root)) return ""; + return inner(root, 0).trim(); + } + + function attach(textarea) { + var wrapper = el("div", "xed"); + var box = el("div", "xed-area"); + box.contentEditable = "true"; + box.spellcheck = true; + box.setAttribute("role", "textbox"); + box.setAttribute("aria-multiline", "true"); + var label = textarea.id && document.querySelector('label[for="' + textarea.id + '"]'); + box.setAttribute("aria-label", label ? label.textContent.trim() : "Story"); + var toolbar = el("div", "xed-toolbar"); + toolbar.setAttribute("role", "toolbar"); + toolbar.setAttribute("aria-label", "Formatting"); + + var buttons = {}; + var undoStack = []; + var redoStack = []; + var lastInput = { time: 0, type: "" }; + var savedRange = null; + + // Paragraphs are the default block, as in TinyMCE + try { document.execCommand("defaultParagraphSeparator", false, "p"); } catch (e) { } + + /* ---------- content ---------- */ + + function sync() { + var html = serialize(box); + if (textarea.value !== html) { + textarea.value = html; + textarea.dispatchEvent(new Event("input", { bubbles: true })); + } + } + + // Put loose text at the top level into paragraphs, and keep one empty + // paragraph in an empty editor so that typing starts in a

+ function tidy() { + var run = null; + var moved = false; + var range = currentRange(); + var where = range && [range.startContainer, range.startOffset, range.endContainer, range.endOffset]; + Array.prototype.slice.call(box.childNodes).forEach(function (node) { + var inline = node.nodeType === 3 ? !!(node.nodeValue.trim() || run) : node.nodeType === 1 && !BLOCK.test(node.nodeName); + if (inline) { + if (!run) { + run = document.createElement("p"); + box.insertBefore(run, node); + } + run.appendChild(node); + moved = true; + } else { + run = null; + } + }); + if (!box.firstElementChild) { + box.textContent = ""; + var p = emptyParagraph(); + box.appendChild(p); + if (where) where = [p, 0, p, 0]; + moved = true; + } + // Moving a node loses a selection inside it; put the selection back + if (moved && where && box.contains(where[0]) && box.contains(where[2])) { + try { + var again = document.createRange(); + again.setStart(where[0], where[1]); + again.setEnd(where[2], where[3]); + selectRange(again); + } catch (e) { } + } + } + + function emptyParagraph() { + var p = document.createElement("p"); + p.appendChild(document.createElement("br")); + return p; + } + + function setContent(html) { + box.textContent = ""; + box.appendChild(parse(html)); + // " " in an empty paragraph becomes a
that holds the caret + Array.prototype.forEach.call(box.querySelectorAll("p, div, li"), function (block) { + if (isEmptyBlock(block) && !block.querySelector("br")) { + block.textContent = ""; + block.appendChild(document.createElement("br")); + } + }); + tidy(); + sync(); + } + + /* ---------- selection ---------- */ + + function currentRange() { + var selection = window.getSelection(); + if (!selection || !selection.rangeCount) return null; + var range = selection.getRangeAt(0); + return box.contains(range.commonAncestorContainer) ? range : null; + } + + function selectRange(range) { + var selection = window.getSelection(); + selection.removeAllRanges(); + selection.addRange(range); + } + + function pathTo(node) { + var path = []; + while (node && node !== box) { + path.unshift(Array.prototype.indexOf.call(node.parentNode.childNodes, node)); + node = node.parentNode; + } + return node === box ? path : null; + } + + function nodeAt(path) { + var node = box; + for (var i = 0; node && i < path.length; i++) node = node.childNodes[path[i]]; + return node; + } + + function snapshot() { + var range = currentRange(); + var shot = { html: box.innerHTML, range: null }; + if (range) { + shot.range = [pathTo(range.startContainer), range.startOffset, pathTo(range.endContainer), range.endOffset]; + } + return shot; + } + + function restore(shot) { + box.innerHTML = shot.html; + if (shot.range && shot.range[0] && shot.range[2]) { + var start = nodeAt(shot.range[0]); + var end = nodeAt(shot.range[2]); + if (start && end) { + try { + var range = document.createRange(); + range.setStart(start, shot.range[1]); + range.setEnd(end, shot.range[3]); + box.focus(); + selectRange(range); + } catch (e) { } + } + } + sync(); + refresh(); + } + + /* ---------- undo ---------- */ + + // Keep the state from before a change. Typing is kept as one step until + // the kind of input changes or there is a pause. + function remember(kind) { + var now = Date.now(); + if (kind && kind === lastInput.type && now - lastInput.time < 1000) { + lastInput.time = now; + return; + } + lastInput = { time: now, type: kind || "" }; + var shot = snapshot(); + if (undoStack.length && undoStack[undoStack.length - 1].html === shot.html) return; + undoStack.push(shot); + if (undoStack.length > 100) undoStack.shift(); + redoStack = []; + } + + function undo() { + if (!undoStack.length) return; + redoStack.push(snapshot()); + restore(undoStack.pop()); + lastInput = { time: 0, type: "" }; + } + + function redo() { + if (!redoStack.length) return; + undoStack.push(snapshot()); + restore(redoStack.pop()); + lastInput = { time: 0, type: "" }; + } + + /* ---------- blocks ---------- */ + + function closest(node, test) { + while (node && node !== box) { + if (node.nodeType === 1 && test(node)) return node; + node = node.parentNode; + } + return null; + } + + function closestTag(node, pattern) { + return closest(node, function (n) { return pattern.test(n.nodeName); }); + } + + // The innermost text blocks that the selection touches + function selectedBlocks() { + tidy(); + var range = currentRange(); + if (!range) return []; + var blocks = []; + Array.prototype.forEach.call(box.querySelectorAll("p, div, li, pre, blockquote"), function (block) { + if (block.nodeName === "BLOCKQUOTE" && block.querySelector("p, div, li, pre")) return; + if (range.intersectsNode(block)) blocks.push(block); + }); + if (!blocks.length) { + var block = closestTag(range.startContainer, /^(P|DIV|LI|PRE|BLOCKQUOTE)$/); + if (block) blocks.push(block); + } + return blocks; + } + + function align(value) { + var blocks = selectedBlocks(); + if (!blocks.length) return; + // Pressing the alignment that is already set removes it, as in TinyMCE + var on = blocks.every(function (b) { return b.style.textAlign === value; }); + blocks.forEach(function (b) { + b.removeAttribute("align"); + b.style.textAlign = on ? "" : value; + if (!b.getAttribute("style")) b.removeAttribute("style"); + }); + } + + function indent(step) { + var range = currentRange(); + if (range && closestTag(range.startContainer, /^LI$/)) { + document.execCommand(step > 0 ? "indent" : "outdent", false, null); + return; + } + selectedBlocks().forEach(function (b) { + var now = parseInt(b.style.paddingLeft, 10) || 0; + var next = Math.max(0, now + step); + b.style.paddingLeft = next ? next + "px" : ""; + if (!b.getAttribute("style")) b.removeAttribute("style"); + }); + } + + // The ancestor of *node* that is a direct child of *parent* + function childOf(parent, node) { + while (node && node.parentNode !== parent) node = node.parentNode; + return node; + } + + function previousElement(node) { + node = node.previousSibling; + while (node && node.nodeType === 3 && !node.nodeValue.trim()) node = node.previousSibling; + return node; + } + + function unwrap(node) { + while (node.firstChild) node.parentNode.insertBefore(node.firstChild, node); + node.parentNode.removeChild(node); + } + + // Wrap the selected blocks in a

, or take them out of one + function blockquote() { + var range = currentRange(); + var blocks = selectedBlocks(); + if (!range || !blocks.length) return; + var saved = [range.startContainer, range.startOffset, range.endContainer, range.endOffset]; + var quotes = blocks.map(function (b) { return closestTag(b, /^BLOCKQUOTE$/); }); + if (quotes.every(Boolean)) { + quotes.filter(function (q, i) { return quotes.indexOf(q) === i; }).forEach(function (quote) { + if (!quote.querySelector("p, div, li, pre")) { + var p = document.createElement("p"); + while (quote.firstChild) p.appendChild(quote.firstChild); + quote.appendChild(p); + } + unwrap(quote); + }); + } else { + var tops = []; + blocks.forEach(function (b) { + var top = childOf(box, b); + if (top && tops.indexOf(top) < 0) tops.push(top); + }); + var quote = null; + tops.forEach(function (top) { + if (!quote || previousElement(top) !== quote) { + quote = document.createElement("blockquote"); + box.insertBefore(quote, top); + } + if (top.nodeName === "BLOCKQUOTE") { + while (top.firstChild) quote.appendChild(top.firstChild); + top.parentNode.removeChild(top); + } else { + quote.appendChild(top); + } + }); + } + try { + var again = document.createRange(); + again.setStart(saved[0], saved[1]); + again.setEnd(saved[2], saved[3]); + selectRange(again); + } catch (e) { } + } + + /* ---------- links ---------- */ + + function linkAt(range) { + if (!range) return null; + var a = closestTag(range.startContainer, /^A$/); + if (a) return a; + // A selection of exactly one link + var links = box.querySelectorAll("a"); + for (var i = 0; i < links.length; i++) { + if (range.intersectsNode(links[i])) return links[i]; + } + return null; + } + + function linkDialog() { + var range = currentRange(); + savedRange = range ? range.cloneRange() : null; + var link = linkAt(range); + var text = link ? link.textContent : (range ? range.toString() : ""); + var fields = [ + { name: "href", label: "Url", value: link ? link.getAttribute("href") : "" }, + { name: "text", label: "Text to display", value: text }, + { name: "title", label: "Title", value: link ? link.getAttribute("title") || "" : "" } + ]; + var form = el("div", "xed-form"); + var inputs = {}; + fields.forEach(function (field) { + var row = el("div", "xed-row"); + var id = "xed-" + field.name + "-" + Math.random().toString(36).slice(2); + var lab = el("label", "", field.label); + lab.htmlFor = id; + var input = el("input", "xed-textbox"); + input.type = "text"; + input.id = id; + input.value = field.value; + inputs[field.name] = input; + row.appendChild(lab); + row.appendChild(input); + form.appendChild(row); + }); + // A selection with markup in it keeps its markup unless the text changes + var textWas = inputs.text.value; + openDialog("Insert link", form, [ + { text: "Ok", primary: true, action: function () { + var href = inputs.href.value.trim(); + if (/^www\./i.test(href)) href = "http://" + href; + else if (/^[^\s:\/@]+@[^\s:\/@]+\.[^\s:\/@]+$/.test(href)) href = "mailto:" + href; + href = safeUrl(href); + restoreSelection(); + remember(); + if (!href) { + if (link) unwrap(link); + } else if (link) { + link.setAttribute("href", href); + setTitle(link, inputs.title.value); + if (inputs.text.value !== textWas) link.textContent = inputs.text.value || href; + } else { + insertLink(href, inputs.title.value, inputs.text.value, inputs.text.value !== textWas); + } + changed(); + } }, + { text: "Cancel" } + ], inputs.href); + } + + function setTitle(link, title) { + if (title.trim()) link.setAttribute("title", title.trim()); + else link.removeAttribute("title"); + } + + function insertLink(href, title, text, textChanged) { + var range = currentRange(); + if (!range) return; + if (range.collapsed || textChanged) { + var a = document.createElement("a"); + a.setAttribute("href", href); + setTitle(a, title); + a.textContent = text || href; + range.deleteContents(); + range.insertNode(a); + var after = document.createRange(); + after.setStartAfter(a); + selectRange(after); + } else { + var before = Array.prototype.slice.call(box.querySelectorAll("a")); + document.execCommand("createLink", false, href); + Array.prototype.forEach.call(box.querySelectorAll("a"), function (a) { + if (before.indexOf(a) < 0) setTitle(a, title); + }); + } + } + + function unlink() { + var range = currentRange(); + var link = linkAt(range); + if (range && range.collapsed && link) { + unwrap(link); + } else { + document.execCommand("unlink", false, null); + } + } + + /* ---------- special characters ---------- */ + + function charmapDialog() { + var range = currentRange(); + savedRange = range ? range.cloneRange() : null; + var body = el("div", "xed-charmap-body"); + var table = el("table", "xed-charmap"); + var preview = el("div", "xed-charmap-preview"); + var big = el("div", "xed-charmap-char", ""); + var name = el("div", "xed-charmap-name", ""); + preview.appendChild(big); + preview.appendChild(name); + var row = null; + var dialog; + CHARMAP.forEach(function (entry, i) { + if (i % 25 === 0) row = table.insertRow(); + var cell = row.insertCell(); + var character = String.fromCharCode(entry[0]); + cell.textContent = character; + cell.title = entry[1]; + cell.tabIndex = 0; + cell.addEventListener("mouseover", function () { + big.textContent = character; + name.textContent = entry[1]; + }); + function choose() { + dialog.close(); + restoreSelection(); + remember(); + document.execCommand("insertText", false, character); + changed(); + } + cell.addEventListener("click", choose); + cell.addEventListener("keydown", function (event) { + if (event.key === "Enter" || event.key === " ") { + event.preventDefault(); + choose(); + } + }); + }); + body.appendChild(table); + body.appendChild(preview); + dialog = openDialog("Special character", body, [{ text: "Close" }]); + } + + /* ---------- source code ---------- */ + + function codeDialog() { + var source = el("textarea", "xed-source"); + source.value = serialize(box); + source.spellcheck = false; + openDialog("Source code", source, [ + { text: "Ok", primary: true, action: function () { + remember(); + setContent(source.value); + box.focus(); + changed(); + } }, + { text: "Cancel" } + ], source, "xed-window-code"); + } + + function restoreSelection() { + box.focus(); + if (savedRange) selectRange(savedRange); + savedRange = null; + } + + /* ---------- dialogs ---------- */ + + // A modal window in the style of the TinyMCE skin + function openDialog(title, content, actions, focus, extraClass) { + var block = el("div", "xed-modal-block"); + var win = el("div", "xed-window" + (extraClass ? " " + extraClass : "")); + win.setAttribute("role", "dialog"); + win.setAttribute("aria-modal", "true"); + var head = el("div", "xed-window-head"); + var heading = el("div", "xed-title", title); + heading.id = "xed-title-" + Math.random().toString(36).slice(2); + win.setAttribute("aria-labelledby", heading.id); + var close = el("button", "xed-close", "\u00d7"); + close.type = "button"; + close.setAttribute("aria-label", "Close"); + head.appendChild(heading); + head.appendChild(close); + var body = el("div", "xed-window-body"); + body.appendChild(content); + var foot = el("div", "xed-foot"); + var dialog = { + close: function () { + document.removeEventListener("keydown", onKey, true); + block.parentNode.removeChild(block); + win.parentNode.removeChild(win); + } + }; + function cancel() { + dialog.close(); + restoreSelection(); + } + actions.forEach(function (action) { + var button = el("button", "xed-button" + (action.primary ? " xed-primary" : ""), action.text); + button.type = "button"; + button.addEventListener("click", function () { + if (action.action) { + dialog.close(); + action.action(); + } else { + cancel(); + } + }); + foot.appendChild(button); + }); + close.addEventListener("click", cancel); + function onKey(event) { + if (event.key === "Escape") { + event.preventDefault(); + cancel(); + } else if (event.key === "Enter" && event.target.nodeName === "INPUT") { + event.preventDefault(); + var primary = foot.querySelector(".xed-primary"); + if (primary) primary.click(); + } else if (event.key === "Tab") { + // Keep the focus inside the window + var items = Array.prototype.filter.call(win.querySelectorAll("button, input, textarea, [tabindex]"), function (n) { + return n.tabIndex >= 0; + }); + var first = items[0]; + var last = items[items.length - 1]; + if (event.shiftKey && document.activeElement === first) { + event.preventDefault(); + last.focus(); + } else if (!event.shiftKey && document.activeElement === last) { + event.preventDefault(); + first.focus(); + } + } + } + document.addEventListener("keydown", onKey, true); + win.appendChild(head); + win.appendChild(body); + win.appendChild(foot); + document.body.appendChild(block); + document.body.appendChild(win); + (focus || foot.querySelector("button")).focus(); + return dialog; + } + + /* ---------- toolbar ---------- */ + + function run(command) { + if (command === "link") return linkDialog(); + if (command === "charmap") return charmapDialog(); + if (command === "code") return codeDialog(); + box.focus(); + if (!currentRange()) { + // No caret yet: start at the end + var range = document.createRange(); + range.selectNodeContents(box.lastChild || box); + range.collapse(false); + selectRange(range); + } + remember(); + if (command === "bold" || command === "italic") { + document.execCommand("styleWithCSS", false, false); + document.execCommand(command, false, null); + } else if (ALIGN[command]) { + align(ALIGN[command]); + } else if (command === "indent") { + indent(INDENT_STEP); + } else if (command === "outdent") { + indent(-INDENT_STEP); + } else if (command === "blockquote") { + blockquote(); + } else if (command === "unlink") { + unlink(); + } + changed(); + } + + function isActive(command, range) { + var node = range.startContainer; + if (command === "bold" || command === "italic") { + try { + return document.queryCommandState(command); + } catch (e) { + return !!closestTag(node, command === "bold" ? /^(STRONG|B)$/ : /^(EM|I)$/); + } + } + if (ALIGN[command]) { + var block = closestTag(node, /^(P|DIV|LI|PRE|BLOCKQUOTE)$/); + return !!block && (block.style.textAlign || (block.getAttribute("align") || "").toLowerCase()) === ALIGN[command]; + } + if (command === "blockquote") return !!closestTag(node, /^BLOCKQUOTE$/); + if (command === "link") return !!closestTag(node, /^A$/); + return false; + } + + // Show which formats apply where the caret is + function refresh() { + var range = document.activeElement === box ? currentRange() : null; + Object.keys(buttons).forEach(function (command) { + var on = !!range && isActive(command, range); + buttons[command].classList.toggle("xed-active", on); + if (buttons[command].hasAttribute("aria-pressed")) buttons[command].setAttribute("aria-pressed", on ? "true" : "false"); + }); + } + + function changed() { + tidy(); + sync(); + refresh(); + } + + TOOLBAR.forEach(function (group) { + var node = el("div", "xed-group"); + group.forEach(function (spec) { + var button = el("button", "xed-btn"); + button.type = "button"; + button.title = spec.title + (spec.key ? " (Ctrl+" + spec.key.toUpperCase() + ")" : ""); + button.setAttribute("aria-label", spec.title); + if (/^(bold|italic|align|blockquote)/.test(spec.command)) button.setAttribute("aria-pressed", "false"); + button.appendChild(icon(spec.command)); + // Keep the selection in the editor when the button is pressed + button.addEventListener("mousedown", function (event) { event.preventDefault(); }); + button.addEventListener("click", function () { run(spec.command); }); + buttons[spec.command] = button; + node.appendChild(button); + }); + toolbar.appendChild(node); + }); + + /* ---------- events ---------- */ + + box.addEventListener("beforeinput", function (event) { + if (event.inputType === "historyUndo") { + event.preventDefault(); + undo(); + } else if (event.inputType === "historyRedo") { + event.preventDefault(); + redo(); + } else { + remember(event.inputType); + } + }); + + box.addEventListener("input", function (event) { + // After everything is deleted, start again with a plain paragraph, so + // that the formatting of the deleted text does not carry on + if (/^delete/.test(event.inputType || "") && isEmptyBlock(box) && !box.querySelector("li")) { + box.textContent = ""; + var p = emptyParagraph(); + box.appendChild(p); + var range = document.createRange(); + range.setStart(p, 0); + range.collapse(true); + selectRange(range); + } + changed(); + }); + + box.addEventListener("keydown", function (event) { + if (!(event.ctrlKey || event.metaKey) || event.altKey) return; + var key = event.key.toLowerCase(); + if (key === "z" && !event.shiftKey) { + event.preventDefault(); + undo(); + } else if (key === "y" || (key === "z" && event.shiftKey)) { + event.preventDefault(); + redo(); + } else { + TOOLBAR.forEach(function (group) { + group.forEach(function (spec) { + if (spec.key === key && !event.shiftKey) { + event.preventDefault(); + run(spec.command); + } + }); + }); + } + }); + + // Paste the text and its simple formatting, not the styles of the page + // it came from + box.addEventListener("paste", function (event) { + var data = event.clipboardData || window.clipboardData; + if (!data) return; + event.preventDefault(); + remember(); + var html = data.getData("text/html"); + if (html) { + var holder = document.createElement("div"); + holder.appendChild(parse(html)); + document.execCommand("insertHTML", false, holder.innerHTML); + } else { + // A blank line starts a new paragraph; a single new line is a line break + var text = data.getData("text/plain").replace(/\r\n?/g, "\n"); + text.split(/\n[ \t]*\n\s*/).forEach(function (para, i) { + if (i) document.execCommand("insertParagraph", false, null); + para.split("\n").forEach(function (line, j) { + if (j) document.execCommand("insertLineBreak", false, null); + if (line) document.execCommand("insertText", false, line); + }); + }); + } + changed(); + }); + + box.addEventListener("focus", refresh); + box.addEventListener("blur", function () { + sync(); + refresh(); + }); + document.addEventListener("selectionchange", refresh); + + // The textarea keeps its place in the form, hidden behind the editor + textarea.parentNode.insertBefore(wrapper, textarea); + wrapper.appendChild(toolbar); + wrapper.appendChild(box); + wrapper.appendChild(textarea); + // The site style sets display on #story, which beats the hidden attribute + textarea.hidden = true; + textarea.style.display = "none"; + setContent(textarea.value); + if (textarea.form) textarea.form.addEventListener("submit", sync); + + return { + getContent: function () { return serialize(box); }, + setContent: function (html) { setContent(html); }, + focus: function () { box.focus(); } + }; + } + + return { attach: attach, serialize: serialize, parse: parse }; +})(); diff --git a/publish/index.php b/publish/index.php index 10acb40..20b94e3 100644 --- a/publish/index.php +++ b/publish/index.php @@ -17,7 +17,7 @@ require_once("../session.lib.php"); - + diff --git a/publish/tinymce_init.inc.php b/publish/tinymce_init.inc.php deleted file mode 100644 index e0f964a..0000000 --- a/publish/tinymce_init.inc.php +++ /dev/null @@ -1,38 +0,0 @@ - - - diff --git a/publish/utilities.js b/publish/utilities.js index b5121aa..0af702b 100644 --- a/publish/utilities.js +++ b/publish/utilities.js @@ -1,6 +1,3 @@ -// GLOBAL -var tinyMCEstate = true; - function showHide(show) { if (show == 'text') { var hide = 'upload'; @@ -14,18 +11,9 @@ function showHide(show) { document.getElementById(hide+'parent').style.display = "none"; document.getElementById(show+'parent').style.display = "block"; document.getElementById('wordcounter').style.display = "block"; - if (!tinyMCEstate && tinyMCE) { - // Toggling breaks getContent if the inital state is toggled off. - //tinyMCE.execCommand('mceToggleEditor',false,'text'); - tinyMCEstate = true; - } - tinyMCE.execCommand('mceFocus',false,'text'); + if (window.storyEditor) + storyEditor.focus(); } else if (show == 'upload') { - if (tinyMCEstate && tinyMCE) { - // Toggling breaks getContent if the inital state is toggled off. - //tinyMCE.execCommand('mceToggleEditor',false,'text'); - tinyMCEstate = false; - } document.getElementById('wordcounter').style.display = "none"; document.getElementById(hide+'parent').style.display = "none"; document.getElementById(show+'parent').style.display = "block"; @@ -52,7 +40,7 @@ function review() { var upload = document.getElementById('upload'); var uploaded = document.getElementById('uploaded'); var remove_img = document.getElementById('remove_img'); - var txtcnt = wc(tinyMCE.get('story').getContent()); + var txtcnt = wc(document.getElementById('story').value); if (is_delete) return true; if (!title.value) { alert("Please add a title to your submission; one makes everything much prettier."); @@ -92,20 +80,20 @@ function toggle_remove() { } } -function mceWordCount (e) { - if (e && e.type != 'keyup') - return true; - var txt = tinyMCE.get('story').getContent(); +// Show the number of words in the story (publish/editor.inc.php calls +// this when the story changes) +function updateWordCount() { + var story = document.getElementById("story"); var wordcounter = document.getElementById("wordcounter"); - var cnt = wc(txt); + if (!story || !wordcounter) + return true; + var cnt = wc(story.value); var words = (cnt == 1) ? " word" : " words"; - if (wordcounter) { - wordcounter.innerHTML = cnt + words; - wordcounter.className = "counter"; - if (cnt == 100) wordcounter.className += " yes"; - if (cnt > 100) wordcounter.className += " no"; - } - return true; + wordcounter.innerHTML = cnt + words; + wordcounter.className = "counter"; + if (cnt == 100) wordcounter.className += " yes"; + if (cnt > 100) wordcounter.className += " no"; + return true; } function wc (txt) { @@ -115,7 +103,7 @@ function wc (txt) { txt = txt.replace(/\s[^a-zA-Z0-9]+\s/g," "); //strip punctuation txt = txt.replace(/\s*((\S+\s*)*)/, "$1"); //ltrim txt = txt.replace(/((\s*\S+)*)\s*/, "$1"); //rtrim - txt = txt.replace(/( )/g, " "); //TinyMCE newlines leave spaces behind + txt = txt.replace(/( )/g, " "); //empty paragraphs and non-breaking spaces txt = txt.replace(/(^\s+|\s+$)/, " "); // Remove trailing spaces if (txt.match(/^ *$/)) return 0; diff --git a/tinymce b/tinymce deleted file mode 120000 index 2c81580..0000000 --- a/tinymce +++ /dev/null @@ -1 +0,0 @@ -tinymce-4.2.8/ \ No newline at end of file diff --git a/tinymce-4.2.8/LICENSE.TXT b/tinymce-4.2.8/LICENSE.TXT deleted file mode 100644 index 1837b0a..0000000 --- a/tinymce-4.2.8/LICENSE.TXT +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/tinymce-4.2.8/changelog.txt b/tinymce-4.2.8/changelog.txt deleted file mode 100644 index a6d2073..0000000 --- a/tinymce-4.2.8/changelog.txt +++ /dev/null @@ -1,883 +0,0 @@ -Version 4.2.8 (2015-11-13) - Fixed bug where it was possible to delete tables as the inline root element if all columns where selected. - Fixed bug where the UI buttons active state wasn't properly updated due to recent refactoring of that logic. -Version 4.2.7 (2015-10-27) - Fixed bug where backspace/delete would remove all formats on the last paragraph character in WebKit/Blink. - Fixed bug where backspace within a inline format element with a bogus caret container would move the caret. - Fixed bug where backspace/delete on selected table cells wouldn't add an undo level. - Fixed bug where script tags embedded within the editor could sometimes get a mce- prefix prepended to them - Fixed bug where validate: false option could produce an error to be thrown from the Serialization step. - Fixed bug where inline editing of a table as the root element could let the user delete that table. - Fixed bug where inline editing of a table as the root element wouldn't properly handle enter key. - Fixed bug where inline editing of a table as the root element would normalize the selection incorrectly. - Fixed bug where inline editing of a list as the root element could let the user delete that list. - Fixed bug where inline editing of a list as the root element could let the user split that list. - Fixed bug where resize handles would be rendered on editable root elements such as table. -Version 4.2.6 (2015-09-28) - Added capability to set request headers when using XHRs. - Added capability to upload local images automatically default delay is set to 30 seconds after editing images. - Added commands ids mceEditImage, mceAchor and mceMedia to be avaiable from execCommand. - Added Edge browser to saucelabs grunt task. Patch contributed by John-David Dalton. - Fixed bug where blob uris not produced by tinymce would produce HTML invalid markup. - Fixed bug where selection of contents of a nearly empty editor in Edge would sometimes fail. - Fixed bug where color styles woudln't be retained on copy/paste in Blink/Webkit. - Fixed bug where the table plugin would throw an error when inserting rows after a child table. - Fixed bug where the template plugin wouldn't handle functions as variable replacements. - Fixed bug where undo/redo sometimes wouldn't work properly when applying formatting collapsed ranges. - Fixed bug where shift+delete wouldn't do a cut operation on Blink/WebKit. - Fixed bug where cut action wouldn't properly store the before selection bookmark for the undo level. - Fixed bug where backspace in side an empty list element on IE would loose editor focus. - Fixed bug where the save plugin wouldn't enable the buttons when a change occured. - Fixed bug where Edge wouldn't initialize the editor if a document.domain was specified. - Fixed bug where enter key before nested images would sometimes not properly expand the previous block. - Fixed bug where the inline toolbars wouldn't get properly hidden when blurring the editor instance. - Fixed bug where Edge would paste Chinese characters on some Windows 10 installations. - Fixed bug where IME would loose focus on IE 11 due to the double trailing br bug fix. - Fixed bug where the proxy url in imagetools was incorrect. Patch contributed by Wong Ho Wang. -Version 4.2.5 (2015-08-31) - Added fullscreen capability to embedded youtube and vimeo videos. - Fixed bug where the uploadImages call didn't work on IE 10. - Fixed bug where image place holders would be uploaded by uploadImages call. - Fixed bug where images marked with bogus would be uploaded by the uploadImages call. - Fixed bug where multiple calls to uploadImages would result in decreased performance. - Fixed bug where pagebreaks were editable to imagetools patch contributed by Rasmus Wallin. - Fixed bug where the element path could cause too much recursion exception. - Fixed bug for domains containing ".min". Patch contributed by Loïc Février. - Fixed so validation of external links to accept a number after www. Patch contributed by Victor Carvalho. - Fixed so the charmap is exposed though execCommand. Patch contributed by Matthew Will. - Fixed so that the image uploads are concurrent for improved performance. - Fixed various grammar problems in inline documentation. Patches provided by nikolas. -Version 4.2.4 (2015-08-17) - Added picture as a valid element to the HTML 5 schema. Patch contributed by Adam Taylor. - Fixed bug where contents would be duplicated on drag/drop within the same editor. - Fixed bug where floating/alignment of images on Edge wouldn't work properly. - Fixed bug where it wasn't possible to drag images on IE 11. - Fixed bug where image selection on Edge would sometimes fail. - Fixed bug where contextual toolbars icons wasn't rendered properly when using the toolbar_items_size. - Fixed bug where searchreplace dialog doesn't get prefilled with the selected text. - Fixed bug where fragmented matches wouldn't get properly replaced by the searchreplace plugin. - Fixed bug where enter key wouldn't place the caret if was after a trailing space within an inline element. - Fixed bug where the autolink plugin could produce multiple links for the same text on Gecko. - Fixed bug where EditorUpload could sometimes throw an exception if the blob wasn't found. - Fixed xss issues with media plugin not properly filtering out some script attributes. -Version 4.2.3 (2015-07-30) - Fixed bug where image selection wasn't possible on Edge due to incompatible setBaseAndExtend API. - Fixed bug where image blobs urls where not properly destroyed by the imagetools plugin. - Fixed bug where keyboard shortcuts wasn't working correctly on IE 8. - Fixed skin issue where the borders of panels where not visible on IE 8. -Version 4.2.2 (2015-07-22) - Fixed bug where float panels were not being hidden on inline editor blur when fixed_toolbar_container config option was in use. - Fixed bug where combobox states wasn't properly updated if contents where updated without keyboard. - Fixed bug where pasting into textbox or combobox would move the caret to the end of text. - Fixed bug where removal of bogus span elements before block elements would remove whitespace between nodes. - Fixed bug where repositioning of inline toolbars where async and producing errors if the editor was removed from DOM to early. Patch by iseulde. - Fixed bug where element path wasn't working correctly. Patch contributed by iseulde. - Fixed bug where menus wasn't rendered correctly when custom images where added to a menu. Patch contributed by Naim Hammadi. -Version 4.2.1 (2015-06-29) - Fixed bug where back/forward buttons in the browser would render blob images as broken images. - Fixed bug where Firefox would throw regexp to big error when replacing huge base64 chunks. - Fixed bug rendering issues with resize and context toolbars not being placed properly until next animation frame. - Fixed bug where the rendering of the image while cropping would some times not be centered correctly. - Fixed bug where listbox items with submenus would me selected as active. - Fixed bug where context menu where throwing an error when rendering. - Fixed bug where resize both option wasn't working due to resent addClass API change. Patch contributed by Jogai. - Fixed bug where a hideAll call for container rendered inline toolbars would throw an error. - Fixed bug where onclick event handler on combobox could cause issues if element.id was a function by some polluting libraries. - Fixed bug where listboxes wouldn't get proper selected sub menu item when using link_list or image_list. - Fixed so the UI controls are as wide as 4.1.x to avoid wrapping controls in toolbars. - Fixed so the imagetools dialog is adaptive for smaller screen sizes. -Version 4.2.0 (2015-06-25) - Added new flat default skin to make the UI more modern. - Added new imagetools plugin, lets you crop/resize and apply filters to images. - Added new contextual toolbars support to the API lets you add floating toolbars for specific CSS selectors. - Added new promise feature fill as tinymce.util.Promise. - Added new built in image upload feature lets you upload any base64 encoded image within the editor as files. - Fixed bug where resize handles would appear in the right position in the wrong editor when switching between resizable content in different inline editors. - Fixed bug where tables would not be inserted in inline mode due to previous float panel fix. - Fixed bug where floating panels would remain open when focus was lost on inline editors. - Fixed bug where cut command on Chrome would thrown a browser security exception. - Fixed bug where IE 11 sometimes would report an incorrect size for images in the image dialog. - Fixed bug where it wasn't possible to remove inline formatting at the end of block elements. - Fixed bug where it wasn't possible to delete table cell contents when cell selection was vertical. - Fixed bug where table cell wasn't emptied from block elements if delete/backspace where pressed in empty cell. - Fixed bug where cmd+shift+arrow didn't work correctly on Firefox mac when selecting to start/end of line. - Fixed bug where removal of bogus elements would sometimes remove whitespace between nodes. - Fixed bug where the resize handles wasn't updated when the main window was resized. - Fixed so script elements gets removed by default to prevent possible XSS issues in default config implementations. - Fixed so the UI doesn't need manual reflows when using non native layout managers. - Fixed so base64 encoded images doesn't slow down the editor on modern browsers while editing. - Fixed so all UI elements uses touch events to improve mobile device support. - Removed the touch click quirks patch for iOS since it did more harm than good. - Removed the non proportional resize handles since. Unproportional resize can still be done by holding the shift key. -Version 4.1.10 (2015-05-05) - Fixed bug where plugins loaded with compat3x would sometimes throw errors when loading using the jQuery version. - Fixed bug where extra empty paragraphs would get deleted in WebKit/Blink due to recent Quriks fix. - Fixed bug where the editor wouldn't work properly on IE 12 due to some required browser sniffing. - Fixed bug where formatting shortcut keys where interfering with Mac OS X screenshot keys. - Fixed bug where the caret wouldn't move to the next/previous line boundary on Cmd+Left/Right on Gecko. - Fixed bug where it wasn't possible to remove formats from very specific nested contents. - Fixed bug where undo levels wasn't produced when typing letters using the shift or alt+ctrl modifiers. - Fixed bug where the dirty state wasn't properly updated when typing using the shift or alt+ctrl modifiers. - Fixed bug where an error would be thrown if an autofocused editor was destroyed quickly after its initialization. Patch provided by thorn0. - Fixed issue with dirty state not being properly updated on redo operation. - Fixed issue with entity decoder not handling incorrectly written numeric entities. - Fixed issue where some PI element values wouldn't be properly encoded. -Version 4.1.9 (2015-03-10) - Fixed bug where indentation wouldn't work properly for non list elements. - Fixed bug with image plugin not pulling the image dimensions out correctly if a custom document_base_url was used. - Fixed bug where ctrl+alt+[1-9] would conflict with the AltGr+[1-9] on Windows. New shortcuts is ctrl+shift+[1-9]. - Fixed bug with removing formatting on nodes in inline mode would sometimes include nodes outside the editor body. - Fixed bug where extra nbsp:s would be inserted when you replaced a word surronded by spaces using insertContent. - Fixed bug with pasting from Google Docs would produce extra strong elements and line feeds. -Version 4.1.8 (2015-03-05) - Added new html5 sizes attribute to img elements used together with srcset. - Added new elementpath option that makes it possible to disable the element path but keep the statusbar. - Added new option table_style_by_css for the table plugin to set table styling with css rather than table attributes. - Added new link_assume_external_targets option to prompt the user to prepend http:// prefix if the supplied link does not contain a protocol prefix. - Added new image_prepend_url option to allow a custom base path/url to be added to images. - Added new table_appearance_options option to make it possible to disable some options. - Added new image_title option to make it possible to alter the title of the image, disabled by default. - Fixed bug where selection starting from out side of the body wouldn't produce a proper selection range on IE 11. - Fixed bug where pressing enter twice before a table moves the cursor in the table and causes a javascript error. - Fixed bug where advanced image styles were not respected. - Fixed bug where the less common Shift+Delete didn't produce a proper cut operation on WebKit browsers. - Fixed bug where image/media size constrain logic would produce NaN when handling non number values. - Fixed bug where internal classes where removed by the removeformat command. - Fixed bug with creating links table cell contents with a specific selection would throw a exceptions on WebKit/Blink. - Fixed bug where valid_classes option didn't work as expected according to docs. Patch provided by thorn0. - Fixed bug where jQuery plugin would patch the internal methods multiple times. Patch provided by Drew Martin. - Fixed bug where backspace key wouldn't delete the current selection of newly formatted content. - Fixed bug where type over of inline formatting elements wouldn't properly keep the format on WebKit/Blink. - Fixed bug where selection needed to be properly normalized on modern IE versions. - Fixed bug where Command+Backspace didn't properly delete the whole line of text but the previous word. - Fixed bug where UI active states wheren't properly updated on IE if you placed caret within the current range. - Fixed bug where delete/backspace on WebKit/Blink would remove span elements created by the user. - Fixed bug where delete/backspace would produce incorrect results when deleting between two text blocks with br elements. - Fixed bug where captions where removed when pasting from MS Office. - Fixed bug where lists plugin wouldn't properly remove fully selected nested lists. - Fixed bug where the ttf font used for icons would throw an warning message on Gecko on Mac OS X. - Fixed a bug where applying a color to text did not update the undo/redo history. - Fixed so shy entities gets displayed when using the visualchars plugin. - Fixed so removeformat removes ins/del by default since these might be used for strikethough. - Fixed so multiple language packs can be loaded and added to the global I18n data structure. - Fixed so transparent color selection gets treated as a normal color selection. Patch contributed by Alexander Hofbauer. - Fixed so it's possible to disable autoresize_overflow_padding, autoresize_bottom_margin options by setting them to false. - Fixed so the charmap plugin shows the description of the character in the dialog. Patch contributed by Jelle Hissink. - Removed address from the default list of block formats since it tends to be missused. - Fixed so the pre block format is called preformatted to make it more verbose. - Fixed so it's possible to context scope translation strings this isn't needed most of the time. - Fixed so the max length of the width/height input fields of the media dialog is 5 instead of 3. - Fixed so drag/dropped contents gets properly processed by paste plugin since it's basically a paste. Patch contributed by Greg Fairbanks. - Fixed so shortcut keys for headers is ctrl+alt+[1-9] instead of ctrl+[1-9] since these are for switching tabs in the browsers. - Fixed so "u" doesn't get converted into a span element by the legacy input filter. Since this is now a valid HTML5 element. - Fixed font families in order to provide appropriate web-safe fonts. -Version 4.1.7 (2014-11-27) - Added HTML5 schema support for srcset, source and picture. Patch contributed by mattheu. - Added new cache_suffix setting to enable cache busting by producing unique urls. - Added new paste_convert_word_fake_lists option to enable users to disable the fake lists convert logic. - Fixed so advlist style changes adds undo levels for each change. - Fixed bug where WebKit would sometimes produce an exception when the autolink plugin where looking for URLs. - Fixed bug where IE 7 wouldn't be rendered properly due to to aggressive css compression. - Fixed bug where DomQuery wouldn't accept window as constructor element. - Fixed bug where the color picker in 3.x dialogs wouldn't work properly. Patch contributed by Callidior. - Fixed bug where the image plugin wouldn't respect the document_base_url. - Fixed bug where the jQuery plugin would fail to append to elements named array prototype names. -Version 4.1.6 (2014-10-08) - Fixed bug with clicking on the scrollbar of the iframe would cause a JS error to be thrown. - Fixed bug where null would produce an exception if you passed it to selection.setRng. - Fixed bug where Ctrl/Cmd+Tab would indent the current list item if you switched tabs in the browser. - Fixed bug where pasting empty cells from Excel would result in a broken table. - Fixed bug where it wasn't possible to switch back to default list style type. - Fixed issue where the select all quirk fix would fire for other modifiers than Ctrl/Cmd combinations. - Replaced jake with grunt since it is more mainstream and has better plugin support. -Version 4.1.5 (2014-09-09) - Fixed bug where sometimes the resize rectangles wouldn't properly render on images on WebKit/Blink. - Fixed bug in list plugin where delete/backspace would merge empty LI elements in lists incorrectly. - Fixed bug where empty list elements would result in empty LI elements without it's parent container. - Fixed bug where backspace in empty caret formated element could produce an type error exception of Gecko. - Fixed bug where lists pasted from word with a custom start index above 9 wouldn't be properly handled. - Fixed bug where tabfocus plugin would tab out of the editor instance even if the default action was prevented. - Fixed bug where tabfocus wouldn't tab properly to other adjacent editor instances. - Fixed bug where the DOMUtils setStyles wouldn't properly removed or update the data-mce-style attribute. - Fixed bug where dialog select boxes would be placed incorrectly if document.body wasn't statically positioned. - Fixed bug where pasting would sometimes scroll to the top of page if the user was using the autoresize plugin. - Fixed bug where caret wouldn't be properly rendered by Chrome when clicking on the iframes documentElement. - Fixed so custom images for menubutton/splitbutton can be provided. Patch contributed by Naim Hammadi. - Fixed so the default action of windows closing can be prevented by blocking the default action of the close event. - Fixed so nodeChange and focus of the editor isn't automatically performed when opening sub dialogs. -Version 4.1.4 (2014-08-21) - Added new media_filter_html option to media plugin that blocks any conditional comments, scripts etc within a video element. - Added new content_security_policy option allows you to set custom policy for iframe contents. Patch contributed by Francois Chagnon. - Fixed bug where activate/deactivate events wasn't firing properly when switching between editors. - Fixed bug where placing the caret on iOS was difficult due to a WebKit bug with touch events. - Fixed bug where the resize helper wouldn't render properly on older IE versions. - Fixed bug where resizing images inside tables on older IE versions would sometimes fail depending mouse position. - Fixed bug where editor.insertContent would produce an exception when inserting select/option elements. - Fixed bug where extra empty paragraphs would be produced if block elements where inserted inside span elements. - Fixed bug where the spellchecker menu item wouldn't be properly checked if spell checking was started before it was rendered. - Fixed bug where the DomQuery filter function wouldn't remove non elements from collection. - Fixed bug where document with custom document.domain wouldn't properly render the editor. - Fixed bug where IE 8 would throw exception when trying to enter invalid color values into colorboxes. - Fixed bug where undo manager could incorrectly add an extra undo level when custom resize handles was removed. - Fixed bug where it wouldn't be possible to alter cell properties properly on table cells on IE 8. - Fixed so the color picker button in table dialog isn't shown unless you include the colorpicker plugin or add your own custom color picker. - Fixed so activate/deactivate events fire when windowManager opens a window since. - Fixed so the table advtab options isn't separated by an underscore to normalize naming with image_advtab option. - Fixed so the table cell dialog has proper padding when the advanced tab in disabled. -Version 4.1.3 (2014-07-29) - Added event binding logic to tinymce.util.XHR making it possible to override headers and settings before any request is made. - Fixed bug where drag events wasn't fireing properly on older IE versions since the event handlers where bound to document. - Fixed bug where drag/dropping contents within the editor on IE would force the contents into plain text mode even if it was internal content. - Fixed bug where IE 7 wouldn't open menus properly due to a resize bug in the browser auto closing them immediately. - Fixed bug where the DOMUtils getPos logic wouldn't produce a valid coordinate inside the body if the body was positioned non static. - Fixed bug where the element path and format state wasn't properly updated if you had the wordcount plugin enabled. - Fixed bug where a comment at the beginning of source would produce an exception in the formatter logic. - Fixed bug where setAttrib/getAttrib on null would throw exception together with any hooked attributes like style. - Fixed bug where table sizes wasn't properly retained when copy/pasting on WebKit/Blink. - Fixed bug where WebKit/Blink would produce colors in RGB format instead of the forced HEX format when deleting contents. - Fixed bug where the width attribute wasn't updated on tables if you changed the size inside the table dialog. - Fixed bug where control selection wasn't properly handled when the caret was placed directly after an image. - Fixed bug where selecting the contents of table cells using the selection.select method wouldn't place the caret properly. - Fixed bug where the selection state for images wasn't removed when placing the caret right after an image on WebKit/Blink. - Fixed bug where all events wasn't properly unbound when and editor instance was removed or destroyed by some external innerHTML call. - Fixed bug where it wasn't possible or very hard to select images on iOS when the onscreen keyboard was visible. - Fixed so auto_focus can take a boolean argument this will auto focus the last initialized editor might be useful for single inits. - Fixed so word auto detect lists logic works better for faked lists that doesn't have specific markup. - Fixed so nodeChange gets fired on mouseup as it used to before 4.1.1 we optimized that event to fire less often. - Removed the finish menu item from spellchecker menu since it's redundant you can stop spellchecking by toggling menu item or button. -Version 4.1.2 (2014-07-15) - Added offset/grep to DomQuery class works basically the same as it's jQuery equivalent. - Fixed bug where backspace/delete or setContent with an empty string would remove header data when using the fullpage plugin. - Fixed bug where tinymce.remove with a selector not matching any editors would remove all editors. - Fixed bug where resizing of the editor didn't work since the theme was calling setStyles instead of setStyle. - Fixed bug where IE 7 would fail to append html fragments to iframe document when using DomQuery. - Fixed bug where the getStyle DOMUtils method would produce an exception if it was called with null as it's element. - Fixed bug where the paste plugin would remove the element if the none of the paste_webkit_styles rules matched the current style. - Fixed bug where contextmenu table items wouldn't work properly on IE since it would some times fire an incorrect selection change. - Fixed bug where the padding/border values wasn't used in the size calculation for the body size when using autoresize. Patch contributed by Matt Whelan. - Fixed bug where conditional word comments wouldn't be properly removed when pasting plain text. - Fixed bug where resizing would sometime fail on IE 11 when the mouseup occurred inside the resizable element. - Fixed so the iframe gets initialized without any inline event handlers for better CSP support. Patch contributed by Matt Whelan. - Fixed so the tinymce.dom.Sizzle is the latest version of sizzle this resolves the document context bug. -Version 4.1.1 (2014-07-08) - Fixed bug where pasting plain text on some WebKit versions would result in an empty line. - Fixed bug where resizing images inside tables on IE 11 wouldn't work properly. - Fixed bug where IE 11 would sometimes throw "Invalid argument" exception when editor contents was set to an empty string. - Fixed bug where document.activeElement would throw exceptions on IE 9 when that element was hidden or removed from dom. - Fixed bug where WebKit/Blink sometimes produced br elements with the Apple-interchange-newline class. - Fixed bug where table cell selection wasn't properly removed when copy/pasting table cells. - Fixed bug where pasting nested list items from Word wouldn't produce proper semantic nested lists. - Fixed bug where right clicking using the contextmenu plugin on WebKit/Blink on Mac OS X would select the target current word or line. - Fixed bug where it wasn't possible to alter table cell properties on IE 8 using the context menu. - Fixed bug where the resize helper wouldn't be correctly positioned on older IE versions. - Fixed bug where fullpage plugin would produce an error if you didn't specify a doctype encoding. - Fixed bug where anchor plugin would get the name/id of the current element even if it wasn't anchor element. - Fixed bug where visual aids for tables wouldn't be properly disabled when changing the border size. - Fixed bug where some control selection events wasn't properly fired on older IE versions. - Fixed bug where table cell selection on older IE versions would prevent resizing of images. - Fixed bug with paste_data_images paste option not working properly on modern IE versions. - Fixed bug where custom elements with underscores in the name wasn't properly parsed/serialized. - Fixed bug where applying inline formats to nested list elements would produce an incorrect formatting result. - Fixed so it's possible to hide items from elements path by using preventDefault/stopPropagation. - Fixed so inline mode toolbar gets rendered right aligned if the editable element positioned to the documents right edge. - Fixed so empty inline elements inside empty block elements doesn't get removed if configured to be kept intact. - Fixed so DomQuery parentsUntil/prevUntil/nextUntil supports selectors/elements/filters etc. - Fixed so legacyoutput plugin overrides fontselect and fontsizeselect controls and handles font elements properly. -Version 4.1.0 (2014-06-18) - Added new file_picker_callback option to replace the old file_browser_callback the latter will still work though. - Added new custom colors to textcolor plugin will be displayed if a color picker is provided also shows the latest colors. - Added new color_picker_callback option to enable you to add custom color pickers to the editor. - Added new advanced tabs to table/cell/row dialogs to enable you to select colors for border/background. - Added new colorpicker plugin that lets you select colors from a hsv color picker. - Added new tinymce.util.Color class to handle color parsing and converting. - Added new colorpicker UI widget element lets you add a hsv color picker to any form/window. - Added new textpattern plugin that allows you to use markdown like text patterns to format contents. - Added new resize helper element that shows the current width & height while resizing. - Added new "once" method to Editor and EventDispatcher enables since callback execution events. - Added new jQuery like class under tinymce.dom.DomQuery it's exposed on editor instances (editor.$) and globally under (tinymce.$). - Fixed so the default resize method for images are proportional shift/ctrl can be used to make an unproportional size. - Fixed bug where the image_dimensions option of the image plugin would cause exceptions when it tried to update the size. - Fixed bug where table cell dialog class field wasn't properly updated when editing an a table cell with an existing class. - Fixed bug where Safari on Mac would produce webkit-fake-url for pasted images so these are now removed. - Fixed bug where the nodeChange event would get fired before the selection was changed when clicking inside the current selection range. - Fixed bug where valid_classes option would cause exception when it removed internal prefixed classes like mce-item-. - Fixed bug where backspace would cause navigation in IE 8 on an inline element and after a caret formatting was applied. - Fixed so placeholder images produced by the media plugin gets selected when inserted/edited. - Fixed so it's possible to drag in images when the paste_data_images option is enabled. Might be useful for mail clients. - Fixed so images doesn't get a width/height applied if the image_dimensions option is set to false useful for responsive contents. - Fixed so it's possible to pass in an optional arguments object for the nodeChanged function to be passed to all nodechange event listeners. - Fixed bug where media plugin embed code didn't update correctly. -Version 4.0.28 (2014-05-27) - Fixed critical issue with empty urls producing an exception when converted into absolute urls due to resent bug fix in tinymce.util.URI. -Version 4.0.27 (2014-05-27) - Added support for definition lists to lists plugin and enter key logic. This can now created by the format menu. - Added cmd option for the style_formats menu enables you to toggle commands on/off using the formats menu for example lists. - Added definition lists to visualblocks plugin so these are properly visualized like other list elements. - Added new paste_merge_formats option that reduces the number of nested text format elements produced on paste. Enabled by default. - Added better support for nested link_list/image_list menu items each item can now have a "menu" item with subitems. - Added "Add to Dictionary" support to spellchecker plugin when the backend tells that this feature is available. - Added new table_default_attributes/table_default_styles options patch contributed by Dan Villiom Podlaski Christiansen. - Added new table_class_list/table_cell_class_list/table_row_class_list options to table plugin. - Added new invalid_styles/valid_classes options to better control what gets returned for the style/class attribute. - Added new file_browser_callback_types option that allows you to specify where to display the picker based on dialog type. - Fixed so the selected state is properly handled on nested menu items in listboxes patch contributed by Jelle Kralt. - Fixed so the invisiblity css value for TinyMCE gets set to inherit instead of visible to better support dialog scripts like reveal. - Fixed bug where Gecko would remove anchors when pasting since the their default built in logic removes empty nodes. - Fixed bug where it wasn't possible to paste on Chrome Andoid since it doesn't properly support the Clipboard API yet. - Fixed bug where user defined type attribute value of text/javascript didn't get properly serialized. - Fixed bug where space in span elements would removed when the element was considered empty. - Fixed bug where the undo/redo button states didn't change if you removed all undo levels using undoManager.clear. - Fixed bug where unencoded links inside query strings or hash values would get processed by the relative urls logic. - Fixed bug where contextmenu would automatically close in inline editing mode on Firefox running on Mac. - Fixed bug where Gecko/IE would produce multiple BR elements when forced_root_block was set to false and a table was the last child of body. - Fixed bug where custom queryCommandState handlers didn't properly handle boolean states. - Fixed bug where auto closing float panels link menus wasn't automatically closed when the window was resized. - Fixed bug where the image plugin wouldn't update image dimensions when the current image was changed using the image_list select box. - Fixed bug with paste plugin not properly removing paste bin on Safari Mac when using the cmd+shift+v keyboard command. - Fixed bug where the paste plugin wouln't properly strip trailing br elements under very specific scenarios. - Fixed bug where enter key wouldn't properly place the caret on Gecko when pressing enter in a text block with a br ended line inside. - Fixed bug where Safari Mac shortcuts like Cmd+Opt+L didn't get passed through to the browser due to a Quirks fix. - Fixed so plain text mode works better when it converts rich text to plain text when pasting from for example Word. - Fixed so numeric keycodes can be used in the shortcut format enabling support for any key to be specified. - Fixed so table cells can be navigated with tab key and new rows gets automatically added when you are at the last cell. - Fixed bug where formatting before cursor gets removed when toggled off for continued content. -Version 4.0.26 (2014-05-06) - Fixed bug in media plugin where changing existing url did not use media regex patterns to create protocol neutral url. - Fixed bug where selection wasn't properly restored on IE 11 due to a browser bug with Element.contains. -Version 4.0.25 (2014-04-30) - Fixed bug where it wasn't possible to submit forms with editor instances on WebKit/Blink. -Version 4.0.24 (2014-04-30) - Added new event_root setting for inline editors. Lets you bind all editor events on a parent container. - Fixed bug where show/hide/isHidden didn't work properly for inline editor instances. - Fixed bug where preview plugin dialog didn't handle relative urls properly. - Fixed bug where the autolink plugin would remove the trailing space after an inserted link. - Fixed bug in paste plugin where pasting in a page with scrollbars would scroll to top of page in webkit browsers. - Fixed bug where the paste plugin on WebKit would remove styles from pasted source code with style attributes. - Fixed so image_list/link_list can be a function that allows custom async calls to populate these lists. -Version 4.0.23 (2014-04-24) - Added isSameOrigin method to tinymce.util.URI it handles default protocol port numbers better. Patch contributed by Matt Whelan. - Fixed bug where IE 11 would add br elements to the end of the editor body element each time it was shown/hidden. - Fixed bug where the autolink plugin would produce an index out of range exception for some very specific HTML. - Fixed bug where the charmap plugin wouldn't properly insert non breaking space characters when selected. - Fixed bug where pasting from Excel 2011 on Mac didn't produce a proper table when using the paste plugin. - Fixed bug where drag/dropping inside a table wouldn't properly end the table cell selection. - Fixed bug where drag/dropping images within tables on Safari on Mac wouldn't work properly. - Fixed bug where editors couldn't be re-initialized if they where externally destroyed. - Fixed bug where inline editors would produce a range index exception when clicking on buttons like bold. - Fixed bug where the preview plugin wouldn't properly handle non encoded upper UTF-8 characters. - Fixed so document.currentScript is used when detecting the current script location. Patch contributed by Mickael Desgranges. - Fixed issue with the paste_webkit_styles option so is disabled by default since it might produce a lot of extra styles. -Version 4.0.22 (2014-04-16) - Added lastLevel to BeforeAddUndo level event so it's easier to block undo level creation based. - Fixed so multiple list elements can be indented properly. Patch contributed by Dan Villiom Podlaski Christiansen. - Fixed bug where the selection would be at the wrong location sometimes for inline editor instances. - Fixed bug where drag/dropping content into an inline editor would fail on WebKit/Blink. - Fixed bug where table grid wouldn't work properly when the UI was rendered in for RTL mode. - Fixed bug where range normalization wouldn't handle mixed contentEditable nodes properly. - Fixed so the media plugin doesn't override the existing element rules you now need to manually whitelist non standard attributes. - Fixed so old language packs get properly loaded when the new longer language code format is used. - Fixed so all track changes junk such as comments, deletes etc gets removed when pasting from Word. - Fixed so non image data urls is blocked by default since they might contain scripts. - Fixed so it's possible to import styles from the current page stylesheets into an inline editor by using the importcss_file_filter. - Fixed bug where the spellchecker plugin wouldn't add undo levels for each suggestion replacement. - Reworked the default spellchecker RPC API to match the new PHP Spellchecker package. Fallback documented in the TinyMCE docs. -Version 4.0.21 (2014-04-01) - Added new getCssText method to formatter to get the preview css text value for a format to be used in UI. - Added new table_grid option that allows you to disable the table grid and use a dialog. - Added new image_description, image_dimensions options to image plugin. Patch contributed by Pat O'Neill. - Added new media_alt_source, media_poster, media_dimensions options to media plugin. Patch contributed by Pat O'Neill. - Added new ability to specify high/low dpi versions custom button images for retina displays. - Added new getWindows method to WindowManager makes it easier to control the currently opened windows. - Added new paste_webkit_styles option to paste plugin to control the styles that gets retained on WebKit. - Added preview of classes for the selectboxes used by the link_class_list/image_class_list options. - Added support for Sauce Labs browser testing using the new saucelabs-tests build target. - Added title input field to link dialog for a11y reasons can be disabled by using the link_title option. - Fixed so the toolbar option handles an array as input for multiple toolbar rows. - Fixed so the editor renders in XHTML mode apparently some people still use this rendering mode. - Fixed so icons gets rendered better on Firefox on Mac OS X by applying -moz-osx-font-smoothing. - Fixed so the auto detected external media sources produced protocol relative urls. Patch contributed by Pat O'Neill. - Fixed so it's possible to update the text of a button after it's been rendered to page DOM. - Fixed bug where iOS 7.1 Safari would open linked when images where inserted into links. - Fixed bug where IE 11 would scroll to the top of inline editable elements when applying formatting. - Fixed bug where tabindex on elements within the editor contents would cause issues on some browsers. - Fixed bug where link text wouldn't be properly updated in gecko if you changed an existing link. - Fixed bug where it wasn't possible to close dialogs with the escape key if the focus was inside a textbox. - Fixed bug where Gecko wouldn't paste rich text contents from Word or other similar word processors. - Fixed bug where binding events after the control had been rendered could fail to produce a valid delegate. - Fixed bug where IE 8 would throw and error when removing editors with a cross domain content_css setting. - Fixed bug where IE 9 wouldn't be able to select text after an editor instance with caret focus was removed. - Fixed bug where the autoresize plugin wouldn't resize the editor if you inserted huge images. - Fixed bug where multiple calls to the same init would produce extra editor instances. - Fixed bug where fullscreen toggle while having the autoresize plugin enabled wouldn't produce scrollbars. - Fixed so screen readers use a dialog instead of the grid for inserting tables. - Fixed so Office 365 Word contents gets filtered the same way as content from desktop Office. - Fixed so it's possible to override the root container for UI elements defaults to document.body. - Fixed bug where tabIndex is set to -1 on inline editable elements. It now keeps the existing tabIndex intact. - Fixed issue where the UndoManager transact method couldn't be nested since it only had one lock. - Fixed issue where headings/heading where labeled incorrectly as headers/header. -Version 4.0.20 (2014-03-18) - Fixed so all unit tests can be executed in a headless phantomjs instance for CI testing. - Fixed so directionality setting gets applied to the preview dialog as well as the editor body element. - Fixed a performance issue with the "is" method in DOMUtils. Patch contributed by Paul Bosselaar. - Fixed bug where paste plugin wouldn't paste plain text properly when pasting using browser menus. - Fixed bug where focusable SVG elements would throw an error since className isn't a proper string. - Fixed bug where the preview plugin didn't properly support the document_base_url setting. - Fixed bug where the focusedEditor wouldn't be set to null when that editor was removed. - Fixed bug where Gecko would throw an exception when editors where removed. - Fixed bug where the FocusManager wouldn't handle selection restoration properly on older IE versions. - Fixed bug where the searchreplace plugin would produce an exception on very specific multiple searches. - Fixed bug where some events wasn't properly unbound when all editors where removed from page. - Fixed bug where tapping links on iOS 7.1 would open the link instead of placing the caret inside. - Fixed bug where holding the finger down on iOS 7.1 would open the link/image callout menu. - Fixed so the jQuery plugin returns null when getting the the tinymce instance of an element before it's initialized. - Fixed so selection normalization gets executed more often to reduce incorrect UI states on Gecko. - Fixed so the default action of closing the window on a form submission can be prevented using "preventDefault". -Version 4.0.19 (2014-03-11) - Added support for CSS selector expressions in object_resizing option. Allows you to control what to resize. - Added addToTop compatibility to compat3x plugin enables more legacy 3.x plugins to work properly. - Fixed bug on IE where it wasn't possible to align images when they where floated left. - Fixed bug where the indent/outdent buttons was enabled though readonly mode was enabled. - Fixed bug where the nodeChanged event was fired when readonly mode was enabled. - Fixed bug where events like blur could be fired to editor instances that where manually removed on IE 11. - Fixed bug where IE 11 would move focus to menubar/toolbar when using the tab key in a form with an editor. - Fixed bug where drag/drop in Safari on Mac didn't work properly due to lack of support for modern dataTransfer object. - Fixed bug where the remove event wasn't properly executed when the editor instances where removed. - Fixed bug where the selection change handler on inline editors would fail if the editor instance was removed. -Version 4.0.18 (2014-02-27) - Fixed bug where images would get class false/undefined when initially created. -Version 4.0.17 (2014-02-26) - Added much better wai-aria accessibility support when it comes to keyboard navigation of complex UI controls. - Added dfn,code,samp,kbd,var,cite,mark,q elements to the default remove formats list. Patch contributed by Naim Hammadi. - Added var,cite,dfn,code,mark,q,sup,sub to the list of elements that gets cloned on enter. Patch contributed by Naim Hammadi. - Added new visual_anchor_class option to specify a custom class for inline anchors. Patch contributed by Naim Hammadi. - Added support for paste_data_images on WebKit/Blink when the user pastes image data. - Added support for highlighting the video icon when a video is added that produces an iframe. Patch contributed by monkeydiane. - Added image_class_list/link_class_list options to image/link dialogs to let the user select classes. - Fixed bug where the ObjectResizeStart event didn't get fired properly by the ControlSelection class. - Fixed bug where the autolink plugin would steal focus when loaded on IE 9+. - Fixed bug where the editor save method would remove the current selection when called on an inline editor. - Fixed bug where the formatter would merge span elements with parent bookmarks if an id format was used. - Fixed bug where WebKit/Blink browsers would scroll to the top of the editor when pasting into an empty element. - Fixed bug where removing the editor would cause an error about wrong document on IE 11 under specific circumstances. - Fixed bug where Gecko would place the caret at an incorrect location when using backspace. - Fixed bug where Gecko would throw "Wrong Document Error" for ranges that pointing to removed nodes. - Fixed bug where it wasn't possible to properly update the title and encoding properties in the fullpage plugin. - Fixed bug where paste plugin would produce an extra undo level on IE. - Fixed bug where the formatter would apply inline formatting outside the current word in if the selection was collapsed. - Fixed bug where it wasn't possible to delete tables on Chrome if you placed the selection within all the contents of the table. - Fixed bug where older IE versions wouldn't properly insert contents into table cells when editor focus was lost. - Fixed bug where older IE versions would fire focus/blur events even though the editor focus didn't change. - Fixed bug where IE 11 would add two trailing BR elements to the editor iframe body if the editor was hidden. - Fixed bug where the visualchars plugin wouldn't display non breaking spaces if they where inserted while the state was enabled. - Fixed bug where the wordcount plugin would be very slow some HTML where to much backtracking occurred. - Fixed so pagebreak elements in the editor breaks pages when printing. Patch contributed by penc. - Fixed so UndoManager events pass though the original event that created the undo level such as a keydown, blur etc. - Fixed so the inserttime button is callsed insertdatetime the same as the menu item and plugin name. - Fixed so the word count plugin handles counting properly on most languages on the planet. - Fixed bug where the auroreize plugin would throw an error if the editor was manually removed within a few seconds. - Fixed bug where the image dialog would get stuck if the src was removed. Patch contribued by monkeydiane. - Fixed bug where there is an extra br tag for IE 9/10 that isn't needed. Patch contributed by monkeydiane. - Fixed bug where drag/drop in a scrolled editor would fail since it didn't use clientX/clientY cordinates. Patch contributed by annettem. -Version 4.0.16 (2014-01-31) - Fixed bug where the editor wouldn't be properly rendered on IE 10 depending on the document.readyState. -Version 4.0.15 (2014-01-31) - Fixed bug where paste in inline mode would produce an exception if the contents was pasted inside non overflow element. -Version 4.0.14 (2014-01-30) - Fixed a bug in the image plugin where images couldn't be inserted if the image_advtab option wasn't set to true. -Version 4.0.13 (2014-01-30) - Added language selection menu to spellchecker button similar to the 3.x functionality. Patch contributed by threebytesfull. - Added new style_formats_merge option that enables you to append to the default formats instead of replaceing them. Patch contributed by PacificMorrowind. - Fixed bug where the DOMUtils getPos API function didn't properly handle the location of the root element. Patch contributed by Andrew Ozz. - Fixed bug where the spellchecker wouldn't properly place the spellchecker suggestions menu. Patch contributed by Andrew Ozz. - Fixed bug where the tabfocus plugin would prevent the user from suing Ctrl+Tab, Patch contributed by Andrew Ozz. - Fixed bug where table resize handles could sometimes be added to elements out side the editable inline element. - Fixed bug where the inline mode editor UI would render incorrectly when the stylesheets didn't finish loading on Chrome. - Fixed bug where IE 8 would insert the image outside the editor unless it was focused first. - Fixed bug where older IE versions would throw an exception on drag/drop since they don't support modern dataTransfer API. - Fixed bug where the blockquote button text wasn't properly translated since it had the wrong English key. - Fixed bug where the importcss plugin didn't import a.class rules properly as selector formats. - Fixed bug where the combobox control couldn't be disabled or set to a specific character size initially. - Fixed bug where the FormItem didn't inherit the disabled state from the control to be wrapped. - Fixed bug where adding a TinyMCE instance within a TinyMCE dialog wouldn't properly delegate the events. - Fixed bug where any overflow parent containers would automatically scroll to the left when pasting in Chrome. - Fixed bug where IE could throw an error when search/replacing contents due to an invalid selection being returned. - Fixed bug where WebKit would fire focus/blur events incorrectly if the editor was empty due to a WebKit focus bug. - Fixed bug where WebKit/Blink would scroll to the top of editor if the height was more than the viewport height. - Fixed bug where blurring and removing the editor could cause an exteption to be thrown by the FocusManager. - Fixed bug where the media plugin would override specified dimensions for url pattern matches. Patch contributed by penc. - Fixed bug where the autoresize plugin wouldn't take margins into account when calculating the body size. Patch contributed by lepoltj. - Fixed bug where the image plugin would throw errors some times on IE 8 when it preloaded the image to get it's dimensions. - Fixed bug where the image plugin wouldn't update the style if the user closed the dialog before focusing out. Patch contributed by jonparrott. - Fixed bug where bindOnReady in EventUtils wouldn't work properly for some edge cases on older IE versions. Patch contributed by Godefroy. - Fixed bug where image selector formats wasn't properly handled by the importcss plugin. - Fixed bug where the dirty state of the editor wasn't set when editing an existing link URL. - Fixed bug where it wasn't possible to prevent paste from happening by blocking the default behavior when the paste plugin was enabled. - Fixed bug where text to display in the insert/edit link dialog wouldn't be properly entity encoded. - Fixed bug where Safari 7 on Mac OS X would delete contents if you pressed Cmd+C since it passes out a charCode for the event. - Fixed bug where bound drop events inside inline editors would get fired on all editor instances instead of the specific instance. - Fixed bug where images outlined selection border would be clipped when the autoresize plugin was enabled. - Fixed bug where image dimension constrains proportions wouldn't work properly if you altered a value and immediately clicked the submit button. - Fixed so you don't need to set language option to false when specifying a custom language_url. - Fixed so the link dialog "text to display" field gets automatically hidden if the selection isn't text contents. Patch contributed by Godefroy. - Fixed so the none option for the target field in the link dialog gets excluded when specifiying the target_list config option. - Fixed so outline styles are displayed by default in the formats preview. Patch contributed by nhammadi. - Fixed so the max characters for width/height is more than 3 in the media and image dialogs. - Fixed so the old mceSpellCheck command toggles the spellchecker on/off. - Fixed so the setupeditor event is fired before the setup callback setting to ease up compatibility with 3.x. - Fixed so auto url link creation in IE 9+ is disabled by default and re-enabled by the autolink plugin. - Removed the custom scrollbars for WebKit since the default browser scrollbars looks a lot better now days. -Version 4.0.12 (2013-12-18) - Added new media_scripts option to the media plugin. This makes it possible to embed videos using script elements. - Fixed bug where WebKit/Blink would produce random span elements and styles when deleting contents inside the editor. - Fixed bug where WebKit/Blink would produce span elements out of link elements when they where removed by the unlink command. - Fixed bug where div block formats in inline mode where applied to all paragraphs within the editor. - Fixed bug where div blocks where marked as an active format in inline mode when doing non collapsed selections. - Fixed bug where the importcss plugin wouldn't append styles if the style_formats option was configured. - Fixed bug where the importcss plugin would import styles into groups multiple times for different format menus. - Fixed bug where the paste plugin wouldn't properly remove the paste bin element on IE if a tried to paste a file. - Fixed bug where selection normalization wouldn't properly handle cases where a range point was after a element node. - Fixed bug where the default time format for the inserttime split button wasn't the first item in the list. - Fixed bug where the default text for the formatselect control wasn't properly translated by the language pack. - Fixed bug where links would be inserted incorrectly when auto detecting absolute urls/emails links in inline mode. - Fixed bug where IE 11 would insert contents in the wrong order due to focus/blur async problems. - Fixed bug where pasting contents on IE sometimes would place the contents at the end of the editor. - Fixed so drag/drop on non IE browsers gets filtered by the paste plugin. IE doesn't have the necessary APIs. - Fixed so the paste plugin better detects Word 2007 contents not marked with -mso junk. - Fixed so image button isn't set to an active state when selecting control/media placeholder items. -Version 4.0.11 (2013-11-20) - Added the possibility to update button icon after it's been rendered. - Added new autosave_prefix option allows you to set the prefix for the local storage keys. - Added new pagebreak_split_block option to make it easier to split block elements with a page break. - Fixed bug where IE would some times produce font elements when typing out side the body root blocks. - Fixed bug where IE wouldn't properly use the configured root block element but instead use the a paragraph. - Fixed bug where IE would throw a stack overflow if control selections non images was made in inline mode. - Fixed bug where IE 8 would render an extra enter element if the contents of the editor was empty. - Fixed bug where the caret wasn't moved to the first suitable element when updating the source. - Fixed bug where protocol relative urls would be forced into http protocol. - Fixed bug where internal images with data urls such as video elements would be removed by the paste_data_images option. - Fixed bug where the autoresize plugin wouldn't properly resize the editor to initial contents some times. - Fixed bug where the templates dialog wouldn't be properly rendered on IE 7. - Fixed bug where updating styles in the advanced tab under the image dialog would remove the style attribute on cancel. - Fixed bug where tinymce.full.min.js bundle script wasn't detected when looking for the tinymce root path. - Fixed bug where the SaxParser would throw a malformed URI sequence for inproperly encoded uris. - Fixed bug where enabling table caption wouldn't properly render the caption element on IE 10 and below. - Fixed bug where the scrollbar would be placed to the left and on top of the text of menu items in RTL mode. - Fixed bug where Firefox on Mac OS X would navigate forward/backward on CMD+Arrow keys. - Fixed bug where fullscreen toggle on fixed sized editors wouldn't be properly full screened. - Fixed bug where the unlink button would remove all links from the body element in inline mode under running in IE. - Fixed bug where iOS wasn't able to place the caret inside an empty editor when clicking below the first line. - Fixed so internal document anchors in Word documents are retained when pasting using the paste from word feature. - Fixed so menu shortcuts gets rendered with the Apple command icon patch contributed by Andy Keller. - Fixed so the CSS compression of styles like "border" is a bit better for mixed values. - Fixed so the template_popup_width/template_popup_height option works properly in the template plugin. - Fixed so the languages parameter for AddOnManager.requireLangPack works the same way as for 3.x. - Fixed so the autosave plugin uses the current page path, query string and editor id as it's default prefix. - Fixed so the fullpage plugin adds/removes any link style sheets to the current iframe document. -Version 4.0.10 (2013-10-28) - Added new forced_root_block_attrs option that allows you to specify attributes for the root block. - Fixed bug where the custom resize handles didn't work properly on IE 11. - Fixed bug where the code plugin would select all contents in IE when content was updated. - Fixed bug where the scroll position wouldn't get applied to floating toolbars. - Fixed bug where focusing in/out of the editor would move the caret to the top of the editor on IE 11. - Fixed bug where the listboxes for link and image lists wasn't updated when the url/src was changed. - Fixed bug where selection bookmark elements would be visible in the elements path list. -Version 4.0.9 (2013-10-24) - Added support for external template files to template plugin just set the templates option to a URL with JSON data. - Added new allow_script_urls option. Enabled by default, trims all script urls from attributes. - Fixed bug where IE would sometimes throw a "Permission denied" error unless the Sizzle doc was properly removed. - Fixed bug where lists plugin would remove outer list items if inline editable element was within a LI parent. - Fixed bug where insert table grid widget would insert a table on item to large when using a RTL language pack. - Fixed bug where fullscreen mode wasn't rendering properly on IE 7. - Fixed bug where resize handlers wasn't moved correctly when scrolling inline editable elements. - Fixed bug where it wasn't possible to paste from Excel and possible other applications due to Clipboard API bugs in browsers. - Fixed bug where Shift+Ctrl+V didn't produce a plain text paste on IE. - Fixed bug where IE would sometimes move the selection to the a previous location. - Fixed bug where the editor wasn't properly scrolled to the content insert location in inline mode. - Fixed bug where some comments would be parsed as HTML by the SaxParser. - Fixed bug where WebKit/Blink would render tables incorrectly if unapplying formats when having multiple table cells selected. - Fixed bug where the paste_data_images option wouldn't strip all kinds of data images. - Fixed bug where the GridLayout didn't render items correctly if the contents overflowed the layout container. - Fixed bug where the Window wasn't properly positioned if the size of the button bar or title bar was wider than the contents. - Fixed bug where psuedo selectors for finding UI controls didn't work properly. - Fixed bug where resized splitbuttons would throw an exception if it didn't contain an icon. - Fixed bug where setContent would move focus into the editor even though it wasn't active. - Fixed bug where IE 11 would sometimes throw an "Invalid function" error when calling setActive on the body element. - Fixed bug where the importcss plugin would import styles from CSS files not present in the content_css array. - Fixed bug where the jQuery plugin will initialize the editors twice if the core was loaded using the script_url option. - Fixed various bugs and issues related to indentation of OL/UL list elements. - Fixed so IE 7 renders the classic mode buttons the same size as other browsers. - Fixed so document.readyState is checked when loading and initializing TinyMCE manually after page load. -Version 4.0.8 (2013-10-10) - Added RTL support so all of the UI is rendered right to left if a language pack has a _dir property set to rtl. - Fixed bug where layout managers wouldn't handle subpixel values properly. When for example the browser was zoomed in. - Fixed bug where the importcss plugin wouldn't import classes from local stylesheets with remote @import rules on Gecko. - Fixed bug where Arabic characters wouldn't be properly counted in wordcount plugin. - Fixed bug where submit event would still fire even if it was unbound on IE 10. Now the event is simply ignored. - Fixed bug where IE 11 would return border-image: none when getting style attributes with borders in them. - Fixed various UI rendering issues on older IE versions. - Fixed so readonly option renderes the editor in inline mode with all UI elements disabled and all events blocked. -Version 4.0.7 (2013-10-02) - Added new importcss_selector_filter option to importcss plugin. Makes it easier to select specific classes to import. - Added new importcss_groups option to importcss plugin. Enables you separate classes into menu groups based on filters. - Added new PastePreProcess/PastePostProcess events and reintroduced paste_preprocess/paste_postprocess paste options. - Added new paste_word_valid_elements option lets you control what elements gets pasted when pasting from Word. - Fixed so panelbutton is easier to use. It's now possible to set the panel contents to any container type. - Fixed so editor.destroy calls editor.remove so that both destroy and remove can be used to remove an editor instance. - Fixed so the searchreplace plugin doesn't move focus into the editor until you close the dialog. - Fixed so the searchreplace plugin search for next item if you hit enter inside the dialog. - Fixed so importcss_selector_converter callback is executed with the scope set to importcss plugin instance. - Fixed so the default selector converter function is exposed in importcss plugin. - Fixed issue with the tabpanel not expanding properly when the tabs where wider than the body of the panel. - Fixed issue with the menubar option producing a JS exception if set to true. - Fixed bug where closing a dialog with an opened listbox would cause errors if new dialogs where opened. - Fixed bug where hidden input elements wasn't removed when inline editor instances where removed. - Fixed bug where editors wouldn't initialize some times due to event logic not working correctly. - Fixed bug where pre elements woudl cause searchreplace and spellchecker plugins to mark incorrect locations. - Fixed bug where embed elements wouldn't be properly resized if they where configured in using the video_template_callback. - Fixed bug where paste from word would remove all BR elements since it was missing in the default paste_word_valid_elements. - Fixed bug where paste filtering wouldn't work properly on old WebKit installations pre Clipboard API. - Fixed bug where linebreaks would be removed by paste plugin on IE since it didn't properly detect Word contents. - Fixed bug where paste plugin would convert some Word paragraphs that looked like lists into lists. - Fixed bug where editors wasn't properly initialized if the document.domain is set to the same as the current domain on IE. - Fixed bug where an exception was thrown when removing an editor after opening the context menu multiple times. - Fixed bug where paste as plain text on Gecko would add extra BR elements when pasting paragraphs. -Version 4.0.6 (2013-09-12) - Added new compat3x plugin that makes it possible to load most 3.x plugins. Only available in the development package. - Added new skin_url option enables you to load local skins when using the CDN version. - Added new theme_url option enables you to load local themes when using the CDN version. - Added new importcss_file_filter option to importcss to enable users to specify what files to import from. - Added new template_preview_replace_values option to template plugin to add example data for variables. - Added image option support for addMenuItem calls. Enables you to provide a custom image for menu items. - Fixed bug where editor.insertContent wouldn't set format and selection type on events. - Fixed bug where inserting BR elements on IE 8 would thrown an exception when the range is at a empty text node. - Fixed bug where outdent of single LI element within another LI would produce an empty list element OL/UL. - Fixed bug where the bullist/numlist buttons wouldn't be deselected when deleting all contents. - Fixed bug where toggling an empty list item off wouldn't produce a new empty block element. - Fixed bug where it wasn't possible to apply lists to mixed text blocks and br lines. - Fixed bug where it wasn't possible to paste contents on iOS when the paste plugin was enabled. - Fixed bug where it wasn't possible to delete HR elements on Gecko. - Fixed bug where scrolling and refocusing using the mouse would place the caret incorrectly on IE. - Fixed bug where you needed to hit the empty paragraph to get editor focus in IE 11. - Fixed bug where activeEditor wasn't set to the correct editor when opening windows. - Fixed bug where dirty state wasn't set to false when undoing to the first undo level. - Fixed bug where pasting in inline mode on Safari on Mac wouldn't work properly. - Fixed bug where content_css wasn't loaded into the insert template dialog. - Fixed bug where setting the contents of the editor to non text contents would produce an incorrect selection range. - Fixed so code dialog height gets smaller that the viewport height if it doesn't fit. - Fixed so inline editable regions scroll when pressing enter/return. - Fixed so inline toolbar gets positioned correctly when inline element is within a scrollable container. - Fixed various memory leaks when removing editor instances dynamically. - Removed CSS for BR elements in visualblocks due to problems with Chrome and IE. -Version 4.0.5 (2013-08-27) - Added visuals for UL, LI and BR to visualblocks plugin. Patch contributed by Dan Ransom. - Added new autosave_restore_when_empty option to autosave plugin. Enabled by default. - Fixed bug where an exception was thrown when inserting images if valid_elements didn't include an ID for the image. - Fixed bug where the advlist plugin wouldn't properly render the splitbutton controls. - Fixed bug where visual blocks menu item wouldn't be marked checked when using the visualblocks_default_state option. - Fixed bug where save button in save plugin wouldn't get properly enabled when contents was changed. - Fixed bug where it was possible to insert images without any value for it's source attribute. - Fixed bug where altering image attributes wouldn't add a new undo level. - Fixed bug where import rules in CSS files wouldn't be properly imported by the importcss plugin. - Fixed bug where selectors could be imported multiple times. Producing duplicate formats. - Fixed bug where IE would throw exception if selection was changed while the editor was hidden. - Fixed so complex rules like .class:before doesn't get imported by default in the importcss plugin. - Fixed so it's possible to remove images by setting the src attribute to a blank value. - Fixed so the save_enablewhendirty setting in the save plugin is enabled by default. - Fixed so block formats drop down for classic mode can be translated properly using language packs. - Fixed so hr menu item and toolbar button gets the same translation string. - Fixed so bullet list toolbar button gets the correct translation from language packs. - Fixed issue with Chrome logging CSS warning about border styling for combo boxes. - Fixed issue with Chrome logging warnings about deprecated keyLocation property. - Fixed issue where custom_elements would not remove the some of the default rules when cloning rules from div and span. -Version 4.0.4 (2013-08-21) - Added new importcss plugin. Lets you auto import classes from CSS files similar to the 3.x behavior. - Fixed bug where resize handles would be positioned incorrectly when inline element parent was using position: relative. - Fixed bug where IE 8 would throw Unknown runtime error if the editor was placed within a P tag. - Fixed bug where removing empty lists wouldn't produce blocks or brs where the old list was in the DOM. - Fixed bug where IE 10 wouldn't properly initialize template dialog due to async loading issues. - Fixed bug where autosave wouldn't properly display the warning about content not being saved due to isDirty changes. - Fixed bug where it wouldn't be possible to type if a touchstart event was bound to the parent document. - Fixed bug where code dialog in code plugin wouldn't wouldn't add a proper undo level. - Fixed issue where resizing the editor in vertical mode would set the iframe width to a pixel value. - Fixed issue with naming of insertdatetime settings. All are now prefixed with the plugin name. - Fixed so an initial change event is fired when the user types the first character into the editor. - Fixed so swf gets mapped to object element in media plugin. Enables embedding of flash with alternative poster. -Version 4.0.3 (2013-08-08) - Added new code_dialog_width/code_dialog_height options to control code dialog size. - Added missing pastetext button that works the same way as the pastetext menu item. - Added missing smaller browse button for the classical smaller toolbars. - Fixed bug where input method would produce new lines when inserting contents to an empty editor. - Fixed bug where pasting single indented list items from Word would cause a JS exception. - Fixed bug where applying block formats inside list elements in inline mode would apply them to whole document. - Fixed bug where link editing in inline mode would cause exception on IE/WebKit. - Fixed bug where IE 10 wouldn't render the last button group properly in inline mode due to wrapping. - Fixed bug where localStorage initialization would fail on Firefox/Chrome with disabled support. - Fixed bug where image elements would get an __mce id when undo/redo:ing to a level with image changes. - Fixed bug where too long template names wouldn't fit the listbox in template plugin. - Fixed bug where alignment format options would be marked disabled when forced_root_block was set to false. - Fixed bug where UI listboxes such as fontsize, fontfamily wouldn't update properly when switching editors in inline mode. - Fixed bug where the formats select box would mark the editable container DIV as a applied format in inline mode. - Fixed bug where IE 7/8 would scroll to empty editors when initialized. - Fixed bug where IE 7/8 wouldn't display previews of format options. - Fixed bug where UI states wasn't properly updated after code was changed in the code dialog. - Fixed bug with setting contents in IE would select all contents within the editor. - Fixed so the undoManages transact function disables any other undo levels from being added while within the transaction. - Fixed so sub/sup elements gets removed when the Clear formatting action is executed. - Fixed so text/javascript type value get removed by default from script elements to match the HTML5 spec. -Version 4.0.2 (2013-07-18) - Fixed bug where formatting using menus or toolbars wasn't possible on Opera 12.15. - Fixed bug where IE 8 keyboard input would break after paste using the paste plugin. - Fixed bug where IE 8 would throw an error when populating image size in image dialog. - Fixed bug where image resizing wouldn't work properly on latest IE 10.0.9 version. - Fixed bug where focus wasn't moved to the hovered menu button in a menubar container. - Fixed bug where paste would produce an extra uneeded undo level on IE and Gecko. - Fixed so anchors gets listed in the link dialog as they where in TinyMCE 3.x. - Fixed so sub, sup and strike though gets passed through when pasting from Word. - Fixed so Ctrl+P can be used to print the current document. Patch contributed by jashua212. -Version 4.0.1 (2013-06-26) - Added new paste_as_text config option to force paste as plaintext mode. - Added new pastetext menu item that lets you toggle paste as plain text mode on/off. - Added new insertdatetime_element option to insertdatetime plugin. Enables HTML5 time element support. - Added new spellchecker_wordchar_pattern option to allow configuration of language specific characters. - Added new marker to formats menu displaying the formats used at the current selection/caret location. - Fixed bug where the position of the text color picker would be wrong if you switched to fullscreen. - Fixed bug where the link plugin would ask to add the mailto: prefix multiple times. - Fixed bug where list outdent operation could produce empty list elements on specific selections. - Fixed bug where element path wouldn't properly select parent elements on IE. - Fixed bug where IE would sometimes throw an exception when extrancting the current selection range. - Fixed bug where line feeds wasn't properly rendered in source view on IE. - Fixed bug where word count wouldn't be properly rendered on IE 7. - Fixed bug where menubuttons/listboxes would have an incorrect height on IE 7. - Fixed bug where browser spellchecking was enabled while editing inline on IE 10. - Fixed bug where spellchecker wouldn't properly find non English words. - Fixed bug where deactivating inline editor instances would force padding-top: 0 on page body. - Fixed bug where jQuery would initialize editors multiple times since it didn't check if the editor already existed. - Fixed bug where it wasn't possible to paste contents on IE 10 in modern UI mode when paste filtering was enabled. - Fixed bug where tabfocus plugin wouldn't work properly on inline editor instances. - Fixed bug where fullpage plugin would clear the existing HTML head if contents where inserted into the editor. - Fixed bug where deleting all table rows/columns in a table would cause an exception to be thrown on IE. - Fixed so color button panels gets toggled on/off when activated/deactivated. - Fixed so format menu items that can't be applied to the current selection gets disabled. - Fixed so the icon parameter for addButton isn't automatically filled if a button text is provided. - Fixed so image size fields gets updated when selecting a new image in the image dialog. - Fixed so it doesn't load any language pack if the language option is set to "en". - Fixed so ctrl+shift+z works as an alternative redo shortcut to match a common Mac OS X shortcut. - Fixed so it's not possible to drag/drop in images in Gecko by default when paste plugin is enabled. - Fixed so format menu item texts gets translated using the specified language pack. - Fixed so the image dialog title is the same as the insert/edit image button text. - Fixed so paste as plain text produces BR:s in PRE block and when forced_root_block is disabled. -Version 4.0 (2013-06-13) - Added new insertdate_dateformat, insertdate_timeformat and insertdate_formats options to insertdatetime. - Added new font_formats, fontsize_formats and block_formats options to configure fontselect, fontsizeselect and formatselect. - Added new table_clone_elements option to table plugin. Enables you to specify what elements to clone when adding columns/rows. - Added new auto detect logic for site and email urls in link plugin to match the logic found in 3.x. - Added new getParams/setParams to WindowManager to make it easier to handle params to iframe based dialogs. Contributed by Ryan Demmer. - Added new textcolor options that enables you to specify the colors you want to display. Contributed by Jennifer Arsenault. - Added new external file support for link_list and image_list options. The file format is a simple JSON file. - Added new "both" mode for the resize option. Enables resizing in both width and height. - Added new paste_data_images option that allows you to enable/disable paste of data images. - Added new fixed_toolbar_container option that allows you to add a fixed container for the inline toolbar. - Fixed so font name, font size and block format select boxes gets updated with the current format. - Fixed so the resizeTo/resizeBy methods for the theme are exposed as it as in 3.x. - Fixed so the textcolor controls are splitbuttons as in 3.x. Patch contributed by toxalot/jashua212. - Fixed bug where the theme content css wasn't loaded into the preview dialog. - Fixed bug where the template description in template dialog wouldn't display the text correctly. - Fixed bug where various UI elements wasn't properly removed when an editor instance was removed. - Fixed bug where editing links in inline mode would fail on WebKit. - Fixed bug where the pagebreak_separator option in the pagebreak plugin wasn't working properly. - Fixed bug where the child panels of the float panel in inline mode wasn't properly placed. - Fixed bug where the float panel children of windows wasn't position fixed. - Fixed bug where the size of the ok button was hardcoded, caused issues with i18n. - Fixed bug where single comment in editor would cause exceptions due to resolve path logic not detecting elements only. - Fixed bug where switching alignment of tables in dialogs wouldn't properly remove existing alignments. - Fixed bug where the table properties dialog would show columns/rows textboxes. - Fixed bug where jQuery wasn't used instead of Sizzle in the jQuery version of TinyMCE. - Fixed bug where setting resize option to false whouldn't properly render the word count. - Fixed bug where table row type change would produce multiple table section elements. - Fixed bug where table row type change on multiple rows would add them in incorrect order. - Fixed bug where fullscreen plugin would maximize the editor on resize after toggling it off. - Fixed bug where context menu would be position at an incorrect coordinate in inline mode. - Fixed bug where inserting lists in inline mode on IE would produce errors since the body would be converted. - Fixed bug where the body couldn't be styled properly in custom content_css files. - Fixed bug where template plugins menu item would override the image menu item. - Fixed bug where IE 7-8 would render the text inside inputs at the wrong vertical location. - Fixed bug where IE configured to IE 7 compatibility mode wouldn't render the icons properly. - Fixed bug where editor.focus wouldn't properly fire the focusin event on WebKit. - Fixed bug where some keyboard shortcuts wouldn't work on IE 8. - Fixed bug where the undo state wasn't updated until the end of a typing level. - Fixed bug where keyboard shortcuts on Mac OS wasn't working correctly. - Fixed bug where empty inline elements would be created when toggling formatting of in empty block. - Fixed bug where applying styles on WebKit would fail in inline mode if the user released the mouse button outside the body. - Fixed bug where the visual aids menu item wasn't selected if the editor was empty. - Fixed so the isDirty/isNotDirty states gets updated to true/false on save() and change events. - Fixed so skins have separate CSS files for inline and iframe mode. - Fixed so menus and tool tips gets constrained to the current viewport. - Fixed so an error is thrown if users load jQuery after the jQuery version of TinyMCE. - Fixed so the filetype for media dialog passes out media instead of image as file type. - Fixed so it's possible to disable the toolbar by setting it to false. - Fixed so autoresize plugin isn't initialized when the editor is in inline mode. - Fixed so the inline editing toolbar will be rendered below elements if it doesn't fit above it. -Version 4.0b3 (2013-05-15) - Added new optional advanced tab for image dialog with hspace, vspace, border and style. - Added new change event that gets fired when undo levels are added to editor instances. - Added new removed_menuitems option enables you to list menu items to remove from menus. - Added new external_plugins option enables you to specify external locations for plugins. - Added new language_url option enables you to specify an external location for the language pack. - Added new table toolbar control that displays a menu for inserting/editing menus. - Fixed bug where IE 10 wouldn't load files properly from cache. - Fixed bug where image dialog wouldn't properly remove width/height if blanked. - Fixed bug where all events wasn't properly unbound when editor instances where removed. - Fixed bug where data- attributes wasn't working properly in the SaxParser. - Fixed bug where Gecko wouldn't properly render broken images. - Fixed bug where Gecko wouldn't produce the same error dialog on paste as other browsers. - Fixed bug where is wasn't possible to prevent execCommands in beforeExecCommand event. - Fixed bug where the fullpage_hide_in_source_view option wasn't working in the fullpage plugin. - Fixed bug where the WindowManager close method wouldn't properly close the top most window. - Fixed bug where it wasn't possible to paste in IE 10 due to JS exception. - Fixed bug where tab key didn't move to the right child control in tabpanels. - Fixed bug where enter inside a form would focus the first button like control in TinyMCE. - Fixed bug where it would match scripts that looked like the tinymce base directory incorrectly. - Fixed bug where the spellchecker wouldn't properly toggle off the spellcheck mode if no errors where found. - Fixed bug in searchreplace plugin where it would remove all spans instead of the marker spans. - Fixed issue where selector wouldn't disable existing mode setting. - Fixed so it's easier to configure the menu and menubar. - Fixed so bodyId/bodyClass is applied to preview as it's done to the editor iframe. -Version 4.0b2 (2013-04-24) - Added new rel_list option to link plugin. Enables you to specify values for a rel drop down. - Added new target_list option to link plugin. Enables you to add to or disable the link targets. - Added new link_list option to link plugin. Enables you to specify a list of links to pick from. - Added new image_list option to image pluigin. Enables you to specify a list of images to pick from. - Added new textcolor plugin. This plugin holds the text color and text background color buttons. - Fixed bug where alignment of images wasn't working properly on Firefox. - Fixed bug where IE 8 would throw error when inserting a table. - Fixed bug where IE 8 wouldn't render the element path properly. - Fixed bug where old IE versions would render a red focus border. - Fixed bug where old IE versions would render a frameborder for iframes. - Fixed bug where WebKit wouldn't properly open the cell properties dialog on edge case selection. - Fixed bug where charmap wouldn't correctly render all characters in grid. - Fixed bug where link dialog wouldn't update the link text properly. - Fixed bug where the focus/blur states on inline editors wasn't handled correctly on IE. - Fixed bug where IE would throw "unknown error" exception sometimes in ForceBlocks logic. - Fixed bug where IE would't properly render disabled buttons in button groups. - Fixed bug where tab key wouldn't properly move to next input field in dialogs. - Fixed bug where resize handles for tables and images would appear at wrong positions on IE 8. - Fixed bug where dialogs would produce stack overflow if title was wider than content. - Fixed bug with table cell/row menu items being enabled even if no cell was selected. - Fixed so the text to display is after the URL field in the link dialog. - Fixed so the width setting applies to the editor panel in modern theme. - Fixed so it's easier to make custom icons for buttons using plain old images. -Version 4.0b1 (2013-04-11) - Added new node.js based build process used uglify, amdlc, jake etc. - Added new package.json to enable easy installation of dependent npm packages used for building. - Added new link, image, charmap, anchor, code, hr plugins since these are now moved out of the theme. - Rewrote all plugins and themes from scratch so they match the new UI framework. - Replaced all events to use the more common .on/off() methods instead of ..add/remove. - Rewrote the TinyMCE core to use AMD style modules. Gets compiled to an inline library using amdlc. - Rewrote all core logic to pass jshint rules. Each file has specific jshint rules. - Removed all IE6 specific logic since 4.x will no longer support such an old browser. - Reworked the file names and directory structure of the whole project to be more similar to other JS projects. - Replaced tinymce.util.Cookie with tinymce.util.LocalStorage. Fallback to userData for IE 7 native localStorage for the rest. - Replaced the old 3.x UI with a new modern UI framework. - Removed "simple" theme and added new "modern" theme. - Removed advhr, advimage, advlink, iespell, inlinepopups, xhtmlxtras and style plugins. - Updated Sizzle to the latest version. diff --git a/tinymce-4.2.8/js/tinymce/langs/readme.md b/tinymce-4.2.8/js/tinymce/langs/readme.md deleted file mode 100644 index a52bf03..0000000 --- a/tinymce-4.2.8/js/tinymce/langs/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -This is where language files should be placed. - -Please DO NOT translate these directly use this service: https://www.transifex.com/projects/p/tinymce/ diff --git a/tinymce-4.2.8/js/tinymce/license.txt b/tinymce-4.2.8/js/tinymce/license.txt deleted file mode 100644 index 1837b0a..0000000 --- a/tinymce-4.2.8/js/tinymce/license.txt +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/tinymce-4.2.8/js/tinymce/plugins/advlist/plugin.min.js b/tinymce-4.2.8/js/tinymce/plugins/advlist/plugin.min.js deleted file mode 100644 index 1e1c668..0000000 --- a/tinymce-4.2.8/js/tinymce/plugins/advlist/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("advlist",function(a){function b(a,b){var c=[];return tinymce.each(b.split(/[ ,]/),function(a){c.push({text:a.replace(/\-/g," ").replace(/\b\w/g,function(a){return a.toUpperCase()}),data:"default"==a?"":a})}),c}function c(b,c){a.undoManager.transact(function(){var d,e=a.dom,f=a.selection;d=e.getParent(f.getNode(),"ol,ul"),d&&d.nodeName==b&&c!==!1||a.execCommand("UL"==b?"InsertUnorderedList":"InsertOrderedList"),c=c===!1?g[b]:c,g[b]=c,d=e.getParent(f.getNode(),"ol,ul"),d&&(e.setStyle(d,"listStyleType",c?c:null),d.removeAttribute("data-mce-style")),a.focus()})}function d(b){var c=a.dom.getStyle(a.dom.getParent(a.selection.getNode(),"ol,ul"),"listStyleType")||"";b.control.items().each(function(a){a.active(a.settings.data===c)})}var e,f,g={};e=b("OL",a.getParam("advlist_number_styles","default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman")),f=b("UL",a.getParam("advlist_bullet_styles","default,circle,disc,square")),a.addButton("numlist",{type:"splitbutton",tooltip:"Numbered list",menu:e,onshow:d,onselect:function(a){c("OL",a.control.settings.data)},onclick:function(){c("OL",!1)}}),a.addButton("bullist",{type:"splitbutton",tooltip:"Bullet list",menu:f,onshow:d,onselect:function(a){c("UL",a.control.settings.data)},onclick:function(){c("UL",!1)}})}); \ No newline at end of file diff --git a/tinymce-4.2.8/js/tinymce/plugins/anchor/plugin.min.js b/tinymce-4.2.8/js/tinymce/plugins/anchor/plugin.min.js deleted file mode 100644 index 0dd4774..0000000 --- a/tinymce-4.2.8/js/tinymce/plugins/anchor/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("anchor",function(a){function b(){var b=a.selection.getNode(),c="",d="A"==b.tagName&&""===a.dom.getAttrib(b,"href");d&&(c=b.name||b.id||""),a.windowManager.open({title:"Anchor",body:{type:"textbox",name:"name",size:40,label:"Name",value:c},onsubmit:function(c){var e=c.data.name;d?b.id=e:(a.selection.collapse(!0),a.execCommand("mceInsertContent",!1,a.dom.createHTML("a",{id:e})))}})}a.addCommand("mceAnchor",b),a.addButton("anchor",{icon:"anchor",tooltip:"Anchor",onclick:b,stateSelector:"a:not([href])"}),a.addMenuItem("anchor",{icon:"anchor",text:"Anchor",context:"insert",onclick:b})}); \ No newline at end of file diff --git a/tinymce-4.2.8/js/tinymce/plugins/autolink/plugin.min.js b/tinymce-4.2.8/js/tinymce/plugins/autolink/plugin.min.js deleted file mode 100644 index 547eea7..0000000 --- a/tinymce-4.2.8/js/tinymce/plugins/autolink/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("autolink",function(a){function b(a){e(a,-1,"(",!0)}function c(a){e(a,0,"",!0)}function d(a){e(a,-1,"",!1)}function e(a,b,c){function d(a,b){if(0>b&&(b=0),3==a.nodeType){var c=a.data.length;b>c&&(b=c)}return b}function e(a,b){1!=a.nodeType||a.hasChildNodes()?g.setStart(a,d(a,b)):g.setStartBefore(a)}function f(a,b){1!=a.nodeType||a.hasChildNodes()?g.setEnd(a,d(a,b)):g.setEndAfter(a)}var g,h,i,j,k,l,m,n,o,p;if("A"!=a.selection.getNode().tagName){if(g=a.selection.getRng(!0).cloneRange(),g.startOffset<5){if(n=g.endContainer.previousSibling,!n){if(!g.endContainer.firstChild||!g.endContainer.firstChild.nextSibling)return;n=g.endContainer.firstChild.nextSibling}if(o=n.length,e(n,o),f(n,o),g.endOffset<5)return;h=g.endOffset,j=n}else{if(j=g.endContainer,3!=j.nodeType&&j.firstChild){for(;3!=j.nodeType&&j.firstChild;)j=j.firstChild;3==j.nodeType&&(e(j,0),f(j,j.nodeValue.length))}h=1==g.endOffset?2:g.endOffset-1-b}i=h;do e(j,h>=2?h-2:0),f(j,h>=1?h-1:0),h-=1,p=g.toString();while(" "!=p&&""!==p&&160!=p.charCodeAt(0)&&h-2>=0&&p!=c);g.toString()==c||160==g.toString().charCodeAt(0)?(e(j,h),f(j,i),h+=1):0===g.startOffset?(e(j,0),f(j,i)):(e(j,h),f(j,i)),l=g.toString(),"."==l.charAt(l.length-1)&&f(j,i-1),l=g.toString(),m=l.match(/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.|(?:mailto:)?[A-Z0-9._%+\-]+@)(.+)$/i),m&&("www."==m[1]?m[1]="http://www.":/@$/.test(m[1])&&!/^mailto:/.test(m[1])&&(m[1]="mailto:"+m[1]),k=a.selection.getBookmark(),a.selection.setRng(g),a.execCommand("createlink",!1,m[1]+m[2]),a.selection.moveToBookmark(k),a.nodeChanged())}}var f;return a.on("keydown",function(b){return 13==b.keyCode?d(a):void 0}),tinymce.Env.ie?void a.on("focus",function(){if(!f){f=!0;try{a.execCommand("AutoUrlDetect",!1,!0)}catch(b){}}}):(a.on("keypress",function(c){return 41==c.keyCode?b(a):void 0}),void a.on("keyup",function(b){return 32==b.keyCode?c(a):void 0}))}); \ No newline at end of file diff --git a/tinymce-4.2.8/js/tinymce/plugins/autoresize/plugin.min.js b/tinymce-4.2.8/js/tinymce/plugins/autoresize/plugin.min.js deleted file mode 100644 index 80d8431..0000000 --- a/tinymce-4.2.8/js/tinymce/plugins/autoresize/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("autoresize",function(a){function b(){return a.plugins.fullscreen&&a.plugins.fullscreen.isFullscreen()}function c(d){var g,h,i,j,k,l,m,n,o,p,q,r,s=tinymce.DOM;if(h=a.getDoc()){if(i=h.body,j=h.documentElement,k=e.autoresize_min_height,!i||d&&"setcontent"===d.type&&d.initial||b())return void(i&&j&&(i.style.overflowY="auto",j.style.overflowY="auto"));m=a.dom.getStyle(i,"margin-top",!0),n=a.dom.getStyle(i,"margin-bottom",!0),o=a.dom.getStyle(i,"padding-top",!0),p=a.dom.getStyle(i,"padding-bottom",!0),q=a.dom.getStyle(i,"border-top-width",!0),r=a.dom.getStyle(i,"border-bottom-width",!0),l=i.offsetHeight+parseInt(m,10)+parseInt(n,10)+parseInt(o,10)+parseInt(p,10)+parseInt(q,10)+parseInt(r,10),(isNaN(l)||0>=l)&&(l=tinymce.Env.ie?i.scrollHeight:tinymce.Env.webkit&&0===i.clientHeight?0:i.offsetHeight),l>e.autoresize_min_height&&(k=l),e.autoresize_max_height&&l>e.autoresize_max_height?(k=e.autoresize_max_height,i.style.overflowY="auto",j.style.overflowY="auto"):(i.style.overflowY="hidden",j.style.overflowY="hidden",i.scrollTop=0),k!==f&&(g=k-f,s.setStyle(a.iframeElement,"height",k+"px"),f=k,tinymce.isWebKit&&0>g&&c(d))}}function d(a,b,e){setTimeout(function(){c({}),a--?d(a,b,e):e&&e()},b)}var e=a.settings,f=0;a.settings.inline||(e.autoresize_min_height=parseInt(a.getParam("autoresize_min_height",a.getElement().offsetHeight),10),e.autoresize_max_height=parseInt(a.getParam("autoresize_max_height",0),10),a.on("init",function(){var b,c;b=a.getParam("autoresize_overflow_padding",1),c=a.getParam("autoresize_bottom_margin",50),b!==!1&&a.dom.setStyles(a.getBody(),{paddingLeft:b,paddingRight:b}),c!==!1&&a.dom.setStyles(a.getBody(),{paddingBottom:c})}),a.on("nodechange setcontent keyup FullscreenStateChanged",c),a.getParam("autoresize_on_init",!0)&&a.on("init",function(){d(20,100,function(){d(5,1e3)})}),a.addCommand("mceAutoResize",c))}); \ No newline at end of file diff --git a/tinymce-4.2.8/js/tinymce/plugins/autosave/plugin.min.js b/tinymce-4.2.8/js/tinymce/plugins/autosave/plugin.min.js deleted file mode 100644 index 11de44d..0000000 --- a/tinymce-4.2.8/js/tinymce/plugins/autosave/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce._beforeUnloadHandler=function(){var a;return tinymce.each(tinymce.editors,function(b){b.plugins.autosave&&b.plugins.autosave.storeDraft(),!a&&b.isDirty()&&b.getParam("autosave_ask_before_unload",!0)&&(a=b.translate("You have unsaved changes are you sure you want to navigate away?"))}),a},tinymce.PluginManager.add("autosave",function(a){function b(a,b){var c={s:1e3,m:6e4};return a=/^(\d+)([ms]?)$/.exec(""+(a||b)),(a[2]?c[a[2]]:1)*parseInt(a,10)}function c(){var a=parseInt(n.getItem(k+"time"),10)||0;return(new Date).getTime()-a>m.autosave_retention?(d(!1),!1):!0}function d(b){n.removeItem(k+"draft"),n.removeItem(k+"time"),b!==!1&&a.fire("RemoveDraft")}function e(){!j()&&a.isDirty()&&(n.setItem(k+"draft",a.getContent({format:"raw",no_events:!0})),n.setItem(k+"time",(new Date).getTime()),a.fire("StoreDraft"))}function f(){c()&&(a.setContent(n.getItem(k+"draft"),{format:"raw"}),a.fire("RestoreDraft"))}function g(){l||(setInterval(function(){a.removed||e()},m.autosave_interval),l=!0)}function h(){var b=this;b.disabled(!c()),a.on("StoreDraft RestoreDraft RemoveDraft",function(){b.disabled(!c())}),g()}function i(){a.undoManager.beforeChange(),f(),d(),a.undoManager.add()}function j(b){var c=a.settings.forced_root_block;return b=tinymce.trim("undefined"==typeof b?a.getBody().innerHTML:b),""===b||new RegExp("^<"+c+"[^>]*>((\xa0| |[ ]|]*>)+?|)|
$","i").test(b)}var k,l,m=a.settings,n=tinymce.util.LocalStorage;k=m.autosave_prefix||"tinymce-autosave-{path}{query}-{id}-",k=k.replace(/\{path\}/g,document.location.pathname),k=k.replace(/\{query\}/g,document.location.search),k=k.replace(/\{id\}/g,a.id),m.autosave_interval=b(m.autosave_interval,"30s"),m.autosave_retention=b(m.autosave_retention,"20m"),a.addButton("restoredraft",{title:"Restore last draft",onclick:i,onPostRender:h}),a.addMenuItem("restoredraft",{text:"Restore last draft",onclick:i,onPostRender:h,context:"file"}),a.settings.autosave_restore_when_empty!==!1&&(a.on("init",function(){c()&&j()&&f()}),a.on("saveContent",function(){d()})),window.onbeforeunload=tinymce._beforeUnloadHandler,this.hasDraft=c,this.storeDraft=e,this.restoreDraft=f,this.removeDraft=d,this.isEmpty=j}); \ No newline at end of file diff --git a/tinymce-4.2.8/js/tinymce/plugins/bbcode/plugin.min.js b/tinymce-4.2.8/js/tinymce/plugins/bbcode/plugin.min.js deleted file mode 100644 index 4548e5e..0000000 --- a/tinymce-4.2.8/js/tinymce/plugins/bbcode/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){tinymce.create("tinymce.plugins.BBCodePlugin",{init:function(a){var b=this,c=a.getParam("bbcode_dialect","punbb").toLowerCase();a.on("beforeSetContent",function(a){a.content=b["_"+c+"_bbcode2html"](a.content)}),a.on("postProcess",function(a){a.set&&(a.content=b["_"+c+"_bbcode2html"](a.content)),a.get&&(a.content=b["_"+c+"_html2bbcode"](a.content))})},getInfo:function(){return{longname:"BBCode Plugin",author:"Ephox Corp",authorurl:"http://www.tinymce.com",infourl:"http://www.tinymce.com/wiki.php/Plugin:bbcode"}},_punbb_html2bbcode:function(a){function b(b,c){a=a.replace(b,c)}return a=tinymce.trim(a),b(/(.*?)<\/a>/gi,"[url=$1]$2[/url]"),b(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),b(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),b(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),b(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),b(/(.*?)<\/span>/gi,"[color=$1]$2[/color]"),b(/(.*?)<\/font>/gi,"[color=$1]$2[/color]"),b(/(.*?)<\/span>/gi,"[size=$1]$2[/size]"),b(/(.*?)<\/font>/gi,"$1"),b(//gi,"[img]$1[/img]"),b(/(.*?)<\/span>/gi,"[code]$1[/code]"),b(/(.*?)<\/span>/gi,"[quote]$1[/quote]"),b(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"),b(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"),b(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"),b(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"),b(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"),b(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"),b(/<\/(strong|b)>/gi,"[/b]"),b(/<(strong|b)>/gi,"[b]"),b(/<\/(em|i)>/gi,"[/i]"),b(/<(em|i)>/gi,"[i]"),b(/<\/u>/gi,"[/u]"),b(/(.*?)<\/span>/gi,"[u]$1[/u]"),b(//gi,"[u]"),b(/]*>/gi,"[quote]"),b(/<\/blockquote>/gi,"[/quote]"),b(/
/gi,"\n"),b(//gi,"\n"),b(/
/gi,"\n"),b(/

/gi,""),b(/<\/p>/gi,"\n"),b(/ |\u00a0/gi," "),b(/"/gi,'"'),b(/</gi,"<"),b(/>/gi,">"),b(/&/gi,"&"),a},_punbb_bbcode2html:function(a){function b(b,c){a=a.replace(b,c)}return a=tinymce.trim(a),b(/\n/gi,"
"),b(/\[b\]/gi,""),b(/\[\/b\]/gi,""),b(/\[i\]/gi,""),b(/\[\/i\]/gi,""),b(/\[u\]/gi,""),b(/\[\/u\]/gi,""),b(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'$2'),b(/\[url\](.*?)\[\/url\]/gi,'$1'),b(/\[img\](.*?)\[\/img\]/gi,''),b(/\[color=(.*?)\](.*?)\[\/color\]/gi,'$2'),b(/\[code\](.*?)\[\/code\]/gi,'$1 '),b(/\[quote.*?\](.*?)\[\/quote\]/gi,'$1 '),a}}),tinymce.PluginManager.add("bbcode",tinymce.plugins.BBCodePlugin)}(); \ No newline at end of file diff --git a/tinymce-4.2.8/js/tinymce/plugins/charmap/plugin.min.js b/tinymce-4.2.8/js/tinymce/plugins/charmap/plugin.min.js deleted file mode 100644 index 71f3bbe..0000000 --- a/tinymce-4.2.8/js/tinymce/plugins/charmap/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("charmap",function(a){function b(){function b(a){for(;a;){if("TD"==a.nodeName)return a;a=a.parentNode}}var d,e,f,g;d='';var h=25,i=Math.ceil(c.length/h);for(f=0;i>f;f++){for(d+="",e=0;h>e;e++){var j=f*h+e;if(j
'+(k?String.fromCharCode(parseInt(k[0],10)):" ")+"
"}else d+="
"}d+="";var l={type:"container",html:d,onclick:function(c){var d=c.target;/^(TD|DIV)$/.test(d.nodeName)&&b(d).firstChild&&(a.execCommand("mceInsertContent",!1,tinymce.trim(d.innerText||d.textContent)),c.ctrlKey||g.close())},onmouseover:function(a){var c=b(a.target);c&&c.firstChild?(g.find("#preview").text(c.firstChild.firstChild.data),g.find("#previewTitle").text(c.title)):(g.find("#preview").text(" "),g.find("#previewTitle").text(" "))}};g=a.windowManager.open({title:"Special character",spacing:10,padding:10,items:[l,{type:"container",layout:"flex",direction:"column",align:"center",spacing:5,minWidth:160,minHeight:160,items:[{type:"label",name:"preview",text:" ",style:"font-size: 40px; text-align: center",border:1,minWidth:140,minHeight:80},{type:"label",name:"previewTitle",text:" ",style:"text-align: center",border:1,minWidth:140,minHeight:80}]}],buttons:[{text:"Close",onclick:function(){g.close()}}]})}var c=[["160","no-break space"],["173","soft hyphen"],["34","quotation mark"],["162","cent sign"],["8364","euro sign"],["163","pound sign"],["165","yen sign"],["169","copyright sign"],["174","registered sign"],["8482","trade mark sign"],["8240","per mille sign"],["181","micro sign"],["183","middle dot"],["8226","bullet"],["8230","three dot leader"],["8242","minutes / feet"],["8243","seconds / inches"],["167","section sign"],["182","paragraph sign"],["223","sharp s / ess-zed"],["8249","single left-pointing angle quotation mark"],["8250","single right-pointing angle quotation mark"],["171","left pointing guillemet"],["187","right pointing guillemet"],["8216","left single quotation mark"],["8217","right single quotation mark"],["8220","left double quotation mark"],["8221","right double quotation mark"],["8218","single low-9 quotation mark"],["8222","double low-9 quotation mark"],["60","less-than sign"],["62","greater-than sign"],["8804","less-than or equal to"],["8805","greater-than or equal to"],["8211","en dash"],["8212","em dash"],["175","macron"],["8254","overline"],["164","currency sign"],["166","broken bar"],["168","diaeresis"],["161","inverted exclamation mark"],["191","turned question mark"],["710","circumflex accent"],["732","small tilde"],["176","degree sign"],["8722","minus sign"],["177","plus-minus sign"],["247","division sign"],["8260","fraction slash"],["215","multiplication sign"],["185","superscript one"],["178","superscript two"],["179","superscript three"],["188","fraction one quarter"],["189","fraction one half"],["190","fraction three quarters"],["402","function / florin"],["8747","integral"],["8721","n-ary sumation"],["8734","infinity"],["8730","square root"],["8764","similar to"],["8773","approximately equal to"],["8776","almost equal to"],["8800","not equal to"],["8801","identical to"],["8712","element of"],["8713","not an element of"],["8715","contains as member"],["8719","n-ary product"],["8743","logical and"],["8744","logical or"],["172","not sign"],["8745","intersection"],["8746","union"],["8706","partial differential"],["8704","for all"],["8707","there exists"],["8709","diameter"],["8711","backward difference"],["8727","asterisk operator"],["8733","proportional to"],["8736","angle"],["180","acute accent"],["184","cedilla"],["170","feminine ordinal indicator"],["186","masculine ordinal indicator"],["8224","dagger"],["8225","double dagger"],["192","A - grave"],["193","A - acute"],["194","A - circumflex"],["195","A - tilde"],["196","A - diaeresis"],["197","A - ring above"],["198","ligature AE"],["199","C - cedilla"],["200","E - grave"],["201","E - acute"],["202","E - circumflex"],["203","E - diaeresis"],["204","I - grave"],["205","I - acute"],["206","I - circumflex"],["207","I - diaeresis"],["208","ETH"],["209","N - tilde"],["210","O - grave"],["211","O - acute"],["212","O - circumflex"],["213","O - tilde"],["214","O - diaeresis"],["216","O - slash"],["338","ligature OE"],["352","S - caron"],["217","U - grave"],["218","U - acute"],["219","U - circumflex"],["220","U - diaeresis"],["221","Y - acute"],["376","Y - diaeresis"],["222","THORN"],["224","a - grave"],["225","a - acute"],["226","a - circumflex"],["227","a - tilde"],["228","a - diaeresis"],["229","a - ring above"],["230","ligature ae"],["231","c - cedilla"],["232","e - grave"],["233","e - acute"],["234","e - circumflex"],["235","e - diaeresis"],["236","i - grave"],["237","i - acute"],["238","i - circumflex"],["239","i - diaeresis"],["240","eth"],["241","n - tilde"],["242","o - grave"],["243","o - acute"],["244","o - circumflex"],["245","o - tilde"],["246","o - diaeresis"],["248","o slash"],["339","ligature oe"],["353","s - caron"],["249","u - grave"],["250","u - acute"],["251","u - circumflex"],["252","u - diaeresis"],["253","y - acute"],["254","thorn"],["255","y - diaeresis"],["913","Alpha"],["914","Beta"],["915","Gamma"],["916","Delta"],["917","Epsilon"],["918","Zeta"],["919","Eta"],["920","Theta"],["921","Iota"],["922","Kappa"],["923","Lambda"],["924","Mu"],["925","Nu"],["926","Xi"],["927","Omicron"],["928","Pi"],["929","Rho"],["931","Sigma"],["932","Tau"],["933","Upsilon"],["934","Phi"],["935","Chi"],["936","Psi"],["937","Omega"],["945","alpha"],["946","beta"],["947","gamma"],["948","delta"],["949","epsilon"],["950","zeta"],["951","eta"],["952","theta"],["953","iota"],["954","kappa"],["955","lambda"],["956","mu"],["957","nu"],["958","xi"],["959","omicron"],["960","pi"],["961","rho"],["962","final sigma"],["963","sigma"],["964","tau"],["965","upsilon"],["966","phi"],["967","chi"],["968","psi"],["969","omega"],["8501","alef symbol"],["982","pi symbol"],["8476","real part symbol"],["978","upsilon - hook symbol"],["8472","Weierstrass p"],["8465","imaginary part"],["8592","leftwards arrow"],["8593","upwards arrow"],["8594","rightwards arrow"],["8595","downwards arrow"],["8596","left right arrow"],["8629","carriage return"],["8656","leftwards double arrow"],["8657","upwards double arrow"],["8658","rightwards double arrow"],["8659","downwards double arrow"],["8660","left right double arrow"],["8756","therefore"],["8834","subset of"],["8835","superset of"],["8836","not a subset of"],["8838","subset of or equal to"],["8839","superset of or equal to"],["8853","circled plus"],["8855","circled times"],["8869","perpendicular"],["8901","dot operator"],["8968","left ceiling"],["8969","right ceiling"],["8970","left floor"],["8971","right floor"],["9001","left-pointing angle bracket"],["9002","right-pointing angle bracket"],["9674","lozenge"],["9824","black spade suit"],["9827","black club suit"],["9829","black heart suit"],["9830","black diamond suit"],["8194","en space"],["8195","em space"],["8201","thin space"],["8204","zero width non-joiner"],["8205","zero width joiner"],["8206","left-to-right mark"],["8207","right-to-left mark"]];a.addCommand("mceShowCharmap",b),a.addButton("charmap",{icon:"charmap",tooltip:"Special character",cmd:"mceShowCharmap"}),a.addMenuItem("charmap",{icon:"charmap",text:"Special character",cmd:"mceShowCharmap",context:"insert"})}); \ No newline at end of file diff --git a/tinymce-4.2.8/js/tinymce/plugins/code/plugin.min.js b/tinymce-4.2.8/js/tinymce/plugins/code/plugin.min.js deleted file mode 100644 index d6331f8..0000000 --- a/tinymce-4.2.8/js/tinymce/plugins/code/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("code",function(a){function b(){var b=a.windowManager.open({title:"Source code",body:{type:"textbox",name:"code",multiline:!0,minWidth:a.getParam("code_dialog_width",600),minHeight:a.getParam("code_dialog_height",Math.min(tinymce.DOM.getViewPort().h-200,500)),spellcheck:!1,style:"direction: ltr; text-align: left"},onSubmit:function(b){a.focus(),a.undoManager.transact(function(){a.setContent(b.data.code)}),a.selection.setCursorLocation(),a.nodeChanged()}});b.find("#code").value(a.getContent({source_view:!0}))}a.addCommand("mceCodeEditor",b),a.addButton("code",{icon:"code",tooltip:"Source code",onclick:b}),a.addMenuItem("code",{icon:"code",text:"Source code",context:"tools",onclick:b})}); \ No newline at end of file diff --git a/tinymce-4.2.8/js/tinymce/plugins/colorpicker/plugin.min.js b/tinymce-4.2.8/js/tinymce/plugins/colorpicker/plugin.min.js deleted file mode 100644 index 66ea69c..0000000 --- a/tinymce-4.2.8/js/tinymce/plugins/colorpicker/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("colorpicker",function(a){function b(b,c){function d(a){var b=new tinymce.util.Color(a),c=b.toRgb();f.fromJSON({r:c.r,g:c.g,b:c.b,hex:b.toHex().substr(1)}),e(b.toHex())}function e(a){f.find("#preview")[0].getEl().style.background=a}var f=a.windowManager.open({title:"Color",items:{type:"container",layout:"flex",direction:"row",align:"stretch",padding:5,spacing:10,items:[{type:"colorpicker",value:c,onchange:function(){var a=this.rgb();f&&(f.find("#r").value(a.r),f.find("#g").value(a.g),f.find("#b").value(a.b),f.find("#hex").value(this.value().substr(1)),e(this.value()))}},{type:"form",padding:0,labelGap:5,defaults:{type:"textbox",size:7,value:"0",flex:1,spellcheck:!1,onchange:function(){var a,b,c=f.find("colorpicker")[0];return a=this.name(),b=this.value(),"hex"==a?(b="#"+b,d(b),void c.value(b)):(b={r:f.find("#r").value(),g:f.find("#g").value(),b:f.find("#b").value()},c.value(b),void d(b))}},items:[{name:"r",label:"R",autofocus:1},{name:"g",label:"G"},{name:"b",label:"B"},{name:"hex",label:"#",value:"000000"},{name:"preview",type:"container",border:1}]}]},onSubmit:function(){b("#"+this.toJSON().hex)}});d(c)}a.settings.color_picker_callback||(a.settings.color_picker_callback=b)}); \ No newline at end of file diff --git a/tinymce-4.2.8/js/tinymce/plugins/contextmenu/plugin.min.js b/tinymce-4.2.8/js/tinymce/plugins/contextmenu/plugin.min.js deleted file mode 100644 index 20274a6..0000000 --- a/tinymce-4.2.8/js/tinymce/plugins/contextmenu/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("contextmenu",function(a){var b,c=a.settings.contextmenu_never_use_native;a.on("contextmenu",function(d){var e,f=a.getDoc();if(!d.ctrlKey||c){if(d.preventDefault(),tinymce.Env.mac&&tinymce.Env.webkit&&2==d.button&&f.caretRangeFromPoint&&a.selection.setRng(f.caretRangeFromPoint(d.x,d.y)),e=a.settings.contextmenu||"link image inserttable | cell row column deletetable",b)b.show();else{var g=[];tinymce.each(e.split(/[ ,]/),function(b){var c=a.menuItems[b];"|"==b&&(c={text:b}),c&&(c.shortcut="",g.push(c))});for(var h=0;hKx}s1_F$4FCWDA^8LW0018VEC2ui01^Na000Hw;3tYzX_jM3Qpv$_M?zI9i5=0S zX-{-uv=l3%&P0s%m9Ox_a(m_c|u z01g3U0`Wll5)poVdma=N8y<3f0Sf~hXmTC}2oxMW4FdxUj+z4<0}lrX2nP=qkDRIt z9Ge*(qzMrj3jrIOjvI{`5eWzt3`G_T8yChG8w(a19SkK12@M(+799Zr9n=~PzBCmA z5)BU-)YKUd4H5!D9|!^o9kWIe9SH(WDHRk92}DZ?3})2$P@$55g90f0N)ZA8JID5J Aw*UYD diff --git a/tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-cry.gif b/tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-cry.gif deleted file mode 100644 index 74d897a4f6d22e814e2b054e98b8a75fb464b4be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 329 zcmV-P0k-}}Nk%w1VG;lm0Mr-&E)xPSit@9T3%;vR+|V+?t0A(pllJjXrMl7n=_A_a za^B+Su$LjvyC3@TIQZNZa##w=!k(SO^P#bO*w(eU#;{U83XFCU_V)J5wrb+;g2vkN z#>U24qVoOvY5)KLA^8LW0018VEC2ui01^Na000HX;3tY$X_jM3QUfCh%s^o(nF++< zc?Th6v=oL>*by8K!mhvwelUXuuW&&U9iGO3hM@>Njw{l^#0q9mWpcefdI;O$;efnY zkd~@r-o$*74FCWI1%d((4+jDz0va0>69^fI6%`W{8w!gU1pyL>prH>E0R<%k6Aq%H z4ij+^9TEwM5P}eh2@)L<~6+>@EpxfA0YrcPNsSu diff --git a/tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-embarassed.gif b/tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-embarassed.gif deleted file mode 100644 index 963a96b8a7593b1d8bcbab073abe5ee4e539dbf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 331 zcmV-R0kr-{Nk%w1VG;lm0MrryDh>j~yq&6%75dW~z^P39(NxsGDE{UkxtkIEq(S-a zRKlwv+S=Lr?>hbYY~sQ?c3T&ZcN_Nh_EU3s(>Io6B&>WW`@bsw**)Ocy1bht z{*G6|uwwqUQ2+n{A^8LW0018VEC2ui01^Na000HZ;3tYwX_jM3YQ!c88=*-m*&&bO zILd=`w3KAC;8hxpif*w9ek6oqV-Z0L77fROK$BSR@5BAv-%C>6y>>#+D4e#&nz^qMDItlpp zTG728+|V&?R13PIEBW(C`uh6d*t-1sZ^XQv;oDD}iYLOV7uVO;{`xl4#4tJ{0;h@! z>)kdc3IhA?Hvj+tA^8La0018VEC2ui01^Na06+!P;3tYuX_ljS7!u|-O)I}TzP1q%xT4HOFwMJaO;2ml)!00$)141pU08x3594IX?4 o5YuAA8yXz~76K1c;3^jg77WP185Rf^u}23N0sR5^q(T4yJ1sVN5dZ)H diff --git a/tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-frown.gif b/tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-frown.gif deleted file mode 100644 index 716f55e161bfebb1c3d34f0b0f40c177fc82c30b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340 zcmV-a0jvH;Nk%w1VG;lm0MroxK_>;q#>Sw62=mns-On=0wransPVevT^YK{Dy(0YY zH)vE6x0?;Wqb>gZas1^OT0si>`ugD5y87}*#H$s=yq(wA*8cf7{`y+(+9J7|9QfT7 z`ROHiU=Y&6FaQ7mA^8LW0018VEC2ui01^Na000Hi;3tYvX_jM3N`@u~nju9hSuh^r zIEcp-wA7(NL0~2d#RP+(G!CPPA>o*KJjv_CkucCA5=K?AfF#RG2V*8BU@jL304|4P z2;PGRF@bj$et;Jf2pR_mVsIA<85|n}kQ*Bq42Ovqj*yy>6P0=h3X&9Z01yyk~2N4w%7#RW^55W%`0vQ+-6(y_*2pqz~90*;x9}yM}%$UI(7t#$D mK_3Se1{4HKM+6iG7EmeH6$V631{L5n)#CyC0qx-*Apkoyg?w!Q diff --git a/tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-innocent.gif b/tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-innocent.gif deleted file mode 100644 index 334d49e0e60f2997c9ba24071764f95d9e08a5cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 336 zcmV-W0k8f?Nk%w1VG;lm0MrryI4TI-%dP0m5~*+Y`T~ z7Rth){q{I_X%*S48uRZ|(b3V&wIKTX`u+WJzo<^$#wuY;3W|Cf{O29IkTAcaE&lpe z+P*^H)-tknA^-pYA^8LW0018VEC2ui01^Na000He;3tYwX_n)75QgVvNQ`6#5gcMm zEEG~blgXokptKAJgCU?%JT?yos!R6cPtcQWh2siHlNI2L}ifQhgX02^InZ2?-ktkqVRyZJY^Trk|lv zovp437?1~d46O)?2(1i+2NDYk8<+_Kil!K!3njA^!I#dL8x<729}*B65mC=m5gHH@ iDi9P3f*VjB3KS4HDb_qqRul{0DIT=Nk%w1VG;lm0Mrx!QauaC#>Vb6G=_5=^YB^9wrc376Sb5I-qJGf@9vZ# z5WlKU(!eVB+7tfnDXp0zyB`?BZ5IChalob*`uh6d*t+@dKGHcU+L|83yq*5~IoH?L zy`?Gp<{bX|SpWb4A^8LW0018VEC2ui01^Na000Hg;3tYyX_jM3R?Bl7&r(q;SsVx< zNd$5fv{ZsKA$SlL3&KN~a1tZRf*~1Ltkx9~2uL3&z-yb0WJDRY082|tP diff --git a/tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-laughing.gif b/tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-laughing.gif deleted file mode 100644 index 82c5b182e61d32bd394acae551eff180f1eebd26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 343 zcmV-d0jT~*Nk%w1VG;lm0Q4UK!lp8=s;1-69HWK?p_PpF=Pd8~Ygtcnp*fHAL z**;z>w3iC}`fmL6IkKB1N;3zEa}&zKpsu1;_V)HocR5-{J~BcYvE`YXhBnc@CfU=! za(Ec zG>66zv=rqr;2j)}gKqE$ekcSD?}0=WLB?AWp85)qALd+P=4)6X4oXy{bw2>K^d$ z@6ERvva+(4ib~41YUkTEn1&#?rzrOHT>1I=Y*h`+%*@WtPUPg|!@EEI_d5LgZ>^Og z-qyBKJqy*wF8}}lA^8La0018VEC2ui01^Na06+!6;3tYxX_lj?7+U61R3gAaEg8x< zT>%mSfCwURnWQF&g=Q0ZxH1ulW`QtH0>O!5%iT_X0VBy_@EkOngU8?ye~=H!t21{= z9@Uj3a_UbE88~kh5Eq7rh!7QSBn1c?0|Off1&k^`5*QE<4-gmSR<4C>Dj%C>6W(lWoQPVevT^YB^Fy&h6M z4YZgH{O~qtR1(Ci8T;lQ`uh6d*t-7xar*K{#Jrulo-Wtd*44u?{`oh#n;gQXGXDEo z_}UUC3IeK%0ssI2A^8La0018VEC2ui01^Na06+!R;3tYuX_ljSEE482&%+G^XK%|f zLKbCc4u{4-u|QG~LqamSTo?@JM3OKZAr!|Z2IzP@fY`=CIg$vA3qm46TowfLCt29I z6pDKuvnf~)83+sm9yW#?9s>^(89F=~2?!W44-6Ox2^vNza}fp^9v&G65pp936%Gg+ z6HpTy2o4oGoh+>l3Q)KVQwybl2oo*<4a3D469|nfEii|MH4`}p1_cZp0ssj%2>=2d q41Na?)CpS;4gvxWVpZcR76uLludD?Q1{SnP2NnVU0rZ&)0RTIit8@_n diff --git a/tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-surprised.gif b/tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-surprised.gif deleted file mode 100644 index 0cc9bb71cca4cdeafbb248ce7e07c3708c1cbd64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 338 zcmV-Y0j>T=Nk%w1VG;lm0Q4UK`{WwN#>SnDDC*4*{OcpiwransPVevTQacIr@mkQp zCf(06s)_=>r7UYx48o@u`uh6d*t-7rH~ji<`P&oj;5Wp)o!8ga`SV6TA_BIW5#ZWV z{`*)c32kA}f=futY?#YE7kxGD|7L}4&OEDw$hkm+~<00QS>F_H?J#bz?uEHnl42f5(9 z5O)`6Q9V2o5;YVLUK)Y`7!Nr+4GMq?85s%^2?`BGDRU798Vn2?1`%>22R{iO0u>bk z9tlA?nk*O<3zHJH6&Mp5qALj)E(mxM!Y&vII4dm@1Ov{`f*8pL3xPEVUI>D>1_uxa kNm?`6VH{N6Di;P13m6<67z+;u7qCYM7XkVK^`jvGJD~P?KL7v# diff --git a/tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-tongue-out.gif b/tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-tongue-out.gif deleted file mode 100644 index 2075dc16058f1f17912167675ce5cfb9986fc71d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 328 zcmV-O0k{4~Nk%w1VG;lm0Mrx!CJF+^#>SU@3-{U*rx+Q^wrc$ABfqLn@9*x?z8(4X zSW-O=@){bmmI~g|GQXoP);cvj3|f1M8e@{G*!tYaiCEujj1NGxRN#6#tiCETo+{x{Hkzt z5k-kPvcD=V2nbmjCgL6k{uF&2nP-t0s;w<385Nx2oxDb z9T5Pp7qJl?3Kkh9oe2sCr5F$p7zPSlsUH*@54w*83=9Or4;w)r2pcU95(FL|1Th;< aDaRQH4;Tal7#Y$v#?=Au0pHUfApkpvZg^t= diff --git a/tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-undecided.gif b/tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-undecided.gif deleted file mode 100644 index bef7e257303f8243c89787e7a7f9955dd1f112e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 337 zcmV-X0j~Z>Nk%w1VG;lm0MroxDi#99#>R?y8~4}{%C>6#>?OadPVevTr-=vi@LATn z4rERY-qJF+n+?CCE&B3D{{3Shh?>WT0o%`b%*Voqm`dL;(4F35y zc485^n;g!+Bme*aA^8LW0018VEC2ui01^Na000Hf;3tYvX_jM3N=AnuogqakNi<9X zK?&0kwA8^tNn{?C$|IAYI1ZzT!2>}iuMddFK#NEkRl!7%6brJAnUs;)XcnA}TNBSP zxQ9;SvEfwYeSaGd2^|LqU~(QF1qBxr3Ii7x84ZVt8wCTKoSYAqc?p`G2onnpk`IOl z1`HLGj}riN2p1K12N4z&8IBDc6tEWs859;JtRB6>lf+xO9}yT19toMv8wnl`7(pKg j7zPv!OGgY81{hE&(iR3pP6ig;HPPS!_yOwPA0Yrc)=Yf3 diff --git a/tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-wink.gif b/tinymce-4.2.8/js/tinymce/plugins/emoticons/img/smiley-wink.gif deleted file mode 100644 index 0631c7616ec8624ddeee02b633326f697ee72f80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 350 zcmV-k0ipg!Nk%w1VG;lm0Q4UK(ZVUl#>Sn03F^-g-qAA3wransPV?|t@9*x%vmQ`7 z4E*pcw3rOOq%3t@4*K#({N^40{c-yG`rz2Q!KfI-yq*61HrBop*VoqW<}&{JS@_x# zwwfF$4Fdh~IsgCwA^8La0018VEC2ui01^Na06+!X;3tYwX_ljiFp=e23$zWxW@`*G zN?2ty6iUNT!AMdPLn89IbS7WCB_mWF$+hzY-{PWkp(?(Xf;zbH~P z3jOdj?W+^YwrakfE8fyG&5jTBz!3WS`fgM_;MltQ+c}4GO8)(E`S3`@yq&d~5!ct& z)v79NObo)O7XSbNA^8LW0018VEC2ui01^Na000He;3tYwX_jM3QifI(nn6h_*=Wyk zUB{y}v=qYOIUF#R3dZPhAVv~H;(|a2yN_5FH&J0|$eJ3kw4gj1Y?v5d#>LMV12^6BYy$1)ZKA zga!|m2?POz0R)f>4+aPl8KD{gz`+G_9vLMFQU?RU!8uyH9}*i52|cC+7S0YEK_3Vk i1|APfM-Ltb8&4_H83sg61{vHn(cc000qNZzApkp'}),a+=""}),a+=""}var d=[["cool","cry","embarassed","foot-in-mouth"],["frown","innocent","kiss","laughing"],["money-mouth","sealed","smile","surprised"],["tongue-out","undecided","wink","yell"]];a.addButton("emoticons",{type:"panelbutton",panel:{role:"application",autohide:!0,html:c,onclick:function(b){var c=a.dom.getParent(b.target,"a");c&&(a.insertContent(''+c.getAttribute('),this.hide())}},tooltip:"Emoticons"})}); \ No newline at end of file diff --git a/tinymce-4.2.8/js/tinymce/plugins/example/dialog.html b/tinymce-4.2.8/js/tinymce/plugins/example/dialog.html deleted file mode 100644 index 565f06f..0000000 --- a/tinymce-4.2.8/js/tinymce/plugins/example/dialog.html +++ /dev/null @@ -1,8 +0,0 @@ - - - -

Custom dialog

- Input some text: - - - \ No newline at end of file diff --git a/tinymce-4.2.8/js/tinymce/plugins/example/plugin.min.js b/tinymce-4.2.8/js/tinymce/plugins/example/plugin.min.js deleted file mode 100644 index 88687c7..0000000 --- a/tinymce-4.2.8/js/tinymce/plugins/example/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("example",function(a,b){a.addButton("example",{text:"My button",icon:!1,onclick:function(){a.windowManager.open({title:"Example plugin",body:[{type:"textbox",name:"title",label:"Title"}],onsubmit:function(b){a.insertContent("Title: "+b.data.title)}})}}),a.addMenuItem("example",{text:"Example plugin",context:"tools",onclick:function(){a.windowManager.open({title:"TinyMCE site",url:b+"/dialog.html",width:600,height:400,buttons:[{text:"Insert",onclick:function(){var b=a.windowManager.getWindows()[0];a.insertContent(b.getContentWindow().document.getElementById("content").value),b.close()}},{text:"Close",onclick:"close"}]})}})}); \ No newline at end of file diff --git a/tinymce-4.2.8/js/tinymce/plugins/example_dependency/plugin.min.js b/tinymce-4.2.8/js/tinymce/plugins/example_dependency/plugin.min.js deleted file mode 100644 index e61bf47..0000000 --- a/tinymce-4.2.8/js/tinymce/plugins/example_dependency/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("example_dependency",function(){},["example"]); \ No newline at end of file diff --git a/tinymce-4.2.8/js/tinymce/plugins/fullpage/plugin.min.js b/tinymce-4.2.8/js/tinymce/plugins/fullpage/plugin.min.js deleted file mode 100644 index 1ea5c36..0000000 --- a/tinymce-4.2.8/js/tinymce/plugins/fullpage/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("fullpage",function(a){function b(){var b=c();a.windowManager.open({title:"Document properties",data:b,defaults:{type:"textbox",size:40},body:[{name:"title",label:"Title"},{name:"keywords",label:"Keywords"},{name:"description",label:"Description"},{name:"robots",label:"Robots"},{name:"author",label:"Author"},{name:"docencoding",label:"Encoding"}],onSubmit:function(a){d(tinymce.extend(b,a.data))}})}function c(){function b(a,b){var c=a.attr(b);return c||""}var c,d,f=e(),g={};return g.fontface=a.getParam("fullpage_default_fontface",""),g.fontsize=a.getParam("fullpage_default_fontsize",""),c=f.firstChild,7==c.type&&(g.xml_pi=!0,d=/encoding="([^"]+)"/.exec(c.value),d&&(g.docencoding=d[1])),c=f.getAll("#doctype")[0],c&&(g.doctype=""),c=f.getAll("title")[0],c&&c.firstChild&&(g.title=c.firstChild.value),k(f.getAll("meta"),function(a){var b,c=a.attr("name"),d=a.attr("http-equiv");c?g[c.toLowerCase()]=a.attr("content"):"Content-Type"==d&&(b=/charset\s*=\s*(.*)\s*/gi.exec(a.attr("content")),b&&(g.docencoding=b[1]))}),c=f.getAll("html")[0],c&&(g.langcode=b(c,"lang")||b(c,"xml:lang")),g.stylesheets=[],tinymce.each(f.getAll("link"),function(a){"stylesheet"==a.attr("rel")&&g.stylesheets.push(a.attr("href"))}),c=f.getAll("body")[0],c&&(g.langdir=b(c,"dir"),g.style=b(c,"style"),g.visited_color=b(c,"vlink"),g.link_color=b(c,"link"),g.active_color=b(c,"alink")),g}function d(b){function c(a,b,c){a.attr(b,c?c:void 0)}function d(a){g.firstChild?g.insert(a,g.firstChild):g.append(a)}var f,g,h,j,m,n=a.dom;f=e(),g=f.getAll("head")[0],g||(j=f.getAll("html")[0],g=new l("head",1),j.firstChild?j.insert(g,j.firstChild,!0):j.append(g)),j=f.firstChild,b.xml_pi?(m='version="1.0"',b.docencoding&&(m+=' encoding="'+b.docencoding+'"'),7!=j.type&&(j=new l("xml",7),f.insert(j,f.firstChild,!0)),j.value=m):j&&7==j.type&&j.remove(),j=f.getAll("#doctype")[0],b.doctype?(j||(j=new l("#doctype",10),b.xml_pi?f.insert(j,f.firstChild):d(j)),j.value=b.doctype.substring(9,b.doctype.length-1)):j&&j.remove(),j=null,k(f.getAll("meta"),function(a){"Content-Type"==a.attr("http-equiv")&&(j=a)}),b.docencoding?(j||(j=new l("meta",1),j.attr("http-equiv","Content-Type"),j.shortEnded=!0,d(j)),j.attr("content","text/html; charset="+b.docencoding)):j&&j.remove(),j=f.getAll("title")[0],b.title?(j?j.empty():(j=new l("title",1),d(j)),j.append(new l("#text",3)).value=b.title):j&&j.remove(),k("keywords,description,author,copyright,robots".split(","),function(a){var c,e,g=f.getAll("meta"),h=b[a];for(c=0;c"))}function e(){return new tinymce.html.DomParser({validate:!1,root_name:"#document"}).parse(i)}function f(b){function c(a){return a.replace(/<\/?[A-Z]+/g,function(a){return a.toLowerCase()})}var d,f,h,l,m=b.content,n="",o=a.dom;if(!b.selection&&!("raw"==b.format&&i||b.source_view&&a.getParam("fullpage_hide_in_source_view"))){0!==m.length||b.source_view||(m=tinymce.trim(i)+"\n"+tinymce.trim(m)+"\n"+tinymce.trim(j)),m=m.replace(/<(\/?)BODY/gi,"<$1body"),d=m.indexOf("",d),i=c(m.substring(0,d+1)),f=m.indexOf("\n"),h=e(),k(h.getAll("style"),function(a){a.firstChild&&(n+=a.firstChild.value)}),l=h.getAll("body")[0],l&&o.setAttribs(a.getBody(),{style:l.attr("style")||"",dir:l.attr("dir")||"",vLink:l.attr("vlink")||"",link:l.attr("link")||"",aLink:l.attr("alink")||""}),o.remove("fullpage_styles");var p=a.getDoc().getElementsByTagName("head")[0];n&&(o.add(p,"style",{id:"fullpage_styles"},n),l=o.get("fullpage_styles"),l.styleSheet&&(l.styleSheet.cssText=n));var q={};tinymce.each(p.getElementsByTagName("link"),function(a){"stylesheet"==a.rel&&a.getAttribute("data-mce-fullpage")&&(q[a.href]=a)}),tinymce.each(h.getAll("link"),function(a){var b=a.attr("href");q[b]||"stylesheet"!=a.attr("rel")||o.add(p,"link",{rel:"stylesheet",text:"text/css",href:b,"data-mce-fullpage":"1"}),delete q[b]}),tinymce.each(q,function(a){a.parentNode.removeChild(a)})}}function g(){var b,c="",d="";return a.getParam("fullpage_default_xml_pi")&&(c+='\n'),c+=a.getParam("fullpage_default_doctype",""),c+="\n\n\n",(b=a.getParam("fullpage_default_title"))&&(c+=""+b+"\n"),(b=a.getParam("fullpage_default_encoding"))&&(c+='\n'),(b=a.getParam("fullpage_default_font_family"))&&(d+="font-family: "+b+";"),(b=a.getParam("fullpage_default_font_size"))&&(d+="font-size: "+b+";"),(b=a.getParam("fullpage_default_text_color"))&&(d+="color: "+b+";"),c+="\n\n"}function h(b){b.selection||b.source_view&&a.getParam("fullpage_hide_in_source_view")||(b.content=tinymce.trim(i)+"\n"+tinymce.trim(b.content)+"\n"+tinymce.trim(j))}var i,j,k=tinymce.each,l=tinymce.html.Node;a.addCommand("mceFullPageProperties",b),a.addButton("fullpage",{title:"Document properties",cmd:"mceFullPageProperties"}),a.addMenuItem("fullpage",{text:"Document properties",cmd:"mceFullPageProperties",context:"file"}),a.on("BeforeSetContent",f),a.on("GetContent",h)}); \ No newline at end of file diff --git a/tinymce-4.2.8/js/tinymce/plugins/fullscreen/plugin.min.js b/tinymce-4.2.8/js/tinymce/plugins/fullscreen/plugin.min.js deleted file mode 100644 index d275e05..0000000 --- a/tinymce-4.2.8/js/tinymce/plugins/fullscreen/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("fullscreen",function(a){function b(){var a,b,c=window,d=document,e=d.body;return e.offsetWidth&&(a=e.offsetWidth,b=e.offsetHeight),c.innerWidth&&c.innerHeight&&(a=c.innerWidth,b=c.innerHeight),{w:a,h:b}}function c(){function c(){j.setStyle(m,"height",b().h-(l.clientHeight-m.clientHeight))}var k,l,m,n,o=document.body,p=document.documentElement;i=!i,l=a.getContainer(),k=l.style,m=a.getContentAreaContainer().firstChild,n=m.style,i?(d=n.width,e=n.height,n.width=n.height="100%",g=k.width,h=k.height,k.width=k.height="",j.addClass(o,"mce-fullscreen"),j.addClass(p,"mce-fullscreen"),j.addClass(l,"mce-fullscreen"),j.bind(window,"resize",c),c(),f=c):(n.width=d,n.height=e,g&&(k.width=g),h&&(k.height=h),j.removeClass(o,"mce-fullscreen"),j.removeClass(p,"mce-fullscreen"),j.removeClass(l,"mce-fullscreen"),j.unbind(window,"resize",f)),a.fire("FullscreenStateChanged",{state:i})}var d,e,f,g,h,i=!1,j=tinymce.DOM;return a.settings.inline?void 0:(a.on("init",function(){a.addShortcut("Meta+Alt+F","",c)}),a.on("remove",function(){f&&j.unbind(window,"resize",f)}),a.addCommand("mceFullScreen",c),a.addMenuItem("fullscreen",{text:"Fullscreen",shortcut:"Meta+Alt+F",selectable:!0,onClick:c,onPostRender:function(){var b=this;a.on("FullscreenStateChanged",function(a){b.active(a.state)})},context:"view"}),a.addButton("fullscreen",{tooltip:"Fullscreen",shortcut:"Meta+Alt+F",onClick:c,onPostRender:function(){var b=this;a.on("FullscreenStateChanged",function(a){b.active(a.state)})}}),{isFullscreen:function(){return i}})}); \ No newline at end of file diff --git a/tinymce-4.2.8/js/tinymce/plugins/hr/plugin.min.js b/tinymce-4.2.8/js/tinymce/plugins/hr/plugin.min.js deleted file mode 100644 index 25abb0c..0000000 --- a/tinymce-4.2.8/js/tinymce/plugins/hr/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("hr",function(a){a.addCommand("InsertHorizontalRule",function(){a.execCommand("mceInsertContent",!1,"
")}),a.addButton("hr",{icon:"hr",tooltip:"Horizontal line",cmd:"InsertHorizontalRule"}),a.addMenuItem("hr",{icon:"hr",text:"Horizontal line",cmd:"InsertHorizontalRule",context:"insert"})}); \ No newline at end of file diff --git a/tinymce-4.2.8/js/tinymce/plugins/image/plugin.min.js b/tinymce-4.2.8/js/tinymce/plugins/image/plugin.min.js deleted file mode 100644 index 1f28d9b..0000000 --- a/tinymce-4.2.8/js/tinymce/plugins/image/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("image",function(a){function b(a,b){function c(a,c){d.parentNode&&d.parentNode.removeChild(d),b({width:a,height:c})}var d=document.createElement("img");d.onload=function(){c(Math.max(d.width,d.clientWidth),Math.max(d.height,d.clientHeight))},d.onerror=function(){c()};var e=d.style;e.visibility="hidden",e.position="fixed",e.bottom=e.left=0,e.width=e.height="auto",document.body.appendChild(d),d.src=a}function c(a,b,c){function d(a,c){return c=c||[],tinymce.each(a,function(a){var e={text:a.text||a.title};a.menu?e.menu=d(a.menu):(e.value=a.value,b(e)),c.push(e)}),c}return d(a,c||[])}function d(b){return function(){var c=a.settings.image_list;"string"==typeof c?tinymce.util.XHR.send({url:c,success:function(a){b(tinymce.util.JSON.parse(a))}}):"function"==typeof c?c(b):b(c)}}function e(d){function e(){var a,b,c,d;a=l.find("#width")[0],b=l.find("#height")[0],a&&b&&(c=a.value(),d=b.value(),l.find("#constrain")[0].checked()&&m&&n&&c&&d&&(m!=c?(d=Math.round(c/m*d),isNaN(d)||b.value(d)):(c=Math.round(d/n*c),isNaN(c)||a.value(c))),m=c,n=d)}function f(){function b(b){function c(){b.onload=b.onerror=null,a.selection&&(a.selection.select(b),a.nodeChanged())}b.onload=function(){q.width||q.height||!t||r.setAttribs(b,{width:b.clientWidth,height:b.clientHeight}),c()},b.onerror=c}j(),e(),q=tinymce.extend(q,l.toJSON()),q.alt||(q.alt=""),q.title||(q.title=""),""===q.width&&(q.width=null),""===q.height&&(q.height=null),q.style||(q.style=null),q={src:q.src,alt:q.alt,title:q.title,width:q.width,height:q.height,style:q.style,"class":q["class"]},a.undoManager.transact(function(){return q.src?(""===q.title&&(q.title=null),s?(r.setAttribs(s,q),a.editorUpload.uploadImagesAuto()):(q.id="__mcenew",a.focus(),a.selection.setContent(r.createHTML("img",q)),s=r.get("__mcenew"),r.setAttrib(s,"id",null)),void b(s)):void(s&&(r.remove(s),a.focus(),a.nodeChanged()))})}function g(a){return a&&(a=a.replace(/px$/,"")),a}function h(c){var d,e,f,g=c.meta||{};o&&o.value(a.convertURL(this.value(),"src")),tinymce.each(g,function(a,b){l.find("#"+b).value(a)}),g.width||g.height||(d=a.convertURL(this.value(),"src"),e=a.settings.image_prepend_url,f=new RegExp("^(?:[a-z]+:)?//","i"),e&&!f.test(d)&&d.substring(0,e.length)!==e&&(d=e+d),this.value(d),b(a.documentBaseURI.toAbsolute(this.value()),function(a){a.width&&a.height&&t&&(m=a.width,n=a.height,l.find("#width").value(m),l.find("#height").value(n))}))}function i(a){if(a.margin){var b=a.margin.split(" ");switch(b.length){case 1:a["margin-top"]=a["margin-top"]||b[0],a["margin-right"]=a["margin-right"]||b[0],a["margin-bottom"]=a["margin-bottom"]||b[0],a["margin-left"]=a["margin-left"]||b[0];break;case 2:a["margin-top"]=a["margin-top"]||b[0],a["margin-right"]=a["margin-right"]||b[1],a["margin-bottom"]=a["margin-bottom"]||b[0],a["margin-left"]=a["margin-left"]||b[1];break;case 3:a["margin-top"]=a["margin-top"]||b[0],a["margin-right"]=a["margin-right"]||b[1],a["margin-bottom"]=a["margin-bottom"]||b[2],a["margin-left"]=a["margin-left"]||b[1];break;case 4:a["margin-top"]=a["margin-top"]||b[0],a["margin-right"]=a["margin-right"]||b[1],a["margin-bottom"]=a["margin-bottom"]||b[2],a["margin-left"]=a["margin-left"]||b[3]}delete a.margin}return a}function j(){function b(a){return a.length>0&&/^[0-9]+$/.test(a)&&(a+="px"),a}if(a.settings.image_advtab){var c=l.toJSON(),d=r.parseStyle(c.style);d=i(d),c.vspace&&(d["margin-top"]=d["margin-bottom"]=b(c.vspace)),c.hspace&&(d["margin-left"]=d["margin-right"]=b(c.hspace)),c.border&&(d["border-width"]=b(c.border)),l.find("#style").value(r.serializeStyle(r.parseStyle(r.serializeStyle(d))))}}function k(){if(a.settings.image_advtab){var b=l.toJSON(),c=r.parseStyle(b.style);l.find("#vspace").value(""),l.find("#hspace").value(""),c=i(c),(c["margin-top"]&&c["margin-bottom"]||c["margin-right"]&&c["margin-left"])&&(c["margin-top"]===c["margin-bottom"]?l.find("#vspace").value(g(c["margin-top"])):l.find("#vspace").value(""),c["margin-right"]===c["margin-left"]?l.find("#hspace").value(g(c["margin-right"])):l.find("#hspace").value("")),c["border-width"]&&l.find("#border").value(g(c["border-width"])),l.find("#style").value(r.serializeStyle(r.parseStyle(r.serializeStyle(c))))}}var l,m,n,o,p,q={},r=a.dom,s=a.selection.getNode(),t=a.settings.image_dimensions!==!1;m=r.getAttrib(s,"width"),n=r.getAttrib(s,"height"),"IMG"!=s.nodeName||s.getAttribute("data-mce-object")||s.getAttribute("data-mce-placeholder")?s=null:q={src:r.getAttrib(s,"src"),alt:r.getAttrib(s,"alt"),title:r.getAttrib(s,"title"),"class":r.getAttrib(s,"class"),width:m,height:n},d&&(o={type:"listbox",label:"Image list",values:c(d,function(b){b.value=a.convertURL(b.value||b.url,"src")},[{text:"None",value:""}]),value:q.src&&a.convertURL(q.src,"src"),onselect:function(a){var b=l.find("#alt");(!b.value()||a.lastControl&&b.value()==a.lastControl.text())&&b.value(a.control.text()),l.find("#src").value(a.control.value()).fire("change")},onPostRender:function(){o=this}}),a.settings.image_class_list&&(p={name:"class",type:"listbox",label:"Class",values:c(a.settings.image_class_list,function(b){b.value&&(b.textStyle=function(){return a.formatter.getCssText({inline:"img",classes:[b.value]})})})});var u=[{name:"src",type:"filepicker",filetype:"image",label:"Source",autofocus:!0,onchange:h},o];a.settings.image_description!==!1&&u.push({name:"alt",type:"textbox",label:"Image description"}),a.settings.image_title&&u.push({name:"title",type:"textbox",label:"Image Title"}),t&&u.push({type:"container",label:"Dimensions",layout:"flex",direction:"row",align:"center",spacing:5,items:[{name:"width",type:"textbox",maxLength:5,size:3,onchange:e,ariaLabel:"Width"},{type:"label",text:"x"},{name:"height",type:"textbox",maxLength:5,size:3,onchange:e,ariaLabel:"Height"},{name:"constrain",type:"checkbox",checked:!0,text:"Constrain proportions"}]}),u.push(p),a.settings.image_advtab?(s&&(s.style.marginLeft&&s.style.marginRight&&s.style.marginLeft===s.style.marginRight&&(q.hspace=g(s.style.marginLeft)),s.style.marginTop&&s.style.marginBottom&&s.style.marginTop===s.style.marginBottom&&(q.vspace=g(s.style.marginTop)),s.style.borderWidth&&(q.border=g(s.style.borderWidth)),q.style=a.dom.serializeStyle(a.dom.parseStyle(a.dom.getAttrib(s,"style")))),l=a.windowManager.open({title:"Insert/edit image",data:q,bodyType:"tabpanel",body:[{title:"General",type:"form",items:u},{title:"Advanced",type:"form",pack:"start",items:[{label:"Style",name:"style",type:"textbox",onchange:k},{type:"form",layout:"grid",packV:"start",columns:2,padding:0,alignH:["left","right"],defaults:{type:"textbox",maxWidth:50,onchange:j},items:[{label:"Vertical space",name:"vspace"},{label:"Horizontal space",name:"hspace"},{label:"Border",name:"border"}]}]}],onSubmit:f})):l=a.windowManager.open({title:"Insert/edit image",data:q,body:u,onSubmit:f})}a.addButton("image",{icon:"image",tooltip:"Insert/edit image",onclick:d(e),stateSelector:"img:not([data-mce-object],[data-mce-placeholder])"}),a.addMenuItem("image",{icon:"image",text:"Insert/edit image",onclick:d(e),context:"insert",prependToContext:!0}),a.addCommand("mceImage",d(e))}); \ No newline at end of file diff --git a/tinymce-4.2.8/js/tinymce/plugins/imagetools/plugin.min.js b/tinymce-4.2.8/js/tinymce/plugins/imagetools/plugin.min.js deleted file mode 100644 index 05a0bec..0000000 --- a/tinymce-4.2.8/js/tinymce/plugins/imagetools/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a,b){"use strict";function c(a,b){for(var c,d=[],f=0;fe?360+e:e,(90==e||270==e)&&b.resize(g,g.height,g.width),(90==e||180==e)&&(j=g.width),(270==e||180==e)&&(k=g.height),i.translate(j,k),i.rotate(e*Math.PI/180),i.drawImage(f,0,0),h(f),a.canvasToBlob(g,d.type)})}function e(d,e){return a.blobToImage(d).then(function(d){var f=b.create(c.getWidth(d),c.getHeight(d)),g=b.get2dContext(f);return"v"==e?(g.scale(1,-1),g.drawImage(d,0,-f.height)):(g.scale(-1,1),g.drawImage(d,-f.width,0)),h(d),a.canvasToBlob(f)})}function f(c,d,e,f,g){return a.blobToImage(c).then(function(c){var i=b.create(f,g),j=b.get2dContext(i);return j.drawImage(c,-d,-e),h(c),a.canvasToBlob(i)})}function g(c,d,e){return a.blobToImage(c).then(function(f){var g=b.create(d,e),i=b.get2dContext(g);return i.drawImage(f,0,0,d,e),h(f),a.canvasToBlob(g,c.type)})}var h=a.revokeImageUrl;return{rotate:d,flip:e,crop:f,resize:g}}),d("tinymce/imagetoolsplugin/CropRect",["tinymce/dom/DomQuery","tinymce/ui/DragHelper","tinymce/ui/Rect","tinymce/util/Tools","tinymce/util/Observable"],function(a,b,c,d,e){var f=0;return function(g,h,i,j){function k(a,b){return{x:b.x+a.x,y:b.y+a.y,w:b.w,h:b.h}}function l(a,b){return{x:b.x-a.x,y:b.y-a.y,w:b.w,h:b.h}}function m(){return l(i,g)}function n(){function e(a){var d;return new b(A,{document:j.ownerDocument,handle:A+"-"+a.name,start:function(){d=g},drag:function(b){var e,f,h,j,k;e=d.x,f=d.y,h=d.w,j=d.h,e+=b.deltaX*a.deltaX,f+=b.deltaY*a.deltaY,h+=b.deltaX*a.deltaW,j+=b.deltaY*a.deltaH,20>h&&(h=20),20>j&&(j=20),k=g=c.clamp({x:e,y:f,w:h,h:j},i,"move"==a.name),k=l(i,k),v.fire("updateRect",{rect:k}),s(k)}})}a('
').appendTo(j),d.each(y,function(b){a("#"+A,j).append('