@muze-nl/simplystore 0.3.6 → 0.4.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 (328) hide show
  1. package/package.json +2 -2
  2. package/package.json~ +33 -0
  3. package/src/server.mjs +68 -61
  4. package/www/codemirror/addon/comment/comment.js +0 -211
  5. package/www/codemirror/addon/comment/continuecomment.js +0 -114
  6. package/www/codemirror/addon/dialog/dialog.css +0 -32
  7. package/www/codemirror/addon/dialog/dialog.js +0 -163
  8. package/www/codemirror/addon/display/autorefresh.js +0 -47
  9. package/www/codemirror/addon/display/fullscreen.css +0 -6
  10. package/www/codemirror/addon/display/fullscreen.js +0 -41
  11. package/www/codemirror/addon/display/panel.js +0 -133
  12. package/www/codemirror/addon/display/placeholder.js +0 -78
  13. package/www/codemirror/addon/display/rulers.js +0 -51
  14. package/www/codemirror/addon/edit/closebrackets.js +0 -201
  15. package/www/codemirror/addon/edit/closetag.js +0 -185
  16. package/www/codemirror/addon/edit/continuelist.js +0 -101
  17. package/www/codemirror/addon/edit/matchbrackets.js +0 -160
  18. package/www/codemirror/addon/edit/matchtags.js +0 -66
  19. package/www/codemirror/addon/edit/trailingspace.js +0 -27
  20. package/www/codemirror/addon/fold/brace-fold.js +0 -119
  21. package/www/codemirror/addon/fold/comment-fold.js +0 -59
  22. package/www/codemirror/addon/fold/foldcode.js +0 -159
  23. package/www/codemirror/addon/fold/foldgutter.css +0 -20
  24. package/www/codemirror/addon/fold/foldgutter.js +0 -169
  25. package/www/codemirror/addon/fold/indent-fold.js +0 -48
  26. package/www/codemirror/addon/fold/markdown-fold.js +0 -49
  27. package/www/codemirror/addon/fold/xml-fold.js +0 -184
  28. package/www/codemirror/addon/hint/anyword-hint.js +0 -41
  29. package/www/codemirror/addon/hint/css-hint.js +0 -66
  30. package/www/codemirror/addon/hint/html-hint.js +0 -351
  31. package/www/codemirror/addon/hint/javascript-hint.js +0 -162
  32. package/www/codemirror/addon/hint/show-hint.css +0 -37
  33. package/www/codemirror/addon/hint/show-hint.js +0 -523
  34. package/www/codemirror/addon/hint/sql-hint.js +0 -304
  35. package/www/codemirror/addon/hint/xml-hint.js +0 -132
  36. package/www/codemirror/addon/lint/coffeescript-lint.js +0 -47
  37. package/www/codemirror/addon/lint/css-lint.js +0 -40
  38. package/www/codemirror/addon/lint/html-lint.js +0 -59
  39. package/www/codemirror/addon/lint/json-lint.js +0 -40
  40. package/www/codemirror/addon/lint/yaml-lint.js +0 -41
  41. package/www/codemirror/addon/merge/merge.css +0 -119
  42. package/www/codemirror/addon/merge/merge.js +0 -1018
  43. package/www/codemirror/addon/mode/loadmode.js +0 -66
  44. package/www/codemirror/addon/mode/multiplex.js +0 -136
  45. package/www/codemirror/addon/mode/multiplex_test.js +0 -49
  46. package/www/codemirror/addon/mode/overlay.js +0 -90
  47. package/www/codemirror/addon/mode/simple.js +0 -216
  48. package/www/codemirror/addon/runmode/colorize.js +0 -40
  49. package/www/codemirror/addon/runmode/runmode-standalone.js +0 -334
  50. package/www/codemirror/addon/runmode/runmode.js +0 -76
  51. package/www/codemirror/addon/runmode/runmode.node.js +0 -329
  52. package/www/codemirror/addon/scroll/annotatescrollbar.js +0 -128
  53. package/www/codemirror/addon/scroll/scrollpastend.js +0 -48
  54. package/www/codemirror/addon/scroll/simplescrollbars.css +0 -66
  55. package/www/codemirror/addon/scroll/simplescrollbars.js +0 -152
  56. package/www/codemirror/addon/search/jump-to-line.js +0 -53
  57. package/www/codemirror/addon/search/match-highlighter.js +0 -167
  58. package/www/codemirror/addon/search/matchesonscrollbar.css +0 -8
  59. package/www/codemirror/addon/search/matchesonscrollbar.js +0 -97
  60. package/www/codemirror/addon/search/search.js +0 -295
  61. package/www/codemirror/addon/search/searchcursor.js +0 -305
  62. package/www/codemirror/addon/selection/active-line.js +0 -72
  63. package/www/codemirror/addon/selection/mark-selection.js +0 -119
  64. package/www/codemirror/addon/selection/selection-pointer.js +0 -98
  65. package/www/codemirror/addon/tern/tern.css +0 -87
  66. package/www/codemirror/addon/tern/tern.js +0 -756
  67. package/www/codemirror/addon/tern/worker.js +0 -44
  68. package/www/codemirror/addon/wrap/hardwrap.js +0 -160
  69. package/www/codemirror/bin/source-highlight +0 -48
  70. package/www/codemirror/keymap/emacs.js +0 -545
  71. package/www/codemirror/keymap/sublime.js +0 -720
  72. package/www/codemirror/keymap/vim.js +0 -5978
  73. package/www/codemirror/mode/apl/apl.js +0 -174
  74. package/www/codemirror/mode/asciiarmor/asciiarmor.js +0 -74
  75. package/www/codemirror/mode/asn.1/asn.1.js +0 -204
  76. package/www/codemirror/mode/asterisk/asterisk.js +0 -220
  77. package/www/codemirror/mode/brainfuck/brainfuck.js +0 -85
  78. package/www/codemirror/mode/clike/clike.js +0 -940
  79. package/www/codemirror/mode/clojure/clojure.js +0 -292
  80. package/www/codemirror/mode/cmake/cmake.js +0 -97
  81. package/www/codemirror/mode/cobol/cobol.js +0 -255
  82. package/www/codemirror/mode/coffeescript/coffeescript.js +0 -359
  83. package/www/codemirror/mode/commonlisp/commonlisp.js +0 -125
  84. package/www/codemirror/mode/crystal/crystal.js +0 -433
  85. package/www/codemirror/mode/css/css.js +0 -862
  86. package/www/codemirror/mode/cypher/cypher.js +0 -152
  87. package/www/codemirror/mode/d/d.js +0 -223
  88. package/www/codemirror/mode/dart/dart.js +0 -166
  89. package/www/codemirror/mode/diff/diff.js +0 -47
  90. package/www/codemirror/mode/django/django.js +0 -356
  91. package/www/codemirror/mode/dockerfile/dockerfile.js +0 -211
  92. package/www/codemirror/mode/dtd/dtd.js +0 -142
  93. package/www/codemirror/mode/dylan/dylan.js +0 -352
  94. package/www/codemirror/mode/ebnf/ebnf.js +0 -195
  95. package/www/codemirror/mode/ecl/ecl.js +0 -206
  96. package/www/codemirror/mode/eiffel/eiffel.js +0 -160
  97. package/www/codemirror/mode/elm/elm.js +0 -245
  98. package/www/codemirror/mode/erlang/erlang.js +0 -619
  99. package/www/codemirror/mode/factor/factor.js +0 -85
  100. package/www/codemirror/mode/fcl/fcl.js +0 -173
  101. package/www/codemirror/mode/forth/forth.js +0 -180
  102. package/www/codemirror/mode/fortran/fortran.js +0 -188
  103. package/www/codemirror/mode/gas/gas.js +0 -353
  104. package/www/codemirror/mode/gfm/gfm.js +0 -129
  105. package/www/codemirror/mode/gherkin/gherkin.js +0 -178
  106. package/www/codemirror/mode/go/go.js +0 -187
  107. package/www/codemirror/mode/groovy/groovy.js +0 -247
  108. package/www/codemirror/mode/haml/haml.js +0 -161
  109. package/www/codemirror/mode/handlebars/handlebars.js +0 -70
  110. package/www/codemirror/mode/haskell/haskell.js +0 -268
  111. package/www/codemirror/mode/haskell-literate/haskell-literate.js +0 -43
  112. package/www/codemirror/mode/haxe/haxe.js +0 -515
  113. package/www/codemirror/mode/htmlembedded/htmlembedded.js +0 -37
  114. package/www/codemirror/mode/htmlmixed/htmlmixed.js +0 -153
  115. package/www/codemirror/mode/http/http.js +0 -113
  116. package/www/codemirror/mode/idl/idl.js +0 -290
  117. package/www/codemirror/mode/jinja2/jinja2.js +0 -193
  118. package/www/codemirror/mode/jsx/jsx.js +0 -148
  119. package/www/codemirror/mode/julia/julia.js +0 -390
  120. package/www/codemirror/mode/livescript/livescript.js +0 -280
  121. package/www/codemirror/mode/lua/lua.js +0 -160
  122. package/www/codemirror/mode/markdown/markdown.js +0 -886
  123. package/www/codemirror/mode/mathematica/mathematica.js +0 -176
  124. package/www/codemirror/mode/mbox/mbox.js +0 -129
  125. package/www/codemirror/mode/meta.js +0 -221
  126. package/www/codemirror/mode/mirc/mirc.js +0 -193
  127. package/www/codemirror/mode/mllike/mllike.js +0 -359
  128. package/www/codemirror/mode/modelica/modelica.js +0 -245
  129. package/www/codemirror/mode/mscgen/mscgen.js +0 -175
  130. package/www/codemirror/mode/mumps/mumps.js +0 -148
  131. package/www/codemirror/mode/nginx/nginx.js +0 -178
  132. package/www/codemirror/mode/nsis/nsis.js +0 -95
  133. package/www/codemirror/mode/ntriples/ntriples.js +0 -195
  134. package/www/codemirror/mode/octave/octave.js +0 -139
  135. package/www/codemirror/mode/oz/oz.js +0 -252
  136. package/www/codemirror/mode/pascal/pascal.js +0 -136
  137. package/www/codemirror/mode/pegjs/pegjs.js +0 -111
  138. package/www/codemirror/mode/perl/perl.js +0 -836
  139. package/www/codemirror/mode/php/php.js +0 -234
  140. package/www/codemirror/mode/pig/pig.js +0 -178
  141. package/www/codemirror/mode/powershell/powershell.js +0 -398
  142. package/www/codemirror/mode/properties/properties.js +0 -78
  143. package/www/codemirror/mode/protobuf/protobuf.js +0 -72
  144. package/www/codemirror/mode/pug/pug.js +0 -591
  145. package/www/codemirror/mode/puppet/puppet.js +0 -220
  146. package/www/codemirror/mode/python/python.js +0 -402
  147. package/www/codemirror/mode/q/q.js +0 -139
  148. package/www/codemirror/mode/r/r.js +0 -190
  149. package/www/codemirror/mode/rpm/changes/index.html +0 -66
  150. package/www/codemirror/mode/rpm/rpm.js +0 -109
  151. package/www/codemirror/mode/rst/rst.js +0 -557
  152. package/www/codemirror/mode/ruby/ruby.js +0 -303
  153. package/www/codemirror/mode/rust/rust.js +0 -72
  154. package/www/codemirror/mode/sas/sas.js +0 -303
  155. package/www/codemirror/mode/sass/sass.js +0 -459
  156. package/www/codemirror/mode/scheme/scheme.js +0 -284
  157. package/www/codemirror/mode/shell/shell.js +0 -168
  158. package/www/codemirror/mode/sieve/sieve.js +0 -193
  159. package/www/codemirror/mode/slim/slim.js +0 -575
  160. package/www/codemirror/mode/smalltalk/smalltalk.js +0 -168
  161. package/www/codemirror/mode/smarty/smarty.js +0 -225
  162. package/www/codemirror/mode/solr/solr.js +0 -104
  163. package/www/codemirror/mode/soy/soy.js +0 -665
  164. package/www/codemirror/mode/sparql/sparql.js +0 -184
  165. package/www/codemirror/mode/spreadsheet/spreadsheet.js +0 -112
  166. package/www/codemirror/mode/sql/sql.js +0 -525
  167. package/www/codemirror/mode/stex/stex.js +0 -264
  168. package/www/codemirror/mode/stylus/stylus.js +0 -775
  169. package/www/codemirror/mode/swift/swift.js +0 -221
  170. package/www/codemirror/mode/tcl/tcl.js +0 -140
  171. package/www/codemirror/mode/textile/textile.js +0 -469
  172. package/www/codemirror/mode/tiddlywiki/tiddlywiki.css +0 -14
  173. package/www/codemirror/mode/tiddlywiki/tiddlywiki.js +0 -308
  174. package/www/codemirror/mode/tiki/tiki.css +0 -26
  175. package/www/codemirror/mode/tiki/tiki.js +0 -312
  176. package/www/codemirror/mode/toml/toml.js +0 -88
  177. package/www/codemirror/mode/tornado/tornado.js +0 -68
  178. package/www/codemirror/mode/troff/troff.js +0 -84
  179. package/www/codemirror/mode/ttcn/ttcn.js +0 -283
  180. package/www/codemirror/mode/ttcn-cfg/ttcn-cfg.js +0 -214
  181. package/www/codemirror/mode/turtle/turtle.js +0 -162
  182. package/www/codemirror/mode/twig/twig.js +0 -141
  183. package/www/codemirror/mode/vb/vb.js +0 -275
  184. package/www/codemirror/mode/vbscript/vbscript.js +0 -350
  185. package/www/codemirror/mode/velocity/velocity.js +0 -202
  186. package/www/codemirror/mode/verilog/verilog.js +0 -781
  187. package/www/codemirror/mode/vhdl/vhdl.js +0 -189
  188. package/www/codemirror/mode/vue/vue.js +0 -77
  189. package/www/codemirror/mode/wast/wast.js +0 -132
  190. package/www/codemirror/mode/webidl/webidl.js +0 -195
  191. package/www/codemirror/mode/xml/xml.js +0 -417
  192. package/www/codemirror/mode/xquery/xquery.js +0 -448
  193. package/www/codemirror/mode/yacas/yacas.js +0 -204
  194. package/www/codemirror/mode/yaml/yaml.js +0 -120
  195. package/www/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js +0 -72
  196. package/www/codemirror/mode/z80/z80.js +0 -116
  197. package/www/codemirror/rollup.config.js +0 -52
  198. package/www/codemirror/src/addon/runmode/codemirror-standalone.js +0 -24
  199. package/www/codemirror/src/addon/runmode/codemirror.node.js +0 -21
  200. package/www/codemirror/src/addon/runmode/runmode-standalone.js +0 -2
  201. package/www/codemirror/src/addon/runmode/runmode.node.js +0 -2
  202. package/www/codemirror/src/codemirror.js +0 -3
  203. package/www/codemirror/src/display/Display.js +0 -116
  204. package/www/codemirror/src/display/focus.js +0 -50
  205. package/www/codemirror/src/display/gutters.js +0 -44
  206. package/www/codemirror/src/display/highlight_worker.js +0 -55
  207. package/www/codemirror/src/display/line_numbers.js +0 -48
  208. package/www/codemirror/src/display/mode_state.js +0 -22
  209. package/www/codemirror/src/display/operations.js +0 -206
  210. package/www/codemirror/src/display/scroll_events.js +0 -132
  211. package/www/codemirror/src/display/scrollbars.js +0 -194
  212. package/www/codemirror/src/display/scrolling.js +0 -186
  213. package/www/codemirror/src/display/selection.js +0 -173
  214. package/www/codemirror/src/display/update_display.js +0 -267
  215. package/www/codemirror/src/display/update_line.js +0 -189
  216. package/www/codemirror/src/display/update_lines.js +0 -82
  217. package/www/codemirror/src/display/view_tracking.js +0 -153
  218. package/www/codemirror/src/edit/CodeMirror.js +0 -217
  219. package/www/codemirror/src/edit/commands.js +0 -178
  220. package/www/codemirror/src/edit/deleteNearSelection.js +0 -30
  221. package/www/codemirror/src/edit/drop_events.js +0 -130
  222. package/www/codemirror/src/edit/fromTextArea.js +0 -61
  223. package/www/codemirror/src/edit/global_events.js +0 -45
  224. package/www/codemirror/src/edit/key_events.js +0 -163
  225. package/www/codemirror/src/edit/legacy.js +0 -62
  226. package/www/codemirror/src/edit/main.js +0 -69
  227. package/www/codemirror/src/edit/methods.js +0 -555
  228. package/www/codemirror/src/edit/mouse_events.js +0 -417
  229. package/www/codemirror/src/edit/options.js +0 -194
  230. package/www/codemirror/src/edit/utils.js +0 -7
  231. package/www/codemirror/src/input/ContentEditableInput.js +0 -546
  232. package/www/codemirror/src/input/TextareaInput.js +0 -380
  233. package/www/codemirror/src/input/indent.js +0 -71
  234. package/www/codemirror/src/input/input.js +0 -134
  235. package/www/codemirror/src/input/keymap.js +0 -147
  236. package/www/codemirror/src/input/keynames.js +0 -17
  237. package/www/codemirror/src/input/movement.js +0 -111
  238. package/www/codemirror/src/line/highlight.js +0 -284
  239. package/www/codemirror/src/line/line_data.js +0 -349
  240. package/www/codemirror/src/line/pos.js +0 -40
  241. package/www/codemirror/src/line/saw_special_spans.js +0 -10
  242. package/www/codemirror/src/line/spans.js +0 -390
  243. package/www/codemirror/src/line/utils_line.js +0 -85
  244. package/www/codemirror/src/measurement/position_measurement.js +0 -702
  245. package/www/codemirror/src/measurement/widgets.js +0 -26
  246. package/www/codemirror/src/model/Doc.js +0 -436
  247. package/www/codemirror/src/model/change_measurement.js +0 -61
  248. package/www/codemirror/src/model/changes.js +0 -339
  249. package/www/codemirror/src/model/chunk.js +0 -167
  250. package/www/codemirror/src/model/document_data.js +0 -112
  251. package/www/codemirror/src/model/history.js +0 -228
  252. package/www/codemirror/src/model/line_widget.js +0 -78
  253. package/www/codemirror/src/model/mark_text.js +0 -293
  254. package/www/codemirror/src/model/selection.js +0 -84
  255. package/www/codemirror/src/model/selection_updates.js +0 -216
  256. package/www/codemirror/src/modes.js +0 -96
  257. package/www/codemirror/src/util/StringStream.js +0 -90
  258. package/www/codemirror/src/util/bidi.js +0 -215
  259. package/www/codemirror/src/util/browser.js +0 -34
  260. package/www/codemirror/src/util/dom.js +0 -101
  261. package/www/codemirror/src/util/event.js +0 -103
  262. package/www/codemirror/src/util/feature_detection.js +0 -84
  263. package/www/codemirror/src/util/misc.js +0 -168
  264. package/www/codemirror/src/util/operation_group.js +0 -72
  265. package/www/codemirror/theme/3024-day.css +0 -41
  266. package/www/codemirror/theme/3024-night.css +0 -39
  267. package/www/codemirror/theme/abbott.css +0 -268
  268. package/www/codemirror/theme/abcdef.css +0 -32
  269. package/www/codemirror/theme/ambiance-mobile.css +0 -5
  270. package/www/codemirror/theme/ambiance.css +0 -74
  271. package/www/codemirror/theme/ayu-dark.css +0 -44
  272. package/www/codemirror/theme/ayu-mirage.css +0 -45
  273. package/www/codemirror/theme/base16-dark.css +0 -40
  274. package/www/codemirror/theme/base16-light.css +0 -38
  275. package/www/codemirror/theme/bespin.css +0 -34
  276. package/www/codemirror/theme/blackboard.css +0 -32
  277. package/www/codemirror/theme/cobalt.css +0 -25
  278. package/www/codemirror/theme/colorforth.css +0 -33
  279. package/www/codemirror/theme/darcula.css +0 -53
  280. package/www/codemirror/theme/dracula.css +0 -40
  281. package/www/codemirror/theme/duotone-dark.css +0 -35
  282. package/www/codemirror/theme/duotone-light.css +0 -36
  283. package/www/codemirror/theme/eclipse.css +0 -23
  284. package/www/codemirror/theme/elegant.css +0 -13
  285. package/www/codemirror/theme/erlang-dark.css +0 -34
  286. package/www/codemirror/theme/gruvbox-dark.css +0 -39
  287. package/www/codemirror/theme/hopscotch.css +0 -34
  288. package/www/codemirror/theme/icecoder.css +0 -43
  289. package/www/codemirror/theme/idea.css +0 -42
  290. package/www/codemirror/theme/isotope.css +0 -34
  291. package/www/codemirror/theme/juejin.css +0 -30
  292. package/www/codemirror/theme/lesser-dark.css +0 -47
  293. package/www/codemirror/theme/liquibyte.css +0 -95
  294. package/www/codemirror/theme/lucario.css +0 -37
  295. package/www/codemirror/theme/material-darker.css +0 -135
  296. package/www/codemirror/theme/material-palenight.css +0 -141
  297. package/www/codemirror/theme/material.css +0 -141
  298. package/www/codemirror/theme/mbo.css +0 -37
  299. package/www/codemirror/theme/mdn-like.css +0 -46
  300. package/www/codemirror/theme/midnight.css +0 -39
  301. package/www/codemirror/theme/monokai.css +0 -41
  302. package/www/codemirror/theme/moxer.css +0 -143
  303. package/www/codemirror/theme/neat.css +0 -12
  304. package/www/codemirror/theme/neo.css +0 -43
  305. package/www/codemirror/theme/night.css +0 -27
  306. package/www/codemirror/theme/nord.css +0 -42
  307. package/www/codemirror/theme/oceanic-next.css +0 -46
  308. package/www/codemirror/theme/panda-syntax.css +0 -85
  309. package/www/codemirror/theme/paraiso-dark.css +0 -38
  310. package/www/codemirror/theme/paraiso-light.css +0 -38
  311. package/www/codemirror/theme/pastel-on-dark.css +0 -52
  312. package/www/codemirror/theme/railscasts.css +0 -34
  313. package/www/codemirror/theme/rubyblue.css +0 -25
  314. package/www/codemirror/theme/seti.css +0 -44
  315. package/www/codemirror/theme/shadowfox.css +0 -52
  316. package/www/codemirror/theme/solarized.css +0 -165
  317. package/www/codemirror/theme/ssms.css +0 -16
  318. package/www/codemirror/theme/the-matrix.css +0 -30
  319. package/www/codemirror/theme/tomorrow-night-bright.css +0 -35
  320. package/www/codemirror/theme/tomorrow-night-eighties.css +0 -38
  321. package/www/codemirror/theme/ttcn.css +0 -64
  322. package/www/codemirror/theme/twilight.css +0 -32
  323. package/www/codemirror/theme/vibrant-ink.css +0 -34
  324. package/www/codemirror/theme/xq-dark.css +0 -53
  325. package/www/codemirror/theme/xq-light.css +0 -43
  326. package/www/codemirror/theme/yeti.css +0 -44
  327. package/www/codemirror/theme/yonce.css +0 -59
  328. package/www/codemirror/theme/zenburn.css +0 -37
