qword 0.1.0

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