administrate-field-simple_mde_markdown 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.
- checksums.yaml +7 -0
- data/.circleci/config.yml +72 -0
- data/.circleci/setup-rubygems.sh +3 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +196 -0
- data/LICENSE.txt +21 -0
- data/README.md +44 -0
- data/Rakefile +8 -0
- data/administrate-field-simple_mde_markdown.gemspec +31 -0
- data/app/assets/javascripts/administrate-field-simple_mde_markdown/application.js +6 -0
- data/app/assets/stylesheets/administrate-field-simple_mde_markdown/application.css +3 -0
- data/app/views/fields/simple_mde_markdown/_form.html.erb +6 -0
- data/app/views/fields/simple_mde_markdown/_index.html.erb +1 -0
- data/app/views/fields/simple_mde_markdown/_show.html.erb +1 -0
- data/lib/administrate/field/simple_mde_markdown.rb +31 -0
- data/node_modules/.bin/marked +1 -0
- data/node_modules/codemirror-spell-checker/.eslintrc +23 -0
- data/node_modules/codemirror-spell-checker/.npmignore +2 -0
- data/node_modules/codemirror-spell-checker/.travis.yml +18 -0
- data/node_modules/codemirror-spell-checker/CONTRIBUTING 2.md +10 -0
- data/node_modules/codemirror-spell-checker/CONTRIBUTING.md +10 -0
- data/node_modules/codemirror-spell-checker/LICENSE +22 -0
- data/node_modules/codemirror-spell-checker/README.md +50 -0
- data/node_modules/codemirror-spell-checker/bower.json +27 -0
- data/node_modules/codemirror-spell-checker/debug/.spell-checker 2.css.icloud +0 -0
- data/node_modules/codemirror-spell-checker/debug/spell-checker.css +9 -0
- data/node_modules/codemirror-spell-checker/debug/spell-checker.debug.js +2844 -0
- data/node_modules/codemirror-spell-checker/debug/spell-checker.js +2841 -0
- data/node_modules/codemirror-spell-checker/dist/.spell-checker.min 2.css.icloud +0 -0
- data/node_modules/codemirror-spell-checker/dist/en_US.aff +201 -0
- data/node_modules/codemirror-spell-checker/dist/en_US.dic +62120 -0
- data/node_modules/codemirror-spell-checker/dist/spell-checker.min 2.js +7 -0
- data/node_modules/codemirror-spell-checker/dist/spell-checker.min.css +7 -0
- data/node_modules/codemirror-spell-checker/dist/spell-checker.min.js +7 -0
- data/node_modules/codemirror-spell-checker/gulpfile.js +94 -0
- data/node_modules/codemirror-spell-checker/package.json +75 -0
- data/node_modules/codemirror-spell-checker/src/css/spell-checker.css +3 -0
- data/node_modules/codemirror-spell-checker/src/data/en_US.aff +201 -0
- data/node_modules/codemirror-spell-checker/src/data/en_US.dic +62120 -0
- data/node_modules/codemirror-spell-checker/src/js/spell-checker.js +119 -0
- data/node_modules/codemirror/.package 2.json.icloud +0 -0
- data/node_modules/codemirror/AUTHORS +773 -0
- data/node_modules/codemirror/CHANGELOG.md +1486 -0
- data/node_modules/codemirror/CONTRIBUTING.md +92 -0
- data/node_modules/codemirror/LICENSE +21 -0
- data/node_modules/codemirror/README.md +49 -0
- data/node_modules/codemirror/addon/comment/comment.js +209 -0
- data/node_modules/codemirror/addon/comment/continuecomment.js +78 -0
- data/node_modules/codemirror/addon/dialog/dialog.css +32 -0
- data/node_modules/codemirror/addon/dialog/dialog.js +161 -0
- data/node_modules/codemirror/addon/display/autorefresh.js +47 -0
- data/node_modules/codemirror/addon/display/fullscreen.css +6 -0
- data/node_modules/codemirror/addon/display/fullscreen.js +41 -0
- data/node_modules/codemirror/addon/display/panel.js +127 -0
- data/node_modules/codemirror/addon/display/placeholder.js +63 -0
- data/node_modules/codemirror/addon/display/rulers.js +51 -0
- data/node_modules/codemirror/addon/edit/closebrackets.js +187 -0
- data/node_modules/codemirror/addon/edit/closetag.js +175 -0
- data/node_modules/codemirror/addon/edit/continuelist.js +89 -0
- data/node_modules/codemirror/addon/edit/matchbrackets.js +145 -0
- data/node_modules/codemirror/addon/edit/matchtags.js +66 -0
- data/node_modules/codemirror/addon/edit/trailingspace.js +27 -0
- data/node_modules/codemirror/addon/fold/brace-fold.js +105 -0
- data/node_modules/codemirror/addon/fold/comment-fold.js +59 -0
- data/node_modules/codemirror/addon/fold/foldcode.js +152 -0
- data/node_modules/codemirror/addon/fold/foldgutter.css +20 -0
- data/node_modules/codemirror/addon/fold/foldgutter.js +146 -0
- data/node_modules/codemirror/addon/fold/indent-fold.js +48 -0
- data/node_modules/codemirror/addon/fold/markdown-fold.js +49 -0
- data/node_modules/codemirror/addon/fold/xml-fold.js +184 -0
- data/node_modules/codemirror/addon/hint/anyword-hint.js +41 -0
- data/node_modules/codemirror/addon/hint/css-hint.js +60 -0
- data/node_modules/codemirror/addon/hint/html-hint.js +348 -0
- data/node_modules/codemirror/addon/hint/javascript-hint.js +157 -0
- data/node_modules/codemirror/addon/hint/show-hint.css +36 -0
- data/node_modules/codemirror/addon/hint/show-hint.js +434 -0
- data/node_modules/codemirror/addon/hint/sql-hint.js +299 -0
- data/node_modules/codemirror/addon/hint/xml-hint.js +110 -0
- data/node_modules/codemirror/addon/lint/coffeescript-lint.js +47 -0
- data/node_modules/codemirror/addon/lint/css-lint.js +40 -0
- data/node_modules/codemirror/addon/lint/html-lint.js +53 -0
- data/node_modules/codemirror/addon/lint/javascript-lint.js +63 -0
- data/node_modules/codemirror/addon/lint/json-lint.js +40 -0
- data/node_modules/codemirror/addon/lint/lint.css +73 -0
- data/node_modules/codemirror/addon/lint/lint.js +252 -0
- data/node_modules/codemirror/addon/lint/yaml-lint.js +41 -0
- data/node_modules/codemirror/addon/merge/merge.css +119 -0
- data/node_modules/codemirror/addon/merge/merge.js +1002 -0
- data/node_modules/codemirror/addon/mode/loadmode.js +64 -0
- data/node_modules/codemirror/addon/mode/multiplex.js +131 -0
- data/node_modules/codemirror/addon/mode/multiplex_test.js +33 -0
- data/node_modules/codemirror/addon/mode/overlay.js +90 -0
- data/node_modules/codemirror/addon/mode/simple.js +216 -0
- data/node_modules/codemirror/addon/runmode/colorize.js +40 -0
- data/node_modules/codemirror/addon/runmode/runmode-standalone.js +158 -0
- data/node_modules/codemirror/addon/runmode/runmode.js +72 -0
- data/node_modules/codemirror/addon/runmode/runmode.node.js +197 -0
- data/node_modules/codemirror/addon/scroll/annotatescrollbar.js +122 -0
- data/node_modules/codemirror/addon/scroll/scrollpastend.js +48 -0
- data/node_modules/codemirror/addon/scroll/simplescrollbars.css +66 -0
- data/node_modules/codemirror/addon/scroll/simplescrollbars.js +152 -0
- data/node_modules/codemirror/addon/search/jump-to-line.js +50 -0
- data/node_modules/codemirror/addon/search/match-highlighter.js +165 -0
- data/node_modules/codemirror/addon/search/matchesonscrollbar.css +8 -0
- data/node_modules/codemirror/addon/search/matchesonscrollbar.js +97 -0
- data/node_modules/codemirror/addon/search/search.js +258 -0
- data/node_modules/codemirror/addon/search/searchcursor.js +293 -0
- data/node_modules/codemirror/addon/selection/active-line.js +72 -0
- data/node_modules/codemirror/addon/selection/mark-selection.js +119 -0
- data/node_modules/codemirror/addon/selection/selection-pointer.js +98 -0
- data/node_modules/codemirror/addon/tern/tern.css +87 -0
- data/node_modules/codemirror/addon/tern/tern.js +718 -0
- data/node_modules/codemirror/addon/tern/worker.js +44 -0
- data/node_modules/codemirror/addon/wrap/hardwrap.js +145 -0
- data/node_modules/codemirror/bin/source-highlight +48 -0
- data/node_modules/codemirror/keymap/emacs.js +417 -0
- data/node_modules/codemirror/keymap/sublime.js +691 -0
- data/node_modules/codemirror/keymap/vim.js +5467 -0
- data/node_modules/codemirror/lib/codemirror.css +346 -0
- data/node_modules/codemirror/lib/codemirror.js +9698 -0
- data/node_modules/codemirror/mode/apl/apl.js +174 -0
- data/node_modules/codemirror/mode/asciiarmor/asciiarmor.js +74 -0
- data/node_modules/codemirror/mode/asn.1/asn.1.js +204 -0
- data/node_modules/codemirror/mode/asterisk/asterisk.js +196 -0
- data/node_modules/codemirror/mode/brainfuck/brainfuck.js +85 -0
- data/node_modules/codemirror/mode/clike/clike.js +879 -0
- data/node_modules/codemirror/mode/clojure/clojure.js +292 -0
- data/node_modules/codemirror/mode/cmake/cmake.js +97 -0
- data/node_modules/codemirror/mode/cobol/cobol.js +255 -0
- data/node_modules/codemirror/mode/coffeescript/coffeescript.js +359 -0
- data/node_modules/codemirror/mode/commonlisp/commonlisp.js +124 -0
- data/node_modules/codemirror/mode/crystal/crystal.js +433 -0
- data/node_modules/codemirror/mode/css/css.js +832 -0
- data/node_modules/codemirror/mode/cypher/cypher.js +150 -0
- data/node_modules/codemirror/mode/d/d.js +223 -0
- data/node_modules/codemirror/mode/dart/dart.js +157 -0
- data/node_modules/codemirror/mode/diff/diff.js +47 -0
- data/node_modules/codemirror/mode/django/django.js +356 -0
- data/node_modules/codemirror/mode/dockerfile/dockerfile.js +211 -0
- data/node_modules/codemirror/mode/dtd/dtd.js +142 -0
- data/node_modules/codemirror/mode/dylan/dylan.js +352 -0
- data/node_modules/codemirror/mode/ebnf/ebnf.js +195 -0
- data/node_modules/codemirror/mode/ecl/ecl.js +206 -0
- data/node_modules/codemirror/mode/eiffel/eiffel.js +160 -0
- data/node_modules/codemirror/mode/elm/elm.js +205 -0
- data/node_modules/codemirror/mode/erlang/erlang.js +619 -0
- data/node_modules/codemirror/mode/factor/factor.js +85 -0
- data/node_modules/codemirror/mode/fcl/fcl.js +173 -0
- data/node_modules/codemirror/mode/forth/forth.js +180 -0
- data/node_modules/codemirror/mode/fortran/fortran.js +188 -0
- data/node_modules/codemirror/mode/gas/gas.js +345 -0
- data/node_modules/codemirror/mode/gfm/gfm.js +129 -0
- data/node_modules/codemirror/mode/gherkin/gherkin.js +178 -0
- data/node_modules/codemirror/mode/go/go.js +187 -0
- data/node_modules/codemirror/mode/groovy/groovy.js +230 -0
- data/node_modules/codemirror/mode/haml/haml.js +161 -0
- data/node_modules/codemirror/mode/handlebars/handlebars.js +66 -0
- data/node_modules/codemirror/mode/haskell-literate/haskell-literate.js +43 -0
- data/node_modules/codemirror/mode/haskell/haskell.js +268 -0
- data/node_modules/codemirror/mode/haxe/haxe.js +515 -0
- data/node_modules/codemirror/mode/htmlembedded/htmlembedded.js +37 -0
- data/node_modules/codemirror/mode/htmlmixed/htmlmixed.js +152 -0
- data/node_modules/codemirror/mode/http/http.js +113 -0
- data/node_modules/codemirror/mode/idl/idl.js +290 -0
- data/node_modules/codemirror/mode/javascript/javascript.js +899 -0
- data/node_modules/codemirror/mode/jinja2/jinja2.js +144 -0
- data/node_modules/codemirror/mode/jsx/jsx.js +148 -0
- data/node_modules/codemirror/mode/julia/julia.js +433 -0
- data/node_modules/codemirror/mode/livescript/livescript.js +280 -0
- data/node_modules/codemirror/mode/lua/lua.js +159 -0
- data/node_modules/codemirror/mode/markdown/markdown.js +884 -0
- data/node_modules/codemirror/mode/mathematica/mathematica.js +176 -0
- data/node_modules/codemirror/mode/mbox/mbox.js +129 -0
- data/node_modules/codemirror/mode/meta.js +217 -0
- data/node_modules/codemirror/mode/mirc/mirc.js +193 -0
- data/node_modules/codemirror/mode/mllike/mllike.js +359 -0
- data/node_modules/codemirror/mode/modelica/modelica.js +245 -0
- data/node_modules/codemirror/mode/mscgen/mscgen.js +175 -0
- data/node_modules/codemirror/mode/mumps/mumps.js +148 -0
- data/node_modules/codemirror/mode/nginx/nginx.js +178 -0
- data/node_modules/codemirror/mode/nsis/nsis.js +95 -0
- data/node_modules/codemirror/mode/ntriples/ntriples.js +195 -0
- data/node_modules/codemirror/mode/octave/octave.js +139 -0
- data/node_modules/codemirror/mode/oz/oz.js +252 -0
- data/node_modules/codemirror/mode/pascal/pascal.js +121 -0
- data/node_modules/codemirror/mode/pegjs/pegjs.js +114 -0
- data/node_modules/codemirror/mode/perl/perl.js +837 -0
- data/node_modules/codemirror/mode/php/php.js +234 -0
- data/node_modules/codemirror/mode/pig/pig.js +178 -0
- data/node_modules/codemirror/mode/powershell/powershell.js +398 -0
- data/node_modules/codemirror/mode/properties/properties 2.js +78 -0
- data/node_modules/codemirror/mode/properties/properties.js +78 -0
- data/node_modules/codemirror/mode/protobuf/protobuf.js +69 -0
- data/node_modules/codemirror/mode/pug/pug.js +591 -0
- data/node_modules/codemirror/mode/puppet/puppet.js +220 -0
- data/node_modules/codemirror/mode/python/python.js +409 -0
- data/node_modules/codemirror/mode/q/q.js +139 -0
- data/node_modules/codemirror/mode/r/r.js +190 -0
- data/node_modules/codemirror/mode/rpm/changes/index.html +66 -0
- data/node_modules/codemirror/mode/rpm/rpm.js +109 -0
- data/node_modules/codemirror/mode/rst/rst.js +557 -0
- data/node_modules/codemirror/mode/ruby/ruby.js +296 -0
- data/node_modules/codemirror/mode/rust/rust.js +72 -0
- data/node_modules/codemirror/mode/sas/sas.js +303 -0
- data/node_modules/codemirror/mode/sass/sass.js +454 -0
- data/node_modules/codemirror/mode/scheme/scheme.js +265 -0
- data/node_modules/codemirror/mode/shell/shell.js +152 -0
- data/node_modules/codemirror/mode/sieve/sieve.js +193 -0
- data/node_modules/codemirror/mode/slim/slim.js +575 -0
- data/node_modules/codemirror/mode/smalltalk/smalltalk.js +168 -0
- data/node_modules/codemirror/mode/smarty/smarty.js +225 -0
- data/node_modules/codemirror/mode/solr/solr.js +104 -0
- data/node_modules/codemirror/mode/soy/soy 2.js +359 -0
- data/node_modules/codemirror/mode/soy/soy.js +235 -0
- data/node_modules/codemirror/mode/sparql/sparql.js +180 -0
- data/node_modules/codemirror/mode/spreadsheet/spreadsheet.js +112 -0
- data/node_modules/codemirror/mode/sql/sql.js +499 -0
- data/node_modules/codemirror/mode/stex/stex.js +264 -0
- data/node_modules/codemirror/mode/stylus/stylus.js +771 -0
- data/node_modules/codemirror/mode/swift/swift.js +219 -0
- data/node_modules/codemirror/mode/tcl/tcl.js +139 -0
- data/node_modules/codemirror/mode/textile/textile.js +469 -0
- data/node_modules/codemirror/mode/tiddlywiki/tiddlywiki.css +14 -0
- data/node_modules/codemirror/mode/tiddlywiki/tiddlywiki.js +308 -0
- data/node_modules/codemirror/mode/tiki/tiki.css +26 -0
- data/node_modules/codemirror/mode/tiki/tiki.js +312 -0
- data/node_modules/codemirror/mode/toml/toml.js +88 -0
- data/node_modules/codemirror/mode/tornado/tornado.js +68 -0
- data/node_modules/codemirror/mode/troff/troff.js +84 -0
- data/node_modules/codemirror/mode/ttcn-cfg/ttcn-cfg.js +214 -0
- data/node_modules/codemirror/mode/ttcn/ttcn.js +283 -0
- data/node_modules/codemirror/mode/turtle/turtle.js +162 -0
- data/node_modules/codemirror/mode/twig/twig.js +141 -0
- data/node_modules/codemirror/mode/vb/vb.js +275 -0
- data/node_modules/codemirror/mode/vbscript/vbscript.js +350 -0
- data/node_modules/codemirror/mode/velocity/velocity.js +201 -0
- data/node_modules/codemirror/mode/verilog/verilog.js +675 -0
- data/node_modules/codemirror/mode/vhdl/vhdl.js +189 -0
- data/node_modules/codemirror/mode/vue/vue.js +77 -0
- data/node_modules/codemirror/mode/webidl/webidl.js +195 -0
- data/node_modules/codemirror/mode/xml/xml.js +402 -0
- data/node_modules/codemirror/mode/xquery/xquery.js +448 -0
- data/node_modules/codemirror/mode/yacas/yacas.js +204 -0
- data/node_modules/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js +68 -0
- data/node_modules/codemirror/mode/yaml/yaml.js +120 -0
- data/node_modules/codemirror/mode/z80/z80.js +116 -0
- data/node_modules/codemirror/package.json +2395 -0
- data/node_modules/codemirror/rollup.config.js +20 -0
- data/node_modules/codemirror/src/codemirror.js +3 -0
- data/node_modules/codemirror/src/display/Display.js +106 -0
- data/node_modules/codemirror/src/display/focus.js +47 -0
- data/node_modules/codemirror/src/display/gutters.js +34 -0
- data/node_modules/codemirror/src/display/highlight_worker.js +55 -0
- data/node_modules/codemirror/src/display/line_numbers.js +48 -0
- data/node_modules/codemirror/src/display/mode_state.js +22 -0
- data/node_modules/codemirror/src/display/operations.js +205 -0
- data/node_modules/codemirror/src/display/scroll_events.js +115 -0
- data/node_modules/codemirror/src/display/scrollbars.js +193 -0
- data/node_modules/codemirror/src/display/scrolling.js +184 -0
- data/node_modules/codemirror/src/display/selection.js +158 -0
- data/node_modules/codemirror/src/display/update_display.js +260 -0
- data/node_modules/codemirror/src/display/update_line.js +188 -0
- data/node_modules/codemirror/src/display/update_lines.js +64 -0
- data/node_modules/codemirror/src/display/view_tracking.js +153 -0
- data/node_modules/codemirror/src/edit/CodeMirror.js +215 -0
- data/node_modules/codemirror/src/edit/commands.js +178 -0
- data/node_modules/codemirror/src/edit/deleteNearSelection.js +30 -0
- data/node_modules/codemirror/src/edit/drop_events.js +119 -0
- data/node_modules/codemirror/src/edit/fromTextArea.js +61 -0
- data/node_modules/codemirror/src/edit/global_events.js +42 -0
- data/node_modules/codemirror/src/edit/key_events.js +159 -0
- data/node_modules/codemirror/src/edit/legacy.js +62 -0
- data/node_modules/codemirror/src/edit/main.js +69 -0
- data/node_modules/codemirror/src/edit/methods.js +544 -0
- data/node_modules/codemirror/src/edit/mouse_events.js +407 -0
- data/node_modules/codemirror/src/edit/options.js +193 -0
- data/node_modules/codemirror/src/edit/utils.js +7 -0
- data/node_modules/codemirror/src/input/ContentEditableInput.js +527 -0
- data/node_modules/codemirror/src/input/TextareaInput.js +355 -0
- data/node_modules/codemirror/src/input/indent.js +71 -0
- data/node_modules/codemirror/src/input/input.js +135 -0
- data/node_modules/codemirror/src/input/keymap.js +148 -0
- data/node_modules/codemirror/src/input/keynames.js +17 -0
- data/node_modules/codemirror/src/input/movement.js +110 -0
- data/node_modules/codemirror/src/line/highlight.js +284 -0
- data/node_modules/codemirror/src/line/line_data.js +339 -0
- data/node_modules/codemirror/src/line/pos.js +40 -0
- data/node_modules/codemirror/src/line/saw_special_spans.js +10 -0
- data/node_modules/codemirror/src/line/spans.js +382 -0
- data/node_modules/codemirror/src/line/utils_line.js +85 -0
- data/node_modules/codemirror/src/measurement/position_measurement.js +699 -0
- data/node_modules/codemirror/src/measurement/widgets.js +26 -0
- data/node_modules/codemirror/src/model/Doc.js +432 -0
- data/node_modules/codemirror/src/model/change_measurement.js +61 -0
- data/node_modules/codemirror/src/model/changes.js +333 -0
- data/node_modules/codemirror/src/model/chunk.js +167 -0
- data/node_modules/codemirror/src/model/document_data.js +111 -0
- data/node_modules/codemirror/src/model/history.js +228 -0
- data/node_modules/codemirror/src/model/line_widget.js +78 -0
- data/node_modules/codemirror/src/model/mark_text.js +292 -0
- data/node_modules/codemirror/src/model/selection.js +84 -0
- data/node_modules/codemirror/src/model/selection_updates.js +208 -0
- data/node_modules/codemirror/src/modes.js +96 -0
- data/node_modules/codemirror/src/util/StringStream.js +90 -0
- data/node_modules/codemirror/src/util/bidi.js +214 -0
- data/node_modules/codemirror/src/util/browser.js +33 -0
- data/node_modules/codemirror/src/util/dom.js +97 -0
- data/node_modules/codemirror/src/util/event.js +103 -0
- data/node_modules/codemirror/src/util/feature_detection.js +84 -0
- data/node_modules/codemirror/src/util/misc.js +150 -0
- data/node_modules/codemirror/src/util/operation_group.js +72 -0
- data/node_modules/codemirror/theme/3024-day.css +41 -0
- data/node_modules/codemirror/theme/3024-night.css +39 -0
- data/node_modules/codemirror/theme/abcdef.css +32 -0
- data/node_modules/codemirror/theme/ambiance-mobile.css +5 -0
- data/node_modules/codemirror/theme/ambiance.css +74 -0
- data/node_modules/codemirror/theme/base16-dark.css +38 -0
- data/node_modules/codemirror/theme/base16-light.css +38 -0
- data/node_modules/codemirror/theme/bespin.css +34 -0
- data/node_modules/codemirror/theme/blackboard.css +32 -0
- data/node_modules/codemirror/theme/cobalt.css +25 -0
- data/node_modules/codemirror/theme/colorforth.css +33 -0
- data/node_modules/codemirror/theme/darcula.css +46 -0
- data/node_modules/codemirror/theme/dracula.css +40 -0
- data/node_modules/codemirror/theme/duotone-dark.css +35 -0
- data/node_modules/codemirror/theme/duotone-light.css +36 -0
- data/node_modules/codemirror/theme/eclipse.css +23 -0
- data/node_modules/codemirror/theme/elegant.css +13 -0
- data/node_modules/codemirror/theme/erlang-dark.css +34 -0
- data/node_modules/codemirror/theme/gruvbox-dark.css +37 -0
- data/node_modules/codemirror/theme/hopscotch.css +34 -0
- data/node_modules/codemirror/theme/icecoder.css +43 -0
- data/node_modules/codemirror/theme/idea.css +42 -0
- data/node_modules/codemirror/theme/isotope.css +34 -0
- data/node_modules/codemirror/theme/lesser-dark.css +47 -0
- data/node_modules/codemirror/theme/liquibyte.css +95 -0
- data/node_modules/codemirror/theme/lucario.css +37 -0
- data/node_modules/codemirror/theme/material.css +53 -0
- data/node_modules/codemirror/theme/mbo.css +37 -0
- data/node_modules/codemirror/theme/mdn-like.css +46 -0
- data/node_modules/codemirror/theme/midnight.css +43 -0
- data/node_modules/codemirror/theme/monokai.css +41 -0
- data/node_modules/codemirror/theme/neat.css +12 -0
- data/node_modules/codemirror/theme/neo.css +43 -0
- data/node_modules/codemirror/theme/night.css +27 -0
- data/node_modules/codemirror/theme/oceanic-next.css +44 -0
- data/node_modules/codemirror/theme/panda-syntax.css +85 -0
- data/node_modules/codemirror/theme/paraiso-dark.css +38 -0
- data/node_modules/codemirror/theme/paraiso-light.css +38 -0
- data/node_modules/codemirror/theme/pastel-on-dark.css +52 -0
- data/node_modules/codemirror/theme/railscasts.css +34 -0
- data/node_modules/codemirror/theme/rubyblue.css +25 -0
- data/node_modules/codemirror/theme/seti.css +44 -0
- data/node_modules/codemirror/theme/shadowfox.css +52 -0
- data/node_modules/codemirror/theme/solarized.css +168 -0
- data/node_modules/codemirror/theme/ssms.css +16 -0
- data/node_modules/codemirror/theme/the-matrix.css +30 -0
- data/node_modules/codemirror/theme/tomorrow-night-bright.css +35 -0
- data/node_modules/codemirror/theme/tomorrow-night-eighties.css +38 -0
- data/node_modules/codemirror/theme/ttcn.css +64 -0
- data/node_modules/codemirror/theme/twilight.css +32 -0
- data/node_modules/codemirror/theme/vibrant-ink.css +34 -0
- data/node_modules/codemirror/theme/xq-dark.css +53 -0
- data/node_modules/codemirror/theme/xq-light.css +43 -0
- data/node_modules/codemirror/theme/yeti.css +44 -0
- data/node_modules/codemirror/theme/zenburn.css +37 -0
- data/node_modules/marked/.editorconfig +16 -0
- data/node_modules/marked/.eslintignore +1 -0
- data/node_modules/marked/.eslintrc.json +28 -0
- data/node_modules/marked/.package 2.json.icloud +0 -0
- data/node_modules/marked/.travis.yml +47 -0
- data/node_modules/marked/Makefile +15 -0
- data/node_modules/marked/Makefile 2 +15 -0
- data/node_modules/marked/README 2.md +75 -0
- data/node_modules/marked/README.md +75 -0
- data/node_modules/marked/bin/marked +199 -0
- data/node_modules/marked/bower.json +23 -0
- data/node_modules/marked/component.json +10 -0
- data/node_modules/marked/index.js +1 -0
- data/node_modules/marked/jasmine.json +11 -0
- data/node_modules/marked/lib/marked 2.js +1604 -0
- data/node_modules/marked/lib/marked.js +1604 -0
- data/node_modules/marked/man/marked.1 +91 -0
- data/node_modules/marked/man/marked.1.txt +96 -0
- data/node_modules/marked/marked.min.js +6 -0
- data/node_modules/marked/package.json +95 -0
- data/node_modules/simplemde/.eslintrc +23 -0
- data/node_modules/simplemde/.npmignore +9 -0
- data/node_modules/simplemde/.travis.yml +18 -0
- data/node_modules/simplemde/CONTRIBUTING 2.md +10 -0
- data/node_modules/simplemde/CONTRIBUTING.md +10 -0
- data/node_modules/simplemde/LICENSE +22 -0
- data/node_modules/simplemde/README.md +331 -0
- data/node_modules/simplemde/bower.json +23 -0
- data/node_modules/simplemde/debug/.simplemde 2.css.icloud +0 -0
- data/node_modules/simplemde/debug/simplemde.css +676 -0
- data/node_modules/simplemde/debug/simplemde.debug.js +17023 -0
- data/node_modules/simplemde/debug/simplemde.js +17019 -0
- data/node_modules/simplemde/dist/simplemde.min.css +7 -0
- data/node_modules/simplemde/dist/simplemde.min.js +15 -0
- data/node_modules/simplemde/gulpfile.js +96 -0
- data/node_modules/simplemde/package.json +73 -0
- data/node_modules/simplemde/src/css/simplemde.css +328 -0
- data/node_modules/simplemde/src/js/codemirror/tablist 2.js +44 -0
- data/node_modules/simplemde/src/js/codemirror/tablist.js +44 -0
- data/node_modules/simplemde/src/js/simplemde.js +2028 -0
- data/node_modules/typo-js/README.md +45 -0
- data/node_modules/typo-js/dictionaries/en_US/.en_US 2.dic.icloud +0 -0
- data/node_modules/typo-js/dictionaries/en_US/README.md +7 -0
- data/node_modules/typo-js/dictionaries/en_US/en_US.aff +201 -0
- data/node_modules/typo-js/dictionaries/en_US/en_US.dic +62120 -0
- data/node_modules/typo-js/package.json +56 -0
- data/node_modules/typo-js/typo.js +931 -0
- data/package-lock.json +40 -0
- data/package.json +7 -0
- metadata +557 -0
@@ -0,0 +1,111 @@
|
|
1
|
+
import { loadMode } from "../display/mode_state.js"
|
2
|
+
import { runInOp } from "../display/operations.js"
|
3
|
+
import { regChange } from "../display/view_tracking.js"
|
4
|
+
import { Line, updateLine } from "../line/line_data.js"
|
5
|
+
import { findMaxLine } from "../line/spans.js"
|
6
|
+
import { getLine } from "../line/utils_line.js"
|
7
|
+
import { estimateLineHeights } from "../measurement/position_measurement.js"
|
8
|
+
import { addClass, rmClass } from "../util/dom.js"
|
9
|
+
import { lst } from "../util/misc.js"
|
10
|
+
import { signalLater } from "../util/operation_group.js"
|
11
|
+
|
12
|
+
// DOCUMENT DATA STRUCTURE
|
13
|
+
|
14
|
+
// By default, updates that start and end at the beginning of a line
|
15
|
+
// are treated specially, in order to make the association of line
|
16
|
+
// widgets and marker elements with the text behave more intuitive.
|
17
|
+
export function isWholeLineUpdate(doc, change) {
|
18
|
+
return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" &&
|
19
|
+
(!doc.cm || doc.cm.options.wholeLineUpdateBefore)
|
20
|
+
}
|
21
|
+
|
22
|
+
// Perform a change on the document data structure.
|
23
|
+
export function updateDoc(doc, change, markedSpans, estimateHeight) {
|
24
|
+
function spansFor(n) {return markedSpans ? markedSpans[n] : null}
|
25
|
+
function update(line, text, spans) {
|
26
|
+
updateLine(line, text, spans, estimateHeight)
|
27
|
+
signalLater(line, "change", line, change)
|
28
|
+
}
|
29
|
+
function linesFor(start, end) {
|
30
|
+
let result = []
|
31
|
+
for (let i = start; i < end; ++i)
|
32
|
+
result.push(new Line(text[i], spansFor(i), estimateHeight))
|
33
|
+
return result
|
34
|
+
}
|
35
|
+
|
36
|
+
let from = change.from, to = change.to, text = change.text
|
37
|
+
let firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line)
|
38
|
+
let lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line
|
39
|
+
|
40
|
+
// Adjust the line structure
|
41
|
+
if (change.full) {
|
42
|
+
doc.insert(0, linesFor(0, text.length))
|
43
|
+
doc.remove(text.length, doc.size - text.length)
|
44
|
+
} else if (isWholeLineUpdate(doc, change)) {
|
45
|
+
// This is a whole-line replace. Treated specially to make
|
46
|
+
// sure line objects move the way they are supposed to.
|
47
|
+
let added = linesFor(0, text.length - 1)
|
48
|
+
update(lastLine, lastLine.text, lastSpans)
|
49
|
+
if (nlines) doc.remove(from.line, nlines)
|
50
|
+
if (added.length) doc.insert(from.line, added)
|
51
|
+
} else if (firstLine == lastLine) {
|
52
|
+
if (text.length == 1) {
|
53
|
+
update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans)
|
54
|
+
} else {
|
55
|
+
let added = linesFor(1, text.length - 1)
|
56
|
+
added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight))
|
57
|
+
update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0))
|
58
|
+
doc.insert(from.line + 1, added)
|
59
|
+
}
|
60
|
+
} else if (text.length == 1) {
|
61
|
+
update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0))
|
62
|
+
doc.remove(from.line + 1, nlines)
|
63
|
+
} else {
|
64
|
+
update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0))
|
65
|
+
update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans)
|
66
|
+
let added = linesFor(1, text.length - 1)
|
67
|
+
if (nlines > 1) doc.remove(from.line + 1, nlines - 1)
|
68
|
+
doc.insert(from.line + 1, added)
|
69
|
+
}
|
70
|
+
|
71
|
+
signalLater(doc, "change", doc, change)
|
72
|
+
}
|
73
|
+
|
74
|
+
// Call f for all linked documents.
|
75
|
+
export function linkedDocs(doc, f, sharedHistOnly) {
|
76
|
+
function propagate(doc, skip, sharedHist) {
|
77
|
+
if (doc.linked) for (let i = 0; i < doc.linked.length; ++i) {
|
78
|
+
let rel = doc.linked[i]
|
79
|
+
if (rel.doc == skip) continue
|
80
|
+
let shared = sharedHist && rel.sharedHist
|
81
|
+
if (sharedHistOnly && !shared) continue
|
82
|
+
f(rel.doc, shared)
|
83
|
+
propagate(rel.doc, doc, shared)
|
84
|
+
}
|
85
|
+
}
|
86
|
+
propagate(doc, null, true)
|
87
|
+
}
|
88
|
+
|
89
|
+
// Attach a document to an editor.
|
90
|
+
export function attachDoc(cm, doc) {
|
91
|
+
if (doc.cm) throw new Error("This document is already in use.")
|
92
|
+
cm.doc = doc
|
93
|
+
doc.cm = cm
|
94
|
+
estimateLineHeights(cm)
|
95
|
+
loadMode(cm)
|
96
|
+
setDirectionClass(cm)
|
97
|
+
if (!cm.options.lineWrapping) findMaxLine(cm)
|
98
|
+
cm.options.mode = doc.modeOption
|
99
|
+
regChange(cm)
|
100
|
+
}
|
101
|
+
|
102
|
+
function setDirectionClass(cm) {
|
103
|
+
;(cm.doc.direction == "rtl" ? addClass : rmClass)(cm.display.lineDiv, "CodeMirror-rtl")
|
104
|
+
}
|
105
|
+
|
106
|
+
export function directionChanged(cm) {
|
107
|
+
runInOp(cm, () => {
|
108
|
+
setDirectionClass(cm)
|
109
|
+
regChange(cm)
|
110
|
+
})
|
111
|
+
}
|
@@ -0,0 +1,228 @@
|
|
1
|
+
import { cmp, copyPos } from "../line/pos.js"
|
2
|
+
import { stretchSpansOverChange } from "../line/spans.js"
|
3
|
+
import { getBetween } from "../line/utils_line.js"
|
4
|
+
import { signal } from "../util/event.js"
|
5
|
+
import { indexOf, lst } from "../util/misc.js"
|
6
|
+
|
7
|
+
import { changeEnd } from "./change_measurement.js"
|
8
|
+
import { linkedDocs } from "./document_data.js"
|
9
|
+
import { Selection } from "./selection.js"
|
10
|
+
|
11
|
+
export function History(startGen) {
|
12
|
+
// Arrays of change events and selections. Doing something adds an
|
13
|
+
// event to done and clears undo. Undoing moves events from done
|
14
|
+
// to undone, redoing moves them in the other direction.
|
15
|
+
this.done = []; this.undone = []
|
16
|
+
this.undoDepth = Infinity
|
17
|
+
// Used to track when changes can be merged into a single undo
|
18
|
+
// event
|
19
|
+
this.lastModTime = this.lastSelTime = 0
|
20
|
+
this.lastOp = this.lastSelOp = null
|
21
|
+
this.lastOrigin = this.lastSelOrigin = null
|
22
|
+
// Used by the isClean() method
|
23
|
+
this.generation = this.maxGeneration = startGen || 1
|
24
|
+
}
|
25
|
+
|
26
|
+
// Create a history change event from an updateDoc-style change
|
27
|
+
// object.
|
28
|
+
export function historyChangeFromChange(doc, change) {
|
29
|
+
let histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)}
|
30
|
+
attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1)
|
31
|
+
linkedDocs(doc, doc => attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1), true)
|
32
|
+
return histChange
|
33
|
+
}
|
34
|
+
|
35
|
+
// Pop all selection events off the end of a history array. Stop at
|
36
|
+
// a change event.
|
37
|
+
function clearSelectionEvents(array) {
|
38
|
+
while (array.length) {
|
39
|
+
let last = lst(array)
|
40
|
+
if (last.ranges) array.pop()
|
41
|
+
else break
|
42
|
+
}
|
43
|
+
}
|
44
|
+
|
45
|
+
// Find the top change event in the history. Pop off selection
|
46
|
+
// events that are in the way.
|
47
|
+
function lastChangeEvent(hist, force) {
|
48
|
+
if (force) {
|
49
|
+
clearSelectionEvents(hist.done)
|
50
|
+
return lst(hist.done)
|
51
|
+
} else if (hist.done.length && !lst(hist.done).ranges) {
|
52
|
+
return lst(hist.done)
|
53
|
+
} else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {
|
54
|
+
hist.done.pop()
|
55
|
+
return lst(hist.done)
|
56
|
+
}
|
57
|
+
}
|
58
|
+
|
59
|
+
// Register a change in the history. Merges changes that are within
|
60
|
+
// a single operation, or are close together with an origin that
|
61
|
+
// allows merging (starting with "+") into a single event.
|
62
|
+
export function addChangeToHistory(doc, change, selAfter, opId) {
|
63
|
+
let hist = doc.history
|
64
|
+
hist.undone.length = 0
|
65
|
+
let time = +new Date, cur
|
66
|
+
let last
|
67
|
+
|
68
|
+
if ((hist.lastOp == opId ||
|
69
|
+
hist.lastOrigin == change.origin && change.origin &&
|
70
|
+
((change.origin.charAt(0) == "+" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) ||
|
71
|
+
change.origin.charAt(0) == "*")) &&
|
72
|
+
(cur = lastChangeEvent(hist, hist.lastOp == opId))) {
|
73
|
+
// Merge this change into the last event
|
74
|
+
last = lst(cur.changes)
|
75
|
+
if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {
|
76
|
+
// Optimized case for simple insertion -- don't want to add
|
77
|
+
// new changesets for every character typed
|
78
|
+
last.to = changeEnd(change)
|
79
|
+
} else {
|
80
|
+
// Add new sub-event
|
81
|
+
cur.changes.push(historyChangeFromChange(doc, change))
|
82
|
+
}
|
83
|
+
} else {
|
84
|
+
// Can not be merged, start a new event.
|
85
|
+
let before = lst(hist.done)
|
86
|
+
if (!before || !before.ranges)
|
87
|
+
pushSelectionToHistory(doc.sel, hist.done)
|
88
|
+
cur = {changes: [historyChangeFromChange(doc, change)],
|
89
|
+
generation: hist.generation}
|
90
|
+
hist.done.push(cur)
|
91
|
+
while (hist.done.length > hist.undoDepth) {
|
92
|
+
hist.done.shift()
|
93
|
+
if (!hist.done[0].ranges) hist.done.shift()
|
94
|
+
}
|
95
|
+
}
|
96
|
+
hist.done.push(selAfter)
|
97
|
+
hist.generation = ++hist.maxGeneration
|
98
|
+
hist.lastModTime = hist.lastSelTime = time
|
99
|
+
hist.lastOp = hist.lastSelOp = opId
|
100
|
+
hist.lastOrigin = hist.lastSelOrigin = change.origin
|
101
|
+
|
102
|
+
if (!last) signal(doc, "historyAdded")
|
103
|
+
}
|
104
|
+
|
105
|
+
function selectionEventCanBeMerged(doc, origin, prev, sel) {
|
106
|
+
let ch = origin.charAt(0)
|
107
|
+
return ch == "*" ||
|
108
|
+
ch == "+" &&
|
109
|
+
prev.ranges.length == sel.ranges.length &&
|
110
|
+
prev.somethingSelected() == sel.somethingSelected() &&
|
111
|
+
new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500)
|
112
|
+
}
|
113
|
+
|
114
|
+
// Called whenever the selection changes, sets the new selection as
|
115
|
+
// the pending selection in the history, and pushes the old pending
|
116
|
+
// selection into the 'done' array when it was significantly
|
117
|
+
// different (in number of selected ranges, emptiness, or time).
|
118
|
+
export function addSelectionToHistory(doc, sel, opId, options) {
|
119
|
+
let hist = doc.history, origin = options && options.origin
|
120
|
+
|
121
|
+
// A new event is started when the previous origin does not match
|
122
|
+
// the current, or the origins don't allow matching. Origins
|
123
|
+
// starting with * are always merged, those starting with + are
|
124
|
+
// merged when similar and close together in time.
|
125
|
+
if (opId == hist.lastSelOp ||
|
126
|
+
(origin && hist.lastSelOrigin == origin &&
|
127
|
+
(hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||
|
128
|
+
selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))
|
129
|
+
hist.done[hist.done.length - 1] = sel
|
130
|
+
else
|
131
|
+
pushSelectionToHistory(sel, hist.done)
|
132
|
+
|
133
|
+
hist.lastSelTime = +new Date
|
134
|
+
hist.lastSelOrigin = origin
|
135
|
+
hist.lastSelOp = opId
|
136
|
+
if (options && options.clearRedo !== false)
|
137
|
+
clearSelectionEvents(hist.undone)
|
138
|
+
}
|
139
|
+
|
140
|
+
export function pushSelectionToHistory(sel, dest) {
|
141
|
+
let top = lst(dest)
|
142
|
+
if (!(top && top.ranges && top.equals(sel)))
|
143
|
+
dest.push(sel)
|
144
|
+
}
|
145
|
+
|
146
|
+
// Used to store marked span information in the history.
|
147
|
+
function attachLocalSpans(doc, change, from, to) {
|
148
|
+
let existing = change["spans_" + doc.id], n = 0
|
149
|
+
doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), line => {
|
150
|
+
if (line.markedSpans)
|
151
|
+
(existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans
|
152
|
+
++n
|
153
|
+
})
|
154
|
+
}
|
155
|
+
|
156
|
+
// When un/re-doing restores text containing marked spans, those
|
157
|
+
// that have been explicitly cleared should not be restored.
|
158
|
+
function removeClearedSpans(spans) {
|
159
|
+
if (!spans) return null
|
160
|
+
let out
|
161
|
+
for (let i = 0; i < spans.length; ++i) {
|
162
|
+
if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i) }
|
163
|
+
else if (out) out.push(spans[i])
|
164
|
+
}
|
165
|
+
return !out ? spans : out.length ? out : null
|
166
|
+
}
|
167
|
+
|
168
|
+
// Retrieve and filter the old marked spans stored in a change event.
|
169
|
+
function getOldSpans(doc, change) {
|
170
|
+
let found = change["spans_" + doc.id]
|
171
|
+
if (!found) return null
|
172
|
+
let nw = []
|
173
|
+
for (let i = 0; i < change.text.length; ++i)
|
174
|
+
nw.push(removeClearedSpans(found[i]))
|
175
|
+
return nw
|
176
|
+
}
|
177
|
+
|
178
|
+
// Used for un/re-doing changes from the history. Combines the
|
179
|
+
// result of computing the existing spans with the set of spans that
|
180
|
+
// existed in the history (so that deleting around a span and then
|
181
|
+
// undoing brings back the span).
|
182
|
+
export function mergeOldSpans(doc, change) {
|
183
|
+
let old = getOldSpans(doc, change)
|
184
|
+
let stretched = stretchSpansOverChange(doc, change)
|
185
|
+
if (!old) return stretched
|
186
|
+
if (!stretched) return old
|
187
|
+
|
188
|
+
for (let i = 0; i < old.length; ++i) {
|
189
|
+
let oldCur = old[i], stretchCur = stretched[i]
|
190
|
+
if (oldCur && stretchCur) {
|
191
|
+
spans: for (let j = 0; j < stretchCur.length; ++j) {
|
192
|
+
let span = stretchCur[j]
|
193
|
+
for (let k = 0; k < oldCur.length; ++k)
|
194
|
+
if (oldCur[k].marker == span.marker) continue spans
|
195
|
+
oldCur.push(span)
|
196
|
+
}
|
197
|
+
} else if (stretchCur) {
|
198
|
+
old[i] = stretchCur
|
199
|
+
}
|
200
|
+
}
|
201
|
+
return old
|
202
|
+
}
|
203
|
+
|
204
|
+
// Used both to provide a JSON-safe object in .getHistory, and, when
|
205
|
+
// detaching a document, to split the history in two
|
206
|
+
export function copyHistoryArray(events, newGroup, instantiateSel) {
|
207
|
+
let copy = []
|
208
|
+
for (let i = 0; i < events.length; ++i) {
|
209
|
+
let event = events[i]
|
210
|
+
if (event.ranges) {
|
211
|
+
copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event)
|
212
|
+
continue
|
213
|
+
}
|
214
|
+
let changes = event.changes, newChanges = []
|
215
|
+
copy.push({changes: newChanges})
|
216
|
+
for (let j = 0; j < changes.length; ++j) {
|
217
|
+
let change = changes[j], m
|
218
|
+
newChanges.push({from: change.from, to: change.to, text: change.text})
|
219
|
+
if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\d+)$/)) {
|
220
|
+
if (indexOf(newGroup, Number(m[1])) > -1) {
|
221
|
+
lst(newChanges)[prop] = change[prop]
|
222
|
+
delete change[prop]
|
223
|
+
}
|
224
|
+
}
|
225
|
+
}
|
226
|
+
}
|
227
|
+
return copy
|
228
|
+
}
|
@@ -0,0 +1,78 @@
|
|
1
|
+
import { runInOp } from "../display/operations.js"
|
2
|
+
import { addToScrollTop } from "../display/scrolling.js"
|
3
|
+
import { regLineChange } from "../display/view_tracking.js"
|
4
|
+
import { heightAtLine, lineIsHidden } from "../line/spans.js"
|
5
|
+
import { lineNo, updateLineHeight } from "../line/utils_line.js"
|
6
|
+
import { widgetHeight } from "../measurement/widgets.js"
|
7
|
+
import { changeLine } from "./changes.js"
|
8
|
+
import { eventMixin } from "../util/event.js"
|
9
|
+
import { signalLater } from "../util/operation_group.js"
|
10
|
+
|
11
|
+
// Line widgets are block elements displayed above or below a line.
|
12
|
+
|
13
|
+
export class LineWidget {
|
14
|
+
constructor(doc, node, options) {
|
15
|
+
if (options) for (let opt in options) if (options.hasOwnProperty(opt))
|
16
|
+
this[opt] = options[opt]
|
17
|
+
this.doc = doc
|
18
|
+
this.node = node
|
19
|
+
}
|
20
|
+
|
21
|
+
clear() {
|
22
|
+
let cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line)
|
23
|
+
if (no == null || !ws) return
|
24
|
+
for (let i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1)
|
25
|
+
if (!ws.length) line.widgets = null
|
26
|
+
let height = widgetHeight(this)
|
27
|
+
updateLineHeight(line, Math.max(0, line.height - height))
|
28
|
+
if (cm) {
|
29
|
+
runInOp(cm, () => {
|
30
|
+
adjustScrollWhenAboveVisible(cm, line, -height)
|
31
|
+
regLineChange(cm, no, "widget")
|
32
|
+
})
|
33
|
+
signalLater(cm, "lineWidgetCleared", cm, this, no)
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
changed() {
|
38
|
+
let oldH = this.height, cm = this.doc.cm, line = this.line
|
39
|
+
this.height = null
|
40
|
+
let diff = widgetHeight(this) - oldH
|
41
|
+
if (!diff) return
|
42
|
+
if (!lineIsHidden(this.doc, line)) updateLineHeight(line, line.height + diff)
|
43
|
+
if (cm) {
|
44
|
+
runInOp(cm, () => {
|
45
|
+
cm.curOp.forceUpdate = true
|
46
|
+
adjustScrollWhenAboveVisible(cm, line, diff)
|
47
|
+
signalLater(cm, "lineWidgetChanged", cm, this, lineNo(line))
|
48
|
+
})
|
49
|
+
}
|
50
|
+
}
|
51
|
+
}
|
52
|
+
eventMixin(LineWidget)
|
53
|
+
|
54
|
+
function adjustScrollWhenAboveVisible(cm, line, diff) {
|
55
|
+
if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))
|
56
|
+
addToScrollTop(cm, diff)
|
57
|
+
}
|
58
|
+
|
59
|
+
export function addLineWidget(doc, handle, node, options) {
|
60
|
+
let widget = new LineWidget(doc, node, options)
|
61
|
+
let cm = doc.cm
|
62
|
+
if (cm && widget.noHScroll) cm.display.alignWidgets = true
|
63
|
+
changeLine(doc, handle, "widget", line => {
|
64
|
+
let widgets = line.widgets || (line.widgets = [])
|
65
|
+
if (widget.insertAt == null) widgets.push(widget)
|
66
|
+
else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget)
|
67
|
+
widget.line = line
|
68
|
+
if (cm && !lineIsHidden(doc, line)) {
|
69
|
+
let aboveVisible = heightAtLine(line) < doc.scrollTop
|
70
|
+
updateLineHeight(line, line.height + widgetHeight(widget))
|
71
|
+
if (aboveVisible) addToScrollTop(cm, widget.height)
|
72
|
+
cm.curOp.forceUpdate = true
|
73
|
+
}
|
74
|
+
return true
|
75
|
+
})
|
76
|
+
if (cm) signalLater(cm, "lineWidgetAdded", cm, widget, typeof handle == "number" ? handle : lineNo(handle))
|
77
|
+
return widget
|
78
|
+
}
|
@@ -0,0 +1,292 @@
|
|
1
|
+
import { eltP } from "../util/dom.js"
|
2
|
+
import { eventMixin, hasHandler, on } from "../util/event.js"
|
3
|
+
import { endOperation, operation, runInOp, startOperation } from "../display/operations.js"
|
4
|
+
import { clipPos, cmp, Pos } from "../line/pos.js"
|
5
|
+
import { lineNo, updateLineHeight } from "../line/utils_line.js"
|
6
|
+
import { clearLineMeasurementCacheFor, findViewForLine, textHeight } from "../measurement/position_measurement.js"
|
7
|
+
import { seeReadOnlySpans, seeCollapsedSpans } from "../line/saw_special_spans.js"
|
8
|
+
import { addMarkedSpan, conflictingCollapsedRange, getMarkedSpanFor, lineIsHidden, lineLength, MarkedSpan, removeMarkedSpan, visualLine } from "../line/spans.js"
|
9
|
+
import { copyObj, indexOf, lst } from "../util/misc.js"
|
10
|
+
import { signalLater } from "../util/operation_group.js"
|
11
|
+
import { widgetHeight } from "../measurement/widgets.js"
|
12
|
+
import { regChange, regLineChange } from "../display/view_tracking.js"
|
13
|
+
|
14
|
+
import { linkedDocs } from "./document_data.js"
|
15
|
+
import { addChangeToHistory } from "./history.js"
|
16
|
+
import { reCheckSelection } from "./selection_updates.js"
|
17
|
+
|
18
|
+
// TEXTMARKERS
|
19
|
+
|
20
|
+
// Created with markText and setBookmark methods. A TextMarker is a
|
21
|
+
// handle that can be used to clear or find a marked position in the
|
22
|
+
// document. Line objects hold arrays (markedSpans) containing
|
23
|
+
// {from, to, marker} object pointing to such marker objects, and
|
24
|
+
// indicating that such a marker is present on that line. Multiple
|
25
|
+
// lines may point to the same marker when it spans across lines.
|
26
|
+
// The spans will have null for their from/to properties when the
|
27
|
+
// marker continues beyond the start/end of the line. Markers have
|
28
|
+
// links back to the lines they currently touch.
|
29
|
+
|
30
|
+
// Collapsed markers have unique ids, in order to be able to order
|
31
|
+
// them, which is needed for uniquely determining an outer marker
|
32
|
+
// when they overlap (they may nest, but not partially overlap).
|
33
|
+
let nextMarkerId = 0
|
34
|
+
|
35
|
+
export class TextMarker {
|
36
|
+
constructor(doc, type) {
|
37
|
+
this.lines = []
|
38
|
+
this.type = type
|
39
|
+
this.doc = doc
|
40
|
+
this.id = ++nextMarkerId
|
41
|
+
}
|
42
|
+
|
43
|
+
// Clear the marker.
|
44
|
+
clear() {
|
45
|
+
if (this.explicitlyCleared) return
|
46
|
+
let cm = this.doc.cm, withOp = cm && !cm.curOp
|
47
|
+
if (withOp) startOperation(cm)
|
48
|
+
if (hasHandler(this, "clear")) {
|
49
|
+
let found = this.find()
|
50
|
+
if (found) signalLater(this, "clear", found.from, found.to)
|
51
|
+
}
|
52
|
+
let min = null, max = null
|
53
|
+
for (let i = 0; i < this.lines.length; ++i) {
|
54
|
+
let line = this.lines[i]
|
55
|
+
let span = getMarkedSpanFor(line.markedSpans, this)
|
56
|
+
if (cm && !this.collapsed) regLineChange(cm, lineNo(line), "text")
|
57
|
+
else if (cm) {
|
58
|
+
if (span.to != null) max = lineNo(line)
|
59
|
+
if (span.from != null) min = lineNo(line)
|
60
|
+
}
|
61
|
+
line.markedSpans = removeMarkedSpan(line.markedSpans, span)
|
62
|
+
if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)
|
63
|
+
updateLineHeight(line, textHeight(cm.display))
|
64
|
+
}
|
65
|
+
if (cm && this.collapsed && !cm.options.lineWrapping) for (let i = 0; i < this.lines.length; ++i) {
|
66
|
+
let visual = visualLine(this.lines[i]), len = lineLength(visual)
|
67
|
+
if (len > cm.display.maxLineLength) {
|
68
|
+
cm.display.maxLine = visual
|
69
|
+
cm.display.maxLineLength = len
|
70
|
+
cm.display.maxLineChanged = true
|
71
|
+
}
|
72
|
+
}
|
73
|
+
|
74
|
+
if (min != null && cm && this.collapsed) regChange(cm, min, max + 1)
|
75
|
+
this.lines.length = 0
|
76
|
+
this.explicitlyCleared = true
|
77
|
+
if (this.atomic && this.doc.cantEdit) {
|
78
|
+
this.doc.cantEdit = false
|
79
|
+
if (cm) reCheckSelection(cm.doc)
|
80
|
+
}
|
81
|
+
if (cm) signalLater(cm, "markerCleared", cm, this, min, max)
|
82
|
+
if (withOp) endOperation(cm)
|
83
|
+
if (this.parent) this.parent.clear()
|
84
|
+
}
|
85
|
+
|
86
|
+
// Find the position of the marker in the document. Returns a {from,
|
87
|
+
// to} object by default. Side can be passed to get a specific side
|
88
|
+
// -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the
|
89
|
+
// Pos objects returned contain a line object, rather than a line
|
90
|
+
// number (used to prevent looking up the same line twice).
|
91
|
+
find(side, lineObj) {
|
92
|
+
if (side == null && this.type == "bookmark") side = 1
|
93
|
+
let from, to
|
94
|
+
for (let i = 0; i < this.lines.length; ++i) {
|
95
|
+
let line = this.lines[i]
|
96
|
+
let span = getMarkedSpanFor(line.markedSpans, this)
|
97
|
+
if (span.from != null) {
|
98
|
+
from = Pos(lineObj ? line : lineNo(line), span.from)
|
99
|
+
if (side == -1) return from
|
100
|
+
}
|
101
|
+
if (span.to != null) {
|
102
|
+
to = Pos(lineObj ? line : lineNo(line), span.to)
|
103
|
+
if (side == 1) return to
|
104
|
+
}
|
105
|
+
}
|
106
|
+
return from && {from: from, to: to}
|
107
|
+
}
|
108
|
+
|
109
|
+
// Signals that the marker's widget changed, and surrounding layout
|
110
|
+
// should be recomputed.
|
111
|
+
changed() {
|
112
|
+
let pos = this.find(-1, true), widget = this, cm = this.doc.cm
|
113
|
+
if (!pos || !cm) return
|
114
|
+
runInOp(cm, () => {
|
115
|
+
let line = pos.line, lineN = lineNo(pos.line)
|
116
|
+
let view = findViewForLine(cm, lineN)
|
117
|
+
if (view) {
|
118
|
+
clearLineMeasurementCacheFor(view)
|
119
|
+
cm.curOp.selectionChanged = cm.curOp.forceUpdate = true
|
120
|
+
}
|
121
|
+
cm.curOp.updateMaxLine = true
|
122
|
+
if (!lineIsHidden(widget.doc, line) && widget.height != null) {
|
123
|
+
let oldHeight = widget.height
|
124
|
+
widget.height = null
|
125
|
+
let dHeight = widgetHeight(widget) - oldHeight
|
126
|
+
if (dHeight)
|
127
|
+
updateLineHeight(line, line.height + dHeight)
|
128
|
+
}
|
129
|
+
signalLater(cm, "markerChanged", cm, this)
|
130
|
+
})
|
131
|
+
}
|
132
|
+
|
133
|
+
attachLine(line) {
|
134
|
+
if (!this.lines.length && this.doc.cm) {
|
135
|
+
let op = this.doc.cm.curOp
|
136
|
+
if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)
|
137
|
+
(op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this)
|
138
|
+
}
|
139
|
+
this.lines.push(line)
|
140
|
+
}
|
141
|
+
|
142
|
+
detachLine(line) {
|
143
|
+
this.lines.splice(indexOf(this.lines, line), 1)
|
144
|
+
if (!this.lines.length && this.doc.cm) {
|
145
|
+
let op = this.doc.cm.curOp
|
146
|
+
;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this)
|
147
|
+
}
|
148
|
+
}
|
149
|
+
}
|
150
|
+
eventMixin(TextMarker)
|
151
|
+
|
152
|
+
// Create a marker, wire it up to the right lines, and
|
153
|
+
export function markText(doc, from, to, options, type) {
|
154
|
+
// Shared markers (across linked documents) are handled separately
|
155
|
+
// (markTextShared will call out to this again, once per
|
156
|
+
// document).
|
157
|
+
if (options && options.shared) return markTextShared(doc, from, to, options, type)
|
158
|
+
// Ensure we are in an operation.
|
159
|
+
if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type)
|
160
|
+
|
161
|
+
let marker = new TextMarker(doc, type), diff = cmp(from, to)
|
162
|
+
if (options) copyObj(options, marker, false)
|
163
|
+
// Don't connect empty markers unless clearWhenEmpty is false
|
164
|
+
if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)
|
165
|
+
return marker
|
166
|
+
if (marker.replacedWith) {
|
167
|
+
// Showing up as a widget implies collapsed (widget replaces text)
|
168
|
+
marker.collapsed = true
|
169
|
+
marker.widgetNode = eltP("span", [marker.replacedWith], "CodeMirror-widget")
|
170
|
+
if (!options.handleMouseEvents) marker.widgetNode.setAttribute("cm-ignore-events", "true")
|
171
|
+
if (options.insertLeft) marker.widgetNode.insertLeft = true
|
172
|
+
}
|
173
|
+
if (marker.collapsed) {
|
174
|
+
if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||
|
175
|
+
from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))
|
176
|
+
throw new Error("Inserting collapsed marker partially overlapping an existing one")
|
177
|
+
seeCollapsedSpans()
|
178
|
+
}
|
179
|
+
|
180
|
+
if (marker.addToHistory)
|
181
|
+
addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN)
|
182
|
+
|
183
|
+
let curLine = from.line, cm = doc.cm, updateMaxLine
|
184
|
+
doc.iter(curLine, to.line + 1, line => {
|
185
|
+
if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)
|
186
|
+
updateMaxLine = true
|
187
|
+
if (marker.collapsed && curLine != from.line) updateLineHeight(line, 0)
|
188
|
+
addMarkedSpan(line, new MarkedSpan(marker,
|
189
|
+
curLine == from.line ? from.ch : null,
|
190
|
+
curLine == to.line ? to.ch : null))
|
191
|
+
++curLine
|
192
|
+
})
|
193
|
+
// lineIsHidden depends on the presence of the spans, so needs a second pass
|
194
|
+
if (marker.collapsed) doc.iter(from.line, to.line + 1, line => {
|
195
|
+
if (lineIsHidden(doc, line)) updateLineHeight(line, 0)
|
196
|
+
})
|
197
|
+
|
198
|
+
if (marker.clearOnEnter) on(marker, "beforeCursorEnter", () => marker.clear())
|
199
|
+
|
200
|
+
if (marker.readOnly) {
|
201
|
+
seeReadOnlySpans()
|
202
|
+
if (doc.history.done.length || doc.history.undone.length)
|
203
|
+
doc.clearHistory()
|
204
|
+
}
|
205
|
+
if (marker.collapsed) {
|
206
|
+
marker.id = ++nextMarkerId
|
207
|
+
marker.atomic = true
|
208
|
+
}
|
209
|
+
if (cm) {
|
210
|
+
// Sync editor state
|
211
|
+
if (updateMaxLine) cm.curOp.updateMaxLine = true
|
212
|
+
if (marker.collapsed)
|
213
|
+
regChange(cm, from.line, to.line + 1)
|
214
|
+
else if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.css)
|
215
|
+
for (let i = from.line; i <= to.line; i++) regLineChange(cm, i, "text")
|
216
|
+
if (marker.atomic) reCheckSelection(cm.doc)
|
217
|
+
signalLater(cm, "markerAdded", cm, marker)
|
218
|
+
}
|
219
|
+
return marker
|
220
|
+
}
|
221
|
+
|
222
|
+
// SHARED TEXTMARKERS
|
223
|
+
|
224
|
+
// A shared marker spans multiple linked documents. It is
|
225
|
+
// implemented as a meta-marker-object controlling multiple normal
|
226
|
+
// markers.
|
227
|
+
export class SharedTextMarker {
|
228
|
+
constructor(markers, primary) {
|
229
|
+
this.markers = markers
|
230
|
+
this.primary = primary
|
231
|
+
for (let i = 0; i < markers.length; ++i)
|
232
|
+
markers[i].parent = this
|
233
|
+
}
|
234
|
+
|
235
|
+
clear() {
|
236
|
+
if (this.explicitlyCleared) return
|
237
|
+
this.explicitlyCleared = true
|
238
|
+
for (let i = 0; i < this.markers.length; ++i)
|
239
|
+
this.markers[i].clear()
|
240
|
+
signalLater(this, "clear")
|
241
|
+
}
|
242
|
+
|
243
|
+
find(side, lineObj) {
|
244
|
+
return this.primary.find(side, lineObj)
|
245
|
+
}
|
246
|
+
}
|
247
|
+
eventMixin(SharedTextMarker)
|
248
|
+
|
249
|
+
function markTextShared(doc, from, to, options, type) {
|
250
|
+
options = copyObj(options)
|
251
|
+
options.shared = false
|
252
|
+
let markers = [markText(doc, from, to, options, type)], primary = markers[0]
|
253
|
+
let widget = options.widgetNode
|
254
|
+
linkedDocs(doc, doc => {
|
255
|
+
if (widget) options.widgetNode = widget.cloneNode(true)
|
256
|
+
markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type))
|
257
|
+
for (let i = 0; i < doc.linked.length; ++i)
|
258
|
+
if (doc.linked[i].isParent) return
|
259
|
+
primary = lst(markers)
|
260
|
+
})
|
261
|
+
return new SharedTextMarker(markers, primary)
|
262
|
+
}
|
263
|
+
|
264
|
+
export function findSharedMarkers(doc) {
|
265
|
+
return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), m => m.parent)
|
266
|
+
}
|
267
|
+
|
268
|
+
export function copySharedMarkers(doc, markers) {
|
269
|
+
for (let i = 0; i < markers.length; i++) {
|
270
|
+
let marker = markers[i], pos = marker.find()
|
271
|
+
let mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to)
|
272
|
+
if (cmp(mFrom, mTo)) {
|
273
|
+
let subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type)
|
274
|
+
marker.markers.push(subMark)
|
275
|
+
subMark.parent = marker
|
276
|
+
}
|
277
|
+
}
|
278
|
+
}
|
279
|
+
|
280
|
+
export function detachSharedMarkers(markers) {
|
281
|
+
for (let i = 0; i < markers.length; i++) {
|
282
|
+
let marker = markers[i], linked = [marker.primary.doc]
|
283
|
+
linkedDocs(marker.primary.doc, d => linked.push(d))
|
284
|
+
for (let j = 0; j < marker.markers.length; j++) {
|
285
|
+
let subMarker = marker.markers[j]
|
286
|
+
if (indexOf(linked, subMarker.doc) == -1) {
|
287
|
+
subMarker.parent = null
|
288
|
+
marker.markers.splice(j--, 1)
|
289
|
+
}
|
290
|
+
}
|
291
|
+
}
|
292
|
+
}
|