@muze-nl/simplystore 0.1.2

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 (366) hide show
  1. package/.dockerignore +8 -0
  2. package/.github/workflows/docker-build.yml +45 -0
  3. package/.gitignore~ +1 -0
  4. package/Dockerfile +60 -0
  5. package/LICENSE +21 -0
  6. package/README.md +99 -0
  7. package/data.jsontag +20 -0
  8. package/design/access-management.md +25 -0
  9. package/design/acid.md +31 -0
  10. package/design/commands.md +25 -0
  11. package/design/identity.md +71 -0
  12. package/design/immutability.md +26 -0
  13. package/design/jsontag-selector.md +365 -0
  14. package/design/multitasking.md +13 -0
  15. package/design/thoughts.md +32 -0
  16. package/docs/docker.md +129 -0
  17. package/package.json +29 -0
  18. package/package.json~ +29 -0
  19. package/src/run.mjs +3 -0
  20. package/src/server.mjs +323 -0
  21. package/src/triplestore.mjs +182 -0
  22. package/www/assets/css/style.css +2296 -0
  23. package/www/assets/feather-sprite.svg +1 -0
  24. package/www/assets/img/simplystore-narrow-white.svg +138 -0
  25. package/www/assets/img/simplystore-narrow.svg +138 -0
  26. package/www/assets/img/simplystore-white.svg +153 -0
  27. package/www/assets/img/simplystore.svg +153 -0
  28. package/www/codemirror/AUTHORS +979 -0
  29. package/www/codemirror/CHANGELOG.md +2208 -0
  30. package/www/codemirror/CONTRIBUTING.md +92 -0
  31. package/www/codemirror/LICENSE +21 -0
  32. package/www/codemirror/README.md +47 -0
  33. package/www/codemirror/addon/comment/comment.js +211 -0
  34. package/www/codemirror/addon/comment/continuecomment.js +114 -0
  35. package/www/codemirror/addon/dialog/dialog.css +32 -0
  36. package/www/codemirror/addon/dialog/dialog.js +163 -0
  37. package/www/codemirror/addon/display/autorefresh.js +47 -0
  38. package/www/codemirror/addon/display/fullscreen.css +6 -0
  39. package/www/codemirror/addon/display/fullscreen.js +41 -0
  40. package/www/codemirror/addon/display/panel.js +133 -0
  41. package/www/codemirror/addon/display/placeholder.js +78 -0
  42. package/www/codemirror/addon/display/rulers.js +51 -0
  43. package/www/codemirror/addon/edit/closebrackets.js +201 -0
  44. package/www/codemirror/addon/edit/closetag.js +185 -0
  45. package/www/codemirror/addon/edit/continuelist.js +101 -0
  46. package/www/codemirror/addon/edit/matchbrackets.js +160 -0
  47. package/www/codemirror/addon/edit/matchtags.js +66 -0
  48. package/www/codemirror/addon/edit/trailingspace.js +27 -0
  49. package/www/codemirror/addon/fold/brace-fold.js +119 -0
  50. package/www/codemirror/addon/fold/comment-fold.js +59 -0
  51. package/www/codemirror/addon/fold/foldcode.js +159 -0
  52. package/www/codemirror/addon/fold/foldgutter.css +20 -0
  53. package/www/codemirror/addon/fold/foldgutter.js +169 -0
  54. package/www/codemirror/addon/fold/indent-fold.js +48 -0
  55. package/www/codemirror/addon/fold/markdown-fold.js +49 -0
  56. package/www/codemirror/addon/fold/xml-fold.js +184 -0
  57. package/www/codemirror/addon/hint/anyword-hint.js +41 -0
  58. package/www/codemirror/addon/hint/css-hint.js +66 -0
  59. package/www/codemirror/addon/hint/html-hint.js +351 -0
  60. package/www/codemirror/addon/hint/javascript-hint.js +162 -0
  61. package/www/codemirror/addon/hint/show-hint.css +37 -0
  62. package/www/codemirror/addon/hint/show-hint.js +523 -0
  63. package/www/codemirror/addon/hint/sql-hint.js +304 -0
  64. package/www/codemirror/addon/hint/xml-hint.js +132 -0
  65. package/www/codemirror/addon/lint/coffeescript-lint.js +47 -0
  66. package/www/codemirror/addon/lint/css-lint.js +40 -0
  67. package/www/codemirror/addon/lint/html-lint.js +59 -0
  68. package/www/codemirror/addon/lint/javascript-lint.js +65 -0
  69. package/www/codemirror/addon/lint/json-lint.js +40 -0
  70. package/www/codemirror/addon/lint/lint.css +79 -0
  71. package/www/codemirror/addon/lint/lint.js +291 -0
  72. package/www/codemirror/addon/lint/yaml-lint.js +41 -0
  73. package/www/codemirror/addon/merge/merge.css +119 -0
  74. package/www/codemirror/addon/merge/merge.js +1018 -0
  75. package/www/codemirror/addon/mode/loadmode.js +66 -0
  76. package/www/codemirror/addon/mode/multiplex.js +136 -0
  77. package/www/codemirror/addon/mode/multiplex_test.js +49 -0
  78. package/www/codemirror/addon/mode/overlay.js +90 -0
  79. package/www/codemirror/addon/mode/simple.js +216 -0
  80. package/www/codemirror/addon/runmode/colorize.js +40 -0
  81. package/www/codemirror/addon/runmode/runmode-standalone.js +334 -0
  82. package/www/codemirror/addon/runmode/runmode.js +76 -0
  83. package/www/codemirror/addon/runmode/runmode.node.js +329 -0
  84. package/www/codemirror/addon/scroll/annotatescrollbar.js +128 -0
  85. package/www/codemirror/addon/scroll/scrollpastend.js +48 -0
  86. package/www/codemirror/addon/scroll/simplescrollbars.css +66 -0
  87. package/www/codemirror/addon/scroll/simplescrollbars.js +152 -0
  88. package/www/codemirror/addon/search/jump-to-line.js +53 -0
  89. package/www/codemirror/addon/search/match-highlighter.js +167 -0
  90. package/www/codemirror/addon/search/matchesonscrollbar.css +8 -0
  91. package/www/codemirror/addon/search/matchesonscrollbar.js +97 -0
  92. package/www/codemirror/addon/search/search.js +295 -0
  93. package/www/codemirror/addon/search/searchcursor.js +305 -0
  94. package/www/codemirror/addon/selection/active-line.js +72 -0
  95. package/www/codemirror/addon/selection/mark-selection.js +119 -0
  96. package/www/codemirror/addon/selection/selection-pointer.js +98 -0
  97. package/www/codemirror/addon/tern/tern.css +87 -0
  98. package/www/codemirror/addon/tern/tern.js +756 -0
  99. package/www/codemirror/addon/tern/worker.js +44 -0
  100. package/www/codemirror/addon/wrap/hardwrap.js +160 -0
  101. package/www/codemirror/bin/source-highlight +48 -0
  102. package/www/codemirror/keymap/emacs.js +545 -0
  103. package/www/codemirror/keymap/sublime.js +720 -0
  104. package/www/codemirror/keymap/vim.js +5978 -0
  105. package/www/codemirror/lib/codemirror.css +344 -0
  106. package/www/codemirror/lib/codemirror.js +9874 -0
  107. package/www/codemirror/mode/apl/apl.js +174 -0
  108. package/www/codemirror/mode/asciiarmor/asciiarmor.js +74 -0
  109. package/www/codemirror/mode/asn.1/asn.1.js +204 -0
  110. package/www/codemirror/mode/asterisk/asterisk.js +220 -0
  111. package/www/codemirror/mode/brainfuck/brainfuck.js +85 -0
  112. package/www/codemirror/mode/clike/clike.js +940 -0
  113. package/www/codemirror/mode/clojure/clojure.js +292 -0
  114. package/www/codemirror/mode/cmake/cmake.js +97 -0
  115. package/www/codemirror/mode/cobol/cobol.js +255 -0
  116. package/www/codemirror/mode/coffeescript/coffeescript.js +359 -0
  117. package/www/codemirror/mode/commonlisp/commonlisp.js +125 -0
  118. package/www/codemirror/mode/crystal/crystal.js +433 -0
  119. package/www/codemirror/mode/css/css.js +862 -0
  120. package/www/codemirror/mode/cypher/cypher.js +152 -0
  121. package/www/codemirror/mode/d/d.js +223 -0
  122. package/www/codemirror/mode/dart/dart.js +166 -0
  123. package/www/codemirror/mode/diff/diff.js +47 -0
  124. package/www/codemirror/mode/django/django.js +356 -0
  125. package/www/codemirror/mode/dockerfile/dockerfile.js +211 -0
  126. package/www/codemirror/mode/dtd/dtd.js +142 -0
  127. package/www/codemirror/mode/dylan/dylan.js +352 -0
  128. package/www/codemirror/mode/ebnf/ebnf.js +195 -0
  129. package/www/codemirror/mode/ecl/ecl.js +206 -0
  130. package/www/codemirror/mode/eiffel/eiffel.js +160 -0
  131. package/www/codemirror/mode/elm/elm.js +245 -0
  132. package/www/codemirror/mode/erlang/erlang.js +619 -0
  133. package/www/codemirror/mode/factor/factor.js +85 -0
  134. package/www/codemirror/mode/fcl/fcl.js +173 -0
  135. package/www/codemirror/mode/forth/forth.js +180 -0
  136. package/www/codemirror/mode/fortran/fortran.js +188 -0
  137. package/www/codemirror/mode/gas/gas.js +353 -0
  138. package/www/codemirror/mode/gfm/gfm.js +129 -0
  139. package/www/codemirror/mode/gherkin/gherkin.js +178 -0
  140. package/www/codemirror/mode/go/go.js +187 -0
  141. package/www/codemirror/mode/groovy/groovy.js +247 -0
  142. package/www/codemirror/mode/haml/haml.js +161 -0
  143. package/www/codemirror/mode/handlebars/handlebars.js +70 -0
  144. package/www/codemirror/mode/haskell/haskell.js +268 -0
  145. package/www/codemirror/mode/haskell-literate/haskell-literate.js +43 -0
  146. package/www/codemirror/mode/haxe/haxe.js +515 -0
  147. package/www/codemirror/mode/htmlembedded/htmlembedded.js +37 -0
  148. package/www/codemirror/mode/htmlmixed/htmlmixed.js +153 -0
  149. package/www/codemirror/mode/http/http.js +113 -0
  150. package/www/codemirror/mode/idl/idl.js +290 -0
  151. package/www/codemirror/mode/javascript/javascript.js +960 -0
  152. package/www/codemirror/mode/jinja2/jinja2.js +193 -0
  153. package/www/codemirror/mode/jsx/jsx.js +148 -0
  154. package/www/codemirror/mode/julia/julia.js +390 -0
  155. package/www/codemirror/mode/livescript/livescript.js +280 -0
  156. package/www/codemirror/mode/lua/lua.js +160 -0
  157. package/www/codemirror/mode/markdown/markdown.js +886 -0
  158. package/www/codemirror/mode/mathematica/mathematica.js +176 -0
  159. package/www/codemirror/mode/mbox/mbox.js +129 -0
  160. package/www/codemirror/mode/meta.js +221 -0
  161. package/www/codemirror/mode/mirc/mirc.js +193 -0
  162. package/www/codemirror/mode/mllike/mllike.js +359 -0
  163. package/www/codemirror/mode/modelica/modelica.js +245 -0
  164. package/www/codemirror/mode/mscgen/mscgen.js +175 -0
  165. package/www/codemirror/mode/mumps/mumps.js +148 -0
  166. package/www/codemirror/mode/nginx/nginx.js +178 -0
  167. package/www/codemirror/mode/nsis/nsis.js +95 -0
  168. package/www/codemirror/mode/ntriples/ntriples.js +195 -0
  169. package/www/codemirror/mode/octave/octave.js +139 -0
  170. package/www/codemirror/mode/oz/oz.js +252 -0
  171. package/www/codemirror/mode/pascal/pascal.js +136 -0
  172. package/www/codemirror/mode/pegjs/pegjs.js +111 -0
  173. package/www/codemirror/mode/perl/perl.js +836 -0
  174. package/www/codemirror/mode/php/php.js +234 -0
  175. package/www/codemirror/mode/pig/pig.js +178 -0
  176. package/www/codemirror/mode/powershell/powershell.js +398 -0
  177. package/www/codemirror/mode/properties/properties.js +78 -0
  178. package/www/codemirror/mode/protobuf/protobuf.js +72 -0
  179. package/www/codemirror/mode/pug/pug.js +591 -0
  180. package/www/codemirror/mode/puppet/puppet.js +220 -0
  181. package/www/codemirror/mode/python/python.js +402 -0
  182. package/www/codemirror/mode/q/q.js +139 -0
  183. package/www/codemirror/mode/r/r.js +190 -0
  184. package/www/codemirror/mode/rpm/changes/index.html +66 -0
  185. package/www/codemirror/mode/rpm/rpm.js +109 -0
  186. package/www/codemirror/mode/rst/rst.js +557 -0
  187. package/www/codemirror/mode/ruby/ruby.js +303 -0
  188. package/www/codemirror/mode/rust/rust.js +72 -0
  189. package/www/codemirror/mode/sas/sas.js +303 -0
  190. package/www/codemirror/mode/sass/sass.js +459 -0
  191. package/www/codemirror/mode/scheme/scheme.js +284 -0
  192. package/www/codemirror/mode/shell/shell.js +168 -0
  193. package/www/codemirror/mode/sieve/sieve.js +193 -0
  194. package/www/codemirror/mode/slim/slim.js +575 -0
  195. package/www/codemirror/mode/smalltalk/smalltalk.js +168 -0
  196. package/www/codemirror/mode/smarty/smarty.js +225 -0
  197. package/www/codemirror/mode/solr/solr.js +104 -0
  198. package/www/codemirror/mode/soy/soy.js +665 -0
  199. package/www/codemirror/mode/sparql/sparql.js +184 -0
  200. package/www/codemirror/mode/spreadsheet/spreadsheet.js +112 -0
  201. package/www/codemirror/mode/sql/sql.js +525 -0
  202. package/www/codemirror/mode/stex/stex.js +264 -0
  203. package/www/codemirror/mode/stylus/stylus.js +775 -0
  204. package/www/codemirror/mode/swift/swift.js +221 -0
  205. package/www/codemirror/mode/tcl/tcl.js +140 -0
  206. package/www/codemirror/mode/textile/textile.js +469 -0
  207. package/www/codemirror/mode/tiddlywiki/tiddlywiki.css +14 -0
  208. package/www/codemirror/mode/tiddlywiki/tiddlywiki.js +308 -0
  209. package/www/codemirror/mode/tiki/tiki.css +26 -0
  210. package/www/codemirror/mode/tiki/tiki.js +312 -0
  211. package/www/codemirror/mode/toml/toml.js +88 -0
  212. package/www/codemirror/mode/tornado/tornado.js +68 -0
  213. package/www/codemirror/mode/troff/troff.js +84 -0
  214. package/www/codemirror/mode/ttcn/ttcn.js +283 -0
  215. package/www/codemirror/mode/ttcn-cfg/ttcn-cfg.js +214 -0
  216. package/www/codemirror/mode/turtle/turtle.js +162 -0
  217. package/www/codemirror/mode/twig/twig.js +141 -0
  218. package/www/codemirror/mode/vb/vb.js +275 -0
  219. package/www/codemirror/mode/vbscript/vbscript.js +350 -0
  220. package/www/codemirror/mode/velocity/velocity.js +202 -0
  221. package/www/codemirror/mode/verilog/verilog.js +781 -0
  222. package/www/codemirror/mode/vhdl/vhdl.js +189 -0
  223. package/www/codemirror/mode/vue/vue.js +77 -0
  224. package/www/codemirror/mode/wast/wast.js +132 -0
  225. package/www/codemirror/mode/webidl/webidl.js +195 -0
  226. package/www/codemirror/mode/xml/xml.js +417 -0
  227. package/www/codemirror/mode/xquery/xquery.js +448 -0
  228. package/www/codemirror/mode/yacas/yacas.js +204 -0
  229. package/www/codemirror/mode/yaml/yaml.js +120 -0
  230. package/www/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js +72 -0
  231. package/www/codemirror/mode/z80/z80.js +116 -0
  232. package/www/codemirror/package.json +52 -0
  233. package/www/codemirror/rollup.config.js +52 -0
  234. package/www/codemirror/src/addon/runmode/codemirror-standalone.js +24 -0
  235. package/www/codemirror/src/addon/runmode/codemirror.node.js +21 -0
  236. package/www/codemirror/src/addon/runmode/runmode-standalone.js +2 -0
  237. package/www/codemirror/src/addon/runmode/runmode.node.js +2 -0
  238. package/www/codemirror/src/codemirror.js +3 -0
  239. package/www/codemirror/src/display/Display.js +116 -0
  240. package/www/codemirror/src/display/focus.js +50 -0
  241. package/www/codemirror/src/display/gutters.js +44 -0
  242. package/www/codemirror/src/display/highlight_worker.js +55 -0
  243. package/www/codemirror/src/display/line_numbers.js +48 -0
  244. package/www/codemirror/src/display/mode_state.js +22 -0
  245. package/www/codemirror/src/display/operations.js +206 -0
  246. package/www/codemirror/src/display/scroll_events.js +132 -0
  247. package/www/codemirror/src/display/scrollbars.js +194 -0
  248. package/www/codemirror/src/display/scrolling.js +186 -0
  249. package/www/codemirror/src/display/selection.js +173 -0
  250. package/www/codemirror/src/display/update_display.js +267 -0
  251. package/www/codemirror/src/display/update_line.js +189 -0
  252. package/www/codemirror/src/display/update_lines.js +82 -0
  253. package/www/codemirror/src/display/view_tracking.js +153 -0
  254. package/www/codemirror/src/edit/CodeMirror.js +217 -0
  255. package/www/codemirror/src/edit/commands.js +178 -0
  256. package/www/codemirror/src/edit/deleteNearSelection.js +30 -0
  257. package/www/codemirror/src/edit/drop_events.js +130 -0
  258. package/www/codemirror/src/edit/fromTextArea.js +61 -0
  259. package/www/codemirror/src/edit/global_events.js +45 -0
  260. package/www/codemirror/src/edit/key_events.js +163 -0
  261. package/www/codemirror/src/edit/legacy.js +62 -0
  262. package/www/codemirror/src/edit/main.js +69 -0
  263. package/www/codemirror/src/edit/methods.js +555 -0
  264. package/www/codemirror/src/edit/mouse_events.js +417 -0
  265. package/www/codemirror/src/edit/options.js +194 -0
  266. package/www/codemirror/src/edit/utils.js +7 -0
  267. package/www/codemirror/src/input/ContentEditableInput.js +546 -0
  268. package/www/codemirror/src/input/TextareaInput.js +380 -0
  269. package/www/codemirror/src/input/indent.js +71 -0
  270. package/www/codemirror/src/input/input.js +134 -0
  271. package/www/codemirror/src/input/keymap.js +147 -0
  272. package/www/codemirror/src/input/keynames.js +17 -0
  273. package/www/codemirror/src/input/movement.js +111 -0
  274. package/www/codemirror/src/line/highlight.js +284 -0
  275. package/www/codemirror/src/line/line_data.js +349 -0
  276. package/www/codemirror/src/line/pos.js +40 -0
  277. package/www/codemirror/src/line/saw_special_spans.js +10 -0
  278. package/www/codemirror/src/line/spans.js +390 -0
  279. package/www/codemirror/src/line/utils_line.js +85 -0
  280. package/www/codemirror/src/measurement/position_measurement.js +702 -0
  281. package/www/codemirror/src/measurement/widgets.js +26 -0
  282. package/www/codemirror/src/model/Doc.js +436 -0
  283. package/www/codemirror/src/model/change_measurement.js +61 -0
  284. package/www/codemirror/src/model/changes.js +339 -0
  285. package/www/codemirror/src/model/chunk.js +167 -0
  286. package/www/codemirror/src/model/document_data.js +112 -0
  287. package/www/codemirror/src/model/history.js +228 -0
  288. package/www/codemirror/src/model/line_widget.js +78 -0
  289. package/www/codemirror/src/model/mark_text.js +293 -0
  290. package/www/codemirror/src/model/selection.js +84 -0
  291. package/www/codemirror/src/model/selection_updates.js +216 -0
  292. package/www/codemirror/src/modes.js +96 -0
  293. package/www/codemirror/src/util/StringStream.js +90 -0
  294. package/www/codemirror/src/util/bidi.js +215 -0
  295. package/www/codemirror/src/util/browser.js +34 -0
  296. package/www/codemirror/src/util/dom.js +101 -0
  297. package/www/codemirror/src/util/event.js +103 -0
  298. package/www/codemirror/src/util/feature_detection.js +84 -0
  299. package/www/codemirror/src/util/misc.js +168 -0
  300. package/www/codemirror/src/util/operation_group.js +72 -0
  301. package/www/codemirror/theme/3024-day.css +41 -0
  302. package/www/codemirror/theme/3024-night.css +39 -0
  303. package/www/codemirror/theme/abbott.css +268 -0
  304. package/www/codemirror/theme/abcdef.css +32 -0
  305. package/www/codemirror/theme/ambiance-mobile.css +5 -0
  306. package/www/codemirror/theme/ambiance.css +74 -0
  307. package/www/codemirror/theme/ayu-dark.css +44 -0
  308. package/www/codemirror/theme/ayu-mirage.css +45 -0
  309. package/www/codemirror/theme/base16-dark.css +40 -0
  310. package/www/codemirror/theme/base16-light.css +38 -0
  311. package/www/codemirror/theme/bespin.css +34 -0
  312. package/www/codemirror/theme/blackboard.css +32 -0
  313. package/www/codemirror/theme/cobalt.css +25 -0
  314. package/www/codemirror/theme/colorforth.css +33 -0
  315. package/www/codemirror/theme/darcula.css +53 -0
  316. package/www/codemirror/theme/dracula.css +40 -0
  317. package/www/codemirror/theme/duotone-dark.css +35 -0
  318. package/www/codemirror/theme/duotone-light.css +36 -0
  319. package/www/codemirror/theme/eclipse.css +23 -0
  320. package/www/codemirror/theme/elegant.css +13 -0
  321. package/www/codemirror/theme/erlang-dark.css +34 -0
  322. package/www/codemirror/theme/gruvbox-dark.css +39 -0
  323. package/www/codemirror/theme/hopscotch.css +34 -0
  324. package/www/codemirror/theme/icecoder.css +43 -0
  325. package/www/codemirror/theme/idea.css +42 -0
  326. package/www/codemirror/theme/isotope.css +34 -0
  327. package/www/codemirror/theme/juejin.css +30 -0
  328. package/www/codemirror/theme/lesser-dark.css +47 -0
  329. package/www/codemirror/theme/liquibyte.css +95 -0
  330. package/www/codemirror/theme/lucario.css +37 -0
  331. package/www/codemirror/theme/material-darker.css +135 -0
  332. package/www/codemirror/theme/material-ocean.css +141 -0
  333. package/www/codemirror/theme/material-palenight.css +141 -0
  334. package/www/codemirror/theme/material.css +141 -0
  335. package/www/codemirror/theme/mbo.css +37 -0
  336. package/www/codemirror/theme/mdn-like.css +46 -0
  337. package/www/codemirror/theme/midnight.css +39 -0
  338. package/www/codemirror/theme/monokai.css +41 -0
  339. package/www/codemirror/theme/moxer.css +143 -0
  340. package/www/codemirror/theme/neat.css +12 -0
  341. package/www/codemirror/theme/neo.css +43 -0
  342. package/www/codemirror/theme/night.css +27 -0
  343. package/www/codemirror/theme/nord.css +42 -0
  344. package/www/codemirror/theme/oceanic-next.css +46 -0
  345. package/www/codemirror/theme/panda-syntax.css +85 -0
  346. package/www/codemirror/theme/paraiso-dark.css +38 -0
  347. package/www/codemirror/theme/paraiso-light.css +38 -0
  348. package/www/codemirror/theme/pastel-on-dark.css +52 -0
  349. package/www/codemirror/theme/railscasts.css +34 -0
  350. package/www/codemirror/theme/rubyblue.css +25 -0
  351. package/www/codemirror/theme/seti.css +44 -0
  352. package/www/codemirror/theme/shadowfox.css +52 -0
  353. package/www/codemirror/theme/solarized.css +165 -0
  354. package/www/codemirror/theme/ssms.css +16 -0
  355. package/www/codemirror/theme/the-matrix.css +30 -0
  356. package/www/codemirror/theme/tomorrow-night-bright.css +35 -0
  357. package/www/codemirror/theme/tomorrow-night-eighties.css +38 -0
  358. package/www/codemirror/theme/ttcn.css +64 -0
  359. package/www/codemirror/theme/twilight.css +32 -0
  360. package/www/codemirror/theme/vibrant-ink.css +34 -0
  361. package/www/codemirror/theme/xq-dark.css +53 -0
  362. package/www/codemirror/theme/xq-light.css +43 -0
  363. package/www/codemirror/theme/yeti.css +44 -0
  364. package/www/codemirror/theme/yonce.css +59 -0
  365. package/www/codemirror/theme/zenburn.css +37 -0
  366. package/www/index.html +216 -0
