xmt_froala 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +28 -0
  4. data/Rakefile +2 -0
  5. data/app/assets/javascripts/xmt_froala.js +31 -0
  6. data/app/assets/stylesheets/xmt_froala.css +17 -0
  7. data/app/controllers/xmt_froala/application_controller.rb +5 -0
  8. data/app/controllers/xmt_froala/assets_controller.rb +94 -0
  9. data/app/models/xmt_froala/asset_uploader.rb +107 -0
  10. data/app/models/xmt_froala/file_uploader.rb +10 -0
  11. data/app/models/xmt_froala/flash_uploader.rb +10 -0
  12. data/app/models/xmt_froala/image_uploader.rb +10 -0
  13. data/app/models/xmt_froala/media_uploader.rb +10 -0
  14. data/config/routes.rb +6 -0
  15. data/lib/generators/xmt_froala/install/USAGE +10 -0
  16. data/lib/generators/xmt_froala/install/install_generator.rb +23 -0
  17. data/lib/generators/xmt_froala/install/templates/application.js +17 -0
  18. data/lib/generators/xmt_froala/install/templates/xmt_froala.rb +29 -0
  19. data/lib/generators/xmt_froala/migration/USAGE +14 -0
  20. data/lib/generators/xmt_froala/migration/migration_generator.rb +36 -0
  21. data/lib/generators/xmt_froala/migration/templates/migration/migration.rb +18 -0
  22. data/lib/generators/xmt_froala/migration/templates/models/active_record/xmt_froala/asset.rb +14 -0
  23. data/lib/generators/xmt_froala/migration/templates/models/active_record/xmt_froala/file.rb +3 -0
  24. data/lib/generators/xmt_froala/migration/templates/models/active_record/xmt_froala/flash.rb +3 -0
  25. data/lib/generators/xmt_froala/migration/templates/models/active_record/xmt_froala/image.rb +3 -0
  26. data/lib/generators/xmt_froala/migration/templates/models/active_record/xmt_froala/media.rb +3 -0
  27. data/lib/generators/xmt_froala/migration/templates/models/mongoid/xmt_froala/asset.rb +27 -0
  28. data/lib/generators/xmt_froala/migration/templates/models/mongoid/xmt_froala/file.rb +3 -0
  29. data/lib/generators/xmt_froala/migration/templates/models/mongoid/xmt_froala/flash.rb +3 -0
  30. data/lib/generators/xmt_froala/migration/templates/models/mongoid/xmt_froala/image.rb +3 -0
  31. data/lib/generators/xmt_froala/migration/templates/models/mongoid/xmt_froala/media.rb +3 -0
  32. data/lib/tasks/xmt_froala_tasks.rake +9 -0
  33. data/lib/xmt_froala.rb +65 -0
  34. data/lib/xmt_froala/active_record.rb +14 -0
  35. data/lib/xmt_froala/engine.rb +32 -0
  36. data/lib/xmt_froala/formtastic.rb +12 -0
  37. data/lib/xmt_froala/helper.rb +105 -0
  38. data/lib/xmt_froala/simple_form.rb +11 -0
  39. data/lib/xmt_froala/version.rb +3 -0
  40. data/vendor/assets/javascripts/xmt_froala/froala_editor.js +0 -0
  41. data/vendor/assets/javascripts/xmt_froala/languages/ar.js +318 -0
  42. data/vendor/assets/javascripts/xmt_froala/languages/bs.js +318 -0
  43. data/vendor/assets/javascripts/xmt_froala/languages/cs.js +318 -0
  44. data/vendor/assets/javascripts/xmt_froala/languages/da.js +318 -0
  45. data/vendor/assets/javascripts/xmt_froala/languages/de.js +318 -0
  46. data/vendor/assets/javascripts/xmt_froala/languages/en_ca.js +262 -0
  47. data/vendor/assets/javascripts/xmt_froala/languages/en_gb.js +262 -0
  48. data/vendor/assets/javascripts/xmt_froala/languages/es.js +318 -0
  49. data/vendor/assets/javascripts/xmt_froala/languages/et.js +318 -0
  50. data/vendor/assets/javascripts/xmt_froala/languages/fa.js +318 -0
  51. data/vendor/assets/javascripts/xmt_froala/languages/fi.js +318 -0
  52. data/vendor/assets/javascripts/xmt_froala/languages/fr.js +318 -0
  53. data/vendor/assets/javascripts/xmt_froala/languages/he.js +318 -0
  54. data/vendor/assets/javascripts/xmt_froala/languages/hr.js +318 -0
  55. data/vendor/assets/javascripts/xmt_froala/languages/hu.js +318 -0
  56. data/vendor/assets/javascripts/xmt_froala/languages/id.js +319 -0
  57. data/vendor/assets/javascripts/xmt_froala/languages/it.js +318 -0
  58. data/vendor/assets/javascripts/xmt_froala/languages/ja.js +318 -0
  59. data/vendor/assets/javascripts/xmt_froala/languages/ko.js +318 -0
  60. data/vendor/assets/javascripts/xmt_froala/languages/me.js +318 -0
  61. data/vendor/assets/javascripts/xmt_froala/languages/nb.js +318 -0
  62. data/vendor/assets/javascripts/xmt_froala/languages/nl.js +318 -0
  63. data/vendor/assets/javascripts/xmt_froala/languages/pl.js +318 -0
  64. data/vendor/assets/javascripts/xmt_froala/languages/pt_br.js +318 -0
  65. data/vendor/assets/javascripts/xmt_froala/languages/pt_pt.js +318 -0
  66. data/vendor/assets/javascripts/xmt_froala/languages/ro.js +319 -0
  67. data/vendor/assets/javascripts/xmt_froala/languages/ru.js +318 -0
  68. data/vendor/assets/javascripts/xmt_froala/languages/sk.js +318 -0
  69. data/vendor/assets/javascripts/xmt_froala/languages/sr.js +318 -0
  70. data/vendor/assets/javascripts/xmt_froala/languages/sv.js +318 -0
  71. data/vendor/assets/javascripts/xmt_froala/languages/th.js +318 -0
  72. data/vendor/assets/javascripts/xmt_froala/languages/tr.js +318 -0
  73. data/vendor/assets/javascripts/xmt_froala/languages/uk.js +318 -0
  74. data/vendor/assets/javascripts/xmt_froala/languages/vi.js +258 -0
  75. data/vendor/assets/javascripts/xmt_froala/languages/zh_cn.js +320 -0
  76. data/vendor/assets/javascripts/xmt_froala/languages/zh_tw.js +318 -0
  77. data/vendor/assets/javascripts/xmt_froala/plugins/align.js +139 -0
  78. data/vendor/assets/javascripts/xmt_froala/plugins/align.min.js +7 -0
  79. data/vendor/assets/javascripts/xmt_froala/plugins/char_counter.js +154 -0
  80. data/vendor/assets/javascripts/xmt_froala/plugins/char_counter.min.js +7 -0
  81. data/vendor/assets/javascripts/xmt_froala/plugins/code_beautifier.js +3270 -0
  82. data/vendor/assets/javascripts/xmt_froala/plugins/code_beautifier.min.js +7 -0
  83. data/vendor/assets/javascripts/xmt_froala/plugins/code_view.js +393 -0
  84. data/vendor/assets/javascripts/xmt_froala/plugins/code_view.min.js +7 -0
  85. data/vendor/assets/javascripts/xmt_froala/plugins/colors.js +492 -0
  86. data/vendor/assets/javascripts/xmt_froala/plugins/colors.min.js +7 -0
  87. data/vendor/assets/javascripts/xmt_froala/plugins/draggable.js +459 -0
  88. data/vendor/assets/javascripts/xmt_froala/plugins/draggable.min.js +7 -0
  89. data/vendor/assets/javascripts/xmt_froala/plugins/emoticons.js +509 -0
  90. data/vendor/assets/javascripts/xmt_froala/plugins/emoticons.min.js +7 -0
  91. data/vendor/assets/javascripts/xmt_froala/plugins/entities.js +121 -0
  92. data/vendor/assets/javascripts/xmt_froala/plugins/entities.min.js +7 -0
  93. data/vendor/assets/javascripts/xmt_froala/plugins/file.js +736 -0
  94. data/vendor/assets/javascripts/xmt_froala/plugins/file.min.js +239 -0
  95. data/vendor/assets/javascripts/xmt_froala/plugins/font_family.js +182 -0
  96. data/vendor/assets/javascripts/xmt_froala/plugins/font_family.min.js +7 -0
  97. data/vendor/assets/javascripts/xmt_froala/plugins/font_size.js +118 -0
  98. data/vendor/assets/javascripts/xmt_froala/plugins/font_size.min.js +7 -0
  99. data/vendor/assets/javascripts/xmt_froala/plugins/forms.js +430 -0
  100. data/vendor/assets/javascripts/xmt_froala/plugins/forms.min.js +7 -0
  101. data/vendor/assets/javascripts/xmt_froala/plugins/fullscreen.js +274 -0
  102. data/vendor/assets/javascripts/xmt_froala/plugins/fullscreen.min.js +7 -0
  103. data/vendor/assets/javascripts/xmt_froala/plugins/help.js +216 -0
  104. data/vendor/assets/javascripts/xmt_froala/plugins/help.min.js +7 -0
  105. data/vendor/assets/javascripts/xmt_froala/plugins/image.js +3323 -0
  106. data/vendor/assets/javascripts/xmt_froala/plugins/image.min.js +7 -0
  107. data/vendor/assets/javascripts/xmt_froala/plugins/image_manager.js +1056 -0
  108. data/vendor/assets/javascripts/xmt_froala/plugins/image_manager.min.js +7 -0
  109. data/vendor/assets/javascripts/xmt_froala/plugins/inline_style.js +94 -0
  110. data/vendor/assets/javascripts/xmt_froala/plugins/inline_style.min.js +7 -0
  111. data/vendor/assets/javascripts/xmt_froala/plugins/line_breaker.js +537 -0
  112. data/vendor/assets/javascripts/xmt_froala/plugins/line_breaker.min.js +7 -0
  113. data/vendor/assets/javascripts/xmt_froala/plugins/link.js +1157 -0
  114. data/vendor/assets/javascripts/xmt_froala/plugins/link.min.js +7 -0
  115. data/vendor/assets/javascripts/xmt_froala/plugins/lists.js +462 -0
  116. data/vendor/assets/javascripts/xmt_froala/plugins/lists.min.js +7 -0
  117. data/vendor/assets/javascripts/xmt_froala/plugins/paragraph_format.js +290 -0
  118. data/vendor/assets/javascripts/xmt_froala/plugins/paragraph_format.min.js +7 -0
  119. data/vendor/assets/javascripts/xmt_froala/plugins/paragraph_style.js +144 -0
  120. data/vendor/assets/javascripts/xmt_froala/plugins/paragraph_style.min.js +7 -0
  121. data/vendor/assets/javascripts/xmt_froala/plugins/plain_paste.js +96 -0
  122. data/vendor/assets/javascripts/xmt_froala/plugins/print.js +137 -0
  123. data/vendor/assets/javascripts/xmt_froala/plugins/print.min.js +7 -0
  124. data/vendor/assets/javascripts/xmt_froala/plugins/quick_format.js +89 -0
  125. data/vendor/assets/javascripts/xmt_froala/plugins/quick_insert.js +478 -0
  126. data/vendor/assets/javascripts/xmt_froala/plugins/quick_insert.min.js +7 -0
  127. data/vendor/assets/javascripts/xmt_froala/plugins/quote.js +141 -0
  128. data/vendor/assets/javascripts/xmt_froala/plugins/quote.min.js +7 -0
  129. data/vendor/assets/javascripts/xmt_froala/plugins/save.js +189 -0
  130. data/vendor/assets/javascripts/xmt_froala/plugins/save.min.js +7 -0
  131. data/vendor/assets/javascripts/xmt_froala/plugins/special_characters.js +781 -0
  132. data/vendor/assets/javascripts/xmt_froala/plugins/special_characters.min.js +7 -0
  133. data/vendor/assets/javascripts/xmt_froala/plugins/table.js +4194 -0
  134. data/vendor/assets/javascripts/xmt_froala/plugins/table.min.js +7 -0
  135. data/vendor/assets/javascripts/xmt_froala/plugins/url.js +194 -0
  136. data/vendor/assets/javascripts/xmt_froala/plugins/url.min.js +7 -0
  137. data/vendor/assets/javascripts/xmt_froala/plugins/video.js +2342 -0
  138. data/vendor/assets/javascripts/xmt_froala/plugins/video.min.js +7 -0
  139. data/vendor/assets/javascripts/xmt_froala/plugins/word_paste.js +1403 -0
  140. data/vendor/assets/javascripts/xmt_froala/plugins/word_paste.min.js +7 -0
  141. data/vendor/assets/javascripts/xmt_froala/third_party/embedly.js +543 -0
  142. data/vendor/assets/javascripts/xmt_froala/third_party/embedly.min.js +7 -0
  143. data/vendor/assets/javascripts/xmt_froala/third_party/image_aviary.js +163 -0
  144. data/vendor/assets/javascripts/xmt_froala/third_party/image_aviary.min.js +7 -0
  145. data/vendor/assets/javascripts/xmt_froala/third_party/spell_checker.js +222 -0
  146. data/vendor/assets/javascripts/xmt_froala/third_party/spell_checker.min.js +7 -0
  147. data/vendor/assets/javascripts/xmt_froala/xmt_froala.js +15172 -0
  148. data/vendor/assets/stylesheets/xmt_froala/css/font-awesome.css +2546 -0
  149. data/vendor/assets/stylesheets/xmt_froala/css/froala_editor.min.css +7 -0
  150. data/vendor/assets/stylesheets/xmt_froala/css/froala_editor.pkgd.css +2902 -0
  151. data/vendor/assets/stylesheets/xmt_froala/css/froala_editor.pkgd.min.css +7 -0
  152. data/vendor/assets/stylesheets/xmt_froala/css/froala_style.css +413 -0
  153. data/vendor/assets/stylesheets/xmt_froala/css/froala_style.min.css +7 -0
  154. data/vendor/assets/stylesheets/xmt_froala/css/plugins/char_counter.css +57 -0
  155. data/vendor/assets/stylesheets/xmt_froala/css/plugins/char_counter.min.css +7 -0
  156. data/vendor/assets/stylesheets/xmt_froala/css/plugins/code_view.css +112 -0
  157. data/vendor/assets/stylesheets/xmt_froala/css/plugins/code_view.min.css +7 -0
  158. data/vendor/assets/stylesheets/xmt_froala/css/plugins/colors.css +155 -0
  159. data/vendor/assets/stylesheets/xmt_froala/css/plugins/colors.min.css +7 -0
  160. data/vendor/assets/stylesheets/xmt_froala/css/plugins/draggable.css +43 -0
  161. data/vendor/assets/stylesheets/xmt_froala/css/plugins/draggable.min.css +7 -0
  162. data/vendor/assets/stylesheets/xmt_froala/css/plugins/emoticons.css +42 -0
  163. data/vendor/assets/stylesheets/xmt_froala/css/plugins/emoticons.min.css +7 -0
  164. data/vendor/assets/stylesheets/xmt_froala/css/plugins/file.css +146 -0
  165. data/vendor/assets/stylesheets/xmt_froala/css/plugins/file.min.css +7 -0
  166. data/vendor/assets/stylesheets/xmt_froala/css/plugins/fullscreen.css +28 -0
  167. data/vendor/assets/stylesheets/xmt_froala/css/plugins/fullscreen.min.css +7 -0
  168. data/vendor/assets/stylesheets/xmt_froala/css/plugins/help.css +52 -0
  169. data/vendor/assets/stylesheets/xmt_froala/css/plugins/help.min.css +7 -0
  170. data/vendor/assets/stylesheets/xmt_froala/css/plugins/image.css +244 -0
  171. data/vendor/assets/stylesheets/xmt_froala/css/plugins/image.min.css +7 -0
  172. data/vendor/assets/stylesheets/xmt_froala/css/plugins/image_manager.css +266 -0
  173. data/vendor/assets/stylesheets/xmt_froala/css/plugins/image_manager.min.css +7 -0
  174. data/vendor/assets/stylesheets/xmt_froala/css/plugins/line_breaker.css +37 -0
  175. data/vendor/assets/stylesheets/xmt_froala/css/plugins/line_breaker.min.css +7 -0
  176. data/vendor/assets/stylesheets/xmt_froala/css/plugins/quick_insert.css +70 -0
  177. data/vendor/assets/stylesheets/xmt_froala/css/plugins/quick_insert.min.css +7 -0
  178. data/vendor/assets/stylesheets/xmt_froala/css/plugins/special_characters.css +51 -0
  179. data/vendor/assets/stylesheets/xmt_froala/css/plugins/special_characters.min.css +7 -0
  180. data/vendor/assets/stylesheets/xmt_froala/css/plugins/table.css +181 -0
  181. data/vendor/assets/stylesheets/xmt_froala/css/plugins/table.min.css +7 -0
  182. data/vendor/assets/stylesheets/xmt_froala/css/plugins/video.css +231 -0
  183. data/vendor/assets/stylesheets/xmt_froala/css/plugins/video.min.css +7 -0
  184. data/vendor/assets/stylesheets/xmt_froala/css/themes/dark.css +1281 -0
  185. data/vendor/assets/stylesheets/xmt_froala/css/themes/dark.min.css +7 -0
  186. data/vendor/assets/stylesheets/xmt_froala/css/themes/gray.css +1281 -0
  187. data/vendor/assets/stylesheets/xmt_froala/css/themes/gray.min.css +7 -0
  188. data/vendor/assets/stylesheets/xmt_froala/css/themes/red.css +1281 -0
  189. data/vendor/assets/stylesheets/xmt_froala/css/themes/red.min.css +7 -0
  190. data/vendor/assets/stylesheets/xmt_froala/css/themes/royal.css +1281 -0
  191. data/vendor/assets/stylesheets/xmt_froala/css/themes/royal.min.css +7 -0
  192. data/vendor/assets/stylesheets/xmt_froala/css/third_party/embedly.css +64 -0
  193. data/vendor/assets/stylesheets/xmt_froala/css/third_party/embedly.min.css +7 -0
  194. data/vendor/assets/stylesheets/xmt_froala/css/third_party/spell_checker.css +72 -0
  195. data/vendor/assets/stylesheets/xmt_froala/css/third_party/spell_checker.min.css +7 -0
  196. data/vendor/assets/stylesheets/xmt_froala/css/xmt_froala.css +1423 -0
  197. data/vendor/assets/stylesheets/xmt_froala/fonts/FontAwesome.otf +0 -0
  198. data/vendor/assets/stylesheets/xmt_froala/fonts/fontawesome-webfont.eot +0 -0
  199. data/vendor/assets/stylesheets/xmt_froala/fonts/fontawesome-webfont.svg +2671 -0
  200. data/vendor/assets/stylesheets/xmt_froala/fonts/fontawesome-webfont.ttf +0 -0
  201. data/vendor/assets/stylesheets/xmt_froala/fonts/fontawesome-webfont.woff +0 -0
  202. data/vendor/assets/stylesheets/xmt_froala/fonts/fontawesome-webfont.woff2 +0 -0
  203. metadata +273 -0
