{"version":3,"sources":["jsdelivr-header.js","/npm/codemirror@5.65.4/addon/search/search.js"],"names":[],"mappings":"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","file":"/npm/codemirror@5.65.4/addon/search/search.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/codemirror@5.65.4/addon/search/search.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// Define search commands. Depends on dialog.js or another\n// implementation of the openDialog method.\n\n// Replace works a little oddly -- it will do the replace on the next\n// Ctrl-G (or whatever is bound to findNext) press. You prevent a\n// replace by making sure the match is no longer selected when hitting\n// Ctrl-G.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"./searchcursor\"), require(\"../dialog/dialog\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"./searchcursor\", \"../dialog/dialog\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  // default search panel location\n  CodeMirror.defineOption(\"search\", {bottom: false});\n\n  function searchOverlay(query, caseInsensitive) {\n    if (typeof query == \"string\")\n      query = new RegExp(query.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\"), caseInsensitive ? \"gi\" : \"g\");\n    else if (!query.global)\n      query = new RegExp(query.source, query.ignoreCase ? \"gi\" : \"g\");\n\n    return {token: function(stream) {\n      query.lastIndex = stream.pos;\n      var match = query.exec(stream.string);\n      if (match && match.index == stream.pos) {\n        stream.pos += match[0].length || 1;\n        return \"searching\";\n      } else if (match) {\n        stream.pos = match.index;\n      } else {\n        stream.skipToEnd();\n      }\n    }};\n  }\n\n  function SearchState() {\n    this.posFrom = this.posTo = this.lastQuery = this.query = null;\n    this.overlay = null;\n  }\n\n  function getSearchState(cm) {\n    return cm.state.search || (cm.state.search = new SearchState());\n  }\n\n  function queryCaseInsensitive(query) {\n    return typeof query == \"string\" && query == query.toLowerCase();\n  }\n\n  function getSearchCursor(cm, query, pos) {\n    // Heuristic: if the query string is all lowercase, do a case insensitive search.\n    return cm.getSearchCursor(query, pos, {caseFold: queryCaseInsensitive(query), multiline: true});\n  }\n\n  function persistentDialog(cm, text, deflt, onEnter, onKeyDown) {\n    cm.openDialog(text, onEnter, {\n      value: deflt,\n      selectValueOnOpen: true,\n      closeOnEnter: false,\n      onClose: function() { clearSearch(cm); },\n      onKeyDown: onKeyDown,\n      bottom: cm.options.search.bottom\n    });\n  }\n\n  function dialog(cm, text, shortText, deflt, f) {\n    if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true, bottom: cm.options.search.bottom});\n    else f(prompt(shortText, deflt));\n  }\n\n  function confirmDialog(cm, text, shortText, fs) {\n    if (cm.openConfirm) cm.openConfirm(text, fs);\n    else if (confirm(shortText)) fs[0]();\n  }\n\n  function parseString(string) {\n    return string.replace(/\\\\([nrt\\\\])/g, function(match, ch) {\n      if (ch == \"n\") return \"\\n\"\n      if (ch == \"r\") return \"\\r\"\n      if (ch == \"t\") return \"\\t\"\n      if (ch == \"\\\\\") return \"\\\\\"\n      return match\n    })\n  }\n\n  function parseQuery(query) {\n    var isRE = query.match(/^\\/(.*)\\/([a-z]*)$/);\n    if (isRE) {\n      try { query = new RegExp(isRE[1], isRE[2].indexOf(\"i\") == -1 ? \"\" : \"i\"); }\n      catch(e) {} // Not a regular expression after all, do a string search\n    } else {\n      query = parseString(query)\n    }\n    if (typeof query == \"string\" ? query == \"\" : query.test(\"\"))\n      query = /x^/;\n    return query;\n  }\n\n  function startSearch(cm, state, query) {\n    state.queryText = query;\n    state.query = parseQuery(query);\n    cm.removeOverlay(state.overlay, queryCaseInsensitive(state.query));\n    state.overlay = searchOverlay(state.query, queryCaseInsensitive(state.query));\n    cm.addOverlay(state.overlay);\n    if (cm.showMatchesOnScrollbar) {\n      if (state.annotate) { state.annotate.clear(); state.annotate = null; }\n      state.annotate = cm.showMatchesOnScrollbar(state.query, queryCaseInsensitive(state.query));\n    }\n  }\n\n  function doSearch(cm, rev, persistent, immediate) {\n    var state = getSearchState(cm);\n    if (state.query) return findNext(cm, rev);\n    var q = cm.getSelection() || state.lastQuery;\n    if (q instanceof RegExp && q.source == \"x^\") q = null\n    if (persistent && cm.openDialog) {\n      var hiding = null\n      var searchNext = function(query, event) {\n        CodeMirror.e_stop(event);\n        if (!query) return;\n        if (query != state.queryText) {\n          startSearch(cm, state, query);\n          state.posFrom = state.posTo = cm.getCursor();\n        }\n        if (hiding) hiding.style.opacity = 1\n        findNext(cm, event.shiftKey, function(_, to) {\n          var dialog\n          if (to.line < 3 && document.querySelector &&\n              (dialog = cm.display.wrapper.querySelector(\".CodeMirror-dialog\")) &&\n              dialog.getBoundingClientRect().bottom - 4 > cm.cursorCoords(to, \"window\").top)\n            (hiding = dialog).style.opacity = .4\n        })\n      };\n      persistentDialog(cm, getQueryDialog(cm), q, searchNext, function(event, query) {\n        var keyName = CodeMirror.keyName(event)\n        var extra = cm.getOption('extraKeys'), cmd = (extra && extra[keyName]) || CodeMirror.keyMap[cm.getOption(\"keyMap\")][keyName]\n        if (cmd == \"findNext\" || cmd == \"findPrev\" ||\n          cmd == \"findPersistentNext\" || cmd == \"findPersistentPrev\") {\n          CodeMirror.e_stop(event);\n          startSearch(cm, getSearchState(cm), query);\n          cm.execCommand(cmd);\n        } else if (cmd == \"find\" || cmd == \"findPersistent\") {\n          CodeMirror.e_stop(event);\n          searchNext(query, event);\n        }\n      });\n      if (immediate && q) {\n        startSearch(cm, state, q);\n        findNext(cm, rev);\n      }\n    } else {\n      dialog(cm, getQueryDialog(cm), \"Search for:\", q, function(query) {\n        if (query && !state.query) cm.operation(function() {\n          startSearch(cm, state, query);\n          state.posFrom = state.posTo = cm.getCursor();\n          findNext(cm, rev);\n        });\n      });\n    }\n  }\n\n  function findNext(cm, rev, callback) {cm.operation(function() {\n    var state = getSearchState(cm);\n    var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo);\n    if (!cursor.find(rev)) {\n      cursor = getSearchCursor(cm, state.query, rev ? CodeMirror.Pos(cm.lastLine()) : CodeMirror.Pos(cm.firstLine(), 0));\n      if (!cursor.find(rev)) return;\n    }\n    cm.setSelection(cursor.from(), cursor.to());\n    cm.scrollIntoView({from: cursor.from(), to: cursor.to()}, 20);\n    state.posFrom = cursor.from(); state.posTo = cursor.to();\n    if (callback) callback(cursor.from(), cursor.to())\n  });}\n\n  function clearSearch(cm) {cm.operation(function() {\n    var state = getSearchState(cm);\n    state.lastQuery = state.query;\n    if (!state.query) return;\n    state.query = state.queryText = null;\n    cm.removeOverlay(state.overlay);\n    if (state.annotate) { state.annotate.clear(); state.annotate = null; }\n  });}\n\n  function el(tag, attrs) {\n    var element = tag ? document.createElement(tag) : document.createDocumentFragment();\n    for (var key in attrs) {\n      element[key] = attrs[key];\n    }\n    for (var i = 2; i < arguments.length; i++) {\n      var child = arguments[i]\n      element.appendChild(typeof child == \"string\" ? document.createTextNode(child) : child);\n    }\n    return element;\n  }\n\n  function getQueryDialog(cm)  {\n    return el(\"\", null,\n              el(\"span\", {className: \"CodeMirror-search-label\"}, cm.phrase(\"Search:\")), \" \",\n              el(\"input\", {type: \"text\", \"style\": \"width: 10em\", className: \"CodeMirror-search-field\"}), \" \",\n              el(\"span\", {style: \"color: #888\", className: \"CodeMirror-search-hint\"},\n                 cm.phrase(\"(Use /re/ syntax for regexp search)\")));\n  }\n  function getReplaceQueryDialog(cm) {\n    return el(\"\", null, \" \",\n              el(\"input\", {type: \"text\", \"style\": \"width: 10em\", className: \"CodeMirror-search-field\"}), \" \",\n              el(\"span\", {style: \"color: #888\", className: \"CodeMirror-search-hint\"},\n                 cm.phrase(\"(Use /re/ syntax for regexp search)\")));\n  }\n  function getReplacementQueryDialog(cm) {\n    return el(\"\", null,\n              el(\"span\", {className: \"CodeMirror-search-label\"}, cm.phrase(\"With:\")), \" \",\n              el(\"input\", {type: \"text\", \"style\": \"width: 10em\", className: \"CodeMirror-search-field\"}));\n  }\n  function getDoReplaceConfirm(cm) {\n    return el(\"\", null,\n              el(\"span\", {className: \"CodeMirror-search-label\"}, cm.phrase(\"Replace?\")), \" \",\n              el(\"button\", {}, cm.phrase(\"Yes\")), \" \",\n              el(\"button\", {}, cm.phrase(\"No\")), \" \",\n              el(\"button\", {}, cm.phrase(\"All\")), \" \",\n              el(\"button\", {}, cm.phrase(\"Stop\")));\n  }\n\n  function replaceAll(cm, query, text) {\n    cm.operation(function() {\n      for (var cursor = getSearchCursor(cm, query); cursor.findNext();) {\n        if (typeof query != \"string\") {\n          var match = cm.getRange(cursor.from(), cursor.to()).match(query);\n          cursor.replace(text.replace(/\\$(\\d)/g, function(_, i) {return match[i];}));\n        } else cursor.replace(text);\n      }\n    });\n  }\n\n  function replace(cm, all) {\n    if (cm.getOption(\"readOnly\")) return;\n    var query = cm.getSelection() || getSearchState(cm).lastQuery;\n    var dialogText = all ? cm.phrase(\"Replace all:\") : cm.phrase(\"Replace:\")\n    var fragment = el(\"\", null,\n                      el(\"span\", {className: \"CodeMirror-search-label\"}, dialogText),\n                      getReplaceQueryDialog(cm))\n    dialog(cm, fragment, dialogText, query, function(query) {\n      if (!query) return;\n      query = parseQuery(query);\n      dialog(cm, getReplacementQueryDialog(cm), cm.phrase(\"Replace with:\"), \"\", function(text) {\n        text = parseString(text)\n        if (all) {\n          replaceAll(cm, query, text)\n        } else {\n          clearSearch(cm);\n          var cursor = getSearchCursor(cm, query, cm.getCursor(\"from\"));\n          var advance = function() {\n            var start = cursor.from(), match;\n            if (!(match = cursor.findNext())) {\n              cursor = getSearchCursor(cm, query);\n              if (!(match = cursor.findNext()) ||\n                  (start && cursor.from().line == start.line && cursor.from().ch == start.ch)) return;\n            }\n            cm.setSelection(cursor.from(), cursor.to());\n            cm.scrollIntoView({from: cursor.from(), to: cursor.to()});\n            confirmDialog(cm, getDoReplaceConfirm(cm), cm.phrase(\"Replace?\"),\n                          [function() {doReplace(match);}, advance,\n                           function() {replaceAll(cm, query, text)}]);\n          };\n          var doReplace = function(match) {\n            cursor.replace(typeof query == \"string\" ? text :\n                           text.replace(/\\$(\\d)/g, function(_, i) {return match[i];}));\n            advance();\n          };\n          advance();\n        }\n      });\n    });\n  }\n\n  CodeMirror.commands.find = function(cm) {clearSearch(cm); doSearch(cm);};\n  CodeMirror.commands.findPersistent = function(cm) {clearSearch(cm); doSearch(cm, false, true);};\n  CodeMirror.commands.findPersistentNext = function(cm) {doSearch(cm, false, true, true);};\n  CodeMirror.commands.findPersistentPrev = function(cm) {doSearch(cm, true, true, true);};\n  CodeMirror.commands.findNext = doSearch;\n  CodeMirror.commands.findPrev = function(cm) {doSearch(cm, true);};\n  CodeMirror.commands.clearSearch = clearSearch;\n  CodeMirror.commands.replace = replace;\n  CodeMirror.commands.replaceAll = function(cm) {replace(cm, true);};\n});\n"]}