ckeditor-rails 0.0.4 → 0.0.5

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 (708) hide show
  1. data/README.md +17 -14
  2. data/lib/ckeditor-rails/version.rb +1 -1
  3. data/vendor/assets/ckeditor/ckeditor/.htaccess +1 -1
  4. data/vendor/assets/ckeditor/ckeditor/CHANGES.html +139 -3
  5. data/vendor/assets/ckeditor/ckeditor/INSTALL.html +92 -92
  6. data/vendor/assets/ckeditor/ckeditor/LICENSE.html +2 -2
  7. data/vendor/assets/ckeditor/ckeditor/_samples/adobeair/application.xml +32 -32
  8. data/vendor/assets/ckeditor/ckeditor/_samples/adobeair/run.bat +9 -9
  9. data/vendor/assets/ckeditor/ckeditor/_samples/adobeair/run.sh +1 -1
  10. data/vendor/assets/ckeditor/ckeditor/_samples/adobeair/sample.html +45 -45
  11. data/vendor/assets/ckeditor/ckeditor/_samples/ajax.html +98 -98
  12. data/vendor/assets/ckeditor/ckeditor/_samples/api.html +192 -192
  13. data/vendor/assets/ckeditor/ckeditor/_samples/api_dialog.html +198 -198
  14. data/vendor/assets/ckeditor/ckeditor/_samples/api_dialog/my_dialog.js +28 -28
  15. data/vendor/assets/ckeditor/ckeditor/_samples/asp/advanced.asp +105 -105
  16. data/vendor/assets/ckeditor/ckeditor/_samples/asp/events.asp +136 -136
  17. data/vendor/assets/ckeditor/ckeditor/_samples/asp/index.html +103 -103
  18. data/vendor/assets/ckeditor/ckeditor/_samples/asp/replace.asp +72 -72
  19. data/vendor/assets/ckeditor/ckeditor/_samples/asp/replaceall.asp +77 -77
  20. data/vendor/assets/ckeditor/ckeditor/_samples/asp/sample_posteddata.asp +46 -46
  21. data/vendor/assets/ckeditor/ckeditor/_samples/asp/standalone.asp +72 -72
  22. data/vendor/assets/ckeditor/ckeditor/_samples/assets/_posteddata.php +59 -59
  23. data/vendor/assets/ckeditor/ckeditor/_samples/assets/output_xhtml.css +204 -204
  24. data/vendor/assets/ckeditor/ckeditor/_samples/assets/parsesample.css +70 -70
  25. data/vendor/assets/ckeditor/ckeditor/_samples/assets/swfobject.js +18 -18
  26. data/vendor/assets/ckeditor/ckeditor/_samples/autogrow.html +108 -107
  27. data/vendor/assets/ckeditor/ckeditor/_samples/bbcode.html +125 -125
  28. data/vendor/assets/ckeditor/ckeditor/_samples/devtools.html +94 -94
  29. data/vendor/assets/ckeditor/ckeditor/_samples/divreplace.html +154 -154
  30. data/vendor/assets/ckeditor/ckeditor/_samples/enterkey.html +115 -115
  31. data/vendor/assets/ckeditor/ckeditor/_samples/fullpage.html +82 -82
  32. data/vendor/assets/ckeditor/ckeditor/_samples/index.html +116 -116
  33. data/vendor/assets/ckeditor/ckeditor/_samples/jqueryadapter.html +99 -99
  34. data/vendor/assets/ckeditor/ckeditor/_samples/output_for_flash.html +275 -275
  35. data/vendor/assets/ckeditor/ckeditor/_samples/output_html.html +285 -285
  36. data/vendor/assets/ckeditor/ckeditor/_samples/output_xhtml.html +181 -177
  37. data/vendor/assets/ckeditor/ckeditor/_samples/php/advanced.php +120 -120
  38. data/vendor/assets/ckeditor/ckeditor/_samples/php/events.php +153 -153
  39. data/vendor/assets/ckeditor/ckeditor/_samples/php/index.html +47 -47
  40. data/vendor/assets/ckeditor/ckeditor/_samples/php/replace.php +87 -87
  41. data/vendor/assets/ckeditor/ckeditor/_samples/php/replaceall.php +88 -88
  42. data/vendor/assets/ckeditor/ckeditor/_samples/php/standalone.php +83 -83
  43. data/vendor/assets/ckeditor/ckeditor/_samples/placeholder.html +81 -81
  44. data/vendor/assets/ckeditor/ckeditor/_samples/readonly.html +91 -91
  45. data/vendor/assets/ckeditor/ckeditor/_samples/replacebyclass.html +64 -64
  46. data/vendor/assets/ckeditor/ckeditor/_samples/replacebycode.html +97 -97
  47. data/vendor/assets/ckeditor/ckeditor/_samples/sample.css +163 -163
  48. data/vendor/assets/ckeditor/ckeditor/_samples/sample.js +65 -65
  49. data/vendor/assets/ckeditor/ckeditor/_samples/sample_posteddata.php +21 -21
  50. data/vendor/assets/ckeditor/ckeditor/_samples/sharedspaces.html +153 -153
  51. data/vendor/assets/ckeditor/ckeditor/_samples/skins.html +110 -110
  52. data/vendor/assets/ckeditor/ckeditor/_samples/stylesheetparser.html +93 -93
  53. data/vendor/assets/ckeditor/ckeditor/_samples/tableresize.html +115 -115
  54. data/vendor/assets/ckeditor/ckeditor/_samples/ui_color.html +129 -129
  55. data/vendor/assets/ckeditor/ckeditor/_samples/ui_languages.html +134 -134
  56. data/vendor/assets/ckeditor/ckeditor/_source/adapters/jquery.js +306 -306
  57. data/vendor/assets/ckeditor/ckeditor/_source/core/_bootstrap.js +87 -87
  58. data/vendor/assets/ckeditor/ckeditor/_source/core/ckeditor.js +141 -141
  59. data/vendor/assets/ckeditor/ckeditor/_source/core/ckeditor_base.js +235 -227
  60. data/vendor/assets/ckeditor/ckeditor/_source/core/ckeditor_basic.js +238 -238
  61. data/vendor/assets/ckeditor/ckeditor/_source/core/command.js +225 -209
  62. data/vendor/assets/ckeditor/ckeditor/_source/core/commanddefinition.js +129 -129
  63. data/vendor/assets/ckeditor/ckeditor/_source/core/config.js +447 -431
  64. data/vendor/assets/ckeditor/ckeditor/_source/core/dataprocessor.js +65 -65
  65. data/vendor/assets/ckeditor/ckeditor/_source/core/dom.js +20 -20
  66. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/comment.js +44 -32
  67. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/document.js +251 -251
  68. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/documentfragment.js +49 -49
  69. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/domobject.js +258 -258
  70. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/element.js +1796 -1681
  71. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/elementpath.js +117 -119
  72. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/event.js +145 -145
  73. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/node.js +691 -695
  74. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/nodelist.js +26 -26
  75. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/range.js +2068 -2032
  76. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/rangelist.js +213 -213
  77. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/text.js +128 -128
  78. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/walker.js +496 -462
  79. data/vendor/assets/ckeditor/ckeditor/_source/core/dom/window.js +96 -96
  80. data/vendor/assets/ckeditor/ckeditor/_source/core/dtd.js +266 -266
  81. data/vendor/assets/ckeditor/ckeditor/_source/core/editor.js +1059 -1059
  82. data/vendor/assets/ckeditor/ckeditor/_source/core/editor_basic.js +186 -186
  83. data/vendor/assets/ckeditor/ckeditor/_source/core/env.js +305 -291
  84. data/vendor/assets/ckeditor/ckeditor/_source/core/event.js +342 -342
  85. data/vendor/assets/ckeditor/ckeditor/_source/core/eventInfo.js +120 -120
  86. data/vendor/assets/ckeditor/ckeditor/_source/core/focusmanager.js +152 -152
  87. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser.js +224 -224
  88. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser/basicwriter.js +145 -145
  89. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser/cdata.js +43 -43
  90. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser/comment.js +60 -60
  91. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser/element.js +308 -308
  92. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser/filter.js +288 -288
  93. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser/fragment.js +537 -497
  94. data/vendor/assets/ckeditor/ckeditor/_source/core/htmlparser/text.js +53 -55
  95. data/vendor/assets/ckeditor/ckeditor/_source/core/lang.js +157 -157
  96. data/vendor/assets/ckeditor/ckeditor/_source/core/loader.js +240 -240
  97. data/vendor/assets/ckeditor/ckeditor/_source/core/plugindefinition.js +83 -83
  98. data/vendor/assets/ckeditor/ckeditor/_source/core/plugins.js +103 -103
  99. data/vendor/assets/ckeditor/ckeditor/_source/core/resourcemanager.js +238 -238
  100. data/vendor/assets/ckeditor/ckeditor/_source/core/scriptloader.js +180 -180
  101. data/vendor/assets/ckeditor/ckeditor/_source/core/skins.js +184 -184
  102. data/vendor/assets/ckeditor/ckeditor/_source/core/themes.js +19 -19
  103. data/vendor/assets/ckeditor/ckeditor/_source/core/tools.js +763 -763
  104. data/vendor/assets/ckeditor/ckeditor/_source/core/ui.js +128 -128
  105. data/vendor/assets/ckeditor/ckeditor/_source/lang/_languages.js +84 -84
  106. data/vendor/assets/ckeditor/ckeditor/_source/lang/_translationstatus.txt +63 -61
  107. data/vendor/assets/ckeditor/ckeditor/_source/lang/af.js +815 -812
  108. data/vendor/assets/ckeditor/ckeditor/_source/lang/ar.js +815 -812
  109. data/vendor/assets/ckeditor/ckeditor/_source/lang/bg.js +815 -812
  110. data/vendor/assets/ckeditor/ckeditor/_source/lang/bn.js +815 -812
  111. data/vendor/assets/ckeditor/ckeditor/_source/lang/bs.js +815 -812
  112. data/vendor/assets/ckeditor/ckeditor/_source/lang/ca.js +815 -812
  113. data/vendor/assets/ckeditor/ckeditor/_source/lang/cs.js +815 -812
  114. data/vendor/assets/ckeditor/ckeditor/_source/lang/cy.js +815 -812
  115. data/vendor/assets/ckeditor/ckeditor/_source/lang/da.js +815 -812
  116. data/vendor/assets/ckeditor/ckeditor/_source/lang/de.js +815 -812
  117. data/vendor/assets/ckeditor/ckeditor/_source/lang/el.js +815 -812
  118. data/vendor/assets/ckeditor/ckeditor/_source/lang/en-au.js +815 -812
  119. data/vendor/assets/ckeditor/ckeditor/_source/lang/en-ca.js +815 -812
  120. data/vendor/assets/ckeditor/ckeditor/_source/lang/en-gb.js +815 -812
  121. data/vendor/assets/ckeditor/ckeditor/_source/lang/en.js +815 -812
  122. data/vendor/assets/ckeditor/ckeditor/_source/lang/eo.js +815 -812
  123. data/vendor/assets/ckeditor/ckeditor/_source/lang/es.js +815 -812
  124. data/vendor/assets/ckeditor/ckeditor/_source/lang/et.js +815 -812
  125. data/vendor/assets/ckeditor/ckeditor/_source/lang/eu.js +815 -812
  126. data/vendor/assets/ckeditor/ckeditor/_source/lang/fa.js +815 -812
  127. data/vendor/assets/ckeditor/ckeditor/_source/lang/fi.js +815 -812
  128. data/vendor/assets/ckeditor/ckeditor/_source/lang/fo.js +815 -812
  129. data/vendor/assets/ckeditor/ckeditor/_source/lang/fr-ca.js +815 -812
  130. data/vendor/assets/ckeditor/ckeditor/_source/lang/fr.js +815 -812
  131. data/vendor/assets/ckeditor/ckeditor/_source/lang/gl.js +815 -812
  132. data/vendor/assets/ckeditor/ckeditor/_source/lang/gu.js +815 -812
  133. data/vendor/assets/ckeditor/ckeditor/_source/lang/he.js +815 -812
  134. data/vendor/assets/ckeditor/ckeditor/_source/lang/hi.js +815 -812
  135. data/vendor/assets/ckeditor/ckeditor/_source/lang/hr.js +815 -812
  136. data/vendor/assets/ckeditor/ckeditor/_source/lang/hu.js +815 -812
  137. data/vendor/assets/ckeditor/ckeditor/_source/lang/is.js +815 -812
  138. data/vendor/assets/ckeditor/ckeditor/_source/lang/it.js +815 -812
  139. data/vendor/assets/ckeditor/ckeditor/_source/lang/ja.js +815 -812
  140. data/vendor/assets/ckeditor/ckeditor/_source/lang/ka.js +815 -812
  141. data/vendor/assets/ckeditor/ckeditor/_source/lang/km.js +815 -812
  142. data/vendor/assets/ckeditor/ckeditor/_source/lang/ko.js +815 -812
  143. data/vendor/assets/ckeditor/ckeditor/_source/lang/lt.js +815 -812
  144. data/vendor/assets/ckeditor/ckeditor/_source/lang/lv.js +815 -812
  145. data/vendor/assets/ckeditor/ckeditor/_source/lang/mk.js +814 -0
  146. data/vendor/assets/ckeditor/ckeditor/_source/lang/mn.js +815 -812
  147. data/vendor/assets/ckeditor/ckeditor/_source/lang/ms.js +815 -812
  148. data/vendor/assets/ckeditor/ckeditor/_source/lang/nb.js +815 -812
  149. data/vendor/assets/ckeditor/ckeditor/_source/lang/nl.js +815 -812
  150. data/vendor/assets/ckeditor/ckeditor/_source/lang/no.js +815 -812
  151. data/vendor/assets/ckeditor/ckeditor/_source/lang/pl.js +815 -812
  152. data/vendor/assets/ckeditor/ckeditor/_source/lang/pt-br.js +814 -811
  153. data/vendor/assets/ckeditor/ckeditor/_source/lang/pt.js +815 -812
  154. data/vendor/assets/ckeditor/ckeditor/_source/lang/ro.js +815 -812
  155. data/vendor/assets/ckeditor/ckeditor/_source/lang/ru.js +815 -812
  156. data/vendor/assets/ckeditor/ckeditor/_source/lang/sk.js +815 -812
  157. data/vendor/assets/ckeditor/ckeditor/_source/lang/sl.js +815 -812
  158. data/vendor/assets/ckeditor/ckeditor/_source/lang/sr-latn.js +815 -812
  159. data/vendor/assets/ckeditor/ckeditor/_source/lang/sr.js +815 -812
  160. data/vendor/assets/ckeditor/ckeditor/_source/lang/sv.js +814 -811
  161. data/vendor/assets/ckeditor/ckeditor/_source/lang/th.js +815 -812
  162. data/vendor/assets/ckeditor/ckeditor/_source/lang/tr.js +814 -811
  163. data/vendor/assets/ckeditor/ckeditor/_source/lang/ug.js +814 -0
  164. data/vendor/assets/ckeditor/ckeditor/_source/lang/uk.js +815 -812
  165. data/vendor/assets/ckeditor/ckeditor/_source/lang/vi.js +815 -812
  166. data/vendor/assets/ckeditor/ckeditor/_source/lang/zh-cn.js +815 -812
  167. data/vendor/assets/ckeditor/ckeditor/_source/lang/zh.js +815 -812
  168. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/dialogs/a11yhelp.js +222 -222
  169. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/_translationstatus.txt +23 -0
  170. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/cs.js +89 -0
  171. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/cy.js +89 -0
  172. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/da.js +89 -0
  173. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/de.js +89 -0
  174. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/el.js +89 -0
  175. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/en.js +108 -108
  176. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/eo.js +89 -0
  177. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/fa.js +89 -0
  178. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/fi.js +89 -0
  179. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/fr.js +89 -0
  180. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/gu.js +89 -0
  181. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/he.js +89 -216
  182. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/it.js +89 -0
  183. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/mk.js +89 -0
  184. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/nb.js +89 -0
  185. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/nl.js +89 -0
  186. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/no.js +89 -0
  187. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/tr.js +89 -0
  188. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/ug.js +89 -0
  189. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/vi.js +89 -0
  190. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/lang/zh-cn.js +89 -0
  191. data/vendor/assets/ckeditor/ckeditor/_source/plugins/a11yhelp/plugin.js +47 -47
  192. data/vendor/assets/ckeditor/ckeditor/_source/plugins/about/dialogs/about.js +76 -76
  193. data/vendor/assets/ckeditor/ckeditor/_source/plugins/about/plugin.js +24 -24
  194. data/vendor/assets/ckeditor/ckeditor/_source/plugins/adobeair/plugin.js +228 -228
  195. data/vendor/assets/ckeditor/ckeditor/_source/plugins/ajax/plugin.js +152 -152
  196. data/vendor/assets/ckeditor/ckeditor/_source/plugins/autogrow/plugin.js +141 -88
  197. data/vendor/assets/ckeditor/ckeditor/_source/plugins/basicstyles/plugin.js +129 -101
  198. data/vendor/assets/ckeditor/ckeditor/_source/plugins/bbcode/plugin.js +931 -931
  199. data/vendor/assets/ckeditor/ckeditor/_source/plugins/bidi/plugin.js +334 -334
  200. data/vendor/assets/ckeditor/ckeditor/_source/plugins/blockquote/plugin.js +305 -305
  201. data/vendor/assets/ckeditor/ckeditor/_source/plugins/button/plugin.js +290 -290
  202. data/vendor/assets/ckeditor/ckeditor/_source/plugins/clipboard/dialogs/paste.js +223 -223
  203. data/vendor/assets/ckeditor/ckeditor/_source/plugins/clipboard/plugin.js +479 -453
  204. data/vendor/assets/ckeditor/ckeditor/_source/plugins/colorbutton/plugin.js +300 -294
  205. data/vendor/assets/ckeditor/ckeditor/_source/plugins/colordialog/dialogs/colordialog.js +387 -340
  206. data/vendor/assets/ckeditor/ckeditor/_source/plugins/colordialog/plugin.js +15 -15
  207. data/vendor/assets/ckeditor/ckeditor/_source/plugins/contextmenu/plugin.js +179 -177
  208. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/_translationstatus.txt +27 -0
  209. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/bg.js +16 -0
  210. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/cs.js +16 -0
  211. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/cy.js +16 -0
  212. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/da.js +16 -0
  213. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/de.js +16 -0
  214. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/el.js +16 -0
  215. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/en.js +16 -16
  216. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/eo.js +16 -0
  217. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/et.js +16 -0
  218. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/fa.js +16 -0
  219. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/fi.js +16 -0
  220. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/fr.js +16 -0
  221. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/gu.js +16 -0
  222. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/he.js +16 -0
  223. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/hr.js +16 -0
  224. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/it.js +16 -0
  225. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/nb.js +16 -0
  226. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/nl.js +16 -0
  227. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/no.js +16 -0
  228. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/pl.js +16 -0
  229. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/tr.js +16 -0
  230. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/ug.js +16 -0
  231. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/uk.js +16 -0
  232. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/vi.js +16 -0
  233. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/lang/zh-cn.js +16 -0
  234. data/vendor/assets/ckeditor/ckeditor/_source/plugins/devtools/plugin.js +173 -173
  235. data/vendor/assets/ckeditor/ckeditor/_source/plugins/dialog/dialogDefinition.js +1166 -1166
  236. data/vendor/assets/ckeditor/ckeditor/_source/plugins/dialog/plugin.js +3319 -3289
  237. data/vendor/assets/ckeditor/ckeditor/_source/plugins/dialogadvtab/plugin.js +208 -207
  238. data/vendor/assets/ckeditor/ckeditor/_source/plugins/dialogui/plugin.js +1549 -1541
  239. data/vendor/assets/ckeditor/ckeditor/_source/plugins/div/dialogs/div.js +535 -535
  240. data/vendor/assets/ckeditor/ckeditor/_source/plugins/div/plugin.js +121 -121
  241. data/vendor/assets/ckeditor/ckeditor/_source/plugins/docprops/dialogs/docprops.js +674 -686
  242. data/vendor/assets/ckeditor/ckeditor/_source/plugins/docprops/plugin.js +22 -22
  243. data/vendor/assets/ckeditor/ckeditor/_source/plugins/domiterator/plugin.js +366 -361
  244. data/vendor/assets/ckeditor/ckeditor/_source/plugins/editingblock/plugin.js +278 -275
  245. data/vendor/assets/ckeditor/ckeditor/_source/plugins/elementspath/plugin.js +218 -218
  246. data/vendor/assets/ckeditor/ckeditor/_source/plugins/enterkey/plugin.js +433 -413
  247. data/vendor/assets/ckeditor/ckeditor/_source/plugins/entities/plugin.js +254 -250
  248. data/vendor/assets/ckeditor/ckeditor/_source/plugins/fakeobjects/plugin.js +175 -175
  249. data/vendor/assets/ckeditor/ckeditor/_source/plugins/filebrowser/plugin.js +533 -524
  250. data/vendor/assets/ckeditor/ckeditor/_source/plugins/find/dialogs/find.js +915 -903
  251. data/vendor/assets/ckeditor/ckeditor/_source/plugins/find/plugin.js +47 -47
  252. data/vendor/assets/ckeditor/ckeditor/_source/plugins/flash/dialogs/flash.js +674 -673
  253. data/vendor/assets/ckeditor/ckeditor/_source/plugins/flash/plugin.js +154 -154
  254. data/vendor/assets/ckeditor/ckeditor/_source/plugins/floatpanel/plugin.js +476 -428
  255. data/vendor/assets/ckeditor/ckeditor/_source/plugins/font/plugin.js +234 -234
  256. data/vendor/assets/ckeditor/ckeditor/_source/plugins/format/plugin.js +197 -197
  257. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/button.js +118 -118
  258. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/checkbox.js +153 -153
  259. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/form.js +177 -177
  260. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/hiddenfield.js +100 -100
  261. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/radio.js +135 -135
  262. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/select.js +558 -558
  263. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/textarea.js +135 -114
  264. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/dialogs/textfield.js +199 -199
  265. data/vendor/assets/ckeditor/ckeditor/_source/plugins/forms/plugin.js +288 -288
  266. data/vendor/assets/ckeditor/ckeditor/_source/plugins/horizontalrule/plugin.js +48 -48
  267. data/vendor/assets/ckeditor/ckeditor/_source/plugins/htmldataprocessor/plugin.js +600 -595
  268. data/vendor/assets/ckeditor/ckeditor/_source/plugins/htmlwriter/plugin.js +319 -319
  269. data/vendor/assets/ckeditor/ckeditor/_source/plugins/iframe/dialogs/iframe.js +229 -229
  270. data/vendor/assets/ckeditor/ckeditor/_source/plugins/iframe/plugin.js +87 -87
  271. data/vendor/assets/ckeditor/ckeditor/_source/plugins/iframedialog/plugin.js +188 -188
  272. data/vendor/assets/ckeditor/ckeditor/_source/plugins/image/dialogs/image.js +1406 -1406
  273. data/vendor/assets/ckeditor/ckeditor/_source/plugins/image/plugin.js +164 -81
  274. data/vendor/assets/ckeditor/ckeditor/_source/plugins/indent/plugin.js +480 -461
  275. data/vendor/assets/ckeditor/ckeditor/_source/plugins/justify/plugin.js +251 -253
  276. data/vendor/assets/ckeditor/ckeditor/_source/plugins/keystrokes/plugin.js +225 -225
  277. data/vendor/assets/ckeditor/ckeditor/_source/plugins/link/dialogs/anchor.js +144 -144
  278. data/vendor/assets/ckeditor/ckeditor/_source/plugins/link/dialogs/link.js +1427 -1424
  279. data/vendor/assets/ckeditor/ckeditor/_source/plugins/link/plugin.js +374 -374
  280. data/vendor/assets/ckeditor/ckeditor/_source/plugins/list/plugin.js +967 -734
  281. data/vendor/assets/ckeditor/ckeditor/_source/plugins/listblock/plugin.js +260 -268
  282. data/vendor/assets/ckeditor/ckeditor/_source/plugins/liststyle/dialogs/liststyle.js +225 -225
  283. data/vendor/assets/ckeditor/ckeditor/_source/plugins/liststyle/plugin.js +66 -66
  284. data/vendor/assets/ckeditor/ckeditor/_source/plugins/maximize/plugin.js +353 -352
  285. data/vendor/assets/ckeditor/ckeditor/_source/plugins/menu/plugin.js +542 -541
  286. data/vendor/assets/ckeditor/ckeditor/_source/plugins/menubutton/plugin.js +98 -98
  287. data/vendor/assets/ckeditor/ckeditor/_source/plugins/newpage/plugin.js +55 -54
  288. data/vendor/assets/ckeditor/ckeditor/_source/plugins/pagebreak/plugin.js +164 -164
  289. data/vendor/assets/ckeditor/ckeditor/_source/plugins/panel/plugin.js +396 -403
  290. data/vendor/assets/ckeditor/ckeditor/_source/plugins/panelbutton/plugin.js +144 -144
  291. data/vendor/assets/ckeditor/ckeditor/_source/plugins/pastefromword/filter/default.js +1367 -1367
  292. data/vendor/assets/ckeditor/ckeditor/_source/plugins/pastefromword/plugin.js +141 -141
  293. data/vendor/assets/ckeditor/ckeditor/_source/plugins/pastetext/dialogs/pastetext.js +67 -67
  294. data/vendor/assets/ckeditor/ckeditor/_source/plugins/pastetext/plugin.js +98 -98
  295. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/dialogs/placeholder.js +71 -71
  296. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/_translationstatus.txt +26 -0
  297. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/bg.js +16 -0
  298. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/cs.js +16 -0
  299. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/cy.js +16 -0
  300. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/da.js +16 -0
  301. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/de.js +16 -0
  302. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/el.js +16 -0
  303. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/en.js +16 -16
  304. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/eo.js +16 -0
  305. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/et.js +16 -0
  306. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/fa.js +16 -0
  307. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/fi.js +16 -0
  308. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/fr.js +16 -0
  309. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/he.js +16 -16
  310. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/hr.js +16 -0
  311. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/it.js +16 -0
  312. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/nb.js +16 -0
  313. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/nl.js +16 -0
  314. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/no.js +16 -0
  315. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/pl.js +16 -0
  316. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/tr.js +16 -0
  317. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/ug.js +16 -0
  318. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/uk.js +16 -0
  319. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/vi.js +16 -0
  320. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/lang/zh-cn.js +16 -0
  321. data/vendor/assets/ckeditor/ckeditor/_source/plugins/placeholder/plugin.js +171 -171
  322. data/vendor/assets/ckeditor/ckeditor/_source/plugins/popup/plugin.js +69 -64
  323. data/vendor/assets/ckeditor/ckeditor/_source/plugins/preview/plugin.js +113 -109
  324. data/vendor/assets/ckeditor/ckeditor/_source/plugins/print/plugin.js +42 -42
  325. data/vendor/assets/ckeditor/ckeditor/_source/plugins/removeformat/plugin.js +185 -185
  326. data/vendor/assets/ckeditor/ckeditor/_source/plugins/resize/plugin.js +169 -168
  327. data/vendor/assets/ckeditor/ckeditor/_source/plugins/richcombo/plugin.js +381 -381
  328. data/vendor/assets/ckeditor/ckeditor/_source/plugins/save/plugin.js +56 -56
  329. data/vendor/assets/ckeditor/ckeditor/_source/plugins/scayt/dialogs/options.js +537 -537
  330. data/vendor/assets/ckeditor/ckeditor/_source/plugins/scayt/dialogs/toolbar.css +71 -71
  331. data/vendor/assets/ckeditor/ckeditor/_source/plugins/scayt/plugin.js +973 -964
  332. data/vendor/assets/ckeditor/ckeditor/_source/plugins/selection/plugin.js +1855 -1601
  333. data/vendor/assets/ckeditor/ckeditor/_source/plugins/showblocks/plugin.js +160 -160
  334. data/vendor/assets/ckeditor/ckeditor/_source/plugins/showborders/plugin.js +207 -207
  335. data/vendor/assets/ckeditor/ckeditor/_source/plugins/smiley/dialogs/smiley.js +224 -224
  336. data/vendor/assets/ckeditor/ckeditor/_source/plugins/smiley/plugin.js +94 -94
  337. data/vendor/assets/ckeditor/ckeditor/_source/plugins/sourcearea/plugin.js +209 -209
  338. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/dialogs/specialchar.js +350 -350
  339. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/_translationstatus.txt +19 -0
  340. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/cs.js +126 -0
  341. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/cy.js +126 -0
  342. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/de.js +126 -0
  343. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/en.js +126 -89
  344. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/eo.js +126 -0
  345. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/et.js +126 -0
  346. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/fa.js +126 -0
  347. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/fi.js +126 -0
  348. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/fr.js +126 -0
  349. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/hr.js +126 -0
  350. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/it.js +126 -0
  351. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/nb.js +126 -0
  352. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/nl.js +126 -0
  353. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/no.js +126 -0
  354. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/tr.js +126 -0
  355. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/ug.js +126 -0
  356. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/lang/zh-cn.js +126 -0
  357. data/vendor/assets/ckeditor/ckeditor/_source/plugins/specialchar/plugin.js +70 -70
  358. data/vendor/assets/ckeditor/ckeditor/_source/plugins/styles/plugin.js +1706 -1696
  359. data/vendor/assets/ckeditor/ckeditor/_source/plugins/styles/styles/default.js +88 -88
  360. data/vendor/assets/ckeditor/ckeditor/_source/plugins/stylescombo/plugin.js +218 -218
  361. data/vendor/assets/ckeditor/ckeditor/_source/plugins/stylesheetparser/plugin.js +148 -148
  362. data/vendor/assets/ckeditor/ckeditor/_source/plugins/tab/plugin.js +367 -367
  363. data/vendor/assets/ckeditor/ckeditor/_source/plugins/table/dialogs/table.js +618 -602
  364. data/vendor/assets/ckeditor/ckeditor/_source/plugins/table/plugin.js +78 -78
  365. data/vendor/assets/ckeditor/ckeditor/_source/plugins/tableresize/plugin.js +443 -443
  366. data/vendor/assets/ckeditor/ckeditor/_source/plugins/tabletools/dialogs/tableCell.js +520 -525
  367. data/vendor/assets/ckeditor/ckeditor/_source/plugins/tabletools/plugin.js +1185 -1194
  368. data/vendor/assets/ckeditor/ckeditor/_source/plugins/templates/dialogs/templates.js +234 -234
  369. data/vendor/assets/ckeditor/ckeditor/_source/plugins/templates/plugin.js +100 -99
  370. data/vendor/assets/ckeditor/ckeditor/_source/plugins/templates/templates/default.js +94 -94
  371. data/vendor/assets/ckeditor/ckeditor/_source/plugins/toolbar/plugin.js +545 -545
  372. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/dialogs/uicolor.js +205 -205
  373. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/_translationstatus.txt +27 -0
  374. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/bg.js +15 -0
  375. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/cs.js +15 -0
  376. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/cy.js +15 -0
  377. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/da.js +15 -0
  378. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/de.js +15 -0
  379. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/el.js +15 -0
  380. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/en.js +15 -15
  381. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/eo.js +15 -0
  382. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/et.js +15 -0
  383. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/fa.js +15 -0
  384. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/fi.js +15 -0
  385. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/fr.js +15 -0
  386. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/he.js +15 -15
  387. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/hr.js +15 -0
  388. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/it.js +15 -0
  389. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/mk.js +15 -0
  390. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/nb.js +15 -0
  391. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/nl.js +15 -0
  392. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/no.js +15 -0
  393. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/pl.js +15 -0
  394. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/tr.js +15 -0
  395. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/ug.js +15 -0
  396. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/uk.js +15 -0
  397. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/vi.js +15 -0
  398. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/lang/zh-cn.js +15 -0
  399. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/plugin.js +37 -37
  400. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/yui/assets/yui.css +15 -15
  401. data/vendor/assets/ckeditor/ckeditor/_source/plugins/uicolor/yui/yui.js +71 -71
  402. data/vendor/assets/ckeditor/ckeditor/_source/plugins/undo/plugin.js +593 -580
  403. data/vendor/assets/ckeditor/ckeditor/_source/plugins/wsc/dialogs/ciframe.html +49 -49
  404. data/vendor/assets/ckeditor/ckeditor/_source/plugins/wsc/dialogs/tmpFrameset.html +52 -52
  405. data/vendor/assets/ckeditor/ckeditor/_source/plugins/wsc/dialogs/wsc.css +82 -82
  406. data/vendor/assets/ckeditor/ckeditor/_source/plugins/wsc/dialogs/wsc.js +192 -192
  407. data/vendor/assets/ckeditor/ckeditor/_source/plugins/wsc/plugin.js +33 -33
  408. data/vendor/assets/ckeditor/ckeditor/_source/plugins/wysiwygarea/plugin.js +1346 -1351
  409. data/vendor/assets/ckeditor/ckeditor/_source/plugins/xml/plugin.js +170 -170
  410. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/dialog.css +989 -943
  411. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/editor.css +25 -25
  412. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/elementspath.css +73 -73
  413. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/icons.css +366 -366
  414. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/mainui.css +206 -203
  415. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/menu.css +232 -232
  416. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/panel.css +217 -217
  417. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/presets.css +49 -49
  418. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/reset.css +85 -84
  419. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/richcombo.css +287 -287
  420. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/skin.js +236 -236
  421. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/templates.css +88 -88
  422. data/vendor/assets/ckeditor/ckeditor/_source/skins/kama/toolbar.css +408 -407
  423. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/dialog.css +891 -844
  424. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/editor.css +25 -25
  425. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/elementspath.css +74 -74
  426. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/icons.css +363 -363
  427. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/mainui.css +153 -153
  428. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/menu.css +229 -229
  429. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/panel.css +212 -212
  430. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/presets.css +49 -49
  431. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/reset.css +85 -84
  432. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/richcombo.css +309 -309
  433. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/skin.js +74 -74
  434. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/templates.css +87 -87
  435. data/vendor/assets/ckeditor/ckeditor/_source/skins/office2003/toolbar.css +522 -522
  436. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/dialog.css +907 -861
  437. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/editor.css +25 -25
  438. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/elementspath.css +74 -74
  439. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/icons.css +363 -363
  440. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/mainui.css +162 -162
  441. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/menu.css +232 -232
  442. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/panel.css +212 -212
  443. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/presets.css +50 -50
  444. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/reset.css +85 -84
  445. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/richcombo.css +302 -302
  446. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/skin.js +70 -70
  447. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/templates.css +87 -87
  448. data/vendor/assets/ckeditor/ckeditor/_source/skins/v2/toolbar.css +465 -465
  449. data/vendor/assets/ckeditor/ckeditor/_source/themes/default/theme.js +407 -395
  450. data/vendor/assets/ckeditor/ckeditor/adapters/jquery.js +6 -6
  451. data/vendor/assets/ckeditor/ckeditor/ckeditor.asp +955 -955
  452. data/vendor/assets/ckeditor/ckeditor/ckeditor.js +134 -130
  453. data/vendor/assets/ckeditor/ckeditor/ckeditor.pack +211 -211
  454. data/vendor/assets/ckeditor/ckeditor/ckeditor.php +29 -29
  455. data/vendor/assets/ckeditor/ckeditor/ckeditor_basic.js +8 -8
  456. data/vendor/assets/ckeditor/ckeditor/ckeditor_basic_source.js +20 -20
  457. data/vendor/assets/ckeditor/ckeditor/ckeditor_php4.php +566 -566
  458. data/vendor/assets/ckeditor/ckeditor/ckeditor_php5.php +556 -556
  459. data/vendor/assets/ckeditor/ckeditor/ckeditor_source.js +14 -4
  460. data/vendor/assets/ckeditor/ckeditor/config.js +11 -11
  461. data/vendor/assets/ckeditor/ckeditor/contents.css +25 -25
  462. data/vendor/assets/ckeditor/ckeditor/lang/_languages.js +1 -1
  463. data/vendor/assets/ckeditor/ckeditor/lang/_translationstatus.txt +61 -59
  464. data/vendor/assets/ckeditor/ckeditor/lang/af.js +2 -2
  465. data/vendor/assets/ckeditor/ckeditor/lang/ar.js +2 -2
  466. data/vendor/assets/ckeditor/ckeditor/lang/bg.js +2 -2
  467. data/vendor/assets/ckeditor/ckeditor/lang/bn.js +2 -2
  468. data/vendor/assets/ckeditor/ckeditor/lang/bs.js +2 -2
  469. data/vendor/assets/ckeditor/ckeditor/lang/ca.js +2 -2
  470. data/vendor/assets/ckeditor/ckeditor/lang/cs.js +2 -2
  471. data/vendor/assets/ckeditor/ckeditor/lang/cy.js +2 -2
  472. data/vendor/assets/ckeditor/ckeditor/lang/da.js +2 -2
  473. data/vendor/assets/ckeditor/ckeditor/lang/de.js +2 -2
  474. data/vendor/assets/ckeditor/ckeditor/lang/el.js +2 -2
  475. data/vendor/assets/ckeditor/ckeditor/lang/en-au.js +2 -2
  476. data/vendor/assets/ckeditor/ckeditor/lang/en-ca.js +2 -2
  477. data/vendor/assets/ckeditor/ckeditor/lang/en-gb.js +2 -2
  478. data/vendor/assets/ckeditor/ckeditor/lang/en.js +2 -2
  479. data/vendor/assets/ckeditor/ckeditor/lang/eo.js +2 -2
  480. data/vendor/assets/ckeditor/ckeditor/lang/es.js +2 -2
  481. data/vendor/assets/ckeditor/ckeditor/lang/et.js +2 -2
  482. data/vendor/assets/ckeditor/ckeditor/lang/eu.js +2 -2
  483. data/vendor/assets/ckeditor/ckeditor/lang/fa.js +2 -2
  484. data/vendor/assets/ckeditor/ckeditor/lang/fi.js +2 -2
  485. data/vendor/assets/ckeditor/ckeditor/lang/fo.js +2 -2
  486. data/vendor/assets/ckeditor/ckeditor/lang/fr-ca.js +2 -2
  487. data/vendor/assets/ckeditor/ckeditor/lang/fr.js +2 -2
  488. data/vendor/assets/ckeditor/ckeditor/lang/gl.js +2 -2
  489. data/vendor/assets/ckeditor/ckeditor/lang/gu.js +2 -2
  490. data/vendor/assets/ckeditor/ckeditor/lang/he.js +2 -2
  491. data/vendor/assets/ckeditor/ckeditor/lang/hi.js +2 -2
  492. data/vendor/assets/ckeditor/ckeditor/lang/hr.js +2 -2
  493. data/vendor/assets/ckeditor/ckeditor/lang/hu.js +2 -2
  494. data/vendor/assets/ckeditor/ckeditor/lang/is.js +2 -2
  495. data/vendor/assets/ckeditor/ckeditor/lang/it.js +2 -2
  496. data/vendor/assets/ckeditor/ckeditor/lang/ja.js +2 -2
  497. data/vendor/assets/ckeditor/ckeditor/lang/ka.js +2 -2
  498. data/vendor/assets/ckeditor/ckeditor/lang/km.js +2 -2
  499. data/vendor/assets/ckeditor/ckeditor/lang/ko.js +2 -2
  500. data/vendor/assets/ckeditor/ckeditor/lang/lt.js +2 -2
  501. data/vendor/assets/ckeditor/ckeditor/lang/lv.js +2 -2
  502. data/vendor/assets/ckeditor/ckeditor/lang/mk.js +6 -0
  503. data/vendor/assets/ckeditor/ckeditor/lang/mn.js +2 -2
  504. data/vendor/assets/ckeditor/ckeditor/lang/ms.js +2 -2
  505. data/vendor/assets/ckeditor/ckeditor/lang/nb.js +2 -2
  506. data/vendor/assets/ckeditor/ckeditor/lang/nl.js +2 -2
  507. data/vendor/assets/ckeditor/ckeditor/lang/no.js +2 -2
  508. data/vendor/assets/ckeditor/ckeditor/lang/pl.js +2 -2
  509. data/vendor/assets/ckeditor/ckeditor/lang/pt-br.js +2 -2
  510. data/vendor/assets/ckeditor/ckeditor/lang/pt.js +2 -2
  511. data/vendor/assets/ckeditor/ckeditor/lang/ro.js +2 -2
  512. data/vendor/assets/ckeditor/ckeditor/lang/ru.js +2 -2
  513. data/vendor/assets/ckeditor/ckeditor/lang/sk.js +2 -2
  514. data/vendor/assets/ckeditor/ckeditor/lang/sl.js +2 -2
  515. data/vendor/assets/ckeditor/ckeditor/lang/sr-latn.js +2 -2
  516. data/vendor/assets/ckeditor/ckeditor/lang/sr.js +2 -2
  517. data/vendor/assets/ckeditor/ckeditor/lang/sv.js +2 -2
  518. data/vendor/assets/ckeditor/ckeditor/lang/th.js +2 -2
  519. data/vendor/assets/ckeditor/ckeditor/lang/tr.js +2 -2
  520. data/vendor/assets/ckeditor/ckeditor/lang/ug.js +6 -0
  521. data/vendor/assets/ckeditor/ckeditor/lang/uk.js +2 -2
  522. data/vendor/assets/ckeditor/ckeditor/lang/vi.js +2 -2
  523. data/vendor/assets/ckeditor/ckeditor/lang/zh-cn.js +2 -2
  524. data/vendor/assets/ckeditor/ckeditor/lang/zh.js +2 -2
  525. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js +1 -1
  526. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/_translationstatus.txt +23 -0
  527. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/cs.js +6 -0
  528. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/cy.js +6 -0
  529. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/da.js +6 -0
  530. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/de.js +6 -0
  531. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/el.js +6 -0
  532. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/en.js +2 -2
  533. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/eo.js +6 -0
  534. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/fa.js +6 -0
  535. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/fi.js +6 -0
  536. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/fr.js +6 -0
  537. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/gu.js +6 -0
  538. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/he.js +2 -2
  539. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/it.js +6 -0
  540. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/mk.js +6 -0
  541. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/nb.js +6 -0
  542. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/nl.js +6 -0
  543. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/no.js +6 -0
  544. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/tr.js +6 -0
  545. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/ug.js +6 -0
  546. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/vi.js +6 -0
  547. data/vendor/assets/ckeditor/ckeditor/plugins/a11yhelp/lang/zh-cn.js +6 -0
  548. data/vendor/assets/ckeditor/ckeditor/plugins/about/dialogs/about.js +1 -1
  549. data/vendor/assets/ckeditor/ckeditor/plugins/adobeair/plugin.js +1 -1
  550. data/vendor/assets/ckeditor/ckeditor/plugins/ajax/plugin.js +1 -1
  551. data/vendor/assets/ckeditor/ckeditor/plugins/autogrow/plugin.js +2 -2
  552. data/vendor/assets/ckeditor/ckeditor/plugins/bbcode/plugin.js +1 -1
  553. data/vendor/assets/ckeditor/ckeditor/plugins/clipboard/dialogs/paste.js +2 -2
  554. data/vendor/assets/ckeditor/ckeditor/plugins/colordialog/dialogs/colordialog.js +3 -3
  555. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/_translationstatus.txt +27 -0
  556. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/bg.js +6 -0
  557. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/cs.js +6 -0
  558. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/cy.js +6 -0
  559. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/da.js +6 -0
  560. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/de.js +6 -0
  561. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/el.js +6 -0
  562. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/en.js +1 -1
  563. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/eo.js +6 -0
  564. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/et.js +6 -0
  565. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/fa.js +6 -0
  566. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/fi.js +6 -0
  567. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/fr.js +6 -0
  568. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/gu.js +6 -0
  569. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/he.js +6 -0
  570. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/hr.js +6 -0
  571. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/it.js +6 -0
  572. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/nb.js +6 -0
  573. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/nl.js +6 -0
  574. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/no.js +6 -0
  575. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/pl.js +6 -0
  576. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/tr.js +6 -0
  577. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/ug.js +6 -0
  578. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/uk.js +6 -0
  579. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/vi.js +6 -0
  580. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/lang/zh-cn.js +6 -0
  581. data/vendor/assets/ckeditor/ckeditor/plugins/devtools/plugin.js +2 -2
  582. data/vendor/assets/ckeditor/ckeditor/plugins/dialog/dialogDefinition.js +1 -1
  583. data/vendor/assets/ckeditor/ckeditor/plugins/div/dialogs/div.js +1 -1
  584. data/vendor/assets/ckeditor/ckeditor/plugins/docprops/dialogs/docprops.js +3 -3
  585. data/vendor/assets/ckeditor/ckeditor/plugins/docprops/plugin.js +1 -1
  586. data/vendor/assets/ckeditor/ckeditor/plugins/find/dialogs/find.js +6 -6
  587. data/vendor/assets/ckeditor/ckeditor/plugins/flash/dialogs/flash.js +2 -2
  588. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/button.js +1 -1
  589. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/checkbox.js +1 -1
  590. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/form.js +1 -1
  591. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/hiddenfield.js +1 -1
  592. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/radio.js +1 -1
  593. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/select.js +1 -1
  594. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/textarea.js +2 -2
  595. data/vendor/assets/ckeditor/ckeditor/plugins/forms/dialogs/textfield.js +1 -1
  596. data/vendor/assets/ckeditor/ckeditor/plugins/iframe/dialogs/iframe.js +1 -1
  597. data/vendor/assets/ckeditor/ckeditor/plugins/iframedialog/plugin.js +1 -1
  598. data/vendor/assets/ckeditor/ckeditor/plugins/image/dialogs/image.js +9 -9
  599. data/vendor/assets/ckeditor/ckeditor/plugins/link/dialogs/anchor.js +1 -1
  600. data/vendor/assets/ckeditor/ckeditor/plugins/link/dialogs/link.js +6 -6
  601. data/vendor/assets/ckeditor/ckeditor/plugins/liststyle/dialogs/liststyle.js +1 -1
  602. data/vendor/assets/ckeditor/ckeditor/plugins/pastefromword/filter/default.js +1 -1
  603. data/vendor/assets/ckeditor/ckeditor/plugins/pastetext/dialogs/pastetext.js +1 -1
  604. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/dialogs/placeholder.js +1 -1
  605. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/_translationstatus.txt +26 -0
  606. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/bg.js +6 -0
  607. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/cs.js +6 -0
  608. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/cy.js +6 -0
  609. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/da.js +6 -0
  610. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/de.js +6 -0
  611. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/el.js +6 -0
  612. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/en.js +1 -1
  613. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/eo.js +6 -0
  614. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/et.js +6 -0
  615. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/fa.js +6 -0
  616. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/fi.js +6 -0
  617. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/fr.js +6 -0
  618. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/he.js +1 -1
  619. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/hr.js +6 -0
  620. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/it.js +6 -0
  621. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/nb.js +6 -0
  622. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/nl.js +6 -0
  623. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/no.js +6 -0
  624. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/pl.js +6 -0
  625. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/tr.js +6 -0
  626. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/ug.js +6 -0
  627. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/uk.js +6 -0
  628. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/vi.js +6 -0
  629. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/lang/zh-cn.js +6 -0
  630. data/vendor/assets/ckeditor/ckeditor/plugins/placeholder/plugin.js +2 -2
  631. data/vendor/assets/ckeditor/ckeditor/plugins/scayt/dialogs/options.js +1 -1
  632. data/vendor/assets/ckeditor/ckeditor/plugins/scayt/dialogs/toolbar.css +1 -1
  633. data/vendor/assets/ckeditor/ckeditor/plugins/smiley/dialogs/smiley.js +1 -1
  634. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/dialogs/specialchar.js +2 -2
  635. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/_translationstatus.txt +19 -0
  636. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/cs.js +6 -0
  637. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/cy.js +6 -0
  638. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/de.js +6 -0
  639. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/en.js +2 -2
  640. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/eo.js +6 -0
  641. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/et.js +6 -0
  642. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/fa.js +6 -0
  643. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/fi.js +6 -0
  644. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/fr.js +6 -0
  645. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/hr.js +6 -0
  646. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/it.js +6 -0
  647. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/nb.js +6 -0
  648. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/nl.js +6 -0
  649. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/no.js +6 -0
  650. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/tr.js +6 -0
  651. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/ug.js +6 -0
  652. data/vendor/assets/ckeditor/ckeditor/plugins/specialchar/lang/zh-cn.js +6 -0
  653. data/vendor/assets/ckeditor/ckeditor/plugins/styles/styles/default.js +1 -1
  654. data/vendor/assets/ckeditor/ckeditor/plugins/stylesheetparser/plugin.js +1 -1
  655. data/vendor/assets/ckeditor/ckeditor/plugins/table/dialogs/table.js +5 -5
  656. data/vendor/assets/ckeditor/ckeditor/plugins/tableresize/plugin.js +1 -1
  657. data/vendor/assets/ckeditor/ckeditor/plugins/tabletools/dialogs/tableCell.js +3 -3
  658. data/vendor/assets/ckeditor/ckeditor/plugins/templates/dialogs/templates.js +1 -1
  659. data/vendor/assets/ckeditor/ckeditor/plugins/templates/templates/default.js +1 -1
  660. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/dialogs/uicolor.js +1 -1
  661. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/_translationstatus.txt +27 -0
  662. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/bg.js +6 -0
  663. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/cs.js +6 -0
  664. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/cy.js +6 -0
  665. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/da.js +6 -0
  666. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/de.js +6 -0
  667. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/el.js +6 -0
  668. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/en.js +1 -1
  669. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/eo.js +6 -0
  670. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/et.js +6 -0
  671. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/fa.js +6 -0
  672. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/fi.js +6 -0
  673. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/fr.js +6 -0
  674. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/he.js +1 -1
  675. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/hr.js +6 -0
  676. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/it.js +6 -0
  677. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/mk.js +6 -0
  678. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/nb.js +6 -0
  679. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/nl.js +6 -0
  680. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/no.js +6 -0
  681. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/pl.js +6 -0
  682. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/tr.js +6 -0
  683. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/ug.js +6 -0
  684. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/uk.js +6 -0
  685. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/vi.js +6 -0
  686. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/lang/zh-cn.js +6 -0
  687. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/plugin.js +2 -2
  688. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/yui/assets/yui.css +1 -1
  689. data/vendor/assets/ckeditor/ckeditor/plugins/uicolor/yui/yui.js +1 -1
  690. data/vendor/assets/ckeditor/ckeditor/plugins/wsc/dialogs/ciframe.html +1 -1
  691. data/vendor/assets/ckeditor/ckeditor/plugins/wsc/dialogs/tmpFrameset.html +1 -1
  692. data/vendor/assets/ckeditor/ckeditor/plugins/wsc/dialogs/wsc.css +1 -1
  693. data/vendor/assets/ckeditor/ckeditor/plugins/wsc/dialogs/wsc.js +2 -2
  694. data/vendor/assets/ckeditor/ckeditor/plugins/xml/plugin.js +1 -1
  695. data/vendor/assets/ckeditor/ckeditor/skins/kama/dialog.css +2 -2
  696. data/vendor/assets/ckeditor/ckeditor/skins/kama/editor.css +4 -4
  697. data/vendor/assets/ckeditor/ckeditor/skins/kama/skin.js +1 -1
  698. data/vendor/assets/ckeditor/ckeditor/skins/kama/templates.css +1 -1
  699. data/vendor/assets/ckeditor/ckeditor/skins/office2003/dialog.css +2 -2
  700. data/vendor/assets/ckeditor/ckeditor/skins/office2003/editor.css +2 -2
  701. data/vendor/assets/ckeditor/ckeditor/skins/office2003/skin.js +1 -1
  702. data/vendor/assets/ckeditor/ckeditor/skins/office2003/templates.css +1 -1
  703. data/vendor/assets/ckeditor/ckeditor/skins/v2/dialog.css +2 -2
  704. data/vendor/assets/ckeditor/ckeditor/skins/v2/editor.css +2 -2
  705. data/vendor/assets/ckeditor/ckeditor/skins/v2/skin.js +1 -1
  706. data/vendor/assets/ckeditor/ckeditor/skins/v2/templates.css +1 -1
  707. data/vendor/assets/ckeditor/ckeditor/themes/default/theme.js +8 -8
  708. metadata +225 -3
