@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,702 @@
1
+ import { buildLineContent, LineView } from "../line/line_data.js"
2
+ import { clipPos, Pos } from "../line/pos.js"
3
+ import { collapsedSpanAround, heightAtLine, lineIsHidden, visualLine } from "../line/spans.js"
4
+ import { getLine, lineAtHeight, lineNo, updateLineHeight } from "../line/utils_line.js"
5
+ import { bidiOther, getBidiPartAt, getOrder } from "../util/bidi.js"
6
+ import { chrome, android, ie, ie_version } from "../util/browser.js"
7
+ import { elt, removeChildren, range, removeChildrenAndAdd, doc } from "../util/dom.js"
8
+ import { e_target } from "../util/event.js"
9
+ import { hasBadZoomedRects } from "../util/feature_detection.js"
10
+ import { countColumn, findFirst, isExtendingChar, scrollerGap, skipExtendingChars } from "../util/misc.js"
11
+ import { updateLineForChanges } from "../display/update_line.js"
12
+
13
+ import { widgetHeight } from "./widgets.js"
14
+
15
+ // POSITION MEASUREMENT
16
+
17
+ export function paddingTop(display) {return display.lineSpace.offsetTop}
18
+ export function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight}
19
+ export function paddingH(display) {
20
+ if (display.cachedPaddingH) return display.cachedPaddingH
21
+ let e = removeChildrenAndAdd(display.measure, elt("pre", "x", "CodeMirror-line-like"))
22
+ let style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle
23
+ let data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)}
24
+ if (!isNaN(data.left) && !isNaN(data.right)) display.cachedPaddingH = data
25
+ return data
26
+ }
27
+
28
+ export function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }
29
+ export function displayWidth(cm) {
30
+ return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth
31
+ }
32
+ export function displayHeight(cm) {
33
+ return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight
34
+ }
35
+
36
+ // Ensure the lineView.wrapping.heights array is populated. This is
37
+ // an array of bottom offsets for the lines that make up a drawn
38
+ // line. When lineWrapping is on, there might be more than one
39
+ // height.
40
+ function ensureLineHeights(cm, lineView, rect) {
41
+ let wrapping = cm.options.lineWrapping
42
+ let curWidth = wrapping && displayWidth(cm)
43
+ if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {
44
+ let heights = lineView.measure.heights = []
45
+ if (wrapping) {
46
+ lineView.measure.width = curWidth
47
+ let rects = lineView.text.firstChild.getClientRects()
48
+ for (let i = 0; i < rects.length - 1; i++) {
49
+ let cur = rects[i], next = rects[i + 1]
50
+ if (Math.abs(cur.bottom - next.bottom) > 2)
51
+ heights.push((cur.bottom + next.top) / 2 - rect.top)
52
+ }
53
+ }
54
+ heights.push(rect.bottom - rect.top)
55
+ }
56
+ }
57
+
58
+ // Find a line map (mapping character offsets to text nodes) and a
59
+ // measurement cache for the given line number. (A line view might
60
+ // contain multiple lines when collapsed ranges are present.)
61
+ export function mapFromLineView(lineView, line, lineN) {
62
+ if (lineView.line == line)
63
+ return {map: lineView.measure.map, cache: lineView.measure.cache}
64
+ if (lineView.rest) {
65
+ for (let i = 0; i < lineView.rest.length; i++)
66
+ if (lineView.rest[i] == line)
67
+ return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]}
68
+ for (let i = 0; i < lineView.rest.length; i++)
69
+ if (lineNo(lineView.rest[i]) > lineN)
70
+ return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i], before: true}
71
+ }
72
+ }
73
+
74
+ // Render a line into the hidden node display.externalMeasured. Used
75
+ // when measurement is needed for a line that's not in the viewport.
76
+ function updateExternalMeasurement(cm, line) {
77
+ line = visualLine(line)
78
+ let lineN = lineNo(line)
79
+ let view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN)
80
+ view.lineN = lineN
81
+ let built = view.built = buildLineContent(cm, view)
82
+ view.text = built.pre
83
+ removeChildrenAndAdd(cm.display.lineMeasure, built.pre)
84
+ return view
85
+ }
86
+
87
+ // Get a {top, bottom, left, right} box (in line-local coordinates)
88
+ // for a given character.
89
+ export function measureChar(cm, line, ch, bias) {
90
+ return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias)
91
+ }
92
+
93
+ // Find a line view that corresponds to the given line number.
94
+ export function findViewForLine(cm, lineN) {
95
+ if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)
96
+ return cm.display.view[findViewIndex(cm, lineN)]
97
+ let ext = cm.display.externalMeasured
98
+ if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)
99
+ return ext
100
+ }
101
+
102
+ // Measurement can be split in two steps, the set-up work that
103
+ // applies to the whole line, and the measurement of the actual
104
+ // character. Functions like coordsChar, that need to do a lot of
105
+ // measurements in a row, can thus ensure that the set-up work is
106
+ // only done once.
107
+ export function prepareMeasureForLine(cm, line) {
108
+ let lineN = lineNo(line)
109
+ let view = findViewForLine(cm, lineN)
110
+ if (view && !view.text) {
111
+ view = null
112
+ } else if (view && view.changes) {
113
+ updateLineForChanges(cm, view, lineN, getDimensions(cm))
114
+ cm.curOp.forceUpdate = true
115
+ }
116
+ if (!view)
117
+ view = updateExternalMeasurement(cm, line)
118
+
119
+ let info = mapFromLineView(view, line, lineN)
120
+ return {
121
+ line: line, view: view, rect: null,
122
+ map: info.map, cache: info.cache, before: info.before,
123
+ hasHeights: false
124
+ }
125
+ }
126
+
127
+ // Given a prepared measurement object, measures the position of an
128
+ // actual character (or fetches it from the cache).
129
+ export function measureCharPrepared(cm, prepared, ch, bias, varHeight) {
130
+ if (prepared.before) ch = -1
131
+ let key = ch + (bias || ""), found
132
+ if (prepared.cache.hasOwnProperty(key)) {
133
+ found = prepared.cache[key]
134
+ } else {
135
+ if (!prepared.rect)
136
+ prepared.rect = prepared.view.text.getBoundingClientRect()
137
+ if (!prepared.hasHeights) {
138
+ ensureLineHeights(cm, prepared.view, prepared.rect)
139
+ prepared.hasHeights = true
140
+ }
141
+ found = measureCharInner(cm, prepared, ch, bias)
142
+ if (!found.bogus) prepared.cache[key] = found
143
+ }
144
+ return {left: found.left, right: found.right,
145
+ top: varHeight ? found.rtop : found.top,
146
+ bottom: varHeight ? found.rbottom : found.bottom}
147
+ }
148
+
149
+ let nullRect = {left: 0, right: 0, top: 0, bottom: 0}
150
+
151
+ export function nodeAndOffsetInLineMap(map, ch, bias) {
152
+ let node, start, end, collapse, mStart, mEnd
153
+ // First, search the line map for the text node corresponding to,
154
+ // or closest to, the target character.
155
+ for (let i = 0; i < map.length; i += 3) {
156
+ mStart = map[i]
157
+ mEnd = map[i + 1]
158
+ if (ch < mStart) {
159
+ start = 0; end = 1
160
+ collapse = "left"
161
+ } else if (ch < mEnd) {
162
+ start = ch - mStart
163
+ end = start + 1
164
+ } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {
165
+ end = mEnd - mStart
166
+ start = end - 1
167
+ if (ch >= mEnd) collapse = "right"
168
+ }
169
+ if (start != null) {
170
+ node = map[i + 2]
171
+ if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right"))
172
+ collapse = bias
173
+ if (bias == "left" && start == 0)
174
+ while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {
175
+ node = map[(i -= 3) + 2]
176
+ collapse = "left"
177
+ }
178
+ if (bias == "right" && start == mEnd - mStart)
179
+ while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {
180
+ node = map[(i += 3) + 2]
181
+ collapse = "right"
182
+ }
183
+ break
184
+ }
185
+ }
186
+ return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd}
187
+ }
188
+
189
+ function getUsefulRect(rects, bias) {
190
+ let rect = nullRect
191
+ if (bias == "left") for (let i = 0; i < rects.length; i++) {
192
+ if ((rect = rects[i]).left != rect.right) break
193
+ } else for (let i = rects.length - 1; i >= 0; i--) {
194
+ if ((rect = rects[i]).left != rect.right) break
195
+ }
196
+ return rect
197
+ }
198
+
199
+ function measureCharInner(cm, prepared, ch, bias) {
200
+ let place = nodeAndOffsetInLineMap(prepared.map, ch, bias)
201
+ let node = place.node, start = place.start, end = place.end, collapse = place.collapse
202
+
203
+ let rect
204
+ if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.
205
+ for (let i = 0; i < 4; i++) { // Retry a maximum of 4 times when nonsense rectangles are returned
206
+ while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) --start
207
+ while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) ++end
208
+ if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart)
209
+ rect = node.parentNode.getBoundingClientRect()
210
+ else
211
+ rect = getUsefulRect(range(node, start, end).getClientRects(), bias)
212
+ if (rect.left || rect.right || start == 0) break
213
+ end = start
214
+ start = start - 1
215
+ collapse = "right"
216
+ }
217
+ if (ie && ie_version < 11) rect = maybeUpdateRectForZooming(cm.display.measure, rect)
218
+ } else { // If it is a widget, simply get the box for the whole widget.
219
+ if (start > 0) collapse = bias = "right"
220
+ let rects
221
+ if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)
222
+ rect = rects[bias == "right" ? rects.length - 1 : 0]
223
+ else
224
+ rect = node.getBoundingClientRect()
225
+ }
226
+ if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {
227
+ let rSpan = node.parentNode.getClientRects()[0]
228
+ if (rSpan)
229
+ rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}
230
+ else
231
+ rect = nullRect
232
+ }
233
+
234
+ let rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top
235
+ let mid = (rtop + rbot) / 2
236
+ let heights = prepared.view.measure.heights
237
+ let i = 0
238
+ for (; i < heights.length - 1; i++)
239
+ if (mid < heights[i]) break
240
+ let top = i ? heights[i - 1] : 0, bot = heights[i]
241
+ let result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left,
242
+ right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left,
243
+ top: top, bottom: bot}
244
+ if (!rect.left && !rect.right) result.bogus = true
245
+ if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot }
246
+
247
+ return result
248
+ }
249
+
250
+ // Work around problem with bounding client rects on ranges being
251
+ // returned incorrectly when zoomed on IE10 and below.
252
+ function maybeUpdateRectForZooming(measure, rect) {
253
+ if (!window.screen || screen.logicalXDPI == null ||
254
+ screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))
255
+ return rect
256
+ let scaleX = screen.logicalXDPI / screen.deviceXDPI
257
+ let scaleY = screen.logicalYDPI / screen.deviceYDPI
258
+ return {left: rect.left * scaleX, right: rect.right * scaleX,
259
+ top: rect.top * scaleY, bottom: rect.bottom * scaleY}
260
+ }
261
+
262
+ export function clearLineMeasurementCacheFor(lineView) {
263
+ if (lineView.measure) {
264
+ lineView.measure.cache = {}
265
+ lineView.measure.heights = null
266
+ if (lineView.rest) for (let i = 0; i < lineView.rest.length; i++)
267
+ lineView.measure.caches[i] = {}
268
+ }
269
+ }
270
+
271
+ export function clearLineMeasurementCache(cm) {
272
+ cm.display.externalMeasure = null
273
+ removeChildren(cm.display.lineMeasure)
274
+ for (let i = 0; i < cm.display.view.length; i++)
275
+ clearLineMeasurementCacheFor(cm.display.view[i])
276
+ }
277
+
278
+ export function clearCaches(cm) {
279
+ clearLineMeasurementCache(cm)
280
+ cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null
281
+ if (!cm.options.lineWrapping) cm.display.maxLineChanged = true
282
+ cm.display.lineNumChars = null
283
+ }
284
+
285
+ function pageScrollX(doc) {
286
+ // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206
287
+ // which causes page_Offset and bounding client rects to use
288
+ // different reference viewports and invalidate our calculations.
289
+ if (chrome && android) return -(doc.body.getBoundingClientRect().left - parseInt(getComputedStyle(doc.body).marginLeft))
290
+ return doc.defaultView.pageXOffset || (doc.documentElement || doc.body).scrollLeft
291
+ }
292
+ function pageScrollY(doc) {
293
+ if (chrome && android) return -(doc.body.getBoundingClientRect().top - parseInt(getComputedStyle(doc.body).marginTop))
294
+ return doc.defaultView.pageYOffset || (doc.documentElement || doc.body).scrollTop
295
+ }
296
+
297
+ function widgetTopHeight(lineObj) {
298
+ let {widgets} = visualLine(lineObj), height = 0
299
+ if (widgets) for (let i = 0; i < widgets.length; ++i) if (widgets[i].above)
300
+ height += widgetHeight(widgets[i])
301
+ return height
302
+ }
303
+
304
+ // Converts a {top, bottom, left, right} box from line-local
305
+ // coordinates into another coordinate system. Context may be one of
306
+ // "line", "div" (display.lineDiv), "local"./null (editor), "window",
307
+ // or "page".
308
+ export function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {
309
+ if (!includeWidgets) {
310
+ let height = widgetTopHeight(lineObj)
311
+ rect.top += height; rect.bottom += height
312
+ }
313
+ if (context == "line") return rect
314
+ if (!context) context = "local"
315
+ let yOff = heightAtLine(lineObj)
316
+ if (context == "local") yOff += paddingTop(cm.display)
317
+ else yOff -= cm.display.viewOffset
318
+ if (context == "page" || context == "window") {
319
+ let lOff = cm.display.lineSpace.getBoundingClientRect()
320
+ yOff += lOff.top + (context == "window" ? 0 : pageScrollY(doc(cm)))
321
+ let xOff = lOff.left + (context == "window" ? 0 : pageScrollX(doc(cm)))
322
+ rect.left += xOff; rect.right += xOff
323
+ }
324
+ rect.top += yOff; rect.bottom += yOff
325
+ return rect
326
+ }
327
+
328
+ // Coverts a box from "div" coords to another coordinate system.
329
+ // Context may be "window", "page", "div", or "local"./null.
330
+ export function fromCoordSystem(cm, coords, context) {
331
+ if (context == "div") return coords
332
+ let left = coords.left, top = coords.top
333
+ // First move into "page" coordinate system
334
+ if (context == "page") {
335
+ left -= pageScrollX(doc(cm))
336
+ top -= pageScrollY(doc(cm))
337
+ } else if (context == "local" || !context) {
338
+ let localBox = cm.display.sizer.getBoundingClientRect()
339
+ left += localBox.left
340
+ top += localBox.top
341
+ }
342
+
343
+ let lineSpaceBox = cm.display.lineSpace.getBoundingClientRect()
344
+ return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top}
345
+ }
346
+
347
+ export function charCoords(cm, pos, context, lineObj, bias) {
348
+ if (!lineObj) lineObj = getLine(cm.doc, pos.line)
349
+ return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context)
350
+ }
351
+
352
+ // Returns a box for a given cursor position, which may have an
353
+ // 'other' property containing the position of the secondary cursor
354
+ // on a bidi boundary.
355
+ // A cursor Pos(line, char, "before") is on the same visual line as `char - 1`
356
+ // and after `char - 1` in writing order of `char - 1`
357
+ // A cursor Pos(line, char, "after") is on the same visual line as `char`
358
+ // and before `char` in writing order of `char`
359
+ // Examples (upper-case letters are RTL, lower-case are LTR):
360
+ // Pos(0, 1, ...)
361
+ // before after
362
+ // ab a|b a|b
363
+ // aB a|B aB|
364
+ // Ab |Ab A|b
365
+ // AB B|A B|A
366
+ // Every position after the last character on a line is considered to stick
367
+ // to the last character on the line.
368
+ export function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {
369
+ lineObj = lineObj || getLine(cm.doc, pos.line)
370
+ if (!preparedMeasure) preparedMeasure = prepareMeasureForLine(cm, lineObj)
371
+ function get(ch, right) {
372
+ let m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight)
373
+ if (right) m.left = m.right; else m.right = m.left
374
+ return intoCoordSystem(cm, lineObj, m, context)
375
+ }
376
+ let order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky
377
+ if (ch >= lineObj.text.length) {
378
+ ch = lineObj.text.length
379
+ sticky = "before"
380
+ } else if (ch <= 0) {
381
+ ch = 0
382
+ sticky = "after"
383
+ }
384
+ if (!order) return get(sticky == "before" ? ch - 1 : ch, sticky == "before")
385
+
386
+ function getBidi(ch, partPos, invert) {
387
+ let part = order[partPos], right = part.level == 1
388
+ return get(invert ? ch - 1 : ch, right != invert)
389
+ }
390
+ let partPos = getBidiPartAt(order, ch, sticky)
391
+ let other = bidiOther
392
+ let val = getBidi(ch, partPos, sticky == "before")
393
+ if (other != null) val.other = getBidi(ch, other, sticky != "before")
394
+ return val
395
+ }
396
+
397
+ // Used to cheaply estimate the coordinates for a position. Used for
398
+ // intermediate scroll updates.
399
+ export function estimateCoords(cm, pos) {
400
+ let left = 0
401
+ pos = clipPos(cm.doc, pos)
402
+ if (!cm.options.lineWrapping) left = charWidth(cm.display) * pos.ch
403
+ let lineObj = getLine(cm.doc, pos.line)
404
+ let top = heightAtLine(lineObj) + paddingTop(cm.display)
405
+ return {left: left, right: left, top: top, bottom: top + lineObj.height}
406
+ }
407
+
408
+ // Positions returned by coordsChar contain some extra information.
409
+ // xRel is the relative x position of the input coordinates compared
410
+ // to the found position (so xRel > 0 means the coordinates are to
411
+ // the right of the character position, for example). When outside
412
+ // is true, that means the coordinates lie outside the line's
413
+ // vertical range.
414
+ function PosWithInfo(line, ch, sticky, outside, xRel) {
415
+ let pos = Pos(line, ch, sticky)
416
+ pos.xRel = xRel
417
+ if (outside) pos.outside = outside
418
+ return pos
419
+ }
420
+
421
+ // Compute the character position closest to the given coordinates.
422
+ // Input must be lineSpace-local ("div" coordinate system).
423
+ export function coordsChar(cm, x, y) {
424
+ let doc = cm.doc
425
+ y += cm.display.viewOffset
426
+ if (y < 0) return PosWithInfo(doc.first, 0, null, -1, -1)
427
+ let lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1
428
+ if (lineN > last)
429
+ return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1)
430
+ if (x < 0) x = 0
431
+
432
+ let lineObj = getLine(doc, lineN)
433
+ for (;;) {
434
+ let found = coordsCharInner(cm, lineObj, lineN, x, y)
435
+ let collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0))
436
+ if (!collapsed) return found
437
+ let rangeEnd = collapsed.find(1)
438
+ if (rangeEnd.line == lineN) return rangeEnd
439
+ lineObj = getLine(doc, lineN = rangeEnd.line)
440
+ }
441
+ }
442
+
443
+ function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {
444
+ y -= widgetTopHeight(lineObj)
445
+ let end = lineObj.text.length
446
+ let begin = findFirst(ch => measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y, end, 0)
447
+ end = findFirst(ch => measureCharPrepared(cm, preparedMeasure, ch).top > y, begin, end)
448
+ return {begin, end}
449
+ }
450
+
451
+ export function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {
452
+ if (!preparedMeasure) preparedMeasure = prepareMeasureForLine(cm, lineObj)
453
+ let targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top
454
+ return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop)
455
+ }
456
+
457
+ // Returns true if the given side of a box is after the given
458
+ // coordinates, in top-to-bottom, left-to-right order.
459
+ function boxIsAfter(box, x, y, left) {
460
+ return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x
461
+ }
462
+
463
+ function coordsCharInner(cm, lineObj, lineNo, x, y) {
464
+ // Move y into line-local coordinate space
465
+ y -= heightAtLine(lineObj)
466
+ let preparedMeasure = prepareMeasureForLine(cm, lineObj)
467
+ // When directly calling `measureCharPrepared`, we have to adjust
468
+ // for the widgets at this line.
469
+ let widgetHeight = widgetTopHeight(lineObj)
470
+ let begin = 0, end = lineObj.text.length, ltr = true
471
+
472
+ let order = getOrder(lineObj, cm.doc.direction)
473
+ // If the line isn't plain left-to-right text, first figure out
474
+ // which bidi section the coordinates fall into.
475
+ if (order) {
476
+ let part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart)
477
+ (cm, lineObj, lineNo, preparedMeasure, order, x, y)
478
+ ltr = part.level != 1
479
+ // The awkward -1 offsets are needed because findFirst (called
480
+ // on these below) will treat its first bound as inclusive,
481
+ // second as exclusive, but we want to actually address the
482
+ // characters in the part's range
483
+ begin = ltr ? part.from : part.to - 1
484
+ end = ltr ? part.to : part.from - 1
485
+ }
486
+
487
+ // A binary search to find the first character whose bounding box
488
+ // starts after the coordinates. If we run across any whose box wrap
489
+ // the coordinates, store that.
490
+ let chAround = null, boxAround = null
491
+ let ch = findFirst(ch => {
492
+ let box = measureCharPrepared(cm, preparedMeasure, ch)
493
+ box.top += widgetHeight; box.bottom += widgetHeight
494
+ if (!boxIsAfter(box, x, y, false)) return false
495
+ if (box.top <= y && box.left <= x) {
496
+ chAround = ch
497
+ boxAround = box
498
+ }
499
+ return true
500
+ }, begin, end)
501
+
502
+ let baseX, sticky, outside = false
503
+ // If a box around the coordinates was found, use that
504
+ if (boxAround) {
505
+ // Distinguish coordinates nearer to the left or right side of the box
506
+ let atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr
507
+ ch = chAround + (atStart ? 0 : 1)
508
+ sticky = atStart ? "after" : "before"
509
+ baseX = atLeft ? boxAround.left : boxAround.right
510
+ } else {
511
+ // (Adjust for extended bound, if necessary.)
512
+ if (!ltr && (ch == end || ch == begin)) ch++
513
+ // To determine which side to associate with, get the box to the
514
+ // left of the character and compare it's vertical position to the
515
+ // coordinates
516
+ sticky = ch == 0 ? "after" : ch == lineObj.text.length ? "before" :
517
+ (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight <= y) == ltr ?
518
+ "after" : "before"
519
+ // Now get accurate coordinates for this place, in order to get a
520
+ // base X position
521
+ let coords = cursorCoords(cm, Pos(lineNo, ch, sticky), "line", lineObj, preparedMeasure)
522
+ baseX = coords.left
523
+ outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0
524
+ }
525
+
526
+ ch = skipExtendingChars(lineObj.text, ch, 1)
527
+ return PosWithInfo(lineNo, ch, sticky, outside, x - baseX)
528
+ }
529
+
530
+ function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, y) {
531
+ // Bidi parts are sorted left-to-right, and in a non-line-wrapping
532
+ // situation, we can take this ordering to correspond to the visual
533
+ // ordering. This finds the first part whose end is after the given
534
+ // coordinates.
535
+ let index = findFirst(i => {
536
+ let part = order[i], ltr = part.level != 1
537
+ return boxIsAfter(cursorCoords(cm, Pos(lineNo, ltr ? part.to : part.from, ltr ? "before" : "after"),
538
+ "line", lineObj, preparedMeasure), x, y, true)
539
+ }, 0, order.length - 1)
540
+ let part = order[index]
541
+ // If this isn't the first part, the part's start is also after
542
+ // the coordinates, and the coordinates aren't on the same line as
543
+ // that start, move one part back.
544
+ if (index > 0) {
545
+ let ltr = part.level != 1
546
+ let start = cursorCoords(cm, Pos(lineNo, ltr ? part.from : part.to, ltr ? "after" : "before"),
547
+ "line", lineObj, preparedMeasure)
548
+ if (boxIsAfter(start, x, y, true) && start.top > y)
549
+ part = order[index - 1]
550
+ }
551
+ return part
552
+ }
553
+
554
+ function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) {
555
+ // In a wrapped line, rtl text on wrapping boundaries can do things
556
+ // that don't correspond to the ordering in our `order` array at
557
+ // all, so a binary search doesn't work, and we want to return a
558
+ // part that only spans one line so that the binary search in
559
+ // coordsCharInner is safe. As such, we first find the extent of the
560
+ // wrapped line, and then do a flat search in which we discard any
561
+ // spans that aren't on the line.
562
+ let {begin, end} = wrappedLineExtent(cm, lineObj, preparedMeasure, y)
563
+ if (/\s/.test(lineObj.text.charAt(end - 1))) end--
564
+ let part = null, closestDist = null
565
+ for (let i = 0; i < order.length; i++) {
566
+ let p = order[i]
567
+ if (p.from >= end || p.to <= begin) continue
568
+ let ltr = p.level != 1
569
+ let endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right
570
+ // Weigh against spans ending before this, so that they are only
571
+ // picked if nothing ends after
572
+ let dist = endX < x ? x - endX + 1e9 : endX - x
573
+ if (!part || closestDist > dist) {
574
+ part = p
575
+ closestDist = dist
576
+ }
577
+ }
578
+ if (!part) part = order[order.length - 1]
579
+ // Clip the part to the wrapped line.
580
+ if (part.from < begin) part = {from: begin, to: part.to, level: part.level}
581
+ if (part.to > end) part = {from: part.from, to: end, level: part.level}
582
+ return part
583
+ }
584
+
585
+ let measureText
586
+ // Compute the default text height.
587
+ export function textHeight(display) {
588
+ if (display.cachedTextHeight != null) return display.cachedTextHeight
589
+ if (measureText == null) {
590
+ measureText = elt("pre", null, "CodeMirror-line-like")
591
+ // Measure a bunch of lines, for browsers that compute
592
+ // fractional heights.
593
+ for (let i = 0; i < 49; ++i) {
594
+ measureText.appendChild(document.createTextNode("x"))
595
+ measureText.appendChild(elt("br"))
596
+ }
597
+ measureText.appendChild(document.createTextNode("x"))
598
+ }
599
+ removeChildrenAndAdd(display.measure, measureText)
600
+ let height = measureText.offsetHeight / 50
601
+ if (height > 3) display.cachedTextHeight = height
602
+ removeChildren(display.measure)
603
+ return height || 1
604
+ }
605
+
606
+ // Compute the default character width.
607
+ export function charWidth(display) {
608
+ if (display.cachedCharWidth != null) return display.cachedCharWidth
609
+ let anchor = elt("span", "xxxxxxxxxx")
610
+ let pre = elt("pre", [anchor], "CodeMirror-line-like")
611
+ removeChildrenAndAdd(display.measure, pre)
612
+ let rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10
613
+ if (width > 2) display.cachedCharWidth = width
614
+ return width || 10
615
+ }
616
+
617
+ // Do a bulk-read of the DOM positions and sizes needed to draw the
618
+ // view, so that we don't interleave reading and writing to the DOM.
619
+ export function getDimensions(cm) {
620
+ let d = cm.display, left = {}, width = {}
621
+ let gutterLeft = d.gutters.clientLeft
622
+ for (let n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {
623
+ let id = cm.display.gutterSpecs[i].className
624
+ left[id] = n.offsetLeft + n.clientLeft + gutterLeft
625
+ width[id] = n.clientWidth
626
+ }
627
+ return {fixedPos: compensateForHScroll(d),
628
+ gutterTotalWidth: d.gutters.offsetWidth,
629
+ gutterLeft: left,
630
+ gutterWidth: width,
631
+ wrapperWidth: d.wrapper.clientWidth}
632
+ }
633
+
634
+ // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,
635
+ // but using getBoundingClientRect to get a sub-pixel-accurate
636
+ // result.
637
+ export function compensateForHScroll(display) {
638
+ return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left
639
+ }
640
+
641
+ // Returns a function that estimates the height of a line, to use as
642
+ // first approximation until the line becomes visible (and is thus
643
+ // properly measurable).
644
+ export function estimateHeight(cm) {
645
+ let th = textHeight(cm.display), wrapping = cm.options.lineWrapping
646
+ let perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3)
647
+ return line => {
648
+ if (lineIsHidden(cm.doc, line)) return 0
649
+
650
+ let widgetsHeight = 0
651
+ if (line.widgets) for (let i = 0; i < line.widgets.length; i++) {
652
+ if (line.widgets[i].height) widgetsHeight += line.widgets[i].height
653
+ }
654
+
655
+ if (wrapping)
656
+ return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th
657
+ else
658
+ return widgetsHeight + th
659
+ }
660
+ }
661
+
662
+ export function estimateLineHeights(cm) {
663
+ let doc = cm.doc, est = estimateHeight(cm)
664
+ doc.iter(line => {
665
+ let estHeight = est(line)
666
+ if (estHeight != line.height) updateLineHeight(line, estHeight)
667
+ })
668
+ }
669
+
670
+ // Given a mouse event, find the corresponding position. If liberal
671
+ // is false, it checks whether a gutter or scrollbar was clicked,
672
+ // and returns null if it was. forRect is used by rectangular
673
+ // selections, and tries to estimate a character position even for
674
+ // coordinates beyond the right of the text.
675
+ export function posFromMouse(cm, e, liberal, forRect) {
676
+ let display = cm.display
677
+ if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") return null
678
+
679
+ let x, y, space = display.lineSpace.getBoundingClientRect()
680
+ // Fails unpredictably on IE[67] when mouse is dragged around quickly.
681
+ try { x = e.clientX - space.left; y = e.clientY - space.top }
682
+ catch (e) { return null }
683
+ let coords = coordsChar(cm, x, y), line
684
+ if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {
685
+ let colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length
686
+ coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff))
687
+ }
688
+ return coords
689
+ }
690
+
691
+ // Find the view element corresponding to a given line. Return null
692
+ // when the line isn't visible.
693
+ export function findViewIndex(cm, n) {
694
+ if (n >= cm.display.viewTo) return null
695
+ n -= cm.display.viewFrom
696
+ if (n < 0) return null
697
+ let view = cm.display.view
698
+ for (let i = 0; i < view.length; i++) {
699
+ n -= view[i].size
700
+ if (n < 0) return i
701
+ }
702
+ }