@@ -1,228 +0,0 @@
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(prev) {
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 = prev ? prev.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 = prev ? prev.maxGeneration : 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
- }
@@ -1,78 +0,0 @@
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, 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
- }
@@ -1,293 +0,0 @@
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), doc.cm && doc.cm.curOp)
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.startStyle || marker.endStyle || marker.css ||
215
- marker.attributes || marker.title)
216
- for (let i = from.line; i <= to.line; i++) regLineChange(cm, i, "text")
217
- if (marker.atomic) reCheckSelection(cm.doc)
218
- signalLater(cm, "markerAdded", cm, marker)
219
- }
220
- return marker
221
- }
222
-
223
- // SHARED TEXTMARKERS
224
-
225
- // A shared marker spans multiple linked documents. It is
226
- // implemented as a meta-marker-object controlling multiple normal
227
- // markers.
228
- export class SharedTextMarker {
229
- constructor(markers, primary) {
230
- this.markers = markers
231
- this.primary = primary
232
- for (let i = 0; i < markers.length; ++i)
233
- markers[i].parent = this
234
- }
235
-
236
- clear() {
237
- if (this.explicitlyCleared) return
238
- this.explicitlyCleared = true
239
- for (let i = 0; i < this.markers.length; ++i)
240
- this.markers[i].clear()
241
- signalLater(this, "clear")
242
- }
243
-
244
- find(side, lineObj) {
245
- return this.primary.find(side, lineObj)
246
- }
247
- }
248
- eventMixin(SharedTextMarker)
249
-
250
- function markTextShared(doc, from, to, options, type) {
251
- options = copyObj(options)
252
- options.shared = false
253
- let markers = [markText(doc, from, to, options, type)], primary = markers[0]
254
- let widget = options.widgetNode
255
- linkedDocs(doc, doc => {
256
- if (widget) options.widgetNode = widget.cloneNode(true)
257
- markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type))
258
- for (let i = 0; i < doc.linked.length; ++i)
259
- if (doc.linked[i].isParent) return
260
- primary = lst(markers)
261
- })
262
- return new SharedTextMarker(markers, primary)
263
- }
264
-
265
- export function findSharedMarkers(doc) {
266
- return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), m => m.parent)
267
- }
268
-
269
- export function copySharedMarkers(doc, markers) {
270
- for (let i = 0; i < markers.length; i++) {
271
- let marker = markers[i], pos = marker.find()
272
- let mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to)
273
- if (cmp(mFrom, mTo)) {
274
- let subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type)
275
- marker.markers.push(subMark)
276
- subMark.parent = marker
277
- }
278
- }
279
- }
280
-
281
- export function detachSharedMarkers(markers) {
282
- for (let i = 0; i < markers.length; i++) {
283
- let marker = markers[i], linked = [marker.primary.doc]
284
- linkedDocs(marker.primary.doc, d => linked.push(d))
285
- for (let j = 0; j < marker.markers.length; j++) {
286
- let subMarker = marker.markers[j]
287
- if (indexOf(linked, subMarker.doc) == -1) {
288
- subMarker.parent = null
289
- marker.markers.splice(j--, 1)
290
- }
291
- }
292
- }
293
- }
@@ -1,84 +0,0 @@
1
- import { cmp, copyPos, equalCursorPos, maxPos, minPos } from "../line/pos.js"
2
- import { indexOf } from "../util/misc.js"
3
-
4
- // Selection objects are immutable. A new one is created every time
5
- // the selection changes. A selection is one or more non-overlapping
6
- // (and non-touching) ranges, sorted, and an integer that indicates
7
- // which one is the primary selection (the one that's scrolled into
8
- // view, that getCursor returns, etc).
9
- export class Selection {
10
- constructor(ranges, primIndex) {
11
- this.ranges = ranges
12
- this.primIndex = primIndex
13
- }
14
-
15
- primary() { return this.ranges[this.primIndex] }
16
-
17
- equals(other) {
18
- if (other == this) return true
19
- if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) return false
20
- for (let i = 0; i < this.ranges.length; i++) {
21
- let here = this.ranges[i], there = other.ranges[i]
22
- if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) return false
23
- }
24
- return true
25
- }
26
-
27
- deepCopy() {
28
- let out = []
29
- for (let i = 0; i < this.ranges.length; i++)
30
- out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head))
31
- return new Selection(out, this.primIndex)
32
- }
33
-
34
- somethingSelected() {
35
- for (let i = 0; i < this.ranges.length; i++)
36
- if (!this.ranges[i].empty()) return true
37
- return false
38
- }
39
-
40
- contains(pos, end) {
41
- if (!end) end = pos
42
- for (let i = 0; i < this.ranges.length; i++) {
43
- let range = this.ranges[i]
44
- if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)
45
- return i
46
- }
47
- return -1
48
- }
49
- }
50
-
51
- export class Range {
52
- constructor(anchor, head) {
53
- this.anchor = anchor; this.head = head
54
- }
55
-
56
- from() { return minPos(this.anchor, this.head) }
57
- to() { return maxPos(this.anchor, this.head) }
58
- empty() { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch }
59
- }
60
-
61
- // Take an unsorted, potentially overlapping set of ranges, and
62
- // build a selection out of it. 'Consumes' ranges array (modifying
63
- // it).
64
- export function normalizeSelection(cm, ranges, primIndex) {
65
- let mayTouch = cm && cm.options.selectionsMayTouch
66
- let prim = ranges[primIndex]
67
- ranges.sort((a, b) => cmp(a.from(), b.from()))
68
- primIndex = indexOf(ranges, prim)
69
- for (let i = 1; i < ranges.length; i++) {
70
- let cur = ranges[i], prev = ranges[i - 1]
71
- let diff = cmp(prev.to(), cur.from())
72
- if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) {
73
- let from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to())
74
- let inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head
75
- if (i <= primIndex) --primIndex
76
- ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to))
77
- }
78
- }
79
- return new Selection(ranges, primIndex)
80
- }
81
-
82
- export function simpleSelection(anchor, head) {
83
- return new Selection([new Range(anchor, head || anchor)], 0)
84
- }