@actualwave/react-native-codeditor 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +790 -0
  3. package/app.plugin.js +133 -0
  4. package/lib/module/BlockingView.js +25 -0
  5. package/lib/module/CodeEditor.js +239 -0
  6. package/lib/module/EditorAPI.js +2 -0
  7. package/lib/module/WebViewAPI.js +133 -0
  8. package/lib/module/index.js +6 -0
  9. package/lib/module/package.json +1 -0
  10. package/lib/typescript/app.plugin.d.ts +3 -0
  11. package/lib/typescript/babel.config.d.ts +10 -0
  12. package/lib/typescript/package.json +1 -0
  13. package/lib/typescript/react-native.config.d.ts +2 -0
  14. package/lib/typescript/scripts/copy-assets.d.ts +2 -0
  15. package/lib/typescript/src/BlockingView.d.ts +3 -0
  16. package/lib/typescript/src/CodeEditor.d.ts +33 -0
  17. package/lib/typescript/src/EditorAPI.d.ts +66 -0
  18. package/lib/typescript/src/WebViewAPI.d.ts +46 -0
  19. package/lib/typescript/src/index.d.ts +7 -0
  20. package/package.json +106 -0
  21. package/react-native.config.js +3 -0
  22. package/src/assets/codemirror/@actualwave_codemirror-lang-sksl.js +15 -0
  23. package/src/assets/codemirror/@babel_runtime_helpers_interopRequireDefault.js +1 -0
  24. package/src/assets/codemirror/@babel_runtime_helpers_objectSpread2.js +1 -0
  25. package/src/assets/codemirror/@babel_runtime_helpers_toConsumableArray.js +1 -0
  26. package/src/assets/codemirror/@codemirror_autocomplete.js +206 -0
  27. package/src/assets/codemirror/@codemirror_collab.js +31 -0
  28. package/src/assets/codemirror/@codemirror_commands.js +411 -0
  29. package/src/assets/codemirror/@codemirror_lang-angular.js +7 -0
  30. package/src/assets/codemirror/@codemirror_lang-cpp.js +7 -0
  31. package/src/assets/codemirror/@codemirror_lang-css.js +14 -0
  32. package/src/assets/codemirror/@codemirror_lang-go.js +13 -0
  33. package/src/assets/codemirror/@codemirror_lang-html.js +20 -0
  34. package/src/assets/codemirror/@codemirror_lang-java.js +7 -0
  35. package/src/assets/codemirror/@codemirror_lang-javascript.js +54 -0
  36. package/src/assets/codemirror/@codemirror_lang-jinja.js +15 -0
  37. package/src/assets/codemirror/@codemirror_lang-json.js +10 -0
  38. package/src/assets/codemirror/@codemirror_lang-less.js +10 -0
  39. package/src/assets/codemirror/@codemirror_lang-lezer.js +7 -0
  40. package/src/assets/codemirror/@codemirror_lang-liquid.js +15 -0
  41. package/src/assets/codemirror/@codemirror_lang-markdown.js +55 -0
  42. package/src/assets/codemirror/@codemirror_lang-php.js +7 -0
  43. package/src/assets/codemirror/@codemirror_lang-python.js +19 -0
  44. package/src/assets/codemirror/@codemirror_lang-rust.js +7 -0
  45. package/src/assets/codemirror/@codemirror_lang-sass.js +10 -0
  46. package/src/assets/codemirror/@codemirror_lang-sql.js +52 -0
  47. package/src/assets/codemirror/@codemirror_lang-vue.js +6 -0
  48. package/src/assets/codemirror/@codemirror_lang-wast.js +2 -0
  49. package/src/assets/codemirror/@codemirror_lang-xml.js +13 -0
  50. package/src/assets/codemirror/@codemirror_lang-yaml.js +13 -0
  51. package/src/assets/codemirror/@codemirror_language-data.js +5 -0
  52. package/src/assets/codemirror/@codemirror_language.js +524 -0
  53. package/src/assets/codemirror/@codemirror_legacy-modes_mode_apl.js +1 -0
  54. package/src/assets/codemirror/@codemirror_legacy-modes_mode_asciiarmor.js +1 -0
  55. package/src/assets/codemirror/@codemirror_legacy-modes_mode_asn1.js +3 -0
  56. package/src/assets/codemirror/@codemirror_legacy-modes_mode_asterisk.js +9 -0
  57. package/src/assets/codemirror/@codemirror_legacy-modes_mode_brainfuck.js +13 -0
  58. package/src/assets/codemirror/@codemirror_legacy-modes_mode_clike.js +31 -0
  59. package/src/assets/codemirror/@codemirror_legacy-modes_mode_clojure.js +5 -0
  60. package/src/assets/codemirror/@codemirror_legacy-modes_mode_cmake.js +6 -0
  61. package/src/assets/codemirror/@codemirror_legacy-modes_mode_cobol.js +7 -0
  62. package/src/assets/codemirror/@codemirror_legacy-modes_mode_coffeescript.js +14 -0
  63. package/src/assets/codemirror/@codemirror_legacy-modes_mode_commonlisp.js +1 -0
  64. package/src/assets/codemirror/@codemirror_legacy-modes_mode_crystal.js +18 -0
  65. package/src/assets/codemirror/@codemirror_legacy-modes_mode_css.js +5 -0
  66. package/src/assets/codemirror/@codemirror_legacy-modes_mode_cypher.js +1 -0
  67. package/src/assets/codemirror/@codemirror_legacy-modes_mode_d.js +2 -0
  68. package/src/assets/codemirror/@codemirror_legacy-modes_mode_diff.js +1 -0
  69. package/src/assets/codemirror/@codemirror_legacy-modes_mode_dockerfile.js +9 -0
  70. package/src/assets/codemirror/@codemirror_legacy-modes_mode_dtd.js +3 -0
  71. package/src/assets/codemirror/@codemirror_legacy-modes_mode_dylan.js +35 -0
  72. package/src/assets/codemirror/@codemirror_legacy-modes_mode_ebnf.js +9 -0
  73. package/src/assets/codemirror/@codemirror_legacy-modes_mode_ecl.js +3 -0
  74. package/src/assets/codemirror/@codemirror_legacy-modes_mode_eiffel.js +1 -0
  75. package/src/assets/codemirror/@codemirror_legacy-modes_mode_elm.js +3 -0
  76. package/src/assets/codemirror/@codemirror_legacy-modes_mode_erlang.js +52 -0
  77. package/src/assets/codemirror/@codemirror_legacy-modes_mode_factor.js +14 -0
  78. package/src/assets/codemirror/@codemirror_legacy-modes_mode_fcl.js +2 -0
  79. package/src/assets/codemirror/@codemirror_legacy-modes_mode_forth.js +5 -0
  80. package/src/assets/codemirror/@codemirror_legacy-modes_mode_fortran.js +2 -0
  81. package/src/assets/codemirror/@codemirror_legacy-modes_mode_gas.js +13 -0
  82. package/src/assets/codemirror/@codemirror_legacy-modes_mode_gherkin.js +5 -0
  83. package/src/assets/codemirror/@codemirror_legacy-modes_mode_go.js +2 -0
  84. package/src/assets/codemirror/@codemirror_legacy-modes_mode_groovy.js +3 -0
  85. package/src/assets/codemirror/@codemirror_legacy-modes_mode_haskell.js +5 -0
  86. package/src/assets/codemirror/@codemirror_legacy-modes_mode_haxe.js +12 -0
  87. package/src/assets/codemirror/@codemirror_legacy-modes_mode_http.js +1 -0
  88. package/src/assets/codemirror/@codemirror_legacy-modes_mode_idl.js +7 -0
  89. package/src/assets/codemirror/@codemirror_legacy-modes_mode_javascript.js +23 -0
  90. package/src/assets/codemirror/@codemirror_legacy-modes_mode_jinja2.js +8 -0
  91. package/src/assets/codemirror/@codemirror_legacy-modes_mode_julia.js +17 -0
  92. package/src/assets/codemirror/@codemirror_legacy-modes_mode_livescript.js +1 -0
  93. package/src/assets/codemirror/@codemirror_legacy-modes_mode_lua.js +2 -0
  94. package/src/assets/codemirror/@codemirror_legacy-modes_mode_mathematica.js +26 -0
  95. package/src/assets/codemirror/@codemirror_legacy-modes_mode_mbox.js +11 -0
  96. package/src/assets/codemirror/@codemirror_legacy-modes_mode_mirc.js +1 -0
  97. package/src/assets/codemirror/@codemirror_legacy-modes_mode_mllike.js +8 -0
  98. package/src/assets/codemirror/@codemirror_legacy-modes_mode_modelica.js +12 -0
  99. package/src/assets/codemirror/@codemirror_legacy-modes_mode_mscgen.js +3 -0
  100. package/src/assets/codemirror/@codemirror_legacy-modes_mode_mumps.js +16 -0
  101. package/src/assets/codemirror/@codemirror_legacy-modes_mode_nginx.js +1 -0
  102. package/src/assets/codemirror/@codemirror_legacy-modes_mode_nsis.js +20 -0
  103. package/src/assets/codemirror/@codemirror_legacy-modes_mode_ntriples.js +1 -0
  104. package/src/assets/codemirror/@codemirror_legacy-modes_mode_octave.js +8 -0
  105. package/src/assets/codemirror/@codemirror_legacy-modes_mode_oz.js +17 -0
  106. package/src/assets/codemirror/@codemirror_legacy-modes_mode_pascal.js +2 -0
  107. package/src/assets/codemirror/@codemirror_legacy-modes_mode_pegjs.js +25 -0
  108. package/src/assets/codemirror/@codemirror_legacy-modes_mode_perl.js +247 -0
  109. package/src/assets/codemirror/@codemirror_legacy-modes_mode_pig.js +6 -0
  110. package/src/assets/codemirror/@codemirror_legacy-modes_mode_powershell.js +7 -0
  111. package/src/assets/codemirror/@codemirror_legacy-modes_mode_properties.js +5 -0
  112. package/src/assets/codemirror/@codemirror_legacy-modes_mode_protobuf.js +7 -0
  113. package/src/assets/codemirror/@codemirror_legacy-modes_mode_pug.js +24 -0
  114. package/src/assets/codemirror/@codemirror_legacy-modes_mode_puppet.js +42 -0
  115. package/src/assets/codemirror/@codemirror_legacy-modes_mode_python.js +15 -0
  116. package/src/assets/codemirror/@codemirror_legacy-modes_mode_q.js +2 -0
  117. package/src/assets/codemirror/@codemirror_legacy-modes_mode_r.js +1 -0
  118. package/src/assets/codemirror/@codemirror_legacy-modes_mode_rpm.js +9 -0
  119. package/src/assets/codemirror/@codemirror_legacy-modes_mode_ruby.js +4 -0
  120. package/src/assets/codemirror/@codemirror_legacy-modes_mode_rust.js +5 -0
  121. package/src/assets/codemirror/@codemirror_legacy-modes_mode_sas.js +23 -0
  122. package/src/assets/codemirror/@codemirror_legacy-modes_mode_sass.js +26 -0
  123. package/src/assets/codemirror/@codemirror_legacy-modes_mode_scheme.js +14 -0
  124. package/src/assets/codemirror/@codemirror_legacy-modes_mode_shell.js +1 -0
  125. package/src/assets/codemirror/@codemirror_legacy-modes_mode_sieve.js +7 -0
  126. package/src/assets/codemirror/@codemirror_legacy-modes_mode_simple-mode.js +1 -0
  127. package/src/assets/codemirror/@codemirror_legacy-modes_mode_smalltalk.js +1 -0
  128. package/src/assets/codemirror/@codemirror_legacy-modes_mode_solr.js +1 -0
  129. package/src/assets/codemirror/@codemirror_legacy-modes_mode_sparql.js +1 -0
  130. package/src/assets/codemirror/@codemirror_legacy-modes_mode_spreadsheet.js +6 -0
  131. package/src/assets/codemirror/@codemirror_legacy-modes_mode_sql.js +84 -0
  132. package/src/assets/codemirror/@codemirror_legacy-modes_mode_stex.js +11 -0
  133. package/src/assets/codemirror/@codemirror_legacy-modes_mode_stylus.js +45 -0
  134. package/src/assets/codemirror/@codemirror_legacy-modes_mode_swift.js +2 -0
  135. package/src/assets/codemirror/@codemirror_legacy-modes_mode_tcl.js +1 -0
  136. package/src/assets/codemirror/@codemirror_legacy-modes_mode_textile.js +2 -0
  137. package/src/assets/codemirror/@codemirror_legacy-modes_mode_tiddlywiki.js +33 -0
  138. package/src/assets/codemirror/@codemirror_legacy-modes_mode_tiki.js +20 -0
  139. package/src/assets/codemirror/@codemirror_legacy-modes_mode_toml.js +4 -0
  140. package/src/assets/codemirror/@codemirror_legacy-modes_mode_troff.js +1 -0
  141. package/src/assets/codemirror/@codemirror_legacy-modes_mode_ttcn-cfg.js +3 -0
  142. package/src/assets/codemirror/@codemirror_legacy-modes_mode_ttcn.js +3 -0
  143. package/src/assets/codemirror/@codemirror_legacy-modes_mode_turtle.js +1 -0
  144. package/src/assets/codemirror/@codemirror_legacy-modes_mode_vb.js +11 -0
  145. package/src/assets/codemirror/@codemirror_legacy-modes_mode_vbscript.js +26 -0
  146. package/src/assets/codemirror/@codemirror_legacy-modes_mode_velocity.js +15 -0
  147. package/src/assets/codemirror/@codemirror_legacy-modes_mode_verilog.js +67 -0
  148. package/src/assets/codemirror/@codemirror_legacy-modes_mode_vhdl.js +2 -0
  149. package/src/assets/codemirror/@codemirror_legacy-modes_mode_wast.js +7 -0
  150. package/src/assets/codemirror/@codemirror_legacy-modes_mode_webidl.js +25 -0
  151. package/src/assets/codemirror/@codemirror_legacy-modes_mode_xml.js +6 -0
  152. package/src/assets/codemirror/@codemirror_legacy-modes_mode_xquery.js +51 -0
  153. package/src/assets/codemirror/@codemirror_legacy-modes_mode_yacas.js +16 -0
  154. package/src/assets/codemirror/@codemirror_legacy-modes_mode_yaml.js +1 -0
  155. package/src/assets/codemirror/@codemirror_legacy-modes_mode_z80.js +1 -0
  156. package/src/assets/codemirror/@codemirror_lint.js +46 -0
  157. package/src/assets/codemirror/@codemirror_merge.js +167 -0
  158. package/src/assets/codemirror/@codemirror_search.js +121 -0
  159. package/src/assets/codemirror/@codemirror_state.js +793 -0
  160. package/src/assets/codemirror/@codemirror_theme-one-dark.js +12 -0
  161. package/src/assets/codemirror/@codemirror_view.js +1210 -0
  162. package/src/assets/codemirror/@lezer_common.js +407 -0
  163. package/src/assets/codemirror/@lezer_cpp.js +4 -0
  164. package/src/assets/codemirror/@lezer_css.js +4 -0
  165. package/src/assets/codemirror/@lezer_go.js +3 -0
  166. package/src/assets/codemirror/@lezer_highlight.js +380 -0
  167. package/src/assets/codemirror/@lezer_html.js +20 -0
  168. package/src/assets/codemirror/@lezer_java.js +2 -0
  169. package/src/assets/codemirror/@lezer_javascript.js +7 -0
  170. package/src/assets/codemirror/@lezer_json.js +2 -0
  171. package/src/assets/codemirror/@lezer_lezer.js +2 -0
  172. package/src/assets/codemirror/@lezer_lr.js +325 -0
  173. package/src/assets/codemirror/@lezer_markdown.js +286 -0
  174. package/src/assets/codemirror/@lezer_php.js +3 -0
  175. package/src/assets/codemirror/@lezer_python.js +5 -0
  176. package/src/assets/codemirror/@lezer_rust.js +3 -0
  177. package/src/assets/codemirror/@lezer_sass.js +5 -0
  178. package/src/assets/codemirror/@lezer_xml.js +3 -0
  179. package/src/assets/codemirror/@lezer_yaml.js +12 -0
  180. package/src/assets/codemirror/@marijn_find-cluster-break.js +10 -0
  181. package/src/assets/codemirror/@uiw_codemirror-theme-androidstudio.js +3 -0
  182. package/src/assets/codemirror/@uiw_codemirror-theme-andromeda.js +1 -0
  183. package/src/assets/codemirror/@uiw_codemirror-theme-atomone.js +6 -0
  184. package/src/assets/codemirror/@uiw_codemirror-theme-aura.js +1 -0
  185. package/src/assets/codemirror/@uiw_codemirror-theme-basic.js +1 -0
  186. package/src/assets/codemirror/@uiw_codemirror-theme-bbedit.js +1 -0
  187. package/src/assets/codemirror/@uiw_codemirror-theme-copilot.js +1 -0
  188. package/src/assets/codemirror/@uiw_codemirror-theme-darcula.js +6 -0
  189. package/src/assets/codemirror/@uiw_codemirror-theme-dracula.js +6 -0
  190. package/src/assets/codemirror/@uiw_codemirror-theme-duotone.js +5 -0
  191. package/src/assets/codemirror/@uiw_codemirror-theme-eclipse.js +1 -0
  192. package/src/assets/codemirror/@uiw_codemirror-theme-github.js +3 -0
  193. package/src/assets/codemirror/@uiw_codemirror-theme-material.js +1 -0
  194. package/src/assets/codemirror/@uiw_codemirror-theme-monokai.js +1 -0
  195. package/src/assets/codemirror/@uiw_codemirror-theme-nord.js +2 -0
  196. package/src/assets/codemirror/@uiw_codemirror-theme-okaidia.js +2 -0
  197. package/src/assets/codemirror/@uiw_codemirror-theme-solarized.js +1 -0
  198. package/src/assets/codemirror/@uiw_codemirror-theme-sublime.js +2 -0
  199. package/src/assets/codemirror/@uiw_codemirror-theme-tokyo-night.js +1 -0
  200. package/src/assets/codemirror/@uiw_codemirror-theme-vscode.js +5 -0
  201. package/src/assets/codemirror/@uiw_codemirror-theme-xcode.js +3 -0
  202. package/src/assets/codemirror/@uiw_codemirror-themes.js +1 -0
  203. package/src/assets/codemirror/_core.js +4494 -0
  204. package/src/assets/codemirror/codemirror.js +46 -0
  205. package/src/assets/codemirror/crelt.js +1 -0
  206. package/src/assets/codemirror/style-mod.js +36 -0
  207. package/src/assets/codemirror/w3c-keyname.js +8 -0
  208. package/src/assets/codemirror-editor.umd.js +415 -0
  209. package/src/assets/editor.html +377 -0
  210. package/src/assets/webview-interface.umd.js +2 -0
