administrate-field-simple_mde_markdown 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (419) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +72 -0
  3. data/.circleci/setup-rubygems.sh +3 -0
  4. data/.gitignore +11 -0
  5. data/.rspec +3 -0
  6. data/CODE_OF_CONDUCT.md +74 -0
  7. data/Gemfile +8 -0
  8. data/Gemfile.lock +196 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +44 -0
  11. data/Rakefile +8 -0
  12. data/administrate-field-simple_mde_markdown.gemspec +31 -0
  13. data/app/assets/javascripts/administrate-field-simple_mde_markdown/application.js +6 -0
  14. data/app/assets/stylesheets/administrate-field-simple_mde_markdown/application.css +3 -0
  15. data/app/views/fields/simple_mde_markdown/_form.html.erb +6 -0
  16. data/app/views/fields/simple_mde_markdown/_index.html.erb +1 -0
  17. data/app/views/fields/simple_mde_markdown/_show.html.erb +1 -0
  18. data/lib/administrate/field/simple_mde_markdown.rb +31 -0
  19. data/node_modules/.bin/marked +1 -0
  20. data/node_modules/codemirror-spell-checker/.eslintrc +23 -0
  21. data/node_modules/codemirror-spell-checker/.npmignore +2 -0
  22. data/node_modules/codemirror-spell-checker/.travis.yml +18 -0
  23. data/node_modules/codemirror-spell-checker/CONTRIBUTING 2.md +10 -0
  24. data/node_modules/codemirror-spell-checker/CONTRIBUTING.md +10 -0
  25. data/node_modules/codemirror-spell-checker/LICENSE +22 -0
  26. data/node_modules/codemirror-spell-checker/README.md +50 -0
  27. data/node_modules/codemirror-spell-checker/bower.json +27 -0
  28. data/node_modules/codemirror-spell-checker/debug/.spell-checker 2.css.icloud +0 -0
  29. data/node_modules/codemirror-spell-checker/debug/spell-checker.css +9 -0
  30. data/node_modules/codemirror-spell-checker/debug/spell-checker.debug.js +2844 -0
  31. data/node_modules/codemirror-spell-checker/debug/spell-checker.js +2841 -0
  32. data/node_modules/codemirror-spell-checker/dist/.spell-checker.min 2.css.icloud +0 -0
  33. data/node_modules/codemirror-spell-checker/dist/en_US.aff +201 -0
  34. data/node_modules/codemirror-spell-checker/dist/en_US.dic +62120 -0
  35. data/node_modules/codemirror-spell-checker/dist/spell-checker.min 2.js +7 -0
  36. data/node_modules/codemirror-spell-checker/dist/spell-checker.min.css +7 -0
  37. data/node_modules/codemirror-spell-checker/dist/spell-checker.min.js +7 -0
  38. data/node_modules/codemirror-spell-checker/gulpfile.js +94 -0
  39. data/node_modules/codemirror-spell-checker/package.json +75 -0
  40. data/node_modules/codemirror-spell-checker/src/css/spell-checker.css +3 -0
  41. data/node_modules/codemirror-spell-checker/src/data/en_US.aff +201 -0
  42. data/node_modules/codemirror-spell-checker/src/data/en_US.dic +62120 -0
  43. data/node_modules/codemirror-spell-checker/src/js/spell-checker.js +119 -0
  44. data/node_modules/codemirror/.package 2.json.icloud +0 -0
  45. data/node_modules/codemirror/AUTHORS +773 -0
  46. data/node_modules/codemirror/CHANGELOG.md +1486 -0
  47. data/node_modules/codemirror/CONTRIBUTING.md +92 -0
  48. data/node_modules/codemirror/LICENSE +21 -0
  49. data/node_modules/codemirror/README.md +49 -0
  50. data/node_modules/codemirror/addon/comment/comment.js +209 -0
  51. data/node_modules/codemirror/addon/comment/continuecomment.js +78 -0
  52. data/node_modules/codemirror/addon/dialog/dialog.css +32 -0
  53. data/node_modules/codemirror/addon/dialog/dialog.js +161 -0
  54. data/node_modules/codemirror/addon/display/autorefresh.js +47 -0
  55. data/node_modules/codemirror/addon/display/fullscreen.css +6 -0
  56. data/node_modules/codemirror/addon/display/fullscreen.js +41 -0
  57. data/node_modules/codemirror/addon/display/panel.js +127 -0
  58. data/node_modules/codemirror/addon/display/placeholder.js +63 -0
  59. data/node_modules/codemirror/addon/display/rulers.js +51 -0
  60. data/node_modules/codemirror/addon/edit/closebrackets.js +187 -0
  61. data/node_modules/codemirror/addon/edit/closetag.js +175 -0
  62. data/node_modules/codemirror/addon/edit/continuelist.js +89 -0
  63. data/node_modules/codemirror/addon/edit/matchbrackets.js +145 -0
  64. data/node_modules/codemirror/addon/edit/matchtags.js +66 -0
  65. data/node_modules/codemirror/addon/edit/trailingspace.js +27 -0
  66. data/node_modules/codemirror/addon/fold/brace-fold.js +105 -0
  67. data/node_modules/codemirror/addon/fold/comment-fold.js +59 -0
  68. data/node_modules/codemirror/addon/fold/foldcode.js +152 -0
  69. data/node_modules/codemirror/addon/fold/foldgutter.css +20 -0
  70. data/node_modules/codemirror/addon/fold/foldgutter.js +146 -0
  71. data/node_modules/codemirror/addon/fold/indent-fold.js +48 -0
  72. data/node_modules/codemirror/addon/fold/markdown-fold.js +49 -0
  73. data/node_modules/codemirror/addon/fold/xml-fold.js +184 -0
  74. data/node_modules/codemirror/addon/hint/anyword-hint.js +41 -0
  75. data/node_modules/codemirror/addon/hint/css-hint.js +60 -0
  76. data/node_modules/codemirror/addon/hint/html-hint.js +348 -0
  77. data/node_modules/codemirror/addon/hint/javascript-hint.js +157 -0
  78. data/node_modules/codemirror/addon/hint/show-hint.css +36 -0
  79. data/node_modules/codemirror/addon/hint/show-hint.js +434 -0
  80. data/node_modules/codemirror/addon/hint/sql-hint.js +299 -0
  81. data/node_modules/codemirror/addon/hint/xml-hint.js +110 -0
  82. data/node_modules/codemirror/addon/lint/coffeescript-lint.js +47 -0
  83. data/node_modules/codemirror/addon/lint/css-lint.js +40 -0
  84. data/node_modules/codemirror/addon/lint/html-lint.js +53 -0
  85. data/node_modules/codemirror/addon/lint/javascript-lint.js +63 -0
  86. data/node_modules/codemirror/addon/lint/json-lint.js +40 -0
  87. data/node_modules/codemirror/addon/lint/lint.css +73 -0
  88. data/node_modules/codemirror/addon/lint/lint.js +252 -0
  89. data/node_modules/codemirror/addon/lint/yaml-lint.js +41 -0
  90. data/node_modules/codemirror/addon/merge/merge.css +119 -0
  91. data/node_modules/codemirror/addon/merge/merge.js +1002 -0
  92. data/node_modules/codemirror/addon/mode/loadmode.js +64 -0
  93. data/node_modules/codemirror/addon/mode/multiplex.js +131 -0
  94. data/node_modules/codemirror/addon/mode/multiplex_test.js +33 -0
  95. data/node_modules/codemirror/addon/mode/overlay.js +90 -0
  96. data/node_modules/codemirror/addon/mode/simple.js +216 -0
  97. data/node_modules/codemirror/addon/runmode/colorize.js +40 -0
  98. data/node_modules/codemirror/addon/runmode/runmode-standalone.js +158 -0
  99. data/node_modules/codemirror/addon/runmode/runmode.js +72 -0
  100. data/node_modules/codemirror/addon/runmode/runmode.node.js +197 -0
  101. data/node_modules/codemirror/addon/scroll/annotatescrollbar.js +122 -0
  102. data/node_modules/codemirror/addon/scroll/scrollpastend.js +48 -0
  103. data/node_modules/codemirror/addon/scroll/simplescrollbars.css +66 -0
  104. data/node_modules/codemirror/addon/scroll/simplescrollbars.js +152 -0
  105. data/node_modules/codemirror/addon/search/jump-to-line.js +50 -0
  106. data/node_modules/codemirror/addon/search/match-highlighter.js +165 -0
  107. data/node_modules/codemirror/addon/search/matchesonscrollbar.css +8 -0
  108. data/node_modules/codemirror/addon/search/matchesonscrollbar.js +97 -0
  109. data/node_modules/codemirror/addon/search/search.js +258 -0
  110. data/node_modules/codemirror/addon/search/searchcursor.js +293 -0
  111. data/node_modules/codemirror/addon/selection/active-line.js +72 -0
  112. data/node_modules/codemirror/addon/selection/mark-selection.js +119 -0
  113. data/node_modules/codemirror/addon/selection/selection-pointer.js +98 -0
  114. data/node_modules/codemirror/addon/tern/tern.css +87 -0
  115. data/node_modules/codemirror/addon/tern/tern.js +718 -0
  116. data/node_modules/codemirror/addon/tern/worker.js +44 -0
  117. data/node_modules/codemirror/addon/wrap/hardwrap.js +145 -0
  118. data/node_modules/codemirror/bin/source-highlight +48 -0
  119. data/node_modules/codemirror/keymap/emacs.js +417 -0
  120. data/node_modules/codemirror/keymap/sublime.js +691 -0
  121. data/node_modules/codemirror/keymap/vim.js +5467 -0
  122. data/node_modules/codemirror/lib/codemirror.css +346 -0
  123. data/node_modules/codemirror/lib/codemirror.js +9698 -0
  124. data/node_modules/codemirror/mode/apl/apl.js +174 -0
  125. data/node_modules/codemirror/mode/asciiarmor/asciiarmor.js +74 -0
  126. data/node_modules/codemirror/mode/asn.1/asn.1.js +204 -0
  127. data/node_modules/codemirror/mode/asterisk/asterisk.js +196 -0
  128. data/node_modules/codemirror/mode/brainfuck/brainfuck.js +85 -0
  129. data/node_modules/codemirror/mode/clike/clike.js +879 -0
  130. data/node_modules/codemirror/mode/clojure/clojure.js +292 -0
  131. data/node_modules/codemirror/mode/cmake/cmake.js +97 -0
  132. data/node_modules/codemirror/mode/cobol/cobol.js +255 -0
  133. data/node_modules/codemirror/mode/coffeescript/coffeescript.js +359 -0
  134. data/node_modules/codemirror/mode/commonlisp/commonlisp.js +124 -0
  135. data/node_modules/codemirror/mode/crystal/crystal.js +433 -0
  136. data/node_modules/codemirror/mode/css/css.js +832 -0
  137. data/node_modules/codemirror/mode/cypher/cypher.js +150 -0
  138. data/node_modules/codemirror/mode/d/d.js +223 -0
  139. data/node_modules/codemirror/mode/dart/dart.js +157 -0
  140. data/node_modules/codemirror/mode/diff/diff.js +47 -0
  141. data/node_modules/codemirror/mode/django/django.js +356 -0
  142. data/node_modules/codemirror/mode/dockerfile/dockerfile.js +211 -0
  143. data/node_modules/codemirror/mode/dtd/dtd.js +142 -0
  144. data/node_modules/codemirror/mode/dylan/dylan.js +352 -0
  145. data/node_modules/codemirror/mode/ebnf/ebnf.js +195 -0
  146. data/node_modules/codemirror/mode/ecl/ecl.js +206 -0
  147. data/node_modules/codemirror/mode/eiffel/eiffel.js +160 -0
  148. data/node_modules/codemirror/mode/elm/elm.js +205 -0
  149. data/node_modules/codemirror/mode/erlang/erlang.js +619 -0
  150. data/node_modules/codemirror/mode/factor/factor.js +85 -0
  151. data/node_modules/codemirror/mode/fcl/fcl.js +173 -0
  152. data/node_modules/codemirror/mode/forth/forth.js +180 -0
  153. data/node_modules/codemirror/mode/fortran/fortran.js +188 -0
  154. data/node_modules/codemirror/mode/gas/gas.js +345 -0
  155. data/node_modules/codemirror/mode/gfm/gfm.js +129 -0
  156. data/node_modules/codemirror/mode/gherkin/gherkin.js +178 -0
  157. data/node_modules/codemirror/mode/go/go.js +187 -0
  158. data/node_modules/codemirror/mode/groovy/groovy.js +230 -0
  159. data/node_modules/codemirror/mode/haml/haml.js +161 -0
  160. data/node_modules/codemirror/mode/handlebars/handlebars.js +66 -0
  161. data/node_modules/codemirror/mode/haskell-literate/haskell-literate.js +43 -0
  162. data/node_modules/codemirror/mode/haskell/haskell.js +268 -0
  163. data/node_modules/codemirror/mode/haxe/haxe.js +515 -0
  164. data/node_modules/codemirror/mode/htmlembedded/htmlembedded.js +37 -0
  165. data/node_modules/codemirror/mode/htmlmixed/htmlmixed.js +152 -0
  166. data/node_modules/codemirror/mode/http/http.js +113 -0
  167. data/node_modules/codemirror/mode/idl/idl.js +290 -0
  168. data/node_modules/codemirror/mode/javascript/javascript.js +899 -0
  169. data/node_modules/codemirror/mode/jinja2/jinja2.js +144 -0
  170. data/node_modules/codemirror/mode/jsx/jsx.js +148 -0
  171. data/node_modules/codemirror/mode/julia/julia.js +433 -0
  172. data/node_modules/codemirror/mode/livescript/livescript.js +280 -0
  173. data/node_modules/codemirror/mode/lua/lua.js +159 -0
  174. data/node_modules/codemirror/mode/markdown/markdown.js +884 -0
  175. data/node_modules/codemirror/mode/mathematica/mathematica.js +176 -0
  176. data/node_modules/codemirror/mode/mbox/mbox.js +129 -0
  177. data/node_modules/codemirror/mode/meta.js +217 -0
  178. data/node_modules/codemirror/mode/mirc/mirc.js +193 -0
  179. data/node_modules/codemirror/mode/mllike/mllike.js +359 -0
  180. data/node_modules/codemirror/mode/modelica/modelica.js +245 -0
  181. data/node_modules/codemirror/mode/mscgen/mscgen.js +175 -0
  182. data/node_modules/codemirror/mode/mumps/mumps.js +148 -0
  183. data/node_modules/codemirror/mode/nginx/nginx.js +178 -0
  184. data/node_modules/codemirror/mode/nsis/nsis.js +95 -0
  185. data/node_modules/codemirror/mode/ntriples/ntriples.js +195 -0
  186. data/node_modules/codemirror/mode/octave/octave.js +139 -0
  187. data/node_modules/codemirror/mode/oz/oz.js +252 -0
  188. data/node_modules/codemirror/mode/pascal/pascal.js +121 -0
  189. data/node_modules/codemirror/mode/pegjs/pegjs.js +114 -0
  190. data/node_modules/codemirror/mode/perl/perl.js +837 -0
  191. data/node_modules/codemirror/mode/php/php.js +234 -0
  192. data/node_modules/codemirror/mode/pig/pig.js +178 -0
  193. data/node_modules/codemirror/mode/powershell/powershell.js +398 -0
  194. data/node_modules/codemirror/mode/properties/properties 2.js +78 -0
  195. data/node_modules/codemirror/mode/properties/properties.js +78 -0
  196. data/node_modules/codemirror/mode/protobuf/protobuf.js +69 -0
  197. data/node_modules/codemirror/mode/pug/pug.js +591 -0
  198. data/node_modules/codemirror/mode/puppet/puppet.js +220 -0
  199. data/node_modules/codemirror/mode/python/python.js +409 -0
  200. data/node_modules/codemirror/mode/q/q.js +139 -0
  201. data/node_modules/codemirror/mode/r/r.js +190 -0
  202. data/node_modules/codemirror/mode/rpm/changes/index.html +66 -0
  203. data/node_modules/codemirror/mode/rpm/rpm.js +109 -0
  204. data/node_modules/codemirror/mode/rst/rst.js +557 -0
  205. data/node_modules/codemirror/mode/ruby/ruby.js +296 -0
  206. data/node_modules/codemirror/mode/rust/rust.js +72 -0
  207. data/node_modules/codemirror/mode/sas/sas.js +303 -0
  208. data/node_modules/codemirror/mode/sass/sass.js +454 -0
  209. data/node_modules/codemirror/mode/scheme/scheme.js +265 -0
  210. data/node_modules/codemirror/mode/shell/shell.js +152 -0
  211. data/node_modules/codemirror/mode/sieve/sieve.js +193 -0
  212. data/node_modules/codemirror/mode/slim/slim.js +575 -0
  213. data/node_modules/codemirror/mode/smalltalk/smalltalk.js +168 -0
  214. data/node_modules/codemirror/mode/smarty/smarty.js +225 -0
  215. data/node_modules/codemirror/mode/solr/solr.js +104 -0
  216. data/node_modules/codemirror/mode/soy/soy 2.js +359 -0
  217. data/node_modules/codemirror/mode/soy/soy.js +235 -0
  218. data/node_modules/codemirror/mode/sparql/sparql.js +180 -0
  219. data/node_modules/codemirror/mode/spreadsheet/spreadsheet.js +112 -0
  220. data/node_modules/codemirror/mode/sql/sql.js +499 -0
  221. data/node_modules/codemirror/mode/stex/stex.js +264 -0
  222. data/node_modules/codemirror/mode/stylus/stylus.js +771 -0
  223. data/node_modules/codemirror/mode/swift/swift.js +219 -0
  224. data/node_modules/codemirror/mode/tcl/tcl.js +139 -0
  225. data/node_modules/codemirror/mode/textile/textile.js +469 -0
  226. data/node_modules/codemirror/mode/tiddlywiki/tiddlywiki.css +14 -0
  227. data/node_modules/codemirror/mode/tiddlywiki/tiddlywiki.js +308 -0
  228. data/node_modules/codemirror/mode/tiki/tiki.css +26 -0
  229. data/node_modules/codemirror/mode/tiki/tiki.js +312 -0
  230. data/node_modules/codemirror/mode/toml/toml.js +88 -0
  231. data/node_modules/codemirror/mode/tornado/tornado.js +68 -0
  232. data/node_modules/codemirror/mode/troff/troff.js +84 -0
  233. data/node_modules/codemirror/mode/ttcn-cfg/ttcn-cfg.js +214 -0
  234. data/node_modules/codemirror/mode/ttcn/ttcn.js +283 -0
  235. data/node_modules/codemirror/mode/turtle/turtle.js +162 -0
  236. data/node_modules/codemirror/mode/twig/twig.js +141 -0
  237. data/node_modules/codemirror/mode/vb/vb.js +275 -0
  238. data/node_modules/codemirror/mode/vbscript/vbscript.js +350 -0
  239. data/node_modules/codemirror/mode/velocity/velocity.js +201 -0
  240. data/node_modules/codemirror/mode/verilog/verilog.js +675 -0
  241. data/node_modules/codemirror/mode/vhdl/vhdl.js +189 -0
  242. data/node_modules/codemirror/mode/vue/vue.js +77 -0
  243. data/node_modules/codemirror/mode/webidl/webidl.js +195 -0
  244. data/node_modules/codemirror/mode/xml/xml.js +402 -0
  245. data/node_modules/codemirror/mode/xquery/xquery.js +448 -0
  246. data/node_modules/codemirror/mode/yacas/yacas.js +204 -0
  247. data/node_modules/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js +68 -0
  248. data/node_modules/codemirror/mode/yaml/yaml.js +120 -0
  249. data/node_modules/codemirror/mode/z80/z80.js +116 -0
  250. data/node_modules/codemirror/package.json +2395 -0
  251. data/node_modules/codemirror/rollup.config.js +20 -0
  252. data/node_modules/codemirror/src/codemirror.js +3 -0
  253. data/node_modules/codemirror/src/display/Display.js +106 -0
  254. data/node_modules/codemirror/src/display/focus.js +47 -0
  255. data/node_modules/codemirror/src/display/gutters.js +34 -0
  256. data/node_modules/codemirror/src/display/highlight_worker.js +55 -0
  257. data/node_modules/codemirror/src/display/line_numbers.js +48 -0
  258. data/node_modules/codemirror/src/display/mode_state.js +22 -0
  259. data/node_modules/codemirror/src/display/operations.js +205 -0
  260. data/node_modules/codemirror/src/display/scroll_events.js +115 -0
  261. data/node_modules/codemirror/src/display/scrollbars.js +193 -0
  262. data/node_modules/codemirror/src/display/scrolling.js +184 -0
  263. data/node_modules/codemirror/src/display/selection.js +158 -0
  264. data/node_modules/codemirror/src/display/update_display.js +260 -0
  265. data/node_modules/codemirror/src/display/update_line.js +188 -0
  266. data/node_modules/codemirror/src/display/update_lines.js +64 -0
  267. data/node_modules/codemirror/src/display/view_tracking.js +153 -0
  268. data/node_modules/codemirror/src/edit/CodeMirror.js +215 -0
  269. data/node_modules/codemirror/src/edit/commands.js +178 -0
  270. data/node_modules/codemirror/src/edit/deleteNearSelection.js +30 -0
  271. data/node_modules/codemirror/src/edit/drop_events.js +119 -0
  272. data/node_modules/codemirror/src/edit/fromTextArea.js +61 -0
  273. data/node_modules/codemirror/src/edit/global_events.js +42 -0
  274. data/node_modules/codemirror/src/edit/key_events.js +159 -0
  275. data/node_modules/codemirror/src/edit/legacy.js +62 -0
  276. data/node_modules/codemirror/src/edit/main.js +69 -0
  277. data/node_modules/codemirror/src/edit/methods.js +544 -0
  278. data/node_modules/codemirror/src/edit/mouse_events.js +407 -0
  279. data/node_modules/codemirror/src/edit/options.js +193 -0
  280. data/node_modules/codemirror/src/edit/utils.js +7 -0
  281. data/node_modules/codemirror/src/input/ContentEditableInput.js +527 -0
  282. data/node_modules/codemirror/src/input/TextareaInput.js +355 -0
  283. data/node_modules/codemirror/src/input/indent.js +71 -0
  284. data/node_modules/codemirror/src/input/input.js +135 -0
  285. data/node_modules/codemirror/src/input/keymap.js +148 -0
  286. data/node_modules/codemirror/src/input/keynames.js +17 -0
  287. data/node_modules/codemirror/src/input/movement.js +110 -0
  288. data/node_modules/codemirror/src/line/highlight.js +284 -0
  289. data/node_modules/codemirror/src/line/line_data.js +339 -0
  290. data/node_modules/codemirror/src/line/pos.js +40 -0
  291. data/node_modules/codemirror/src/line/saw_special_spans.js +10 -0
  292. data/node_modules/codemirror/src/line/spans.js +382 -0
  293. data/node_modules/codemirror/src/line/utils_line.js +85 -0
  294. data/node_modules/codemirror/src/measurement/position_measurement.js +699 -0
  295. data/node_modules/codemirror/src/measurement/widgets.js +26 -0
  296. data/node_modules/codemirror/src/model/Doc.js +432 -0
  297. data/node_modules/codemirror/src/model/change_measurement.js +61 -0
  298. data/node_modules/codemirror/src/model/changes.js +333 -0
  299. data/node_modules/codemirror/src/model/chunk.js +167 -0
  300. data/node_modules/codemirror/src/model/document_data.js +111 -0
  301. data/node_modules/codemirror/src/model/history.js +228 -0
  302. data/node_modules/codemirror/src/model/line_widget.js +78 -0
  303. data/node_modules/codemirror/src/model/mark_text.js +292 -0
  304. data/node_modules/codemirror/src/model/selection.js +84 -0
  305. data/node_modules/codemirror/src/model/selection_updates.js +208 -0
  306. data/node_modules/codemirror/src/modes.js +96 -0
  307. data/node_modules/codemirror/src/util/StringStream.js +90 -0
  308. data/node_modules/codemirror/src/util/bidi.js +214 -0
  309. data/node_modules/codemirror/src/util/browser.js +33 -0
  310. data/node_modules/codemirror/src/util/dom.js +97 -0
  311. data/node_modules/codemirror/src/util/event.js +103 -0
  312. data/node_modules/codemirror/src/util/feature_detection.js +84 -0
  313. data/node_modules/codemirror/src/util/misc.js +150 -0
  314. data/node_modules/codemirror/src/util/operation_group.js +72 -0
  315. data/node_modules/codemirror/theme/3024-day.css +41 -0
  316. data/node_modules/codemirror/theme/3024-night.css +39 -0
  317. data/node_modules/codemirror/theme/abcdef.css +32 -0
  318. data/node_modules/codemirror/theme/ambiance-mobile.css +5 -0
  319. data/node_modules/codemirror/theme/ambiance.css +74 -0
  320. data/node_modules/codemirror/theme/base16-dark.css +38 -0
  321. data/node_modules/codemirror/theme/base16-light.css +38 -0
  322. data/node_modules/codemirror/theme/bespin.css +34 -0
  323. data/node_modules/codemirror/theme/blackboard.css +32 -0
  324. data/node_modules/codemirror/theme/cobalt.css +25 -0
  325. data/node_modules/codemirror/theme/colorforth.css +33 -0
  326. data/node_modules/codemirror/theme/darcula.css +46 -0
  327. data/node_modules/codemirror/theme/dracula.css +40 -0
  328. data/node_modules/codemirror/theme/duotone-dark.css +35 -0
  329. data/node_modules/codemirror/theme/duotone-light.css +36 -0
  330. data/node_modules/codemirror/theme/eclipse.css +23 -0
  331. data/node_modules/codemirror/theme/elegant.css +13 -0
  332. data/node_modules/codemirror/theme/erlang-dark.css +34 -0
  333. data/node_modules/codemirror/theme/gruvbox-dark.css +37 -0
  334. data/node_modules/codemirror/theme/hopscotch.css +34 -0
  335. data/node_modules/codemirror/theme/icecoder.css +43 -0
  336. data/node_modules/codemirror/theme/idea.css +42 -0
  337. data/node_modules/codemirror/theme/isotope.css +34 -0
  338. data/node_modules/codemirror/theme/lesser-dark.css +47 -0
  339. data/node_modules/codemirror/theme/liquibyte.css +95 -0
  340. data/node_modules/codemirror/theme/lucario.css +37 -0
  341. data/node_modules/codemirror/theme/material.css +53 -0
  342. data/node_modules/codemirror/theme/mbo.css +37 -0
  343. data/node_modules/codemirror/theme/mdn-like.css +46 -0
  344. data/node_modules/codemirror/theme/midnight.css +43 -0
  345. data/node_modules/codemirror/theme/monokai.css +41 -0
  346. data/node_modules/codemirror/theme/neat.css +12 -0
  347. data/node_modules/codemirror/theme/neo.css +43 -0
  348. data/node_modules/codemirror/theme/night.css +27 -0
  349. data/node_modules/codemirror/theme/oceanic-next.css +44 -0
  350. data/node_modules/codemirror/theme/panda-syntax.css +85 -0
  351. data/node_modules/codemirror/theme/paraiso-dark.css +38 -0
  352. data/node_modules/codemirror/theme/paraiso-light.css +38 -0
  353. data/node_modules/codemirror/theme/pastel-on-dark.css +52 -0
  354. data/node_modules/codemirror/theme/railscasts.css +34 -0
  355. data/node_modules/codemirror/theme/rubyblue.css +25 -0
  356. data/node_modules/codemirror/theme/seti.css +44 -0
  357. data/node_modules/codemirror/theme/shadowfox.css +52 -0
  358. data/node_modules/codemirror/theme/solarized.css +168 -0
  359. data/node_modules/codemirror/theme/ssms.css +16 -0
  360. data/node_modules/codemirror/theme/the-matrix.css +30 -0
  361. data/node_modules/codemirror/theme/tomorrow-night-bright.css +35 -0
  362. data/node_modules/codemirror/theme/tomorrow-night-eighties.css +38 -0
  363. data/node_modules/codemirror/theme/ttcn.css +64 -0
  364. data/node_modules/codemirror/theme/twilight.css +32 -0
  365. data/node_modules/codemirror/theme/vibrant-ink.css +34 -0
  366. data/node_modules/codemirror/theme/xq-dark.css +53 -0
  367. data/node_modules/codemirror/theme/xq-light.css +43 -0
  368. data/node_modules/codemirror/theme/yeti.css +44 -0
  369. data/node_modules/codemirror/theme/zenburn.css +37 -0
  370. data/node_modules/marked/.editorconfig +16 -0
  371. data/node_modules/marked/.eslintignore +1 -0
  372. data/node_modules/marked/.eslintrc.json +28 -0
  373. data/node_modules/marked/.package 2.json.icloud +0 -0
  374. data/node_modules/marked/.travis.yml +47 -0
  375. data/node_modules/marked/Makefile +15 -0
  376. data/node_modules/marked/Makefile 2 +15 -0
  377. data/node_modules/marked/README 2.md +75 -0
  378. data/node_modules/marked/README.md +75 -0
  379. data/node_modules/marked/bin/marked +199 -0
  380. data/node_modules/marked/bower.json +23 -0
  381. data/node_modules/marked/component.json +10 -0
  382. data/node_modules/marked/index.js +1 -0
  383. data/node_modules/marked/jasmine.json +11 -0
  384. data/node_modules/marked/lib/marked 2.js +1604 -0
  385. data/node_modules/marked/lib/marked.js +1604 -0
  386. data/node_modules/marked/man/marked.1 +91 -0
  387. data/node_modules/marked/man/marked.1.txt +96 -0
  388. data/node_modules/marked/marked.min.js +6 -0
  389. data/node_modules/marked/package.json +95 -0
  390. data/node_modules/simplemde/.eslintrc +23 -0
  391. data/node_modules/simplemde/.npmignore +9 -0
  392. data/node_modules/simplemde/.travis.yml +18 -0
  393. data/node_modules/simplemde/CONTRIBUTING 2.md +10 -0
  394. data/node_modules/simplemde/CONTRIBUTING.md +10 -0
  395. data/node_modules/simplemde/LICENSE +22 -0
  396. data/node_modules/simplemde/README.md +331 -0
  397. data/node_modules/simplemde/bower.json +23 -0
  398. data/node_modules/simplemde/debug/.simplemde 2.css.icloud +0 -0
  399. data/node_modules/simplemde/debug/simplemde.css +676 -0
  400. data/node_modules/simplemde/debug/simplemde.debug.js +17023 -0
  401. data/node_modules/simplemde/debug/simplemde.js +17019 -0
  402. data/node_modules/simplemde/dist/simplemde.min.css +7 -0
  403. data/node_modules/simplemde/dist/simplemde.min.js +15 -0
  404. data/node_modules/simplemde/gulpfile.js +96 -0
  405. data/node_modules/simplemde/package.json +73 -0
  406. data/node_modules/simplemde/src/css/simplemde.css +328 -0
  407. data/node_modules/simplemde/src/js/codemirror/tablist 2.js +44 -0
  408. data/node_modules/simplemde/src/js/codemirror/tablist.js +44 -0
  409. data/node_modules/simplemde/src/js/simplemde.js +2028 -0
  410. data/node_modules/typo-js/README.md +45 -0
  411. data/node_modules/typo-js/dictionaries/en_US/.en_US 2.dic.icloud +0 -0
  412. data/node_modules/typo-js/dictionaries/en_US/README.md +7 -0
  413. data/node_modules/typo-js/dictionaries/en_US/en_US.aff +201 -0
  414. data/node_modules/typo-js/dictionaries/en_US/en_US.dic +62120 -0
  415. data/node_modules/typo-js/package.json +56 -0
  416. data/node_modules/typo-js/typo.js +931 -0
  417. data/package-lock.json +40 -0
  418. data/package.json +7 -0
  419. metadata +557 -0