@@ -1,734 +1,967 @@
1
- /*
2
- Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
3
- For licensing, see LICENSE.html or http://ckeditor.com/license
4
- */
5
-
6
- /**
7
- * @file Insert and remove numbered and bulleted lists.
8
- */
9
-
10
- (function()
11
- {
12
- var listNodeNames = { ol : 1, ul : 1 },
13
- emptyTextRegex = /^[\n\r\t ]*$/;
14
-
15
- var whitespaces = CKEDITOR.dom.walker.whitespaces(),
16
- bookmarks = CKEDITOR.dom.walker.bookmark(),
17
- nonEmpty = function( node ){ return !( whitespaces( node ) || bookmarks( node ) ); };
18
-
19
- CKEDITOR.plugins.list = {
20
- /*
21
- * Convert a DOM list tree into a data structure that is easier to
22
- * manipulate. This operation should be non-intrusive in the sense that it
23
- * does not change the DOM tree, with the exception that it may add some
24
- * markers to the list item nodes when database is specified.
25
- */
26
- listToArray : function( listNode, database, baseArray, baseIndentLevel, grandparentNode )
27
- {
28
- if ( !listNodeNames[ listNode.getName() ] )
29
- return [];
30
-
31
- if ( !baseIndentLevel )
32
- baseIndentLevel = 0;
33
- if ( !baseArray )
34
- baseArray = [];
35
-
36
- // Iterate over all list items to and look for inner lists.
37
- for ( var i = 0, count = listNode.getChildCount() ; i < count ; i++ )
38
- {
39
- var listItem = listNode.getChild( i );
40
-
41
- // Fixing malformed nested lists by moving it into a previous list item. (#6236)
42
- if( listItem.type == CKEDITOR.NODE_ELEMENT && listItem.getName() in CKEDITOR.dtd.$list )
43
- CKEDITOR.plugins.list.listToArray( listItem, database, baseArray, baseIndentLevel + 1 );
44
-
45
- // It may be a text node or some funny stuff.
46
- if ( listItem.$.nodeName.toLowerCase() != 'li' )
47
- continue;
48
-
49
- var itemObj = { 'parent' : listNode, indent : baseIndentLevel, element : listItem, contents : [] };
50
- if ( !grandparentNode )
51
- {
52
- itemObj.grandparent = listNode.getParent();
53
- if ( itemObj.grandparent && itemObj.grandparent.$.nodeName.toLowerCase() == 'li' )
54
- itemObj.grandparent = itemObj.grandparent.getParent();
55
- }
56
- else
57
- itemObj.grandparent = grandparentNode;
58
-
59
- if ( database )
60
- CKEDITOR.dom.element.setMarker( database, listItem, 'listarray_index', baseArray.length );
61
- baseArray.push( itemObj );
62
-
63
- for ( var j = 0, itemChildCount = listItem.getChildCount(), child; j < itemChildCount ; j++ )
64
- {
65
- child = listItem.getChild( j );
66
- if ( child.type == CKEDITOR.NODE_ELEMENT && listNodeNames[ child.getName() ] )
67
- // Note the recursion here, it pushes inner list items with
68
- // +1 indentation in the correct order.
69
- CKEDITOR.plugins.list.listToArray( child, database, baseArray, baseIndentLevel + 1, itemObj.grandparent );
70
- else
71
- itemObj.contents.push( child );
72
- }
73
- }
74
- return baseArray;
75
- },
76
-
77
- // Convert our internal representation of a list back to a DOM forest.
78
- arrayToList : function( listArray, database, baseIndex, paragraphMode, dir )
79
- {
80
- if ( !baseIndex )
81
- baseIndex = 0;
82
- if ( !listArray || listArray.length < baseIndex + 1 )
83
- return null;
84
- var doc = listArray[ baseIndex ].parent.getDocument(),
85
- retval = new CKEDITOR.dom.documentFragment( doc ),
86
- rootNode = null,
87
- currentIndex = baseIndex,
88
- indentLevel = Math.max( listArray[ baseIndex ].indent, 0 ),
89
- currentListItem = null,
90
- orgDir,
91
- paragraphName = ( paragraphMode == CKEDITOR.ENTER_P ? 'p' : 'div' );
92
- while ( 1 )
93
- {
94
- var item = listArray[ currentIndex ];
95
-
96
- orgDir = item.element.getDirection( 1 );
97
-
98
- if ( item.indent == indentLevel )
99
- {
100
- if ( !rootNode || listArray[ currentIndex ].parent.getName() != rootNode.getName() )
101
- {
102
- rootNode = listArray[ currentIndex ].parent.clone( false, 1 );
103
- dir && rootNode.setAttribute( 'dir', dir );
104
- retval.append( rootNode );
105
- }
106
- currentListItem = rootNode.append( item.element.clone( 0, 1 ) );
107
-
108
- if ( orgDir != rootNode.getDirection( 1 ) )
109
- currentListItem.setAttribute( 'dir', orgDir );
110
- else
111
- currentListItem.removeAttribute( 'dir' );
112
-
113
- for ( var i = 0 ; i < item.contents.length ; i++ )
114
- currentListItem.append( item.contents[i].clone( 1, 1 ) );
115
- currentIndex++;
116
- }
117
- else if ( item.indent == Math.max( indentLevel, 0 ) + 1 )
118
- {
119
- // Maintain original direction (#6861).
120
- var currDir = listArray[ currentIndex - 1 ].element.getDirection( 1 ),
121
- listData = CKEDITOR.plugins.list.arrayToList( listArray, null, currentIndex, paragraphMode,
122
- currDir != orgDir ? orgDir: null );
123
-
124
- // If the next block is an <li> with another list tree as the first
125
- // child, we'll need to append a filler (<br>/NBSP) or the list item
126
- // wouldn't be editable. (#6724)
127
- if ( !currentListItem.getChildCount() && CKEDITOR.env.ie && !( doc.$.documentMode > 7 ))
128
- currentListItem.append( doc.createText( '\xa0' ) );
129
- currentListItem.append( listData.listNode );
130
- currentIndex = listData.nextIndex;
131
- }
132
- else if ( item.indent == -1 && !baseIndex && item.grandparent )
133
- {
134
- if ( listNodeNames[ item.grandparent.getName() ] )
135
- currentListItem = item.element.clone( false, true );
136
- else
137
- {
138
- // Create completely new blocks here.
139
- if ( dir || item.element.hasAttributes() || paragraphMode != CKEDITOR.ENTER_BR )
140
- {
141
- currentListItem = doc.createElement( paragraphName );
142
- item.element.copyAttributes( currentListItem, { type:1, value:1 } );
143
-
144
- // There might be a case where there are no attributes in the element after all
145
- // (i.e. when "type" or "value" are the only attributes set). In this case, if enterMode = BR,
146
- // the current item should be a fragment.
147
- if ( !dir && paragraphMode == CKEDITOR.ENTER_BR && !currentListItem.hasAttributes() )
148
- currentListItem = new CKEDITOR.dom.documentFragment( doc );
149
- }
150
- else
151
- currentListItem = new CKEDITOR.dom.documentFragment( doc );
152
- }
153
-
154
- if ( currentListItem.type == CKEDITOR.NODE_ELEMENT )
155
- {
156
- if ( item.grandparent.getDirection( 1 ) != orgDir )
157
- currentListItem.setAttribute( 'dir', orgDir );
158
- else
159
- currentListItem.removeAttribute( 'dir' );
160
- }
161
-
162
- for ( i = 0 ; i < item.contents.length ; i++ )
163
- currentListItem.append( item.contents[i].clone( 1, 1 ) );
164
-
165
- if ( currentListItem.type == CKEDITOR.NODE_DOCUMENT_FRAGMENT
166
- && currentIndex != listArray.length - 1 )
167
- {
168
- var last = currentListItem.getLast();
169
- if ( last && last.type == CKEDITOR.NODE_ELEMENT
170
- && last.getAttribute( 'type' ) == '_moz' )
171
- {
172
- last.remove();
173
- }
174
-
175
- if ( !( last = currentListItem.getLast( nonEmpty )
176
- && last.type == CKEDITOR.NODE_ELEMENT
177
- && last.getName() in CKEDITOR.dtd.$block ) )
178
- {
179
- currentListItem.append( doc.createElement( 'br' ) );
180
- }
181
- }
182
-
183
- if ( currentListItem.type == CKEDITOR.NODE_ELEMENT &&
184
- currentListItem.getName() == paragraphName &&
185
- currentListItem.$.firstChild )
186
- {
187
- currentListItem.trim();
188
- var firstChild = currentListItem.getFirst();
189
- if ( firstChild.type == CKEDITOR.NODE_ELEMENT && firstChild.isBlockBoundary() )
190
- {
191
- var tmp = new CKEDITOR.dom.documentFragment( doc );
192
- currentListItem.moveChildren( tmp );
193
- currentListItem = tmp;
194
- }
195
- }
196
-
197
- var currentListItemName = currentListItem.$.nodeName.toLowerCase();
198
- if ( !CKEDITOR.env.ie && ( currentListItemName == 'div' || currentListItemName == 'p' ) )
199
- currentListItem.appendBogus();
200
- retval.append( currentListItem );
201
- rootNode = null;
202
- currentIndex++;
203
- }
204
- else
205
- return null;
206
-
207
- if ( listArray.length <= currentIndex || Math.max( listArray[ currentIndex ].indent, 0 ) < indentLevel )
208
- break;
209
- }
210
-
211
- // Clear marker attributes for the new list tree made of cloned nodes, if any.
212
- if ( database )
213
- {
214
- var currentNode = retval.getFirst();
215
- while ( currentNode )
216
- {
217
- if ( currentNode.type == CKEDITOR.NODE_ELEMENT )
218
- CKEDITOR.dom.element.clearMarkers( database, currentNode );
219
- currentNode = currentNode.getNextSourceNode();
220
- }
221
- }
222
-
223
- return { listNode : retval, nextIndex : currentIndex };
224
- }
225
- };
226
-
227
- function onSelectionChange( evt )
228
- {
229
- if ( evt.editor.readOnly )
230
- return null;
231
-
232
- var path = evt.data.path,
233
- blockLimit = path.blockLimit,
234
- elements = path.elements,
235
- element,
236
- i;
237
-
238
- // Grouping should only happen under blockLimit.(#3940).
239
- for ( i = 0 ; i < elements.length && ( element = elements[ i ] )
240
- && !element.equals( blockLimit ); i++ )
241
- {
242
- if ( listNodeNames[ elements[ i ].getName() ] )
243
- return this.setState( this.type == elements[ i ].getName() ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF );
244
- }
245
-
246
- return this.setState( CKEDITOR.TRISTATE_OFF );
247
- }
248
-
249
- function changeListType( editor, groupObj, database, listsCreated )
250
- {
251
- // This case is easy...
252
- // 1. Convert the whole list into a one-dimensional array.
253
- // 2. Change the list type by modifying the array.
254
- // 3. Recreate the whole list by converting the array to a list.
255
- // 4. Replace the original list with the recreated list.
256
- var listArray = CKEDITOR.plugins.list.listToArray( groupObj.root, database ),
257
- selectedListItems = [];
258
-
259
- for ( var i = 0 ; i < groupObj.contents.length ; i++ )
260
- {
261
- var itemNode = groupObj.contents[i];
262
- itemNode = itemNode.getAscendant( 'li', true );
263
- if ( !itemNode || itemNode.getCustomData( 'list_item_processed' ) )
264
- continue;
265
- selectedListItems.push( itemNode );
266
- CKEDITOR.dom.element.setMarker( database, itemNode, 'list_item_processed', true );
267
- }
268
-
269
- var root = groupObj.root,
270
- fakeParent = root.getDocument().createElement( this.type );
271
- // Copy all attributes, except from 'start' and 'type'.
272
- root.copyAttributes( fakeParent, { start : 1, type : 1 } );
273
- // The list-style-type property should be ignored.
274
- fakeParent.removeStyle( 'list-style-type' );
275
-
276
- for ( i = 0 ; i < selectedListItems.length ; i++ )
277
- {
278
- var listIndex = selectedListItems[i].getCustomData( 'listarray_index' );
279
- listArray[listIndex].parent = fakeParent;
280
- }
281
- var newList = CKEDITOR.plugins.list.arrayToList( listArray, database, null, editor.config.enterMode );
282
- var child, length = newList.listNode.getChildCount();
283
- for ( i = 0 ; i < length && ( child = newList.listNode.getChild( i ) ) ; i++ )
284
- {
285
- if ( child.getName() == this.type )
286
- listsCreated.push( child );
287
- }
288
- newList.listNode.replace( groupObj.root );
289
- }
290
-
291
- var headerTagRegex = /^h[1-6]$/;
292
-
293
- function createList( editor, groupObj, listsCreated )
294
- {
295
- var contents = groupObj.contents,
296
- doc = groupObj.root.getDocument(),
297
- listContents = [];
298
-
299
- // It is possible to have the contents returned by DomRangeIterator to be the same as the root.
300
- // e.g. when we're running into table cells.
301
- // In such a case, enclose the childNodes of contents[0] into a <div>.
302
- if ( contents.length == 1 && contents[0].equals( groupObj.root ) )
303
- {
304
- var divBlock = doc.createElement( 'div' );
305
- contents[0].moveChildren && contents[0].moveChildren( divBlock );
306
- contents[0].append( divBlock );
307
- contents[0] = divBlock;
308
- }
309
-
310
- // Calculate the common parent node of all content blocks.
311
- var commonParent = groupObj.contents[0].getParent();
312
- for ( var i = 0 ; i < contents.length ; i++ )
313
- commonParent = commonParent.getCommonAncestor( contents[i].getParent() );
314
-
315
- var useComputedState = editor.config.useComputedState,
316
- listDir, explicitDirection;
317
-
318
- useComputedState = useComputedState === undefined || useComputedState;
319
-
320
- // We want to insert things that are in the same tree level only, so calculate the contents again
321
- // by expanding the selected blocks to the same tree level.
322
- for ( i = 0 ; i < contents.length ; i++ )
323
- {
324
- var contentNode = contents[i],
325
- parentNode;
326
- while ( ( parentNode = contentNode.getParent() ) )
327
- {
328
- if ( parentNode.equals( commonParent ) )
329
- {
330
- listContents.push( contentNode );
331
-
332
- // Determine the lists's direction.
333
- if ( !explicitDirection && contentNode.getDirection() )
334
- explicitDirection = 1;
335
-
336
- var itemDir = contentNode.getDirection( useComputedState );
337
-
338
- if ( listDir !== null )
339
- {
340
- // If at least one LI have a different direction than current listDir, we can't have listDir.
341
- if ( listDir && listDir != itemDir )
342
- listDir = null;
343
- else
344
- listDir = itemDir;
345
- }
346
-
347
- break;
348
- }
349
- contentNode = parentNode;
350
- }
351
- }
352
-
353
- if ( listContents.length < 1 )
354
- return;
355
-
356
- // Insert the list to the DOM tree.
357
- var insertAnchor = listContents[ listContents.length - 1 ].getNext(),
358
- listNode = doc.createElement( this.type );
359
-
360
- listsCreated.push( listNode );
361
-
362
- var contentBlock, listItem;
363
-
364
- while ( listContents.length )
365
- {
366
- contentBlock = listContents.shift();
367
- listItem = doc.createElement( 'li' );
368
-
369
- // Preserve preformat block and heading structure when converting to list item. (#5335) (#5271)
370
- if ( contentBlock.is( 'pre' ) || headerTagRegex.test( contentBlock.getName() ) )
371
- contentBlock.appendTo( listItem );
372
- else
373
- {
374
- contentBlock.copyAttributes( listItem );
375
- // Remove direction attribute after it was merged into list root. (#7657)
376
- if ( listDir && contentBlock.getDirection() )
377
- {
378
- listItem.removeStyle( 'direction' );
379
- listItem.removeAttribute( 'dir' );
380
- }
381
- contentBlock.moveChildren( listItem );
382
- contentBlock.remove();
383
- }
384
-
385
- listItem.appendTo( listNode );
386
- }
387
-
388
- // Apply list root dir only if it has been explicitly declared.
389
- if ( listDir && explicitDirection )
390
- listNode.setAttribute( 'dir', listDir );
391
-
392
- if ( insertAnchor )
393
- listNode.insertBefore( insertAnchor );
394
- else
395
- listNode.appendTo( commonParent );
396
- }
397
-
398
- function removeList( editor, groupObj, database )
399
- {
400
- // This is very much like the change list type operation.
401
- // Except that we're changing the selected items' indent to -1 in the list array.
402
- var listArray = CKEDITOR.plugins.list.listToArray( groupObj.root, database ),
403
- selectedListItems = [];
404
-
405
- for ( var i = 0 ; i < groupObj.contents.length ; i++ )
406
- {
407
- var itemNode = groupObj.contents[i];
408
- itemNode = itemNode.getAscendant( 'li', true );
409
- if ( !itemNode || itemNode.getCustomData( 'list_item_processed' ) )
410
- continue;
411
- selectedListItems.push( itemNode );
412
- CKEDITOR.dom.element.setMarker( database, itemNode, 'list_item_processed', true );
413
- }
414
-
415
- var lastListIndex = null;
416
- for ( i = 0 ; i < selectedListItems.length ; i++ )
417
- {
418
- var listIndex = selectedListItems[i].getCustomData( 'listarray_index' );
419
- listArray[listIndex].indent = -1;
420
- lastListIndex = listIndex;
421
- }
422
-
423
- // After cutting parts of the list out with indent=-1, we still have to maintain the array list
424
- // model's nextItem.indent <= currentItem.indent + 1 invariant. Otherwise the array model of the
425
- // list cannot be converted back to a real DOM list.
426
- for ( i = lastListIndex + 1 ; i < listArray.length ; i++ )
427
- {
428
- if ( listArray[i].indent > listArray[i-1].indent + 1 )
429
- {
430
- var indentOffset = listArray[i-1].indent + 1 - listArray[i].indent;
431
- var oldIndent = listArray[i].indent;
432
- while ( listArray[i] && listArray[i].indent >= oldIndent )
433
- {
434
- listArray[i].indent += indentOffset;
435
- i++;
436
- }
437
- i--;
438
- }
439
- }
440
-
441
- var newList = CKEDITOR.plugins.list.arrayToList( listArray, database, null, editor.config.enterMode,
442
- groupObj.root.getAttribute( 'dir' ) );
443
-
444
- // Compensate <br> before/after the list node if the surrounds are non-blocks.(#3836)
445
- var docFragment = newList.listNode, boundaryNode, siblingNode;
446
- function compensateBrs( isStart )
447
- {
448
- if ( ( boundaryNode = docFragment[ isStart ? 'getFirst' : 'getLast' ]() )
449
- && !( boundaryNode.is && boundaryNode.isBlockBoundary() )
450
- && ( siblingNode = groupObj.root[ isStart ? 'getPrevious' : 'getNext' ]
451
- ( CKEDITOR.dom.walker.whitespaces( true ) ) )
452
- && !( siblingNode.is && siblingNode.isBlockBoundary( { br : 1 } ) ) )
453
- editor.document.createElement( 'br' )[ isStart ? 'insertBefore' : 'insertAfter' ]( boundaryNode );
454
- }
455
- compensateBrs( true );
456
- compensateBrs();
457
-
458
- docFragment.replace( groupObj.root );
459
- }
460
-
461
- function listCommand( name, type )
462
- {
463
- this.name = name;
464
- this.type = type;
465
- }
466
-
467
- listCommand.prototype = {
468
- exec : function( editor )
469
- {
470
- var doc = editor.document,
471
- config = editor.config,
472
- selection = editor.getSelection(),
473
- ranges = selection && selection.getRanges( true );
474
-
475
- // There should be at least one selected range.
476
- if ( !ranges || ranges.length < 1 )
477
- return;
478
-
479
- // Midas lists rule #1 says we can create a list even in an empty document.
480
- // But DOM iterator wouldn't run if the document is really empty.
481
- // So create a paragraph if the document is empty and we're going to create a list.
482
- if ( this.state == CKEDITOR.TRISTATE_OFF )
483
- {
484
- var body = doc.getBody();
485
- if ( !body.getFirst( nonEmpty ) )
486
- {
487
- config.enterMode == CKEDITOR.ENTER_BR ?
488
- body.appendBogus() :
489
- ranges[ 0 ].fixBlock( 1, config.enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' );
490
-
491
- selection.selectRanges( ranges );
492
- }
493
- // Maybe a single range there enclosing the whole list,
494
- // turn on the list state manually(#4129).
495
- else
496
- {
497
- var range = ranges.length == 1 && ranges[ 0 ],
498
- enclosedNode = range && range.getEnclosedNode();
499
- if ( enclosedNode && enclosedNode.is
500
- && this.type == enclosedNode.getName() )
501
- this.setState( CKEDITOR.TRISTATE_ON );
502
- }
503
- }
504
-
505
- var bookmarks = selection.createBookmarks( true );
506
-
507
- // Group the blocks up because there are many cases where multiple lists have to be created,
508
- // or multiple lists have to be cancelled.
509
- var listGroups = [],
510
- database = {},
511
- rangeIterator = ranges.createIterator(),
512
- index = 0;
513
-
514
- while ( ( range = rangeIterator.getNextRange() ) && ++index )
515
- {
516
- var boundaryNodes = range.getBoundaryNodes(),
517
- startNode = boundaryNodes.startNode,
518
- endNode = boundaryNodes.endNode;
519
-
520
- if ( startNode.type == CKEDITOR.NODE_ELEMENT && startNode.getName() == 'td' )
521
- range.setStartAt( boundaryNodes.startNode, CKEDITOR.POSITION_AFTER_START );
522
-
523
- if ( endNode.type == CKEDITOR.NODE_ELEMENT && endNode.getName() == 'td' )
524
- range.setEndAt( boundaryNodes.endNode, CKEDITOR.POSITION_BEFORE_END );
525
-
526
- var iterator = range.createIterator(),
527
- block;
528
-
529
- iterator.forceBrBreak = ( this.state == CKEDITOR.TRISTATE_OFF );
530
-
531
- while ( ( block = iterator.getNextParagraph() ) )
532
- {
533
- // Avoid duplicate blocks get processed across ranges.
534
- if( block.getCustomData( 'list_block' ) )
535
- continue;
536
- else
537
- CKEDITOR.dom.element.setMarker( database, block, 'list_block', 1 );
538
-
539
- var path = new CKEDITOR.dom.elementPath( block ),
540
- pathElements = path.elements,
541
- pathElementsCount = pathElements.length,
542
- listNode = null,
543
- processedFlag = 0,
544
- blockLimit = path.blockLimit,
545
- element;
546
-
547
- // First, try to group by a list ancestor.
548
- for ( var i = pathElementsCount - 1; i >= 0 && ( element = pathElements[ i ] ); i-- )
549
- {
550
- if ( listNodeNames[ element.getName() ]
551
- && blockLimit.contains( element ) ) // Don't leak outside block limit (#3940).
552
- {
553
- // If we've encountered a list inside a block limit
554
- // The last group object of the block limit element should
555
- // no longer be valid. Since paragraphs after the list
556
- // should belong to a different group of paragraphs before
557
- // the list. (Bug #1309)
558
- blockLimit.removeCustomData( 'list_group_object_' + index );
559
-
560
- var groupObj = element.getCustomData( 'list_group_object' );
561
- if ( groupObj )
562
- groupObj.contents.push( block );
563
- else
564
- {
565
- groupObj = { root : element, contents : [ block ] };
566
- listGroups.push( groupObj );
567
- CKEDITOR.dom.element.setMarker( database, element, 'list_group_object', groupObj );
568
- }
569
- processedFlag = 1;
570
- break;
571
- }
572
- }
573
-
574
- if ( processedFlag )
575
- continue;
576
-
577
- // No list ancestor? Group by block limit, but don't mix contents from different ranges.
578
- var root = blockLimit;
579
- if ( root.getCustomData( 'list_group_object_' + index ) )
580
- root.getCustomData( 'list_group_object_' + index ).contents.push( block );
581
- else
582
- {
583
- groupObj = { root : root, contents : [ block ] };
584
- CKEDITOR.dom.element.setMarker( database, root, 'list_group_object_' + index, groupObj );
585
- listGroups.push( groupObj );
586
- }
587
- }
588
- }
589
-
590
- // Now we have two kinds of list groups, groups rooted at a list, and groups rooted at a block limit element.
591
- // We either have to build lists or remove lists, for removing a list does not makes sense when we are looking
592
- // at the group that's not rooted at lists. So we have three cases to handle.
593
- var listsCreated = [];
594
- while ( listGroups.length > 0 )
595
- {
596
- groupObj = listGroups.shift();
597
- if ( this.state == CKEDITOR.TRISTATE_OFF )
598
- {
599
- if ( listNodeNames[ groupObj.root.getName() ] )
600
- changeListType.call( this, editor, groupObj, database, listsCreated );
601
- else
602
- createList.call( this, editor, groupObj, listsCreated );
603
- }
604
- else if ( this.state == CKEDITOR.TRISTATE_ON && listNodeNames[ groupObj.root.getName() ] )
605
- removeList.call( this, editor, groupObj, database );
606
- }
607
-
608
- // For all new lists created, merge adjacent, same type lists.
609
- for ( i = 0 ; i < listsCreated.length ; i++ )
610
- {
611
- listNode = listsCreated[i];
612
- var mergeSibling, listCommand = this;
613
- ( mergeSibling = function( rtl ){
614
-
615
- var sibling = listNode[ rtl ?
616
- 'getPrevious' : 'getNext' ]( CKEDITOR.dom.walker.whitespaces( true ) );
617
- if ( sibling && sibling.getName &&
618
- sibling.getName() == listCommand.type )
619
- {
620
- sibling.remove();
621
- // Move children order by merge direction.(#3820)
622
- sibling.moveChildren( listNode, rtl );
623
- }
624
- } )();
625
- mergeSibling( 1 );
626
- }
627
-
628
- // Clean up, restore selection and update toolbar button states.
629
- CKEDITOR.dom.element.clearAllMarkers( database );
630
- selection.selectBookmarks( bookmarks );
631
- editor.focus();
632
- }
633
- };
634
-
635
- var dtd = CKEDITOR.dtd;
636
- var tailNbspRegex = /[\t\r\n ]*(?:&nbsp;|\xa0)$/;
637
-
638
- function indexOfFirstChildElement( element, tagNameList )
639
- {
640
- var child,
641
- children = element.children,
642
- length = children.length;
643
-
644
- for ( var i = 0 ; i < length ; i++ )
645
- {
646
- child = children[ i ];
647
- if ( child.name && ( child.name in tagNameList ) )
648
- return i;
649
- }
650
-
651
- return length;
652
- }
653
-
654
- function getExtendNestedListFilter( isHtmlFilter )
655
- {
656
- // An element filter function that corrects nested list start in an empty
657
- // list item for better displaying/outputting. (#3165)
658
- return function( listItem )
659
- {
660
- var children = listItem.children,
661
- firstNestedListIndex = indexOfFirstChildElement( listItem, dtd.$list ),
662
- firstNestedList = children[ firstNestedListIndex ],
663
- nodeBefore = firstNestedList && firstNestedList.previous,
664
- tailNbspmatch;
665
-
666
- if ( nodeBefore
667
- && ( nodeBefore.name && nodeBefore.name == 'br'
668
- || nodeBefore.value && ( tailNbspmatch = nodeBefore.value.match( tailNbspRegex ) ) ) )
669
- {
670
- var fillerNode = nodeBefore;
671
-
672
- // Always use 'nbsp' as filler node if we found a nested list appear
673
- // in front of a list item.
674
- if ( !( tailNbspmatch && tailNbspmatch.index ) && fillerNode == children[ 0 ] )
675
- children[ 0 ] = ( isHtmlFilter || CKEDITOR.env.ie ) ?
676
- new CKEDITOR.htmlParser.text( '\xa0' ) :
677
- new CKEDITOR.htmlParser.element( 'br', {} );
678
-
679
- // Otherwise the filler is not needed anymore.
680
- else if ( fillerNode.name == 'br' )
681
- children.splice( firstNestedListIndex - 1, 1 );
682
- else
683
- fillerNode.value = fillerNode.value.replace( tailNbspRegex, '' );
684
- }
685
-
686
- };
687
- }
688
-
689
- var defaultListDataFilterRules = { elements : {} };
690
- for ( var i in dtd.$listItem )
691
- defaultListDataFilterRules.elements[ i ] = getExtendNestedListFilter();
692
-
693
- var defaultListHtmlFilterRules = { elements : {} };
694
- for ( i in dtd.$listItem )
695
- defaultListHtmlFilterRules.elements[ i ] = getExtendNestedListFilter( true );
696
-
697
- CKEDITOR.plugins.add( 'list',
698
- {
699
- init : function( editor )
700
- {
701
- // Register commands.
702
- var numberedListCommand = editor.addCommand( 'numberedlist', new listCommand( 'numberedlist', 'ol' ) ),
703
- bulletedListCommand = editor.addCommand( 'bulletedlist', new listCommand( 'bulletedlist', 'ul' ) );
704
-
705
- // Register the toolbar button.
706
- editor.ui.addButton( 'NumberedList',
707
- {
708
- label : editor.lang.numberedlist,
709
- command : 'numberedlist'
710
- } );
711
- editor.ui.addButton( 'BulletedList',
712
- {
713
- label : editor.lang.bulletedlist,
714
- command : 'bulletedlist'
715
- } );
716
-
717
- // Register the state changing handlers.
718
- editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, numberedListCommand ) );
719
- editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, bulletedListCommand ) );
720
- },
721
-
722
- afterInit : function ( editor )
723
- {
724
- var dataProcessor = editor.dataProcessor;
725
- if ( dataProcessor )
726
- {
727
- dataProcessor.dataFilter.addRules( defaultListDataFilterRules );
728
- dataProcessor.htmlFilter.addRules( defaultListHtmlFilterRules );
729
- }
730
- },
731
-
732
- requires : [ 'domiterator' ]
733
- } );
734
- })();
1
+ /*
2
+ Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
3
+ For licensing, see LICENSE.html or http://ckeditor.com/license
4
+ */
5
+
6
+ /**
7
+ * @file Insert and remove numbered and bulleted lists.
8
+ */
9
+
10
+ (function()
11
+ {
12
+ var listNodeNames = { ol : 1, ul : 1 },
13
+ emptyTextRegex = /^[\n\r\t ]*$/;
14
+
15
+ var whitespaces = CKEDITOR.dom.walker.whitespaces(),
16
+ bookmarks = CKEDITOR.dom.walker.bookmark(),
17
+ nonEmpty = function( node ){ return !( whitespaces( node ) || bookmarks( node ) );},
18
+ blockBogus = CKEDITOR.dom.walker.bogus();
19
+
20
+ function cleanUpDirection( element )
21
+ {
22
+ var dir, parent, parentDir;
23
+ if ( ( dir = element.getDirection() ) )
24
+ {
25
+ parent = element.getParent();
26
+ while ( parent && !( parentDir = parent.getDirection() ) )
27
+ parent = parent.getParent();
28
+
29
+ if ( dir == parentDir )
30
+ element.removeAttribute( 'dir' );
31
+ }
32
+ }
33
+
34
+ CKEDITOR.plugins.list = {
35
+ /*
36
+ * Convert a DOM list tree into a data structure that is easier to
37
+ * manipulate. This operation should be non-intrusive in the sense that it
38
+ * does not change the DOM tree, with the exception that it may add some
39
+ * markers to the list item nodes when database is specified.
40
+ */
41
+ listToArray : function( listNode, database, baseArray, baseIndentLevel, grandparentNode )
42
+ {
43
+ if ( !listNodeNames[ listNode.getName() ] )
44
+ return [];
45
+
46
+ if ( !baseIndentLevel )
47
+ baseIndentLevel = 0;
48
+ if ( !baseArray )
49
+ baseArray = [];
50
+
51
+ // Iterate over all list items to and look for inner lists.
52
+ for ( var i = 0, count = listNode.getChildCount() ; i < count ; i++ )
53
+ {
54
+ var listItem = listNode.getChild( i );
55
+
56
+ // Fixing malformed nested lists by moving it into a previous list item. (#6236)
57
+ if( listItem.type == CKEDITOR.NODE_ELEMENT && listItem.getName() in CKEDITOR.dtd.$list )
58
+ CKEDITOR.plugins.list.listToArray( listItem, database, baseArray, baseIndentLevel + 1 );
59
+
60
+ // It may be a text node or some funny stuff.
61
+ if ( listItem.$.nodeName.toLowerCase() != 'li' )
62
+ continue;
63
+
64
+ var itemObj = { 'parent' : listNode, indent : baseIndentLevel, element : listItem, contents : [] };
65
+ if ( !grandparentNode )
66
+ {
67
+ itemObj.grandparent = listNode.getParent();
68
+ if ( itemObj.grandparent && itemObj.grandparent.$.nodeName.toLowerCase() == 'li' )
69
+ itemObj.grandparent = itemObj.grandparent.getParent();
70
+ }
71
+ else
72
+ itemObj.grandparent = grandparentNode;
73
+
74
+ if ( database )
75
+ CKEDITOR.dom.element.setMarker( database, listItem, 'listarray_index', baseArray.length );
76
+ baseArray.push( itemObj );
77
+
78
+ for ( var j = 0, itemChildCount = listItem.getChildCount(), child; j < itemChildCount ; j++ )
79
+ {
80
+ child = listItem.getChild( j );
81
+ if ( child.type == CKEDITOR.NODE_ELEMENT && listNodeNames[ child.getName() ] )
82
+ // Note the recursion here, it pushes inner list items with
83
+ // +1 indentation in the correct order.
84
+ CKEDITOR.plugins.list.listToArray( child, database, baseArray, baseIndentLevel + 1, itemObj.grandparent );
85
+ else
86
+ itemObj.contents.push( child );
87
+ }
88
+ }
89
+ return baseArray;
90
+ },
91
+
92
+ // Convert our internal representation of a list back to a DOM forest.
93
+ arrayToList : function( listArray, database, baseIndex, paragraphMode, dir )
94
+ {
95
+ if ( !baseIndex )
96
+ baseIndex = 0;
97
+ if ( !listArray || listArray.length < baseIndex + 1 )
98
+ return null;
99
+ var i,
100
+ doc = listArray[ baseIndex ].parent.getDocument(),
101
+ retval = new CKEDITOR.dom.documentFragment( doc ),
102
+ rootNode = null,
103
+ currentIndex = baseIndex,
104
+ indentLevel = Math.max( listArray[ baseIndex ].indent, 0 ),
105
+ currentListItem = null,
106
+ orgDir,
107
+ block,
108
+ paragraphName = ( paragraphMode == CKEDITOR.ENTER_P ? 'p' : 'div' );
109
+ while ( 1 )
110
+ {
111
+ var item = listArray[ currentIndex ];
112
+
113
+ orgDir = item.element.getDirection( 1 );
114
+
115
+ if ( item.indent == indentLevel )
116
+ {
117
+ if ( !rootNode || listArray[ currentIndex ].parent.getName() != rootNode.getName() )
118
+ {
119
+ rootNode = listArray[ currentIndex ].parent.clone( false, 1 );
120
+ dir && rootNode.setAttribute( 'dir', dir );
121
+ retval.append( rootNode );
122
+ }
123
+ currentListItem = rootNode.append( item.element.clone( 0, 1 ) );
124
+
125
+ if ( orgDir != rootNode.getDirection( 1 ) )
126
+ currentListItem.setAttribute( 'dir', orgDir );
127
+
128
+ for ( i = 0 ; i < item.contents.length ; i++ )
129
+ currentListItem.append( item.contents[i].clone( 1, 1 ) );
130
+ currentIndex++;
131
+ }
132
+ else if ( item.indent == Math.max( indentLevel, 0 ) + 1 )
133
+ {
134
+ // Maintain original direction (#6861).
135
+ var currDir = listArray[ currentIndex - 1 ].element.getDirection( 1 ),
136
+ listData = CKEDITOR.plugins.list.arrayToList( listArray, null, currentIndex, paragraphMode,
137
+ currDir != orgDir ? orgDir: null );
138
+
139
+ // If the next block is an <li> with another list tree as the first
140
+ // child, we'll need to append a filler (<br>/NBSP) or the list item
141
+ // wouldn't be editable. (#6724)
142
+ if ( !currentListItem.getChildCount() && CKEDITOR.env.ie && !( doc.$.documentMode > 7 ))
143
+ currentListItem.append( doc.createText( '\xa0' ) );
144
+ currentListItem.append( listData.listNode );
145
+ currentIndex = listData.nextIndex;
146
+ }
147
+ else if ( item.indent == -1 && !baseIndex && item.grandparent )
148
+ {
149
+ if ( listNodeNames[ item.grandparent.getName() ] )
150
+ currentListItem = item.element.clone( false, true );
151
+ else
152
+ currentListItem = new CKEDITOR.dom.documentFragment( doc );
153
+
154
+ // Migrate all children to the new container,
155
+ // apply the proper text direction.
156
+ var dirLoose = item.grandparent.getDirection( 1 ) != orgDir,
157
+ needsBlock = currentListItem.type == CKEDITOR.NODE_DOCUMENT_FRAGMENT &&
158
+ paragraphMode != CKEDITOR.ENTER_BR,
159
+ li = item.element,
160
+ className = li.getAttribute( 'class' ),
161
+ style = li.getAttribute( 'style' );
162
+
163
+ var child, count = item.contents.length;
164
+ for ( i = 0 ; i < count; i++ )
165
+ {
166
+ child = item.contents[ i ];
167
+
168
+ if ( child.type == CKEDITOR.NODE_ELEMENT && child.isBlockBoundary() )
169
+ {
170
+ // Apply direction on content blocks.
171
+ if ( dirLoose && !child.getDirection() )
172
+ child.setAttribute( 'dir', orgDir );
173
+
174
+ // Merge into child styles.
175
+ style && child.setAttribute( 'style',
176
+ style.replace( /([^;])$/, '$1;') +
177
+ ( child.getAttribute( 'style' ) || '' ) );
178
+
179
+ className && child.addClass( className );
180
+ }
181
+ else if ( dirLoose || needsBlock || style || className )
182
+ {
183
+ // Establish new block to hold text direction and styles.
184
+ if ( !block )
185
+ {
186
+ block = doc.createElement( paragraphName );
187
+ dirLoose && block.setAttribute( 'dir', orgDir );
188
+ }
189
+
190
+ // Copy over styles to new block;
191
+ style && block.setAttribute( 'style', style );
192
+ className && block.setAttribute( 'class', className );
193
+
194
+ block.append( child.clone( 1, 1 ) );
195
+ }
196
+
197
+ currentListItem.append( block || child.clone( 1, 1 ) );
198
+ }
199
+
200
+ if ( currentListItem.type == CKEDITOR.NODE_DOCUMENT_FRAGMENT
201
+ && currentIndex != listArray.length - 1 )
202
+ {
203
+ var last = currentListItem.getLast();
204
+ if ( last && last.type == CKEDITOR.NODE_ELEMENT
205
+ && last.getAttribute( 'type' ) == '_moz' )
206
+ {
207
+ last.remove();
208
+ }
209
+
210
+ if ( !( last = currentListItem.getLast( nonEmpty )
211
+ && last.type == CKEDITOR.NODE_ELEMENT
212
+ && last.getName() in CKEDITOR.dtd.$block ) )
213
+ {
214
+ currentListItem.append( doc.createElement( 'br' ) );
215
+ }
216
+ }
217
+
218
+ var currentListItemName = currentListItem.$.nodeName.toLowerCase();
219
+ if ( !CKEDITOR.env.ie && ( currentListItemName == 'div' || currentListItemName == 'p' ) )
220
+ currentListItem.appendBogus();
221
+ retval.append( currentListItem );
222
+ rootNode = null;
223
+ currentIndex++;
224
+ }
225
+ else
226
+ return null;
227
+
228
+ block = null;
229
+
230
+ if ( listArray.length <= currentIndex || Math.max( listArray[ currentIndex ].indent, 0 ) < indentLevel )
231
+ break;
232
+ }
233
+
234
+ if ( database )
235
+ {
236
+ var currentNode = retval.getFirst(),
237
+ listRoot = listArray[ 0 ].parent;
238
+
239
+ while ( currentNode )
240
+ {
241
+ if ( currentNode.type == CKEDITOR.NODE_ELEMENT )
242
+ {
243
+ // Clear marker attributes for the new list tree made of cloned nodes, if any.
244
+ CKEDITOR.dom.element.clearMarkers( database, currentNode );
245
+
246
+ // Clear redundant direction attribute specified on list items.
247
+ if ( currentNode.getName() in CKEDITOR.dtd.$listItem )
248
+ cleanUpDirection( currentNode );
249
+ }
250
+
251
+ currentNode = currentNode.getNextSourceNode();
252
+ }
253
+ }
254
+
255
+ return { listNode : retval, nextIndex : currentIndex };
256
+ }
257
+ };
258
+
259
+ function onSelectionChange( evt )
260
+ {
261
+ if ( evt.editor.readOnly )
262
+ return null;
263
+
264
+ var path = evt.data.path,
265
+ blockLimit = path.blockLimit,
266
+ elements = path.elements,
267
+ element,
268
+ i;
269
+
270
+ // Grouping should only happen under blockLimit.(#3940).
271
+ for ( i = 0 ; i < elements.length && ( element = elements[ i ] )
272
+ && !element.equals( blockLimit ); i++ )
273
+ {
274
+ if ( listNodeNames[ elements[ i ].getName() ] )
275
+ return this.setState( this.type == elements[ i ].getName() ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF );
276
+ }
277
+
278
+ return this.setState( CKEDITOR.TRISTATE_OFF );
279
+ }
280
+
281
+ function changeListType( editor, groupObj, database, listsCreated )
282
+ {
283
+ // This case is easy...
284
+ // 1. Convert the whole list into a one-dimensional array.
285
+ // 2. Change the list type by modifying the array.
286
+ // 3. Recreate the whole list by converting the array to a list.
287
+ // 4. Replace the original list with the recreated list.
288
+ var listArray = CKEDITOR.plugins.list.listToArray( groupObj.root, database ),
289
+ selectedListItems = [];
290
+
291
+ for ( var i = 0 ; i < groupObj.contents.length ; i++ )
292
+ {
293
+ var itemNode = groupObj.contents[i];
294
+ itemNode = itemNode.getAscendant( 'li', true );
295
+ if ( !itemNode || itemNode.getCustomData( 'list_item_processed' ) )
296
+ continue;
297
+ selectedListItems.push( itemNode );
298
+ CKEDITOR.dom.element.setMarker( database, itemNode, 'list_item_processed', true );
299
+ }
300
+
301
+ var root = groupObj.root,
302
+ fakeParent = root.getDocument().createElement( this.type );
303
+ // Copy all attributes, except from 'start' and 'type'.
304
+ root.copyAttributes( fakeParent, { start : 1, type : 1 } );
305
+ // The list-style-type property should be ignored.
306
+ fakeParent.removeStyle( 'list-style-type' );
307
+
308
+ for ( i = 0 ; i < selectedListItems.length ; i++ )
309
+ {
310
+ var listIndex = selectedListItems[i].getCustomData( 'listarray_index' );
311
+ listArray[listIndex].parent = fakeParent;
312
+ }
313
+ var newList = CKEDITOR.plugins.list.arrayToList( listArray, database, null, editor.config.enterMode );
314
+ var child, length = newList.listNode.getChildCount();
315
+ for ( i = 0 ; i < length && ( child = newList.listNode.getChild( i ) ) ; i++ )
316
+ {
317
+ if ( child.getName() == this.type )
318
+ listsCreated.push( child );
319
+ }
320
+ newList.listNode.replace( groupObj.root );
321
+ }
322
+
323
+ var headerTagRegex = /^h[1-6]$/;
324
+
325
+ function createList( editor, groupObj, listsCreated )
326
+ {
327
+ var contents = groupObj.contents,
328
+ doc = groupObj.root.getDocument(),
329
+ listContents = [];
330
+
331
+ // It is possible to have the contents returned by DomRangeIterator to be the same as the root.
332
+ // e.g. when we're running into table cells.
333
+ // In such a case, enclose the childNodes of contents[0] into a <div>.
334
+ if ( contents.length == 1 && contents[0].equals( groupObj.root ) )
335
+ {
336
+ var divBlock = doc.createElement( 'div' );
337
+ contents[0].moveChildren && contents[0].moveChildren( divBlock );
338
+ contents[0].append( divBlock );
339
+ contents[0] = divBlock;
340
+ }
341
+
342
+ // Calculate the common parent node of all content blocks.
343
+ var commonParent = groupObj.contents[0].getParent();
344
+ for ( var i = 0 ; i < contents.length ; i++ )
345
+ commonParent = commonParent.getCommonAncestor( contents[i].getParent() );
346
+
347
+ var useComputedState = editor.config.useComputedState,
348
+ listDir, explicitDirection;
349
+
350
+ useComputedState = useComputedState === undefined || useComputedState;
351
+
352
+ // We want to insert things that are in the same tree level only, so calculate the contents again
353
+ // by expanding the selected blocks to the same tree level.
354
+ for ( i = 0 ; i < contents.length ; i++ )
355
+ {
356
+ var contentNode = contents[i],
357
+ parentNode;
358
+ while ( ( parentNode = contentNode.getParent() ) )
359
+ {
360
+ if ( parentNode.equals( commonParent ) )
361
+ {
362
+ listContents.push( contentNode );
363
+
364
+ // Determine the lists's direction.
365
+ if ( !explicitDirection && contentNode.getDirection() )
366
+ explicitDirection = 1;
367
+
368
+ var itemDir = contentNode.getDirection( useComputedState );
369
+
370
+ if ( listDir !== null )
371
+ {
372
+ // If at least one LI have a different direction than current listDir, we can't have listDir.
373
+ if ( listDir && listDir != itemDir )
374
+ listDir = null;
375
+ else
376
+ listDir = itemDir;
377
+ }
378
+
379
+ break;
380
+ }
381
+ contentNode = parentNode;
382
+ }
383
+ }
384
+
385
+ if ( listContents.length < 1 )
386
+ return;
387
+
388
+ // Insert the list to the DOM tree.
389
+ var insertAnchor = listContents[ listContents.length - 1 ].getNext(),
390
+ listNode = doc.createElement( this.type );
391
+
392
+ listsCreated.push( listNode );
393
+
394
+ var contentBlock, listItem;
395
+
396
+ while ( listContents.length )
397
+ {
398
+ contentBlock = listContents.shift();
399
+ listItem = doc.createElement( 'li' );
400
+
401
+ // Preserve preformat block and heading structure when converting to list item. (#5335) (#5271)
402
+ if ( contentBlock.is( 'pre' ) || headerTagRegex.test( contentBlock.getName() ) )
403
+ contentBlock.appendTo( listItem );
404
+ else
405
+ {
406
+ contentBlock.copyAttributes( listItem );
407
+ // Remove direction attribute after it was merged into list root. (#7657)
408
+ if ( listDir && contentBlock.getDirection() )
409
+ {
410
+ listItem.removeStyle( 'direction' );
411
+ listItem.removeAttribute( 'dir' );
412
+ }
413
+ contentBlock.moveChildren( listItem );
414
+ contentBlock.remove();
415
+ }
416
+
417
+ listItem.appendTo( listNode );
418
+ }
419
+
420
+ // Apply list root dir only if it has been explicitly declared.
421
+ if ( listDir && explicitDirection )
422
+ listNode.setAttribute( 'dir', listDir );
423
+
424
+ if ( insertAnchor )
425
+ listNode.insertBefore( insertAnchor );
426
+ else
427
+ listNode.appendTo( commonParent );
428
+ }
429
+
430
+ function removeList( editor, groupObj, database )
431
+ {
432
+ // This is very much like the change list type operation.
433
+ // Except that we're changing the selected items' indent to -1 in the list array.
434
+ var listArray = CKEDITOR.plugins.list.listToArray( groupObj.root, database ),
435
+ selectedListItems = [];
436
+
437
+ for ( var i = 0 ; i < groupObj.contents.length ; i++ )
438
+ {
439
+ var itemNode = groupObj.contents[i];
440
+ itemNode = itemNode.getAscendant( 'li', true );
441
+ if ( !itemNode || itemNode.getCustomData( 'list_item_processed' ) )
442
+ continue;
443
+ selectedListItems.push( itemNode );
444
+ CKEDITOR.dom.element.setMarker( database, itemNode, 'list_item_processed', true );
445
+ }
446
+
447
+ var lastListIndex = null;
448
+ for ( i = 0 ; i < selectedListItems.length ; i++ )
449
+ {
450
+ var listIndex = selectedListItems[i].getCustomData( 'listarray_index' );
451
+ listArray[listIndex].indent = -1;
452
+ lastListIndex = listIndex;
453
+ }
454
+
455
+ // After cutting parts of the list out with indent=-1, we still have to maintain the array list
456
+ // model's nextItem.indent <= currentItem.indent + 1 invariant. Otherwise the array model of the
457
+ // list cannot be converted back to a real DOM list.
458
+ for ( i = lastListIndex + 1 ; i < listArray.length ; i++ )
459
+ {
460
+ if ( listArray[i].indent > listArray[i-1].indent + 1 )
461
+ {
462
+ var indentOffset = listArray[i-1].indent + 1 - listArray[i].indent;
463
+ var oldIndent = listArray[i].indent;
464
+ while ( listArray[i] && listArray[i].indent >= oldIndent )
465
+ {
466
+ listArray[i].indent += indentOffset;
467
+ i++;
468
+ }
469
+ i--;
470
+ }
471
+ }
472
+
473
+ var newList = CKEDITOR.plugins.list.arrayToList( listArray, database, null, editor.config.enterMode,
474
+ groupObj.root.getAttribute( 'dir' ) );
475
+
476
+ // Compensate <br> before/after the list node if the surrounds are non-blocks.(#3836)
477
+ var docFragment = newList.listNode, boundaryNode, siblingNode;
478
+ function compensateBrs( isStart )
479
+ {
480
+ if ( ( boundaryNode = docFragment[ isStart ? 'getFirst' : 'getLast' ]() )
481
+ && !( boundaryNode.is && boundaryNode.isBlockBoundary() )
482
+ && ( siblingNode = groupObj.root[ isStart ? 'getPrevious' : 'getNext' ]
483
+ ( CKEDITOR.dom.walker.whitespaces( true ) ) )
484
+ && !( siblingNode.is && siblingNode.isBlockBoundary( { br : 1 } ) ) )
485
+ editor.document.createElement( 'br' )[ isStart ? 'insertBefore' : 'insertAfter' ]( boundaryNode );
486
+ }
487
+ compensateBrs( true );
488
+ compensateBrs();
489
+
490
+ docFragment.replace( groupObj.root );
491
+ }
492
+
493
+ function listCommand( name, type )
494
+ {
495
+ this.name = name;
496
+ this.type = type;
497
+ }
498
+
499
+ var elementType = CKEDITOR.dom.walker.nodeType( CKEDITOR.NODE_ELEMENT );
500
+ // Merge list items with direction preserved. (#7448)
501
+ function mergeListItems( from, into, refNode, toHead )
502
+ {
503
+ var child, itemDir;
504
+ while ( ( child = from.getFirst( elementType ) ) )
505
+ {
506
+ if ( ( itemDir = child.getDirection( 1 ) ) !== into.getDirection( 1 ) )
507
+ child.setAttribute( 'dir', itemDir );
508
+
509
+ child.remove();
510
+
511
+ refNode ?
512
+ child[ toHead ? 'insertBefore' : 'insertAfter' ]( refNode ) :
513
+ into.append( child, toHead );
514
+ }
515
+ }
516
+
517
+ listCommand.prototype = {
518
+ exec : function( editor )
519
+ {
520
+ var doc = editor.document,
521
+ config = editor.config,
522
+ selection = editor.getSelection(),
523
+ ranges = selection && selection.getRanges( true );
524
+
525
+ // There should be at least one selected range.
526
+ if ( !ranges || ranges.length < 1 )
527
+ return;
528
+
529
+ // Midas lists rule #1 says we can create a list even in an empty document.
530
+ // But DOM iterator wouldn't run if the document is really empty.
531
+ // So create a paragraph if the document is empty and we're going to create a list.
532
+ if ( this.state == CKEDITOR.TRISTATE_OFF )
533
+ {
534
+ var body = doc.getBody();
535
+ if ( !body.getFirst( nonEmpty ) )
536
+ {
537
+ config.enterMode == CKEDITOR.ENTER_BR ?
538
+ body.appendBogus() :
539
+ ranges[ 0 ].fixBlock( 1, config.enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' );
540
+
541
+ selection.selectRanges( ranges );
542
+ }
543
+ // Maybe a single range there enclosing the whole list,
544
+ // turn on the list state manually(#4129).
545
+ else
546
+ {
547
+ var range = ranges.length == 1 && ranges[ 0 ],
548
+ enclosedNode = range && range.getEnclosedNode();
549
+ if ( enclosedNode && enclosedNode.is
550
+ && this.type == enclosedNode.getName() )
551
+ this.setState( CKEDITOR.TRISTATE_ON );
552
+ }
553
+ }
554
+
555
+ var bookmarks = selection.createBookmarks( true );
556
+
557
+ // Group the blocks up because there are many cases where multiple lists have to be created,
558
+ // or multiple lists have to be cancelled.
559
+ var listGroups = [],
560
+ database = {},
561
+ rangeIterator = ranges.createIterator(),
562
+ index = 0;
563
+
564
+ while ( ( range = rangeIterator.getNextRange() ) && ++index )
565
+ {
566
+ var boundaryNodes = range.getBoundaryNodes(),
567
+ startNode = boundaryNodes.startNode,
568
+ endNode = boundaryNodes.endNode;
569
+
570
+ if ( startNode.type == CKEDITOR.NODE_ELEMENT && startNode.getName() == 'td' )
571
+ range.setStartAt( boundaryNodes.startNode, CKEDITOR.POSITION_AFTER_START );
572
+
573
+ if ( endNode.type == CKEDITOR.NODE_ELEMENT && endNode.getName() == 'td' )
574
+ range.setEndAt( boundaryNodes.endNode, CKEDITOR.POSITION_BEFORE_END );
575
+
576
+ var iterator = range.createIterator(),
577
+ block;
578
+
579
+ iterator.forceBrBreak = ( this.state == CKEDITOR.TRISTATE_OFF );
580
+
581
+ while ( ( block = iterator.getNextParagraph() ) )
582
+ {
583
+ // Avoid duplicate blocks get processed across ranges.
584
+ if( block.getCustomData( 'list_block' ) )
585
+ continue;
586
+ else
587
+ CKEDITOR.dom.element.setMarker( database, block, 'list_block', 1 );
588
+
589
+ var path = new CKEDITOR.dom.elementPath( block ),
590
+ pathElements = path.elements,
591
+ pathElementsCount = pathElements.length,
592
+ listNode = null,
593
+ processedFlag = 0,
594
+ blockLimit = path.blockLimit,
595
+ element;
596
+
597
+ // First, try to group by a list ancestor.
598
+ for ( var i = pathElementsCount - 1; i >= 0 && ( element = pathElements[ i ] ); i-- )
599
+ {
600
+ if ( listNodeNames[ element.getName() ]
601
+ && blockLimit.contains( element ) ) // Don't leak outside block limit (#3940).
602
+ {
603
+ // If we've encountered a list inside a block limit
604
+ // The last group object of the block limit element should
605
+ // no longer be valid. Since paragraphs after the list
606
+ // should belong to a different group of paragraphs before
607
+ // the list. (Bug #1309)
608
+ blockLimit.removeCustomData( 'list_group_object_' + index );
609
+
610
+ var groupObj = element.getCustomData( 'list_group_object' );
611
+ if ( groupObj )
612
+ groupObj.contents.push( block );
613
+ else
614
+ {
615
+ groupObj = { root : element, contents : [ block ] };
616
+ listGroups.push( groupObj );
617
+ CKEDITOR.dom.element.setMarker( database, element, 'list_group_object', groupObj );
618
+ }
619
+ processedFlag = 1;
620
+ break;
621
+ }
622
+ }
623
+
624
+ if ( processedFlag )
625
+ continue;
626
+
627
+ // No list ancestor? Group by block limit, but don't mix contents from different ranges.
628
+ var root = blockLimit;
629
+ if ( root.getCustomData( 'list_group_object_' + index ) )
630
+ root.getCustomData( 'list_group_object_' + index ).contents.push( block );
631
+ else
632
+ {
633
+ groupObj = { root : root, contents : [ block ] };
634
+ CKEDITOR.dom.element.setMarker( database, root, 'list_group_object_' + index, groupObj );
635
+ listGroups.push( groupObj );
636
+ }
637
+ }
638
+ }
639
+
640
+ // Now we have two kinds of list groups, groups rooted at a list, and groups rooted at a block limit element.
641
+ // We either have to build lists or remove lists, for removing a list does not makes sense when we are looking
642
+ // at the group that's not rooted at lists. So we have three cases to handle.
643
+ var listsCreated = [];
644
+ while ( listGroups.length > 0 )
645
+ {
646
+ groupObj = listGroups.shift();
647
+ if ( this.state == CKEDITOR.TRISTATE_OFF )
648
+ {
649
+ if ( listNodeNames[ groupObj.root.getName() ] )
650
+ changeListType.call( this, editor, groupObj, database, listsCreated );
651
+ else
652
+ createList.call( this, editor, groupObj, listsCreated );
653
+ }
654
+ else if ( this.state == CKEDITOR.TRISTATE_ON && listNodeNames[ groupObj.root.getName() ] )
655
+ removeList.call( this, editor, groupObj, database );
656
+ }
657
+
658
+ // For all new lists created, merge into adjacent, same type lists.
659
+ for ( i = 0 ; i < listsCreated.length ; i++ )
660
+ {
661
+ listNode = listsCreated[i];
662
+ var mergeSibling, listCommand = this;
663
+ ( mergeSibling = function( rtl )
664
+ {
665
+
666
+ var sibling = listNode[ rtl ?
667
+ 'getPrevious' : 'getNext' ]( CKEDITOR.dom.walker.whitespaces( true ) );
668
+ if ( sibling && sibling.getName &&
669
+ sibling.getName() == listCommand.type )
670
+ {
671
+ // Move children order by merge direction.(#3820)
672
+ mergeListItems( listNode, sibling, null, !rtl );
673
+
674
+ listNode.remove();
675
+ listNode = sibling;
676
+ }
677
+ } )();
678
+ mergeSibling( 1 );
679
+ }
680
+
681
+ // Clean up, restore selection and update toolbar button states.
682
+ CKEDITOR.dom.element.clearAllMarkers( database );
683
+ selection.selectBookmarks( bookmarks );
684
+ editor.focus();
685
+ }
686
+ };
687
+
688
+ var dtd = CKEDITOR.dtd;
689
+ var tailNbspRegex = /[\t\r\n ]*(?:&nbsp;|\xa0)$/;
690
+
691
+ function indexOfFirstChildElement( element, tagNameList )
692
+ {
693
+ var child,
694
+ children = element.children,
695
+ length = children.length;
696
+
697
+ for ( var i = 0 ; i < length ; i++ )
698
+ {
699
+ child = children[ i ];
700
+ if ( child.name && ( child.name in tagNameList ) )
701
+ return i;
702
+ }
703
+
704
+ return length;
705
+ }
706
+
707
+ function getExtendNestedListFilter( isHtmlFilter )
708
+ {
709
+ // An element filter function that corrects nested list start in an empty
710
+ // list item for better displaying/outputting. (#3165)
711
+ return function( listItem )
712
+ {
713
+ var children = listItem.children,
714
+ firstNestedListIndex = indexOfFirstChildElement( listItem, dtd.$list ),
715
+ firstNestedList = children[ firstNestedListIndex ],
716
+ nodeBefore = firstNestedList && firstNestedList.previous,
717
+ tailNbspmatch;
718
+
719
+ if ( nodeBefore
720
+ && ( nodeBefore.name && nodeBefore.name == 'br'
721
+ || nodeBefore.value && ( tailNbspmatch = nodeBefore.value.match( tailNbspRegex ) ) ) )
722
+ {
723
+ var fillerNode = nodeBefore;
724
+
725
+ // Always use 'nbsp' as filler node if we found a nested list appear
726
+ // in front of a list item.
727
+ if ( !( tailNbspmatch && tailNbspmatch.index ) && fillerNode == children[ 0 ] )
728
+ children[ 0 ] = ( isHtmlFilter || CKEDITOR.env.ie ) ?
729
+ new CKEDITOR.htmlParser.text( '\xa0' ) :
730
+ new CKEDITOR.htmlParser.element( 'br', {} );
731
+
732
+ // Otherwise the filler is not needed anymore.
733
+ else if ( fillerNode.name == 'br' )
734
+ children.splice( firstNestedListIndex - 1, 1 );
735
+ else
736
+ fillerNode.value = fillerNode.value.replace( tailNbspRegex, '' );
737
+ }
738
+
739
+ };
740
+ }
741
+
742
+ var defaultListDataFilterRules = { elements : {} };
743
+ for ( var i in dtd.$listItem )
744
+ defaultListDataFilterRules.elements[ i ] = getExtendNestedListFilter();
745
+
746
+ var defaultListHtmlFilterRules = { elements : {} };
747
+ for ( i in dtd.$listItem )
748
+ defaultListHtmlFilterRules.elements[ i ] = getExtendNestedListFilter( true );
749
+
750
+ // Check if node is block element that recieves text.
751
+ function isTextBlock( node )
752
+ {
753
+ return node.type == CKEDITOR.NODE_ELEMENT &&
754
+ ( node.getName() in CKEDITOR.dtd.$block ||
755
+ node.getName() in CKEDITOR.dtd.$listItem ) &&
756
+ CKEDITOR.dtd[ node.getName() ][ '#' ];
757
+ }
758
+
759
+ // Merge the visual line content at the cursor range into the block.
760
+ function joinNextLineToCursor( editor, cursor, nextCursor )
761
+ {
762
+ editor.fire( 'saveSnapshot' );
763
+
764
+ // Merge with previous block's content.
765
+ nextCursor.enlarge( CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS );
766
+ var frag = nextCursor.extractContents();
767
+
768
+ cursor.trim( false, true );
769
+
770
+ // Kill original bogus;
771
+ var currentPath = new CKEDITOR.dom.elementPath( cursor.startContainer );
772
+ var currentLi = currentPath.lastElement.getAscendant( 'li', 1 );
773
+
774
+ var bogus = currentPath.block.getBogus();
775
+ bogus && bogus.remove();
776
+
777
+ // Kill the tail br in extracted.
778
+ var last = frag.getLast();
779
+ if ( last && last.type == CKEDITOR.NODE_ELEMENT && last.is( 'br' ) )
780
+ last.remove();
781
+
782
+ // Insert fragment at the range position.
783
+ var nextNode = cursor.startContainer.getChild( cursor.startOffset );
784
+ if ( nextNode )
785
+ frag.insertBefore( nextNode );
786
+ else
787
+ cursor.startContainer.append( frag );
788
+
789
+ var nextPath = new CKEDITOR.dom.elementPath( nextCursor.startContainer );
790
+ var nextLi = nextCursor.startContainer.getAscendant( 'li', 1 );
791
+
792
+ // Move the sub list nested in the next list item.
793
+ if ( nextLi )
794
+ {
795
+ var sublist = getSubList( nextLi );
796
+ if ( sublist )
797
+ {
798
+ // If next line is in the sub list of the current list item.
799
+ if ( currentLi.contains( nextLi ) )
800
+ {
801
+ mergeListItems( sublist, nextLi.getParent(), nextLi );
802
+ sublist.remove();
803
+ }
804
+ // Migrate the sub list to current list item.
805
+ else
806
+ currentLi.append( sublist );
807
+ }
808
+ }
809
+
810
+
811
+ if ( nextCursor.checkStartOfBlock() &&
812
+ nextCursor.checkEndOfBlock() )
813
+ {
814
+ var nextBlock = nextPath.block,
815
+ parentBlock = nextBlock.getParent();
816
+
817
+ nextBlock.remove();
818
+
819
+ // Remove if the path block container is now empty, e.g. li.
820
+ if ( parentBlock &&
821
+ !parentBlock.getFirst( nonEmpty ) &&
822
+ !parentBlock.equals( nextPath.blockLimit ) )
823
+ {
824
+ parentBlock.remove();
825
+ }
826
+ }
827
+
828
+ // Make fresh selection.
829
+ cursor.select();
830
+
831
+ editor.fire( 'saveSnapshot' );
832
+ }
833
+
834
+ function getSubList( li )
835
+ {
836
+ var last = li.getLast( nonEmpty );
837
+ return last && last.type == CKEDITOR.NODE_ELEMENT && last.getName() in listNodeNames ? last : null;
838
+ }
839
+
840
+ CKEDITOR.plugins.add( 'list',
841
+ {
842
+ init : function( editor )
843
+ {
844
+ // Register commands.
845
+ var numberedListCommand = editor.addCommand( 'numberedlist', new listCommand( 'numberedlist', 'ol' ) ),
846
+ bulletedListCommand = editor.addCommand( 'bulletedlist', new listCommand( 'bulletedlist', 'ul' ) );
847
+
848
+ // Register the toolbar button.
849
+ editor.ui.addButton( 'NumberedList',
850
+ {
851
+ label : editor.lang.numberedlist,
852
+ command : 'numberedlist'
853
+ } );
854
+ editor.ui.addButton( 'BulletedList',
855
+ {
856
+ label : editor.lang.bulletedlist,
857
+ command : 'bulletedlist'
858
+ } );
859
+
860
+ // Register the state changing handlers.
861
+ editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, numberedListCommand ) );
862
+ editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, bulletedListCommand ) );
863
+
864
+ // [IE8] Fix "backspace" after list and "del" at the end of list item. (#8248)
865
+ if ( CKEDITOR.env.ie8Compat )
866
+ {
867
+ editor.on( 'key', function( evt )
868
+ {
869
+ var key = evt.data.keyCode;
870
+
871
+ // DEl/BACKSPACE
872
+ if ( editor.mode == 'wysiwyg' && key in { 8 : 1, 46 : 1 } )
873
+ {
874
+ var sel = editor.getSelection(),
875
+ range = sel.getRanges()[ 0 ];
876
+
877
+ if ( !range.collapsed )
878
+ return;
879
+
880
+ var isBackspace = key == 8;
881
+ var body = editor.document.getBody();
882
+ var walker = new CKEDITOR.dom.walker( range.clone() );
883
+ walker.evaluator = function( node ) { return nonEmpty( node ) && !blockBogus( node ); };
884
+
885
+ var cursor = range.clone();
886
+
887
+ if ( isBackspace )
888
+ {
889
+ walker.range.setStartAt( body, CKEDITOR.POSITION_AFTER_START );
890
+ walker.range.setEnd( range.startContainer, range.startOffset );
891
+
892
+ var previous = walker.previous();
893
+
894
+ // Check if cursor collapsed right behind of a list.
895
+ if ( previous &&
896
+ previous.type == CKEDITOR.NODE_ELEMENT &&
897
+ previous.getName() in listNodeNames )
898
+ {
899
+ walker.range.selectNodeContents( previous );
900
+ walker.reset();
901
+ walker.evaluator = isTextBlock;
902
+
903
+ // Place cursor at the end of previous block.
904
+ cursor.moveToElementEditEnd( walker.lastForward() );
905
+ joinNextLineToCursor( editor, cursor, range );
906
+ evt.cancel();
907
+ }
908
+ }
909
+ else
910
+ {
911
+ var li = range.startContainer.getAscendant( 'li', 1 );
912
+ if ( li )
913
+ {
914
+ walker.range.setEndAt( body, CKEDITOR.POSITION_BEFORE_END );
915
+
916
+ var last = li.getLast( nonEmpty );
917
+ var block = last && isTextBlock( last ) ? last : li;
918
+
919
+ // Indicate cursor at the visual end of an list item.
920
+ var isAtEnd = 0;
921
+
922
+ var next = walker.next();
923
+
924
+ // When list item contains a sub list.
925
+ if ( next && next.type == CKEDITOR.NODE_ELEMENT &&
926
+ next.getName() in listNodeNames
927
+ && next.equals( last ) )
928
+ {
929
+ isAtEnd = 1;
930
+
931
+ // Move to the first item in sub list.
932
+ next = walker.next();
933
+ }
934
+ // Right at the end of list item.
935
+ else if ( range.checkBoundaryOfElement( block, CKEDITOR.END ) )
936
+ isAtEnd = 1;
937
+
938
+
939
+ if ( isAtEnd && next )
940
+ {
941
+ // Put cursor range there.
942
+ var nextLine = range.clone();
943
+ nextLine.moveToElementEditStart( next );
944
+
945
+ joinNextLineToCursor( editor, cursor, nextLine );
946
+ evt.cancel();
947
+ }
948
+ }
949
+ }
950
+ }
951
+ } );
952
+ }
953
+ },
954
+
955
+ afterInit : function ( editor )
956
+ {
957
+ var dataProcessor = editor.dataProcessor;
958
+ if ( dataProcessor )
959
+ {
960
+ dataProcessor.dataFilter.addRules( defaultListDataFilterRules );
961
+ dataProcessor.htmlFilter.addRules( defaultListHtmlFilterRules );
962
+ }
963
+ },
964
+
965
+ requires : [ 'domiterator' ]
966
+ } );
967
+ })();