@@ -0,0 +1,167 @@
1
+ async function moduleInitFunction(requireAsyncModule,exports={}){const module={exports:exports};var hasRequiredDist,require$$0=await requireAsyncModule("@codemirror/view"),require$$1=await requireAsyncModule("@codemirror/state"),require$$2=await requireAsyncModule("style-mod"),require$$3=await requireAsyncModule("@codemirror/language"),require$$4=await requireAsyncModule("@lezer/highlight"),dist={},distExports=function requireDist(){function findDiff(a,fromA,toA,b,fromB,toB){if(a==b)return[];// Remove identical prefix and suffix
2
+ let prefix=commonPrefix(a,fromA,toA,b,fromB,toB),suffix=commonSuffix(a,fromA+prefix,toA,b,fromB+prefix,toB);fromA+=prefix,toA-=suffix,fromB+=prefix,toB-=suffix;let lenA=toA-fromA,lenB=toB-fromB;// Nothing left in one of them
3
+ if(!lenA||!lenB)return[new Change(fromA,toA,fromB,toB)];// Try to find one string in the other to cover cases with just 2
4
+ // deletions/insertions.
5
+ if(lenA>lenB){let found=a.slice(fromA,toA).indexOf(b.slice(fromB,toB));if(-1<found)return[new Change(fromA,fromA+found,fromB,fromB),new Change(fromA+found+lenB,toA,toB,toB)]}else if(lenB>lenA){let found=b.slice(fromB,toB).indexOf(a.slice(fromA,toA));if(-1<found)return[new Change(fromA,fromA,fromB,fromB+found),new Change(toA,toA,fromB+found+lenA,toB)]}// Only one character left on one side, does not occur in other
6
+ // string.
7
+ if(1==lenA||1==lenB)return[new Change(fromA,toA,fromB,toB)];// Try to split the problem in two by finding a substring of one of
8
+ // the strings in the other.
9
+ let half=halfMatch(a,fromA,toA,b,fromB,toB);if(half){let[sharedA,sharedB,sharedLen]=half;return findDiff(a,fromA,sharedA,b,fromB,sharedB).concat(findDiff(a,sharedA+sharedLen,toA,b,sharedB+sharedLen,toB))}// Fall back to more expensive general search for a shared
10
+ // subsequence.
11
+ return findSnake(a,fromA,toA,b,fromB,toB)}// Implementation of Myers 1986 "An O(ND) Difference Algorithm and Its Variations"
12
+ function findSnake(a,fromA,toA,b,fromB,toB){let lenA=toA-fromA,lenB=toB-fromB;if(1e9>scanLimit&&Math.min(lenA,lenB)>16*scanLimit||0<timeout&&Date.now()>timeout)return Math.min(lenA,lenB)>64*scanLimit?[new Change(fromA,toA,fromB,toB)]:crudeMatch(a,fromA,toA,b,fromB,toB);let off=Math.ceil((lenA+lenB)/2);frontier1.reset(off),frontier2.reset(off);let match1=(x,y)=>a.charCodeAt(fromA+x)==b.charCodeAt(fromB+y),match2=(x,y)=>a.charCodeAt(toA-x-1)==b.charCodeAt(toB-y-1),test1=0==(lenA-lenB)%2?null:frontier2,test2=test1?null:frontier1;for(let depth=0;depth<off;depth++){if(depth>scanLimit||0<timeout&&!(63&depth)&&Date.now()>timeout)return crudeMatch(a,fromA,toA,b,fromB,toB);let done=frontier1.advance(depth,lenA,lenB,off,test1,!1,match1)||frontier2.advance(depth,lenA,lenB,off,test2,!0,match2);if(done)return bisect(a,fromA,toA,fromA+done[0],b,fromB,toB,fromB+done[1])}// No commonality at all.
13
+ return[new Change(fromA,toA,fromB,toB)]}// Given a position in both strings, recursively call `findDiff` with
14
+ // the sub-problems before and after that position. Make sure cut
15
+ // points lie on character boundaries.
16
+ function bisect(a,fromA,toA,splitA,b,fromB,toB,splitB){let stop=!1;return validIndex(a,splitA)||++splitA!=toA||(stop=!0),validIndex(b,splitB)||++splitB!=toB||(stop=!0),stop?[new Change(fromA,toA,fromB,toB)]:findDiff(a,fromA,splitA,b,fromB,splitB).concat(findDiff(a,splitA,toA,b,splitB,toB))}function chunkSize(lenA,lenB){let size=1,max=Math.min(lenA,lenB);for(;size<max;)size<<=1;return size}// Common prefix length of the given ranges. Because string comparison
17
+ // is so much faster than a JavaScript by-character loop, this
18
+ // compares whole chunks at a time.
19
+ function commonPrefix(a,fromA,toA,b,fromB,toB){if(fromA==toA||fromA==toB||a.charCodeAt(fromA)!=b.charCodeAt(fromB))return 0;let chunk=chunkSize(toA-fromA,toB-fromB);for(let pA=fromA,pB=fromB;;){let endA=pA+chunk,endB=pB+chunk;if(endA>toA||endB>toB||a.slice(pA,endA)!=b.slice(pB,endB)){if(1==chunk)return pA-fromA-(validIndex(a,pA)?0:1);chunk>>=1}else{if(endA==toA||endB==toB)return endA-fromA;pA=endA,pB=endB}}}// Common suffix length
20
+ function commonSuffix(a,fromA,toA,b,fromB,toB){if(fromA==toA||fromB==toB||a.charCodeAt(toA-1)!=b.charCodeAt(toB-1))return 0;let chunk=chunkSize(toA-fromA,toB-fromB);for(let pA=toA,pB=toB;;){let sA=pA-chunk,sB=pB-chunk;if(sA<fromA||sB<fromB||a.slice(sA,pA)!=b.slice(sB,pB)){if(1==chunk)return toA-pA-(validIndex(a,pA)?0:1);chunk>>=1}else{if(sA==fromA||sB==fromB)return toA-sA;pA=sA,pB=sB}}}// a assumed to be be longer than b
21
+ function findMatch(a,fromA,toA,b,fromB,toB,size,divideTo){let rangeB=b.slice(fromB,toB),best=null;// Try some substrings of A of length `size` and see if they exist
22
+ // in B.
23
+ for(;;){if(best||size<divideTo)return best;for(let start=fromA+size;;){validIndex(a,start)||start++;let end=start+size;if(validIndex(a,end)||(end+=end==start+1?1:-1),end>=toA)break;let seed=a.slice(start,end),found=-1;for(;-1!=(found=rangeB.indexOf(seed,found+1));){let prefixAfter=commonPrefix(a,end,toA,b,fromB+found+seed.length,toB),suffixBefore=commonSuffix(a,fromA,start,b,fromB,fromB+found),length=seed.length+prefixAfter+suffixBefore;(!best||best[2]<length)&&(best=[start-suffixBefore,fromB+found-suffixBefore,length])}start=end}if(0>divideTo)return best;size>>=1}}// Find a shared substring that is at least half the length of the
24
+ // longer range. Returns an array describing the substring [startA,
25
+ // startB, len], or null.
26
+ function halfMatch(a,fromA,toA,b,fromB,toB){let lenA=toA-fromA,lenB=toB-fromB;if(lenA<lenB){let result=halfMatch(b,fromB,toB,a,fromA,toA);return result&&[result[1],result[0],result[2]]}// From here a is known to be at least as long as b
27
+ return 4>lenA||2*lenB<lenA?null:findMatch(a,fromA,toA,b,fromB,toB,Math.floor(lenA/4),-1)}function crudeMatch(a,fromA,toA,b,fromB,toB){crude=!0;let result,lenA=toA-fromA,lenB=toB-fromB;if(lenA<lenB){let inv=findMatch(b,fromB,toB,a,fromA,toA,Math.floor(lenA/6),50);result=inv&&[inv[1],inv[0],inv[2]]}else result=findMatch(a,fromA,toA,b,fromB,toB,Math.floor(lenB/6),50);if(!result)return[new Change(fromA,toA,fromB,toB)];let[sharedA,sharedB,sharedLen]=result;return findDiff(a,fromA,sharedA,b,fromB,sharedB).concat(findDiff(a,sharedA+sharedLen,toA,b,sharedB+sharedLen,toB))}function mergeAdjacent(changes,minGap){for(let i=1;i<changes.length;i++){let prev=changes[i-1],cur=changes[i];prev.toA>cur.fromA-minGap&&prev.toB>cur.fromB-minGap&&(changes[i-1]=new Change(prev.fromA,cur.toA,prev.fromB,cur.toB),changes.splice(i--,1))}}// Reorder and merge changes
28
+ function normalize(a,b,changes){for(;;){mergeAdjacent(changes,1);let moved=!1;// Move unchanged ranges that can be fully moved across an
29
+ // adjacent insertion/deletion, to simplify the diff.
30
+ for(let i=0;i<changes.length;i++){let pre,post,ch=changes[i];// The half-match heuristic sometimes produces non-minimal
31
+ // diffs. Strip matching pre- and post-fixes again here.
32
+ (pre=commonPrefix(a,ch.fromA,ch.toA,b,ch.fromB,ch.toB))&&(ch=changes[i]=new Change(ch.fromA+pre,ch.toA,ch.fromB+pre,ch.toB)),(post=commonSuffix(a,ch.fromA,ch.toA,b,ch.fromB,ch.toB))&&(ch=changes[i]=new Change(ch.fromA,ch.toA-post,ch.fromB,ch.toB-post));let lenA=ch.toA-ch.fromA,lenB=ch.toB-ch.fromB;// Only look at plain insertions/deletions
33
+ if(lenA&&lenB)continue;let beforeLen=ch.fromA-(i?changes[i-1].toA:0),afterLen=(i<changes.length-1?changes[i+1].fromA:a.length)-ch.toA;if(!beforeLen||!afterLen)continue;let text=lenA?a.slice(ch.fromA,ch.toA):b.slice(ch.fromB,ch.toB);beforeLen<=text.length&&a.slice(ch.fromA-beforeLen,ch.fromA)==text.slice(text.length-beforeLen)?(changes[i]=new Change(ch.fromA-beforeLen,ch.toA-beforeLen,ch.fromB-beforeLen,ch.toB-beforeLen),moved=!0):afterLen<=text.length&&a.slice(ch.toA,ch.toA+afterLen)==text.slice(0,afterLen)&&(changes[i]=new Change(ch.fromA+afterLen,ch.toA+afterLen,ch.fromB+afterLen,ch.toB+afterLen),moved=!0)}if(!moved)break}return changes}// Process a change set to make it suitable for presenting to users.
34
+ function makePresentable(changes,a,b){for(let posA=0,i=0;i<changes.length;i++){let change=changes[i],lenA=change.toA-change.fromA,lenB=change.toB-change.fromB;// Don't touch short insertions or deletions.
35
+ if(lenA&&lenB||3<lenA||3<lenB){let nextChangeA=i==changes.length-1?a.length:changes[i+1].fromA,maxScanBefore=change.fromA-posA,maxScanAfter=nextChangeA-change.toA,boundBefore=findWordBoundaryBefore(a,change.fromA,maxScanBefore),boundAfter=findWordBoundaryAfter(a,change.toA,maxScanAfter),lenBefore=change.fromA-boundBefore,lenAfter=boundAfter-change.toA;// An insertion or deletion that falls inside words on both
36
+ // sides can maybe be moved to align with word boundaries.
37
+ if((!lenA||!lenB)&&lenBefore&&lenAfter){let changeLen=Math.max(lenA,lenB),[changeText,changeFrom,changeTo]=lenA?[a,change.fromA,change.toA]:[b,change.fromB,change.toB];changeLen>lenBefore&&a.slice(boundBefore,change.fromA)==changeText.slice(changeTo-lenBefore,changeTo)?(change=changes[i]=new Change(boundBefore,boundBefore+lenA,change.fromB-lenBefore,change.toB-lenBefore),boundBefore=change.fromA,boundAfter=findWordBoundaryAfter(a,change.toA,nextChangeA-change.toA)):changeLen>lenAfter&&a.slice(change.toA,boundAfter)==changeText.slice(changeFrom,changeFrom+lenAfter)&&(change=changes[i]=new Change(boundAfter-lenA,boundAfter,change.fromB+lenAfter,change.toB+lenAfter),boundAfter=change.toA,boundBefore=findWordBoundaryBefore(a,change.fromA,change.fromA-posA)),lenBefore=change.fromA-boundBefore,lenAfter=boundAfter-change.toA}if(lenBefore||lenAfter)change=changes[i]=new Change(change.fromA-lenBefore,change.toA+lenAfter,change.fromB-lenBefore,change.toB+lenAfter);else if(!lenA){// Align insertion to line boundary, when possible
38
+ let len,first=findLineBreakAfter(b,change.fromB,change.toB),last=0>first?-1:findLineBreakBefore(b,change.toB,change.fromB);-1<first&&(len=first-change.fromB)<=maxScanAfter&&b.slice(change.fromB,first)==b.slice(change.toB,change.toB+len)?change=changes[i]=change.offset(len):-1<last&&(len=change.toB-last)<=maxScanBefore&&b.slice(change.fromB-len,change.fromB)==b.slice(last,change.toB)&&(change=changes[i]=change.offset(-len))}else if(!lenB){// Align deletion to line boundary
39
+ let len,first=findLineBreakAfter(a,change.fromA,change.toA),last=0>first?-1:findLineBreakBefore(a,change.toA,change.fromA);-1<first&&(len=first-change.fromA)<=maxScanAfter&&a.slice(change.fromA,first)==a.slice(change.toA,change.toA+len)?change=changes[i]=change.offset(len):-1<last&&(len=change.toA-last)<=maxScanBefore&&a.slice(change.fromA-len,change.fromA)==a.slice(last,change.toA)&&(change=changes[i]=change.offset(-len))}}posA=change.toA}return mergeAdjacent(changes,3),changes}function asciiWordChar(code){return 48<code&&58>code||64<code&&91>code||96<code&&123>code}function wordCharAfter(s,pos){if(pos==s.length)return 0;let next=s.charCodeAt(pos);return 192>next?asciiWordChar(next)?1:0:wordChar?isSurrogate1(next)&&pos!=s.length-1?wordChar.test(s.slice(pos,pos+2))?2:0:wordChar.test(String.fromCharCode(next))?1:0:0}function wordCharBefore(s,pos){if(!pos)return 0;let prev=s.charCodeAt(pos-1);return 192>prev?asciiWordChar(prev)?1:0:wordChar?isSurrogate2(prev)&&1!=pos?wordChar.test(s.slice(pos-2,pos))?2:0:wordChar.test(String.fromCharCode(prev))?1:0:0}function findWordBoundaryAfter(s,pos,max){if(pos==s.length||!wordCharBefore(s,pos))return pos;for(let size,cur=pos,end=pos+max,i=0;i<MAX_SCAN;i++){if(size=wordCharAfter(s,cur),!size||cur+size>end)return cur;cur+=size}return pos}function findWordBoundaryBefore(s,pos,max){if(!pos||!wordCharAfter(s,pos))return pos;for(let size,cur=pos,end=pos-max,i=0;i<MAX_SCAN;i++){if(size=wordCharBefore(s,cur),!size||cur-size<end)return cur;cur-=size}return pos}function findLineBreakBefore(s,pos,stop){for(;pos!=stop;pos--)if(10==s.charCodeAt(pos-1))return pos;return-1}function findLineBreakAfter(s,pos,stop){for(;pos!=stop;pos++)if(10==s.charCodeAt(pos))return pos;return-1}// Returns false if index looks like it is in the middle of a
40
+ // surrogate pair.
41
+ function validIndex(s,index){return!index||index==s.length||!isSurrogate1(s.charCodeAt(index-1))||!isSurrogate2(s.charCodeAt(index))}/**
42
+ Compute the difference between two strings.
43
+ */function diff(a,b,config){var _a;let override=null===config||void 0===config?void 0:config.override;return override?override(a,b):(scanLimit=(null!==(_a=null===config||void 0===config?void 0:config.scanLimit)&&void 0!==_a?_a:1e9)>>1,timeout=(null===config||void 0===config?void 0:config.timeout)?Date.now()+config.timeout:0,crude=!1,normalize(a,b,findDiff(a,0,a.length,b,0,b.length)))}// Return whether the last diff fell back to the imprecise algorithm.
44
+ function diffIsPrecise(){return!crude}/**
45
+ Compute the difference between the given strings, and clean up the
46
+ resulting diff for presentation to users by dropping short
47
+ unchanged ranges, and aligning changes to word boundaries when
48
+ appropriate.
49
+ */function presentableDiff(a,b,config){return makePresentable(diff(a,b,config),a,b)}/**
50
+ Get the changed chunks for the merge view that this editor is part
51
+ of, plus the side it is on if it is part of a `MergeView`. Returns
52
+ null if the editor doesn't have a merge extension active or the
53
+ merge view hasn't finished initializing yet.
54
+ */function getChunks(state){let field=state.field(ChunkField,!1);if(!field)return null;let conf=state.facet(mergeConfig);return{chunks:field,side:conf?conf.side:null}}function fromLine(fromA,fromB,a,b){let lineA=a.lineAt(fromA),lineB=b.lineAt(fromB);return lineA.to==fromA&&lineB.to==fromB&&fromA<a.length&&fromB<b.length?[fromA+1,fromB+1]:[lineA.from,lineB.from]}function toLine(toA,toB,a,b){let lineA=a.lineAt(toA),lineB=b.lineAt(toB);return lineA.from==toA&&lineB.from==toB?[toA,toB]:[lineA.to+1,lineB.to+1]}function toChunks(changes,a,b,offA,offB,precise){let chunks=[];for(let i=0;i<changes.length;i++){let change=changes[i],[fromA,fromB]=fromLine(change.fromA+offA,change.fromB+offB,a,b),[toA,toB]=toLine(change.toA+offA,change.toB+offB,a,b),chunk=[change.offset(-fromA+offA,-fromB+offB)];for(;i<changes.length-1;){let next=changes[i+1],[nextA,nextB]=fromLine(next.fromA+offA,next.fromB+offB,a,b);if(nextA>toA+1&&nextB>toB+1)break;chunk.push(next.offset(-fromA+offA,-fromB+offB)),[toA,toB]=toLine(next.toA+offA,next.toB+offB,a,b),i++}chunks.push(new Chunk(chunk,fromA,Math.max(fromA,toA),fromB,Math.max(fromB,toB),precise))}return chunks}// Finds the given position in the chunks. Returns the extent of the
55
+ // chunk it overlaps with if it overlaps, or a position corresponding
56
+ // to that position on both sides otherwise.
57
+ function findPos(chunks,pos,isA,start){for(let lo=0,hi=chunks.length;;){if(lo==hi){let refA=0,refB=0;lo&&({toA:refA,toB:refB}=chunks[lo-1]);let off=pos-(isA?refA:refB);return[refA+off,refB+off]}let mid=lo+hi>>1,chunk=chunks[mid],[from,to]=isA?[chunk.fromA,chunk.toA]:[chunk.fromB,chunk.toB];if(from>pos)hi=mid;else if(to<=pos)lo=mid+1;else return start?[chunk.fromA,chunk.fromB]:[chunk.toA,chunk.toB]}}function findRangesForChange(chunks,changes,isA,otherLen){let ranges=[];return changes.iterChangedRanges((cFromA,cToA,cFromB,cToB)=>{let fromA=0,toA=isA?changes.length:otherLen,fromB=0,toB=isA?otherLen:changes.length;cFromA>updateMargin&&([fromA,fromB]=findPos(chunks,cFromA-updateMargin,isA,!0)),cToA<changes.length-updateMargin&&([toA,toB]=findPos(chunks,cToA+updateMargin,isA,!1));let last,lenDiff=cToB-cFromB-(cToA-cFromA),[diffA,diffB]=isA?[lenDiff,0]:[0,lenDiff];ranges.length&&(last=ranges[ranges.length-1]).toA>=fromA?ranges[ranges.length-1]={fromA:last.fromA,fromB:last.fromB,toA,toB,diffA:last.diffA+diffA,diffB:last.diffB+diffB}:ranges.push({fromA,toA,fromB,toB,diffA,diffB})}),ranges}function updateChunks(ranges,chunks,a,b,conf){if(!ranges.length)return chunks;let result=[];for(let i=0,offA=0,offB=0,chunkI=0;;i++){let range=i==ranges.length?null:ranges[i],fromA=range?range.fromA+offA:a.length,fromB=range?range.fromB+offB:b.length;for(;chunkI<chunks.length;){let next=chunks[chunkI];if(range&&(next.toA+offA>fromA||next.toB+offB>fromB))break;result.push(next.offset(offA,offB)),chunkI++}if(!range)break;let toA=range.toA+offA+range.diffA,toB=range.toB+offB+range.diffB,diff=presentableDiff(a.sliceString(fromA,toA),b.sliceString(fromB,toB),conf);for(let chunk of toChunks(diff,a,b,fromA,fromB,diffIsPrecise()))result.push(chunk);for(offA+=range.diffA,offB+=range.diffB;chunkI<chunks.length;){let next=chunks[chunkI];if(next.fromA+offA>toA&&next.fromB+offB>toB)break;chunkI++}}return result}function chunksChanged(s1,s2){return s1.field(ChunkField,!1)!=s2.field(ChunkField,!1)}function configChanged(s1,s2){return s1.facet(mergeConfig)!=s2.facet(mergeConfig)}function buildChunkDeco(chunk,doc,isA,highlight,builder,gutterBuilder){let from=isA?chunk.fromA:chunk.fromB,to=isA?chunk.toA:chunk.toB,changeI=0;if(from!=to){builder.add(from,from,changedLine),builder.add(from,to,isA?deleted:inserted),gutterBuilder&&gutterBuilder.add(from,from,changedLineGutterMarker);for(let iter=doc.iterRange(from,to-1),pos=from;!iter.next().done;){if(iter.lineBreak){pos++,builder.add(pos,pos,changedLine),gutterBuilder&&gutterBuilder.add(pos,pos,changedLineGutterMarker);continue}let lineEnd=pos+iter.value.length;if(highlight)for(;changeI<chunk.changes.length;){let nextChange=chunk.changes[changeI],nextFrom=from+(isA?nextChange.fromA:nextChange.fromB),nextTo=from+(isA?nextChange.toA:nextChange.toB),chFrom=Math.max(pos,nextFrom),chTo=Math.min(lineEnd,nextTo);if(chFrom<chTo&&builder.add(chFrom,chTo,changedText),nextTo<lineEnd)changeI++;else break}pos=lineEnd}}}function getChunkDeco(view){let chunks=view.state.field(ChunkField),{side,highlightChanges,markGutter,overrideChunk}=view.state.facet(mergeConfig),isA="a"==side,builder=new state.RangeSetBuilder,gutterBuilder=markGutter?new state.RangeSetBuilder:null,{from,to}=view.viewport;for(let chunk of chunks){if((isA?chunk.fromA:chunk.fromB)>=to)break;!((isA?chunk.toA:chunk.toB)>from)||overrideChunk&&overrideChunk(view.state,chunk,builder,gutterBuilder)||buildChunkDeco(chunk,view.state.doc,isA,highlightChanges,builder,gutterBuilder)}return{deco:builder.finish(),gutter:gutterBuilder&&gutterBuilder.finish()}}function compareSpacers(a,b){if(a.size!=b.size)return!1;for(let iA=a.iter(),iB=b.iter();iA.value;){if(iA.from!=iB.from||1<Math.abs(iA.value.spec.widget.height-iB.value.spec.widget.height))return!1;iA.next(),iB.next()}return!0}function updateSpacers(a,b,chunks){let buildA=new state.RangeSetBuilder,buildB=new state.RangeSetBuilder,spacersA=a.state.field(Spacers).iter(),spacersB=b.state.field(Spacers).iter(),posA=0,posB=0,offA=0,offB=0,vpA=a.viewport,vpB=b.viewport;for(let chunkI=0;;chunkI++){let chunk=chunkI<chunks.length?chunks[chunkI]:null,endA=chunk?chunk.fromA:a.state.doc.length,endB=chunk?chunk.fromB:b.state.doc.length;// A range at posA/posB is unchanged, must be aligned.
58
+ if(posA<endA){let heightA=a.lineBlockAt(posA).top+offA,heightB=b.lineBlockAt(posB).top+offB,diff=heightA-heightB;diff<-epsilon?(offA-=diff,buildA.add(posA,posA,view.Decoration.widget({widget:new Spacer(-diff),block:!0,side:-1}))):diff>epsilon&&(offB+=diff,buildB.add(posB,posB,view.Decoration.widget({widget:new Spacer(diff),block:!0,side:-1})))}// If the viewport starts inside the unchanged range (on both
59
+ // sides), add another sync at the top of the viewport. That way,
60
+ // big unchanged chunks with possibly inaccurate estimated heights
61
+ // won't cause the content to misalign (#1408)
62
+ if(endA>posA+1e3&&posA<vpA.from&&endA>vpA.from&&posB<vpB.from&&endB>vpB.from){let off=Math.min(vpA.from-posA,vpB.from-posB);posA+=off,posB+=off,chunkI--}else if(!chunk)break;else posA=chunk.toA,posB=chunk.toB;for(;spacersA.value&&spacersA.from<posA;)offA-=spacersA.value.spec.widget.height,spacersA.next();for(;spacersB.value&&spacersB.from<posB;)offB-=spacersB.value.spec.widget.height,spacersB.next()}for(;spacersA.value;)offA-=spacersA.value.spec.widget.height,spacersA.next();for(;spacersB.value;)offB-=spacersB.value.spec.widget.height,spacersB.next();let docDiff=a.contentHeight+offA-(b.contentHeight+offB);docDiff<epsilon?buildA.add(a.state.doc.length,a.state.doc.length,view.Decoration.widget({widget:new Spacer(-docDiff),block:!0,side:1})):docDiff>epsilon&&buildB.add(b.state.doc.length,b.state.doc.length,view.Decoration.widget({widget:new Spacer(docDiff),block:!0,side:1}));let decoA=buildA.finish(),decoB=buildB.finish();compareSpacers(decoA,a.state.field(Spacers))||a.dispatch({effects:adjustSpacers.of(decoA)}),compareSpacers(decoB,b.state.field(Spacers))||b.dispatch({effects:adjustSpacers.of(decoB)})}/**
63
+ A state effect that expands the section of collapsed unchanged
64
+ code starting at the given position.
65
+ */ /**
66
+ Query whether the given view is displayed next to another editor
67
+ in a merge view. Returns `null` if it isn't, and a pair of editors
68
+ (one of which will be the view itself) otherwise.
69
+ */function mergeViewSiblings(view){let conf=view.state.facet(mergeConfig);return conf&&conf.sibling?"a"==conf.side?{a:view,b:conf.sibling()}:{a:conf.sibling(),b:view}:null}function mapPos(pos,chunks,isA){let startOur=0,startOther=0;for(let next,i=0;;i++){if(next=i<chunks.length?chunks[i]:null,!next||(isA?next.fromA:next.fromB)>=pos)return startOther+(pos-startOur);[startOur,startOther]=isA?[next.toA,next.toB]:[next.toB,next.toA]}}function collapseUnchanged({margin=3,minSize=4}){return CollapsedRanges.init(state=>buildCollapsedRanges(state,margin,minSize))}function buildCollapsedRanges(state$1,margin,minLines){let builder=new state.RangeSetBuilder,isA="a"==state$1.facet(mergeConfig).side,chunks=state$1.field(ChunkField),prevLine=1;for(let i=0;;i++){let chunk=i<chunks.length?chunks[i]:null,collapseFrom=i?prevLine+margin:1,collapseTo=chunk?state$1.doc.lineAt(isA?chunk.fromA:chunk.fromB).number-1-margin:state$1.doc.lines,lines=collapseTo-collapseFrom+1;if(lines>=minLines&&builder.add(state$1.doc.line(collapseFrom).from,state$1.doc.line(collapseTo).to,view.Decoration.replace({widget:new CollapseWidget(lines),block:!0})),!chunk)break;prevLine=state$1.doc.lineAt(Math.min(state$1.doc.length,isA?chunk.toA:chunk.toB)).number}return builder.finish()}function rm(elt){let next=elt.nextSibling;return elt.remove(),next}/**
70
+ Create an extension that causes the editor to display changes
71
+ between its content and the given original document. Changed
72
+ chunks will be highlighted, with uneditable widgets displaying the
73
+ original text displayed above the new text.
74
+ */function unifiedMergeView(config){var _a;let orig="string"==typeof config.original?state.Text.of(config.original.split(/\r?\n/)):config.original,diffConf=config.diffConfig||defaultDiffConfig;return[state.Prec.low(decorateChunks),deletedChunks,baseTheme,view.EditorView.editorAttributes.of({class:"cm-merge-b"}),computeChunks.of((chunks,tr)=>{let updateDoc=tr.effects.find(e=>e.is(updateOriginalDoc));return updateDoc&&(chunks=Chunk.updateA(chunks,updateDoc.value.doc,tr.startState.doc,updateDoc.value.changes,diffConf)),tr.docChanged&&(chunks=Chunk.updateB(chunks,tr.state.field(originalDoc),tr.newDoc,tr.changes,diffConf)),chunks}),mergeConfig.of({highlightChanges:!1!==config.highlightChanges,markGutter:!1!==config.gutter,syntaxHighlightDeletions:!1!==config.syntaxHighlightDeletions,syntaxHighlightDeletionsMaxLength:3e3,mergeControls:null===(_a=config.mergeControls)||void 0===_a||_a,overrideChunk:config.allowInlineDiffs?overrideChunkInline:void 0,side:"b"}),originalDoc.init(()=>orig),!1===config.gutter?[]:unifiedChangeGutter,config.collapseUnchanged?collapseUnchanged(config.collapseUnchanged):[],ChunkField.init(state=>Chunk.build(orig,state.doc,diffConf))]}/**
75
+ The state effect used to signal changes in the original doc in a
76
+ unified merge view.
77
+ */ /**
78
+ Create an effect that, when added to a transaction on a unified
79
+ merge view, will update the original document that's being compared against.
80
+ */function originalDocChangeEffect(state,changes){return updateOriginalDoc.of({doc:changes.apply(getOriginalDoc(state)),changes})}/**
81
+ Get the original document from a unified merge editor's state.
82
+ */function getOriginalDoc(state){return state.field(originalDoc)}function deletionWidget(state,chunk,hideContent){let known=DeletionWidgets.get(chunk.changes);if(known)return known;let buildDOM=view=>{function makeLine(){let div=dom.appendChild(document.createElement("div"));return div.className="cm-deletedLine",div.appendChild(document.createElement("del"))}function add(from,to,cls){for(let at=from;at<to;){if("\n"==text.charAt(at)){line.firstChild||line.appendChild(document.createElement("br")),line=makeLine(),at++;continue}let nextStop=to,nodeCls=cls+(inside?" cm-deletedText":""),flip=!1,newline=text.indexOf("\n",at);if(-1<newline&&newline<to&&(nextStop=newline),highlightChanges&&changeI<changes.length){let nextBound=Math.max(0,inside?changes[changeI].toA:changes[changeI].fromA);nextBound<=nextStop&&(nextStop=nextBound,inside&&changeI++,flip=!0)}if(nextStop>at){let node=document.createTextNode(text.slice(at,nextStop));if(nodeCls){let span=line.appendChild(document.createElement("span"));span.className=nodeCls,span.appendChild(node)}else line.appendChild(node);at=nextStop}flip&&(inside=!inside)}}let{highlightChanges,syntaxHighlightDeletions,syntaxHighlightDeletionsMaxLength,mergeControls}=state.facet(mergeConfig),dom=document.createElement("div");if(dom.className="cm-deletedChunk",mergeControls){let buttons=dom.appendChild(document.createElement("div"));buttons.className="cm-chunkButtons";let onAccept=e=>{e.preventDefault(),acceptChunk(view,view.posAtDOM(dom))},onReject=e=>{e.preventDefault(),rejectChunk(view,view.posAtDOM(dom))};if("function"==typeof mergeControls)buttons.appendChild(mergeControls("accept",onAccept)),buttons.appendChild(mergeControls("reject",onReject));else{let accept=buttons.appendChild(document.createElement("button"));accept.name="accept",accept.textContent=state.phrase("Accept"),accept.onmousedown=onAccept;let reject=buttons.appendChild(document.createElement("button"));reject.name="reject",reject.textContent=state.phrase("Reject"),reject.onmousedown=onReject}}if(hideContent||chunk.fromA>=chunk.toA)return dom;let text=view.state.field(originalDoc).sliceString(chunk.fromA,chunk.endA),lang=syntaxHighlightDeletions&&state.facet(language.language),line=makeLine(),changes=chunk.changes,changeI=0,inside=!1;if(lang&&chunk.toA-chunk.fromA<=syntaxHighlightDeletionsMaxLength){let tree=lang.parser.parse(text),pos=0;highlight.highlightTree(tree,{style:tags=>language.highlightingFor(state,tags)},(from,to,cls)=>{from>pos&&add(pos,from,""),add(from,to,cls),pos=to}),add(pos,text.length,"")}else add(0,text.length,"");return line.firstChild||line.appendChild(document.createElement("br")),dom},deco=view.Decoration.widget({block:!0,side:-1,widget:new DeletionWidget(buildDOM)});return DeletionWidgets.set(chunk.changes,deco),deco}/**
83
+ In a [unified](https://codemirror.net/6/docs/ref/#merge.unifiedMergeView) merge view, accept the
84
+ chunk under the given position or the cursor. This chunk will no
85
+ longer be highlighted unless it is edited again.
86
+ */function acceptChunk(view,pos){let{state:state$1}=view,at=null!==pos&&void 0!==pos?pos:state$1.selection.main.head,chunk=view.state.field(ChunkField).find(ch=>ch.fromB<=at&&ch.endB>=at);if(!chunk)return!1;let insert=view.state.sliceDoc(chunk.fromB,Math.max(chunk.fromB,chunk.toB-1)),orig=view.state.field(originalDoc);chunk.fromB!=chunk.toB&&chunk.toA<=orig.length&&(insert+=view.state.lineBreak);let changes=state.ChangeSet.of({from:chunk.fromA,to:Math.min(orig.length,chunk.toA),insert},orig.length);return view.dispatch({effects:updateOriginalDoc.of({doc:changes.apply(orig),changes}),userEvent:"accept"}),!0}/**
87
+ In a [unified](https://codemirror.net/6/docs/ref/#merge.unifiedMergeView) merge view, reject the
88
+ chunk under the given position or the cursor. Reverts that range
89
+ to the content it has in the original document.
90
+ */function rejectChunk(view,pos){let{state}=view,at=null!==pos&&void 0!==pos?pos:state.selection.main.head,chunk=state.field(ChunkField).find(ch=>ch.fromB<=at&&ch.endB>=at);if(!chunk)return!1;let orig=state.field(originalDoc),insert=orig.sliceString(chunk.fromA,Math.max(chunk.fromA,chunk.toA-1));return chunk.fromA!=chunk.toA&&chunk.toB<=state.doc.length&&(insert+=state.lineBreak),view.dispatch({changes:{from:chunk.fromB,to:Math.min(state.doc.length,chunk.toB),insert},userEvent:"revert"}),!0}function buildDeletedChunks(state$1){let builder=new state.RangeSetBuilder;for(let ch of state$1.field(ChunkField)){let hide=state$1.facet(mergeConfig).overrideChunk&&chunkCanDisplayInline(state$1,ch);builder.add(ch.fromB,ch.fromB,deletionWidget(state$1,ch,!!hide))}return builder.finish()}function chunkCanDisplayInline(state,chunk){let result=InlineChunkCache.get(chunk);if(void 0!==result)return result;result=null;let a=state.field(originalDoc),b=state.doc,linesA=a.lineAt(chunk.endA).number-a.lineAt(chunk.fromA).number+1,linesB=b.lineAt(chunk.endB).number-b.lineAt(chunk.fromB).number+1;abort:if(linesA==linesB&&10>linesA){let deco=[],deleteCount=0,bA=chunk.fromA,bB=chunk.fromB;for(let ch of chunk.changes){if(ch.fromA<ch.toA){deleteCount+=ch.toA-ch.fromA;let deleted=a.sliceString(bA+ch.fromA,bA+ch.toA);if(/\n/.test(deleted))break abort;deco.push(view.Decoration.widget({widget:new InlineDeletion(deleted),side:-1}).range(bB+ch.fromB))}ch.fromB<ch.toB&&deco.push(changedText.range(bB+ch.fromB,bB+ch.toB))}deleteCount<chunk.endA-chunk.fromA-2*linesA&&(result=deco)}return InlineChunkCache.set(chunk,result),result}function overrideChunkInline(state,chunk,builder,gutterBuilder){let inline=chunkCanDisplayInline(state,chunk),i=0;if(!inline)return!1;for(let line=state.doc.lineAt(chunk.fromB);;){for(gutterBuilder&&gutterBuilder.add(line.from,line.from,inlineChangedLineGutterMarker),builder.add(line.from,line.from,inlineChangedLine);i<inline.length&&inline[i].to<=line.to;){let r=inline[i++];builder.add(r.from,r.to,r.value)}if(line.to>=chunk.endB)break;line=state.doc.lineAt(line.to+1)}return!0}if(hasRequiredDist)return dist;hasRequiredDist=1;var view=require$$0,state=require$$1,styleMod=require$$2,language=require$$3,highlight=require$$4;// This algorithm was heavily inspired by Neil Fraser's
91
+ // diff-match-patch library. See https://github.com/google/diff-match-patch/
92
+ /**
93
+ A changed range.
94
+ */class Change{constructor(/**
95
+ The start of the change in document A.
96
+ */fromA,/**
97
+ The end of the change in document A. This is equal to `fromA`
98
+ in case of insertions.
99
+ */toA,/**
100
+ The start of the change in document B.
101
+ */fromB,/**
102
+ The end of the change in document B. This is equal to `fromB`
103
+ for deletions.
104
+ */toB){this.fromA=fromA,this.toA=toA,this.fromB=fromB,this.toB=toB}/**
105
+ @internal
106
+ */offset(offA,offB=offA){return new Change(this.fromA+offA,this.toA+offA,this.fromB+offB,this.toB+offB)}}let scanLimit=1e9,timeout=0,crude=!1;class Frontier{constructor(){this.vec=[]}reset(off){this.len=off<<1;for(let i=0;i<this.len;i++)this.vec[i]=-1;this.vec[off+1]=0,this.start=this.end=0}advance(depth,lenX,lenY,vOff,other,fromBack,match){for(let k=-depth+this.start;k<=depth-this.end;k+=2){let off=vOff+k,x=k==-depth||k!=depth&&this.vec[off-1]<this.vec[off+1]?this.vec[off+1]:this.vec[off-1]+1,y=x-k;for(;x<lenX&&y<lenY&&match(x,y);)x++,y++;if(this.vec[off]=x,x>lenX)this.end+=2;else if(y>lenY)this.start+=2;else if(other){let offOther=vOff+(lenX-lenY)-k;if(0<=offOther&&offOther<this.len&&-1!=other.vec[offOther])if(!fromBack){let xOther=lenX-other.vec[offOther];if(x>=xOther)return[x,y]}else{let xOther=other.vec[offOther];if(xOther>=lenX-x)return[xOther,vOff+xOther-offOther]}}}return null}}// Reused across calls to avoid growing the vectors again and again
107
+ const frontier1=new Frontier,frontier2=new Frontier;let wordChar;try{wordChar=/[\p{Alphabetic}\p{Number}]/u}catch(_){}const MAX_SCAN=8,isSurrogate1=code=>55296<=code&&56319>=code,isSurrogate2=code=>56320<=code&&57343>=code,mergeConfig=state.Facet.define({combine:values=>values[0]}),setChunks=state.StateEffect.define(),computeChunks=state.Facet.define(),ChunkField=state.StateField.define({create(state){return null},update(current,tr){for(let e of tr.effects)e.is(setChunks)&&(current=e.value);for(let comp of tr.state.facet(computeChunks))current=comp(current,tr);return current}});let moveByChunk=dir=>({state:state$1,dispatch})=>{let chunks=state$1.field(ChunkField,!1),conf=state$1.facet(mergeConfig);if(!chunks||!chunks.length||!conf)return!1;let{head}=state$1.selection.main,pos=0;for(let i=chunks.length-1;0<=i;i--){let chunk=chunks[i],[from,to]="b"==conf.side?[chunk.fromB,chunk.toB]:[chunk.fromA,chunk.toA];if(to<head){pos=i+1;break}if(from<=head){if(1==chunks.length)return!1;pos=i+(0>dir?0:1);break}}let next=chunks[(pos+(0>dir?chunks.length-1:0))%chunks.length],[from,to]="b"==conf.side?[next.fromB,next.toB]:[next.fromA,next.toA];return dispatch(state$1.update({selection:{anchor:from},userEvent:"select.byChunk",effects:view.EditorView.scrollIntoView(state.EditorSelection.range(to,from))})),!0};/**
108
+ Move the selection to the next changed chunk.
109
+ */const goToNextChunk=moveByChunk(1),goToPreviousChunk=moveByChunk(-1);/**
110
+ Move the selection to the previous changed chunk.
111
+ */ /**
112
+ A chunk describes a range of lines which have changed content in
113
+ them. Either side (a/b) may either be empty (when its `to` is
114
+ equal to its `from`), or points at a range starting at the start
115
+ of the first changed line, to 1 past the end of the last changed
116
+ line. Note that `to` positions may point past the end of the
117
+ document. Use `endA`/`endB` if you need an end position that is
118
+ certain to be a valid document position.
119
+ */class Chunk{constructor(/**
120
+ The individual changes inside this chunk. These are stored
121
+ relative to the start of the chunk, so you have to add
122
+ `chunk.fromA`/`fromB` to get document positions.
123
+ */changes,/**
124
+ The start of the chunk in document A.
125
+ */fromA,/**
126
+ The end of the chunk in document A. This is equal to `fromA`
127
+ when the chunk covers no lines in document A, or is one unit
128
+ past the end of the last line in the chunk if it does. (Note
129
+ that this may point outside the document if the chunk ends at
130
+ the end of the last line. See also `endA`.)
131
+ */toA,/**
132
+ The start of the chunk in document B.
133
+ */fromB,/**
134
+ The end of the chunk in document A.
135
+ */toB,/**
136
+ This is set to false when the diff used to compute this chunk
137
+ fell back to fast, imprecise diffing.
138
+ */precise=!0){this.changes=changes,this.fromA=fromA,this.toA=toA,this.fromB=fromB,this.toB=toB,this.precise=precise}/**
139
+ @internal
140
+ */offset(offA,offB){return offA||offB?new Chunk(this.changes,this.fromA+offA,this.toA+offA,this.fromB+offB,this.toB+offB,this.precise):this}/**
141
+ Returns `fromA` if the chunk is empty in A, or the end of the
142
+ last line in the chunk otherwise.
143
+ */get endA(){return Math.max(this.fromA,this.toA-1)}/**
144
+ Returns `fromB` if the chunk is empty in B, or the end of the
145
+ last line in the chunk otherwise.
146
+ */get endB(){return Math.max(this.fromB,this.toB-1)}/**
147
+ Build a set of changed chunks for the given documents.
148
+ */static build(a,b,conf){let diff=presentableDiff(a.toString(),b.toString(),conf);return toChunks(diff,a,b,0,0,diffIsPrecise())}/**
149
+ Update a set of chunks for changes in document A. `a` should
150
+ hold the updated document A.
151
+ */static updateA(chunks,a,b,changes,conf){return updateChunks(findRangesForChange(chunks,changes,!0,b.length),chunks,a,b,conf)}/**
152
+ Update a set of chunks for changes in document B.
153
+ */static updateB(chunks,a,b,changes,conf){return updateChunks(findRangesForChange(chunks,changes,!1,a.length),chunks,a,b,conf)}}const updateMargin=1e3,defaultDiffConfig={scanLimit:500},decorateChunks=view.ViewPlugin.fromClass(class{constructor(view){({deco:this.deco,gutter:this.gutter}=getChunkDeco(view))}update(update){(update.docChanged||update.viewportChanged||chunksChanged(update.startState,update.state)||configChanged(update.startState,update.state))&&({deco:this.deco,gutter:this.gutter}=getChunkDeco(update.view))}},{decorations:d=>d.deco}),changeGutter=state.Prec.low(view.gutter({class:"cm-changeGutter",markers:view=>{var _a;return(null===(_a=view.plugin(decorateChunks))||void 0===_a?void 0:_a.gutter)||state.RangeSet.empty}})),changedLine=view.Decoration.line({class:"cm-changedLine"}),changedText=view.Decoration.mark({class:"cm-changedText"}),inserted=view.Decoration.mark({tagName:"ins",class:"cm-insertedLine"}),deleted=view.Decoration.mark({tagName:"del",class:"cm-deletedLine"}),changedLineGutterMarker=new class extends view.GutterMarker{constructor(){super(...arguments),this.elementClass="cm-changedLineGutter"}};class Spacer extends view.WidgetType{constructor(height){super(),this.height=height}eq(other){return this.height==other.height}toDOM(){let elt=document.createElement("div");return elt.className="cm-mergeSpacer",elt.style.height=this.height+"px",elt}updateDOM(dom){return dom.style.height=this.height+"px",!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}}const adjustSpacers=state.StateEffect.define({map:(value,mapping)=>value.map(mapping)}),Spacers=state.StateField.define({create:()=>view.Decoration.none,update:(spacers,tr)=>{for(let e of tr.effects)if(e.is(adjustSpacers))return e.value;return spacers.map(tr.changes)},provide:f=>view.EditorView.decorations.from(f)}),epsilon=.01,uncollapseUnchanged=state.StateEffect.define({map:(value,change)=>change.mapPos(value)});class CollapseWidget extends view.WidgetType{constructor(lines){super(),this.lines=lines}eq(other){return this.lines==other.lines}toDOM(view){let outer=document.createElement("div");return outer.className="cm-collapsedLines",outer.textContent=view.state.phrase("$ unchanged lines",this.lines),outer.addEventListener("click",e=>{let pos=view.posAtDOM(e.target);view.dispatch({effects:uncollapseUnchanged.of(pos)});let{side,sibling}=view.state.facet(mergeConfig);sibling&&sibling().dispatch({effects:uncollapseUnchanged.of(mapPos(pos,view.state.field(ChunkField),"a"==side))})}),outer}ignoreEvent(e){return e instanceof MouseEvent}get estimatedHeight(){return 27}get type(){return"collapsed-unchanged-code"}}const CollapsedRanges=state.StateField.define({create(state){return view.Decoration.none},update(deco,tr){deco=deco.map(tr.changes);for(let e of tr.effects)e.is(uncollapseUnchanged)&&(deco=deco.update({filter:from=>from!=e.value}));return deco},provide:f=>view.EditorView.decorations.from(f)}),externalTheme=view.EditorView.styleModule.of(new styleMod.StyleModule({".cm-mergeView":{overflowY:"auto"},".cm-mergeViewEditors":{display:"flex",alignItems:"stretch"},".cm-mergeViewEditor":{flexGrow:1,flexBasis:0,overflow:"hidden"},".cm-merge-revert":{width:"1.6em",flexGrow:0,flexShrink:0,position:"relative"},".cm-merge-revert button":{position:"absolute",display:"block",width:"100%",boxSizing:"border-box",textAlign:"center",background:"none",border:"none",font:"inherit",cursor:"pointer"}})),baseTheme=view.EditorView.baseTheme({".cm-mergeView & .cm-scroller, .cm-mergeView &":{height:"auto !important",overflowY:"visible !important"},"&.cm-merge-a .cm-changedLine, .cm-deletedChunk":{backgroundColor:"rgba(160, 128, 100, .08)"},"&.cm-merge-b .cm-changedLine, .cm-inlineChangedLine":{backgroundColor:"rgba(100, 160, 128, .08)"},"&light.cm-merge-a .cm-changedText, &light .cm-deletedChunk .cm-deletedText":{background:"linear-gradient(#ee443366, #ee443366) bottom/100% 2px no-repeat"},"&dark.cm-merge-a .cm-changedText, &dark .cm-deletedChunk .cm-deletedText":{background:"linear-gradient(#ffaa9966, #ffaa9966) bottom/100% 2px no-repeat"},"&light.cm-merge-b .cm-changedText":{background:"linear-gradient(#22bb22aa, #22bb22aa) bottom/100% 2px no-repeat"},"&dark.cm-merge-b .cm-changedText":{background:"linear-gradient(#88ff88aa, #88ff88aa) bottom/100% 2px no-repeat"},"&.cm-merge-b .cm-deletedText":{background:"#ff000033"},".cm-insertedLine, .cm-deletedLine, .cm-deletedLine del":{textDecoration:"none"},".cm-deletedChunk":{paddingLeft:"6px","& .cm-chunkButtons":{position:"absolute",insetInlineEnd:"5px"},"& button":{border:"none",cursor:"pointer",color:"white",margin:"0 2px",borderRadius:"3px","&[name=accept]":{background:"#2a2"},"&[name=reject]":{background:"#d43"}}},".cm-collapsedLines":{padding:"5px 5px 5px 10px",cursor:"pointer","&:before":{content:"\"\u299A\"",marginInlineEnd:"7px"},"&:after":{content:"\"\u299A\"",marginInlineStart:"7px"}},"&light .cm-collapsedLines":{color:"#444",background:"linear-gradient(to bottom, transparent 0, #f3f3f3 30%, #f3f3f3 70%, transparent 100%)"},"&dark .cm-collapsedLines":{color:"#ddd",background:"linear-gradient(to bottom, transparent 0, #222 30%, #222 70%, transparent 100%)"},".cm-changeGutter":{width:"3px",paddingLeft:"1px"},"&light.cm-merge-a .cm-changedLineGutter, &light .cm-deletedLineGutter":{background:"#e43"},"&dark.cm-merge-a .cm-changedLineGutter, &dark .cm-deletedLineGutter":{background:"#fa9"},"&light.cm-merge-b .cm-changedLineGutter":{background:"#2b2"},"&dark.cm-merge-b .cm-changedLineGutter":{background:"#8f8"},".cm-inlineChangedLineGutter":{background:"#75d"}}),collapseCompartment=new state.Compartment,configCompartment=new state.Compartment;/**
154
+ A merge view manages two editors side-by-side, highlighting the
155
+ difference between them and vertically aligning unchanged lines.
156
+ If you want one of the editors to be read-only, you have to
157
+ configure that in its extensions.
158
+
159
+ By default, views are not scrollable. Style them (`.cm-mergeView`)
160
+ with a height and `overflow: auto` to make them scrollable.
161
+ */class MergeView{/**
162
+ Create a new merge view.
163
+ */constructor(config){this.revertDOM=null,this.revertToA=!1,this.revertToLeft=!1,this.measuring=-1,this.diffConf=config.diffConfig||defaultDiffConfig;let sharedExtensions=[state.Prec.low(decorateChunks),baseTheme,externalTheme,Spacers,view.EditorView.updateListener.of(update=>{0>this.measuring&&(update.heightChanged||update.viewportChanged)&&!update.transactions.some(tr=>tr.effects.some(e=>e.is(adjustSpacers)))&&this.measure()})],configA=[mergeConfig.of({side:"a",sibling:()=>this.b,highlightChanges:!1!==config.highlightChanges,markGutter:!1!==config.gutter})];!1!==config.gutter&&configA.push(changeGutter);let stateA=state.EditorState.create({doc:config.a.doc,selection:config.a.selection,extensions:[config.a.extensions||[],view.EditorView.editorAttributes.of({class:"cm-merge-a"}),configCompartment.of(configA),sharedExtensions]}),configB=[mergeConfig.of({side:"b",sibling:()=>this.a,highlightChanges:!1!==config.highlightChanges,markGutter:!1!==config.gutter})];!1!==config.gutter&&configB.push(changeGutter);let stateB=state.EditorState.create({doc:config.b.doc,selection:config.b.selection,extensions:[config.b.extensions||[],view.EditorView.editorAttributes.of({class:"cm-merge-b"}),configCompartment.of(configB),sharedExtensions]});this.chunks=Chunk.build(stateA.doc,stateB.doc,this.diffConf);let add=[ChunkField.init(()=>this.chunks),collapseCompartment.of(config.collapseUnchanged?collapseUnchanged(config.collapseUnchanged):[])];stateA=stateA.update({effects:state.StateEffect.appendConfig.of(add)}).state,stateB=stateB.update({effects:state.StateEffect.appendConfig.of(add)}).state,this.dom=document.createElement("div"),this.dom.className="cm-mergeView",this.editorDOM=this.dom.appendChild(document.createElement("div")),this.editorDOM.className="cm-mergeViewEditors";let orientation=config.orientation||"a-b",wrapA=document.createElement("div");wrapA.className="cm-mergeViewEditor";let wrapB=document.createElement("div");wrapB.className="cm-mergeViewEditor",this.editorDOM.appendChild("a-b"==orientation?wrapA:wrapB),this.editorDOM.appendChild("a-b"==orientation?wrapB:wrapA),this.a=new view.EditorView({state:stateA,parent:wrapA,root:config.root,dispatchTransactions:trs=>this.dispatch(trs,this.a)}),this.b=new view.EditorView({state:stateB,parent:wrapB,root:config.root,dispatchTransactions:trs=>this.dispatch(trs,this.b)}),this.setupRevertControls(!!config.revertControls,"b-to-a"==config.revertControls,config.renderRevertControl),config.parent&&config.parent.appendChild(this.dom),this.scheduleMeasure()}dispatch(trs,target){if(trs.some(tr=>tr.docChanged)){let last=trs[trs.length-1],changes=trs.reduce((chs,tr)=>chs.compose(tr.changes),state.ChangeSet.empty(trs[0].startState.doc.length));this.chunks=target==this.a?Chunk.updateA(this.chunks,last.newDoc,this.b.state.doc,changes,this.diffConf):Chunk.updateB(this.chunks,this.a.state.doc,last.newDoc,changes,this.diffConf),target.update([...trs,last.state.update({effects:setChunks.of(this.chunks)})]);let other=target==this.a?this.b:this.a;other.update([other.state.update({effects:setChunks.of(this.chunks)})]),this.scheduleMeasure()}else target.update(trs)}/**
164
+ Reconfigure an existing merge view.
165
+ */reconfigure(config){if("diffConfig"in config&&(this.diffConf=config.diffConfig),"orientation"in config){let aB="b-a"!=config.orientation;if(aB!=(this.editorDOM.firstChild==this.a.dom.parentNode)){let domA=this.a.dom.parentNode,domB=this.b.dom.parentNode;domA.remove(),domB.remove(),this.editorDOM.insertBefore(aB?domA:domB,this.editorDOM.firstChild),this.editorDOM.appendChild(aB?domB:domA),this.revertToLeft=!this.revertToLeft,this.revertDOM&&(this.revertDOM.textContent="")}}if("revertControls"in config||"renderRevertControl"in config){let controls=!!this.revertDOM,toA=this.revertToA,render=this.renderRevert;"revertControls"in config&&(controls=!!config.revertControls,toA="b-to-a"==config.revertControls),"renderRevertControl"in config&&(render=config.renderRevertControl),this.setupRevertControls(controls,toA,render)}let highlight=("highlightChanges"in config),gutter=("gutter"in config),collapse=("collapseUnchanged"in config);if(highlight||gutter||collapse){let effectsA=[],effectsB=[];if(highlight||gutter){let currentConfig=this.a.state.facet(mergeConfig),markGutter=gutter?!1!==config.gutter:currentConfig.markGutter,highlightChanges=highlight?!1!==config.highlightChanges:currentConfig.highlightChanges;effectsA.push(configCompartment.reconfigure([mergeConfig.of({side:"a",sibling:()=>this.b,highlightChanges,markGutter}),markGutter?changeGutter:[]])),effectsB.push(configCompartment.reconfigure([mergeConfig.of({side:"b",sibling:()=>this.a,highlightChanges,markGutter}),markGutter?changeGutter:[]]))}if(collapse){let effect=collapseCompartment.reconfigure(config.collapseUnchanged?collapseUnchanged(config.collapseUnchanged):[]);effectsA.push(effect),effectsB.push(effect)}this.a.dispatch({effects:effectsA}),this.b.dispatch({effects:effectsB})}this.scheduleMeasure()}setupRevertControls(controls,toA,render){this.revertToA=toA,this.revertToLeft=this.revertToA==(this.editorDOM.firstChild==this.a.dom.parentNode),this.renderRevert=render,!controls&&this.revertDOM?(this.revertDOM.remove(),this.revertDOM=null):controls&&!this.revertDOM?(this.revertDOM=this.editorDOM.insertBefore(document.createElement("div"),this.editorDOM.firstChild.nextSibling),this.revertDOM.addEventListener("mousedown",e=>this.revertClicked(e)),this.revertDOM.className="cm-merge-revert"):this.revertDOM&&(this.revertDOM.textContent="")}scheduleMeasure(){if(0>this.measuring){let win=this.dom.ownerDocument.defaultView||window;this.measuring=win.requestAnimationFrame(()=>{this.measuring=-1,this.measure()})}}measure(){updateSpacers(this.a,this.b,this.chunks),this.revertDOM&&this.updateRevertButtons()}updateRevertButtons(){let dom=this.revertDOM,next=dom.firstChild,vpA=this.a.viewport,vpB=this.b.viewport;for(let chunk,i=0;i<this.chunks.length&&(chunk=this.chunks[i],!(chunk.fromA>vpA.to||chunk.fromB>vpB.to));i++){if(chunk.fromA<vpA.from||chunk.fromB<vpB.from)continue;let top=this.a.lineBlockAt(chunk.fromA).top+"px";for(;next&&+next.dataset.chunk<i;)next=rm(next);next&&next.dataset.chunk==i+""?(next.style.top!=top&&(next.style.top=top),next=next.nextSibling):dom.insertBefore(this.renderRevertButton(top,i),next)}for(;next;)next=rm(next)}renderRevertButton(top,chunk){let elt;if(this.renderRevert)elt=this.renderRevert();else{elt=document.createElement("button");let text=this.a.state.phrase("Revert this chunk");elt.setAttribute("aria-label",text),elt.setAttribute("title",text),elt.textContent=this.revertToLeft?"\u21DC":"\u21DD"}return elt.style.top=top,elt.setAttribute("data-chunk",chunk+""),elt}revertClicked(e){let chunk,target=e.target;for(;target&&target.parentNode!=this.revertDOM;)target=target.parentNode;if(target&&(chunk=this.chunks[target.dataset.chunk])){let[source,dest,srcFrom,srcTo,destFrom,destTo]=this.revertToA?[this.b,this.a,chunk.fromB,chunk.toB,chunk.fromA,chunk.toA]:[this.a,this.b,chunk.fromA,chunk.toA,chunk.fromB,chunk.toB],insert=source.state.sliceDoc(srcFrom,Math.max(srcFrom,srcTo-1));srcFrom!=srcTo&&destTo<=dest.state.doc.length&&(insert+=source.state.lineBreak),dest.dispatch({changes:{from:destFrom,to:Math.min(dest.state.doc.length,destTo),insert},userEvent:"revert"}),e.preventDefault()}}/**
166
+ Destroy this merge view.
167
+ */destroy(){this.a.destroy(),this.b.destroy(),-1<this.measuring&&(this.dom.ownerDocument.defaultView||window).cancelAnimationFrame(this.measuring),this.dom.remove()}}const deletedChunkGutterMarker=new class extends view.GutterMarker{constructor(){super(...arguments),this.elementClass="cm-deletedLineGutter"}},unifiedChangeGutter=state.Prec.low(view.gutter({class:"cm-changeGutter",markers:view=>{var _a;return(null===(_a=view.plugin(decorateChunks))||void 0===_a?void 0:_a.gutter)||state.RangeSet.empty},widgetMarker:(view,widget)=>widget instanceof DeletionWidget?deletedChunkGutterMarker:null})),updateOriginalDoc=state.StateEffect.define(),originalDoc=state.StateField.define({create:()=>state.Text.empty,update(doc,tr){for(let e of tr.effects)e.is(updateOriginalDoc)&&(doc=e.value.doc);return doc}}),DeletionWidgets=new WeakMap;class DeletionWidget extends view.WidgetType{constructor(buildDOM){super(),this.buildDOM=buildDOM,this.dom=null}eq(other){return this.dom==other.dom}toDOM(view){return this.dom||(this.dom=this.buildDOM(view))}}const deletedChunks=state.StateField.define({create:state=>buildDeletedChunks(state),update(deco,tr){return tr.state.field(ChunkField,!1)==tr.startState.field(ChunkField,!1)?deco:buildDeletedChunks(tr.state)},provide:f=>view.EditorView.decorations.from(f)}),InlineChunkCache=new WeakMap;class InlineDeletion extends view.WidgetType{constructor(text){super(),this.text=text}eq(other){return this.text==other.text}toDOM(view){let elt=document.createElement("del");return elt.className="cm-deletedText",elt.textContent=this.text,elt}}const inlineChangedLineGutterMarker=new class extends view.GutterMarker{constructor(){super(...arguments),this.elementClass="cm-inlineChangedLineGutter"}},inlineChangedLine=view.Decoration.line({class:"cm-inlineChangedLine"});return dist.Change=Change,dist.Chunk=Chunk,dist.MergeView=MergeView,dist.acceptChunk=acceptChunk,dist.diff=diff,dist.getChunks=getChunks,dist.getOriginalDoc=getOriginalDoc,dist.goToNextChunk=goToNextChunk,dist.goToPreviousChunk=goToPreviousChunk,dist.mergeViewSiblings=mergeViewSiblings,dist.originalDocChangeEffect=originalDocChangeEffect,dist.presentableDiff=presentableDiff,dist.rejectChunk=rejectChunk,dist.uncollapseUnchanged=uncollapseUnchanged,dist.unifiedMergeView=unifiedMergeView,dist.updateOriginalDoc=updateOriginalDoc,dist}(),index=/*@__PURE__*/function getDefaultExportFromCjs(x){return x}(distExports);return module.exports=index,module.exports}
@@ -0,0 +1,121 @@
1
+ async function moduleInitFunction(requireAsyncModule,exports={}){const module={exports:exports};var hasRequiredDist,require$$0=await requireAsyncModule("@codemirror/view"),require$$1=await requireAsyncModule("@codemirror/state"),require$$2=await requireAsyncModule("crelt"),dist={},distExports=function requireDist(){function validRegExp(source){try{return new RegExp(source,baseFlags),!0}catch(_a){return!1}}function toCharEnd(text,pos){if(pos>=text.length)return pos;for(let next,line=text.lineAt(pos);pos<line.to&&56320<=(next=line.text.charCodeAt(pos-line.from))&&57344>next;)pos++;return pos}/**
2
+ Command that shows a dialog asking the user for a line number, and
3
+ when a valid position is provided, moves the cursor to that line.
4
+
5
+ Supports line numbers, relative line offsets prefixed with `+` or
6
+ `-`, document percentages suffixed with `%`, and an optional
7
+ column position by adding `:` and a second number after the line
8
+ number.
9
+ */ /**
10
+ This extension highlights text that matches the selection. It uses
11
+ the `"cm-selectionMatch"` class for the highlighting. When
12
+ `highlightWordAroundCursor` is enabled, the word at the cursor
13
+ itself will be highlighted with `"cm-selectionMatch-main"`.
14
+ */function highlightSelectionMatches(options){let ext=[defaultTheme,matchHighlighter];return options&&ext.push(highlightConfig.of(options)),ext}// Whether the characters directly outside the given positions are non-word characters
15
+ function insideWordBoundaries(check,state$1,from,to){return(0==from||check(state$1.sliceDoc(from-1,from))!=state.CharCategory.Word)&&(to==state$1.doc.length||check(state$1.sliceDoc(to,to+1))!=state.CharCategory.Word)}// Whether the characters directly at the given positions are word characters
16
+ function insideWord(check,state$1,from,to){return check(state$1.sliceDoc(from,from+1))==state.CharCategory.Word&&check(state$1.sliceDoc(to-1,to))==state.CharCategory.Word}// Find next occurrence of query relative to last cursor. Wrap around
17
+ // the document if there are no more matches.
18
+ function findNextOccurrence(state,query){let{main,ranges}=state.selection,word=state.wordAt(main.head),fullWord=word&&word.from==main.from&&word.to==main.to;for(let cycled=!1,cursor=new SearchCursor(state.doc,query,ranges[ranges.length-1].to);;)if(cursor.next(),cursor.done){if(cycled)return null;cursor=new SearchCursor(state.doc,query,0,Math.max(0,ranges[ranges.length-1].from-1)),cycled=!0}else{if(cycled&&ranges.some(r=>r.from==cursor.value.from))continue;if(fullWord){let word=state.wordAt(cursor.value.from);if(!word||word.from!=cursor.value.from||word.to!=cursor.value.to)continue}return cursor.value}}/**
19
+ Select next occurrence of the current selection. Expand selection
20
+ to the surrounding word when the selection is empty.
21
+ */ /**
22
+ Add search state to the editor configuration, and optionally
23
+ configure the search extension.
24
+ ([`openSearchPanel`](https://codemirror.net/6/docs/ref/#search.openSearchPanel) will automatically
25
+ enable this if it isn't already on).
26
+ */function search(config){return config?[searchConfigFacet.of(config),searchExtensions]:searchExtensions}/**
27
+ A search query. Part of the editor's search state.
28
+ */function wrapStringTest(test,state,inner){return(from,to,buffer,bufferPos)=>{if(inner&&!inner(from,to,buffer,bufferPos))return!1;let match=from>=bufferPos&&to<=bufferPos+buffer.length?buffer.slice(from-bufferPos,to-bufferPos):state.doc.sliceString(from,to);return test(match,state,from,to)}}function stringCursor(spec,state,from,to){let test;return spec.wholeWord&&(test=stringWordTest(state.doc,state.charCategorizer(state.selection.main.head))),spec.test&&(test=wrapStringTest(spec.test,state,test)),new SearchCursor(state.doc,spec.unquoted,from,to,spec.caseSensitive?void 0:x=>x.toLowerCase(),test)}function stringWordTest(doc,categorizer){return(from,to,buf,bufPos)=>((bufPos>from||bufPos+buf.length<to)&&(bufPos=Math.max(0,from-2),buf=doc.sliceString(bufPos,Math.min(doc.length,to+2))),(categorizer(charBefore(buf,from-bufPos))!=state.CharCategory.Word||categorizer(charAfter(buf,from-bufPos))!=state.CharCategory.Word)&&(categorizer(charAfter(buf,to-bufPos))!=state.CharCategory.Word||categorizer(charBefore(buf,to-bufPos))!=state.CharCategory.Word))}function wrapRegexpTest(test,state,inner){return(from,to,match)=>(!inner||inner(from,to,match))&&test(match[0],state,from,to)}function regexpCursor(spec,state,from,to){let test;return spec.wholeWord&&(test=regexpWordTest(state.charCategorizer(state.selection.main.head))),spec.test&&(test=wrapRegexpTest(spec.test,state,test)),new RegExpCursor(state.doc,spec.search,{ignoreCase:!spec.caseSensitive,test},from,to)}function charBefore(str,index){return str.slice(state.findClusterBreak(str,index,!1),index)}function charAfter(str,index){return str.slice(index,state.findClusterBreak(str,index))}function regexpWordTest(categorizer){return(_from,_to,match)=>!match[0].length||(categorizer(charBefore(match.input,match.index))!=state.CharCategory.Word||categorizer(charAfter(match.input,match.index))!=state.CharCategory.Word)&&(categorizer(charAfter(match.input,match.index+match[0].length))!=state.CharCategory.Word||categorizer(charBefore(match.input,match.index+match[0].length))!=state.CharCategory.Word)}/**
29
+ Get the current search query from an editor state.
30
+ */function getSearchQuery(state){let curState=state.field(searchState,!1);return curState?curState.query.spec:defaultQuery(state)}/**
31
+ Query whether the search panel is open in the given editor state.
32
+ */function searchPanelOpen(state){var _a;return null!=(null===(_a=state.field(searchState,!1))||void 0===_a?void 0:_a.panel)}function searchCommand(f){return view=>{let state=view.state.field(searchState,!1);return state&&state.query.spec.valid?f(view,state):openSearchPanel(view)}}/**
33
+ Open the search panel if it isn't already open, and move the
34
+ selection to the first match after the current main selection.
35
+ Will wrap around to the start of the document when it reaches the
36
+ end.
37
+ */function createSearchPanel(view){return view.state.facet(searchConfigFacet).createPanel(view)}function defaultQuery(state,fallback){var _a,_b,_c,_d,_e;let sel=state.selection.main,selText=sel.empty||sel.to>sel.from+100?"":state.sliceDoc(sel.from,sel.to);if(fallback&&!selText)return fallback;let config=state.facet(searchConfigFacet);return new SearchQuery({search:(null!==(_a=null===fallback||void 0===fallback?void 0:fallback.literal)&&void 0!==_a?_a:config.literal)?selText:selText.replace(/\n/g,"\\n"),caseSensitive:null!==(_b=null===fallback||void 0===fallback?void 0:fallback.caseSensitive)&&void 0!==_b?_b:config.caseSensitive,literal:null!==(_c=null===fallback||void 0===fallback?void 0:fallback.literal)&&void 0!==_c?_c:config.literal,regexp:null!==(_d=null===fallback||void 0===fallback?void 0:fallback.regexp)&&void 0!==_d?_d:config.regexp,wholeWord:null!==(_e=null===fallback||void 0===fallback?void 0:fallback.wholeWord)&&void 0!==_e?_e:config.wholeWord})}function getSearchInput(view$1){let panel=view.getPanel(view$1,createSearchPanel);return panel&&panel.dom.querySelector("[main-field]")}function selectSearchInput(view){let input=getSearchInput(view);input&&input==view.root.activeElement&&input.select()}/**
38
+ Make sure the search panel is open and focused.
39
+ */function phrase(view,phrase){return view.state.phrase(phrase)}function announceMatch(view$1,{from,to}){let line=view$1.state.doc.lineAt(from),lineEnd=view$1.state.doc.lineAt(to).to,start=Math.max(line.from,from-AnnounceMargin),end=Math.min(lineEnd,to+AnnounceMargin),text=view$1.state.sliceDoc(start,end);if(start!=line.from)for(let i=0;i<AnnounceMargin;i++)if(!Break.test(text[i+1])&&Break.test(text[i])){text=text.slice(i);break}if(end!=lineEnd)for(let i=text.length-1;i>text.length-AnnounceMargin;i--)if(!Break.test(text[i-1])&&Break.test(text[i])){text=text.slice(0,i);break}return view.EditorView.announce.of(`${view$1.state.phrase("current match")}. ${text} ${view$1.state.phrase("on line")} ${line.number}.`)}if(hasRequiredDist)return dist;hasRequiredDist=1;var view=require$$0,state=require$$1,elt=require$$2;const basicNormalize="function"==typeof String.prototype.normalize?x=>x.normalize("NFKD"):x=>x;/**
40
+ A search cursor provides an iterator over text matches in a
41
+ document.
42
+ */class SearchCursor{/**
43
+ Create a text cursor. The query is the search string, `from` to
44
+ `to` provides the region to search.
45
+
46
+ When `normalize` is given, it will be called, on both the query
47
+ string and the content it is matched against, before comparing.
48
+ You can, for example, create a case-insensitive search by
49
+ passing `s => s.toLowerCase()`.
50
+
51
+ Text is always normalized with
52
+ [`.normalize("NFKD")`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize)
53
+ (when supported).
54
+ */constructor(text,query,from=0,to=text.length,normalize,test){this.test=test,this.value={from:0,to:0,precise:!1},this.done=!1,this.matches=[],this.buffer="",this.bufferPos=0,this.iter=text.iterRange(from,to),this.bufferStart=from,this.normalize=normalize?x=>normalize(basicNormalize(x)):basicNormalize,this.query=this.normalize(query)}peek(){if(this.bufferPos==this.buffer.length){if(this.bufferStart+=this.buffer.length,this.iter.next(),this.iter.done)return-1;this.bufferPos=0,this.buffer=this.iter.value}return state.codePointAt(this.buffer,this.bufferPos)}/**
55
+ Look for the next match. Updates the iterator's
56
+ [`value`](https://codemirror.net/6/docs/ref/#search.SearchCursor.value) and
57
+ [`done`](https://codemirror.net/6/docs/ref/#search.SearchCursor.done) properties. Should be called
58
+ at least once before using the cursor.
59
+ */next(){for(;this.matches.length;)this.matches.pop();return this.nextOverlapping()}/**
60
+ The `next` method will ignore matches that partially overlap a
61
+ previous match. This method behaves like `next`, but includes
62
+ such matches.
63
+ */nextOverlapping(){for(;;){let next=this.peek();if(0>next)return this.done=!0,this;let str=state.fromCodePoint(next),start=this.bufferStart+this.bufferPos;this.bufferPos+=state.codePointSize(next);let norm=this.normalize(str);if(norm.length)for(let i=0,pos=start,posPrecise=!0;;i++){let code=norm.charCodeAt(i),match=this.match(code,pos,posPrecise,this.bufferPos+this.bufferStart,i==norm.length-1);if(match)return this.value=match,this;if(i==norm.length-1)break;posPrecise&&i<str.length&&str.charCodeAt(i)==code?pos++:posPrecise=!1}}}match(code,pos,posPrecise,end,endPrecise){let match=null;for(let i=0;i<this.matches.length;){let partial=this.matches[i],keep=!1;this.query.charCodeAt(partial.index)==code&&(partial.index==this.query.length-1?match={from:partial.from,to:end,precise:endPrecise&&partial.precise}:(partial.index++,keep=!0)),keep?i++:this.matches.splice(i,1)}return this.query.charCodeAt(0)==code&&(1==this.query.length?match={from:pos,to:end,precise:posPrecise&&endPrecise}:this.matches.push({from:pos,index:1,precise:posPrecise})),match&&this.test&&!this.test(match.from,match.to,this.buffer,this.bufferStart)&&(match=null),match}}"undefined"!=typeof Symbol&&(SearchCursor.prototype[Symbol.iterator]=function(){return this});const empty={from:-1,to:-1,match:/.*/.exec(""),precise:!0},baseFlags="gm"+(null==/x/.unicode?"":"u");/**
64
+ This class is similar to [`SearchCursor`](https://codemirror.net/6/docs/ref/#search.SearchCursor)
65
+ but searches for a regular expression pattern instead of a plain
66
+ string.
67
+ */class RegExpCursor{/**
68
+ Create a cursor that will search the given range in the given
69
+ document. `query` should be the raw pattern (as you'd pass it to
70
+ `new RegExp`).
71
+ */constructor(text,query,options,from=0,to=text.length){if(this.text=text,this.to=to,this.curLine="",this.done=!1,this.value=empty,/\\[sWDnr]|\n|\r|\[\^/.test(query))return new MultilineRegExpCursor(text,query,options,from,to);this.re=new RegExp(query,baseFlags+((null===options||void 0===options?void 0:options.ignoreCase)?"i":"")),this.test=null===options||void 0===options?void 0:options.test,this.iter=text.iter();let startLine=text.lineAt(from);this.curLineStart=startLine.from,this.matchPos=toCharEnd(text,from),this.getLine(this.curLineStart)}getLine(skip){this.iter.next(skip),this.iter.lineBreak?this.curLine="":(this.curLine=this.iter.value,this.curLineStart+this.curLine.length>this.to&&(this.curLine=this.curLine.slice(0,this.to-this.curLineStart)),this.iter.next())}nextLine(){this.curLineStart=this.curLineStart+this.curLine.length+1,this.curLineStart>this.to?this.curLine="":this.getLine(0)}/**
72
+ Move to the next match, if there is one.
73
+ */next(){for(let off=this.matchPos-this.curLineStart;;){this.re.lastIndex=off;let match=this.matchPos<=this.to&&this.re.exec(this.curLine);if(match){let from=this.curLineStart+match.index,to=from+match[0].length;if(this.matchPos=toCharEnd(this.text,to+(from==to?1:0)),from==this.curLineStart+this.curLine.length&&this.nextLine(),(from<to||from>this.value.to)&&(!this.test||this.test(from,to,match)))return this.value={from,to,precise:!0,match},this;off=this.matchPos-this.curLineStart}else if(this.curLineStart+this.curLine.length<this.to)this.nextLine(),off=0;else return this.done=!0,this}}}const flattened=new WeakMap;// Reusable (partially) flattened document strings
74
+ class FlattenedDoc{constructor(from,text){this.from=from,this.text=text}get to(){return this.from+this.text.length}static get(doc,from,to){let cached=flattened.get(doc);if(!cached||cached.from>=to||cached.to<=from){let flat=new FlattenedDoc(from,doc.sliceString(from,to));return flattened.set(doc,flat),flat}if(cached.from==from&&cached.to==to)return cached;let{text,from:cachedFrom}=cached;return cachedFrom>from&&(text=doc.sliceString(from,cachedFrom)+text,cachedFrom=from),cached.to<to&&(text+=doc.sliceString(cached.to,to)),flattened.set(doc,new FlattenedDoc(cachedFrom,text)),new FlattenedDoc(from,text.slice(from-cachedFrom,to-cachedFrom))}}class MultilineRegExpCursor{constructor(text,query,options,from,to){this.text=text,this.to=to,this.done=!1,this.value=empty,this.matchPos=toCharEnd(text,from),this.re=new RegExp(query,baseFlags+((null===options||void 0===options?void 0:options.ignoreCase)?"i":"")),this.test=null===options||void 0===options?void 0:options.test,this.flat=FlattenedDoc.get(text,from,this.chunkEnd(from+5e3/* Chunk.Base */))}chunkEnd(pos){return pos>=this.to?this.to:this.text.lineAt(pos).to}next(){for(;;){let off=this.re.lastIndex=this.matchPos-this.flat.from,match=this.re.exec(this.flat.text);// Skip empty matches directly after the last match
75
+ if(match&&!match[0]&&match.index==off&&(this.re.lastIndex=off+1,match=this.re.exec(this.flat.text)),match){let from=this.flat.from+match.index,to=from+match[0].length;// If a match goes almost to the end of a noncomplete chunk, try
76
+ // again, since it'll likely be able to match more
77
+ if((this.flat.to>=this.to||match.index+match[0].length<=this.flat.text.length-10)&&(!this.test||this.test(from,to,match)))return this.value={from,to,precise:!0,match},this.matchPos=toCharEnd(this.text,to+(from==to?1:0)),this}if(this.flat.to==this.to)return this.done=!0,this;// Grow the flattened doc
78
+ this.flat=FlattenedDoc.get(this.text,this.flat.from,this.chunkEnd(this.flat.from+2*this.flat.text.length))}}}"undefined"!=typeof Symbol&&(RegExpCursor.prototype[Symbol.iterator]=MultilineRegExpCursor.prototype[Symbol.iterator]=function(){return this});const gotoLine=view$1=>{let{state:state$1}=view$1,line=state$1.doc.lineAt(view$1.state.selection.main.head).number+"",{close,result}=view.showDialog(view$1,{label:state$1.phrase("Go to line"),input:{type:"text",name:"line",value:line},focus:!0,submitLabel:state$1.phrase("go")});return result.then(form=>{let match=form&&/^([+-])?(\d+)?(:\d+)?(%)?$/.exec(form.elements.line.value);if(!match)return void view$1.dispatch({effects:close});let startLine=state$1.doc.lineAt(state$1.selection.main.head),[,sign,ln,cl,percent]=match,col=cl?+cl.slice(1):0,line=ln?+ln:startLine.number;if(ln&&percent){let pc=line/100;sign&&(pc=pc*("-"==sign?-1:1)+startLine.number/state$1.doc.lines),line=Math.round(state$1.doc.lines*pc)}else ln&&sign&&(line=line*("-"==sign?-1:1)+startLine.number);let docLine=state$1.doc.line(Math.max(1,Math.min(state$1.doc.lines,line))),selection=state.EditorSelection.cursor(docLine.from+Math.max(0,Math.min(col,docLine.length)));view$1.dispatch({effects:[close,view.EditorView.scrollIntoView(selection.from,{y:"center"})],selection})}),!0},defaultHighlightOptions={highlightWordAroundCursor:!1,minSelectionLength:1,maxMatches:100,wholeWords:!1},highlightConfig=state.Facet.define({combine(options){return state.combineConfig(options,defaultHighlightOptions,{highlightWordAroundCursor:(a,b)=>a||b,minSelectionLength:Math.min,maxMatches:Math.min})}}),matchDeco=view.Decoration.mark({class:"cm-selectionMatch"}),mainMatchDeco=view.Decoration.mark({class:"cm-selectionMatch cm-selectionMatch-main"}),matchHighlighter=view.ViewPlugin.fromClass(class{constructor(view){this.decorations=this.getDeco(view)}update(update){(update.selectionSet||update.docChanged||update.viewportChanged)&&(this.decorations=this.getDeco(update.view))}getDeco(view$1){let conf=view$1.state.facet(highlightConfig),{state}=view$1,sel=state.selection;if(1<sel.ranges.length)return view.Decoration.none;let query,range=sel.main,check=null;if(range.empty){if(!conf.highlightWordAroundCursor)return view.Decoration.none;let word=state.wordAt(range.head);if(!word)return view.Decoration.none;check=state.charCategorizer(range.head),query=state.sliceDoc(word.from,word.to)}else{let len=range.to-range.from;if(len<conf.minSelectionLength||200<len)return view.Decoration.none;if(conf.wholeWords){if(query=state.sliceDoc(range.from,range.to),check=state.charCategorizer(range.head),!(insideWordBoundaries(check,state,range.from,range.to)&&insideWord(check,state,range.from,range.to)))return view.Decoration.none;}else if(query=state.sliceDoc(range.from,range.to),!query)return view.Decoration.none}let deco=[];for(let part of view$1.visibleRanges)for(let cursor=new SearchCursor(state.doc,query,part.from,part.to);!cursor.next().done;){let{from,to}=cursor.value;if((!check||insideWordBoundaries(check,state,from,to))&&(range.empty&&from<=range.from&&to>=range.to?deco.push(mainMatchDeco.range(from,to)):(from>=range.to||to<=range.from)&&deco.push(matchDeco.range(from,to)),deco.length>conf.maxMatches))return view.Decoration.none}return view.Decoration.set(deco)}},{decorations:v=>v.decorations}),defaultTheme=view.EditorView.baseTheme({".cm-selectionMatch":{backgroundColor:"#99ff7780"},".cm-searchMatch .cm-selectionMatch":{backgroundColor:"transparent"}}),selectWord=({state:state$1,dispatch})=>{let{selection}=state$1,newSel=state.EditorSelection.create(selection.ranges.map(range=>state$1.wordAt(range.head)||state.EditorSelection.cursor(range.head)),selection.mainIndex);return!newSel.eq(selection)&&(dispatch(state$1.update({selection:newSel})),!0)},selectNextOccurrence=({state:state$1,dispatch})=>{let{ranges}=state$1.selection;if(ranges.some(sel=>sel.from===sel.to))return selectWord({state:state$1,dispatch});let searchedText=state$1.sliceDoc(ranges[0].from,ranges[0].to);if(state$1.selection.ranges.some(r=>state$1.sliceDoc(r.from,r.to)!=searchedText))return!1;let range=findNextOccurrence(state$1,searchedText);return!!range&&(dispatch(state$1.update({selection:state$1.selection.addRange(state.EditorSelection.range(range.from,range.to),!1),effects:view.EditorView.scrollIntoView(range.to)})),!0)},searchConfigFacet=state.Facet.define({combine(configs){return state.combineConfig(configs,{top:!1,caseSensitive:!1,literal:!1,regexp:!1,wholeWord:!1,createPanel:view=>new SearchPanel(view),scrollToMatch:range=>view.EditorView.scrollIntoView(range)})}});// Select the words around the cursors.
79
+ class SearchQuery{/**
80
+ Create a query object.
81
+ */constructor(config){this.search=config.search,this.caseSensitive=!!config.caseSensitive,this.literal=!!config.literal,this.regexp=!!config.regexp,this.replace=config.replace||"",this.valid=!!this.search&&(!this.regexp||validRegExp(this.search)),this.unquoted=this.unquote(this.search),this.wholeWord=!!config.wholeWord,this.test=config.test}/**
82
+ @internal
83
+ */unquote(text){return this.literal?text:text.replace(/\\([nrt\\])/g,(_,ch)=>"n"==ch?"\n":"r"==ch?"\r":"t"==ch?"\t":"\\")}/**
84
+ Compare this query to another query.
85
+ */eq(other){return this.search==other.search&&this.replace==other.replace&&this.caseSensitive==other.caseSensitive&&this.regexp==other.regexp&&this.wholeWord==other.wholeWord&&this.test==other.test}/**
86
+ @internal
87
+ */create(){return this.regexp?new RegExpQuery(this):new StringQuery(this)}/**
88
+ Get a search cursor for this query, searching through the given
89
+ range in the given state.
90
+ */getCursor(state$1,from=0,to){let st=state$1.doc?state$1:state.EditorState.create({doc:state$1});return null==to&&(to=st.doc.length),this.regexp?regexpCursor(this,st,from,to):stringCursor(this,st,from,to)}}class QueryType{constructor(spec){this.spec=spec}}class StringQuery extends QueryType{constructor(spec){super(spec)}nextMatch(state,curFrom,curTo){let cursor=stringCursor(this.spec,state,curTo,state.doc.length).nextOverlapping();if(cursor.done){let end=Math.min(state.doc.length,curFrom+this.spec.unquoted.length);cursor=stringCursor(this.spec,state,0,end).nextOverlapping()}return cursor.done||cursor.value.from==curFrom&&cursor.value.to==curTo?null:cursor.value}// Searching in reverse is, rather than implementing an inverted search
91
+ // cursor, done by scanning chunk after chunk forward.
92
+ prevMatchInRange(state,from,to){for(let pos=to;;){let start=Math.max(from,pos-1e4/* FindPrev.ChunkSize */-this.spec.unquoted.length),cursor=stringCursor(this.spec,state,start,pos),range=null;for(;!cursor.nextOverlapping().done;)range=cursor.value;if(range)return range;if(start==from)return null;pos-=1e4/* FindPrev.ChunkSize */}}prevMatch(state,curFrom,curTo){let found=this.prevMatchInRange(state,0,curFrom);return found||(found=this.prevMatchInRange(state,Math.max(0,curTo-this.spec.unquoted.length),state.doc.length)),found&&(found.from!=curFrom||found.to!=curTo)?found:null}getReplacement(_result){return this.spec.unquote(this.spec.replace)}matchAll(state,limit){let cursor=stringCursor(this.spec,state,0,state.doc.length),ranges=[];for(;!cursor.next().done;){if(ranges.length>=limit)return null;ranges.push(cursor.value)}return ranges}highlight(state,from,to,add){for(let cursor=stringCursor(this.spec,state,Math.max(0,from-this.spec.unquoted.length),Math.min(to+this.spec.unquoted.length,state.doc.length));!cursor.next().done;)add(cursor.value.from,cursor.value.to)}}class RegExpQuery extends QueryType{nextMatch(state,curFrom,curTo){let cursor=regexpCursor(this.spec,state,curTo,state.doc.length).next();return cursor.done&&(cursor=regexpCursor(this.spec,state,0,curFrom).next()),cursor.done?null:cursor.value}prevMatchInRange(state,from,to){for(let size=1;;size++){let start=Math.max(from,to-1e4*size/* FindPrev.ChunkSize */),cursor=regexpCursor(this.spec,state,start,to),range=null;for(;!cursor.next().done;)range=cursor.value;if(range&&(start==from||range.from>start+10))return range;if(start==from)return null}}prevMatch(state,curFrom,curTo){return this.prevMatchInRange(state,0,curFrom)||this.prevMatchInRange(state,curTo,state.doc.length)}getReplacement(result){return this.spec.unquote(this.spec.replace).replace(/\$([$&]|\d+)/g,(m,i)=>{if("&"==i)return result.match[0];if("$"==i)return"$";for(let n,l=i.length;0<l;l--)if(n=+i.slice(0,l),0<n&&n<result.match.length)return result.match[n]+i.slice(l);return m})}matchAll(state,limit){let cursor=regexpCursor(this.spec,state,0,state.doc.length),ranges=[];for(;!cursor.next().done;){if(ranges.length>=limit)return null;ranges.push(cursor.value)}return ranges}highlight(state,from,to,add){for(let cursor=regexpCursor(this.spec,state,Math.max(0,from-250/* RegExp.HighlightMargin */),Math.min(to+250/* RegExp.HighlightMargin */,state.doc.length));!cursor.next().done;)add(cursor.value.from,cursor.value.to)}}/**
93
+ A state effect that updates the current search query. Note that
94
+ this only has an effect if the search state has been initialized
95
+ (by including [`search`](https://codemirror.net/6/docs/ref/#search.search) in your configuration or
96
+ by running [`openSearchPanel`](https://codemirror.net/6/docs/ref/#search.openSearchPanel) at least
97
+ once).
98
+ */const setSearchQuery=state.StateEffect.define(),togglePanel=state.StateEffect.define(),searchState=state.StateField.define({create(state){return new SearchState(defaultQuery(state).create(),null)},update(value,tr){for(let effect of tr.effects)effect.is(setSearchQuery)?value=new SearchState(effect.value.create(),value.panel):effect.is(togglePanel)&&(value=new SearchState(value.query,effect.value?createSearchPanel:null));return value},provide:f=>view.showPanel.from(f,val=>val.panel)});class SearchState{constructor(query,panel){this.query=query,this.panel=panel}}const matchMark=view.Decoration.mark({class:"cm-searchMatch"}),selectedMatchMark=view.Decoration.mark({class:"cm-searchMatch cm-searchMatch-selected"}),searchHighlighter=view.ViewPlugin.fromClass(class{constructor(view){this.view=view,this.decorations=this.highlight(view.state.field(searchState))}update(update){let state=update.state.field(searchState);(state!=update.startState.field(searchState)||update.docChanged||update.selectionSet||update.viewportChanged)&&(this.decorations=this.highlight(state))}highlight({query,panel}){if(!panel||!query.spec.valid)return view.Decoration.none;let{view:view$1}=this,builder=new state.RangeSetBuilder;for(let i=0,ranges=view$1.visibleRanges,l=ranges.length;i<l;i++){let{from,to}=ranges[i];for(;i<l-1&&to>ranges[i+1].from-500/* RegExp.HighlightMargin */;)to=ranges[++i].to;query.highlight(view$1.state,from,to,(from,to)=>{let selected=view$1.state.selection.ranges.some(r=>r.from==from&&r.to==to);builder.add(from,to,selected?selectedMatchMark:matchMark)})}return builder.finish()}},{decorations:v=>v.decorations}),findNext=searchCommand((view,{query})=>{let{to}=view.state.selection.main,next=query.nextMatch(view.state,to,to);if(!next)return!1;let selection=state.EditorSelection.single(next.from,next.to),config=view.state.facet(searchConfigFacet);return view.dispatch({selection,effects:[announceMatch(view,next),config.scrollToMatch(selection.main,view)],userEvent:"select.search"}),selectSearchInput(view),!0}),findPrevious=searchCommand((view,{query})=>{let{state:state$1}=view,{from}=state$1.selection.main,prev=query.prevMatch(state$1,from,from);if(!prev)return!1;let selection=state.EditorSelection.single(prev.from,prev.to),config=view.state.facet(searchConfigFacet);return view.dispatch({selection,effects:[announceMatch(view,prev),config.scrollToMatch(selection.main,view)],userEvent:"select.search"}),selectSearchInput(view),!0}),selectMatches=searchCommand((view,{query})=>{let ranges=query.matchAll(view.state,1e3);return!!(ranges&&ranges.length)&&(view.dispatch({selection:state.EditorSelection.create(ranges.map(r=>state.EditorSelection.range(r.from,r.to))),userEvent:"select.search.matches"}),!0)}),selectSelectionMatches=({state:state$1,dispatch})=>{let sel=state$1.selection;if(1<sel.ranges.length||sel.main.empty)return!1;let{from,to}=sel.main,ranges=[],main=0;for(let cur=new SearchCursor(state$1.doc,state$1.sliceDoc(from,to));!cur.next().done;){if(1e3<ranges.length)return!1;cur.value.from==from&&(main=ranges.length),ranges.push(state.EditorSelection.range(cur.value.from,cur.value.to))}return dispatch(state$1.update({selection:state.EditorSelection.create(ranges,main),userEvent:"select.search.matches"})),!0},replaceNext=searchCommand((view$1,{query})=>{let{state:state$1}=view$1,{from,to}=state$1.selection.main;if(state$1.readOnly)return!1;let match=query.nextMatch(state$1,from,from);if(!match)return!1;let selection,replacement,next=match,changes=[],effects=[];next.precise?next.from==from&&next.to==to&&(replacement=state$1.toText(query.getReplacement(next)),changes.push({from:next.from,to:next.to,insert:replacement}),effects.push(view.EditorView.announce.of(state$1.phrase("replaced match on line $",state$1.doc.lineAt(from).number)+"."))):next=query.nextMatch(state$1,next.from,next.to);let changeSet=view$1.state.changes(changes);return next&&(selection=state.EditorSelection.single(next.from,next.to).map(changeSet),effects.push(announceMatch(view$1,next)),effects.push(state$1.facet(searchConfigFacet).scrollToMatch(selection.main,view$1))),view$1.dispatch({changes:changeSet,selection,effects,userEvent:"input.replace"}),!0}),replaceAll=searchCommand((view$1,{query})=>{if(view$1.state.readOnly)return!1;let changes=[];for(let match of query.matchAll(view$1.state,1e9)){let{from,to,precise}=match;precise&&changes.push({from,to,insert:query.getReplacement(match)})}if(!changes.length)return!1;let announceText=view$1.state.phrase("replaced $ matches",changes.length)+".";return view$1.dispatch({changes,effects:view.EditorView.announce.of(announceText),userEvent:"input.replace.all"}),!0}),openSearchPanel=view=>{let state$1=view.state.field(searchState,!1);if(state$1&&state$1.panel){let searchInput=getSearchInput(view);if(searchInput&&searchInput!=view.root.activeElement){let query=defaultQuery(view.state,state$1.query.spec);query.valid&&view.dispatch({effects:setSearchQuery.of(query)}),searchInput.focus(),searchInput.select()}}else view.dispatch({effects:[togglePanel.of(!0),state$1?setSearchQuery.of(defaultQuery(view.state,state$1.query.spec)):state.StateEffect.appendConfig.of(searchExtensions)]});return!0},closeSearchPanel=view$1=>{let state=view$1.state.field(searchState,!1);if(!state||!state.panel)return!1;let panel=view.getPanel(view$1,createSearchPanel);return panel&&panel.dom.contains(view$1.root.activeElement)&&view$1.focus(),view$1.dispatch({effects:togglePanel.of(!1)}),!0},searchKeymap=[{key:"Mod-f",run:openSearchPanel,scope:"editor search-panel"},{key:"F3",run:findNext,shift:findPrevious,scope:"editor search-panel",preventDefault:!0},{key:"Mod-g",run:findNext,shift:findPrevious,scope:"editor search-panel",preventDefault:!0},{key:"Escape",run:closeSearchPanel,scope:"editor search-panel"},{key:"Mod-Shift-l",run:selectSelectionMatches},{key:"Mod-Alt-g",run:gotoLine},{key:"Mod-d",run:selectNextOccurrence,preventDefault:!0}];/**
99
+ Move the selection to the previous instance of the search query,
100
+ before the current main selection. Will wrap past the start
101
+ of the document to start searching at the end again.
102
+ */ /**
103
+ Select all instances of the search query.
104
+ */ /**
105
+ Select all instances of the currently selected text.
106
+ */ /**
107
+ Replace the current match of the search query.
108
+ */ /**
109
+ Replace all instances of the search query with the given
110
+ replacement.
111
+ */ /**
112
+ Close the search panel.
113
+ */ /**
114
+ Default search-related key bindings.
115
+
116
+ - Mod-f: [`openSearchPanel`](https://codemirror.net/6/docs/ref/#search.openSearchPanel)
117
+ - F3, Mod-g: [`findNext`](https://codemirror.net/6/docs/ref/#search.findNext)
118
+ - Shift-F3, Shift-Mod-g: [`findPrevious`](https://codemirror.net/6/docs/ref/#search.findPrevious)
119
+ - Mod-Alt-g: [`gotoLine`](https://codemirror.net/6/docs/ref/#search.gotoLine)
120
+ - Mod-d: [`selectNextOccurrence`](https://codemirror.net/6/docs/ref/#search.selectNextOccurrence)
121
+ */class SearchPanel{constructor(view){function button(name,onclick,content){return elt("button",{class:"cm-button",name,onclick,type:"button"},content)}this.view=view;let query=this.query=view.state.field(searchState).query.spec;this.commit=this.commit.bind(this),this.searchField=elt("input",{value:query.search,placeholder:phrase(view,"Find"),"aria-label":phrase(view,"Find"),class:"cm-textfield",name:"search",form:"","main-field":"true",onchange:this.commit,onkeyup:this.commit}),this.replaceField=elt("input",{value:query.replace,placeholder:phrase(view,"Replace"),"aria-label":phrase(view,"Replace"),class:"cm-textfield",name:"replace",form:"",onchange:this.commit,onkeyup:this.commit}),this.caseField=elt("input",{type:"checkbox",name:"case",form:"",checked:query.caseSensitive,onchange:this.commit}),this.reField=elt("input",{type:"checkbox",name:"re",form:"",checked:query.regexp,onchange:this.commit}),this.wordField=elt("input",{type:"checkbox",name:"word",form:"",checked:query.wholeWord,onchange:this.commit}),this.dom=elt("div",{onkeydown:e=>this.keydown(e),class:"cm-search"},[this.searchField,button("next",()=>findNext(view),[phrase(view,"next")]),button("prev",()=>findPrevious(view),[phrase(view,"previous")]),button("select",()=>selectMatches(view),[phrase(view,"all")]),elt("label",null,[this.caseField,phrase(view,"match case")]),elt("label",null,[this.reField,phrase(view,"regexp")]),elt("label",null,[this.wordField,phrase(view,"by word")]),...(view.state.readOnly?[]:[elt("br"),this.replaceField,button("replace",()=>replaceNext(view),[phrase(view,"replace")]),button("replaceAll",()=>replaceAll(view),[phrase(view,"replace all")])]),elt("button",{name:"close",onclick:()=>closeSearchPanel(view),"aria-label":phrase(view,"close"),type:"button"},["\xD7"])])}commit(){let query=new SearchQuery({search:this.searchField.value,caseSensitive:this.caseField.checked,regexp:this.reField.checked,wholeWord:this.wordField.checked,replace:this.replaceField.value});query.eq(this.query)||(this.query=query,this.view.dispatch({effects:setSearchQuery.of(query)}))}keydown(e){view.runScopeHandlers(this.view,e,"search-panel")?e.preventDefault():13==e.keyCode&&e.target==this.searchField?(e.preventDefault(),(e.shiftKey?findPrevious:findNext)(this.view)):13==e.keyCode&&e.target==this.replaceField&&(e.preventDefault(),replaceNext(this.view))}update(update){for(let tr of update.transactions)for(let effect of tr.effects)effect.is(setSearchQuery)&&!effect.value.eq(this.query)&&this.setQuery(effect.value)}setQuery(query){this.query=query,this.searchField.value=query.search,this.replaceField.value=query.replace,this.caseField.checked=query.caseSensitive,this.reField.checked=query.regexp,this.wordField.checked=query.wholeWord}mount(){this.searchField.select()}get pos(){return 80}get top(){return this.view.state.facet(searchConfigFacet).top}}const AnnounceMargin=30,Break=/[\s\.,:;?!]/,baseTheme=view.EditorView.baseTheme({".cm-panel.cm-search":{padding:"2px 6px 4px",position:"relative","& [name=close]":{position:"absolute",top:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:0,margin:0},"& input, & button, & label":{margin:".2em .6em .2em 0"},"& input[type=checkbox]":{marginRight:".2em"},"& label":{fontSize:"80%",whiteSpace:"pre"}},"&light .cm-searchMatch":{backgroundColor:"#ffff0054"},"&dark .cm-searchMatch":{backgroundColor:"#00ffff8a"},"&light .cm-searchMatch-selected":{backgroundColor:"#ff6a0054"},"&dark .cm-searchMatch-selected":{backgroundColor:"#ff00ff8a"}}),searchExtensions=[searchState,state.Prec.low(searchHighlighter),baseTheme];return dist.RegExpCursor=RegExpCursor,dist.SearchCursor=SearchCursor,dist.SearchQuery=SearchQuery,dist.closeSearchPanel=closeSearchPanel,dist.findNext=findNext,dist.findPrevious=findPrevious,dist.getSearchQuery=getSearchQuery,dist.gotoLine=gotoLine,dist.highlightSelectionMatches=highlightSelectionMatches,dist.openSearchPanel=openSearchPanel,dist.replaceAll=replaceAll,dist.replaceNext=replaceNext,dist.search=search,dist.searchKeymap=searchKeymap,dist.searchPanelOpen=searchPanelOpen,dist.selectMatches=selectMatches,dist.selectNextOccurrence=selectNextOccurrence,dist.selectSelectionMatches=selectSelectionMatches,dist.setSearchQuery=setSearchQuery,dist}(),index=/*@__PURE__*/function getDefaultExportFromCjs(x){return x}(distExports);return module.exports=index,module.exports}