scrivito_codemirror_editor 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (246) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE +21 -165
  3. data/README.md +2 -2
  4. data/app/assets/javascripts/scrivito_codemirror_editor/codemirror_editor.js +29 -0
  5. data/lib/scrivito_codemirror_editor.rb +0 -2
  6. data/vendor/assets/javascripts/codemirror/addons/comment/comment.js +203 -0
  7. data/vendor/assets/javascripts/codemirror/addons/comment/continuecomment.js +85 -0
  8. data/vendor/assets/javascripts/codemirror/addons/dialog/dialog.js +157 -0
  9. data/vendor/assets/javascripts/codemirror/addons/display/autorefresh.js +47 -0
  10. data/vendor/assets/javascripts/codemirror/addons/display/fullscreen.js +41 -0
  11. data/vendor/assets/javascripts/codemirror/addons/display/panel.js +112 -0
  12. data/vendor/assets/javascripts/codemirror/addons/display/placeholder.js +62 -0
  13. data/vendor/assets/javascripts/codemirror/addons/display/rulers.js +51 -0
  14. data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +195 -0
  15. data/vendor/assets/javascripts/codemirror/addons/edit/closetag.js +169 -0
  16. data/vendor/assets/javascripts/codemirror/addons/edit/continuelist.js +51 -0
  17. data/vendor/assets/javascripts/codemirror/addons/edit/matchbrackets.js +120 -0
  18. data/vendor/assets/javascripts/codemirror/addons/edit/matchtags.js +66 -0
  19. data/vendor/assets/javascripts/codemirror/addons/edit/trailingspace.js +27 -0
  20. data/vendor/assets/javascripts/codemirror/addons/fold/brace-fold.js +105 -0
  21. data/vendor/assets/javascripts/codemirror/addons/fold/comment-fold.js +59 -0
  22. data/vendor/assets/javascripts/codemirror/addons/fold/foldcode.js +150 -0
  23. data/vendor/assets/javascripts/codemirror/addons/fold/foldgutter.js +146 -0
  24. data/vendor/assets/javascripts/codemirror/addons/fold/indent-fold.js +44 -0
  25. data/vendor/assets/javascripts/codemirror/addons/fold/markdown-fold.js +49 -0
  26. data/vendor/assets/javascripts/codemirror/addons/fold/xml-fold.js +182 -0
  27. data/vendor/assets/javascripts/codemirror/addons/hint/anyword-hint.js +41 -0
  28. data/vendor/assets/javascripts/codemirror/addons/hint/css-hint.js +60 -0
  29. data/vendor/assets/javascripts/codemirror/addons/hint/html-hint.js +348 -0
  30. data/vendor/assets/javascripts/codemirror/addons/hint/javascript-hint.js +146 -0
  31. data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +437 -0
  32. data/vendor/assets/javascripts/codemirror/addons/hint/sql-hint.js +271 -0
  33. data/vendor/assets/javascripts/codemirror/addons/hint/xml-hint.js +110 -0
  34. data/vendor/assets/javascripts/codemirror/addons/lint/coffeescript-lint.js +41 -0
  35. data/vendor/assets/javascripts/codemirror/addons/lint/css-lint.js +35 -0
  36. data/vendor/assets/javascripts/codemirror/addons/lint/html-lint.js +46 -0
  37. data/vendor/assets/javascripts/codemirror/addons/lint/javascript-lint.js +136 -0
  38. data/vendor/assets/javascripts/codemirror/addons/lint/json-lint.js +31 -0
  39. data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +239 -0
  40. data/vendor/assets/javascripts/codemirror/addons/lint/yaml-lint.js +28 -0
  41. data/vendor/assets/javascripts/codemirror/addons/merge/merge.js +773 -0
  42. data/vendor/assets/javascripts/codemirror/addons/mode/loadmode.js +64 -0
  43. data/vendor/assets/javascripts/codemirror/addons/mode/multiplex.js +123 -0
  44. data/vendor/assets/javascripts/codemirror/addons/mode/overlay.js +85 -0
  45. data/vendor/assets/javascripts/codemirror/addons/mode/simple.js +213 -0
  46. data/vendor/assets/javascripts/codemirror/addons/runmode/colorize.js +40 -0
  47. data/vendor/assets/javascripts/codemirror/addons/runmode/runmode-standalone.js +157 -0
  48. data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.js +72 -0
  49. data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.node.js +179 -0
  50. data/vendor/assets/javascripts/codemirror/addons/scroll/annotatescrollbar.js +118 -0
  51. data/vendor/assets/javascripts/codemirror/addons/scroll/scrollpastend.js +48 -0
  52. data/vendor/assets/javascripts/codemirror/addons/scroll/simplescrollbars.js +152 -0
  53. data/vendor/assets/javascripts/codemirror/addons/search/jump-to-line.js +49 -0
  54. data/vendor/assets/javascripts/codemirror/addons/search/match-highlighter.js +146 -0
  55. data/vendor/assets/javascripts/codemirror/addons/search/matchesonscrollbar.js +97 -0
  56. data/vendor/assets/javascripts/codemirror/addons/search/search.js +249 -0
  57. data/vendor/assets/javascripts/codemirror/addons/search/searchcursor.js +189 -0
  58. data/vendor/assets/javascripts/codemirror/addons/selection/active-line.js +74 -0
  59. data/vendor/assets/javascripts/codemirror/addons/selection/mark-selection.js +118 -0
  60. data/vendor/assets/javascripts/codemirror/addons/selection/selection-pointer.js +98 -0
  61. data/vendor/assets/javascripts/codemirror/addons/tern/tern.js +701 -0
  62. data/vendor/assets/javascripts/codemirror/addons/tern/worker.js +44 -0
  63. data/vendor/assets/javascripts/codemirror/addons/wrap/hardwrap.js +144 -0
  64. data/vendor/assets/javascripts/codemirror/keymaps/emacs.js +412 -0
  65. data/vendor/assets/javascripts/codemirror/keymaps/sublime.js +580 -0
  66. data/vendor/assets/javascripts/codemirror/keymaps/vim.js +5065 -0
  67. data/vendor/assets/javascripts/codemirror/modes/apl.js +174 -0
  68. data/vendor/assets/javascripts/codemirror/modes/asciiarmor.js +73 -0
  69. data/vendor/assets/javascripts/codemirror/modes/asn.1.js +204 -0
  70. data/vendor/assets/javascripts/codemirror/modes/asterisk.js +196 -0
  71. data/vendor/assets/javascripts/codemirror/modes/brainfuck.js +85 -0
  72. data/vendor/assets/javascripts/codemirror/modes/clike.js +786 -0
  73. data/vendor/assets/javascripts/codemirror/modes/clojure.js +306 -0
  74. data/vendor/assets/javascripts/codemirror/modes/cmake.js +97 -0
  75. data/vendor/assets/javascripts/codemirror/modes/cobol.js +255 -0
  76. data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +355 -0
  77. data/vendor/assets/javascripts/codemirror/modes/commonlisp.js +123 -0
  78. data/vendor/assets/javascripts/codemirror/modes/crystal.js +391 -0
  79. data/vendor/assets/javascripts/codemirror/modes/css.js +825 -0
  80. data/vendor/assets/javascripts/codemirror/modes/cypher.js +146 -0
  81. data/vendor/assets/javascripts/codemirror/modes/d.js +218 -0
  82. data/vendor/assets/javascripts/codemirror/modes/dart.js +157 -0
  83. data/vendor/assets/javascripts/codemirror/modes/diff.js +47 -0
  84. data/vendor/assets/javascripts/codemirror/modes/django.js +356 -0
  85. data/vendor/assets/javascripts/codemirror/modes/dockerfile.js +79 -0
  86. data/vendor/assets/javascripts/codemirror/modes/dtd.js +142 -0
  87. data/vendor/assets/javascripts/codemirror/modes/dylan.js +344 -0
  88. data/vendor/assets/javascripts/codemirror/modes/ebnf.js +195 -0
  89. data/vendor/assets/javascripts/codemirror/modes/ecl.js +206 -0
  90. data/vendor/assets/javascripts/codemirror/modes/eiffel.js +160 -0
  91. data/vendor/assets/javascripts/codemirror/modes/elm.js +205 -0
  92. data/vendor/assets/javascripts/codemirror/modes/erlang.js +618 -0
  93. data/vendor/assets/javascripts/codemirror/modes/factor.js +83 -0
  94. data/vendor/assets/javascripts/codemirror/modes/fcl.js +173 -0
  95. data/vendor/assets/javascripts/codemirror/modes/forth.js +180 -0
  96. data/vendor/assets/javascripts/codemirror/modes/fortran.js +188 -0
  97. data/vendor/assets/javascripts/codemirror/modes/gas.js +345 -0
  98. data/vendor/assets/javascripts/codemirror/modes/gfm.js +130 -0
  99. data/vendor/assets/javascripts/codemirror/modes/gherkin.js +178 -0
  100. data/vendor/assets/javascripts/codemirror/modes/go.js +185 -0
  101. data/vendor/assets/javascripts/codemirror/modes/groovy.js +230 -0
  102. data/vendor/assets/javascripts/codemirror/modes/haml.js +161 -0
  103. data/vendor/assets/javascripts/codemirror/modes/handlebars.js +62 -0
  104. data/vendor/assets/javascripts/codemirror/modes/haskell-literate.js +43 -0
  105. data/vendor/assets/javascripts/codemirror/modes/haskell.js +267 -0
  106. data/vendor/assets/javascripts/codemirror/modes/haxe.js +515 -0
  107. data/vendor/assets/javascripts/codemirror/modes/htmlembedded.js +28 -0
  108. data/vendor/assets/javascripts/codemirror/modes/htmlmixed.js +152 -0
  109. data/vendor/assets/javascripts/codemirror/modes/http.js +113 -0
  110. data/vendor/assets/javascripts/codemirror/modes/idl.js +290 -0
  111. data/vendor/assets/javascripts/codemirror/modes/jade.js +590 -0
  112. data/vendor/assets/javascripts/codemirror/modes/javascript.js +748 -0
  113. data/vendor/assets/javascripts/codemirror/modes/jinja2.js +142 -0
  114. data/vendor/assets/javascripts/codemirror/modes/jsx.js +147 -0
  115. data/vendor/assets/javascripts/codemirror/modes/julia.js +392 -0
  116. data/vendor/assets/javascripts/codemirror/modes/livescript.js +280 -0
  117. data/vendor/assets/javascripts/codemirror/modes/lua.js +159 -0
  118. data/vendor/assets/javascripts/codemirror/modes/markdown.js +797 -0
  119. data/vendor/assets/javascripts/codemirror/modes/mathematica.js +176 -0
  120. data/vendor/assets/javascripts/codemirror/modes/mbox.js +129 -0
  121. data/vendor/assets/javascripts/codemirror/modes/mirc.js +193 -0
  122. data/vendor/assets/javascripts/codemirror/modes/mllike.js +205 -0
  123. data/vendor/assets/javascripts/codemirror/modes/modelica.js +245 -0
  124. data/vendor/assets/javascripts/codemirror/modes/mscgen.js +169 -0
  125. data/vendor/assets/javascripts/codemirror/modes/mumps.js +148 -0
  126. data/vendor/assets/javascripts/codemirror/modes/nginx.js +178 -0
  127. data/vendor/assets/javascripts/codemirror/modes/nsis.js +95 -0
  128. data/vendor/assets/javascripts/codemirror/modes/ntriples.js +186 -0
  129. data/vendor/assets/javascripts/codemirror/modes/octave.js +135 -0
  130. data/vendor/assets/javascripts/codemirror/modes/oz.js +252 -0
  131. data/vendor/assets/javascripts/codemirror/modes/pascal.js +109 -0
  132. data/vendor/assets/javascripts/codemirror/modes/pegjs.js +114 -0
  133. data/vendor/assets/javascripts/codemirror/modes/perl.js +837 -0
  134. data/vendor/assets/javascripts/codemirror/modes/php.js +234 -0
  135. data/vendor/assets/javascripts/codemirror/modes/pig.js +178 -0
  136. data/vendor/assets/javascripts/codemirror/modes/powershell.js +396 -0
  137. data/vendor/assets/javascripts/codemirror/modes/properties.js +78 -0
  138. data/vendor/assets/javascripts/codemirror/modes/protobuf.js +68 -0
  139. data/vendor/assets/javascripts/codemirror/modes/puppet.js +220 -0
  140. data/vendor/assets/javascripts/codemirror/modes/python.js +340 -0
  141. data/vendor/assets/javascripts/codemirror/modes/q.js +139 -0
  142. data/vendor/assets/javascripts/codemirror/modes/r.js +164 -0
  143. data/vendor/assets/javascripts/codemirror/modes/rpm.js +109 -0
  144. data/vendor/assets/javascripts/codemirror/modes/rst.js +557 -0
  145. data/vendor/assets/javascripts/codemirror/modes/ruby.js +285 -0
  146. data/vendor/assets/javascripts/codemirror/modes/rust.js +71 -0
  147. data/vendor/assets/javascripts/codemirror/modes/sas.js +315 -0
  148. data/vendor/assets/javascripts/codemirror/modes/sass.js +414 -0
  149. data/vendor/assets/javascripts/codemirror/modes/scheme.js +249 -0
  150. data/vendor/assets/javascripts/codemirror/modes/shell.js +139 -0
  151. data/vendor/assets/javascripts/codemirror/modes/sieve.js +193 -0
  152. data/vendor/assets/javascripts/codemirror/modes/slim.js +575 -0
  153. data/vendor/assets/javascripts/codemirror/modes/smalltalk.js +168 -0
  154. data/vendor/assets/javascripts/codemirror/modes/smarty.js +225 -0
  155. data/vendor/assets/javascripts/codemirror/modes/solr.js +104 -0
  156. data/vendor/assets/javascripts/codemirror/modes/soy.js +199 -0
  157. data/vendor/assets/javascripts/codemirror/modes/sparql.js +180 -0
  158. data/vendor/assets/javascripts/codemirror/modes/spreadsheet.js +112 -0
  159. data/vendor/assets/javascripts/codemirror/modes/sql.js +413 -0
  160. data/vendor/assets/javascripts/codemirror/modes/stex.js +251 -0
  161. data/vendor/assets/javascripts/codemirror/modes/stylus.js +769 -0
  162. data/vendor/assets/javascripts/codemirror/modes/swift.js +202 -0
  163. data/vendor/assets/javascripts/codemirror/modes/tcl.js +139 -0
  164. data/vendor/assets/javascripts/codemirror/modes/textile.js +469 -0
  165. data/vendor/assets/javascripts/codemirror/modes/tiddlywiki.js +308 -0
  166. data/vendor/assets/javascripts/codemirror/modes/tiki.js +312 -0
  167. data/vendor/assets/javascripts/codemirror/modes/toml.js +88 -0
  168. data/vendor/assets/javascripts/codemirror/modes/tornado.js +68 -0
  169. data/vendor/assets/javascripts/codemirror/modes/troff.js +84 -0
  170. data/vendor/assets/javascripts/codemirror/modes/ttcn-cfg.js +214 -0
  171. data/vendor/assets/javascripts/codemirror/modes/ttcn.js +283 -0
  172. data/vendor/assets/javascripts/codemirror/modes/turtle.js +162 -0
  173. data/vendor/assets/javascripts/codemirror/modes/twig.js +141 -0
  174. data/vendor/assets/javascripts/codemirror/modes/vb.js +276 -0
  175. data/vendor/assets/javascripts/codemirror/modes/vbscript.js +350 -0
  176. data/vendor/assets/javascripts/codemirror/modes/velocity.js +201 -0
  177. data/vendor/assets/javascripts/codemirror/modes/verilog.js +537 -0
  178. data/vendor/assets/javascripts/codemirror/modes/vhdl.js +189 -0
  179. data/vendor/assets/javascripts/codemirror/modes/vue.js +69 -0
  180. data/vendor/assets/javascripts/codemirror/modes/webidl.js +195 -0
  181. data/vendor/assets/javascripts/codemirror/modes/xml.js +394 -0
  182. data/vendor/assets/javascripts/codemirror/modes/xquery.js +437 -0
  183. data/vendor/assets/javascripts/codemirror/modes/yacas.js +204 -0
  184. data/vendor/assets/javascripts/codemirror/modes/yaml-frontmatter.js +68 -0
  185. data/vendor/assets/javascripts/codemirror/modes/yaml.js +117 -0
  186. data/vendor/assets/javascripts/codemirror/modes/z80.js +116 -0
  187. data/vendor/assets/javascripts/codemirror.js +8922 -0
  188. data/vendor/assets/stylesheets/codemirror/addons/dialog/dialog.css +32 -0
  189. data/vendor/assets/stylesheets/codemirror/addons/display/fullscreen.css +6 -0
  190. data/vendor/assets/stylesheets/codemirror/addons/fold/foldgutter.css +20 -0
  191. data/vendor/assets/stylesheets/codemirror/addons/hint/show-hint.css +37 -0
  192. data/vendor/assets/stylesheets/codemirror/addons/lint/lint.css +73 -0
  193. data/vendor/assets/stylesheets/codemirror/addons/merge/merge.css +113 -0
  194. data/vendor/assets/stylesheets/codemirror/addons/scroll/simplescrollbars.css +66 -0
  195. data/vendor/assets/stylesheets/codemirror/addons/search/matchesonscrollbar.css +8 -0
  196. data/vendor/assets/stylesheets/codemirror/addons/tern/tern.css +87 -0
  197. data/vendor/assets/stylesheets/codemirror/modes/tiddlywiki.css +14 -0
  198. data/vendor/assets/stylesheets/codemirror/modes/tiki.css +26 -0
  199. data/vendor/assets/stylesheets/codemirror/themes/3024-day.css +41 -0
  200. data/vendor/assets/stylesheets/codemirror/themes/3024-night.css +39 -0
  201. data/vendor/assets/stylesheets/codemirror/themes/abcdef.css +32 -0
  202. data/vendor/assets/stylesheets/codemirror/themes/ambiance-mobile.css +5 -0
  203. data/vendor/assets/stylesheets/codemirror/themes/ambiance.css +74 -0
  204. data/vendor/assets/stylesheets/codemirror/themes/base16-dark.css +38 -0
  205. data/vendor/assets/stylesheets/codemirror/themes/base16-light.css +38 -0
  206. data/vendor/assets/stylesheets/codemirror/themes/bespin.css +34 -0
  207. data/vendor/assets/stylesheets/codemirror/themes/blackboard.css +32 -0
  208. data/vendor/assets/stylesheets/codemirror/themes/cobalt.css +25 -0
  209. data/vendor/assets/stylesheets/codemirror/themes/colorforth.css +33 -0
  210. data/vendor/assets/stylesheets/codemirror/themes/dracula.css +41 -0
  211. data/vendor/assets/stylesheets/codemirror/themes/eclipse.css +23 -0
  212. data/vendor/assets/stylesheets/codemirror/themes/elegant.css +13 -0
  213. data/vendor/assets/stylesheets/codemirror/themes/erlang-dark.css +34 -0
  214. data/vendor/assets/stylesheets/codemirror/themes/hopscotch.css +34 -0
  215. data/vendor/assets/stylesheets/codemirror/themes/icecoder.css +43 -0
  216. data/vendor/assets/stylesheets/codemirror/themes/isotope.css +34 -0
  217. data/vendor/assets/stylesheets/codemirror/themes/lesser-dark.css +47 -0
  218. data/vendor/assets/stylesheets/codemirror/themes/liquibyte.css +95 -0
  219. data/vendor/assets/stylesheets/codemirror/themes/material.css +53 -0
  220. data/vendor/assets/stylesheets/codemirror/themes/mbo.css +37 -0
  221. data/vendor/assets/stylesheets/codemirror/themes/mdn-like.css +46 -0
  222. data/vendor/assets/stylesheets/codemirror/themes/midnight.css +45 -0
  223. data/vendor/assets/stylesheets/codemirror/themes/monokai.css +36 -0
  224. data/vendor/assets/stylesheets/codemirror/themes/neat.css +12 -0
  225. data/vendor/assets/stylesheets/codemirror/themes/neo.css +43 -0
  226. data/vendor/assets/stylesheets/codemirror/themes/night.css +27 -0
  227. data/vendor/assets/stylesheets/codemirror/themes/paraiso-dark.css +38 -0
  228. data/vendor/assets/stylesheets/codemirror/themes/paraiso-light.css +38 -0
  229. data/vendor/assets/stylesheets/codemirror/themes/pastel-on-dark.css +53 -0
  230. data/vendor/assets/stylesheets/codemirror/themes/railscasts.css +34 -0
  231. data/vendor/assets/stylesheets/codemirror/themes/rubyblue.css +25 -0
  232. data/vendor/assets/stylesheets/codemirror/themes/seti.css +44 -0
  233. data/vendor/assets/stylesheets/codemirror/themes/solarized.css +169 -0
  234. data/vendor/assets/stylesheets/codemirror/themes/the-matrix.css +30 -0
  235. data/vendor/assets/stylesheets/codemirror/themes/tomorrow-night-bright.css +35 -0
  236. data/vendor/assets/stylesheets/codemirror/themes/tomorrow-night-eighties.css +38 -0
  237. data/vendor/assets/stylesheets/codemirror/themes/ttcn.css +64 -0
  238. data/vendor/assets/stylesheets/codemirror/themes/twilight.css +32 -0
  239. data/vendor/assets/stylesheets/codemirror/themes/vibrant-ink.css +34 -0
  240. data/vendor/assets/stylesheets/codemirror/themes/xq-dark.css +53 -0
  241. data/vendor/assets/stylesheets/codemirror/themes/xq-light.css +43 -0
  242. data/vendor/assets/stylesheets/codemirror/themes/yeti.css +44 -0
  243. data/vendor/assets/stylesheets/codemirror/themes/zenburn.css +37 -0
  244. data/vendor/assets/stylesheets/codemirror.css +347 -0
  245. metadata +244 -49
  246. data/app/assets/javascripts/scrivito_codemirror_editor/codemirror_editor.js.coffee +0 -23
