@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.
- package/.dockerignore +8 -0
- package/.github/workflows/docker-build.yml +45 -0
- package/.gitignore~ +1 -0
- package/Dockerfile +60 -0
- package/LICENSE +21 -0
- package/README.md +99 -0
- package/data.jsontag +20 -0
- package/design/access-management.md +25 -0
- package/design/acid.md +31 -0
- package/design/commands.md +25 -0
- package/design/identity.md +71 -0
- package/design/immutability.md +26 -0
- package/design/jsontag-selector.md +365 -0
- package/design/multitasking.md +13 -0
- package/design/thoughts.md +32 -0
- package/docs/docker.md +129 -0
- package/package.json +29 -0
- package/package.json~ +29 -0
- package/src/run.mjs +3 -0
- package/src/server.mjs +323 -0
- package/src/triplestore.mjs +182 -0
- package/www/assets/css/style.css +2296 -0
- package/www/assets/feather-sprite.svg +1 -0
- package/www/assets/img/simplystore-narrow-white.svg +138 -0
- package/www/assets/img/simplystore-narrow.svg +138 -0
- package/www/assets/img/simplystore-white.svg +153 -0
- package/www/assets/img/simplystore.svg +153 -0
- package/www/codemirror/AUTHORS +979 -0
- package/www/codemirror/CHANGELOG.md +2208 -0
- package/www/codemirror/CONTRIBUTING.md +92 -0
- package/www/codemirror/LICENSE +21 -0
- package/www/codemirror/README.md +47 -0
- package/www/codemirror/addon/comment/comment.js +211 -0
- package/www/codemirror/addon/comment/continuecomment.js +114 -0
- package/www/codemirror/addon/dialog/dialog.css +32 -0
- package/www/codemirror/addon/dialog/dialog.js +163 -0
- package/www/codemirror/addon/display/autorefresh.js +47 -0
- package/www/codemirror/addon/display/fullscreen.css +6 -0
- package/www/codemirror/addon/display/fullscreen.js +41 -0
- package/www/codemirror/addon/display/panel.js +133 -0
- package/www/codemirror/addon/display/placeholder.js +78 -0
- package/www/codemirror/addon/display/rulers.js +51 -0
- package/www/codemirror/addon/edit/closebrackets.js +201 -0
- package/www/codemirror/addon/edit/closetag.js +185 -0
- package/www/codemirror/addon/edit/continuelist.js +101 -0
- package/www/codemirror/addon/edit/matchbrackets.js +160 -0
- package/www/codemirror/addon/edit/matchtags.js +66 -0
- package/www/codemirror/addon/edit/trailingspace.js +27 -0
- package/www/codemirror/addon/fold/brace-fold.js +119 -0
- package/www/codemirror/addon/fold/comment-fold.js +59 -0
- package/www/codemirror/addon/fold/foldcode.js +159 -0
- package/www/codemirror/addon/fold/foldgutter.css +20 -0
- package/www/codemirror/addon/fold/foldgutter.js +169 -0
- package/www/codemirror/addon/fold/indent-fold.js +48 -0
- package/www/codemirror/addon/fold/markdown-fold.js +49 -0
- package/www/codemirror/addon/fold/xml-fold.js +184 -0
- package/www/codemirror/addon/hint/anyword-hint.js +41 -0
- package/www/codemirror/addon/hint/css-hint.js +66 -0
- package/www/codemirror/addon/hint/html-hint.js +351 -0
- package/www/codemirror/addon/hint/javascript-hint.js +162 -0
- package/www/codemirror/addon/hint/show-hint.css +37 -0
- package/www/codemirror/addon/hint/show-hint.js +523 -0
- package/www/codemirror/addon/hint/sql-hint.js +304 -0
- package/www/codemirror/addon/hint/xml-hint.js +132 -0
- package/www/codemirror/addon/lint/coffeescript-lint.js +47 -0
- package/www/codemirror/addon/lint/css-lint.js +40 -0
- package/www/codemirror/addon/lint/html-lint.js +59 -0
- package/www/codemirror/addon/lint/javascript-lint.js +65 -0
- package/www/codemirror/addon/lint/json-lint.js +40 -0
- package/www/codemirror/addon/lint/lint.css +79 -0
- package/www/codemirror/addon/lint/lint.js +291 -0
- package/www/codemirror/addon/lint/yaml-lint.js +41 -0
- package/www/codemirror/addon/merge/merge.css +119 -0
- package/www/codemirror/addon/merge/merge.js +1018 -0
- package/www/codemirror/addon/mode/loadmode.js +66 -0
- package/www/codemirror/addon/mode/multiplex.js +136 -0
- package/www/codemirror/addon/mode/multiplex_test.js +49 -0
- package/www/codemirror/addon/mode/overlay.js +90 -0
- package/www/codemirror/addon/mode/simple.js +216 -0
- package/www/codemirror/addon/runmode/colorize.js +40 -0
- package/www/codemirror/addon/runmode/runmode-standalone.js +334 -0
- package/www/codemirror/addon/runmode/runmode.js +76 -0
- package/www/codemirror/addon/runmode/runmode.node.js +329 -0
- package/www/codemirror/addon/scroll/annotatescrollbar.js +128 -0
- package/www/codemirror/addon/scroll/scrollpastend.js +48 -0
- package/www/codemirror/addon/scroll/simplescrollbars.css +66 -0
- package/www/codemirror/addon/scroll/simplescrollbars.js +152 -0
- package/www/codemirror/addon/search/jump-to-line.js +53 -0
- package/www/codemirror/addon/search/match-highlighter.js +167 -0
- package/www/codemirror/addon/search/matchesonscrollbar.css +8 -0
- package/www/codemirror/addon/search/matchesonscrollbar.js +97 -0
- package/www/codemirror/addon/search/search.js +295 -0
- package/www/codemirror/addon/search/searchcursor.js +305 -0
- package/www/codemirror/addon/selection/active-line.js +72 -0
- package/www/codemirror/addon/selection/mark-selection.js +119 -0
- package/www/codemirror/addon/selection/selection-pointer.js +98 -0
- package/www/codemirror/addon/tern/tern.css +87 -0
- package/www/codemirror/addon/tern/tern.js +756 -0
- package/www/codemirror/addon/tern/worker.js +44 -0
- package/www/codemirror/addon/wrap/hardwrap.js +160 -0
- package/www/codemirror/bin/source-highlight +48 -0
- package/www/codemirror/keymap/emacs.js +545 -0
- package/www/codemirror/keymap/sublime.js +720 -0
- package/www/codemirror/keymap/vim.js +5978 -0
- package/www/codemirror/lib/codemirror.css +344 -0
- package/www/codemirror/lib/codemirror.js +9874 -0
- package/www/codemirror/mode/apl/apl.js +174 -0
- package/www/codemirror/mode/asciiarmor/asciiarmor.js +74 -0
- package/www/codemirror/mode/asn.1/asn.1.js +204 -0
- package/www/codemirror/mode/asterisk/asterisk.js +220 -0
- package/www/codemirror/mode/brainfuck/brainfuck.js +85 -0
- package/www/codemirror/mode/clike/clike.js +940 -0
- package/www/codemirror/mode/clojure/clojure.js +292 -0
- package/www/codemirror/mode/cmake/cmake.js +97 -0
- package/www/codemirror/mode/cobol/cobol.js +255 -0
- package/www/codemirror/mode/coffeescript/coffeescript.js +359 -0
- package/www/codemirror/mode/commonlisp/commonlisp.js +125 -0
- package/www/codemirror/mode/crystal/crystal.js +433 -0
- package/www/codemirror/mode/css/css.js +862 -0
- package/www/codemirror/mode/cypher/cypher.js +152 -0
- package/www/codemirror/mode/d/d.js +223 -0
- package/www/codemirror/mode/dart/dart.js +166 -0
- package/www/codemirror/mode/diff/diff.js +47 -0
- package/www/codemirror/mode/django/django.js +356 -0
- package/www/codemirror/mode/dockerfile/dockerfile.js +211 -0
- package/www/codemirror/mode/dtd/dtd.js +142 -0
- package/www/codemirror/mode/dylan/dylan.js +352 -0
- package/www/codemirror/mode/ebnf/ebnf.js +195 -0
- package/www/codemirror/mode/ecl/ecl.js +206 -0
- package/www/codemirror/mode/eiffel/eiffel.js +160 -0
- package/www/codemirror/mode/elm/elm.js +245 -0
- package/www/codemirror/mode/erlang/erlang.js +619 -0
- package/www/codemirror/mode/factor/factor.js +85 -0
- package/www/codemirror/mode/fcl/fcl.js +173 -0
- package/www/codemirror/mode/forth/forth.js +180 -0
- package/www/codemirror/mode/fortran/fortran.js +188 -0
- package/www/codemirror/mode/gas/gas.js +353 -0
- package/www/codemirror/mode/gfm/gfm.js +129 -0
- package/www/codemirror/mode/gherkin/gherkin.js +178 -0
- package/www/codemirror/mode/go/go.js +187 -0
- package/www/codemirror/mode/groovy/groovy.js +247 -0
- package/www/codemirror/mode/haml/haml.js +161 -0
- package/www/codemirror/mode/handlebars/handlebars.js +70 -0
- package/www/codemirror/mode/haskell/haskell.js +268 -0
- package/www/codemirror/mode/haskell-literate/haskell-literate.js +43 -0
- package/www/codemirror/mode/haxe/haxe.js +515 -0
- package/www/codemirror/mode/htmlembedded/htmlembedded.js +37 -0
- package/www/codemirror/mode/htmlmixed/htmlmixed.js +153 -0
- package/www/codemirror/mode/http/http.js +113 -0
- package/www/codemirror/mode/idl/idl.js +290 -0
- package/www/codemirror/mode/javascript/javascript.js +960 -0
- package/www/codemirror/mode/jinja2/jinja2.js +193 -0
- package/www/codemirror/mode/jsx/jsx.js +148 -0
- package/www/codemirror/mode/julia/julia.js +390 -0
- package/www/codemirror/mode/livescript/livescript.js +280 -0
- package/www/codemirror/mode/lua/lua.js +160 -0
- package/www/codemirror/mode/markdown/markdown.js +886 -0
- package/www/codemirror/mode/mathematica/mathematica.js +176 -0
- package/www/codemirror/mode/mbox/mbox.js +129 -0
- package/www/codemirror/mode/meta.js +221 -0
- package/www/codemirror/mode/mirc/mirc.js +193 -0
- package/www/codemirror/mode/mllike/mllike.js +359 -0
- package/www/codemirror/mode/modelica/modelica.js +245 -0
- package/www/codemirror/mode/mscgen/mscgen.js +175 -0
- package/www/codemirror/mode/mumps/mumps.js +148 -0
- package/www/codemirror/mode/nginx/nginx.js +178 -0
- package/www/codemirror/mode/nsis/nsis.js +95 -0
- package/www/codemirror/mode/ntriples/ntriples.js +195 -0
- package/www/codemirror/mode/octave/octave.js +139 -0
- package/www/codemirror/mode/oz/oz.js +252 -0
- package/www/codemirror/mode/pascal/pascal.js +136 -0
- package/www/codemirror/mode/pegjs/pegjs.js +111 -0
- package/www/codemirror/mode/perl/perl.js +836 -0
- package/www/codemirror/mode/php/php.js +234 -0
- package/www/codemirror/mode/pig/pig.js +178 -0
- package/www/codemirror/mode/powershell/powershell.js +398 -0
- package/www/codemirror/mode/properties/properties.js +78 -0
- package/www/codemirror/mode/protobuf/protobuf.js +72 -0
- package/www/codemirror/mode/pug/pug.js +591 -0
- package/www/codemirror/mode/puppet/puppet.js +220 -0
- package/www/codemirror/mode/python/python.js +402 -0
- package/www/codemirror/mode/q/q.js +139 -0
- package/www/codemirror/mode/r/r.js +190 -0
- package/www/codemirror/mode/rpm/changes/index.html +66 -0
- package/www/codemirror/mode/rpm/rpm.js +109 -0
- package/www/codemirror/mode/rst/rst.js +557 -0
- package/www/codemirror/mode/ruby/ruby.js +303 -0
- package/www/codemirror/mode/rust/rust.js +72 -0
- package/www/codemirror/mode/sas/sas.js +303 -0
- package/www/codemirror/mode/sass/sass.js +459 -0
- package/www/codemirror/mode/scheme/scheme.js +284 -0
- package/www/codemirror/mode/shell/shell.js +168 -0
- package/www/codemirror/mode/sieve/sieve.js +193 -0
- package/www/codemirror/mode/slim/slim.js +575 -0
- package/www/codemirror/mode/smalltalk/smalltalk.js +168 -0
- package/www/codemirror/mode/smarty/smarty.js +225 -0
- package/www/codemirror/mode/solr/solr.js +104 -0
- package/www/codemirror/mode/soy/soy.js +665 -0
- package/www/codemirror/mode/sparql/sparql.js +184 -0
- package/www/codemirror/mode/spreadsheet/spreadsheet.js +112 -0
- package/www/codemirror/mode/sql/sql.js +525 -0
- package/www/codemirror/mode/stex/stex.js +264 -0
- package/www/codemirror/mode/stylus/stylus.js +775 -0
- package/www/codemirror/mode/swift/swift.js +221 -0
- package/www/codemirror/mode/tcl/tcl.js +140 -0
- package/www/codemirror/mode/textile/textile.js +469 -0
- package/www/codemirror/mode/tiddlywiki/tiddlywiki.css +14 -0
- package/www/codemirror/mode/tiddlywiki/tiddlywiki.js +308 -0
- package/www/codemirror/mode/tiki/tiki.css +26 -0
- package/www/codemirror/mode/tiki/tiki.js +312 -0
- package/www/codemirror/mode/toml/toml.js +88 -0
- package/www/codemirror/mode/tornado/tornado.js +68 -0
- package/www/codemirror/mode/troff/troff.js +84 -0
- package/www/codemirror/mode/ttcn/ttcn.js +283 -0
- package/www/codemirror/mode/ttcn-cfg/ttcn-cfg.js +214 -0
- package/www/codemirror/mode/turtle/turtle.js +162 -0
- package/www/codemirror/mode/twig/twig.js +141 -0
- package/www/codemirror/mode/vb/vb.js +275 -0
- package/www/codemirror/mode/vbscript/vbscript.js +350 -0
- package/www/codemirror/mode/velocity/velocity.js +202 -0
- package/www/codemirror/mode/verilog/verilog.js +781 -0
- package/www/codemirror/mode/vhdl/vhdl.js +189 -0
- package/www/codemirror/mode/vue/vue.js +77 -0
- package/www/codemirror/mode/wast/wast.js +132 -0
- package/www/codemirror/mode/webidl/webidl.js +195 -0
- package/www/codemirror/mode/xml/xml.js +417 -0
- package/www/codemirror/mode/xquery/xquery.js +448 -0
- package/www/codemirror/mode/yacas/yacas.js +204 -0
- package/www/codemirror/mode/yaml/yaml.js +120 -0
- package/www/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js +72 -0
- package/www/codemirror/mode/z80/z80.js +116 -0
- package/www/codemirror/package.json +52 -0
- package/www/codemirror/rollup.config.js +52 -0
- package/www/codemirror/src/addon/runmode/codemirror-standalone.js +24 -0
- package/www/codemirror/src/addon/runmode/codemirror.node.js +21 -0
- package/www/codemirror/src/addon/runmode/runmode-standalone.js +2 -0
- package/www/codemirror/src/addon/runmode/runmode.node.js +2 -0
- package/www/codemirror/src/codemirror.js +3 -0
- package/www/codemirror/src/display/Display.js +116 -0
- package/www/codemirror/src/display/focus.js +50 -0
- package/www/codemirror/src/display/gutters.js +44 -0
- package/www/codemirror/src/display/highlight_worker.js +55 -0
- package/www/codemirror/src/display/line_numbers.js +48 -0
- package/www/codemirror/src/display/mode_state.js +22 -0
- package/www/codemirror/src/display/operations.js +206 -0
- package/www/codemirror/src/display/scroll_events.js +132 -0
- package/www/codemirror/src/display/scrollbars.js +194 -0
- package/www/codemirror/src/display/scrolling.js +186 -0
- package/www/codemirror/src/display/selection.js +173 -0
- package/www/codemirror/src/display/update_display.js +267 -0
- package/www/codemirror/src/display/update_line.js +189 -0
- package/www/codemirror/src/display/update_lines.js +82 -0
- package/www/codemirror/src/display/view_tracking.js +153 -0
- package/www/codemirror/src/edit/CodeMirror.js +217 -0
- package/www/codemirror/src/edit/commands.js +178 -0
- package/www/codemirror/src/edit/deleteNearSelection.js +30 -0
- package/www/codemirror/src/edit/drop_events.js +130 -0
- package/www/codemirror/src/edit/fromTextArea.js +61 -0
- package/www/codemirror/src/edit/global_events.js +45 -0
- package/www/codemirror/src/edit/key_events.js +163 -0
- package/www/codemirror/src/edit/legacy.js +62 -0
- package/www/codemirror/src/edit/main.js +69 -0
- package/www/codemirror/src/edit/methods.js +555 -0
- package/www/codemirror/src/edit/mouse_events.js +417 -0
- package/www/codemirror/src/edit/options.js +194 -0
- package/www/codemirror/src/edit/utils.js +7 -0
- package/www/codemirror/src/input/ContentEditableInput.js +546 -0
- package/www/codemirror/src/input/TextareaInput.js +380 -0
- package/www/codemirror/src/input/indent.js +71 -0
- package/www/codemirror/src/input/input.js +134 -0
- package/www/codemirror/src/input/keymap.js +147 -0
- package/www/codemirror/src/input/keynames.js +17 -0
- package/www/codemirror/src/input/movement.js +111 -0
- package/www/codemirror/src/line/highlight.js +284 -0
- package/www/codemirror/src/line/line_data.js +349 -0
- package/www/codemirror/src/line/pos.js +40 -0
- package/www/codemirror/src/line/saw_special_spans.js +10 -0
- package/www/codemirror/src/line/spans.js +390 -0
- package/www/codemirror/src/line/utils_line.js +85 -0
- package/www/codemirror/src/measurement/position_measurement.js +702 -0
- package/www/codemirror/src/measurement/widgets.js +26 -0
- package/www/codemirror/src/model/Doc.js +436 -0
- package/www/codemirror/src/model/change_measurement.js +61 -0
- package/www/codemirror/src/model/changes.js +339 -0
- package/www/codemirror/src/model/chunk.js +167 -0
- package/www/codemirror/src/model/document_data.js +112 -0
- package/www/codemirror/src/model/history.js +228 -0
- package/www/codemirror/src/model/line_widget.js +78 -0
- package/www/codemirror/src/model/mark_text.js +293 -0
- package/www/codemirror/src/model/selection.js +84 -0
- package/www/codemirror/src/model/selection_updates.js +216 -0
- package/www/codemirror/src/modes.js +96 -0
- package/www/codemirror/src/util/StringStream.js +90 -0
- package/www/codemirror/src/util/bidi.js +215 -0
- package/www/codemirror/src/util/browser.js +34 -0
- package/www/codemirror/src/util/dom.js +101 -0
- package/www/codemirror/src/util/event.js +103 -0
- package/www/codemirror/src/util/feature_detection.js +84 -0
- package/www/codemirror/src/util/misc.js +168 -0
- package/www/codemirror/src/util/operation_group.js +72 -0
- package/www/codemirror/theme/3024-day.css +41 -0
- package/www/codemirror/theme/3024-night.css +39 -0
- package/www/codemirror/theme/abbott.css +268 -0
- package/www/codemirror/theme/abcdef.css +32 -0
- package/www/codemirror/theme/ambiance-mobile.css +5 -0
- package/www/codemirror/theme/ambiance.css +74 -0
- package/www/codemirror/theme/ayu-dark.css +44 -0
- package/www/codemirror/theme/ayu-mirage.css +45 -0
- package/www/codemirror/theme/base16-dark.css +40 -0
- package/www/codemirror/theme/base16-light.css +38 -0
- package/www/codemirror/theme/bespin.css +34 -0
- package/www/codemirror/theme/blackboard.css +32 -0
- package/www/codemirror/theme/cobalt.css +25 -0
- package/www/codemirror/theme/colorforth.css +33 -0
- package/www/codemirror/theme/darcula.css +53 -0
- package/www/codemirror/theme/dracula.css +40 -0
- package/www/codemirror/theme/duotone-dark.css +35 -0
- package/www/codemirror/theme/duotone-light.css +36 -0
- package/www/codemirror/theme/eclipse.css +23 -0
- package/www/codemirror/theme/elegant.css +13 -0
- package/www/codemirror/theme/erlang-dark.css +34 -0
- package/www/codemirror/theme/gruvbox-dark.css +39 -0
- package/www/codemirror/theme/hopscotch.css +34 -0
- package/www/codemirror/theme/icecoder.css +43 -0
- package/www/codemirror/theme/idea.css +42 -0
- package/www/codemirror/theme/isotope.css +34 -0
- package/www/codemirror/theme/juejin.css +30 -0
- package/www/codemirror/theme/lesser-dark.css +47 -0
- package/www/codemirror/theme/liquibyte.css +95 -0
- package/www/codemirror/theme/lucario.css +37 -0
- package/www/codemirror/theme/material-darker.css +135 -0
- package/www/codemirror/theme/material-ocean.css +141 -0
- package/www/codemirror/theme/material-palenight.css +141 -0
- package/www/codemirror/theme/material.css +141 -0
- package/www/codemirror/theme/mbo.css +37 -0
- package/www/codemirror/theme/mdn-like.css +46 -0
- package/www/codemirror/theme/midnight.css +39 -0
- package/www/codemirror/theme/monokai.css +41 -0
- package/www/codemirror/theme/moxer.css +143 -0
- package/www/codemirror/theme/neat.css +12 -0
- package/www/codemirror/theme/neo.css +43 -0
- package/www/codemirror/theme/night.css +27 -0
- package/www/codemirror/theme/nord.css +42 -0
- package/www/codemirror/theme/oceanic-next.css +46 -0
- package/www/codemirror/theme/panda-syntax.css +85 -0
- package/www/codemirror/theme/paraiso-dark.css +38 -0
- package/www/codemirror/theme/paraiso-light.css +38 -0
- package/www/codemirror/theme/pastel-on-dark.css +52 -0
- package/www/codemirror/theme/railscasts.css +34 -0
- package/www/codemirror/theme/rubyblue.css +25 -0
- package/www/codemirror/theme/seti.css +44 -0
- package/www/codemirror/theme/shadowfox.css +52 -0
- package/www/codemirror/theme/solarized.css +165 -0
- package/www/codemirror/theme/ssms.css +16 -0
- package/www/codemirror/theme/the-matrix.css +30 -0
- package/www/codemirror/theme/tomorrow-night-bright.css +35 -0
- package/www/codemirror/theme/tomorrow-night-eighties.css +38 -0
- package/www/codemirror/theme/ttcn.css +64 -0
- package/www/codemirror/theme/twilight.css +32 -0
- package/www/codemirror/theme/vibrant-ink.css +34 -0
- package/www/codemirror/theme/xq-dark.css +53 -0
- package/www/codemirror/theme/xq-light.css +43 -0
- package/www/codemirror/theme/yeti.css +44 -0
- package/www/codemirror/theme/yonce.css +59 -0
- package/www/codemirror/theme/zenburn.css +37 -0
- package/www/index.html +216 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { elt, removeChildren } from "../util/dom.js"
|
|
2
|
+
import { regChange } from "./view_tracking.js"
|
|
3
|
+
import { alignHorizontally } from "./line_numbers.js"
|
|
4
|
+
import { updateGutterSpace } from "./update_display.js"
|
|
5
|
+
|
|
6
|
+
export function getGutters(gutters, lineNumbers) {
|
|
7
|
+
let result = [], sawLineNumbers = false
|
|
8
|
+
for (let i = 0; i < gutters.length; i++) {
|
|
9
|
+
let name = gutters[i], style = null
|
|
10
|
+
if (typeof name != "string") { style = name.style; name = name.className }
|
|
11
|
+
if (name == "CodeMirror-linenumbers") {
|
|
12
|
+
if (!lineNumbers) continue
|
|
13
|
+
else sawLineNumbers = true
|
|
14
|
+
}
|
|
15
|
+
result.push({className: name, style})
|
|
16
|
+
}
|
|
17
|
+
if (lineNumbers && !sawLineNumbers) result.push({className: "CodeMirror-linenumbers", style: null})
|
|
18
|
+
return result
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Rebuild the gutter elements, ensure the margin to the left of the
|
|
22
|
+
// code matches their width.
|
|
23
|
+
export function renderGutters(display) {
|
|
24
|
+
let gutters = display.gutters, specs = display.gutterSpecs
|
|
25
|
+
removeChildren(gutters)
|
|
26
|
+
display.lineGutter = null
|
|
27
|
+
for (let i = 0; i < specs.length; ++i) {
|
|
28
|
+
let {className, style} = specs[i]
|
|
29
|
+
let gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + className))
|
|
30
|
+
if (style) gElt.style.cssText = style
|
|
31
|
+
if (className == "CodeMirror-linenumbers") {
|
|
32
|
+
display.lineGutter = gElt
|
|
33
|
+
gElt.style.width = (display.lineNumWidth || 1) + "px"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
gutters.style.display = specs.length ? "" : "none"
|
|
37
|
+
updateGutterSpace(display)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function updateGutters(cm) {
|
|
41
|
+
renderGutters(cm.display)
|
|
42
|
+
regChange(cm)
|
|
43
|
+
alignHorizontally(cm)
|
|
44
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { getContextBefore, highlightLine, processLine } from "../line/highlight.js"
|
|
2
|
+
import { copyState } from "../modes.js"
|
|
3
|
+
import { bind } from "../util/misc.js"
|
|
4
|
+
|
|
5
|
+
import { runInOp } from "./operations.js"
|
|
6
|
+
import { regLineChange } from "./view_tracking.js"
|
|
7
|
+
|
|
8
|
+
// HIGHLIGHT WORKER
|
|
9
|
+
|
|
10
|
+
export function startWorker(cm, time) {
|
|
11
|
+
if (cm.doc.highlightFrontier < cm.display.viewTo)
|
|
12
|
+
cm.state.highlight.set(time, bind(highlightWorker, cm))
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function highlightWorker(cm) {
|
|
16
|
+
let doc = cm.doc
|
|
17
|
+
if (doc.highlightFrontier >= cm.display.viewTo) return
|
|
18
|
+
let end = +new Date + cm.options.workTime
|
|
19
|
+
let context = getContextBefore(cm, doc.highlightFrontier)
|
|
20
|
+
let changedLines = []
|
|
21
|
+
|
|
22
|
+
doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), line => {
|
|
23
|
+
if (context.line >= cm.display.viewFrom) { // Visible
|
|
24
|
+
let oldStyles = line.styles
|
|
25
|
+
let resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null
|
|
26
|
+
let highlighted = highlightLine(cm, line, context, true)
|
|
27
|
+
if (resetState) context.state = resetState
|
|
28
|
+
line.styles = highlighted.styles
|
|
29
|
+
let oldCls = line.styleClasses, newCls = highlighted.classes
|
|
30
|
+
if (newCls) line.styleClasses = newCls
|
|
31
|
+
else if (oldCls) line.styleClasses = null
|
|
32
|
+
let ischange = !oldStyles || oldStyles.length != line.styles.length ||
|
|
33
|
+
oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass)
|
|
34
|
+
for (let i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i]
|
|
35
|
+
if (ischange) changedLines.push(context.line)
|
|
36
|
+
line.stateAfter = context.save()
|
|
37
|
+
context.nextLine()
|
|
38
|
+
} else {
|
|
39
|
+
if (line.text.length <= cm.options.maxHighlightLength)
|
|
40
|
+
processLine(cm, line.text, context)
|
|
41
|
+
line.stateAfter = context.line % 5 == 0 ? context.save() : null
|
|
42
|
+
context.nextLine()
|
|
43
|
+
}
|
|
44
|
+
if (+new Date > end) {
|
|
45
|
+
startWorker(cm, cm.options.workDelay)
|
|
46
|
+
return true
|
|
47
|
+
}
|
|
48
|
+
})
|
|
49
|
+
doc.highlightFrontier = context.line
|
|
50
|
+
doc.modeFrontier = Math.max(doc.modeFrontier, context.line)
|
|
51
|
+
if (changedLines.length) runInOp(cm, () => {
|
|
52
|
+
for (let i = 0; i < changedLines.length; i++)
|
|
53
|
+
regLineChange(cm, changedLines[i], "text")
|
|
54
|
+
})
|
|
55
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { lineNumberFor } from "../line/utils_line.js"
|
|
2
|
+
import { compensateForHScroll } from "../measurement/position_measurement.js"
|
|
3
|
+
import { elt } from "../util/dom.js"
|
|
4
|
+
|
|
5
|
+
import { updateGutterSpace } from "./update_display.js"
|
|
6
|
+
|
|
7
|
+
// Re-align line numbers and gutter marks to compensate for
|
|
8
|
+
// horizontal scrolling.
|
|
9
|
+
export function alignHorizontally(cm) {
|
|
10
|
+
let display = cm.display, view = display.view
|
|
11
|
+
if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return
|
|
12
|
+
let comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft
|
|
13
|
+
let gutterW = display.gutters.offsetWidth, left = comp + "px"
|
|
14
|
+
for (let i = 0; i < view.length; i++) if (!view[i].hidden) {
|
|
15
|
+
if (cm.options.fixedGutter) {
|
|
16
|
+
if (view[i].gutter)
|
|
17
|
+
view[i].gutter.style.left = left
|
|
18
|
+
if (view[i].gutterBackground)
|
|
19
|
+
view[i].gutterBackground.style.left = left
|
|
20
|
+
}
|
|
21
|
+
let align = view[i].alignable
|
|
22
|
+
if (align) for (let j = 0; j < align.length; j++)
|
|
23
|
+
align[j].style.left = left
|
|
24
|
+
}
|
|
25
|
+
if (cm.options.fixedGutter)
|
|
26
|
+
display.gutters.style.left = (comp + gutterW) + "px"
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Used to ensure that the line number gutter is still the right
|
|
30
|
+
// size for the current document size. Returns true when an update
|
|
31
|
+
// is needed.
|
|
32
|
+
export function maybeUpdateLineNumberWidth(cm) {
|
|
33
|
+
if (!cm.options.lineNumbers) return false
|
|
34
|
+
let doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display
|
|
35
|
+
if (last.length != display.lineNumChars) {
|
|
36
|
+
let test = display.measure.appendChild(elt("div", [elt("div", last)],
|
|
37
|
+
"CodeMirror-linenumber CodeMirror-gutter-elt"))
|
|
38
|
+
let innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW
|
|
39
|
+
display.lineGutter.style.width = ""
|
|
40
|
+
display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1
|
|
41
|
+
display.lineNumWidth = display.lineNumInnerWidth + padding
|
|
42
|
+
display.lineNumChars = display.lineNumInnerWidth ? last.length : -1
|
|
43
|
+
display.lineGutter.style.width = display.lineNumWidth + "px"
|
|
44
|
+
updateGutterSpace(cm.display)
|
|
45
|
+
return true
|
|
46
|
+
}
|
|
47
|
+
return false
|
|
48
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { getMode } from "../modes.js"
|
|
2
|
+
|
|
3
|
+
import { startWorker } from "./highlight_worker.js"
|
|
4
|
+
import { regChange } from "./view_tracking.js"
|
|
5
|
+
|
|
6
|
+
// Used to get the editor into a consistent state again when options change.
|
|
7
|
+
|
|
8
|
+
export function loadMode(cm) {
|
|
9
|
+
cm.doc.mode = getMode(cm.options, cm.doc.modeOption)
|
|
10
|
+
resetModeState(cm)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function resetModeState(cm) {
|
|
14
|
+
cm.doc.iter(line => {
|
|
15
|
+
if (line.stateAfter) line.stateAfter = null
|
|
16
|
+
if (line.styles) line.styles = null
|
|
17
|
+
})
|
|
18
|
+
cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first
|
|
19
|
+
startWorker(cm, 100)
|
|
20
|
+
cm.state.modeGen++
|
|
21
|
+
if (cm.curOp) regChange(cm)
|
|
22
|
+
}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { clipPos } from "../line/pos.js"
|
|
2
|
+
import { findMaxLine } from "../line/spans.js"
|
|
3
|
+
import { displayWidth, measureChar, scrollGap } from "../measurement/position_measurement.js"
|
|
4
|
+
import { signal } from "../util/event.js"
|
|
5
|
+
import { activeElt, doc } from "../util/dom.js"
|
|
6
|
+
import { finishOperation, pushOperation } from "../util/operation_group.js"
|
|
7
|
+
|
|
8
|
+
import { ensureFocus } from "./focus.js"
|
|
9
|
+
import { measureForScrollbars, updateScrollbars } from "./scrollbars.js"
|
|
10
|
+
import { restartBlink } from "./selection.js"
|
|
11
|
+
import { maybeScrollWindow, scrollPosIntoView, setScrollLeft, setScrollTop } from "./scrolling.js"
|
|
12
|
+
import { DisplayUpdate, maybeClipScrollbars, postUpdateDisplay, setDocumentHeight, updateDisplayIfNeeded } from "./update_display.js"
|
|
13
|
+
import { updateHeightsInViewport } from "./update_lines.js"
|
|
14
|
+
|
|
15
|
+
// Operations are used to wrap a series of changes to the editor
|
|
16
|
+
// state in such a way that each change won't have to update the
|
|
17
|
+
// cursor and display (which would be awkward, slow, and
|
|
18
|
+
// error-prone). Instead, display updates are batched and then all
|
|
19
|
+
// combined and executed at once.
|
|
20
|
+
|
|
21
|
+
let nextOpId = 0
|
|
22
|
+
// Start a new operation.
|
|
23
|
+
export function startOperation(cm) {
|
|
24
|
+
cm.curOp = {
|
|
25
|
+
cm: cm,
|
|
26
|
+
viewChanged: false, // Flag that indicates that lines might need to be redrawn
|
|
27
|
+
startHeight: cm.doc.height, // Used to detect need to update scrollbar
|
|
28
|
+
forceUpdate: false, // Used to force a redraw
|
|
29
|
+
updateInput: 0, // Whether to reset the input textarea
|
|
30
|
+
typing: false, // Whether this reset should be careful to leave existing text (for compositing)
|
|
31
|
+
changeObjs: null, // Accumulated changes, for firing change events
|
|
32
|
+
cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on
|
|
33
|
+
cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already
|
|
34
|
+
selectionChanged: false, // Whether the selection needs to be redrawn
|
|
35
|
+
updateMaxLine: false, // Set when the widest line needs to be determined anew
|
|
36
|
+
scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet
|
|
37
|
+
scrollToPos: null, // Used to scroll to a specific position
|
|
38
|
+
focus: false,
|
|
39
|
+
id: ++nextOpId, // Unique ID
|
|
40
|
+
markArrays: null // Used by addMarkedSpan
|
|
41
|
+
}
|
|
42
|
+
pushOperation(cm.curOp)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Finish an operation, updating the display and signalling delayed events
|
|
46
|
+
export function endOperation(cm) {
|
|
47
|
+
let op = cm.curOp
|
|
48
|
+
if (op) finishOperation(op, group => {
|
|
49
|
+
for (let i = 0; i < group.ops.length; i++)
|
|
50
|
+
group.ops[i].cm.curOp = null
|
|
51
|
+
endOperations(group)
|
|
52
|
+
})
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// The DOM updates done when an operation finishes are batched so
|
|
56
|
+
// that the minimum number of relayouts are required.
|
|
57
|
+
function endOperations(group) {
|
|
58
|
+
let ops = group.ops
|
|
59
|
+
for (let i = 0; i < ops.length; i++) // Read DOM
|
|
60
|
+
endOperation_R1(ops[i])
|
|
61
|
+
for (let i = 0; i < ops.length; i++) // Write DOM (maybe)
|
|
62
|
+
endOperation_W1(ops[i])
|
|
63
|
+
for (let i = 0; i < ops.length; i++) // Read DOM
|
|
64
|
+
endOperation_R2(ops[i])
|
|
65
|
+
for (let i = 0; i < ops.length; i++) // Write DOM (maybe)
|
|
66
|
+
endOperation_W2(ops[i])
|
|
67
|
+
for (let i = 0; i < ops.length; i++) // Read DOM
|
|
68
|
+
endOperation_finish(ops[i])
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function endOperation_R1(op) {
|
|
72
|
+
let cm = op.cm, display = cm.display
|
|
73
|
+
maybeClipScrollbars(cm)
|
|
74
|
+
if (op.updateMaxLine) findMaxLine(cm)
|
|
75
|
+
|
|
76
|
+
op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||
|
|
77
|
+
op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||
|
|
78
|
+
op.scrollToPos.to.line >= display.viewTo) ||
|
|
79
|
+
display.maxLineChanged && cm.options.lineWrapping
|
|
80
|
+
op.update = op.mustUpdate &&
|
|
81
|
+
new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function endOperation_W1(op) {
|
|
85
|
+
op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function endOperation_R2(op) {
|
|
89
|
+
let cm = op.cm, display = cm.display
|
|
90
|
+
if (op.updatedDisplay) updateHeightsInViewport(cm)
|
|
91
|
+
|
|
92
|
+
op.barMeasure = measureForScrollbars(cm)
|
|
93
|
+
|
|
94
|
+
// If the max line changed since it was last measured, measure it,
|
|
95
|
+
// and ensure the document's width matches it.
|
|
96
|
+
// updateDisplay_W2 will use these properties to do the actual resizing
|
|
97
|
+
if (display.maxLineChanged && !cm.options.lineWrapping) {
|
|
98
|
+
op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3
|
|
99
|
+
cm.display.sizerWidth = op.adjustWidthTo
|
|
100
|
+
op.barMeasure.scrollWidth =
|
|
101
|
+
Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth)
|
|
102
|
+
op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm))
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (op.updatedDisplay || op.selectionChanged)
|
|
106
|
+
op.preparedSelection = display.input.prepareSelection()
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function endOperation_W2(op) {
|
|
110
|
+
let cm = op.cm
|
|
111
|
+
|
|
112
|
+
if (op.adjustWidthTo != null) {
|
|
113
|
+
cm.display.sizer.style.minWidth = op.adjustWidthTo + "px"
|
|
114
|
+
if (op.maxScrollLeft < cm.doc.scrollLeft)
|
|
115
|
+
setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true)
|
|
116
|
+
cm.display.maxLineChanged = false
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
let takeFocus = op.focus && op.focus == activeElt(doc(cm))
|
|
120
|
+
if (op.preparedSelection)
|
|
121
|
+
cm.display.input.showSelection(op.preparedSelection, takeFocus)
|
|
122
|
+
if (op.updatedDisplay || op.startHeight != cm.doc.height)
|
|
123
|
+
updateScrollbars(cm, op.barMeasure)
|
|
124
|
+
if (op.updatedDisplay)
|
|
125
|
+
setDocumentHeight(cm, op.barMeasure)
|
|
126
|
+
|
|
127
|
+
if (op.selectionChanged) restartBlink(cm)
|
|
128
|
+
|
|
129
|
+
if (cm.state.focused && op.updateInput)
|
|
130
|
+
cm.display.input.reset(op.typing)
|
|
131
|
+
if (takeFocus) ensureFocus(op.cm)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function endOperation_finish(op) {
|
|
135
|
+
let cm = op.cm, display = cm.display, doc = cm.doc
|
|
136
|
+
|
|
137
|
+
if (op.updatedDisplay) postUpdateDisplay(cm, op.update)
|
|
138
|
+
|
|
139
|
+
// Abort mouse wheel delta measurement, when scrolling explicitly
|
|
140
|
+
if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))
|
|
141
|
+
display.wheelStartX = display.wheelStartY = null
|
|
142
|
+
|
|
143
|
+
// Propagate the scroll position to the actual DOM scroller
|
|
144
|
+
if (op.scrollTop != null) setScrollTop(cm, op.scrollTop, op.forceScroll)
|
|
145
|
+
|
|
146
|
+
if (op.scrollLeft != null) setScrollLeft(cm, op.scrollLeft, true, true)
|
|
147
|
+
// If we need to scroll a specific position into view, do so.
|
|
148
|
+
if (op.scrollToPos) {
|
|
149
|
+
let rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),
|
|
150
|
+
clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin)
|
|
151
|
+
maybeScrollWindow(cm, rect)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Fire events for markers that are hidden/unidden by editing or
|
|
155
|
+
// undoing
|
|
156
|
+
let hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers
|
|
157
|
+
if (hidden) for (let i = 0; i < hidden.length; ++i)
|
|
158
|
+
if (!hidden[i].lines.length) signal(hidden[i], "hide")
|
|
159
|
+
if (unhidden) for (let i = 0; i < unhidden.length; ++i)
|
|
160
|
+
if (unhidden[i].lines.length) signal(unhidden[i], "unhide")
|
|
161
|
+
|
|
162
|
+
if (display.wrapper.offsetHeight)
|
|
163
|
+
doc.scrollTop = cm.display.scroller.scrollTop
|
|
164
|
+
|
|
165
|
+
// Fire change events, and delayed event handlers
|
|
166
|
+
if (op.changeObjs)
|
|
167
|
+
signal(cm, "changes", cm, op.changeObjs)
|
|
168
|
+
if (op.update)
|
|
169
|
+
op.update.finish()
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Run the given function in an operation
|
|
173
|
+
export function runInOp(cm, f) {
|
|
174
|
+
if (cm.curOp) return f()
|
|
175
|
+
startOperation(cm)
|
|
176
|
+
try { return f() }
|
|
177
|
+
finally { endOperation(cm) }
|
|
178
|
+
}
|
|
179
|
+
// Wraps a function in an operation. Returns the wrapped function.
|
|
180
|
+
export function operation(cm, f) {
|
|
181
|
+
return function() {
|
|
182
|
+
if (cm.curOp) return f.apply(cm, arguments)
|
|
183
|
+
startOperation(cm)
|
|
184
|
+
try { return f.apply(cm, arguments) }
|
|
185
|
+
finally { endOperation(cm) }
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Used to add methods to editor and doc instances, wrapping them in
|
|
189
|
+
// operations.
|
|
190
|
+
export function methodOp(f) {
|
|
191
|
+
return function() {
|
|
192
|
+
if (this.curOp) return f.apply(this, arguments)
|
|
193
|
+
startOperation(this)
|
|
194
|
+
try { return f.apply(this, arguments) }
|
|
195
|
+
finally { endOperation(this) }
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
export function docMethodOp(f) {
|
|
199
|
+
return function() {
|
|
200
|
+
let cm = this.cm
|
|
201
|
+
if (!cm || cm.curOp) return f.apply(this, arguments)
|
|
202
|
+
startOperation(cm)
|
|
203
|
+
try { return f.apply(this, arguments) }
|
|
204
|
+
finally { endOperation(cm) }
|
|
205
|
+
}
|
|
206
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { chrome, chrome_version, gecko, ie, mac, presto, safari, webkit } from "../util/browser.js"
|
|
2
|
+
import { e_preventDefault } from "../util/event.js"
|
|
3
|
+
|
|
4
|
+
import { updateDisplaySimple } from "./update_display.js"
|
|
5
|
+
import { setScrollLeft, updateScrollTop } from "./scrolling.js"
|
|
6
|
+
|
|
7
|
+
// Since the delta values reported on mouse wheel events are
|
|
8
|
+
// unstandardized between browsers and even browser versions, and
|
|
9
|
+
// generally horribly unpredictable, this code starts by measuring
|
|
10
|
+
// the scroll effect that the first few mouse wheel events have,
|
|
11
|
+
// and, from that, detects the way it can convert deltas to pixel
|
|
12
|
+
// offsets afterwards.
|
|
13
|
+
//
|
|
14
|
+
// The reason we want to know the amount a wheel event will scroll
|
|
15
|
+
// is that it gives us a chance to update the display before the
|
|
16
|
+
// actual scrolling happens, reducing flickering.
|
|
17
|
+
|
|
18
|
+
let wheelSamples = 0, wheelPixelsPerUnit = null
|
|
19
|
+
// Fill in a browser-detected starting value on browsers where we
|
|
20
|
+
// know one. These don't have to be accurate -- the result of them
|
|
21
|
+
// being wrong would just be a slight flicker on the first wheel
|
|
22
|
+
// scroll (if it is large enough).
|
|
23
|
+
if (ie) wheelPixelsPerUnit = -.53
|
|
24
|
+
else if (gecko) wheelPixelsPerUnit = 15
|
|
25
|
+
else if (chrome) wheelPixelsPerUnit = -.7
|
|
26
|
+
else if (safari) wheelPixelsPerUnit = -1/3
|
|
27
|
+
|
|
28
|
+
function wheelEventDelta(e) {
|
|
29
|
+
let dx = e.wheelDeltaX, dy = e.wheelDeltaY
|
|
30
|
+
if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail
|
|
31
|
+
if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail
|
|
32
|
+
else if (dy == null) dy = e.wheelDelta
|
|
33
|
+
return {x: dx, y: dy}
|
|
34
|
+
}
|
|
35
|
+
export function wheelEventPixels(e) {
|
|
36
|
+
let delta = wheelEventDelta(e)
|
|
37
|
+
delta.x *= wheelPixelsPerUnit
|
|
38
|
+
delta.y *= wheelPixelsPerUnit
|
|
39
|
+
return delta
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function onScrollWheel(cm, e) {
|
|
43
|
+
// On Chrome 102, viewport updates somehow stop wheel-based
|
|
44
|
+
// scrolling. Turning off pointer events during the scroll seems
|
|
45
|
+
// to avoid the issue.
|
|
46
|
+
if (chrome && chrome_version == 102) {
|
|
47
|
+
if (cm.display.chromeScrollHack == null) cm.display.sizer.style.pointerEvents = "none"
|
|
48
|
+
else clearTimeout(cm.display.chromeScrollHack)
|
|
49
|
+
cm.display.chromeScrollHack = setTimeout(() => {
|
|
50
|
+
cm.display.chromeScrollHack = null
|
|
51
|
+
cm.display.sizer.style.pointerEvents = ""
|
|
52
|
+
}, 100)
|
|
53
|
+
}
|
|
54
|
+
let delta = wheelEventDelta(e), dx = delta.x, dy = delta.y
|
|
55
|
+
let pixelsPerUnit = wheelPixelsPerUnit
|
|
56
|
+
if (e.deltaMode === 0) {
|
|
57
|
+
dx = e.deltaX
|
|
58
|
+
dy = e.deltaY
|
|
59
|
+
pixelsPerUnit = 1
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
let display = cm.display, scroll = display.scroller
|
|
63
|
+
// Quit if there's nothing to scroll here
|
|
64
|
+
let canScrollX = scroll.scrollWidth > scroll.clientWidth
|
|
65
|
+
let canScrollY = scroll.scrollHeight > scroll.clientHeight
|
|
66
|
+
if (!(dx && canScrollX || dy && canScrollY)) return
|
|
67
|
+
|
|
68
|
+
// Webkit browsers on OS X abort momentum scrolls when the target
|
|
69
|
+
// of the scroll event is removed from the scrollable element.
|
|
70
|
+
// This hack (see related code in patchDisplay) makes sure the
|
|
71
|
+
// element is kept around.
|
|
72
|
+
if (dy && mac && webkit) {
|
|
73
|
+
outer: for (let cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {
|
|
74
|
+
for (let i = 0; i < view.length; i++) {
|
|
75
|
+
if (view[i].node == cur) {
|
|
76
|
+
cm.display.currentWheelTarget = cur
|
|
77
|
+
break outer
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// On some browsers, horizontal scrolling will cause redraws to
|
|
84
|
+
// happen before the gutter has been realigned, causing it to
|
|
85
|
+
// wriggle around in a most unseemly way. When we have an
|
|
86
|
+
// estimated pixels/delta value, we just handle horizontal
|
|
87
|
+
// scrolling entirely here. It'll be slightly off from native, but
|
|
88
|
+
// better than glitching out.
|
|
89
|
+
if (dx && !gecko && !presto && pixelsPerUnit != null) {
|
|
90
|
+
if (dy && canScrollY)
|
|
91
|
+
updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * pixelsPerUnit))
|
|
92
|
+
setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * pixelsPerUnit))
|
|
93
|
+
// Only prevent default scrolling if vertical scrolling is
|
|
94
|
+
// actually possible. Otherwise, it causes vertical scroll
|
|
95
|
+
// jitter on OSX trackpads when deltaX is small and deltaY
|
|
96
|
+
// is large (issue #3579)
|
|
97
|
+
if (!dy || (dy && canScrollY))
|
|
98
|
+
e_preventDefault(e)
|
|
99
|
+
display.wheelStartX = null // Abort measurement, if in progress
|
|
100
|
+
return
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// 'Project' the visible viewport to cover the area that is being
|
|
104
|
+
// scrolled into view (if we know enough to estimate it).
|
|
105
|
+
if (dy && pixelsPerUnit != null) {
|
|
106
|
+
let pixels = dy * pixelsPerUnit
|
|
107
|
+
let top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight
|
|
108
|
+
if (pixels < 0) top = Math.max(0, top + pixels - 50)
|
|
109
|
+
else bot = Math.min(cm.doc.height, bot + pixels + 50)
|
|
110
|
+
updateDisplaySimple(cm, {top: top, bottom: bot})
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (wheelSamples < 20 && e.deltaMode !== 0) {
|
|
114
|
+
if (display.wheelStartX == null) {
|
|
115
|
+
display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop
|
|
116
|
+
display.wheelDX = dx; display.wheelDY = dy
|
|
117
|
+
setTimeout(() => {
|
|
118
|
+
if (display.wheelStartX == null) return
|
|
119
|
+
let movedX = scroll.scrollLeft - display.wheelStartX
|
|
120
|
+
let movedY = scroll.scrollTop - display.wheelStartY
|
|
121
|
+
let sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||
|
|
122
|
+
(movedX && display.wheelDX && movedX / display.wheelDX)
|
|
123
|
+
display.wheelStartX = display.wheelStartY = null
|
|
124
|
+
if (!sample) return
|
|
125
|
+
wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1)
|
|
126
|
+
++wheelSamples
|
|
127
|
+
}, 200)
|
|
128
|
+
} else {
|
|
129
|
+
display.wheelDX += dx; display.wheelDY += dy
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|