@@ -0,0 +1,111 @@
1
+ import { loadMode } from "../display/mode_state.js"
2
+ import { runInOp } from "../display/operations.js"
3
+ import { regChange } from "../display/view_tracking.js"
4
+ import { Line, updateLine } from "../line/line_data.js"
5
+ import { findMaxLine } from "../line/spans.js"
6
+ import { getLine } from "../line/utils_line.js"
7
+ import { estimateLineHeights } from "../measurement/position_measurement.js"
8
+ import { addClass, rmClass } from "../util/dom.js"
9
+ import { lst } from "../util/misc.js"
10
+ import { signalLater } from "../util/operation_group.js"
11
+
12
+ // DOCUMENT DATA STRUCTURE
13
+
14
+ // By default, updates that start and end at the beginning of a line
15
+ // are treated specially, in order to make the association of line
16
+ // widgets and marker elements with the text behave more intuitive.
17
+ export function isWholeLineUpdate(doc, change) {
18
+ return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" &&
19
+ (!doc.cm || doc.cm.options.wholeLineUpdateBefore)
20
+ }
21
+
22
+ // Perform a change on the document data structure.
23
+ export function updateDoc(doc, change, markedSpans, estimateHeight) {
24
+ function spansFor(n) {return markedSpans ? markedSpans[n] : null}
25
+ function update(line, text, spans) {
26
+ updateLine(line, text, spans, estimateHeight)
27
+ signalLater(line, "change", line, change)
28
+ }
29
+ function linesFor(start, end) {
30
+ let result = []
31
+ for (let i = start; i < end; ++i)
32
+ result.push(new Line(text[i], spansFor(i), estimateHeight))
33
+ return result
34
+ }
35
+
36
+ let from = change.from, to = change.to, text = change.text
37
+ let firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line)
38
+ let lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line
39
+
40
+ // Adjust the line structure
41
+ if (change.full) {
42
+ doc.insert(0, linesFor(0, text.length))
43
+ doc.remove(text.length, doc.size - text.length)
44
+ } else if (isWholeLineUpdate(doc, change)) {
45
+ // This is a whole-line replace. Treated specially to make
46
+ // sure line objects move the way they are supposed to.
47
+ let added = linesFor(0, text.length - 1)
48
+ update(lastLine, lastLine.text, lastSpans)
49
+ if (nlines) doc.remove(from.line, nlines)
50
+ if (added.length) doc.insert(from.line, added)
51
+ } else if (firstLine == lastLine) {
52
+ if (text.length == 1) {
53
+ update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans)
54
+ } else {
55
+ let added = linesFor(1, text.length - 1)
56
+ added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight))
57
+ update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0))
58
+ doc.insert(from.line + 1, added)
59
+ }
60
+ } else if (text.length == 1) {
61
+ update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0))
62
+ doc.remove(from.line + 1, nlines)
63
+ } else {
64
+ update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0))
65
+ update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans)
66
+ let added = linesFor(1, text.length - 1)
67
+ if (nlines > 1) doc.remove(from.line + 1, nlines - 1)
68
+ doc.insert(from.line + 1, added)
69
+ }
70
+
71
+ signalLater(doc, "change", doc, change)
72
+ }
73
+
74
+ // Call f for all linked documents.
75
+ export function linkedDocs(doc, f, sharedHistOnly) {
76
+ function propagate(doc, skip, sharedHist) {
77
+ if (doc.linked) for (let i = 0; i < doc.linked.length; ++i) {
78
+ let rel = doc.linked[i]
79
+ if (rel.doc == skip) continue
80
+ let shared = sharedHist && rel.sharedHist
81
+ if (sharedHistOnly && !shared) continue
82
+ f(rel.doc, shared)
83
+ propagate(rel.doc, doc, shared)
84
+ }
85
+ }
86
+ propagate(doc, null, true)
87
+ }
88
+
89
+ // Attach a document to an editor.
90
+ export function attachDoc(cm, doc) {
91
+ if (doc.cm) throw new Error("This document is already in use.")
92
+ cm.doc = doc
93
+ doc.cm = cm
94
+ estimateLineHeights(cm)
95
+ loadMode(cm)
96
+ setDirectionClass(cm)
97
+ if (!cm.options.lineWrapping) findMaxLine(cm)
98
+ cm.options.mode = doc.modeOption
99
+ regChange(cm)
100
+ }
101
+
102
+ function setDirectionClass(cm) {
103
+ ;(cm.doc.direction == "rtl" ? addClass : rmClass)(cm.display.lineDiv, "CodeMirror-rtl")
104
+ }
105
+
106
+ export function directionChanged(cm) {
107
+ runInOp(cm, () => {
108
+ setDirectionClass(cm)
109
+ regChange(cm)
110
+ })
111
+ }
@@ -0,0 +1,228 @@
1
+ import { cmp, copyPos } from "../line/pos.js"
2
+ import { stretchSpansOverChange } from "../line/spans.js"
3
+ import { getBetween } from "../line/utils_line.js"
4
+ import { signal } from "../util/event.js"
5
+ import { indexOf, lst } from "../util/misc.js"
6
+
7
+ import { changeEnd } from "./change_measurement.js"
8
+ import { linkedDocs } from "./document_data.js"
9
+ import { Selection } from "./selection.js"
10
+
11
+ export function History(startGen) {
12
+ // Arrays of change events and selections. Doing something adds an
13
+ // event to done and clears undo. Undoing moves events from done
14
+ // to undone, redoing moves them in the other direction.
15
+ this.done = []; this.undone = []
16
+ this.undoDepth = Infinity
17
+ // Used to track when changes can be merged into a single undo
18
+ // event
19
+ this.lastModTime = this.lastSelTime = 0
20
+ this.lastOp = this.lastSelOp = null
21
+ this.lastOrigin = this.lastSelOrigin = null
22
+ // Used by the isClean() method
23
+ this.generation = this.maxGeneration = startGen || 1
24
+ }
25
+
26
+ // Create a history change event from an updateDoc-style change
27
+ // object.
28
+ export function historyChangeFromChange(doc, change) {
29
+ let histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)}
30
+ attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1)
31
+ linkedDocs(doc, doc => attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1), true)
32
+ return histChange
33
+ }
34
+
35
+ // Pop all selection events off the end of a history array. Stop at
36
+ // a change event.
37
+ function clearSelectionEvents(array) {
38
+ while (array.length) {
39
+ let last = lst(array)
40
+ if (last.ranges) array.pop()
41
+ else break
42
+ }
43
+ }
44
+
45
+ // Find the top change event in the history. Pop off selection
46
+ // events that are in the way.
47
+ function lastChangeEvent(hist, force) {
48
+ if (force) {
49
+ clearSelectionEvents(hist.done)
50
+ return lst(hist.done)
51
+ } else if (hist.done.length && !lst(hist.done).ranges) {
52
+ return lst(hist.done)
53
+ } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {
54
+ hist.done.pop()
55
+ return lst(hist.done)
56
+ }
57
+ }
58
+
59
+ // Register a change in the history. Merges changes that are within
60
+ // a single operation, or are close together with an origin that
61
+ // allows merging (starting with "+") into a single event.
62
+ export function addChangeToHistory(doc, change, selAfter, opId) {
63
+ let hist = doc.history
64
+ hist.undone.length = 0
65
+ let time = +new Date, cur
66
+ let last
67
+
68
+ if ((hist.lastOp == opId ||
69
+ hist.lastOrigin == change.origin && change.origin &&
70
+ ((change.origin.charAt(0) == "+" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) ||
71
+ change.origin.charAt(0) == "*")) &&
72
+ (cur = lastChangeEvent(hist, hist.lastOp == opId))) {
73
+ // Merge this change into the last event
74
+ last = lst(cur.changes)
75
+ if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {
76
+ // Optimized case for simple insertion -- don't want to add
77
+ // new changesets for every character typed
78
+ last.to = changeEnd(change)
79
+ } else {
80
+ // Add new sub-event
81
+ cur.changes.push(historyChangeFromChange(doc, change))
82
+ }
83
+ } else {
84
+ // Can not be merged, start a new event.
85
+ let before = lst(hist.done)
86
+ if (!before || !before.ranges)
87
+ pushSelectionToHistory(doc.sel, hist.done)
88
+ cur = {changes: [historyChangeFromChange(doc, change)],
89
+ generation: hist.generation}
90
+ hist.done.push(cur)
91
+ while (hist.done.length > hist.undoDepth) {
92
+ hist.done.shift()
93
+ if (!hist.done[0].ranges) hist.done.shift()
94
+ }
95
+ }
96
+ hist.done.push(selAfter)
97
+ hist.generation = ++hist.maxGeneration
98
+ hist.lastModTime = hist.lastSelTime = time
99
+ hist.lastOp = hist.lastSelOp = opId
100
+ hist.lastOrigin = hist.lastSelOrigin = change.origin
101
+
102
+ if (!last) signal(doc, "historyAdded")
103
+ }
104
+
105
+ function selectionEventCanBeMerged(doc, origin, prev, sel) {
106
+ let ch = origin.charAt(0)
107
+ return ch == "*" ||
108
+ ch == "+" &&
109
+ prev.ranges.length == sel.ranges.length &&
110
+ prev.somethingSelected() == sel.somethingSelected() &&
111
+ new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500)
112
+ }
113
+
114
+ // Called whenever the selection changes, sets the new selection as
115
+ // the pending selection in the history, and pushes the old pending
116
+ // selection into the 'done' array when it was significantly
117
+ // different (in number of selected ranges, emptiness, or time).
118
+ export function addSelectionToHistory(doc, sel, opId, options) {
119
+ let hist = doc.history, origin = options && options.origin
120
+
121
+ // A new event is started when the previous origin does not match
122
+ // the current, or the origins don't allow matching. Origins
123
+ // starting with * are always merged, those starting with + are
124
+ // merged when similar and close together in time.
125
+ if (opId == hist.lastSelOp ||
126
+ (origin && hist.lastSelOrigin == origin &&
127
+ (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||
128
+ selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))
129
+ hist.done[hist.done.length - 1] = sel
130
+ else
131
+ pushSelectionToHistory(sel, hist.done)
132
+
133
+ hist.lastSelTime = +new Date
134
+ hist.lastSelOrigin = origin
135
+ hist.lastSelOp = opId
136
+ if (options && options.clearRedo !== false)
137
+ clearSelectionEvents(hist.undone)
138
+ }
139
+
140
+ export function pushSelectionToHistory(sel, dest) {
141
+ let top = lst(dest)
142
+ if (!(top && top.ranges && top.equals(sel)))
143
+ dest.push(sel)
144
+ }
145
+
146
+ // Used to store marked span information in the history.
147
+ function attachLocalSpans(doc, change, from, to) {
148
+ let existing = change["spans_" + doc.id], n = 0
149
+ doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), line => {
150
+ if (line.markedSpans)
151
+ (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans
152
+ ++n
153
+ })
154
+ }
155
+
156
+ // When un/re-doing restores text containing marked spans, those
157
+ // that have been explicitly cleared should not be restored.
158
+ function removeClearedSpans(spans) {
159
+ if (!spans) return null
160
+ let out
161
+ for (let i = 0; i < spans.length; ++i) {
162
+ if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i) }
163
+ else if (out) out.push(spans[i])
164
+ }
165
+ return !out ? spans : out.length ? out : null
166
+ }
167
+
168
+ // Retrieve and filter the old marked spans stored in a change event.
169
+ function getOldSpans(doc, change) {
170
+ let found = change["spans_" + doc.id]
171
+ if (!found) return null
172
+ let nw = []
173
+ for (let i = 0; i < change.text.length; ++i)
174
+ nw.push(removeClearedSpans(found[i]))
175
+ return nw
176
+ }
177
+
178
+ // Used for un/re-doing changes from the history. Combines the
179
+ // result of computing the existing spans with the set of spans that
180
+ // existed in the history (so that deleting around a span and then
181
+ // undoing brings back the span).
182
+ export function mergeOldSpans(doc, change) {
183
+ let old = getOldSpans(doc, change)
184
+ let stretched = stretchSpansOverChange(doc, change)
185
+ if (!old) return stretched
186
+ if (!stretched) return old
187
+
188
+ for (let i = 0; i < old.length; ++i) {
189
+ let oldCur = old[i], stretchCur = stretched[i]
190
+ if (oldCur && stretchCur) {
191
+ spans: for (let j = 0; j < stretchCur.length; ++j) {
192
+ let span = stretchCur[j]
193
+ for (let k = 0; k < oldCur.length; ++k)
194
+ if (oldCur[k].marker == span.marker) continue spans
195
+ oldCur.push(span)
196
+ }
197
+ } else if (stretchCur) {
198
+ old[i] = stretchCur
199
+ }
200
+ }
201
+ return old
202
+ }
203
+
204
+ // Used both to provide a JSON-safe object in .getHistory, and, when
205
+ // detaching a document, to split the history in two
206
+ export function copyHistoryArray(events, newGroup, instantiateSel) {
207
+ let copy = []
208
+ for (let i = 0; i < events.length; ++i) {
209
+ let event = events[i]
210
+ if (event.ranges) {
211
+ copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event)
212
+ continue
213
+ }
214
+ let changes = event.changes, newChanges = []
215
+ copy.push({changes: newChanges})
216
+ for (let j = 0; j < changes.length; ++j) {
217
+ let change = changes[j], m
218
+ newChanges.push({from: change.from, to: change.to, text: change.text})
219
+ if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\d+)$/)) {
220
+ if (indexOf(newGroup, Number(m[1])) > -1) {
221
+ lst(newChanges)[prop] = change[prop]
222
+ delete change[prop]
223
+ }
224
+ }
225
+ }
226
+ }
227
+ return copy
228
+ }
@@ -0,0 +1,78 @@
1
+ import { runInOp } from "../display/operations.js"
2
+ import { addToScrollTop } from "../display/scrolling.js"
3
+ import { regLineChange } from "../display/view_tracking.js"
4
+ import { heightAtLine, lineIsHidden } from "../line/spans.js"
5
+ import { lineNo, updateLineHeight } from "../line/utils_line.js"
6
+ import { widgetHeight } from "../measurement/widgets.js"
7
+ import { changeLine } from "./changes.js"
8
+ import { eventMixin } from "../util/event.js"
9
+ import { signalLater } from "../util/operation_group.js"
10
+
11
+ // Line widgets are block elements displayed above or below a line.
12
+
13
+ export class LineWidget {
14
+ constructor(doc, node, options) {
15
+ if (options) for (let opt in options) if (options.hasOwnProperty(opt))
16
+ this[opt] = options[opt]
17
+ this.doc = doc
18
+ this.node = node
19
+ }
20
+
21
+ clear() {
22
+ let cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line)
23
+ if (no == null || !ws) return
24
+ for (let i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1)
25
+ if (!ws.length) line.widgets = null
26
+ let height = widgetHeight(this)
27
+ updateLineHeight(line, Math.max(0, line.height - height))
28
+ if (cm) {
29
+ runInOp(cm, () => {
30
+ adjustScrollWhenAboveVisible(cm, line, -height)
31
+ regLineChange(cm, no, "widget")
32
+ })
33
+ signalLater(cm, "lineWidgetCleared", cm, this, no)
34
+ }
35
+ }
36
+
37
+ changed() {
38
+ let oldH = this.height, cm = this.doc.cm, line = this.line
39
+ this.height = null
40
+ let diff = widgetHeight(this) - oldH
41
+ if (!diff) return
42
+ if (!lineIsHidden(this.doc, line)) updateLineHeight(line, line.height + diff)
43
+ if (cm) {
44
+ runInOp(cm, () => {
45
+ cm.curOp.forceUpdate = true
46
+ adjustScrollWhenAboveVisible(cm, line, diff)
47
+ signalLater(cm, "lineWidgetChanged", cm, this, lineNo(line))
48
+ })
49
+ }
50
+ }
51
+ }
52
+ eventMixin(LineWidget)
53
+
54
+ function adjustScrollWhenAboveVisible(cm, line, diff) {
55
+ if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))
56
+ addToScrollTop(cm, diff)
57
+ }
58
+
59
+ export function addLineWidget(doc, handle, node, options) {
60
+ let widget = new LineWidget(doc, node, options)
61
+ let cm = doc.cm
62
+ if (cm && widget.noHScroll) cm.display.alignWidgets = true
63
+ changeLine(doc, handle, "widget", line => {
64
+ let widgets = line.widgets || (line.widgets = [])
65
+ if (widget.insertAt == null) widgets.push(widget)
66
+ else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget)
67
+ widget.line = line
68
+ if (cm && !lineIsHidden(doc, line)) {
69
+ let aboveVisible = heightAtLine(line) < doc.scrollTop
70
+ updateLineHeight(line, line.height + widgetHeight(widget))
71
+ if (aboveVisible) addToScrollTop(cm, widget.height)
72
+ cm.curOp.forceUpdate = true
73
+ }
74
+ return true
75
+ })
76
+ if (cm) signalLater(cm, "lineWidgetAdded", cm, widget, typeof handle == "number" ? handle : lineNo(handle))
77
+ return widget
78
+ }
@@ -0,0 +1,292 @@
1
+ import { eltP } from "../util/dom.js"
2
+ import { eventMixin, hasHandler, on } from "../util/event.js"
3
+ import { endOperation, operation, runInOp, startOperation } from "../display/operations.js"
4
+ import { clipPos, cmp, Pos } from "../line/pos.js"
5
+ import { lineNo, updateLineHeight } from "../line/utils_line.js"
6
+ import { clearLineMeasurementCacheFor, findViewForLine, textHeight } from "../measurement/position_measurement.js"
7
+ import { seeReadOnlySpans, seeCollapsedSpans } from "../line/saw_special_spans.js"
8
+ import { addMarkedSpan, conflictingCollapsedRange, getMarkedSpanFor, lineIsHidden, lineLength, MarkedSpan, removeMarkedSpan, visualLine } from "../line/spans.js"
9
+ import { copyObj, indexOf, lst } from "../util/misc.js"
10
+ import { signalLater } from "../util/operation_group.js"
11
+ import { widgetHeight } from "../measurement/widgets.js"
12
+ import { regChange, regLineChange } from "../display/view_tracking.js"
13
+
14
+ import { linkedDocs } from "./document_data.js"
15
+ import { addChangeToHistory } from "./history.js"
16
+ import { reCheckSelection } from "./selection_updates.js"
17
+
18
+ // TEXTMARKERS
19
+
20
+ // Created with markText and setBookmark methods. A TextMarker is a
21
+ // handle that can be used to clear or find a marked position in the
22
+ // document. Line objects hold arrays (markedSpans) containing
23
+ // {from, to, marker} object pointing to such marker objects, and
24
+ // indicating that such a marker is present on that line. Multiple
25
+ // lines may point to the same marker when it spans across lines.
26
+ // The spans will have null for their from/to properties when the
27
+ // marker continues beyond the start/end of the line. Markers have
28
+ // links back to the lines they currently touch.
29
+
30
+ // Collapsed markers have unique ids, in order to be able to order
31
+ // them, which is needed for uniquely determining an outer marker
32
+ // when they overlap (they may nest, but not partially overlap).
33
+ let nextMarkerId = 0
34
+
35
+ export class TextMarker {
36
+ constructor(doc, type) {
37
+ this.lines = []
38
+ this.type = type
39
+ this.doc = doc
40
+ this.id = ++nextMarkerId
41
+ }
42
+
43
+ // Clear the marker.
44
+ clear() {
45
+ if (this.explicitlyCleared) return
46
+ let cm = this.doc.cm, withOp = cm && !cm.curOp
47
+ if (withOp) startOperation(cm)
48
+ if (hasHandler(this, "clear")) {
49
+ let found = this.find()
50
+ if (found) signalLater(this, "clear", found.from, found.to)
51
+ }
52
+ let min = null, max = null
53
+ for (let i = 0; i < this.lines.length; ++i) {
54
+ let line = this.lines[i]
55
+ let span = getMarkedSpanFor(line.markedSpans, this)
56
+ if (cm && !this.collapsed) regLineChange(cm, lineNo(line), "text")
57
+ else if (cm) {
58
+ if (span.to != null) max = lineNo(line)
59
+ if (span.from != null) min = lineNo(line)
60
+ }
61
+ line.markedSpans = removeMarkedSpan(line.markedSpans, span)
62
+ if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)
63
+ updateLineHeight(line, textHeight(cm.display))
64
+ }
65
+ if (cm && this.collapsed && !cm.options.lineWrapping) for (let i = 0; i < this.lines.length; ++i) {
66
+ let visual = visualLine(this.lines[i]), len = lineLength(visual)
67
+ if (len > cm.display.maxLineLength) {
68
+ cm.display.maxLine = visual
69
+ cm.display.maxLineLength = len
70
+ cm.display.maxLineChanged = true
71
+ }
72
+ }
73
+
74
+ if (min != null && cm && this.collapsed) regChange(cm, min, max + 1)
75
+ this.lines.length = 0
76
+ this.explicitlyCleared = true
77
+ if (this.atomic && this.doc.cantEdit) {
78
+ this.doc.cantEdit = false
79
+ if (cm) reCheckSelection(cm.doc)
80
+ }
81
+ if (cm) signalLater(cm, "markerCleared", cm, this, min, max)
82
+ if (withOp) endOperation(cm)
83
+ if (this.parent) this.parent.clear()
84
+ }
85
+
86
+ // Find the position of the marker in the document. Returns a {from,
87
+ // to} object by default. Side can be passed to get a specific side
88
+ // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the
89
+ // Pos objects returned contain a line object, rather than a line
90
+ // number (used to prevent looking up the same line twice).
91
+ find(side, lineObj) {
92
+ if (side == null && this.type == "bookmark") side = 1
93
+ let from, to
94
+ for (let i = 0; i < this.lines.length; ++i) {
95
+ let line = this.lines[i]
96
+ let span = getMarkedSpanFor(line.markedSpans, this)
97
+ if (span.from != null) {
98
+ from = Pos(lineObj ? line : lineNo(line), span.from)
99
+ if (side == -1) return from
100
+ }
101
+ if (span.to != null) {
102
+ to = Pos(lineObj ? line : lineNo(line), span.to)
103
+ if (side == 1) return to
104
+ }
105
+ }
106
+ return from && {from: from, to: to}
107
+ }
108
+
109
+ // Signals that the marker's widget changed, and surrounding layout
110
+ // should be recomputed.
111
+ changed() {
112
+ let pos = this.find(-1, true), widget = this, cm = this.doc.cm
113
+ if (!pos || !cm) return
114
+ runInOp(cm, () => {
115
+ let line = pos.line, lineN = lineNo(pos.line)
116
+ let view = findViewForLine(cm, lineN)
117
+ if (view) {
118
+ clearLineMeasurementCacheFor(view)
119
+ cm.curOp.selectionChanged = cm.curOp.forceUpdate = true
120
+ }
121
+ cm.curOp.updateMaxLine = true
122
+ if (!lineIsHidden(widget.doc, line) && widget.height != null) {
123
+ let oldHeight = widget.height
124
+ widget.height = null
125
+ let dHeight = widgetHeight(widget) - oldHeight
126
+ if (dHeight)
127
+ updateLineHeight(line, line.height + dHeight)
128
+ }
129
+ signalLater(cm, "markerChanged", cm, this)
130
+ })
131
+ }
132
+
133
+ attachLine(line) {
134
+ if (!this.lines.length && this.doc.cm) {
135
+ let op = this.doc.cm.curOp
136
+ if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)
137
+ (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this)
138
+ }
139
+ this.lines.push(line)
140
+ }
141
+
142
+ detachLine(line) {
143
+ this.lines.splice(indexOf(this.lines, line), 1)
144
+ if (!this.lines.length && this.doc.cm) {
145
+ let op = this.doc.cm.curOp
146
+ ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this)
147
+ }
148
+ }
149
+ }
150
+ eventMixin(TextMarker)
151
+
152
+ // Create a marker, wire it up to the right lines, and
153
+ export function markText(doc, from, to, options, type) {
154
+ // Shared markers (across linked documents) are handled separately
155
+ // (markTextShared will call out to this again, once per
156
+ // document).
157
+ if (options && options.shared) return markTextShared(doc, from, to, options, type)
158
+ // Ensure we are in an operation.
159
+ if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type)
160
+
161
+ let marker = new TextMarker(doc, type), diff = cmp(from, to)
162
+ if (options) copyObj(options, marker, false)
163
+ // Don't connect empty markers unless clearWhenEmpty is false
164
+ if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)
165
+ return marker
166
+ if (marker.replacedWith) {
167
+ // Showing up as a widget implies collapsed (widget replaces text)
168
+ marker.collapsed = true
169
+ marker.widgetNode = eltP("span", [marker.replacedWith], "CodeMirror-widget")
170
+ if (!options.handleMouseEvents) marker.widgetNode.setAttribute("cm-ignore-events", "true")
171
+ if (options.insertLeft) marker.widgetNode.insertLeft = true
172
+ }
173
+ if (marker.collapsed) {
174
+ if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||
175
+ from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))
176
+ throw new Error("Inserting collapsed marker partially overlapping an existing one")
177
+ seeCollapsedSpans()
178
+ }
179
+
180
+ if (marker.addToHistory)
181
+ addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN)
182
+
183
+ let curLine = from.line, cm = doc.cm, updateMaxLine
184
+ doc.iter(curLine, to.line + 1, line => {
185
+ if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)
186
+ updateMaxLine = true
187
+ if (marker.collapsed && curLine != from.line) updateLineHeight(line, 0)
188
+ addMarkedSpan(line, new MarkedSpan(marker,
189
+ curLine == from.line ? from.ch : null,
190
+ curLine == to.line ? to.ch : null))
191
+ ++curLine
192
+ })
193
+ // lineIsHidden depends on the presence of the spans, so needs a second pass
194
+ if (marker.collapsed) doc.iter(from.line, to.line + 1, line => {
195
+ if (lineIsHidden(doc, line)) updateLineHeight(line, 0)
196
+ })
197
+
198
+ if (marker.clearOnEnter) on(marker, "beforeCursorEnter", () => marker.clear())
199
+
200
+ if (marker.readOnly) {
201
+ seeReadOnlySpans()
202
+ if (doc.history.done.length || doc.history.undone.length)
203
+ doc.clearHistory()
204
+ }
205
+ if (marker.collapsed) {
206
+ marker.id = ++nextMarkerId
207
+ marker.atomic = true
208
+ }
209
+ if (cm) {
210
+ // Sync editor state
211
+ if (updateMaxLine) cm.curOp.updateMaxLine = true
212
+ if (marker.collapsed)
213
+ regChange(cm, from.line, to.line + 1)
214
+ else if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.css)
215
+ for (let i = from.line; i <= to.line; i++) regLineChange(cm, i, "text")
216
+ if (marker.atomic) reCheckSelection(cm.doc)
217
+ signalLater(cm, "markerAdded", cm, marker)
218
+ }
219
+ return marker
220
+ }
221
+
222
+ // SHARED TEXTMARKERS
223
+
224
+ // A shared marker spans multiple linked documents. It is
225
+ // implemented as a meta-marker-object controlling multiple normal
226
+ // markers.
227
+ export class SharedTextMarker {
228
+ constructor(markers, primary) {
229
+ this.markers = markers
230
+ this.primary = primary
231
+ for (let i = 0; i < markers.length; ++i)
232
+ markers[i].parent = this
233
+ }
234
+
235
+ clear() {
236
+ if (this.explicitlyCleared) return
237
+ this.explicitlyCleared = true
238
+ for (let i = 0; i < this.markers.length; ++i)
239
+ this.markers[i].clear()
240
+ signalLater(this, "clear")
241
+ }
242
+
243
+ find(side, lineObj) {
244
+ return this.primary.find(side, lineObj)
245
+ }
246
+ }
247
+ eventMixin(SharedTextMarker)
248
+
249
+ function markTextShared(doc, from, to, options, type) {
250
+ options = copyObj(options)
251
+ options.shared = false
252
+ let markers = [markText(doc, from, to, options, type)], primary = markers[0]
253
+ let widget = options.widgetNode
254
+ linkedDocs(doc, doc => {
255
+ if (widget) options.widgetNode = widget.cloneNode(true)
256
+ markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type))
257
+ for (let i = 0; i < doc.linked.length; ++i)
258
+ if (doc.linked[i].isParent) return
259
+ primary = lst(markers)
260
+ })
261
+ return new SharedTextMarker(markers, primary)
262
+ }
263
+
264
+ export function findSharedMarkers(doc) {
265
+ return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), m => m.parent)
266
+ }
267
+
268
+ export function copySharedMarkers(doc, markers) {
269
+ for (let i = 0; i < markers.length; i++) {
270
+ let marker = markers[i], pos = marker.find()
271
+ let mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to)
272
+ if (cmp(mFrom, mTo)) {
273
+ let subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type)
274
+ marker.markers.push(subMark)
275
+ subMark.parent = marker
276
+ }
277
+ }
278
+ }
279
+
280
+ export function detachSharedMarkers(markers) {
281
+ for (let i = 0; i < markers.length; i++) {
282
+ let marker = markers[i], linked = [marker.primary.doc]
283
+ linkedDocs(marker.primary.doc, d => linked.push(d))
284
+ for (let j = 0; j < marker.markers.length; j++) {
285
+ let subMarker = marker.markers[j]
286
+ if (indexOf(linked, subMarker.doc) == -1) {
287
+ subMarker.parent = null
288
+ marker.markers.splice(j--, 1)
289
+ }
290
+ }
291
+ }
292
+ }