ckeditor-rails 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
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
+ })();