@@ -0,0 +1,546 @@
1
+ import { operation, runInOp } from "../display/operations.js"
2
+ import { prepareSelection } from "../display/selection.js"
3
+ import { regChange } from "../display/view_tracking.js"
4
+ import { applyTextInput, copyableRanges, disableBrowserMagic, handlePaste, hiddenTextarea, lastCopied, setLastCopied } from "./input.js"
5
+ import { cmp, maxPos, minPos, Pos } from "../line/pos.js"
6
+ import { getBetween, getLine, lineNo } from "../line/utils_line.js"
7
+ import { findViewForLine, findViewIndex, mapFromLineView, nodeAndOffsetInLineMap } from "../measurement/position_measurement.js"
8
+ import { replaceRange } from "../model/changes.js"
9
+ import { simpleSelection } from "../model/selection.js"
10
+ import { setSelection } from "../model/selection_updates.js"
11
+ import { getBidiPartAt, getOrder } from "../util/bidi.js"
12
+ import { android, chrome, gecko, ie_version } from "../util/browser.js"
13
+ import { activeElt, contains, range, removeChildrenAndAdd, selectInput } from "../util/dom.js"
14
+ import { on, signalDOMEvent } from "../util/event.js"
15
+ import { Delayed, lst, sel_dontScroll } from "../util/misc.js"
16
+
17
+ // CONTENTEDITABLE INPUT STYLE
18
+
19
+ export default class ContentEditableInput {
20
+ constructor(cm) {
21
+ this.cm = cm
22
+ this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null
23
+ this.polling = new Delayed()
24
+ this.composing = null
25
+ this.gracePeriod = false
26
+ this.readDOMTimeout = null
27
+ }
28
+
29
+ init(display) {
30
+ let input = this, cm = input.cm
31
+ let div = input.div = display.lineDiv
32
+ div.contentEditable = true
33
+ disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize)
34
+
35
+ function belongsToInput(e) {
36
+ for (let t = e.target; t; t = t.parentNode) {
37
+ if (t == div) return true
38
+ if (/\bCodeMirror-(?:line)?widget\b/.test(t.className)) break
39
+ }
40
+ return false
41
+ }
42
+
43
+ on(div, "paste", e => {
44
+ if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) return
45
+ // IE doesn't fire input events, so we schedule a read for the pasted content in this way
46
+ if (ie_version <= 11) setTimeout(operation(cm, () => this.updateFromDOM()), 20)
47
+ })
48
+
49
+ on(div, "compositionstart", e => {
50
+ this.composing = {data: e.data, done: false}
51
+ })
52
+ on(div, "compositionupdate", e => {
53
+ if (!this.composing) this.composing = {data: e.data, done: false}
54
+ })
55
+ on(div, "compositionend", e => {
56
+ if (this.composing) {
57
+ if (e.data != this.composing.data) this.readFromDOMSoon()
58
+ this.composing.done = true
59
+ }
60
+ })
61
+
62
+ on(div, "touchstart", () => input.forceCompositionEnd())
63
+
64
+ on(div, "input", () => {
65
+ if (!this.composing) this.readFromDOMSoon()
66
+ })
67
+
68
+ function onCopyCut(e) {
69
+ if (!belongsToInput(e) || signalDOMEvent(cm, e)) return
70
+ if (cm.somethingSelected()) {
71
+ setLastCopied({lineWise: false, text: cm.getSelections()})
72
+ if (e.type == "cut") cm.replaceSelection("", null, "cut")
73
+ } else if (!cm.options.lineWiseCopyCut) {
74
+ return
75
+ } else {
76
+ let ranges = copyableRanges(cm)
77
+ setLastCopied({lineWise: true, text: ranges.text})
78
+ if (e.type == "cut") {
79
+ cm.operation(() => {
80
+ cm.setSelections(ranges.ranges, 0, sel_dontScroll)
81
+ cm.replaceSelection("", null, "cut")
82
+ })
83
+ }
84
+ }
85
+ if (e.clipboardData) {
86
+ e.clipboardData.clearData()
87
+ let content = lastCopied.text.join("\n")
88
+ // iOS exposes the clipboard API, but seems to discard content inserted into it
89
+ e.clipboardData.setData("Text", content)
90
+ if (e.clipboardData.getData("Text") == content) {
91
+ e.preventDefault()
92
+ return
93
+ }
94
+ }
95
+ // Old-fashioned briefly-focus-a-textarea hack
96
+ let kludge = hiddenTextarea(), te = kludge.firstChild
97
+ disableBrowserMagic(te)
98
+ cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild)
99
+ te.value = lastCopied.text.join("\n")
100
+ let hadFocus = activeElt(div.ownerDocument)
101
+ selectInput(te)
102
+ setTimeout(() => {
103
+ cm.display.lineSpace.removeChild(kludge)
104
+ hadFocus.focus()
105
+ if (hadFocus == div) input.showPrimarySelection()
106
+ }, 50)
107
+ }
108
+ on(div, "copy", onCopyCut)
109
+ on(div, "cut", onCopyCut)
110
+ }
111
+
112
+ screenReaderLabelChanged(label) {
113
+ // Label for screenreaders, accessibility
114
+ if(label) {
115
+ this.div.setAttribute('aria-label', label)
116
+ } else {
117
+ this.div.removeAttribute('aria-label')
118
+ }
119
+ }
120
+
121
+ prepareSelection() {
122
+ let result = prepareSelection(this.cm, false)
123
+ result.focus = activeElt(this.div.ownerDocument) == this.div
124
+ return result
125
+ }
126
+
127
+ showSelection(info, takeFocus) {
128
+ if (!info || !this.cm.display.view.length) return
129
+ if (info.focus || takeFocus) this.showPrimarySelection()
130
+ this.showMultipleSelections(info)
131
+ }
132
+
133
+ getSelection() {
134
+ return this.cm.display.wrapper.ownerDocument.getSelection()
135
+ }
136
+
137
+ showPrimarySelection() {
138
+ let sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary()
139
+ let from = prim.from(), to = prim.to()
140
+
141
+ if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) {
142
+ sel.removeAllRanges()
143
+ return
144
+ }
145
+
146
+ let curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset)
147
+ let curFocus = domToPos(cm, sel.focusNode, sel.focusOffset)
148
+ if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&
149
+ cmp(minPos(curAnchor, curFocus), from) == 0 &&
150
+ cmp(maxPos(curAnchor, curFocus), to) == 0)
151
+ return
152
+
153
+ let view = cm.display.view
154
+ let start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) ||
155
+ {node: view[0].measure.map[2], offset: 0}
156
+ let end = to.line < cm.display.viewTo && posToDOM(cm, to)
157
+ if (!end) {
158
+ let measure = view[view.length - 1].measure
159
+ let map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map
160
+ end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]}
161
+ }
162
+
163
+ if (!start || !end) {
164
+ sel.removeAllRanges()
165
+ return
166
+ }
167
+
168
+ let old = sel.rangeCount && sel.getRangeAt(0), rng
169
+ try { rng = range(start.node, start.offset, end.offset, end.node) }
170
+ catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible
171
+ if (rng) {
172
+ if (!gecko && cm.state.focused) {
173
+ sel.collapse(start.node, start.offset)
174
+ if (!rng.collapsed) {
175
+ sel.removeAllRanges()
176
+ sel.addRange(rng)
177
+ }
178
+ } else {
179
+ sel.removeAllRanges()
180
+ sel.addRange(rng)
181
+ }
182
+ if (old && sel.anchorNode == null) sel.addRange(old)
183
+ else if (gecko) this.startGracePeriod()
184
+ }
185
+ this.rememberSelection()
186
+ }
187
+
188
+ startGracePeriod() {
189
+ clearTimeout(this.gracePeriod)
190
+ this.gracePeriod = setTimeout(() => {
191
+ this.gracePeriod = false
192
+ if (this.selectionChanged())
193
+ this.cm.operation(() => this.cm.curOp.selectionChanged = true)
194
+ }, 20)
195
+ }
196
+
197
+ showMultipleSelections(info) {
198
+ removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors)
199
+ removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection)
200
+ }
201
+
202
+ rememberSelection() {
203
+ let sel = this.getSelection()
204
+ this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset
205
+ this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset
206
+ }
207
+
208
+ selectionInEditor() {
209
+ let sel = this.getSelection()
210
+ if (!sel.rangeCount) return false
211
+ let node = sel.getRangeAt(0).commonAncestorContainer
212
+ return contains(this.div, node)
213
+ }
214
+
215
+ focus() {
216
+ if (this.cm.options.readOnly != "nocursor") {
217
+ if (!this.selectionInEditor() || activeElt(this.div.ownerDocument) != this.div)
218
+ this.showSelection(this.prepareSelection(), true)
219
+ this.div.focus()
220
+ }
221
+ }
222
+ blur() { this.div.blur() }
223
+ getField() { return this.div }
224
+
225
+ supportsTouch() { return true }
226
+
227
+ receivedFocus() {
228
+ let input = this
229
+ if (this.selectionInEditor())
230
+ setTimeout(() => this.pollSelection(), 20)
231
+ else
232
+ runInOp(this.cm, () => input.cm.curOp.selectionChanged = true)
233
+
234
+ function poll() {
235
+ if (input.cm.state.focused) {
236
+ input.pollSelection()
237
+ input.polling.set(input.cm.options.pollInterval, poll)
238
+ }
239
+ }
240
+ this.polling.set(this.cm.options.pollInterval, poll)
241
+ }
242
+
243
+ selectionChanged() {
244
+ let sel = this.getSelection()
245
+ return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||
246
+ sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset
247
+ }
248
+
249
+ pollSelection() {
250
+ if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) return
251
+ let sel = this.getSelection(), cm = this.cm
252
+ // On Android Chrome (version 56, at least), backspacing into an
253
+ // uneditable block element will put the cursor in that element,
254
+ // and then, because it's not editable, hide the virtual keyboard.
255
+ // Because Android doesn't allow us to actually detect backspace
256
+ // presses in a sane way, this code checks for when that happens
257
+ // and simulates a backspace press in this case.
258
+ if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) {
259
+ this.cm.triggerOnKeyDown({type: "keydown", keyCode: 8, preventDefault: Math.abs})
260
+ this.blur()
261
+ this.focus()
262
+ return
263
+ }
264
+ if (this.composing) return
265
+ this.rememberSelection()
266
+ let anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset)
267
+ let head = domToPos(cm, sel.focusNode, sel.focusOffset)
268
+ if (anchor && head) runInOp(cm, () => {
269
+ setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll)
270
+ if (anchor.bad || head.bad) cm.curOp.selectionChanged = true
271
+ })
272
+ }
273
+
274
+ pollContent() {
275
+ if (this.readDOMTimeout != null) {
276
+ clearTimeout(this.readDOMTimeout)
277
+ this.readDOMTimeout = null
278
+ }
279
+
280
+ let cm = this.cm, display = cm.display, sel = cm.doc.sel.primary()
281
+ let from = sel.from(), to = sel.to()
282
+ if (from.ch == 0 && from.line > cm.firstLine())
283
+ from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length)
284
+ if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine())
285
+ to = Pos(to.line + 1, 0)
286
+ if (from.line < display.viewFrom || to.line > display.viewTo - 1) return false
287
+
288
+ let fromIndex, fromLine, fromNode
289
+ if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {
290
+ fromLine = lineNo(display.view[0].line)
291
+ fromNode = display.view[0].node
292
+ } else {
293
+ fromLine = lineNo(display.view[fromIndex].line)
294
+ fromNode = display.view[fromIndex - 1].node.nextSibling
295
+ }
296
+ let toIndex = findViewIndex(cm, to.line)
297
+ let toLine, toNode
298
+ if (toIndex == display.view.length - 1) {
299
+ toLine = display.viewTo - 1
300
+ toNode = display.lineDiv.lastChild
301
+ } else {
302
+ toLine = lineNo(display.view[toIndex + 1].line) - 1
303
+ toNode = display.view[toIndex + 1].node.previousSibling
304
+ }
305
+
306
+ if (!fromNode) return false
307
+ let newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine))
308
+ let oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length))
309
+ while (newText.length > 1 && oldText.length > 1) {
310
+ if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine-- }
311
+ else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++ }
312
+ else break
313
+ }
314
+
315
+ let cutFront = 0, cutEnd = 0
316
+ let newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length)
317
+ while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront))
318
+ ++cutFront
319
+ let newBot = lst(newText), oldBot = lst(oldText)
320
+ let maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0),
321
+ oldBot.length - (oldText.length == 1 ? cutFront : 0))
322
+ while (cutEnd < maxCutEnd &&
323
+ newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1))
324
+ ++cutEnd
325
+ // Try to move start of change to start of selection if ambiguous
326
+ if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) {
327
+ while (cutFront && cutFront > from.ch &&
328
+ newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) {
329
+ cutFront--
330
+ cutEnd++
331
+ }
332
+ }
333
+
334
+ newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\u200b+/, "")
335
+ newText[0] = newText[0].slice(cutFront).replace(/\u200b+$/, "")
336
+
337
+ let chFrom = Pos(fromLine, cutFront)
338
+ let chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0)
339
+ if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) {
340
+ replaceRange(cm.doc, newText, chFrom, chTo, "+input")
341
+ return true
342
+ }
343
+ }
344
+
345
+ ensurePolled() {
346
+ this.forceCompositionEnd()
347
+ }
348
+ reset() {
349
+ this.forceCompositionEnd()
350
+ }
351
+ forceCompositionEnd() {
352
+ if (!this.composing) return
353
+ clearTimeout(this.readDOMTimeout)
354
+ this.composing = null
355
+ this.updateFromDOM()
356
+ this.div.blur()
357
+ this.div.focus()
358
+ }
359
+ readFromDOMSoon() {
360
+ if (this.readDOMTimeout != null) return
361
+ this.readDOMTimeout = setTimeout(() => {
362
+ this.readDOMTimeout = null
363
+ if (this.composing) {
364
+ if (this.composing.done) this.composing = null
365
+ else return
366
+ }
367
+ this.updateFromDOM()
368
+ }, 80)
369
+ }
370
+
371
+ updateFromDOM() {
372
+ if (this.cm.isReadOnly() || !this.pollContent())
373
+ runInOp(this.cm, () => regChange(this.cm))
374
+ }
375
+
376
+ setUneditable(node) {
377
+ node.contentEditable = "false"
378
+ }
379
+
380
+ onKeyPress(e) {
381
+ if (e.charCode == 0 || this.composing) return
382
+ e.preventDefault()
383
+ if (!this.cm.isReadOnly())
384
+ operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0)
385
+ }
386
+
387
+ readOnlyChanged(val) {
388
+ this.div.contentEditable = String(val != "nocursor")
389
+ }
390
+
391
+ onContextMenu() {}
392
+ resetPosition() {}
393
+ }
394
+
395
+ ContentEditableInput.prototype.needsContentAttribute = true
396
+
397
+ function posToDOM(cm, pos) {
398
+ let view = findViewForLine(cm, pos.line)
399
+ if (!view || view.hidden) return null
400
+ let line = getLine(cm.doc, pos.line)
401
+ let info = mapFromLineView(view, line, pos.line)
402
+
403
+ let order = getOrder(line, cm.doc.direction), side = "left"
404
+ if (order) {
405
+ let partPos = getBidiPartAt(order, pos.ch)
406
+ side = partPos % 2 ? "right" : "left"
407
+ }
408
+ let result = nodeAndOffsetInLineMap(info.map, pos.ch, side)
409
+ result.offset = result.collapse == "right" ? result.end : result.start
410
+ return result
411
+ }
412
+
413
+ function isInGutter(node) {
414
+ for (let scan = node; scan; scan = scan.parentNode)
415
+ if (/CodeMirror-gutter-wrapper/.test(scan.className)) return true
416
+ return false
417
+ }
418
+
419
+ function badPos(pos, bad) { if (bad) pos.bad = true; return pos }
420
+
421
+ function domTextBetween(cm, from, to, fromLine, toLine) {
422
+ let text = "", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false
423
+ function recognizeMarker(id) { return marker => marker.id == id }
424
+ function close() {
425
+ if (closing) {
426
+ text += lineSep
427
+ if (extraLinebreak) text += lineSep
428
+ closing = extraLinebreak = false
429
+ }
430
+ }
431
+ function addText(str) {
432
+ if (str) {
433
+ close()
434
+ text += str
435
+ }
436
+ }
437
+ function walk(node) {
438
+ if (node.nodeType == 1) {
439
+ let cmText = node.getAttribute("cm-text")
440
+ if (cmText) {
441
+ addText(cmText)
442
+ return
443
+ }
444
+ let markerID = node.getAttribute("cm-marker"), range
445
+ if (markerID) {
446
+ let found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID))
447
+ if (found.length && (range = found[0].find(0)))
448
+ addText(getBetween(cm.doc, range.from, range.to).join(lineSep))
449
+ return
450
+ }
451
+ if (node.getAttribute("contenteditable") == "false") return
452
+ let isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName)
453
+ if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) return
454
+
455
+ if (isBlock) close()
456
+ for (let i = 0; i < node.childNodes.length; i++)
457
+ walk(node.childNodes[i])
458
+
459
+ if (/^(pre|p)$/i.test(node.nodeName)) extraLinebreak = true
460
+ if (isBlock) closing = true
461
+ } else if (node.nodeType == 3) {
462
+ addText(node.nodeValue.replace(/\u200b/g, "").replace(/\u00a0/g, " "))
463
+ }
464
+ }
465
+ for (;;) {
466
+ walk(from)
467
+ if (from == to) break
468
+ from = from.nextSibling
469
+ extraLinebreak = false
470
+ }
471
+ return text
472
+ }
473
+
474
+ function domToPos(cm, node, offset) {
475
+ let lineNode
476
+ if (node == cm.display.lineDiv) {
477
+ lineNode = cm.display.lineDiv.childNodes[offset]
478
+ if (!lineNode) return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true)
479
+ node = null; offset = 0
480
+ } else {
481
+ for (lineNode = node;; lineNode = lineNode.parentNode) {
482
+ if (!lineNode || lineNode == cm.display.lineDiv) return null
483
+ if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) break
484
+ }
485
+ }
486
+ for (let i = 0; i < cm.display.view.length; i++) {
487
+ let lineView = cm.display.view[i]
488
+ if (lineView.node == lineNode)
489
+ return locateNodeInLineView(lineView, node, offset)
490
+ }
491
+ }
492
+
493
+ function locateNodeInLineView(lineView, node, offset) {
494
+ let wrapper = lineView.text.firstChild, bad = false
495
+ if (!node || !contains(wrapper, node)) return badPos(Pos(lineNo(lineView.line), 0), true)
496
+ if (node == wrapper) {
497
+ bad = true
498
+ node = wrapper.childNodes[offset]
499
+ offset = 0
500
+ if (!node) {
501
+ let line = lineView.rest ? lst(lineView.rest) : lineView.line
502
+ return badPos(Pos(lineNo(line), line.text.length), bad)
503
+ }
504
+ }
505
+
506
+ let textNode = node.nodeType == 3 ? node : null, topNode = node
507
+ if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) {
508
+ textNode = node.firstChild
509
+ if (offset) offset = textNode.nodeValue.length
510
+ }
511
+ while (topNode.parentNode != wrapper) topNode = topNode.parentNode
512
+ let measure = lineView.measure, maps = measure.maps
513
+
514
+ function find(textNode, topNode, offset) {
515
+ for (let i = -1; i < (maps ? maps.length : 0); i++) {
516
+ let map = i < 0 ? measure.map : maps[i]
517
+ for (let j = 0; j < map.length; j += 3) {
518
+ let curNode = map[j + 2]
519
+ if (curNode == textNode || curNode == topNode) {
520
+ let line = lineNo(i < 0 ? lineView.line : lineView.rest[i])
521
+ let ch = map[j] + offset
522
+ if (offset < 0 || curNode != textNode) ch = map[j + (offset ? 1 : 0)]
523
+ return Pos(line, ch)
524
+ }
525
+ }
526
+ }
527
+ }
528
+ let found = find(textNode, topNode, offset)
529
+ if (found) return badPos(found, bad)
530
+
531
+ // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems
532
+ for (let after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) {
533
+ found = find(after, after.firstChild, 0)
534
+ if (found)
535
+ return badPos(Pos(found.line, found.ch - dist), bad)
536
+ else
537
+ dist += after.textContent.length
538
+ }
539
+ for (let before = topNode.previousSibling, dist = offset; before; before = before.previousSibling) {
540
+ found = find(before, before.firstChild, -1)
541
+ if (found)
542
+ return badPos(Pos(found.line, found.ch + dist), bad)
543
+ else
544
+ dist += before.textContent.length
545
+ }
546
+ }