@@ -0,0 +1,7 @@
1
+ /*!
2
+ * froala_editor v2.8.1 (https://www.froala.com/wysiwyg-editor)
3
+ * License https://froala.com/wysiwyg-editor/terms/
4
+ * Copyright 2014-2018 Froala Labs
5
+ */
6
+
7
+ !function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return t===undefined&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t)}:n(window.jQuery)}(function(d){d.extend(d.FE.DEFAULTS,{quickInsertButtons:["image","video","embedly","table","ul","ol","hr"],quickInsertTags:["p","div","h1","h2","h3","h4","h5","h6","pre","blockquote"]}),d.FE.QUICK_INSERT_BUTTONS={},d.FE.DefineIcon("quickInsert",{PATH:'<path d="M22,16.75 L16.75,16.75 L16.75,22 L15.25,22.000 L15.25,16.75 L10,16.75 L10,15.25 L15.25,15.25 L15.25,10 L16.75,10 L16.75,15.25 L22,15.25 L22,16.75 Z"/>',template:"svg"}),d.FE.RegisterQuickInsertButton=function(e,t){d.FE.QUICK_INSERT_BUTTONS[e]=d.extend({undo:!0},t)},d.FE.RegisterQuickInsertButton("image",{icon:"insertImage",requiredPlugin:"image",title:"Insert Image",undo:!1,callback:function(){var e=this;e.shared.$qi_image_input||(e.shared.$qi_image_input=d('<input accept="image/*" name="quickInsertImage'+this.id+'" style="display: none;" type="file">'),d("body:first").append(e.shared.$qi_image_input),e.events.$on(e.shared.$qi_image_input,"change",function(){var e=d(this).data("inst");this.files&&(e.quickInsert.hide(),e.image.upload(this.files)),d(this).val("")},!0)),e.$qi_image_input=e.shared.$qi_image_input,e.helpers.isMobile()&&e.selection.save(),e.events.disableBlur(),e.$qi_image_input.data("inst",e).trigger("click")}}),d.FE.RegisterQuickInsertButton("video",{icon:"insertVideo",requiredPlugin:"video",title:"Insert Video",undo:!1,callback:function(){var e=prompt(this.language.translate("Paste the URL of the video you want to insert."));e&&this.video.insertByURL(e)}}),d.FE.RegisterQuickInsertButton("embedly",{icon:"embedly",requiredPlugin:"embedly",title:"Embed URL",undo:!1,callback:function(){var e=prompt(this.language.translate("Paste the URL of any web content you want to insert."));e&&this.embedly.add(e)}}),d.FE.RegisterQuickInsertButton("table",{icon:"insertTable",requiredPlugin:"table",title:"Insert Table",callback:function(){this.table.insert(2,2)}}),d.FE.RegisterQuickInsertButton("ol",{icon:"formatOL",requiredPlugin:"lists",title:"Ordered List",callback:function(){this.lists.format("OL")}}),d.FE.RegisterQuickInsertButton("ul",{icon:"formatUL",requiredPlugin:"lists",title:"Unordered List",callback:function(){this.lists.format("UL")}}),d.FE.RegisterQuickInsertButton("hr",{icon:"insertHR",title:"Insert Horizontal Line",callback:function(){this.commands.insertHR()}}),d.FE.PLUGINS.quickInsert=function(r){var a,l;function t(e){var t,n,i;t=e.offset().top-r.$box.offset().top,n=0-a.outerWidth(),r.opts.enter!=d.FE.ENTER_BR?i=(a.outerHeight()-e.outerHeight())/2:(d("<span>"+d.FE.INVISIBLE_SPACE+"</span>").insertAfter(e),i=(a.outerHeight()-e.next().outerHeight())/2,e.next().remove()),r.opts.iframe&&(t+=r.$iframe.offset().top-r.helpers.scrollTop()),a.hasClass("fr-on")&&0<=t&&l.css("top",t-i),0<=t&&t-i<=r.$box.outerHeight()-e.outerHeight()?(a.hasClass("fr-hidden")&&(a.hasClass("fr-on")&&o(),a.removeClass("fr-hidden")),a.css("top",t-i)):a.hasClass("fr-visible")&&(a.addClass("fr-hidden"),u()),a.css("left",n)}function n(e){a||function(){r.shared.$quick_insert||(r.shared.$quick_insert=d('<div class="fr-quick-insert"><a class="fr-floating-btn" role="button" tabIndex="-1" title="'+r.language.translate("Quick Insert")+'">'+r.icon.create("quickInsert")+"</a></div>"));a=r.shared.$quick_insert,r.tooltip.bind(r.$box,".fr-quick-insert > a.fr-floating-btn"),r.events.on("destroy",function(){a.removeClass("fr-on").appendTo(d("body:first")).css("left",-9999).css("top",-9999),l&&(u(),l.appendTo(d("body:first")))},!0),r.events.on("shared.destroy",function(){a.html("").removeData().remove(),a=null,l&&(l.html("").removeData().remove(),l=null)},!0),r.events.on("commands.before",s),r.events.on("commands.after",function(){r.popups.areVisible()||i()}),r.events.bindClick(r.$box,".fr-quick-insert > a",o),r.events.bindClick(r.$box,".fr-qi-helper > a.fr-btn",function(e){var t=d(e.currentTarget).data("cmd");if(!1===r.events.trigger("quickInsert.commands.before",[t]))return!1;d.FE.QUICK_INSERT_BUTTONS[t].callback.apply(r,[e.currentTarget]),d.FE.QUICK_INSERT_BUTTONS[t].undo&&r.undo.saveStep(),r.events.trigger("quickInsert.commands.after",[t]),r.quickInsert.hide()}),r.events.$on(r.$wp,"scroll",function(){a.hasClass("fr-visible")&&t(a.data("tag"))})}(),a.hasClass("fr-on")&&u(),r.$box.append(a),t(e),a.data("tag",e),a.addClass("fr-visible")}function i(){if(r.core.hasFocus()){var e=r.selection.element();if(r.opts.enter==d.FE.ENTER_BR||r.node.isBlock(e)||(e=r.node.blockParent(e)),r.opts.enter==d.FE.ENTER_BR&&!r.node.isBlock(e)){var t=r.node.deepestParent(e);t&&(e=t)}e&&(r.opts.enter!=d.FE.ENTER_BR&&r.node.isEmpty(e)&&r.node.isElement(e.parentNode)&&0<=r.opts.quickInsertTags.indexOf(e.tagName.toLowerCase())||r.opts.enter==d.FE.ENTER_BR&&("BR"==e.tagName&&(!e.previousSibling||"BR"==e.previousSibling.tagName||r.node.isBlock(e.previousSibling))||r.node.isEmpty(e)&&(!e.previousSibling||"BR"==e.previousSibling.tagName||r.node.isBlock(e.previousSibling))&&(!e.nextSibling||"BR"==e.nextSibling.tagName||r.node.isBlock(e.nextSibling))))?a&&a.data("tag").is(d(e))&&a.hasClass("fr-on")?u():r.selection.isCollapsed()&&n(d(e)):s()}}function s(){a&&(a.hasClass("fr-on")&&u(),a.removeClass("fr-visible fr-on"),a.css("left",-9999).css("top",-9999))}function o(e){if(e&&e.preventDefault(),a.hasClass("fr-on")&&!a.hasClass("fr-hidden"))u();else{if(!r.shared.$qi_helper){for(var t=r.opts.quickInsertButtons,n='<div class="fr-qi-helper">',i=0,s=0;s<t.length;s++){var o=d.FE.QUICK_INSERT_BUTTONS[t[s]];o&&(!o.requiredPlugin||d.FE.PLUGINS[o.requiredPlugin]&&0<=r.opts.pluginsEnabled.indexOf(o.requiredPlugin))&&(n+='<a class="fr-btn fr-floating-btn" role="button" title="'+r.language.translate(o.title)+'" tabIndex="-1" data-cmd="'+t[s]+'" style="transition-delay: '+.025*i+++'s;">'+r.icon.create(o.icon)+"</a>")}n+="</div>",r.shared.$qi_helper=d(n),r.tooltip.bind(r.shared.$qi_helper,"> a.fr-btn"),r.events.$on(r.shared.$qi_helper,"mousedown",function(e){e.preventDefault()},!0)}(l=r.shared.$qi_helper).appendTo(r.$box),setTimeout(function(){l.css("top",parseFloat(a.css("top"))),l.css("left",parseFloat(a.css("left"))+a.outerWidth()),l.find("a").addClass("fr-size-1"),a.addClass("fr-on")},10)}}function u(){var e=r.$box.find(".fr-qi-helper");e.length&&(e.find("a").removeClass("fr-size-1"),e.css("left",-9999),a.hasClass("fr-hidden")||a.removeClass("fr-on"))}return{_init:function(){if(!r.$wp)return!1;r.opts.iframe&&r.$el.parent("html").find("head").append('<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.4.0/css/font-awesome.min.css">'),r.popups.onShow("image.edit",s),r.events.on("mouseup",i),r.helpers.isMobile()&&r.events.$on(d(r.o_doc),"selectionchange",i),r.events.on("blur",s),r.events.on("keyup",i),r.events.on("keydown",function(){setTimeout(function(){i()},0)})},hide:s}}});
@@ -0,0 +1,141 @@
1
+ /*!
2
+ * froala_editor v2.8.1 (https://www.froala.com/wysiwyg-editor)
3
+ * License https://froala.com/wysiwyg-editor/terms/
4
+ * Copyright 2014-2018 Froala Labs
5
+ */
6
+
7
+ (function (factory) {
8
+ if (typeof define === 'function' && define.amd) {
9
+ // AMD. Register as an anonymous module.
10
+ define(['jquery'], factory);
11
+ } else if (typeof module === 'object' && module.exports) {
12
+ // Node/CommonJS
13
+ module.exports = function( root, jQuery ) {
14
+ if ( jQuery === undefined ) {
15
+ // require('jQuery') returns a factory that requires window to
16
+ // build a jQuery instance, we normalize how we use modules
17
+ // that require this pattern but the window provided is a noop
18
+ // if it's defined (how jquery works)
19
+ if ( typeof window !== 'undefined' ) {
20
+ jQuery = require('jquery');
21
+ }
22
+ else {
23
+ jQuery = require('jquery')(root);
24
+ }
25
+ }
26
+ return factory(jQuery);
27
+ };
28
+ } else {
29
+ // Browser globals
30
+ factory(window.jQuery);
31
+ }
32
+ }(function ($) {
33
+
34
+
35
+
36
+ $.FE.PLUGINS.quote = function (editor) {
37
+ function _deepestParent(node) {
38
+ while (node.parentNode && node.parentNode != editor.el) {
39
+ node = node.parentNode;
40
+ }
41
+
42
+ return node;
43
+ }
44
+
45
+ function _increase () {
46
+
47
+ // Get blocks.
48
+ var blocks = editor.selection.blocks();
49
+ var i;
50
+
51
+ // Normalize blocks.
52
+ for (i = 0; i < blocks.length; i++) {
53
+ blocks[i] = _deepestParent(blocks[i]);
54
+ }
55
+
56
+ // Save selection to restore it later.
57
+ editor.selection.save();
58
+
59
+ var $quote = $('<blockquote>');
60
+ $quote.insertBefore(blocks[0]);
61
+
62
+ for (i = 0; i < blocks.length; i++) {
63
+ $quote.append(blocks[i]);
64
+ }
65
+
66
+ // Unwrap temp divs.
67
+ editor.html.unwrap();
68
+
69
+ editor.selection.restore();
70
+ }
71
+
72
+ function _decrease () {
73
+
74
+ // Get blocks.
75
+ var blocks = editor.selection.blocks();
76
+ var i;
77
+
78
+ for (i = 0; i < blocks.length; i++) {
79
+ if (blocks[i].tagName != 'BLOCKQUOTE') {
80
+ blocks[i] = $(blocks[i]).parentsUntil(editor.$el, 'BLOCKQUOTE').get(0);
81
+ }
82
+ }
83
+
84
+ editor.selection.save();
85
+
86
+ for (i = 0; i < blocks.length; i++) {
87
+ if (blocks[i]) {
88
+ $(blocks[i]).replaceWith(blocks[i].innerHTML);
89
+ }
90
+ }
91
+
92
+ // Unwrap temp divs.
93
+ editor.html.unwrap();
94
+
95
+ editor.selection.restore();
96
+ }
97
+
98
+ function apply (val) {
99
+
100
+ // Wrap.
101
+ editor.selection.save();
102
+ editor.html.wrap(true, true, true, true);
103
+ editor.selection.restore();
104
+
105
+ if (val == 'increase') {
106
+ _increase();
107
+ }
108
+ else if (val == 'decrease') {
109
+ _decrease();
110
+ }
111
+
112
+
113
+ }
114
+
115
+ return {
116
+ apply: apply
117
+ }
118
+ }
119
+
120
+ // Register the quote command.
121
+ $.FE.RegisterShortcut($.FE.KEYCODE.SINGLE_QUOTE, 'quote', 'increase', '\'');
122
+ $.FE.RegisterShortcut($.FE.KEYCODE.SINGLE_QUOTE, 'quote', 'decrease', '\'', true);
123
+ $.FE.RegisterCommand('quote', {
124
+ title: 'Quote',
125
+ type: 'dropdown',
126
+ options: {
127
+ increase: 'Increase',
128
+ decrease: 'Decrease'
129
+ },
130
+ callback: function (cmd, val) {
131
+ this.quote.apply(val);
132
+ },
133
+ plugin: 'quote'
134
+ })
135
+
136
+ // Add the quote icon.
137
+ $.FE.DefineIcon('quote', {
138
+ NAME: 'quote-left'
139
+ });
140
+
141
+ }));
@@ -0,0 +1,7 @@
1
+ /*!
2
+ * froala_editor v2.8.1 (https://www.froala.com/wysiwyg-editor)
3
+ * License https://froala.com/wysiwyg-editor/terms/
4
+ * Copyright 2014-2018 Froala Labs
5
+ */
6
+
7
+ !function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return t===undefined&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t)}:n(window.jQuery)}(function(i){i.FE.PLUGINS.quote=function(o){function r(e){for(;e.parentNode&&e.parentNode!=o.el;)e=e.parentNode;return e}return{apply:function(e){o.selection.save(),o.html.wrap(!0,!0,!0,!0),o.selection.restore(),"increase"==e?function(){var e,t=o.selection.blocks();for(e=0;e<t.length;e++)t[e]=r(t[e]);o.selection.save();var n=i("<blockquote>");for(n.insertBefore(t[0]),e=0;e<t.length;e++)n.append(t[e]);o.html.unwrap(),o.selection.restore()}():"decrease"==e&&function(){var e,t=o.selection.blocks();for(e=0;e<t.length;e++)"BLOCKQUOTE"!=t[e].tagName&&(t[e]=i(t[e]).parentsUntil(o.$el,"BLOCKQUOTE").get(0));for(o.selection.save(),e=0;e<t.length;e++)t[e]&&i(t[e]).replaceWith(t[e].innerHTML);o.html.unwrap(),o.selection.restore()}()}}},i.FE.RegisterShortcut(i.FE.KEYCODE.SINGLE_QUOTE,"quote","increase","'"),i.FE.RegisterShortcut(i.FE.KEYCODE.SINGLE_QUOTE,"quote","decrease","'",!0),i.FE.RegisterCommand("quote",{title:"Quote",type:"dropdown",options:{increase:"Increase",decrease:"Decrease"},callback:function(e,t){this.quote.apply(t)},plugin:"quote"}),i.FE.DefineIcon("quote",{NAME:"quote-left"})});
@@ -0,0 +1,189 @@
1
+ /*!
2
+ * froala_editor v2.8.1 (https://www.froala.com/wysiwyg-editor)
3
+ * License https://froala.com/wysiwyg-editor/terms/
4
+ * Copyright 2014-2018 Froala Labs
5
+ */
6
+
7
+ (function (factory) {
8
+ if (typeof define === 'function' && define.amd) {
9
+ // AMD. Register as an anonymous module.
10
+ define(['jquery'], factory);
11
+ } else if (typeof module === 'object' && module.exports) {
12
+ // Node/CommonJS
13
+ module.exports = function( root, jQuery ) {
14
+ if ( jQuery === undefined ) {
15
+ // require('jQuery') returns a factory that requires window to
16
+ // build a jQuery instance, we normalize how we use modules
17
+ // that require this pattern but the window provided is a noop
18
+ // if it's defined (how jquery works)
19
+ if ( typeof window !== 'undefined' ) {
20
+ jQuery = require('jquery');
21
+ }
22
+ else {
23
+ jQuery = require('jquery')(root);
24
+ }
25
+ }
26
+ return factory(jQuery);
27
+ };
28
+ } else {
29
+ // Browser globals
30
+ factory(window.jQuery);
31
+ }
32
+ }(function ($) {
33
+
34
+
35
+
36
+ // Extend defaults.
37
+ $.extend($.FE.DEFAULTS, {
38
+ saveInterval: 10000,
39
+ saveURL: null,
40
+ saveParams: {},
41
+ saveParam: 'body',
42
+ saveMethod: 'POST'
43
+ });
44
+
45
+
46
+ $.FE.PLUGINS.save = function (editor) {
47
+ var _timeout = null;
48
+ var _last_html = null;
49
+ var _force = false;
50
+
51
+ var BAD_LINK = 1;
52
+ var ERROR_ON_SERVER = 2;
53
+
54
+ var error_messages = {};
55
+ error_messages[BAD_LINK] = 'Missing saveURL option.';
56
+ error_messages[ERROR_ON_SERVER] = 'Something went wrong during save.';
57
+
58
+ /**
59
+ * Throw an image error.
60
+ */
61
+ function _throwError (code, response) {
62
+ editor.events.trigger('save.error', [{
63
+ code: code,
64
+ message: error_messages[code]
65
+ }, response]);
66
+ }
67
+
68
+ function save (html) {
69
+ if (typeof html == 'undefined') html = editor.html.get();
70
+
71
+ var original_html = html;
72
+
73
+ // Trigger before save event.
74
+ var event_returned_value = editor.events.trigger('save.before', [html]);
75
+
76
+ if (event_returned_value === false) return false;
77
+ else if (typeof event_returned_value == 'string') html = event_returned_value;
78
+
79
+ if (editor.opts.saveURL) {
80
+ var params = {};
81
+
82
+ for (var key in editor.opts.saveParams) {
83
+ if (editor.opts.saveParams.hasOwnProperty(key)) {
84
+ var param = editor.opts.saveParams[key];
85
+
86
+ if (typeof(param) == 'function') {
87
+ params[key] = param.call(this);
88
+ }
89
+ else {
90
+ params[key] = param;
91
+ }
92
+ }
93
+ }
94
+
95
+ var dt = {};
96
+ dt[editor.opts.saveParam] = html;
97
+
98
+ $.ajax({
99
+ type: editor.opts.saveMethod,
100
+ url: editor.opts.saveURL,
101
+ data: $.extend(dt, params),
102
+ crossDomain: editor.opts.requestWithCORS,
103
+ xhrFields: {
104
+ withCredentials: editor.opts.requestWithCredentials
105
+ },
106
+ headers: editor.opts.requestHeaders
107
+ })
108
+ .done(function (data) {
109
+ _last_html = original_html;
110
+
111
+ // data
112
+ editor.events.trigger('save.after', [data]);
113
+ })
114
+ .fail(function (xhr) {
115
+
116
+ // (error)
117
+ _throwError(ERROR_ON_SERVER, xhr.response || xhr.responseText);
118
+ });
119
+ }
120
+ else {
121
+
122
+ // (error)
123
+ _throwError(BAD_LINK);
124
+ }
125
+ }
126
+
127
+ function _mightSave () {
128
+ clearTimeout(_timeout);
129
+ _timeout = setTimeout(function () {
130
+ var html = editor.html.get();
131
+
132
+ if (_last_html != html || _force) {
133
+ _last_html = html;
134
+ _force = false;
135
+
136
+ save(html);
137
+ }
138
+ }, editor.opts.saveInterval);
139
+ }
140
+
141
+ /**
142
+ * Reset the saving interval.
143
+ */
144
+ function reset () {
145
+ _mightSave();
146
+ _force = false;
147
+ }
148
+
149
+ /**
150
+ * Force saving at the end of the current interval.
151
+ */
152
+ function force () {
153
+ _force = true;
154
+ }
155
+
156
+ /*
157
+ * Initialize.
158
+ */
159
+ function _init () {
160
+ if (editor.opts.saveInterval) {
161
+ _last_html = editor.html.get();
162
+ editor.events.on('contentChanged', _mightSave);
163
+ editor.events.on('keydown destroy', function () {
164
+ clearTimeout(_timeout);
165
+ });
166
+ }
167
+ }
168
+
169
+ return {
170
+ _init: _init,
171
+ save: save,
172
+ reset: reset,
173
+ force: force
174
+ }
175
+ }
176
+
177
+ $.FE.DefineIcon('save', { NAME: 'floppy-o' });
178
+ $.FE.RegisterCommand('save', {
179
+ title: 'Save',
180
+ undo: false,
181
+ focus: false,
182
+ refreshAfterCallback: false,
183
+ callback: function () {
184
+ this.save.save();
185
+ },
186
+ plugin: 'save'
187
+ });
188
+
189
+ }));
@@ -0,0 +1,7 @@
1
+ /*!
2
+ * froala_editor v2.8.1 (https://www.froala.com/wysiwyg-editor)
3
+ * License https://froala.com/wysiwyg-editor/terms/
4
+ * Copyright 2014-2018 Froala Labs
5
+ */
6
+
7
+ !function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return t===undefined&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t)}:n(window.jQuery)}(function(l){l.extend(l.FE.DEFAULTS,{saveInterval:1e4,saveURL:null,saveParams:{},saveParam:"body",saveMethod:"POST"}),l.FE.PLUGINS.save=function(i){var e=null,u=null,t=!1,v=1,f=2,n={};function d(e,t){i.events.trigger("save.error",[{code:e,message:n[e]},t])}function s(e){void 0===e&&(e=i.html.get());var t=e,n=i.events.trigger("save.before",[e]);if(!1===n)return!1;if("string"==typeof n&&(e=n),i.opts.saveURL){var s={};for(var o in i.opts.saveParams)if(i.opts.saveParams.hasOwnProperty(o)){var a=i.opts.saveParams[o];s[o]="function"==typeof a?a.call(this):a}var r={};r[i.opts.saveParam]=e,l.ajax({type:i.opts.saveMethod,url:i.opts.saveURL,data:l.extend(r,s),crossDomain:i.opts.requestWithCORS,xhrFields:{withCredentials:i.opts.requestWithCredentials},headers:i.opts.requestHeaders}).done(function(e){u=t,i.events.trigger("save.after",[e])}).fail(function(e){d(f,e.response||e.responseText)})}else d(v)}function o(){clearTimeout(e),e=setTimeout(function(){var e=i.html.get();(u!=e||t)&&(t=!1,s(u=e))},i.opts.saveInterval)}return n[v]="Missing saveURL option.",n[f]="Something went wrong during save.",{_init:function(){i.opts.saveInterval&&(u=i.html.get(),i.events.on("contentChanged",o),i.events.on("keydown destroy",function(){clearTimeout(e)}))},save:s,reset:function(){o(),t=!1},force:function(){t=!0}}},l.FE.DefineIcon("save",{NAME:"floppy-o"}),l.FE.RegisterCommand("save",{title:"Save",undo:!1,focus:!1,refreshAfterCallback:!1,callback:function(){this.save.save()},plugin:"save"})});
@@ -0,0 +1,781 @@
1
+ /*!
2
+ * froala_editor v2.8.1 (https://www.froala.com/wysiwyg-editor)
3
+ * License https://froala.com/wysiwyg-editor/terms/
4
+ * Copyright 2014-2018 Froala Labs
5
+ */
6
+
7
+ (function (factory) {
8
+ if (typeof define === 'function' && define.amd) {
9
+ // AMD. Register as an anonymous module.
10
+ define(['jquery'], factory);
11
+ } else if (typeof module === 'object' && module.exports) {
12
+ // Node/CommonJS
13
+ module.exports = function( root, jQuery ) {
14
+ if ( jQuery === undefined ) {
15
+ // require('jQuery') returns a factory that requires window to
16
+ // build a jQuery instance, we normalize how we use modules
17
+ // that require this pattern but the window provided is a noop
18
+ // if it's defined (how jquery works)
19
+ if ( typeof window !== 'undefined' ) {
20
+ jQuery = require('jquery');
21
+ }
22
+ else {
23
+ jQuery = require('jquery')(root);
24
+ }
25
+ }
26
+ return factory(jQuery);
27
+ };
28
+ } else {
29
+ // Browser globals
30
+ factory(window.jQuery);
31
+ }
32
+ }(function ($) {
33
+
34
+
35
+
36
+ // Extend defaults.
37
+ $.extend($.FE.DEFAULTS, {
38
+ specialCharactersSets: [
39
+ {
40
+ title: 'Latin',
41
+ list: [
42
+ { 'char': '&iexcl;', desc: 'INVERTED EXCLAMATION MARK' },
43
+ { 'char': '&cent;', desc: 'CENT SIGN' },
44
+ { 'char': '&pound;', desc: 'POUND SIGN' },
45
+ { 'char': '&curren;', desc: 'CURRENCY SIGN' },
46
+ { 'char': '&yen;', desc: 'YEN SIGN' },
47
+ { 'char': '&brvbar;', desc: 'BROKEN BAR' },
48
+ { 'char': '&sect;', desc: 'SECTION SIGN' },
49
+ { 'char': '&uml;', desc: 'DIAERESIS' },
50
+ { 'char': '&copy;', desc: 'COPYRIGHT SIGN' },
51
+ { 'char': '&trade;', desc: 'TRADEMARK SIGN' },
52
+ { 'char': '&ordf;', desc: 'FEMININE ORDINAL INDICATOR' },
53
+ { 'char': '&laquo;', desc: 'LEFT-POINTING DOUBLE ANGLE QUOTATION MARK' },
54
+ { 'char': '&not;', desc: 'NOT SIGN' },
55
+ { 'char': '&reg;', desc: 'REGISTERED SIGN' },
56
+ { 'char': '&macr;', desc: 'MACRON' },
57
+ { 'char': '&deg;', desc: 'DEGREE SIGN' },
58
+ { 'char': '&plusmn;', desc: 'PLUS-MINUS SIGN' },
59
+ { 'char': '&sup2;', desc: 'SUPERSCRIPT TWO' },
60
+ { 'char': '&sup3;', desc: 'SUPERSCRIPT THREE' },
61
+ { 'char': '&acute;', desc: 'ACUTE ACCENT' },
62
+ { 'char': '&micro;', desc: 'MICRO SIGN' },
63
+ { 'char': '&para;', desc: 'PILCROW SIGN' },
64
+ { 'char': '&middot;', desc: 'MIDDLE DOT' },
65
+ { 'char': '&cedil;', desc: 'CEDILLA' },
66
+ { 'char': '&sup1;', desc: 'SUPERSCRIPT ONE' },
67
+ { 'char': '&ordm;', desc: 'MASCULINE ORDINAL INDICATOR' },
68
+ { 'char': '&raquo;', desc: 'RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK' },
69
+ { 'char': '&frac14;', desc: 'VULGAR FRACTION ONE QUARTER' },
70
+ { 'char': '&frac12;', desc: 'VULGAR FRACTION ONE HALF' },
71
+ { 'char': '&frac34;', desc: 'VULGAR FRACTION THREE QUARTERS' },
72
+ { 'char': '&iquest;', desc: 'INVERTED QUESTION MARK' },
73
+ { 'char': '&Agrave;', desc: 'LATIN CAPITAL LETTER A WITH GRAVE' },
74
+ { 'char': '&Aacute;', desc: 'LATIN CAPITAL LETTER A WITH ACUTE' },
75
+ { 'char': '&Acirc;', desc: 'LATIN CAPITAL LETTER A WITH CIRCUMFLEX' },
76
+ { 'char': '&Atilde;', desc: 'LATIN CAPITAL LETTER A WITH TILDE' },
77
+ { 'char': '&Auml;', desc: 'LATIN CAPITAL LETTER A WITH DIAERESIS ' },
78
+ { 'char': '&Aring;', desc: 'LATIN CAPITAL LETTER A WITH RING ABOVE' },
79
+ { 'char': '&AElig;', desc: 'LATIN CAPITAL LETTER AE' },
80
+ { 'char': '&Ccedil;', desc: 'LATIN CAPITAL LETTER C WITH CEDILLA' },
81
+ { 'char': '&Egrave;', desc: 'LATIN CAPITAL LETTER E WITH GRAVE' },
82
+ { 'char': '&Eacute;', desc: 'LATIN CAPITAL LETTER E WITH ACUTE' },
83
+ { 'char': '&Ecirc;', desc: 'LATIN CAPITAL LETTER E WITH CIRCUMFLEX' },
84
+ { 'char': '&Euml;', desc: 'LATIN CAPITAL LETTER E WITH DIAERESIS' },
85
+ { 'char': '&Igrave;', desc: 'LATIN CAPITAL LETTER I WITH GRAVE' },
86
+ { 'char': '&Iacute;', desc: 'LATIN CAPITAL LETTER I WITH ACUTE' },
87
+ { 'char': '&Icirc;', desc: 'LATIN CAPITAL LETTER I WITH CIRCUMFLEX' },
88
+ { 'char': '&Iuml;', desc: 'LATIN CAPITAL LETTER I WITH DIAERESIS' },
89
+ { 'char': '&ETH;', desc: 'LATIN CAPITAL LETTER ETH' },
90
+ { 'char': '&Ntilde;', desc: 'LATIN CAPITAL LETTER N WITH TILDE' },
91
+ { 'char': '&Ograve;', desc: 'LATIN CAPITAL LETTER O WITH GRAVE' },
92
+ { 'char': '&Oacute;', desc: 'LATIN CAPITAL LETTER O WITH ACUTE' },
93
+ { 'char': '&Ocirc;', desc: 'LATIN CAPITAL LETTER O WITH CIRCUMFLEX' },
94
+ { 'char': '&Otilde;', desc: 'LATIN CAPITAL LETTER O WITH TILDE' },
95
+ { 'char': '&Ouml;', desc: 'LATIN CAPITAL LETTER O WITH DIAERESIS' },
96
+ { 'char': '&times;', desc: 'MULTIPLICATION SIGN' },
97
+ { 'char': '&Oslash;', desc: 'LATIN CAPITAL LETTER O WITH STROKE' },
98
+ { 'char': '&Ugrave;', desc: 'LATIN CAPITAL LETTER U WITH GRAVE' },
99
+ { 'char': '&Uacute;', desc: 'LATIN CAPITAL LETTER U WITH ACUTE' },
100
+ { 'char': '&Ucirc;', desc: 'LATIN CAPITAL LETTER U WITH CIRCUMFLEX' },
101
+ { 'char': '&Uuml;', desc: 'LATIN CAPITAL LETTER U WITH DIAERESIS' },
102
+ { 'char': '&Yacute;', desc: 'LATIN CAPITAL LETTER Y WITH ACUTE' },
103
+ { 'char': '&THORN;', desc: 'LATIN CAPITAL LETTER THORN' },
104
+ { 'char': '&szlig;', desc: 'LATIN SMALL LETTER SHARP S' },
105
+ { 'char': '&agrave;', desc: 'LATIN SMALL LETTER A WITH GRAVE' },
106
+ { 'char': '&aacute;', desc: 'LATIN SMALL LETTER A WITH ACUTE ' },
107
+ { 'char': '&acirc;', desc: 'LATIN SMALL LETTER A WITH CIRCUMFLEX' },
108
+ { 'char': '&atilde;', desc: 'LATIN SMALL LETTER A WITH TILDE' },
109
+ { 'char': '&auml;', desc: 'LATIN SMALL LETTER A WITH DIAERESIS' },
110
+ { 'char': '&aring;', desc: 'LATIN SMALL LETTER A WITH RING ABOVE' },
111
+ { 'char': '&aelig;', desc: 'LATIN SMALL LETTER AE' },
112
+ { 'char': '&ccedil;', desc: 'LATIN SMALL LETTER C WITH CEDILLA' },
113
+ { 'char': '&egrave;', desc: 'LATIN SMALL LETTER E WITH GRAVE' },
114
+ { 'char': '&eacute;', desc: 'LATIN SMALL LETTER E WITH ACUTE' },
115
+ { 'char': '&ecirc;', desc: 'LATIN SMALL LETTER E WITH CIRCUMFLEX' },
116
+ { 'char': '&euml;', desc: 'LATIN SMALL LETTER E WITH DIAERESIS' },
117
+ { 'char': '&igrave;', desc: 'LATIN SMALL LETTER I WITH GRAVE' },
118
+ { 'char': '&iacute;', desc: 'LATIN SMALL LETTER I WITH ACUTE' },
119
+ { 'char': '&icirc;', desc: 'LATIN SMALL LETTER I WITH CIRCUMFLEX' },
120
+ { 'char': '&iuml;', desc: 'LATIN SMALL LETTER I WITH DIAERESIS' },
121
+ { 'char': '&eth;', desc: 'LATIN SMALL LETTER ETH' },
122
+ { 'char': '&ntilde;', desc: 'LATIN SMALL LETTER N WITH TILDE' },
123
+ { 'char': '&ograve;', desc: 'LATIN SMALL LETTER O WITH GRAVE' },
124
+ { 'char': '&oacute;', desc: 'LATIN SMALL LETTER O WITH ACUTE' },
125
+ { 'char': '&ocirc;', desc: 'LATIN SMALL LETTER O WITH CIRCUMFLEX' },
126
+ { 'char': '&otilde;', desc: 'LATIN SMALL LETTER O WITH TILDE' },
127
+ { 'char': '&ouml;', desc: 'LATIN SMALL LETTER O WITH DIAERESIS' },
128
+ { 'char': '&divide;', desc: 'DIVISION SIGN' },
129
+ { 'char': '&oslash;', desc: 'LATIN SMALL LETTER O WITH STROKE' },
130
+ { 'char': '&ugrave;', desc: 'LATIN SMALL LETTER U WITH GRAVE' },
131
+ { 'char': '&uacute;', desc: 'LATIN SMALL LETTER U WITH ACUTE' },
132
+ { 'char': '&ucirc;', desc: 'LATIN SMALL LETTER U WITH CIRCUMFLEX' },
133
+ { 'char': '&uuml;', desc: 'LATIN SMALL LETTER U WITH DIAERESIS' },
134
+ { 'char': '&yacute;', desc: 'LATIN SMALL LETTER Y WITH ACUTE' },
135
+ { 'char': '&thorn;', desc: 'LATIN SMALL LETTER THORN' },
136
+ { 'char': '&yuml;', desc: 'LATIN SMALL LETTER Y WITH DIAERESIS' }
137
+ ]
138
+ },
139
+ {
140
+ title: 'Greek',
141
+ list: [
142
+ { 'char': '&Alpha;', desc: 'GREEK CAPITAL LETTER ALPHA' },
143
+ { 'char': '&Beta;', desc: 'GREEK CAPITAL LETTER BETA' },
144
+ { 'char': '&Gamma;', desc: 'GREEK CAPITAL LETTER GAMMA' },
145
+ { 'char': '&Delta;', desc: 'GREEK CAPITAL LETTER DELTA' },
146
+ { 'char': '&Epsilon;', desc: 'GREEK CAPITAL LETTER EPSILON' },
147
+ { 'char': '&Zeta;', desc: 'GREEK CAPITAL LETTER ZETA' },
148
+ { 'char': '&Eta;', desc: 'GREEK CAPITAL LETTER ETA' },
149
+ { 'char': '&Theta;', desc: 'GREEK CAPITAL LETTER THETA' },
150
+ { 'char': '&Iota;', desc: 'GREEK CAPITAL LETTER IOTA' },
151
+ { 'char': '&Kappa;', desc: 'GREEK CAPITAL LETTER KAPPA' },
152
+ { 'char': '&Lambda;', desc: 'GREEK CAPITAL LETTER LAMBDA' },
153
+ { 'char': '&Mu;', desc: 'GREEK CAPITAL LETTER MU' },
154
+ { 'char': '&Nu;', desc: 'GREEK CAPITAL LETTER NU' },
155
+ { 'char': '&Xi;', desc: 'GREEK CAPITAL LETTER XI' },
156
+ { 'char': '&Omicron;', desc: 'GREEK CAPITAL LETTER OMICRON' },
157
+ { 'char': '&Pi;', desc: 'GREEK CAPITAL LETTER PI' },
158
+ { 'char': '&Rho;', desc: 'GREEK CAPITAL LETTER RHO' },
159
+ { 'char': '&Sigma;', desc: 'GREEK CAPITAL LETTER SIGMA' },
160
+ { 'char': '&Tau;', desc: 'GREEK CAPITAL LETTER TAU' },
161
+ { 'char': '&Upsilon;', desc: 'GREEK CAPITAL LETTER UPSILON' },
162
+ { 'char': '&Phi;', desc: 'GREEK CAPITAL LETTER PHI' },
163
+ { 'char': '&Chi;', desc: 'GREEK CAPITAL LETTER CHI' },
164
+ { 'char': '&Psi;', desc: 'GREEK CAPITAL LETTER PSI' },
165
+ { 'char': '&Omega;', desc: 'GREEK CAPITAL LETTER OMEGA' },
166
+ { 'char': '&alpha;', desc: 'GREEK SMALL LETTER ALPHA' },
167
+ { 'char': '&beta;', desc: 'GREEK SMALL LETTER BETA' },
168
+ { 'char': '&gamma;', desc: 'GREEK SMALL LETTER GAMMA' },
169
+ { 'char': '&delta;', desc: 'GREEK SMALL LETTER DELTA' },
170
+ { 'char': '&epsilon;', desc: 'GREEK SMALL LETTER EPSILON' },
171
+ { 'char': '&zeta;', desc: 'GREEK SMALL LETTER ZETA' },
172
+ { 'char': '&eta;', desc: 'GREEK SMALL LETTER ETA' },
173
+ { 'char': '&theta;', desc: 'GREEK SMALL LETTER THETA' },
174
+ { 'char': '&iota;', desc: 'GREEK SMALL LETTER IOTA' },
175
+ { 'char': '&kappa;', desc: 'GREEK SMALL LETTER KAPPA' },
176
+ { 'char': '&lambda;', desc: 'GREEK SMALL LETTER LAMBDA' },
177
+ { 'char': '&mu;', desc: 'GREEK SMALL LETTER MU' },
178
+ { 'char': '&nu;', desc: 'GREEK SMALL LETTER NU' },
179
+ { 'char': '&xi;', desc: 'GREEK SMALL LETTER XI' },
180
+ { 'char': '&omicron;', desc: 'GREEK SMALL LETTER OMICRON' },
181
+ { 'char': '&pi;', desc: 'GREEK SMALL LETTER PI' },
182
+ { 'char': '&rho;', desc: 'GREEK SMALL LETTER RHO' },
183
+ { 'char': '&sigmaf;', desc: 'GREEK SMALL LETTER FINAL SIGMA' },
184
+ { 'char': '&sigma;', desc: 'GREEK SMALL LETTER SIGMA' },
185
+ { 'char': '&tau;', desc: 'GREEK SMALL LETTER TAU' },
186
+ { 'char': '&upsilon;', desc: 'GREEK SMALL LETTER UPSILON' },
187
+ { 'char': '&phi;', desc: 'GREEK SMALL LETTER PHI' },
188
+ { 'char': '&chi;', desc: 'GREEK SMALL LETTER CHI' },
189
+ { 'char': '&psi;', desc: 'GREEK SMALL LETTER PSI' },
190
+ { 'char': '&omega;', desc: 'GREEK SMALL LETTER OMEGA' },
191
+ { 'char': '&thetasym;', desc: 'GREEK THETA SYMBOL' },
192
+ { 'char': '&upsih;', desc: 'GREEK UPSILON WITH HOOK SYMBOL' },
193
+ { 'char': '&straightphi;', desc: 'GREEK PHI SYMBOL' },
194
+ { 'char': '&piv;', desc: 'GREEK PI SYMBOL' },
195
+ { 'char': '&Gammad;', desc: 'GREEK LETTER DIGAMMA' },
196
+ { 'char': '&gammad;', desc: 'GREEK SMALL LETTER DIGAMMA' },
197
+ { 'char': '&varkappa;', desc: 'GREEK KAPPA SYMBOL' },
198
+ { 'char': '&varrho;', desc: 'GREEK RHO SYMBOL' },
199
+ { 'char': '&straightepsilon;', desc: 'GREEK LUNATE EPSILON SYMBOL' },
200
+ { 'char': '&backepsilon;', desc: 'GREEK REVERSED LUNATE EPSILON SYMBOL' }
201
+ ]
202
+ },
203
+ {
204
+ title: 'Cyrillic',
205
+ list: [
206
+ { 'char': '&#x400', desc: 'CYRILLIC CAPITAL LETTER IE WITH GRAVE' },
207
+ { 'char': '&#x401', desc: 'CYRILLIC CAPITAL LETTER IO' },
208
+ { 'char': '&#x402', desc: 'CYRILLIC CAPITAL LETTER DJE' },
209
+ { 'char': '&#x403', desc: 'CYRILLIC CAPITAL LETTER GJE' },
210
+ { 'char': '&#x404', desc: 'CYRILLIC CAPITAL LETTER UKRAINIAN IE' },
211
+ { 'char': '&#x405', desc: 'CYRILLIC CAPITAL LETTER DZE' },
212
+ { 'char': '&#x406', desc: 'CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I' },
213
+ { 'char': '&#x407', desc: 'CYRILLIC CAPITAL LETTER YI' },
214
+ { 'char': '&#x408', desc: 'CYRILLIC CAPITAL LETTER JE' },
215
+ { 'char': '&#x409', desc: 'CYRILLIC CAPITAL LETTER LJE' },
216
+ { 'char': '&#x40A', desc: 'CYRILLIC CAPITAL LETTER NJE' },
217
+ { 'char': '&#x40B', desc: 'CYRILLIC CAPITAL LETTER TSHE' },
218
+ { 'char': '&#x40C', desc: 'CYRILLIC CAPITAL LETTER KJE' },
219
+ { 'char': '&#x40D', desc: 'CYRILLIC CAPITAL LETTER I WITH GRAVE' },
220
+ { 'char': '&#x40E', desc: 'CYRILLIC CAPITAL LETTER SHORT U' },
221
+ { 'char': '&#x40F', desc: 'CYRILLIC CAPITAL LETTER DZHE' },
222
+ { 'char': '&#x410', desc: 'CYRILLIC CAPITAL LETTER A' },
223
+ { 'char': '&#x411', desc: 'CYRILLIC CAPITAL LETTER BE' },
224
+ { 'char': '&#x412', desc: 'CYRILLIC CAPITAL LETTER VE' },
225
+ { 'char': '&#x413', desc: 'CYRILLIC CAPITAL LETTER GHE' },
226
+ { 'char': '&#x414', desc: 'CYRILLIC CAPITAL LETTER DE' },
227
+ { 'char': '&#x415', desc: 'CYRILLIC CAPITAL LETTER IE' },
228
+ { 'char': '&#x416', desc: 'CYRILLIC CAPITAL LETTER ZHE' },
229
+ { 'char': '&#x417', desc: 'CYRILLIC CAPITAL LETTER ZE' },
230
+ { 'char': '&#x418', desc: 'CYRILLIC CAPITAL LETTER I' },
231
+ { 'char': '&#x419', desc: 'CYRILLIC CAPITAL LETTER SHORT I' },
232
+ { 'char': '&#x41A', desc: 'CYRILLIC CAPITAL LETTER KA' },
233
+ { 'char': '&#x41B', desc: 'CYRILLIC CAPITAL LETTER EL' },
234
+ { 'char': '&#x41C', desc: 'CYRILLIC CAPITAL LETTER EM' },
235
+ { 'char': '&#x41D', desc: 'CYRILLIC CAPITAL LETTER EN' },
236
+ { 'char': '&#x41E', desc: 'CYRILLIC CAPITAL LETTER O' },
237
+ { 'char': '&#x41F', desc: 'CYRILLIC CAPITAL LETTER PE' },
238
+ { 'char': '&#x420', desc: 'CYRILLIC CAPITAL LETTER ER' },
239
+ { 'char': '&#x421', desc: 'CYRILLIC CAPITAL LETTER ES' },
240
+ { 'char': '&#x422', desc: 'CYRILLIC CAPITAL LETTER TE' },
241
+ { 'char': '&#x423', desc: 'CYRILLIC CAPITAL LETTER U' },
242
+ { 'char': '&#x424', desc: 'CYRILLIC CAPITAL LETTER EF' },
243
+ { 'char': '&#x425', desc: 'CYRILLIC CAPITAL LETTER HA' },
244
+ { 'char': '&#x426', desc: 'CYRILLIC CAPITAL LETTER TSE' },
245
+ { 'char': '&#x427', desc: 'CYRILLIC CAPITAL LETTER CHE' },
246
+ { 'char': '&#x428', desc: 'CYRILLIC CAPITAL LETTER SHA' },
247
+ { 'char': '&#x429', desc: 'CYRILLIC CAPITAL LETTER SHCHA' },
248
+ { 'char': '&#x42A', desc: 'CYRILLIC CAPITAL LETTER HARD SIGN' },
249
+ { 'char': '&#x42B', desc: 'CYRILLIC CAPITAL LETTER YERU' },
250
+ { 'char': '&#x42C', desc: 'CYRILLIC CAPITAL LETTER SOFT SIGN' },
251
+ { 'char': '&#x42D', desc: 'CYRILLIC CAPITAL LETTER E' },
252
+ { 'char': '&#x42E', desc: 'CYRILLIC CAPITAL LETTER YU' },
253
+ { 'char': '&#x42F', desc: 'CYRILLIC CAPITAL LETTER YA' },
254
+ { 'char': '&#x430', desc: 'CYRILLIC SMALL LETTER A' },
255
+ { 'char': '&#x431', desc: 'CYRILLIC SMALL LETTER BE' },
256
+ { 'char': '&#x432', desc: 'CYRILLIC SMALL LETTER VE' },
257
+ { 'char': '&#x433', desc: 'CYRILLIC SMALL LETTER GHE' },
258
+ { 'char': '&#x434', desc: 'CYRILLIC SMALL LETTER DE' },
259
+ { 'char': '&#x435', desc: 'CYRILLIC SMALL LETTER IE' },
260
+ { 'char': '&#x436', desc: 'CYRILLIC SMALL LETTER ZHE' },
261
+ { 'char': '&#x437', desc: 'CYRILLIC SMALL LETTER ZE' },
262
+ { 'char': '&#x438', desc: 'CYRILLIC SMALL LETTER I' },
263
+ { 'char': '&#x439', desc: 'CYRILLIC SMALL LETTER SHORT I' },
264
+ { 'char': '&#x43A', desc: 'CYRILLIC SMALL LETTER KA' },
265
+ { 'char': '&#x43B', desc: 'CYRILLIC SMALL LETTER EL' },
266
+ { 'char': '&#x43C', desc: 'CYRILLIC SMALL LETTER EM' },
267
+ { 'char': '&#x43D', desc: 'CYRILLIC SMALL LETTER EN' },
268
+ { 'char': '&#x43E', desc: 'CYRILLIC SMALL LETTER O' },
269
+ { 'char': '&#x43F', desc: 'CYRILLIC SMALL LETTER PE' },
270
+ { 'char': '&#x440', desc: 'CYRILLIC SMALL LETTER ER' },
271
+ { 'char': '&#x441', desc: 'CYRILLIC SMALL LETTER ES' },
272
+ { 'char': '&#x442', desc: 'CYRILLIC SMALL LETTER TE' },
273
+ { 'char': '&#x443', desc: 'CYRILLIC SMALL LETTER U' },
274
+ { 'char': '&#x444', desc: 'CYRILLIC SMALL LETTER EF' },
275
+ { 'char': '&#x445', desc: 'CYRILLIC SMALL LETTER HA' },
276
+ { 'char': '&#x446', desc: 'CYRILLIC SMALL LETTER TSE' },
277
+ { 'char': '&#x447', desc: 'CYRILLIC SMALL LETTER CHE' },
278
+ { 'char': '&#x448', desc: 'CYRILLIC SMALL LETTER SHA' },
279
+ { 'char': '&#x449', desc: 'CYRILLIC SMALL LETTER SHCHA' },
280
+ { 'char': '&#x44A', desc: 'CYRILLIC SMALL LETTER HARD SIGN' },
281
+ { 'char': '&#x44B', desc: 'CYRILLIC SMALL LETTER YERU' },
282
+ { 'char': '&#x44C', desc: 'CYRILLIC SMALL LETTER SOFT SIGN' },
283
+ { 'char': '&#x44D', desc: 'CYRILLIC SMALL LETTER E' },
284
+ { 'char': '&#x44E', desc: 'CYRILLIC SMALL LETTER YU' },
285
+ { 'char': '&#x44F', desc: 'CYRILLIC SMALL LETTER YA' },
286
+ { 'char': '&#x450', desc: 'CYRILLIC SMALL LETTER IE WITH GRAVE' },
287
+ { 'char': '&#x451', desc: 'CYRILLIC SMALL LETTER IO' },
288
+ { 'char': '&#x452', desc: 'CYRILLIC SMALL LETTER DJE' },
289
+ { 'char': '&#x453', desc: 'CYRILLIC SMALL LETTER GJE' },
290
+ { 'char': '&#x454', desc: 'CYRILLIC SMALL LETTER UKRAINIAN IE' },
291
+ { 'char': '&#x455', desc: 'CYRILLIC SMALL LETTER DZE' },
292
+ { 'char': '&#x456', desc: 'CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I' },
293
+ { 'char': '&#x457', desc: 'CYRILLIC SMALL LETTER YI' },
294
+ { 'char': '&#x458', desc: 'CYRILLIC SMALL LETTER JE' },
295
+ { 'char': '&#x459', desc: 'CYRILLIC SMALL LETTER LJE' },
296
+ { 'char': '&#x45A', desc: 'CYRILLIC SMALL LETTER NJE' },
297
+ { 'char': '&#x45B', desc: 'CYRILLIC SMALL LETTER TSHE' },
298
+ { 'char': '&#x45C', desc: 'CYRILLIC SMALL LETTER KJE' },
299
+ { 'char': '&#x45D', desc: 'CYRILLIC SMALL LETTER I WITH GRAVE' },
300
+ { 'char': '&#x45E', desc: 'CYRILLIC SMALL LETTER SHORT U' },
301
+ { 'char': '&#x45F', desc: 'CYRILLIC SMALL LETTER DZHE' }
302
+ ]
303
+ },
304
+ {
305
+ title: 'Punctuation',
306
+ list: [
307
+ { 'char': '&ndash;', desc: 'EN DASH' },
308
+ { 'char': '&mdash;', desc: 'EM DASH' },
309
+ { 'char': '&lsquo;', desc: 'LEFT SINGLE QUOTATION MARK' },
310
+ { 'char': '&rsquo;', desc: 'RIGHT SINGLE QUOTATION MARK' },
311
+ { 'char': '&sbquo;', desc: 'SINGLE LOW-9 QUOTATION MARK' },
312
+ { 'char': '&ldquo;', desc: 'LEFT DOUBLE QUOTATION MARK' },
313
+ { 'char': '&rdquo;', desc: 'RIGHT DOUBLE QUOTATION MARK' },
314
+ { 'char': '&bdquo;', desc: 'DOUBLE LOW-9 QUOTATION MARK' },
315
+ { 'char': '&dagger;', desc: 'DAGGER' },
316
+ { 'char': '&Dagger;', desc: 'DOUBLE DAGGER' },
317
+ { 'char': '&bull;', desc: 'BULLET' },
318
+ { 'char': '&hellip;', desc: 'HORIZONTAL ELLIPSIS' },
319
+ { 'char': '&permil;', desc: 'PER MILLE SIGN' },
320
+ { 'char': '&prime;', desc: 'PRIME' },
321
+ { 'char': '&Prime;', desc: 'DOUBLE PRIME' },
322
+ { 'char': '&lsaquo;', desc: 'SINGLE LEFT-POINTING ANGLE QUOTATION MARK' },
323
+ { 'char': '&rsaquo;', desc: 'SINGLE RIGHT-POINTING ANGLE QUOTATION MARK' },
324
+ { 'char': '&oline;', desc: 'OVERLINE' },
325
+ { 'char': '&frasl;', desc: 'FRACTION SLASH' }
326
+ ]
327
+ },
328
+ {
329
+ title: 'Currency',
330
+ list: [
331
+ { 'char': '&#x20A0', desc: 'EURO-CURRENCY SIGN' },
332
+ { 'char': '&#x20A1', desc: 'COLON SIGN' },
333
+ { 'char': '&#x20A2', desc: 'CRUZEIRO SIGN' },
334
+ { 'char': '&#x20A3', desc: 'FRENCH FRANC SIGN' },
335
+ { 'char': '&#x20A4', desc: 'LIRA SIGN' },
336
+ { 'char': '&#x20A5', desc: 'MILL SIGN' },
337
+ { 'char': '&#x20A6', desc: 'NAIRA SIGN' },
338
+ { 'char': '&#x20A7', desc: 'PESETA SIGN' },
339
+ { 'char': '&#x20A8', desc: 'RUPEE SIGN' },
340
+ { 'char': '&#x20A9', desc: 'WON SIGN' },
341
+ { 'char': '&#x20AA', desc: 'NEW SHEQEL SIGN' },
342
+ { 'char': '&#x20AB', desc: 'DONG SIGN' },
343
+ { 'char': '&#x20AC', desc: 'EURO SIGN' },
344
+ { 'char': '&#x20AD', desc: 'KIP SIGN' },
345
+ { 'char': '&#x20AE', desc: 'TUGRIK SIGN' },
346
+ { 'char': '&#x20AF', desc: 'DRACHMA SIGN' },
347
+ { 'char': '&#x20B0', desc: 'GERMAN PENNY SYMBOL' },
348
+ { 'char': '&#x20B1', desc: 'PESO SIGN' },
349
+ { 'char': '&#x20B2', desc: 'GUARANI SIGN' },
350
+ { 'char': '&#x20B3', desc: 'AUSTRAL SIGN' },
351
+ { 'char': '&#x20B4', desc: 'HRYVNIA SIGN' },
352
+ { 'char': '&#x20B5', desc: 'CEDI SIGN' },
353
+ { 'char': '&#x20B6', desc: 'LIVRE TOURNOIS SIGN' },
354
+ { 'char': '&#x20B7', desc: 'SPESMILO SIGN' },
355
+ { 'char': '&#x20B8', desc: 'TENGE SIGN' },
356
+ { 'char': '&#x20B9', desc: 'INDIAN RUPEE SIGN' }
357
+ ]
358
+ },
359
+ {
360
+ title: 'Arrows',
361
+ list: [
362
+ { 'char': '&#x2190', desc: 'LEFTWARDS ARROW' },
363
+ { 'char': '&#x2191', desc: 'UPWARDS ARROW' },
364
+ { 'char': '&#x2192', desc: 'RIGHTWARDS ARROW' },
365
+ { 'char': '&#x2193', desc: 'DOWNWARDS ARROW' },
366
+ { 'char': '&#x2194', desc: 'LEFT RIGHT ARROW' },
367
+ { 'char': '&#x2195', desc: 'UP DOWN ARROW' },
368
+ { 'char': '&#x2196', desc: 'NORTH WEST ARROW' },
369
+ { 'char': '&#x2197', desc: 'NORTH EAST ARROW' },
370
+ { 'char': '&#x2198', desc: 'SOUTH EAST ARROW' },
371
+ { 'char': '&#x2199', desc: 'SOUTH WEST ARROW' },
372
+ { 'char': '&#x219A', desc: 'LEFTWARDS ARROW WITH STROKE' },
373
+ { 'char': '&#x219B', desc: 'RIGHTWARDS ARROW WITH STROKE' },
374
+ { 'char': '&#x219C', desc: 'LEFTWARDS WAVE ARROW' },
375
+ { 'char': '&#x219D', desc: 'RIGHTWARDS WAVE ARROW' },
376
+ { 'char': '&#x219E', desc: 'LEFTWARDS TWO HEADED ARROW' },
377
+ { 'char': '&#x219F', desc: 'UPWARDS TWO HEADED ARROW' },
378
+ { 'char': '&#x21A0', desc: 'RIGHTWARDS TWO HEADED ARROW' },
379
+ { 'char': '&#x21A1', desc: 'DOWNWARDS TWO HEADED ARROW' },
380
+ { 'char': '&#x21A2', desc: 'LEFTWARDS ARROW WITH TAIL' },
381
+ { 'char': '&#x21A3', desc: 'RIGHTWARDS ARROW WITH TAIL' },
382
+ { 'char': '&#x21A4', desc: 'LEFTWARDS ARROW FROM BAR' },
383
+ { 'char': '&#x21A5', desc: 'UPWARDS ARROW FROM BAR' },
384
+ { 'char': '&#x21A6', desc: 'RIGHTWARDS ARROW FROM BAR' },
385
+ { 'char': '&#x21A7', desc: 'DOWNWARDS ARROW FROM BAR' },
386
+ { 'char': '&#x21A8', desc: 'UP DOWN ARROW WITH BASE' },
387
+ { 'char': '&#x21A9', desc: 'LEFTWARDS ARROW WITH HOOK' },
388
+ { 'char': '&#x21AA', desc: 'RIGHTWARDS ARROW WITH HOOK' },
389
+ { 'char': '&#x21AB', desc: 'LEFTWARDS ARROW WITH LOOP' },
390
+ { 'char': '&#x21AC', desc: 'RIGHTWARDS ARROW WITH LOOP' },
391
+ { 'char': '&#x21AD', desc: 'LEFT RIGHT WAVE ARROW' },
392
+ { 'char': '&#x21AE', desc: 'LEFT RIGHT ARROW WITH STROKE' },
393
+ { 'char': '&#x21AF', desc: 'DOWNWARDS ZIGZAG ARROW' },
394
+ { 'char': '&#x21B0', desc: 'UPWARDS ARROW WITH TIP LEFTWARDS' },
395
+ { 'char': '&#x21B1', desc: 'UPWARDS ARROW WITH TIP RIGHTWARDS' },
396
+ { 'char': '&#x21B2', desc: 'DOWNWARDS ARROW WITH TIP LEFTWARDS' },
397
+ { 'char': '&#x21B3', desc: 'DOWNWARDS ARROW WITH TIP RIGHTWARDS' },
398
+ { 'char': '&#x21B4', desc: 'RIGHTWARDS ARROW WITH CORNER DOWNWARDS' },
399
+ { 'char': '&#x21B5', desc: 'DOWNWARDS ARROW WITH CORNER LEFTWARDS' },
400
+ { 'char': '&#x21B6', desc: 'ANTICLOCKWISE TOP SEMICIRCLE ARROW' },
401
+ { 'char': '&#x21B7', desc: 'CLOCKWISE TOP SEMICIRCLE ARROW' },
402
+ { 'char': '&#x21B8', desc: 'NORTH WEST ARROW TO LONG BAR' },
403
+ { 'char': '&#x21B9', desc: 'LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR' },
404
+ { 'char': '&#x21BA', desc: 'ANTICLOCKWISE OPEN CIRCLE ARROW' },
405
+ { 'char': '&#x21BB', desc: 'CLOCKWISE OPEN CIRCLE ARROW' },
406
+ { 'char': '&#x21BC', desc: 'LEFTWARDS HARPOON WITH BARB UPWARDS' },
407
+ { 'char': '&#x21BD', desc: 'LEFTWARDS HARPOON WITH BARB DOWNWARDS' },
408
+ { 'char': '&#x21BE', desc: 'UPWARDS HARPOON WITH BARB RIGHTWARDS' },
409
+ { 'char': '&#x21BF', desc: 'UPWARDS HARPOON WITH BARB LEFTWARDS' },
410
+ { 'char': '&#x21C0', desc: 'RIGHTWARDS HARPOON WITH BARB UPWARDS' },
411
+ { 'char': '&#x21C1', desc: 'RIGHTWARDS HARPOON WITH BARB DOWNWARDS' },
412
+ { 'char': '&#x21C2', desc: 'DOWNWARDS HARPOON WITH BARB RIGHTWARDS' },
413
+ { 'char': '&#x21C3', desc: 'DOWNWARDS HARPOON WITH BARB LEFTWARDS' },
414
+ { 'char': '&#x21C4', desc: 'RIGHTWARDS ARROW OVER LEFTWARDS ARROW' },
415
+ { 'char': '&#x21C5', desc: 'UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW' },
416
+ { 'char': '&#x21C6', desc: 'LEFTWARDS ARROW OVER RIGHTWARDS ARROW' },
417
+ { 'char': '&#x21C7', desc: 'LEFTWARDS PAIRED ARROWS' },
418
+ { 'char': '&#x21C8', desc: 'UPWARDS PAIRED ARROWS' },
419
+ { 'char': '&#x21C9', desc: 'RIGHTWARDS PAIRED ARROWS' },
420
+ { 'char': '&#x21CA', desc: 'DOWNWARDS PAIRED ARROWS' },
421
+ { 'char': '&#x21CB', desc: 'LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON' },
422
+ { 'char': '&#x21CC', desc: 'RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON' },
423
+ { 'char': '&#x21CD', desc: 'LEFTWARDS DOUBLE ARROW WITH STROKE' },
424
+ { 'char': '&#x21CE', desc: 'LEFT RIGHT DOUBLE ARROW WITH STROKE' },
425
+ { 'char': '&#x21CF', desc: 'RIGHTWARDS DOUBLE ARROW WITH STROKE' },
426
+ { 'char': '&#x21D0', desc: 'LEFTWARDS DOUBLE ARROW' },
427
+ { 'char': '&#x21D1', desc: 'UPWARDS DOUBLE ARROW' },
428
+ { 'char': '&#x21D2', desc: 'RIGHTWARDS DOUBLE ARROW' },
429
+ { 'char': '&#x21D3', desc: 'DOWNWARDS DOUBLE ARROW' },
430
+ { 'char': '&#x21D4', desc: 'LEFT RIGHT DOUBLE ARROW' },
431
+ { 'char': '&#x21D5', desc: 'UP DOWN DOUBLE ARROW' },
432
+ { 'char': '&#x21D6', desc: 'NORTH WEST DOUBLE ARROW' },
433
+ { 'char': '&#x21D7', desc: 'NORTH EAST DOUBLE ARROW' },
434
+ { 'char': '&#x21D8', desc: 'SOUTH EAST DOUBLE ARROW' },
435
+ { 'char': '&#x21D9', desc: 'SOUTH WEST DOUBLE ARROW' },
436
+ { 'char': '&#x21DA', desc: 'LEFTWARDS TRIPLE ARROW' },
437
+ { 'char': '&#x21DB', desc: 'RIGHTWARDS TRIPLE ARROW' },
438
+ { 'char': '&#x21DC', desc: 'LEFTWARDS SQUIGGLE ARROW' },
439
+ { 'char': '&#x21DD', desc: 'RIGHTWARDS SQUIGGLE ARROW' },
440
+ { 'char': '&#x21DE', desc: 'UPWARDS ARROW WITH DOUBLE STROKE' },
441
+ { 'char': '&#x21DF', desc: 'DOWNWARDS ARROW WITH DOUBLE STROKE' },
442
+ { 'char': '&#x21E0', desc: 'LEFTWARDS DASHED ARROW' },
443
+ { 'char': '&#x21E1', desc: 'UPWARDS DASHED ARROW' },
444
+ { 'char': '&#x21E2', desc: 'RIGHTWARDS DASHED ARROW' },
445
+ { 'char': '&#x21E3', desc: 'DOWNWARDS DASHED ARROW' },
446
+ { 'char': '&#x21E4', desc: 'LEFTWARDS ARROW TO BAR' },
447
+ { 'char': '&#x21E5', desc: 'RIGHTWARDS ARROW TO BAR' },
448
+ { 'char': '&#x21E6', desc: 'LEFTWARDS WHITE ARROW' },
449
+ { 'char': '&#x21E7', desc: 'UPWARDS WHITE ARROW' },
450
+ { 'char': '&#x21E8', desc: 'RIGHTWARDS WHITE ARROW' },
451
+ { 'char': '&#x21E9', desc: 'DOWNWARDS WHITE ARROW' },
452
+ { 'char': '&#x21EA', desc: 'UPWARDS WHITE ARROW FROM BAR' },
453
+ { 'char': '&#x21EB', desc: 'UPWARDS WHITE ARROW ON PEDESTAL' },
454
+ { 'char': '&#x21EC', desc: 'UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR' },
455
+ { 'char': '&#x21ED', desc: 'UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR' },
456
+ { 'char': '&#x21EE', desc: 'UPWARDS WHITE DOUBLE ARROW' },
457
+ { 'char': '&#x21EF', desc: 'UPWARDS WHITE DOUBLE ARROW ON PEDESTAL' },
458
+ { 'char': '&#x21F0', desc: 'RIGHTWARDS WHITE ARROW FROM WALL' },
459
+ { 'char': '&#x21F1', desc: 'NORTH WEST ARROW TO CORNER' },
460
+ { 'char': '&#x21F2', desc: 'SOUTH EAST ARROW TO CORNER' },
461
+ { 'char': '&#x21F3', desc: 'UP DOWN WHITE ARROW' },
462
+ { 'char': '&#x21F4', desc: 'RIGHT ARROW WITH SMALL CIRCLE' },
463
+ { 'char': '&#x21F5', desc: 'DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW' },
464
+ { 'char': '&#x21F6', desc: 'THREE RIGHTWARDS ARROWS' },
465
+ { 'char': '&#x21F7', desc: 'LEFTWARDS ARROW WITH VERTICAL STROKE' },
466
+ { 'char': '&#x21F8', desc: 'RIGHTWARDS ARROW WITH VERTICAL STROKE' },
467
+ { 'char': '&#x21F9', desc: 'LEFT RIGHT ARROW WITH VERTICAL STROKE' },
468
+ { 'char': '&#x21FA', desc: 'LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE' },
469
+ { 'char': '&#x21FB', desc: 'RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE' },
470
+ { 'char': '&#x21FC', desc: 'LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE' },
471
+ { 'char': '&#x21FD', desc: 'LEFTWARDS OPEN-HEADED ARROW' },
472
+ { 'char': '&#x21FE', desc: 'RIGHTWARDS OPEN-HEADED ARROW' },
473
+ { 'char': '&#x21FF', desc: 'LEFT RIGHT OPEN-HEADED ARROW' }
474
+ ]
475
+ },
476
+ {
477
+ title: 'Math',
478
+ list: [
479
+ { 'char': '&forall;', desc: 'FOR ALL' },
480
+ { 'char': '&part;', desc: 'PARTIAL DIFFERENTIAL' },
481
+ { 'char': '&exist;', desc: 'THERE EXISTS' },
482
+ { 'char': '&empty;', desc: 'EMPTY SET' },
483
+ { 'char': '&nabla;', desc: 'NABLA' },
484
+ { 'char': '&isin;', desc: 'ELEMENT OF' },
485
+ { 'char': '&notin;', desc: 'NOT AN ELEMENT OF' },
486
+ { 'char': '&ni;', desc: 'CONTAINS AS MEMBER' },
487
+ { 'char': '&prod;', desc: 'N-ARY PRODUCT' },
488
+ { 'char': '&sum;', desc: 'N-ARY SUMMATION' },
489
+ { 'char': '&minus;', desc: 'MINUS SIGN' },
490
+ { 'char': '&lowast;', desc: 'ASTERISK OPERATOR' },
491
+ { 'char': '&radic;', desc: 'SQUARE ROOT' },
492
+ { 'char': '&prop;', desc: 'PROPORTIONAL TO' },
493
+ { 'char': '&infin;', desc: 'INFINITY' },
494
+ { 'char': '&ang;', desc: 'ANGLE' },
495
+ { 'char': '&and;', desc: 'LOGICAL AND' },
496
+ { 'char': '&or;', desc: 'LOGICAL OR' },
497
+ { 'char': '&cap;', desc: 'INTERSECTION' },
498
+ { 'char': '&cup;', desc: 'UNION' },
499
+ { 'char': '&int;', desc: 'INTEGRAL' },
500
+ { 'char': '&there4;', desc: 'THEREFORE' },
501
+ { 'char': '&sim;', desc: 'TILDE OPERATOR' },
502
+ { 'char': '&cong;', desc: 'APPROXIMATELY EQUAL TO' },
503
+ { 'char': '&asymp;', desc: 'ALMOST EQUAL TO' },
504
+ { 'char': '&ne;', desc: 'NOT EQUAL TO' },
505
+ { 'char': '&equiv;', desc: 'IDENTICAL TO' },
506
+ { 'char': '&le;', desc: 'LESS-THAN OR EQUAL TO' },
507
+ { 'char': '&ge;', desc: 'GREATER-THAN OR EQUAL TO' },
508
+ { 'char': '&sub;', desc: 'SUBSET OF' },
509
+ { 'char': '&sup;', desc: 'SUPERSET OF' },
510
+ { 'char': '&nsub;', desc: 'NOT A SUBSET OF' },
511
+ { 'char': '&sube;', desc: 'SUBSET OF OR EQUAL TO' },
512
+ { 'char': '&supe;', desc: 'SUPERSET OF OR EQUAL TO' },
513
+ { 'char': '&oplus;', desc: 'CIRCLED PLUS' },
514
+ { 'char': '&otimes;', desc: 'CIRCLED TIMES' },
515
+ { 'char': '&perp;', desc: 'UP TACK' }
516
+ ]
517
+ },
518
+ {
519
+ title: 'Misc',
520
+ list: [
521
+ { 'char': '&spades;', desc: 'BLACK SPADE SUIT' },
522
+ { 'char': '&clubs;', desc: 'BLACK CLUB SUIT' },
523
+ { 'char': '&hearts;', desc: 'BLACK HEART SUIT' },
524
+ { 'char': '&diams;', desc: 'BLACK DIAMOND SUIT' },
525
+ { 'char': '&#x2669', desc: 'QUARTER NOTE' },
526
+ { 'char': '&#x266A', desc: 'EIGHTH NOTE' },
527
+ { 'char': '&#x266B', desc: 'BEAMED EIGHTH NOTES' },
528
+ { 'char': '&#x266C', desc: 'BEAMED SIXTEENTH NOTES' },
529
+ { 'char': '&#x266D', desc: 'MUSIC FLAT SIGN' },
530
+ { 'char': '&#x266E', desc: 'MUSIC NATURAL SIGN' },
531
+ { 'char': '&#x2600', desc: 'BLACK SUN WITH RAYS' },
532
+ { 'char': '&#x2601', desc: 'CLOUD' },
533
+ { 'char': '&#x2602', desc: 'UMBRELLA' },
534
+ { 'char': '&#x2603', desc: 'SNOWMAN' },
535
+ { 'char': '&#x2615', desc: 'HOT BEVERAGE' },
536
+ { 'char': '&#x2618', desc: 'SHAMROCK' },
537
+ { 'char': '&#x262F', desc: 'YIN YANG' },
538
+ { 'char': '&#x2714', desc: 'HEAVY CHECK MARK' },
539
+ { 'char': '&#x2716', desc: 'HEAVY MULTIPLICATION X' },
540
+ { 'char': '&#x2744', desc: 'SNOWFLAKE' },
541
+ { 'char': '&#x275B', desc: 'HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT' },
542
+ { 'char': '&#x275C', desc: 'HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT' },
543
+ { 'char': '&#x275D', desc: 'HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT' },
544
+ { 'char': '&#x275E', desc: 'HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT' },
545
+ { 'char': '&#x2764', desc: 'HEAVY BLACK HEART' }
546
+ ]
547
+ }
548
+ ]
549
+ });
550
+
551
+ $.FE.PLUGINS.specialCharacters = function (editor) {
552
+ var $modal;
553
+ var modal_id = 'special_characters';
554
+
555
+ var $head;
556
+ var $body;
557
+
558
+ /*
559
+ * Init Special Characters.
560
+ */
561
+ function _init () {
562
+
563
+ }
564
+
565
+ /*
566
+ * Build html body.
567
+ */
568
+ function _buildBody () {
569
+
570
+ // Begin body.
571
+ var body = '<div class="fr-special-characters-modal">';
572
+
573
+ for (var k = 0; k < editor.opts.specialCharactersSets.length; k++) {
574
+ var set = editor.opts.specialCharactersSets[k];
575
+ var list = set.list;
576
+
577
+ // Add title.
578
+ var html_list = '<div class="fr-special-characters-list"><p class="fr-special-characters-title">' + editor.language.translate(set.title) + '</p>';
579
+
580
+ for (var i = 0; i < list.length; i++) {
581
+ var item = list[i];
582
+ html_list += '<span class="fr-command fr-special-character" tabIndex="-1" role="button" value="' + item['char'] + '" title="' + item.desc + '">' + item['char'] + '<span class="fr-sr-only">' + editor.language.translate(item.desc) + '&nbsp;&nbsp;&nbsp;</span></span>';
583
+
584
+ }
585
+
586
+ // Add list to body.
587
+ body += html_list + '</div>';
588
+ }
589
+
590
+ // End body.
591
+ body += '</div>';
592
+
593
+ return body;
594
+ }
595
+
596
+ /*
597
+ * Focus a special character.
598
+ */
599
+ function _focusChar ($char, e) {
600
+
601
+ editor.events.disableBlur();
602
+ $char.focus();
603
+
604
+ e.preventDefault();
605
+ e.stopPropagation();
606
+ }
607
+
608
+ function _addAccessibility () {
609
+
610
+ // Keydown handler.
611
+ editor.events.$on($body, 'keydown', function (e) {
612
+ var keycode = e.which;
613
+ var $focused_char = $body.find('span.fr-special-character:focus:first');
614
+
615
+ // Alt + F10.
616
+ if (!$focused_char.length && keycode == $.FE.KEYCODE.F10 && !editor.keys.ctrlKey(e) && !e.shiftKey && e.altKey) {
617
+
618
+ // Focus first character.
619
+ var $char = $body.find('span.fr-special-character:first');
620
+ _focusChar($char, e);
621
+
622
+ return false;
623
+ }
624
+
625
+ // Tab and arrows.
626
+ else if (keycode == $.FE.KEYCODE.TAB || keycode == $.FE.KEYCODE.ARROW_LEFT || keycode == $.FE.KEYCODE.ARROW_RIGHT) {
627
+
628
+ // The next char that will get focused.
629
+ var $next_char = null;
630
+
631
+ // Forward of backward.
632
+ var forward = null;
633
+
634
+ // Arrow or Tab.
635
+ var isArrow = false;
636
+
637
+ if (keycode == $.FE.KEYCODE.ARROW_LEFT || keycode == $.FE.KEYCODE.ARROW_RIGHT) {
638
+ forward = keycode == $.FE.KEYCODE.ARROW_RIGHT;
639
+ isArrow = true;
640
+ }
641
+ else {
642
+ forward = !e.shiftKey;
643
+ }
644
+
645
+ if ($focused_char.length) {
646
+
647
+ // Next or previous char from a category. Only if arrow are used.
648
+ if (isArrow) {
649
+ if (forward) {
650
+ $next_char = $focused_char.nextAll('span.fr-special-character:first');
651
+ }
652
+ else {
653
+ $next_char = $focused_char.prevAll('span.fr-special-character:first');
654
+ }
655
+ }
656
+
657
+ // First or last char reached within a category. Or Tab is used.
658
+ if (!$next_char || !$next_char.length) {
659
+
660
+ // First or last char from next or previous category.
661
+ if (forward) {
662
+ $next_char = $focused_char.parent().next().find('span.fr-special-character:first');
663
+ }
664
+ else {
665
+ $next_char = $focused_char.parent().prev().find('span.fr-special-character:' + (isArrow ? 'last' : 'first'));
666
+ }
667
+
668
+ // First or last category reached.
669
+ if (!$next_char.length) {
670
+
671
+ // First category and first char or last category and last char.
672
+ $next_char = $body.find('span.fr-special-character:' + (forward ? 'first' : 'last'));
673
+ }
674
+ }
675
+ }
676
+
677
+ // First category and first char or last category and last char.
678
+ else {
679
+ $next_char = $body.find('span.fr-special-character:' + (forward ? 'first' : 'last'));
680
+ }
681
+ _focusChar($next_char, e);
682
+
683
+ return false;
684
+ }
685
+
686
+ // Enter on a focused item.
687
+ else if (keycode == $.FE.KEYCODE.ENTER && $focused_char.length) {
688
+ var instance = $modal.data('instance') || editor;
689
+
690
+ instance.specialCharacters.insert($focused_char);
691
+ }
692
+ else {
693
+
694
+ return true;
695
+ }
696
+ }, true);
697
+ }
698
+
699
+ /*
700
+ * Show Special Characters.
701
+ */
702
+ function show () {
703
+ if (!$modal) {
704
+ var head = '<h4>' + editor.language.translate('Special Characters') + '</h4>';
705
+ var body = _buildBody();
706
+ var modalHash = editor.modals.create(modal_id, head, body);
707
+ $modal = modalHash.$modal;
708
+ $head = modalHash.$head;
709
+ $body = modalHash.$body;
710
+
711
+ // Resize Special Characters modal on window resize.
712
+ editor.events.$on($(editor.o_win), 'resize', function () {
713
+ var instance = $modal.data('instance') || editor;
714
+
715
+ instance.modals.resize(modal_id);
716
+ });
717
+
718
+ // Insert image.
719
+ editor.events.bindClick($body, '.fr-special-character', function (e) {
720
+ var instance = $modal.data('instance') || editor;
721
+ var $target = $(e.currentTarget);
722
+
723
+ instance.specialCharacters.insert($target);
724
+ });
725
+
726
+ _addAccessibility();
727
+ }
728
+
729
+
730
+ // Show modal.
731
+ editor.modals.show(modal_id);
732
+
733
+ // Modal may not fit window size.
734
+ editor.modals.resize(modal_id);
735
+ }
736
+
737
+ /*
738
+ * Hide Special Characters.
739
+ */
740
+ function hide () {
741
+ editor.modals.hide(modal_id);
742
+ }
743
+
744
+ /*
745
+ * Insert special character.
746
+ */
747
+ function insert($target) {
748
+
749
+ // Hide modal.
750
+ editor.specialCharacters.hide();
751
+
752
+ // Insert character.
753
+ editor.undo.saveStep();
754
+ editor.html.insert($target.attr('value'), true);
755
+ editor.undo.saveStep();
756
+ }
757
+
758
+ return {
759
+ _init: _init,
760
+ show: show,
761
+ hide: hide,
762
+ insert: insert
763
+ };
764
+ };
765
+
766
+ $.FroalaEditor.DefineIcon('specialCharacters', { template: 'text', NAME: '&#937;' })
767
+
768
+ $.FE.RegisterCommand('specialCharacters', {
769
+ title: 'Special Characters',
770
+ icon: 'specialCharacters',
771
+ undo: false,
772
+ focus: false,
773
+ modal: true,
774
+ callback: function () {
775
+ this.specialCharacters.show();
776
+ },
777
+ plugin: 'specialCharacters',
778
+ showOnMobile: false
779
+ });
780
+
781
+ }));