@@ -0,0 +1,146 @@
1
+ // CodeMirror, copyright (c) by Marijn Haverbeke and others
2
+ // Distributed under an MIT license: http://codemirror.net/LICENSE
3
+
4
+ // Highlighting text that matches the selection
5
+ //
6
+ // Defines an option highlightSelectionMatches, which, when enabled,
7
+ // will style strings that match the selection throughout the
8
+ // document.
9
+ //
10
+ // The option can be set to true to simply enable it, or to a
11
+ // {minChars, style, wordsOnly, showToken, delay} object to explicitly
12
+ // configure it. minChars is the minimum amount of characters that should be
13
+ // selected for the behavior to occur, and style is the token style to
14
+ // apply to the matches. This will be prefixed by "cm-" to create an
15
+ // actual CSS class name. If wordsOnly is enabled, the matches will be
16
+ // highlighted only if the selected text is a word. showToken, when enabled,
17
+ // will cause the current token to be highlighted when nothing is selected.
18
+ // delay is used to specify how much time to wait, in milliseconds, before
19
+ // highlighting the matches. If annotateScrollbar is enabled, the occurences
20
+ // will be highlighted on the scrollbar via the matchesonscrollbar addon.
21
+
22
+ (function(mod) {
23
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
24
+ mod(require("../../lib/codemirror"), require("./matchesonscrollbar"));
25
+ else if (typeof define == "function" && define.amd) // AMD
26
+ define(["../../lib/codemirror", "./matchesonscrollbar"], mod);
27
+ else // Plain browser env
28
+ mod(CodeMirror);
29
+ })(function(CodeMirror) {
30
+ "use strict";
31
+
32
+ var defaults = {
33
+ style: "matchhighlight",
34
+ minChars: 2,
35
+ delay: 100,
36
+ wordsOnly: false,
37
+ annotateScrollbar: false,
38
+ showToken: false,
39
+ trim: true
40
+ }
41
+
42
+ function State(options) {
43
+ this.options = {}
44
+ for (var name in defaults)
45
+ this.options[name] = (options && options.hasOwnProperty(name) ? options : defaults)[name]
46
+ this.overlay = this.timeout = null;
47
+ this.matchesonscroll = null;
48
+ }
49
+
50
+ CodeMirror.defineOption("highlightSelectionMatches", false, function(cm, val, old) {
51
+ if (old && old != CodeMirror.Init) {
52
+ removeOverlay(cm);
53
+ clearTimeout(cm.state.matchHighlighter.timeout);
54
+ cm.state.matchHighlighter = null;
55
+ cm.off("cursorActivity", cursorActivity);
56
+ }
57
+ if (val) {
58
+ cm.state.matchHighlighter = new State(val);
59
+ highlightMatches(cm);
60
+ cm.on("cursorActivity", cursorActivity);
61
+ }
62
+ });
63
+
64
+ function cursorActivity(cm) {
65
+ var state = cm.state.matchHighlighter;
66
+ clearTimeout(state.timeout);
67
+ state.timeout = setTimeout(function() {highlightMatches(cm);}, state.options.delay);
68
+ }
69
+
70
+ function addOverlay(cm, query, hasBoundary, style) {
71
+ var state = cm.state.matchHighlighter;
72
+ cm.addOverlay(state.overlay = makeOverlay(query, hasBoundary, style));
73
+ if (state.options.annotateScrollbar && cm.showMatchesOnScrollbar) {
74
+ var searchFor = hasBoundary ? new RegExp("\\b" + query + "\\b") : query;
75
+ state.matchesonscroll = cm.showMatchesOnScrollbar(searchFor, true,
76
+ {className: "CodeMirror-selection-highlight-scrollbar"});
77
+ }
78
+ }
79
+
80
+ function removeOverlay(cm) {
81
+ var state = cm.state.matchHighlighter;
82
+ if (state.overlay) {
83
+ cm.removeOverlay(state.overlay);
84
+ state.overlay = null;
85
+ if (state.matchesonscroll) {
86
+ state.matchesonscroll.clear();
87
+ state.matchesonscroll = null;
88
+ }
89
+ }
90
+ }
91
+
92
+ function highlightMatches(cm) {
93
+ cm.operation(function() {
94
+ var state = cm.state.matchHighlighter;
95
+ removeOverlay(cm);
96
+ if (!cm.somethingSelected() && state.options.showToken) {
97
+ var re = state.options.showToken === true ? /[\w$]/ : state.options.showToken;
98
+ var cur = cm.getCursor(), line = cm.getLine(cur.line), start = cur.ch, end = start;
99
+ while (start && re.test(line.charAt(start - 1))) --start;
100
+ while (end < line.length && re.test(line.charAt(end))) ++end;
101
+ if (start < end)
102
+ addOverlay(cm, line.slice(start, end), re, state.options.style);
103
+ return;
104
+ }
105
+ var from = cm.getCursor("from"), to = cm.getCursor("to");
106
+ if (from.line != to.line) return;
107
+ if (state.options.wordsOnly && !isWord(cm, from, to)) return;
108
+ var selection = cm.getRange(from, to)
109
+ if (state.options.trim) selection = selection.replace(/^\s+|\s+$/g, "")
110
+ if (selection.length >= state.options.minChars)
111
+ addOverlay(cm, selection, false, state.options.style);
112
+ });
113
+ }
114
+
115
+ function isWord(cm, from, to) {
116
+ var str = cm.getRange(from, to);
117
+ if (str.match(/^\w+$/) !== null) {
118
+ if (from.ch > 0) {
119
+ var pos = {line: from.line, ch: from.ch - 1};
120
+ var chr = cm.getRange(pos, from);
121
+ if (chr.match(/\W/) === null) return false;
122
+ }
123
+ if (to.ch < cm.getLine(from.line).length) {
124
+ var pos = {line: to.line, ch: to.ch + 1};
125
+ var chr = cm.getRange(to, pos);
126
+ if (chr.match(/\W/) === null) return false;
127
+ }
128
+ return true;
129
+ } else return false;
130
+ }
131
+
132
+ function boundariesAround(stream, re) {
133
+ return (!stream.start || !re.test(stream.string.charAt(stream.start - 1))) &&
134
+ (stream.pos == stream.string.length || !re.test(stream.string.charAt(stream.pos)));
135
+ }
136
+
137
+ function makeOverlay(query, hasBoundary, style) {
138
+ return {token: function(stream) {
139
+ if (stream.match(query) &&
140
+ (!hasBoundary || boundariesAround(stream, hasBoundary)))
141
+ return style;
142
+ stream.next();
143
+ stream.skipTo(query.charAt(0)) || stream.skipToEnd();
144
+ }};
145
+ }
146
+ });
@@ -0,0 +1,97 @@
1
+ // CodeMirror, copyright (c) by Marijn Haverbeke and others
2
+ // Distributed under an MIT license: http://codemirror.net/LICENSE
3
+
4
+ (function(mod) {
5
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
6
+ mod(require("../../lib/codemirror"), require("./searchcursor"), require("../scroll/annotatescrollbar"));
7
+ else if (typeof define == "function" && define.amd) // AMD
8
+ define(["../../lib/codemirror", "./searchcursor", "../scroll/annotatescrollbar"], mod);
9
+ else // Plain browser env
10
+ mod(CodeMirror);
11
+ })(function(CodeMirror) {
12
+ "use strict";
13
+
14
+ CodeMirror.defineExtension("showMatchesOnScrollbar", function(query, caseFold, options) {
15
+ if (typeof options == "string") options = {className: options};
16
+ if (!options) options = {};
17
+ return new SearchAnnotation(this, query, caseFold, options);
18
+ });
19
+
20
+ function SearchAnnotation(cm, query, caseFold, options) {
21
+ this.cm = cm;
22
+ this.options = options;
23
+ var annotateOptions = {listenForChanges: false};
24
+ for (var prop in options) annotateOptions[prop] = options[prop];
25
+ if (!annotateOptions.className) annotateOptions.className = "CodeMirror-search-match";
26
+ this.annotation = cm.annotateScrollbar(annotateOptions);
27
+ this.query = query;
28
+ this.caseFold = caseFold;
29
+ this.gap = {from: cm.firstLine(), to: cm.lastLine() + 1};
30
+ this.matches = [];
31
+ this.update = null;
32
+
33
+ this.findMatches();
34
+ this.annotation.update(this.matches);
35
+
36
+ var self = this;
37
+ cm.on("change", this.changeHandler = function(_cm, change) { self.onChange(change); });
38
+ }
39
+
40
+ var MAX_MATCHES = 1000;
41
+
42
+ SearchAnnotation.prototype.findMatches = function() {
43
+ if (!this.gap) return;
44
+ for (var i = 0; i < this.matches.length; i++) {
45
+ var match = this.matches[i];
46
+ if (match.from.line >= this.gap.to) break;
47
+ if (match.to.line >= this.gap.from) this.matches.splice(i--, 1);
48
+ }
49
+ var cursor = this.cm.getSearchCursor(this.query, CodeMirror.Pos(this.gap.from, 0), this.caseFold);
50
+ var maxMatches = this.options && this.options.maxMatches || MAX_MATCHES;
51
+ while (cursor.findNext()) {
52
+ var match = {from: cursor.from(), to: cursor.to()};
53
+ if (match.from.line >= this.gap.to) break;
54
+ this.matches.splice(i++, 0, match);
55
+ if (this.matches.length > maxMatches) break;
56
+ }
57
+ this.gap = null;
58
+ };
59
+
60
+ function offsetLine(line, changeStart, sizeChange) {
61
+ if (line <= changeStart) return line;
62
+ return Math.max(changeStart, line + sizeChange);
63
+ }
64
+
65
+ SearchAnnotation.prototype.onChange = function(change) {
66
+ var startLine = change.from.line;
67
+ var endLine = CodeMirror.changeEnd(change).line;
68
+ var sizeChange = endLine - change.to.line;
69
+ if (this.gap) {
70
+ this.gap.from = Math.min(offsetLine(this.gap.from, startLine, sizeChange), change.from.line);
71
+ this.gap.to = Math.max(offsetLine(this.gap.to, startLine, sizeChange), change.from.line);
72
+ } else {
73
+ this.gap = {from: change.from.line, to: endLine + 1};
74
+ }
75
+
76
+ if (sizeChange) for (var i = 0; i < this.matches.length; i++) {
77
+ var match = this.matches[i];
78
+ var newFrom = offsetLine(match.from.line, startLine, sizeChange);
79
+ if (newFrom != match.from.line) match.from = CodeMirror.Pos(newFrom, match.from.ch);
80
+ var newTo = offsetLine(match.to.line, startLine, sizeChange);
81
+ if (newTo != match.to.line) match.to = CodeMirror.Pos(newTo, match.to.ch);
82
+ }
83
+ clearTimeout(this.update);
84
+ var self = this;
85
+ this.update = setTimeout(function() { self.updateAfterChange(); }, 250);
86
+ };
87
+
88
+ SearchAnnotation.prototype.updateAfterChange = function() {
89
+ this.findMatches();
90
+ this.annotation.update(this.matches);
91
+ };
92
+
93
+ SearchAnnotation.prototype.clear = function() {
94
+ this.cm.off("change", this.changeHandler);
95
+ this.annotation.clear();
96
+ };
97
+ });
@@ -0,0 +1,249 @@
1
+ // CodeMirror, copyright (c) by Marijn Haverbeke and others
2
+ // Distributed under an MIT license: http://codemirror.net/LICENSE
3
+
4
+ // Define search commands. Depends on dialog.js or another
5
+ // implementation of the openDialog method.
6
+
7
+ // Replace works a little oddly -- it will do the replace on the next
8
+ // Ctrl-G (or whatever is bound to findNext) press. You prevent a
9
+ // replace by making sure the match is no longer selected when hitting
10
+ // Ctrl-G.
11
+
12
+ (function(mod) {
13
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
14
+ mod(require("../../lib/codemirror"), require("./searchcursor"), require("../dialog/dialog"));
15
+ else if (typeof define == "function" && define.amd) // AMD
16
+ define(["../../lib/codemirror", "./searchcursor", "../dialog/dialog"], mod);
17
+ else // Plain browser env
18
+ mod(CodeMirror);
19
+ })(function(CodeMirror) {
20
+ "use strict";
21
+
22
+ function searchOverlay(query, caseInsensitive) {
23
+ if (typeof query == "string")
24
+ query = new RegExp(query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), caseInsensitive ? "gi" : "g");
25
+ else if (!query.global)
26
+ query = new RegExp(query.source, query.ignoreCase ? "gi" : "g");
27
+
28
+ return {token: function(stream) {
29
+ query.lastIndex = stream.pos;
30
+ var match = query.exec(stream.string);
31
+ if (match && match.index == stream.pos) {
32
+ stream.pos += match[0].length || 1;
33
+ return "searching";
34
+ } else if (match) {
35
+ stream.pos = match.index;
36
+ } else {
37
+ stream.skipToEnd();
38
+ }
39
+ }};
40
+ }
41
+
42
+ function SearchState() {
43
+ this.posFrom = this.posTo = this.lastQuery = this.query = null;
44
+ this.overlay = null;
45
+ }
46
+
47
+ function getSearchState(cm) {
48
+ return cm.state.search || (cm.state.search = new SearchState());
49
+ }
50
+
51
+ function queryCaseInsensitive(query) {
52
+ return typeof query == "string" && query == query.toLowerCase();
53
+ }
54
+
55
+ function getSearchCursor(cm, query, pos) {
56
+ // Heuristic: if the query string is all lowercase, do a case insensitive search.
57
+ return cm.getSearchCursor(query, pos, queryCaseInsensitive(query));
58
+ }
59
+
60
+ function persistentDialog(cm, text, deflt, onEnter, onKeyDown) {
61
+ cm.openDialog(text, onEnter, {
62
+ value: deflt,
63
+ selectValueOnOpen: true,
64
+ closeOnEnter: false,
65
+ onClose: function() { clearSearch(cm); },
66
+ onKeyDown: onKeyDown
67
+ });
68
+ }
69
+
70
+ function dialog(cm, text, shortText, deflt, f) {
71
+ if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true});
72
+ else f(prompt(shortText, deflt));
73
+ }
74
+
75
+ function confirmDialog(cm, text, shortText, fs) {
76
+ if (cm.openConfirm) cm.openConfirm(text, fs);
77
+ else if (confirm(shortText)) fs[0]();
78
+ }
79
+
80
+ function parseString(string) {
81
+ return string.replace(/\\(.)/g, function(_, ch) {
82
+ if (ch == "n") return "\n"
83
+ if (ch == "r") return "\r"
84
+ return ch
85
+ })
86
+ }
87
+
88
+ function parseQuery(query) {
89
+ var isRE = query.match(/^\/(.*)\/([a-z]*)$/);
90
+ if (isRE) {
91
+ try { query = new RegExp(isRE[1], isRE[2].indexOf("i") == -1 ? "" : "i"); }
92
+ catch(e) {} // Not a regular expression after all, do a string search
93
+ } else {
94
+ query = parseString(query)
95
+ }
96
+ if (typeof query == "string" ? query == "" : query.test(""))
97
+ query = /x^/;
98
+ return query;
99
+ }
100
+
101
+ var queryDialog =
102
+ 'Search: <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)</span>';
103
+
104
+ function startSearch(cm, state, query) {
105
+ state.queryText = query;
106
+ state.query = parseQuery(query);
107
+ cm.removeOverlay(state.overlay, queryCaseInsensitive(state.query));
108
+ state.overlay = searchOverlay(state.query, queryCaseInsensitive(state.query));
109
+ cm.addOverlay(state.overlay);
110
+ if (cm.showMatchesOnScrollbar) {
111
+ if (state.annotate) { state.annotate.clear(); state.annotate = null; }
112
+ state.annotate = cm.showMatchesOnScrollbar(state.query, queryCaseInsensitive(state.query));
113
+ }
114
+ }
115
+
116
+ function doSearch(cm, rev, persistent, immediate) {
117
+ var state = getSearchState(cm);
118
+ if (state.query) return findNext(cm, rev);
119
+ var q = cm.getSelection() || state.lastQuery;
120
+ if (persistent && cm.openDialog) {
121
+ var hiding = null
122
+ var searchNext = function(query, event) {
123
+ CodeMirror.e_stop(event);
124
+ if (!query) return;
125
+ if (query != state.queryText) {
126
+ startSearch(cm, state, query);
127
+ state.posFrom = state.posTo = cm.getCursor();
128
+ }
129
+ if (hiding) hiding.style.opacity = 1
130
+ findNext(cm, event.shiftKey, function(_, to) {
131
+ var dialog
132
+ if (to.line < 3 && document.querySelector &&
133
+ (dialog = cm.display.wrapper.querySelector(".CodeMirror-dialog")) &&
134
+ dialog.getBoundingClientRect().bottom - 4 > cm.cursorCoords(to, "window").top)
135
+ (hiding = dialog).style.opacity = .4
136
+ })
137
+ };
138
+ persistentDialog(cm, queryDialog, q, searchNext, function(event, query) {
139
+ var cmd = CodeMirror.keyMap[cm.getOption("keyMap")][CodeMirror.keyName(event)];
140
+ if (cmd == "findNext" || cmd == "findPrev") {
141
+ CodeMirror.e_stop(event);
142
+ startSearch(cm, getSearchState(cm), query);
143
+ cm.execCommand(cmd);
144
+ } else if (cmd == "find" || cmd == "findPersistent") {
145
+ CodeMirror.e_stop(event);
146
+ searchNext(query, event);
147
+ }
148
+ });
149
+ if (immediate) {
150
+ startSearch(cm, state, q);
151
+ findNext(cm, rev);
152
+ }
153
+ } else {
154
+ dialog(cm, queryDialog, "Search for:", q, function(query) {
155
+ if (query && !state.query) cm.operation(function() {
156
+ startSearch(cm, state, query);
157
+ state.posFrom = state.posTo = cm.getCursor();
158
+ findNext(cm, rev);
159
+ });
160
+ });
161
+ }
162
+ }
163
+
164
+ function findNext(cm, rev, callback) {cm.operation(function() {
165
+ var state = getSearchState(cm);
166
+ var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo);
167
+ if (!cursor.find(rev)) {
168
+ cursor = getSearchCursor(cm, state.query, rev ? CodeMirror.Pos(cm.lastLine()) : CodeMirror.Pos(cm.firstLine(), 0));
169
+ if (!cursor.find(rev)) return;
170
+ }
171
+ cm.setSelection(cursor.from(), cursor.to());
172
+ cm.scrollIntoView({from: cursor.from(), to: cursor.to()}, 20);
173
+ state.posFrom = cursor.from(); state.posTo = cursor.to();
174
+ if (callback) callback(cursor.from(), cursor.to())
175
+ });}
176
+
177
+ function clearSearch(cm) {cm.operation(function() {
178
+ var state = getSearchState(cm);
179
+ state.lastQuery = state.query;
180
+ if (!state.query) return;
181
+ state.query = state.queryText = null;
182
+ cm.removeOverlay(state.overlay);
183
+ if (state.annotate) { state.annotate.clear(); state.annotate = null; }
184
+ });}
185
+
186
+ var replaceQueryDialog =
187
+ ' <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)</span>';
188
+ var replacementQueryDialog = 'With: <input type="text" style="width: 10em" class="CodeMirror-search-field"/>';
189
+ var doReplaceConfirm = "Replace? <button>Yes</button> <button>No</button> <button>All</button> <button>Stop</button>";
190
+
191
+ function replaceAll(cm, query, text) {
192
+ cm.operation(function() {
193
+ for (var cursor = getSearchCursor(cm, query); cursor.findNext();) {
194
+ if (typeof query != "string") {
195
+ var match = cm.getRange(cursor.from(), cursor.to()).match(query);
196
+ cursor.replace(text.replace(/\$(\d)/g, function(_, i) {return match[i];}));
197
+ } else cursor.replace(text);
198
+ }
199
+ });
200
+ }
201
+
202
+ function replace(cm, all) {
203
+ if (cm.getOption("readOnly")) return;
204
+ var query = cm.getSelection() || getSearchState(cm).lastQuery;
205
+ var dialogText = all ? "Replace all:" : "Replace:"
206
+ dialog(cm, dialogText + replaceQueryDialog, dialogText, query, function(query) {
207
+ if (!query) return;
208
+ query = parseQuery(query);
209
+ dialog(cm, replacementQueryDialog, "Replace with:", "", function(text) {
210
+ text = parseString(text)
211
+ if (all) {
212
+ replaceAll(cm, query, text)
213
+ } else {
214
+ clearSearch(cm);
215
+ var cursor = getSearchCursor(cm, query, cm.getCursor("from"));
216
+ var advance = function() {
217
+ var start = cursor.from(), match;
218
+ if (!(match = cursor.findNext())) {
219
+ cursor = getSearchCursor(cm, query);
220
+ if (!(match = cursor.findNext()) ||
221
+ (start && cursor.from().line == start.line && cursor.from().ch == start.ch)) return;
222
+ }
223
+ cm.setSelection(cursor.from(), cursor.to());
224
+ cm.scrollIntoView({from: cursor.from(), to: cursor.to()});
225
+ confirmDialog(cm, doReplaceConfirm, "Replace?",
226
+ [function() {doReplace(match);}, advance,
227
+ function() {replaceAll(cm, query, text)}]);
228
+ };
229
+ var doReplace = function(match) {
230
+ cursor.replace(typeof query == "string" ? text :
231
+ text.replace(/\$(\d)/g, function(_, i) {return match[i];}));
232
+ advance();
233
+ };
234
+ advance();
235
+ }
236
+ });
237
+ });
238
+ }
239
+
240
+ CodeMirror.commands.find = function(cm) {clearSearch(cm); doSearch(cm);};
241
+ CodeMirror.commands.findPersistent = function(cm) {clearSearch(cm); doSearch(cm, false, true);};
242
+ CodeMirror.commands.findPersistentNext = function(cm) {doSearch(cm, false, true, true);};
243
+ CodeMirror.commands.findPersistentPrev = function(cm) {doSearch(cm, true, true, true);};
244
+ CodeMirror.commands.findNext = doSearch;
245
+ CodeMirror.commands.findPrev = function(cm) {doSearch(cm, true);};
246
+ CodeMirror.commands.clearSearch = clearSearch;
247
+ CodeMirror.commands.replace = replace;
248
+ CodeMirror.commands.replaceAll = function(cm) {replace(cm, true);};
249
+ });
@@ -0,0 +1,189 @@
1
+ // CodeMirror, copyright (c) by Marijn Haverbeke and others
2
+ // Distributed under an MIT license: http://codemirror.net/LICENSE
3
+
4
+ (function(mod) {
5
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
6
+ mod(require("../../lib/codemirror"));
7
+ else if (typeof define == "function" && define.amd) // AMD
8
+ define(["../../lib/codemirror"], mod);
9
+ else // Plain browser env
10
+ mod(CodeMirror);
11
+ })(function(CodeMirror) {
12
+ "use strict";
13
+ var Pos = CodeMirror.Pos;
14
+
15
+ function SearchCursor(doc, query, pos, caseFold) {
16
+ this.atOccurrence = false; this.doc = doc;
17
+ if (caseFold == null && typeof query == "string") caseFold = false;
18
+
19
+ pos = pos ? doc.clipPos(pos) : Pos(0, 0);
20
+ this.pos = {from: pos, to: pos};
21
+
22
+ // The matches method is filled in based on the type of query.
23
+ // It takes a position and a direction, and returns an object
24
+ // describing the next occurrence of the query, or null if no
25
+ // more matches were found.
26
+ if (typeof query != "string") { // Regexp match
27
+ if (!query.global) query = new RegExp(query.source, query.ignoreCase ? "ig" : "g");
28
+ this.matches = function(reverse, pos) {
29
+ if (reverse) {
30
+ query.lastIndex = 0;
31
+ var line = doc.getLine(pos.line).slice(0, pos.ch), cutOff = 0, match, start;
32
+ for (;;) {
33
+ query.lastIndex = cutOff;
34
+ var newMatch = query.exec(line);
35
+ if (!newMatch) break;
36
+ match = newMatch;
37
+ start = match.index;
38
+ cutOff = match.index + (match[0].length || 1);
39
+ if (cutOff == line.length) break;
40
+ }
41
+ var matchLen = (match && match[0].length) || 0;
42
+ if (!matchLen) {
43
+ if (start == 0 && line.length == 0) {match = undefined;}
44
+ else if (start != doc.getLine(pos.line).length) {
45
+ matchLen++;
46
+ }
47
+ }
48
+ } else {
49
+ query.lastIndex = pos.ch;
50
+ var line = doc.getLine(pos.line), match = query.exec(line);
51
+ var matchLen = (match && match[0].length) || 0;
52
+ var start = match && match.index;
53
+ if (start + matchLen != line.length && !matchLen) matchLen = 1;
54
+ }
55
+ if (match && matchLen)
56
+ return {from: Pos(pos.line, start),
57
+ to: Pos(pos.line, start + matchLen),
58
+ match: match};
59
+ };
60
+ } else { // String query
61
+ var origQuery = query;
62
+ if (caseFold) query = query.toLowerCase();
63
+ var fold = caseFold ? function(str){return str.toLowerCase();} : function(str){return str;};
64
+ var target = query.split("\n");
65
+ // Different methods for single-line and multi-line queries
66
+ if (target.length == 1) {
67
+ if (!query.length) {
68
+ // Empty string would match anything and never progress, so
69
+ // we define it to match nothing instead.
70
+ this.matches = function() {};
71
+ } else {
72
+ this.matches = function(reverse, pos) {
73
+ if (reverse) {
74
+ var orig = doc.getLine(pos.line).slice(0, pos.ch), line = fold(orig);
75
+ var match = line.lastIndexOf(query);
76
+ if (match > -1) {
77
+ match = adjustPos(orig, line, match);
78
+ return {from: Pos(pos.line, match), to: Pos(pos.line, match + origQuery.length)};
79
+ }
80
+ } else {
81
+ var orig = doc.getLine(pos.line).slice(pos.ch), line = fold(orig);
82
+ var match = line.indexOf(query);
83
+ if (match > -1) {
84
+ match = adjustPos(orig, line, match) + pos.ch;
85
+ return {from: Pos(pos.line, match), to: Pos(pos.line, match + origQuery.length)};
86
+ }
87
+ }
88
+ };
89
+ }
90
+ } else {
91
+ var origTarget = origQuery.split("\n");
92
+ this.matches = function(reverse, pos) {
93
+ var last = target.length - 1;
94
+ if (reverse) {
95
+ if (pos.line - (target.length - 1) < doc.firstLine()) return;
96
+ if (fold(doc.getLine(pos.line).slice(0, origTarget[last].length)) != target[target.length - 1]) return;
97
+ var to = Pos(pos.line, origTarget[last].length);
98
+ for (var ln = pos.line - 1, i = last - 1; i >= 1; --i, --ln)
99
+ if (target[i] != fold(doc.getLine(ln))) return;
100
+ var line = doc.getLine(ln), cut = line.length - origTarget[0].length;
101
+ if (fold(line.slice(cut)) != target[0]) return;
102
+ return {from: Pos(ln, cut), to: to};
103
+ } else {
104
+ if (pos.line + (target.length - 1) > doc.lastLine()) return;
105
+ var line = doc.getLine(pos.line), cut = line.length - origTarget[0].length;
106
+ if (fold(line.slice(cut)) != target[0]) return;
107
+ var from = Pos(pos.line, cut);
108
+ for (var ln = pos.line + 1, i = 1; i < last; ++i, ++ln)
109
+ if (target[i] != fold(doc.getLine(ln))) return;
110
+ if (fold(doc.getLine(ln).slice(0, origTarget[last].length)) != target[last]) return;
111
+ return {from: from, to: Pos(ln, origTarget[last].length)};
112
+ }
113
+ };
114
+ }
115
+ }
116
+ }
117
+
118
+ SearchCursor.prototype = {
119
+ findNext: function() {return this.find(false);},
120
+ findPrevious: function() {return this.find(true);},
121
+
122
+ find: function(reverse) {
123
+ var self = this, pos = this.doc.clipPos(reverse ? this.pos.from : this.pos.to);
124
+ function savePosAndFail(line) {
125
+ var pos = Pos(line, 0);
126
+ self.pos = {from: pos, to: pos};
127
+ self.atOccurrence = false;
128
+ return false;
129
+ }
130
+
131
+ for (;;) {
132
+ if (this.pos = this.matches(reverse, pos)) {
133
+ this.atOccurrence = true;
134
+ return this.pos.match || true;
135
+ }
136
+ if (reverse) {
137
+ if (!pos.line) return savePosAndFail(0);
138
+ pos = Pos(pos.line-1, this.doc.getLine(pos.line-1).length);
139
+ }
140
+ else {
141
+ var maxLine = this.doc.lineCount();
142
+ if (pos.line == maxLine - 1) return savePosAndFail(maxLine);
143
+ pos = Pos(pos.line + 1, 0);
144
+ }
145
+ }
146
+ },
147
+
148
+ from: function() {if (this.atOccurrence) return this.pos.from;},
149
+ to: function() {if (this.atOccurrence) return this.pos.to;},
150
+
151
+ replace: function(newText, origin) {
152
+ if (!this.atOccurrence) return;
153
+ var lines = CodeMirror.splitLines(newText);
154
+ this.doc.replaceRange(lines, this.pos.from, this.pos.to, origin);
155
+ this.pos.to = Pos(this.pos.from.line + lines.length - 1,
156
+ lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0));
157
+ }
158
+ };
159
+
160
+ // Maps a position in a case-folded line back to a position in the original line
161
+ // (compensating for codepoints increasing in number during folding)
162
+ function adjustPos(orig, folded, pos) {
163
+ if (orig.length == folded.length) return pos;
164
+ for (var pos1 = Math.min(pos, orig.length);;) {
165
+ var len1 = orig.slice(0, pos1).toLowerCase().length;
166
+ if (len1 < pos) ++pos1;
167
+ else if (len1 > pos) --pos1;
168
+ else return pos1;
169
+ }
170
+ }
171
+
172
+ CodeMirror.defineExtension("getSearchCursor", function(query, pos, caseFold) {
173
+ return new SearchCursor(this.doc, query, pos, caseFold);
174
+ });
175
+ CodeMirror.defineDocExtension("getSearchCursor", function(query, pos, caseFold) {
176
+ return new SearchCursor(this, query, pos, caseFold);
177
+ });
178
+
179
+ CodeMirror.defineExtension("selectMatches", function(query, caseFold) {
180
+ var ranges = [];
181
+ var cur = this.getSearchCursor(query, this.getCursor("from"), caseFold);
182
+ while (cur.findNext()) {
183
+ if (CodeMirror.cmpPos(cur.to(), this.getCursor("to")) > 0) break;
184
+ ranges.push({anchor: cur.from(), head: cur.to()});
185
+ }
186
+ if (ranges.length)
187
+ this.setSelections(ranges, 0);
188
+ });
189
+ });