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,56 @@
|
|
1
|
+
{
|
2
|
+
"_from": "typo-js@*",
|
3
|
+
"_id": "typo-js@1.0.3",
|
4
|
+
"_inBundle": false,
|
5
|
+
"_integrity": "sha1-VNjrx5SfGngQkItgAsaEFSbJnVo=",
|
6
|
+
"_location": "/typo-js",
|
7
|
+
"_phantomChildren": {},
|
8
|
+
"_requested": {
|
9
|
+
"type": "range",
|
10
|
+
"registry": true,
|
11
|
+
"raw": "typo-js@*",
|
12
|
+
"name": "typo-js",
|
13
|
+
"escapedName": "typo-js",
|
14
|
+
"rawSpec": "*",
|
15
|
+
"saveSpec": null,
|
16
|
+
"fetchSpec": "*"
|
17
|
+
},
|
18
|
+
"_requiredBy": [
|
19
|
+
"/codemirror-spell-checker"
|
20
|
+
],
|
21
|
+
"_resolved": "https://registry.npmjs.org/typo-js/-/typo-js-1.0.3.tgz",
|
22
|
+
"_shasum": "54d8ebc7949f1a7810908b6002c6841526c99d5a",
|
23
|
+
"_spec": "typo-js@*",
|
24
|
+
"_where": "/Users/stuart/Documents/administrate-field-markdown/node_modules/codemirror-spell-checker",
|
25
|
+
"author": {
|
26
|
+
"name": "Christopher Finke",
|
27
|
+
"email": "cfinke@gmail.com",
|
28
|
+
"url": "http://www.chrisfinke.com/"
|
29
|
+
},
|
30
|
+
"browser": {
|
31
|
+
"fs": false
|
32
|
+
},
|
33
|
+
"bugs": {
|
34
|
+
"url": "https://github.com/cfinke/Typo.js/issues"
|
35
|
+
},
|
36
|
+
"bundleDependencies": false,
|
37
|
+
"deprecated": false,
|
38
|
+
"description": "A Hunspell-style spellchecker.",
|
39
|
+
"homepage": "https://github.com/cfinke/Typo.js#readme",
|
40
|
+
"keywords": [
|
41
|
+
"spellcheck",
|
42
|
+
"spellchecker",
|
43
|
+
"hunspell",
|
44
|
+
"typo",
|
45
|
+
"speling"
|
46
|
+
],
|
47
|
+
"license": "BSD-3-Clause",
|
48
|
+
"main": "typo.js",
|
49
|
+
"name": "typo-js",
|
50
|
+
"repository": {
|
51
|
+
"type": "git",
|
52
|
+
"url": "git://github.com/cfinke/Typo.js.git"
|
53
|
+
},
|
54
|
+
"tonicExample": "var Typo = require('typo-js'); var dictionary = new Typo('en_US'); dictionary.check('mispelled');",
|
55
|
+
"version": "1.0.3"
|
56
|
+
}
|
@@ -0,0 +1,931 @@
|
|
1
|
+
/* globals chrome: false */
|
2
|
+
/* globals __dirname: false */
|
3
|
+
/* globals require: false */
|
4
|
+
/* globals Buffer: false */
|
5
|
+
/* globals module: false */
|
6
|
+
|
7
|
+
/**
|
8
|
+
* Typo is a JavaScript implementation of a spellchecker using hunspell-style
|
9
|
+
* dictionaries.
|
10
|
+
*/
|
11
|
+
|
12
|
+
var Typo;
|
13
|
+
|
14
|
+
(function () {
|
15
|
+
"use strict";
|
16
|
+
|
17
|
+
/**
|
18
|
+
* Typo constructor.
|
19
|
+
*
|
20
|
+
* @param {String} [dictionary] The locale code of the dictionary being used. e.g.,
|
21
|
+
* "en_US". This is only used to auto-load dictionaries.
|
22
|
+
* @param {String} [affData] The data from the dictionary's .aff file. If omitted
|
23
|
+
* and Typo.js is being used in a Chrome extension, the .aff
|
24
|
+
* file will be loaded automatically from
|
25
|
+
* lib/typo/dictionaries/[dictionary]/[dictionary].aff
|
26
|
+
* In other environments, it will be loaded from
|
27
|
+
* [settings.dictionaryPath]/dictionaries/[dictionary]/[dictionary].aff
|
28
|
+
* @param {String} [wordsData] The data from the dictionary's .dic file. If omitted
|
29
|
+
* and Typo.js is being used in a Chrome extension, the .dic
|
30
|
+
* file will be loaded automatically from
|
31
|
+
* lib/typo/dictionaries/[dictionary]/[dictionary].dic
|
32
|
+
* In other environments, it will be loaded from
|
33
|
+
* [settings.dictionaryPath]/dictionaries/[dictionary]/[dictionary].dic
|
34
|
+
* @param {Object} [settings] Constructor settings. Available properties are:
|
35
|
+
* {String} [dictionaryPath]: path to load dictionary from in non-chrome
|
36
|
+
* environment.
|
37
|
+
* {Object} [flags]: flag information.
|
38
|
+
* {Boolean} [asyncLoad]: If true, affData and wordsData will be loaded
|
39
|
+
* asynchronously.
|
40
|
+
* {Function} [loadedCallback]: Called when both affData and wordsData
|
41
|
+
* have been loaded. Only used if asyncLoad is set to true. The parameter
|
42
|
+
* is the instantiated Typo object.
|
43
|
+
*
|
44
|
+
* @returns {Typo} A Typo object.
|
45
|
+
*/
|
46
|
+
|
47
|
+
Typo = function (dictionary, affData, wordsData, settings) {
|
48
|
+
settings = settings || {};
|
49
|
+
|
50
|
+
this.dictionary = null;
|
51
|
+
|
52
|
+
this.rules = {};
|
53
|
+
this.dictionaryTable = {};
|
54
|
+
|
55
|
+
this.compoundRules = [];
|
56
|
+
this.compoundRuleCodes = {};
|
57
|
+
|
58
|
+
this.replacementTable = [];
|
59
|
+
|
60
|
+
this.flags = settings.flags || {};
|
61
|
+
|
62
|
+
this.memoized = {};
|
63
|
+
|
64
|
+
this.loaded = false;
|
65
|
+
|
66
|
+
var self = this;
|
67
|
+
|
68
|
+
var path;
|
69
|
+
|
70
|
+
// Loop-control variables.
|
71
|
+
var i, j, _len, _jlen;
|
72
|
+
|
73
|
+
if (dictionary) {
|
74
|
+
self.dictionary = dictionary;
|
75
|
+
|
76
|
+
// If the data is preloaded, just setup the Typo object.
|
77
|
+
if (affData && wordsData) {
|
78
|
+
setup();
|
79
|
+
}
|
80
|
+
// Loading data for Chrome extentions.
|
81
|
+
else if (typeof window !== 'undefined' && 'chrome' in window && 'extension' in window.chrome && 'getURL' in window.chrome.extension) {
|
82
|
+
if (settings.dictionaryPath) {
|
83
|
+
path = settings.dictionaryPath;
|
84
|
+
}
|
85
|
+
else {
|
86
|
+
path = "typo/dictionaries";
|
87
|
+
}
|
88
|
+
|
89
|
+
if (!affData) readDataFile(chrome.extension.getURL(path + "/" + dictionary + "/" + dictionary + ".aff"), setAffData);
|
90
|
+
if (!wordsData) readDataFile(chrome.extension.getURL(path + "/" + dictionary + "/" + dictionary + ".dic"), setWordsData);
|
91
|
+
}
|
92
|
+
else {
|
93
|
+
if (settings.dictionaryPath) {
|
94
|
+
path = settings.dictionaryPath;
|
95
|
+
}
|
96
|
+
else if (typeof __dirname !== 'undefined') {
|
97
|
+
path = __dirname + '/dictionaries';
|
98
|
+
}
|
99
|
+
else {
|
100
|
+
path = './dictionaries';
|
101
|
+
}
|
102
|
+
|
103
|
+
if (!affData) readDataFile(path + "/" + dictionary + "/" + dictionary + ".aff", setAffData);
|
104
|
+
if (!wordsData) readDataFile(path + "/" + dictionary + "/" + dictionary + ".dic", setWordsData);
|
105
|
+
}
|
106
|
+
}
|
107
|
+
|
108
|
+
function readDataFile(url, setFunc) {
|
109
|
+
var response = self._readFile(url, null, settings.asyncLoad);
|
110
|
+
|
111
|
+
if (settings.asyncLoad) {
|
112
|
+
response.then(function(data) {
|
113
|
+
setFunc(data);
|
114
|
+
});
|
115
|
+
}
|
116
|
+
else {
|
117
|
+
setFunc(response);
|
118
|
+
}
|
119
|
+
}
|
120
|
+
|
121
|
+
function setAffData(data) {
|
122
|
+
affData = data;
|
123
|
+
|
124
|
+
if (wordsData) {
|
125
|
+
setup();
|
126
|
+
}
|
127
|
+
}
|
128
|
+
|
129
|
+
function setWordsData(data) {
|
130
|
+
wordsData = data;
|
131
|
+
|
132
|
+
if (affData) {
|
133
|
+
setup();
|
134
|
+
}
|
135
|
+
}
|
136
|
+
|
137
|
+
function setup() {
|
138
|
+
self.rules = self._parseAFF(affData);
|
139
|
+
|
140
|
+
// Save the rule codes that are used in compound rules.
|
141
|
+
self.compoundRuleCodes = {};
|
142
|
+
|
143
|
+
for (i = 0, _len = self.compoundRules.length; i < _len; i++) {
|
144
|
+
var rule = self.compoundRules[i];
|
145
|
+
|
146
|
+
for (j = 0, _jlen = rule.length; j < _jlen; j++) {
|
147
|
+
self.compoundRuleCodes[rule[j]] = [];
|
148
|
+
}
|
149
|
+
}
|
150
|
+
|
151
|
+
// If we add this ONLYINCOMPOUND flag to self.compoundRuleCodes, then _parseDIC
|
152
|
+
// will do the work of saving the list of words that are compound-only.
|
153
|
+
if ("ONLYINCOMPOUND" in self.flags) {
|
154
|
+
self.compoundRuleCodes[self.flags.ONLYINCOMPOUND] = [];
|
155
|
+
}
|
156
|
+
|
157
|
+
self.dictionaryTable = self._parseDIC(wordsData);
|
158
|
+
|
159
|
+
// Get rid of any codes from the compound rule codes that are never used
|
160
|
+
// (or that were special regex characters). Not especially necessary...
|
161
|
+
for (i in self.compoundRuleCodes) {
|
162
|
+
if (self.compoundRuleCodes[i].length === 0) {
|
163
|
+
delete self.compoundRuleCodes[i];
|
164
|
+
}
|
165
|
+
}
|
166
|
+
|
167
|
+
// Build the full regular expressions for each compound rule.
|
168
|
+
// I have a feeling (but no confirmation yet) that this method of
|
169
|
+
// testing for compound words is probably slow.
|
170
|
+
for (i = 0, _len = self.compoundRules.length; i < _len; i++) {
|
171
|
+
var ruleText = self.compoundRules[i];
|
172
|
+
|
173
|
+
var expressionText = "";
|
174
|
+
|
175
|
+
for (j = 0, _jlen = ruleText.length; j < _jlen; j++) {
|
176
|
+
var character = ruleText[j];
|
177
|
+
|
178
|
+
if (character in self.compoundRuleCodes) {
|
179
|
+
expressionText += "(" + self.compoundRuleCodes[character].join("|") + ")";
|
180
|
+
}
|
181
|
+
else {
|
182
|
+
expressionText += character;
|
183
|
+
}
|
184
|
+
}
|
185
|
+
|
186
|
+
self.compoundRules[i] = new RegExp(expressionText, "i");
|
187
|
+
}
|
188
|
+
|
189
|
+
self.loaded = true;
|
190
|
+
|
191
|
+
if (settings.asyncLoad && settings.loadedCallback) {
|
192
|
+
settings.loadedCallback(self);
|
193
|
+
}
|
194
|
+
}
|
195
|
+
|
196
|
+
return this;
|
197
|
+
};
|
198
|
+
|
199
|
+
Typo.prototype = {
|
200
|
+
/**
|
201
|
+
* Loads a Typo instance from a hash of all of the Typo properties.
|
202
|
+
*
|
203
|
+
* @param object obj A hash of Typo properties, probably gotten from a JSON.parse(JSON.stringify(typo_instance)).
|
204
|
+
*/
|
205
|
+
|
206
|
+
load : function (obj) {
|
207
|
+
for (var i in obj) {
|
208
|
+
if (obj.hasOwnProperty(i)) {
|
209
|
+
this[i] = obj[i];
|
210
|
+
}
|
211
|
+
}
|
212
|
+
|
213
|
+
return this;
|
214
|
+
},
|
215
|
+
|
216
|
+
/**
|
217
|
+
* Read the contents of a file.
|
218
|
+
*
|
219
|
+
* @param {String} path The path (relative) to the file.
|
220
|
+
* @param {String} [charset="ISO8859-1"] The expected charset of the file
|
221
|
+
* @param {Boolean} async If true, the file will be read asynchronously. For node.js this does nothing, all
|
222
|
+
* files are read synchronously.
|
223
|
+
* @returns {String} The file data if async is false, otherwise a promise object. If running node.js, the data is
|
224
|
+
* always returned.
|
225
|
+
*/
|
226
|
+
|
227
|
+
_readFile : function (path, charset, async) {
|
228
|
+
charset = charset || "utf8";
|
229
|
+
|
230
|
+
if (typeof XMLHttpRequest !== 'undefined') {
|
231
|
+
var promise;
|
232
|
+
var req = new XMLHttpRequest();
|
233
|
+
req.open("GET", path, async);
|
234
|
+
|
235
|
+
if (async) {
|
236
|
+
promise = new Promise(function(resolve, reject) {
|
237
|
+
req.onload = function() {
|
238
|
+
if (req.status === 200) {
|
239
|
+
resolve(req.responseText);
|
240
|
+
}
|
241
|
+
else {
|
242
|
+
reject(req.statusText);
|
243
|
+
}
|
244
|
+
};
|
245
|
+
|
246
|
+
req.onerror = function() {
|
247
|
+
reject(req.statusText);
|
248
|
+
}
|
249
|
+
});
|
250
|
+
}
|
251
|
+
|
252
|
+
if (req.overrideMimeType)
|
253
|
+
req.overrideMimeType("text/plain; charset=" + charset);
|
254
|
+
|
255
|
+
req.send(null);
|
256
|
+
|
257
|
+
return async ? promise : req.responseText;
|
258
|
+
}
|
259
|
+
else if (typeof require !== 'undefined') {
|
260
|
+
// Node.js
|
261
|
+
var fs = require("fs");
|
262
|
+
|
263
|
+
try {
|
264
|
+
if (fs.existsSync(path)) {
|
265
|
+
var stats = fs.statSync(path);
|
266
|
+
|
267
|
+
var fileDescriptor = fs.openSync(path, 'r');
|
268
|
+
|
269
|
+
var buffer = new Buffer(stats.size);
|
270
|
+
|
271
|
+
fs.readSync(fileDescriptor, buffer, 0, buffer.length, null);
|
272
|
+
|
273
|
+
return buffer.toString(charset, 0, buffer.length);
|
274
|
+
}
|
275
|
+
else {
|
276
|
+
console.log("Path " + path + " does not exist.");
|
277
|
+
}
|
278
|
+
} catch (e) {
|
279
|
+
console.log(e);
|
280
|
+
return '';
|
281
|
+
}
|
282
|
+
}
|
283
|
+
},
|
284
|
+
|
285
|
+
/**
|
286
|
+
* Parse the rules out from a .aff file.
|
287
|
+
*
|
288
|
+
* @param {String} data The contents of the affix file.
|
289
|
+
* @returns object The rules from the file.
|
290
|
+
*/
|
291
|
+
|
292
|
+
_parseAFF : function (data) {
|
293
|
+
var rules = {};
|
294
|
+
|
295
|
+
var line, subline, numEntries, lineParts;
|
296
|
+
var i, j, _len, _jlen;
|
297
|
+
|
298
|
+
// Remove comment lines
|
299
|
+
data = this._removeAffixComments(data);
|
300
|
+
|
301
|
+
var lines = data.split("\n");
|
302
|
+
|
303
|
+
for (i = 0, _len = lines.length; i < _len; i++) {
|
304
|
+
line = lines[i];
|
305
|
+
|
306
|
+
var definitionParts = line.split(/\s+/);
|
307
|
+
|
308
|
+
var ruleType = definitionParts[0];
|
309
|
+
|
310
|
+
if (ruleType == "PFX" || ruleType == "SFX") {
|
311
|
+
var ruleCode = definitionParts[1];
|
312
|
+
var combineable = definitionParts[2];
|
313
|
+
numEntries = parseInt(definitionParts[3], 10);
|
314
|
+
|
315
|
+
var entries = [];
|
316
|
+
|
317
|
+
for (j = i + 1, _jlen = i + 1 + numEntries; j < _jlen; j++) {
|
318
|
+
subline = lines[j];
|
319
|
+
|
320
|
+
lineParts = subline.split(/\s+/);
|
321
|
+
var charactersToRemove = lineParts[2];
|
322
|
+
|
323
|
+
var additionParts = lineParts[3].split("/");
|
324
|
+
|
325
|
+
var charactersToAdd = additionParts[0];
|
326
|
+
if (charactersToAdd === "0") charactersToAdd = "";
|
327
|
+
|
328
|
+
var continuationClasses = this.parseRuleCodes(additionParts[1]);
|
329
|
+
|
330
|
+
var regexToMatch = lineParts[4];
|
331
|
+
|
332
|
+
var entry = {};
|
333
|
+
entry.add = charactersToAdd;
|
334
|
+
|
335
|
+
if (continuationClasses.length > 0) entry.continuationClasses = continuationClasses;
|
336
|
+
|
337
|
+
if (regexToMatch !== ".") {
|
338
|
+
if (ruleType === "SFX") {
|
339
|
+
entry.match = new RegExp(regexToMatch + "$");
|
340
|
+
}
|
341
|
+
else {
|
342
|
+
entry.match = new RegExp("^" + regexToMatch);
|
343
|
+
}
|
344
|
+
}
|
345
|
+
|
346
|
+
if (charactersToRemove != "0") {
|
347
|
+
if (ruleType === "SFX") {
|
348
|
+
entry.remove = new RegExp(charactersToRemove + "$");
|
349
|
+
}
|
350
|
+
else {
|
351
|
+
entry.remove = charactersToRemove;
|
352
|
+
}
|
353
|
+
}
|
354
|
+
|
355
|
+
entries.push(entry);
|
356
|
+
}
|
357
|
+
|
358
|
+
rules[ruleCode] = { "type" : ruleType, "combineable" : (combineable == "Y"), "entries" : entries };
|
359
|
+
|
360
|
+
i += numEntries;
|
361
|
+
}
|
362
|
+
else if (ruleType === "COMPOUNDRULE") {
|
363
|
+
numEntries = parseInt(definitionParts[1], 10);
|
364
|
+
|
365
|
+
for (j = i + 1, _jlen = i + 1 + numEntries; j < _jlen; j++) {
|
366
|
+
line = lines[j];
|
367
|
+
|
368
|
+
lineParts = line.split(/\s+/);
|
369
|
+
this.compoundRules.push(lineParts[1]);
|
370
|
+
}
|
371
|
+
|
372
|
+
i += numEntries;
|
373
|
+
}
|
374
|
+
else if (ruleType === "REP") {
|
375
|
+
lineParts = line.split(/\s+/);
|
376
|
+
|
377
|
+
if (lineParts.length === 3) {
|
378
|
+
this.replacementTable.push([ lineParts[1], lineParts[2] ]);
|
379
|
+
}
|
380
|
+
}
|
381
|
+
else {
|
382
|
+
// ONLYINCOMPOUND
|
383
|
+
// COMPOUNDMIN
|
384
|
+
// FLAG
|
385
|
+
// KEEPCASE
|
386
|
+
// NEEDAFFIX
|
387
|
+
|
388
|
+
this.flags[ruleType] = definitionParts[1];
|
389
|
+
}
|
390
|
+
}
|
391
|
+
|
392
|
+
return rules;
|
393
|
+
},
|
394
|
+
|
395
|
+
/**
|
396
|
+
* Removes comment lines and then cleans up blank lines and trailing whitespace.
|
397
|
+
*
|
398
|
+
* @param {String} data The data from an affix file.
|
399
|
+
* @return {String} The cleaned-up data.
|
400
|
+
*/
|
401
|
+
|
402
|
+
_removeAffixComments : function (data) {
|
403
|
+
// Remove comments
|
404
|
+
// This used to remove any string starting with '#' up to the end of the line,
|
405
|
+
// but some COMPOUNDRULE definitions include '#' as part of the rule.
|
406
|
+
// I haven't seen any affix files that use comments on the same line as real data,
|
407
|
+
// so I don't think this will break anything.
|
408
|
+
data = data.replace(/^\s*#.*$/mg, "");
|
409
|
+
|
410
|
+
// Trim each line
|
411
|
+
data = data.replace(/^\s\s*/m, '').replace(/\s\s*$/m, '');
|
412
|
+
|
413
|
+
// Remove blank lines.
|
414
|
+
data = data.replace(/\n{2,}/g, "\n");
|
415
|
+
|
416
|
+
// Trim the entire string
|
417
|
+
data = data.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
|
418
|
+
|
419
|
+
return data;
|
420
|
+
},
|
421
|
+
|
422
|
+
/**
|
423
|
+
* Parses the words out from the .dic file.
|
424
|
+
*
|
425
|
+
* @param {String} data The data from the dictionary file.
|
426
|
+
* @returns object The lookup table containing all of the words and
|
427
|
+
* word forms from the dictionary.
|
428
|
+
*/
|
429
|
+
|
430
|
+
_parseDIC : function (data) {
|
431
|
+
data = this._removeDicComments(data);
|
432
|
+
|
433
|
+
var lines = data.split("\n");
|
434
|
+
var dictionaryTable = {};
|
435
|
+
|
436
|
+
function addWord(word, rules) {
|
437
|
+
// Some dictionaries will list the same word multiple times with different rule sets.
|
438
|
+
if (!dictionaryTable.hasOwnProperty(word)) {
|
439
|
+
dictionaryTable[word] = null;
|
440
|
+
}
|
441
|
+
|
442
|
+
if (rules.length > 0) {
|
443
|
+
if (dictionaryTable[word] === null) {
|
444
|
+
dictionaryTable[word] = [];
|
445
|
+
}
|
446
|
+
|
447
|
+
dictionaryTable[word].push(rules);
|
448
|
+
}
|
449
|
+
}
|
450
|
+
|
451
|
+
// The first line is the number of words in the dictionary.
|
452
|
+
for (var i = 1, _len = lines.length; i < _len; i++) {
|
453
|
+
var line = lines[i];
|
454
|
+
|
455
|
+
var parts = line.split("/", 2);
|
456
|
+
|
457
|
+
var word = parts[0];
|
458
|
+
|
459
|
+
// Now for each affix rule, generate that form of the word.
|
460
|
+
if (parts.length > 1) {
|
461
|
+
var ruleCodesArray = this.parseRuleCodes(parts[1]);
|
462
|
+
|
463
|
+
// Save the ruleCodes for compound word situations.
|
464
|
+
if (!("NEEDAFFIX" in this.flags) || ruleCodesArray.indexOf(this.flags.NEEDAFFIX) == -1) {
|
465
|
+
addWord(word, ruleCodesArray);
|
466
|
+
}
|
467
|
+
|
468
|
+
for (var j = 0, _jlen = ruleCodesArray.length; j < _jlen; j++) {
|
469
|
+
var code = ruleCodesArray[j];
|
470
|
+
|
471
|
+
var rule = this.rules[code];
|
472
|
+
|
473
|
+
if (rule) {
|
474
|
+
var newWords = this._applyRule(word, rule);
|
475
|
+
|
476
|
+
for (var ii = 0, _iilen = newWords.length; ii < _iilen; ii++) {
|
477
|
+
var newWord = newWords[ii];
|
478
|
+
|
479
|
+
addWord(newWord, []);
|
480
|
+
|
481
|
+
if (rule.combineable) {
|
482
|
+
for (var k = j + 1; k < _jlen; k++) {
|
483
|
+
var combineCode = ruleCodesArray[k];
|
484
|
+
|
485
|
+
var combineRule = this.rules[combineCode];
|
486
|
+
|
487
|
+
if (combineRule) {
|
488
|
+
if (combineRule.combineable && (rule.type != combineRule.type)) {
|
489
|
+
var otherNewWords = this._applyRule(newWord, combineRule);
|
490
|
+
|
491
|
+
for (var iii = 0, _iiilen = otherNewWords.length; iii < _iiilen; iii++) {
|
492
|
+
var otherNewWord = otherNewWords[iii];
|
493
|
+
addWord(otherNewWord, []);
|
494
|
+
}
|
495
|
+
}
|
496
|
+
}
|
497
|
+
}
|
498
|
+
}
|
499
|
+
}
|
500
|
+
}
|
501
|
+
|
502
|
+
if (code in this.compoundRuleCodes) {
|
503
|
+
this.compoundRuleCodes[code].push(word);
|
504
|
+
}
|
505
|
+
}
|
506
|
+
}
|
507
|
+
else {
|
508
|
+
addWord(word.trim(), []);
|
509
|
+
}
|
510
|
+
}
|
511
|
+
|
512
|
+
return dictionaryTable;
|
513
|
+
},
|
514
|
+
|
515
|
+
|
516
|
+
/**
|
517
|
+
* Removes comment lines and then cleans up blank lines and trailing whitespace.
|
518
|
+
*
|
519
|
+
* @param {String} data The data from a .dic file.
|
520
|
+
* @return {String} The cleaned-up data.
|
521
|
+
*/
|
522
|
+
|
523
|
+
_removeDicComments : function (data) {
|
524
|
+
// I can't find any official documentation on it, but at least the de_DE
|
525
|
+
// dictionary uses tab-indented lines as comments.
|
526
|
+
|
527
|
+
// Remove comments
|
528
|
+
data = data.replace(/^\t.*$/mg, "");
|
529
|
+
|
530
|
+
return data;
|
531
|
+
},
|
532
|
+
|
533
|
+
parseRuleCodes : function (textCodes) {
|
534
|
+
if (!textCodes) {
|
535
|
+
return [];
|
536
|
+
}
|
537
|
+
else if (!("FLAG" in this.flags)) {
|
538
|
+
return textCodes.split("");
|
539
|
+
}
|
540
|
+
else if (this.flags.FLAG === "long") {
|
541
|
+
var flags = [];
|
542
|
+
|
543
|
+
for (var i = 0, _len = textCodes.length; i < _len; i += 2) {
|
544
|
+
flags.push(textCodes.substr(i, 2));
|
545
|
+
}
|
546
|
+
|
547
|
+
return flags;
|
548
|
+
}
|
549
|
+
else if (this.flags.FLAG === "num") {
|
550
|
+
return textCodes.split(",");
|
551
|
+
}
|
552
|
+
},
|
553
|
+
|
554
|
+
/**
|
555
|
+
* Applies an affix rule to a word.
|
556
|
+
*
|
557
|
+
* @param {String} word The base word.
|
558
|
+
* @param {Object} rule The affix rule.
|
559
|
+
* @returns {String[]} The new words generated by the rule.
|
560
|
+
*/
|
561
|
+
|
562
|
+
_applyRule : function (word, rule) {
|
563
|
+
var entries = rule.entries;
|
564
|
+
var newWords = [];
|
565
|
+
|
566
|
+
for (var i = 0, _len = entries.length; i < _len; i++) {
|
567
|
+
var entry = entries[i];
|
568
|
+
|
569
|
+
if (!entry.match || word.match(entry.match)) {
|
570
|
+
var newWord = word;
|
571
|
+
|
572
|
+
if (entry.remove) {
|
573
|
+
newWord = newWord.replace(entry.remove, "");
|
574
|
+
}
|
575
|
+
|
576
|
+
if (rule.type === "SFX") {
|
577
|
+
newWord = newWord + entry.add;
|
578
|
+
}
|
579
|
+
else {
|
580
|
+
newWord = entry.add + newWord;
|
581
|
+
}
|
582
|
+
|
583
|
+
newWords.push(newWord);
|
584
|
+
|
585
|
+
if ("continuationClasses" in entry) {
|
586
|
+
for (var j = 0, _jlen = entry.continuationClasses.length; j < _jlen; j++) {
|
587
|
+
var continuationRule = this.rules[entry.continuationClasses[j]];
|
588
|
+
|
589
|
+
if (continuationRule) {
|
590
|
+
newWords = newWords.concat(this._applyRule(newWord, continuationRule));
|
591
|
+
}
|
592
|
+
/*
|
593
|
+
else {
|
594
|
+
// This shouldn't happen, but it does, at least in the de_DE dictionary.
|
595
|
+
// I think the author mistakenly supplied lower-case rule codes instead
|
596
|
+
// of upper-case.
|
597
|
+
}
|
598
|
+
*/
|
599
|
+
}
|
600
|
+
}
|
601
|
+
}
|
602
|
+
}
|
603
|
+
|
604
|
+
return newWords;
|
605
|
+
},
|
606
|
+
|
607
|
+
/**
|
608
|
+
* Checks whether a word or a capitalization variant exists in the current dictionary.
|
609
|
+
* The word is trimmed and several variations of capitalizations are checked.
|
610
|
+
* If you want to check a word without any changes made to it, call checkExact()
|
611
|
+
*
|
612
|
+
* @see http://blog.stevenlevithan.com/archives/faster-trim-javascript re:trimming function
|
613
|
+
*
|
614
|
+
* @param {String} aWord The word to check.
|
615
|
+
* @returns {Boolean}
|
616
|
+
*/
|
617
|
+
|
618
|
+
check : function (aWord) {
|
619
|
+
if (!this.loaded) {
|
620
|
+
throw "Dictionary not loaded.";
|
621
|
+
}
|
622
|
+
|
623
|
+
// Remove leading and trailing whitespace
|
624
|
+
var trimmedWord = aWord.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
|
625
|
+
|
626
|
+
if (this.checkExact(trimmedWord)) {
|
627
|
+
return true;
|
628
|
+
}
|
629
|
+
|
630
|
+
// The exact word is not in the dictionary.
|
631
|
+
if (trimmedWord.toUpperCase() === trimmedWord) {
|
632
|
+
// The word was supplied in all uppercase.
|
633
|
+
// Check for a capitalized form of the word.
|
634
|
+
var capitalizedWord = trimmedWord[0] + trimmedWord.substring(1).toLowerCase();
|
635
|
+
|
636
|
+
if (this.hasFlag(capitalizedWord, "KEEPCASE")) {
|
637
|
+
// Capitalization variants are not allowed for this word.
|
638
|
+
return false;
|
639
|
+
}
|
640
|
+
|
641
|
+
if (this.checkExact(capitalizedWord)) {
|
642
|
+
return true;
|
643
|
+
}
|
644
|
+
}
|
645
|
+
|
646
|
+
var lowercaseWord = trimmedWord.toLowerCase();
|
647
|
+
|
648
|
+
if (lowercaseWord !== trimmedWord) {
|
649
|
+
if (this.hasFlag(lowercaseWord, "KEEPCASE")) {
|
650
|
+
// Capitalization variants are not allowed for this word.
|
651
|
+
return false;
|
652
|
+
}
|
653
|
+
|
654
|
+
// Check for a lowercase form
|
655
|
+
if (this.checkExact(lowercaseWord)) {
|
656
|
+
return true;
|
657
|
+
}
|
658
|
+
}
|
659
|
+
|
660
|
+
return false;
|
661
|
+
},
|
662
|
+
|
663
|
+
/**
|
664
|
+
* Checks whether a word exists in the current dictionary.
|
665
|
+
*
|
666
|
+
* @param {String} word The word to check.
|
667
|
+
* @returns {Boolean}
|
668
|
+
*/
|
669
|
+
|
670
|
+
checkExact : function (word) {
|
671
|
+
if (!this.loaded) {
|
672
|
+
throw "Dictionary not loaded.";
|
673
|
+
}
|
674
|
+
|
675
|
+
var ruleCodes = this.dictionaryTable[word];
|
676
|
+
|
677
|
+
var i, _len;
|
678
|
+
|
679
|
+
if (typeof ruleCodes === 'undefined') {
|
680
|
+
// Check if this might be a compound word.
|
681
|
+
if ("COMPOUNDMIN" in this.flags && word.length >= this.flags.COMPOUNDMIN) {
|
682
|
+
for (i = 0, _len = this.compoundRules.length; i < _len; i++) {
|
683
|
+
if (word.match(this.compoundRules[i])) {
|
684
|
+
return true;
|
685
|
+
}
|
686
|
+
}
|
687
|
+
}
|
688
|
+
}
|
689
|
+
else if (ruleCodes === null) {
|
690
|
+
// a null (but not undefined) value for an entry in the dictionary table
|
691
|
+
// means that the word is in the dictionary but has no flags.
|
692
|
+
return true;
|
693
|
+
}
|
694
|
+
else if (typeof ruleCodes === 'object') { // this.dictionary['hasOwnProperty'] will be a function.
|
695
|
+
for (i = 0, _len = ruleCodes.length; i < _len; i++) {
|
696
|
+
if (!this.hasFlag(word, "ONLYINCOMPOUND", ruleCodes[i])) {
|
697
|
+
return true;
|
698
|
+
}
|
699
|
+
}
|
700
|
+
}
|
701
|
+
|
702
|
+
return false;
|
703
|
+
},
|
704
|
+
|
705
|
+
/**
|
706
|
+
* Looks up whether a given word is flagged with a given flag.
|
707
|
+
*
|
708
|
+
* @param {String} word The word in question.
|
709
|
+
* @param {String} flag The flag in question.
|
710
|
+
* @return {Boolean}
|
711
|
+
*/
|
712
|
+
|
713
|
+
hasFlag : function (word, flag, wordFlags) {
|
714
|
+
if (!this.loaded) {
|
715
|
+
throw "Dictionary not loaded.";
|
716
|
+
}
|
717
|
+
|
718
|
+
if (flag in this.flags) {
|
719
|
+
if (typeof wordFlags === 'undefined') {
|
720
|
+
wordFlags = Array.prototype.concat.apply([], this.dictionaryTable[word]);
|
721
|
+
}
|
722
|
+
|
723
|
+
if (wordFlags && wordFlags.indexOf(this.flags[flag]) !== -1) {
|
724
|
+
return true;
|
725
|
+
}
|
726
|
+
}
|
727
|
+
|
728
|
+
return false;
|
729
|
+
},
|
730
|
+
|
731
|
+
/**
|
732
|
+
* Returns a list of suggestions for a misspelled word.
|
733
|
+
*
|
734
|
+
* @see http://www.norvig.com/spell-correct.html for the basis of this suggestor.
|
735
|
+
* This suggestor is primitive, but it works.
|
736
|
+
*
|
737
|
+
* @param {String} word The misspelling.
|
738
|
+
* @param {Number} [limit=5] The maximum number of suggestions to return.
|
739
|
+
* @returns {String[]} The array of suggestions.
|
740
|
+
*/
|
741
|
+
|
742
|
+
alphabet : "",
|
743
|
+
|
744
|
+
suggest : function (word, limit) {
|
745
|
+
if (!this.loaded) {
|
746
|
+
throw "Dictionary not loaded.";
|
747
|
+
}
|
748
|
+
|
749
|
+
limit = limit || 5;
|
750
|
+
|
751
|
+
if (this.memoized.hasOwnProperty(word)) {
|
752
|
+
var memoizedLimit = this.memoized[word]['limit'];
|
753
|
+
|
754
|
+
// Only return the cached list if it's big enough or if there weren't enough suggestions
|
755
|
+
// to fill a smaller limit.
|
756
|
+
if (limit <= memoizedLimit || this.memoized[word]['suggestions'].length < memoizedLimit) {
|
757
|
+
return this.memoized[word]['suggestions'].slice(0, limit);
|
758
|
+
}
|
759
|
+
}
|
760
|
+
|
761
|
+
if (this.check(word)) return [];
|
762
|
+
|
763
|
+
// Check the replacement table.
|
764
|
+
for (var i = 0, _len = this.replacementTable.length; i < _len; i++) {
|
765
|
+
var replacementEntry = this.replacementTable[i];
|
766
|
+
|
767
|
+
if (word.indexOf(replacementEntry[0]) !== -1) {
|
768
|
+
var correctedWord = word.replace(replacementEntry[0], replacementEntry[1]);
|
769
|
+
|
770
|
+
if (this.check(correctedWord)) {
|
771
|
+
return [ correctedWord ];
|
772
|
+
}
|
773
|
+
}
|
774
|
+
}
|
775
|
+
|
776
|
+
var self = this;
|
777
|
+
self.alphabet = "abcdefghijklmnopqrstuvwxyz";
|
778
|
+
|
779
|
+
/*
|
780
|
+
if (!self.alphabet) {
|
781
|
+
// Use the alphabet as implicitly defined by the words in the dictionary.
|
782
|
+
var alphaHash = {};
|
783
|
+
|
784
|
+
for (var i in self.dictionaryTable) {
|
785
|
+
for (var j = 0, _len = i.length; j < _len; j++) {
|
786
|
+
alphaHash[i[j]] = true;
|
787
|
+
}
|
788
|
+
}
|
789
|
+
|
790
|
+
for (var i in alphaHash) {
|
791
|
+
self.alphabet += i;
|
792
|
+
}
|
793
|
+
|
794
|
+
var alphaArray = self.alphabet.split("");
|
795
|
+
alphaArray.sort();
|
796
|
+
self.alphabet = alphaArray.join("");
|
797
|
+
}
|
798
|
+
*/
|
799
|
+
|
800
|
+
function edits1(words) {
|
801
|
+
var rv = [];
|
802
|
+
|
803
|
+
var ii, i, j, _iilen, _len, _jlen;
|
804
|
+
|
805
|
+
for (ii = 0, _iilen = words.length; ii < _iilen; ii++) {
|
806
|
+
var word = words[ii];
|
807
|
+
|
808
|
+
for (i = 0, _len = word.length + 1; i < _len; i++) {
|
809
|
+
var s = [ word.substring(0, i), word.substring(i) ];
|
810
|
+
|
811
|
+
if (s[1]) {
|
812
|
+
rv.push(s[0] + s[1].substring(1));
|
813
|
+
}
|
814
|
+
|
815
|
+
// Eliminate transpositions of identical letters
|
816
|
+
if (s[1].length > 1 && s[1][1] !== s[1][0]) {
|
817
|
+
rv.push(s[0] + s[1][1] + s[1][0] + s[1].substring(2));
|
818
|
+
}
|
819
|
+
|
820
|
+
if (s[1]) {
|
821
|
+
for (j = 0, _jlen = self.alphabet.length; j < _jlen; j++) {
|
822
|
+
// Eliminate replacement of a letter by itself
|
823
|
+
if (self.alphabet[j] != s[1].substring(0,1)){
|
824
|
+
rv.push(s[0] + self.alphabet[j] + s[1].substring(1));
|
825
|
+
}
|
826
|
+
}
|
827
|
+
}
|
828
|
+
|
829
|
+
if (s[1]) {
|
830
|
+
for (j = 0, _jlen = self.alphabet.length; j < _jlen; j++) {
|
831
|
+
rv.push(s[0] + self.alphabet[j] + s[1]);
|
832
|
+
}
|
833
|
+
}
|
834
|
+
}
|
835
|
+
}
|
836
|
+
|
837
|
+
return rv;
|
838
|
+
}
|
839
|
+
|
840
|
+
function known(words) {
|
841
|
+
var rv = [];
|
842
|
+
|
843
|
+
for (var i = 0, _len = words.length; i < _len; i++) {
|
844
|
+
if (self.check(words[i])) {
|
845
|
+
rv.push(words[i]);
|
846
|
+
}
|
847
|
+
}
|
848
|
+
|
849
|
+
return rv;
|
850
|
+
}
|
851
|
+
|
852
|
+
function correct(word) {
|
853
|
+
// Get the edit-distance-1 and edit-distance-2 forms of this word.
|
854
|
+
var ed1 = edits1([word]);
|
855
|
+
var ed2 = edits1(ed1);
|
856
|
+
|
857
|
+
var corrections = known(ed1.concat(ed2));
|
858
|
+
|
859
|
+
var i, _len;
|
860
|
+
|
861
|
+
// Sort the edits based on how many different ways they were created.
|
862
|
+
var weighted_corrections = {};
|
863
|
+
|
864
|
+
for (i = 0, _len = corrections.length; i < _len; i++) {
|
865
|
+
if (!(corrections[i] in weighted_corrections)) {
|
866
|
+
weighted_corrections[corrections[i]] = 1;
|
867
|
+
}
|
868
|
+
else {
|
869
|
+
weighted_corrections[corrections[i]] += 1;
|
870
|
+
}
|
871
|
+
}
|
872
|
+
|
873
|
+
var sorted_corrections = [];
|
874
|
+
|
875
|
+
for (i in weighted_corrections) {
|
876
|
+
if (weighted_corrections.hasOwnProperty(i)) {
|
877
|
+
sorted_corrections.push([ i, weighted_corrections[i] ]);
|
878
|
+
}
|
879
|
+
}
|
880
|
+
|
881
|
+
function sorter(a, b) {
|
882
|
+
if (a[1] < b[1]) {
|
883
|
+
return -1;
|
884
|
+
}
|
885
|
+
|
886
|
+
return 1;
|
887
|
+
}
|
888
|
+
|
889
|
+
sorted_corrections.sort(sorter).reverse();
|
890
|
+
|
891
|
+
var rv = [];
|
892
|
+
|
893
|
+
var capitalization_scheme = "lowercase";
|
894
|
+
|
895
|
+
if (word.toUpperCase() === word) {
|
896
|
+
capitalization_scheme = "uppercase";
|
897
|
+
}
|
898
|
+
else if (word.substr(0, 1).toUpperCase() + word.substr(1).toLowerCase() === word) {
|
899
|
+
capitalization_scheme = "capitalized";
|
900
|
+
}
|
901
|
+
|
902
|
+
for (i = 0, _len = Math.min(limit, sorted_corrections.length); i < _len; i++) {
|
903
|
+
if ("uppercase" === capitalization_scheme) {
|
904
|
+
sorted_corrections[i][0] = sorted_corrections[i][0].toUpperCase();
|
905
|
+
}
|
906
|
+
else if ("capitalized" === capitalization_scheme) {
|
907
|
+
sorted_corrections[i][0] = sorted_corrections[i][0].substr(0, 1).toUpperCase() + sorted_corrections[i][0].substr(1);
|
908
|
+
}
|
909
|
+
|
910
|
+
if (!self.hasFlag(sorted_corrections[i][0], "NOSUGGEST")) {
|
911
|
+
rv.push(sorted_corrections[i][0]);
|
912
|
+
}
|
913
|
+
}
|
914
|
+
|
915
|
+
return rv;
|
916
|
+
}
|
917
|
+
|
918
|
+
this.memoized[word] = {
|
919
|
+
'suggestions': correct(word),
|
920
|
+
'limit': limit
|
921
|
+
};
|
922
|
+
|
923
|
+
return this.memoized[word]['suggestions'];
|
924
|
+
}
|
925
|
+
};
|
926
|
+
})();
|
927
|
+
|
928
|
+
// Support for use as a node.js module.
|
929
|
+
if (typeof module !== 'undefined') {
|
930
|
+
module.exports = Typo;
|
931
|
+
}
|