/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/

var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __commonJS = (cb, mod) => function __require() {
  return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var __export = (target, all) => {
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
  if (from && typeof from === "object" || typeof from === "function") {
    for (let key of __getOwnPropNames(from))
      if (!__hasOwnProp.call(to, key) && key !== except)
        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  }
  return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);

// node_modules/sprintf-js/src/sprintf.js
var require_sprintf = __commonJS({
  "node_modules/sprintf-js/src/sprintf.js"(exports) {
    !function() {
      "use strict";
      var re = {
        not_string: /[^s]/,
        not_bool: /[^t]/,
        not_type: /[^T]/,
        not_primitive: /[^v]/,
        number: /[diefg]/,
        numeric_arg: /[bcdiefguxX]/,
        json: /[j]/,
        not_json: /[^j]/,
        text: /^[^\x25]+/,
        modulo: /^\x25{2}/,
        placeholder: /^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,
        key: /^([a-z_][a-z_\d]*)/i,
        key_access: /^\.([a-z_][a-z_\d]*)/i,
        index_access: /^\[(\d+)\]/,
        sign: /^[+-]/
      };
      function sprintf2(key) {
        return sprintf_format(sprintf_parse(key), arguments);
      }
      function vsprintf(fmt, argv) {
        return sprintf2.apply(null, [fmt].concat(argv || []));
      }
      function sprintf_format(parse_tree, argv) {
        var cursor = 1, tree_length = parse_tree.length, arg, output = "", i, k, ph, pad, pad_character, pad_length, is_positive, sign;
        for (i = 0; i < tree_length; i++) {
          if (typeof parse_tree[i] === "string") {
            output += parse_tree[i];
          } else if (typeof parse_tree[i] === "object") {
            ph = parse_tree[i];
            if (ph.keys) {
              arg = argv[cursor];
              for (k = 0; k < ph.keys.length; k++) {
                if (arg == void 0) {
                  throw new Error(sprintf2('[sprintf] Cannot access property "%s" of undefined value "%s"', ph.keys[k], ph.keys[k - 1]));
                }
                arg = arg[ph.keys[k]];
              }
            } else if (ph.param_no) {
              arg = argv[ph.param_no];
            } else {
              arg = argv[cursor++];
            }
            if (re.not_type.test(ph.type) && re.not_primitive.test(ph.type) && arg instanceof Function) {
              arg = arg();
            }
            if (re.numeric_arg.test(ph.type) && (typeof arg !== "number" && isNaN(arg))) {
              throw new TypeError(sprintf2("[sprintf] expecting number but found %T", arg));
            }
            if (re.number.test(ph.type)) {
              is_positive = arg >= 0;
            }
            switch (ph.type) {
              case "b":
                arg = parseInt(arg, 10).toString(2);
                break;
              case "c":
                arg = String.fromCharCode(parseInt(arg, 10));
                break;
              case "d":
              case "i":
                arg = parseInt(arg, 10);
                break;
              case "j":
                arg = JSON.stringify(arg, null, ph.width ? parseInt(ph.width) : 0);
                break;
              case "e":
                arg = ph.precision ? parseFloat(arg).toExponential(ph.precision) : parseFloat(arg).toExponential();
                break;
              case "f":
                arg = ph.precision ? parseFloat(arg).toFixed(ph.precision) : parseFloat(arg);
                break;
              case "g":
                arg = ph.precision ? String(Number(arg.toPrecision(ph.precision))) : parseFloat(arg);
                break;
              case "o":
                arg = (parseInt(arg, 10) >>> 0).toString(8);
                break;
              case "s":
                arg = String(arg);
                arg = ph.precision ? arg.substring(0, ph.precision) : arg;
                break;
              case "t":
                arg = String(!!arg);
                arg = ph.precision ? arg.substring(0, ph.precision) : arg;
                break;
              case "T":
                arg = Object.prototype.toString.call(arg).slice(8, -1).toLowerCase();
                arg = ph.precision ? arg.substring(0, ph.precision) : arg;
                break;
              case "u":
                arg = parseInt(arg, 10) >>> 0;
                break;
              case "v":
                arg = arg.valueOf();
                arg = ph.precision ? arg.substring(0, ph.precision) : arg;
                break;
              case "x":
                arg = (parseInt(arg, 10) >>> 0).toString(16);
                break;
              case "X":
                arg = (parseInt(arg, 10) >>> 0).toString(16).toUpperCase();
                break;
            }
            if (re.json.test(ph.type)) {
              output += arg;
            } else {
              if (re.number.test(ph.type) && (!is_positive || ph.sign)) {
                sign = is_positive ? "+" : "-";
                arg = arg.toString().replace(re.sign, "");
              } else {
                sign = "";
              }
              pad_character = ph.pad_char ? ph.pad_char === "0" ? "0" : ph.pad_char.charAt(1) : " ";
              pad_length = ph.width - (sign + arg).length;
              pad = ph.width ? pad_length > 0 ? pad_character.repeat(pad_length) : "" : "";
              output += ph.align ? sign + arg + pad : pad_character === "0" ? sign + pad + arg : pad + sign + arg;
            }
          }
        }
        return output;
      }
      var sprintf_cache = /* @__PURE__ */ Object.create(null);
      function sprintf_parse(fmt) {
        if (sprintf_cache[fmt]) {
          return sprintf_cache[fmt];
        }
        var _fmt = fmt, match, parse_tree = [], arg_names = 0;
        while (_fmt) {
          if ((match = re.text.exec(_fmt)) !== null) {
            parse_tree.push(match[0]);
          } else if ((match = re.modulo.exec(_fmt)) !== null) {
            parse_tree.push("%");
          } else if ((match = re.placeholder.exec(_fmt)) !== null) {
            if (match[2]) {
              arg_names |= 1;
              var field_list = [], replacement_field = match[2], field_match = [];
              if ((field_match = re.key.exec(replacement_field)) !== null) {
                field_list.push(field_match[1]);
                while ((replacement_field = replacement_field.substring(field_match[0].length)) !== "") {
                  if ((field_match = re.key_access.exec(replacement_field)) !== null) {
                    field_list.push(field_match[1]);
                  } else if ((field_match = re.index_access.exec(replacement_field)) !== null) {
                    field_list.push(field_match[1]);
                  } else {
                    throw new SyntaxError("[sprintf] failed to parse named argument key");
                  }
                }
              } else {
                throw new SyntaxError("[sprintf] failed to parse named argument key");
              }
              match[2] = field_list;
            } else {
              arg_names |= 2;
            }
            if (arg_names === 3) {
              throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");
            }
            parse_tree.push({
              placeholder: match[0],
              param_no: match[1],
              keys: match[2],
              sign: match[3],
              pad_char: match[4],
              align: match[5],
              width: match[6],
              precision: match[7],
              type: match[8]
            });
          } else {
            throw new SyntaxError("[sprintf] unexpected placeholder");
          }
          _fmt = _fmt.substring(match[0].length);
        }
        return sprintf_cache[fmt] = parse_tree;
      }
      if (typeof exports !== "undefined") {
        exports["sprintf"] = sprintf2;
        exports["vsprintf"] = vsprintf;
      }
      if (typeof window !== "undefined") {
        window["sprintf"] = sprintf2;
        window["vsprintf"] = vsprintf;
        if (typeof define === "function" && define["amd"]) {
          define(function() {
            return {
              "sprintf": sprintf2,
              "vsprintf": vsprintf
            };
          });
        }
      }
    }();
  }
});

// src/main.ts
var main_exports = {};
__export(main_exports, {
  default: () => EasyTypingPlugin
});
module.exports = __toCommonJS(main_exports);
var import_obsidian3 = require("obsidian");
var import_state3 = require("@codemirror/state");

// src/core.ts
var import_obsidian = require("obsidian");

// src/utils.ts
var DEBUG = false;
var print = (message, ...optionalParams) => {
  if (DEBUG) {
    console.log(message, ...optionalParams);
  }
};
function setDebug(value) {
  DEBUG = value;
}
function offsetToPos(doc, offset) {
  let line = doc.lineAt(offset);
  return { line: line.number - 1, ch: offset - line.from };
}
function getTypeStrOfTransac(tr) {
  let TransacTypeArray = [
    "EasyTyping.change",
    "EasyTyping.paste",
    "input.type.compose",
    "input.type",
    "input.paste",
    "input.drop",
    "input.complete",
    "input",
    "delete.selection",
    "delete.forward",
    "delete.backward",
    "delete.cut",
    "delete",
    "move.drop",
    "undo",
    "redo",
    "select.pointer"
  ];
  for (let i = 0; i < TransacTypeArray.length; i++) {
    if (tr.isUserEvent(TransacTypeArray[i]))
      return TransacTypeArray[i];
  }
  return "none";
}
function string2pairstring(s) {
  let cursorIdx = findFirstPipeNotPrecededByBackslash(s);
  let left = s.substring(0, cursorIdx);
  let _left = isRegexp(left) ? left : convertEscapeChar(left);
  let right = s.substring(cursorIdx + 1);
  let _right = isRegexp(right) ? right : convertEscapeChar(right);
  return { left: _left, right: _right };
}
function replacePlaceholders(str, replacements) {
  let replace_matches = str.replace(/\[\[(\d+)\]\]/g, function(match, index) {
    return replacements[parseInt(index, 10)] || match;
  });
  return replace_matches;
}
function replacePlaceholdersAndTabstops(str, replacements) {
  let tabstops = [];
  const regex = /\$(\d+)|\$\{(\d+): *([^ {}]*?)\}|\[\[(\d+)\]\]/g;
  let match;
  let replaceStrings = [];
  while ((match = regex.exec(str)) !== null) {
    const isSimpleVar = match[1];
    const isNamedVar = match[2];
    const content = match[3];
    const replaceN = match[4];
    const tabstopN = isSimpleVar || isNamedVar;
    const startIndex = match.index;
    const endIndex = startIndex + match[0].length;
    if (replaceN) {
      let matchedN = parseInt(replaceN, 10);
      if (matchedN < replacements.length) {
        replaceStrings.push({ from: startIndex, to: endIndex, replacement: replacements[matchedN], tabstop: false });
      }
    } else {
      let n = parseInt(tabstopN, 10);
      let contentStr = replacePlaceholders(content ? content : "", replacements);
      replaceStrings.push({ from: startIndex, to: endIndex, replacement: contentStr, tabstop: true, tabstopNumber: n });
    }
  }
  let newString = str;
  let offset = 0;
  for (let i = 0; i < replaceStrings.length; i++) {
    let replaceString = replaceStrings[i];
    newString = newString.substring(0, replaceString.from + offset) + replaceString.replacement + newString.substring(replaceString.to + offset);
    if (replaceString.tabstop) {
      let tabstop = {
        from: replaceString.from + offset,
        to: replaceString.from + offset + replaceString.replacement.length,
        number: replaceString.tabstopNumber
      };
      tabstops.push(tabstop);
    }
    offset += replaceString.replacement.length - (replaceString.to - replaceString.from);
  }
  return [newString, tabstops];
}
function parseTheAfterPattern(pattern, replacements) {
  let single_cursor_pos = findFirstPipeNotPrecededByBackslash(pattern);
  let general_cursor_find = /\$(\d+)|\$\{(\d+): *([^ {}]*?)\}/.test(pattern);
  let single_cursor_find = single_cursor_pos !== -1;
  let final_pattern = pattern;
  if (general_cursor_find) {
    final_pattern = pattern;
  } else if (single_cursor_find) {
    final_pattern = pattern.substring(0, single_cursor_pos) + "$0" + pattern.substring(single_cursor_pos + 1);
  } else {
    final_pattern = pattern + "$0";
  }
  return replacePlaceholdersAndTabstops(convertEscapeChar(final_pattern), replacements);
}
function isRegexp(s) {
  return s.startsWith("r/") && s.endsWith("/");
}
function convertEscapeChar(s) {
  return s.replace(/\\\|/g, "|").replace(/\\n/g, "\n").replace(/\\r/g, "\r").replace(/\\t/g, "	").replace(/\\\n/g, "\\n").replace(/\\\r/g, "\\r").replace(/\\\t/g, "\\t").replace(/\\\\/g, "\\");
}
function ruleStringList2RuleList(list) {
  let res = [];
  for (let i in list) {
    res[i] = { before: string2pairstring(list[i][0]), after: string2pairstring(list[i][1]), after_pattern: list[i][1] };
  }
  return res;
}
function findFirstPipeNotPrecededByBackslash(s) {
  let regex = /^r\/[^]*?\/\|/;
  let regMatch = s.match(regex);
  if (regMatch)
    return regMatch[0].length - 1;
  const match = s.match(/((^|[^\\])(\\\\)*)\|/);
  return match ? s.indexOf(match[0]) + match[1].length : -1;
}
function stringDeleteAt(str, index) {
  return str.substring(0, index) + str.substring(index + 1);
}
function stringInsertAt(str, index, s) {
  return str.substring(0, index) + s + str.substring(index);
}
function isParamDefined(param) {
  return typeof param !== "undefined";
}
function showString(s) {
  return s.replace(/\n/g, "\\n");
}
function taboutCursorInPairedString(input, cursorPosition, symbolPairs) {
  let stack = [];
  let fail = { isSuccess: false, newPosition: 0 };
  for (let i = 0; i < cursorPosition; i++) {
    for (const { left: open, right: close } of symbolPairs) {
      if (input.startsWith(open, i) && (open !== close || stack.lastIndexOf(open) === -1)) {
        stack.push(open);
        i += open.length - 1;
      } else if (input.startsWith(close, i) && stack.length > 0) {
        const lastOpenIndex = stack.lastIndexOf(open);
        if (lastOpenIndex !== -1) {
          stack = stack.slice(0, lastOpenIndex);
        }
        i += close.length - 1;
      }
    }
  }
  if (stack.length === 0) {
    return fail;
  }
  let tempStack = [];
  for (let i = cursorPosition; i < input.length; i++) {
    for (const { left: open, right: close } of symbolPairs) {
      if (input.startsWith(open, i) && (open !== close || stack.lastIndexOf(open) === -1 && tempStack.lastIndexOf(open) === -1)) {
        tempStack.push(open);
        i += open.length - 1;
      } else if (input.startsWith(close, i)) {
        const lastOpenIndex = tempStack.lastIndexOf(open);
        if (lastOpenIndex === -1 && stack.lastIndexOf(open) !== -1) {
          return { isSuccess: true, newPosition: cursorPosition === i ? i + close.length : i };
        } else if (lastOpenIndex !== -1) {
          tempStack = tempStack.slice(0, lastOpenIndex);
        }
        i += close.length - 1;
      }
    }
  }
  return fail;
}

// src/core.ts
var import_language = require("@codemirror/language");
var LineFormater = class {
  constructor() {
  }
  syntaxTreeNodeNameType(name) {
    if (name.contains("code") && !name.contains("link")) {
      return "code" /* code */;
    } else if (name.contains("math")) {
      return "formula" /* formula */;
    } else {
      return "text" /* text */;
    }
  }
  parseLineWithSyntaxTree(state, lineNum, regRegExp) {
    let linePartsOfTxtCodeFormula = [];
    let line = state.doc.line(lineNum);
    const tree = (0, import_language.syntaxTree)(state);
    let pos = line.from;
    let prevNodeType = "none" /* none */;
    let prevBeginIdx = 0;
    while (pos < line.to) {
      let node = tree.resolve(pos, 1);
      let curNodeType = this.syntaxTreeNodeNameType(node.name);
      if (prevNodeType == "none" /* none */) {
        prevNodeType = curNodeType;
        prevBeginIdx = 0;
      } else if (prevNodeType == curNodeType) {
      } else {
        linePartsOfTxtCodeFormula.push({
          content: line.text.substring(prevBeginIdx, pos - line.from),
          type: prevNodeType,
          begin: prevBeginIdx,
          end: pos - line.from,
          leftSpaceRequire: 0 /* none */,
          rightSpaceRequire: 0 /* none */
        });
        prevNodeType = curNodeType;
        prevBeginIdx = pos - line.from;
      }
      if (curNodeType == "text" /* text */) {
        pos++;
      } else {
        pos = node.to;
      }
      if (pos == line.to) {
        linePartsOfTxtCodeFormula.push({
          content: line.text.substring(prevBeginIdx, pos - line.from),
          type: prevNodeType,
          begin: prevBeginIdx,
          end: pos - line.from,
          leftSpaceRequire: 0 /* none */,
          rightSpaceRequire: 0 /* none */
        });
      }
    }
    let retArray = [];
    for (let i = 0; i < linePartsOfTxtCodeFormula.length; i++) {
      if (linePartsOfTxtCodeFormula[i].type != "text" /* text */) {
        retArray.push(linePartsOfTxtCodeFormula[i]);
      } else {
        let tempArray;
        if (isParamDefined(regRegExp))
          tempArray = splitTextWithLinkAndUserDefined(linePartsOfTxtCodeFormula[i].content, regRegExp);
        else
          tempArray = splitTextWithLinkAndUserDefined(linePartsOfTxtCodeFormula[i].content);
        tempArray.forEach((item) => {
          item.begin += linePartsOfTxtCodeFormula[i].begin;
          item.end += linePartsOfTxtCodeFormula[i].begin;
          retArray.push(item);
        });
      }
    }
    return retArray;
  }
  formatLineOfDoc(state, settings, fromB, toB, insertedStr) {
    let doc = state.doc;
    let line = doc.lineAt(fromB).text;
    let res = null;
    if (insertedStr.contains("\n")) {
      res = this.formatLine(state, doc.lineAt(fromB).number, settings, offsetToPos(doc, fromB).ch, offsetToPos(doc, fromB).ch);
    } else {
      res = this.formatLine(state, doc.lineAt(fromB).number, settings, offsetToPos(doc, toB).ch, offsetToPos(doc, fromB).ch);
    }
    if (res === null || res[2].length == 0)
      return null;
    let newline = stringInsertAt(res[0], res[1], "|");
    let changes = [];
    let offset = doc.lineAt(fromB).from;
    for (let changeItem of res[2]) {
      changes.push({
        changes: { from: offset + changeItem.begin, to: offset + changeItem.end, insert: changeItem.text },
        userEvent: "EasyTyping.change"
      });
    }
    if (insertedStr.contains("\n")) {
      console.log("insertStr", insertedStr);
      res[1] += insertedStr.length;
    }
    return [changes, { selection: { anchor: offset + res[1] }, userEvent: "EasyTyping.change" }];
  }
  formatLine(state, lineNum, settings, curCh, prevCh) {
    let line = state.doc.line(lineNum).text;
    let regNull = /^\s*$/g;
    if (regNull.test(line))
      return [line, curCh, []];
    let lineParts = settings.UserDefinedRegSwitch ? this.parseLineWithSyntaxTree(state, lineNum, settings.UserDefinedRegExp) : this.parseLineWithSyntaxTree(state, lineNum);
    if (settings.debug)
      console.log("line parts\n", lineParts);
    let linePartsOrigin = JSON.parse(JSON.stringify(lineParts));
    let inlineChangeList = [];
    let cursorLinePartIndex = -1;
    let cursorRelativeIndex = -1;
    let resultCursorCh = 0;
    for (let i = 0; i < lineParts.length; i++) {
      if (curCh > lineParts[i].begin && curCh <= lineParts[i].end) {
        cursorLinePartIndex = i;
        cursorRelativeIndex = curCh - lineParts[i].begin;
        if (lineParts[i].type === "text" /* text */) {
          lineParts[i].content = stringInsertAt(lineParts[i].content, cursorRelativeIndex, "\0");
        }
        break;
      }
    }
    let resultLine = "";
    let offset = 0;
    let prevPartType = "none" /* none */;
    let prevTextEndSpaceState = 0 /* none */;
    for (let i = 0; i < lineParts.length; i++) {
      if (i === 0 && lineParts[i].type === "text" /* text */ && settings.AutoCapital) {
        if (isParamDefined(prevCh) && cursorLinePartIndex != 0) {
        } else {
          let regFirstSentence = /^\s*(\- (\[[x ]\] )?)?“?[a-z\u0401\u0451\u0410-\u044f]/g;
          let regHeaderSentence = /^(#+ |>+ ?|“)[a-z\u0401\u0451\u0410-\u044f]/g;
          let textcopy = lineParts[0].content;
          let match = regFirstSentence.exec(textcopy);
          let matchHeader = regHeaderSentence.exec(textcopy);
          let dstCharIndex = -1;
          if (match) {
            dstCharIndex = regFirstSentence.lastIndex - 1;
          } else if (matchHeader) {
            dstCharIndex = regHeaderSentence.lastIndex - 1;
          }
          if (settings.AutoCapitalMode == "global" /* Globally */ || isParamDefined(prevCh) && dstCharIndex >= prevCh && dstCharIndex < curCh) {
          } else {
            dstCharIndex = -1;
          }
          if (dstCharIndex != -1) {
            lineParts[0].content = textcopy.substring(0, dstCharIndex) + textcopy.charAt(dstCharIndex).toUpperCase() + textcopy.substring(dstCharIndex + 1);
          }
        }
      }
      switch (lineParts[i].type) {
        case "text" /* text */:
          let insertSpace = function(content2, reg2, prevCh2, curCh2, offset2) {
            while (true) {
              let match = reg2.exec(content2);
              if (!match)
                break;
              let tempIndex = reg2.lastIndex - 1;
              if (isParamDefined(prevCh2) && tempIndex >= prevCh2 - offset2 && tempIndex < curCh2 - offset2) {
                content2 = content2.substring(0, tempIndex) + " " + content2.substring(tempIndex);
                curCh2 += 1;
              }
            }
            return [content2, curCh2];
          };
          let content = lineParts[i].content;
          if (settings.AutoCapital) {
            var reg = /[\.\?\!。！？]([\s]*)[a-z\u0401\u0451\u0410-\u044f]/g;
            while (true) {
              let match = reg.exec(content);
              if (!match)
                break;
              let tempIndex = reg.lastIndex - 1;
              let isSpaceDot = tempIndex - 2 < 0 || content.substring(tempIndex - 2, tempIndex) == " .";
              if (settings.AutoCapitalMode == "global" /* Globally */ && !isSpaceDot) {
                lineParts[i].content = content.substring(0, tempIndex) + content.charAt(tempIndex).toUpperCase() + content.substring(reg.lastIndex);
                content = lineParts[i].content;
              } else if (isParamDefined(prevCh) && tempIndex >= prevCh - offset && tempIndex < curCh - offset && !isSpaceDot) {
                lineParts[i].content = content.substring(0, tempIndex) + content.charAt(tempIndex).toUpperCase() + content.substring(reg.lastIndex);
                content = lineParts[i].content;
              }
            }
          }
          if (settings.ChineseEnglishSpace) {
            let reg1 = /([A-Za-z])([\u4e00-\u9fa5])/gi;
            let reg2 = /([\u4e00-\u9fa5])([A-Za-z])/gi;
            [content, curCh] = insertSpace(content, reg1, prevCh, curCh, offset);
            [content, curCh] = insertSpace(content, reg2, prevCh, curCh, offset);
            lineParts[i].content = content;
          }
          if (settings.ChineseNumberSpace) {
            let reg2 = /([0-9])([\u4e00-\u9fa5])/g;
            let reg1 = /([\u4e00-\u9fa5])([0-9])/g;
            [content, curCh] = insertSpace(content, reg2, prevCh, curCh, offset);
            [content, curCh] = insertSpace(content, reg1, prevCh, curCh, offset);
            lineParts[i].content = content;
          }
          if (settings.EnglishNumberSpace) {
            let reg2 = /([A-Za-z])(\d)/g;
            let reg1 = /(\d)([A-Za-z])/g;
            [content, curCh] = insertSpace(content, reg2, prevCh, curCh, offset);
            [content, curCh] = insertSpace(content, reg1, prevCh, curCh, offset);
            lineParts[i].content = content;
          }
          if (settings.ChineseNoSpace) {
            let reg2 = /([\u4e00-\u9fa5，。、！；‘’《》]+)(\s+)([\u4e00-\u9fa5，。、！；‘’《》]+)/g;
            while (reg2.exec(content)) {
              lineParts[i].content = content.replace(reg2, "$1$3");
              content = lineParts[i].content;
            }
          }
          if (settings.PunctuationSpace) {
            {
              let reg2 = /([,\.;\?\!\)])([0-9A-Za-z\u0401\u0451\u0410-\u044f\u4e00-\u9fa5])|([A-Za-z0-9\u4e00-\u9fa5:,\.\?\!'"]+)(\()|[,\.;\?:!][\u4e00-\u9fa5]/gi;
              while (true) {
                let match = reg2.exec(content);
                if (!match)
                  break;
                let tempIndex = reg2.lastIndex - 1;
                let isSpaceDot = "!.?;,".contains(content.charAt(tempIndex - 1)) && (tempIndex - 2 < 0 && i == 0 || content.charAt(tempIndex - 2) == " ");
                let isNumPuncNum = /[,.]\d/.test(content.substring(tempIndex - 1, tempIndex + 1)) && (tempIndex - 2 < 0 || /\d/.test(content.charAt(tempIndex - 2)));
                if (settings.PunctuationSpaceMode == "global" /* Globally */ && !isSpaceDot && !isNumPuncNum) {
                  content = content.substring(0, tempIndex) + " " + content.substring(tempIndex);
                } else if (isParamDefined(prevCh) && tempIndex >= prevCh - offset && tempIndex < curCh - offset && !isSpaceDot && !isNumPuncNum) {
                  content = content.substring(0, tempIndex) + " " + content.substring(tempIndex);
                  curCh += 1;
                }
              }
              let reg22 = /(:)([A-Za-z0-9_]+[ ,\.\?\\\/;'"，。？；‘“”’、\[\]\-\{\}])/gi;
              lineParts[i].content = content.replace(reg22, "$1 $2");
              content = lineParts[i].content;
              let reg3 = /(:)(["'])/g;
              lineParts[i].content = content.replace(reg3, "$1 $2");
              content = lineParts[i].content;
            }
          }
          let regStrictSpaceStart = /^\0?\s/;
          let regStrictSpaceEnd = /\s\0?$/;
          let regStartWithSpace = /^\0?[\s,\.;\?\!，。；》？：:！~\*、（）"”\[\]\)\{\}]/;
          let regEndWithSpace = /[\s，。、：；？！（）~\*"《“\[\]\(\{\}]\0?$/;
          let txtStartSpaceSate = 0 /* none */;
          let txtEndSpaceState = 0 /* none */;
          if (regStartWithSpace.test(content) || content.startsWith("<br>")) {
            if (regStrictSpaceStart.test(content))
              txtStartSpaceSate = 2 /* strict */;
            else
              txtStartSpaceSate = 1 /* soft */;
          }
          if (regEndWithSpace.test(content) || content.endsWith("<br>")) {
            if (regStrictSpaceEnd.test(content))
              txtEndSpaceState = 2 /* strict */;
            else
              txtEndSpaceState = 1 /* soft */;
          }
          switch (prevPartType) {
            case "none" /* none */:
              break;
            case "code" /* code */:
              if (settings.InlineCodeSpaceMode > txtStartSpaceSate) {
                lineParts[i].content = " " + content;
                content = lineParts[i].content;
              }
              break;
            case "formula" /* formula */:
              if (settings.InlineFormulaSpaceMode > txtStartSpaceSate) {
                lineParts[i].content = " " + content;
                content = lineParts[i].content;
              }
              break;
            case "wikilink" /* wikilink */:
            case "mdlink" /* mdlink */:
              if (!settings.InlineLinkSmartSpace && settings.InlineLinkSpaceMode > txtStartSpaceSate) {
                lineParts[i].content = " " + content;
                content = lineParts[i].content;
              } else if (settings.InlineLinkSmartSpace && txtStartSpaceSate == 0 /* none */) {
                let charAtTextBegin = content.charAt(0);
                let regMdLinkEnd = /\]/;
                let charAtLinkEndIndex = lineParts[i - 1].content.search(regMdLinkEnd) - 1;
                let charAtLinkEnd = lineParts[i - 1].content.charAt(charAtLinkEndIndex);
                if (charAtLinkEnd === "[")
                  break;
                let twoNeighborChars = charAtLinkEnd + charAtTextBegin;
                let regNotNeedSpace = /[\u4e00-\u9fa5，。？：；”“’‘-）}][\u4e00-\u9fa5]/g;
                if (!regNotNeedSpace.test(twoNeighborChars)) {
                  lineParts[i].content = " " + content;
                  content = lineParts[i].content;
                }
              }
              break;
            case "user-defined" /* user */:
              if (lineParts[i - 1].rightSpaceRequire > txtStartSpaceSate) {
                lineParts[i].content = " " + content;
                content = lineParts[i].content;
              }
              break;
          }
          if (i === cursorLinePartIndex) {
            let reg2 = "\0";
            let n = content.search(reg2);
            resultCursorCh = offset + n;
            lineParts[i].content = stringDeleteAt(content, n);
          }
          resultLine += lineParts[i].content;
          offset += lineParts[i].content.length;
          prevPartType = "text" /* text */;
          prevTextEndSpaceState = txtEndSpaceState;
          break;
        case "code" /* code */:
          switch (prevPartType) {
            case "none" /* none */:
              break;
            case "text" /* text */:
              if (settings.InlineCodeSpaceMode > prevTextEndSpaceState) {
                lineParts[i - 1].content += " ";
                resultLine += " ";
                offset += 1;
              }
              break;
            case "code" /* code */:
              if (settings.InlineCodeSpaceMode > 0 /* none */) {
                inlineChangeList.push({
                  text: " ",
                  begin: lineParts[i].begin,
                  end: lineParts[i].begin,
                  origin: ""
                });
                resultLine += " ";
                offset += 1;
              }
              break;
            case "formula" /* formula */:
              if (settings.InlineCodeSpaceMode > 0 /* none */ || settings.InlineFormulaSpaceMode > 0 /* none */) {
                inlineChangeList.push({
                  text: " ",
                  begin: lineParts[i].begin,
                  end: lineParts[i].begin,
                  origin: ""
                });
                resultLine += " ";
                offset += 1;
              }
              break;
            case "mdlink" /* mdlink */:
            case "wikilink" /* wikilink */:
              if (settings.InlineCodeSpaceMode > 0 /* none */ || settings.InlineLinkSpaceMode > 0 /* none */) {
                inlineChangeList.push({
                  text: " ",
                  begin: lineParts[i].begin,
                  end: lineParts[i].begin,
                  origin: ""
                });
                resultLine += " ";
                offset += 1;
              }
              break;
            case "user-defined" /* user */:
              if (settings.InlineCodeSpaceMode > 0 /* none */ && lineParts[i - 1].rightSpaceRequire > 0 /* none */) {
                inlineChangeList.push({
                  text: " ",
                  begin: lineParts[i].begin,
                  end: lineParts[i].begin,
                  origin: ""
                });
                resultLine += " ";
                offset += 1;
              }
              break;
          }
          if (i === cursorLinePartIndex) {
            resultCursorCh = offset + cursorRelativeIndex;
          }
          resultLine += lineParts[i].content;
          offset += lineParts[i].content.length;
          prevPartType = "code" /* code */;
          prevTextEndSpaceState = 0 /* none */;
          break;
        case "formula" /* formula */:
          if (lineParts[i].content == "$\\qquad$") {
            prevPartType = "text" /* text */;
            prevTextEndSpaceState = 2 /* strict */;
            break;
          }
          switch (prevPartType) {
            case "none" /* none */:
              break;
            case "text" /* text */:
              if (settings.InlineFormulaSpaceMode > prevTextEndSpaceState) {
                lineParts[i - 1].content += " ";
                resultLine += " ";
                offset += 1;
              }
              break;
            case "code" /* code */:
              if (settings.InlineFormulaSpaceMode > 0 /* none */ || settings.InlineCodeSpaceMode > 0 /* none */) {
                inlineChangeList.push({
                  text: " ",
                  begin: lineParts[i].begin,
                  end: lineParts[i].begin,
                  origin: ""
                });
                resultLine += " ";
                offset += 1;
              }
              break;
            case "formula" /* formula */:
              if (settings.InlineCodeSpaceMode > 0 /* none */) {
                inlineChangeList.push({
                  text: " ",
                  begin: lineParts[i].begin,
                  end: lineParts[i].begin,
                  origin: ""
                });
                resultLine += " ";
                offset += 1;
              }
              break;
            case "mdlink" /* mdlink */:
            case "wikilink" /* wikilink */:
              if (settings.InlineFormulaSpaceMode > 0 /* none */ || settings.InlineLinkSpaceMode > 0 /* none */) {
                inlineChangeList.push({
                  text: " ",
                  begin: lineParts[i].begin,
                  end: lineParts[i].begin,
                  origin: ""
                });
                resultLine += " ";
                offset += 1;
              }
              break;
            case "user-defined" /* user */:
              if (settings.InlineFormulaSpaceMode > 0 /* none */ && lineParts[i - 1].rightSpaceRequire > 0 /* none */) {
                inlineChangeList.push({
                  text: " ",
                  begin: lineParts[i].begin,
                  end: lineParts[i].begin,
                  origin: ""
                });
                resultLine += " ";
                offset += 1;
              }
              break;
          }
          if (i === cursorLinePartIndex) {
            resultCursorCh = offset + cursorRelativeIndex;
          }
          resultLine += lineParts[i].content;
          offset += lineParts[i].content.length;
          prevPartType = "formula" /* formula */;
          prevTextEndSpaceState = 0 /* none */;
          break;
        case "mdlink" /* mdlink */:
        case "wikilink" /* wikilink */:
          switch (prevPartType) {
            case "none" /* none */:
              break;
            case "text" /* text */:
              if (prevTextEndSpaceState >= settings.InlineLinkSpaceMode && !settings.InlineLinkSmartSpace)
                break;
              if (prevTextEndSpaceState == 2 /* strict */ && settings.InlineLinkSpaceMode == 2 /* strict */)
                break;
              let charAtTextEnd = lineParts[i - 1].content.charAt(lineParts[i - 1].content.length - 1);
              let charAtLinkBegin = "";
              if (lineParts[i].type == "wikilink" /* wikilink */) {
                let regAlias = /\|/;
                let charOfAliasBegin = lineParts[i].content.search(regAlias);
                let beginIndex = 2;
                if (lineParts[i].content.charAt(0) === "!")
                  beginIndex = 3;
                if (charOfAliasBegin != -1) {
                  beginIndex = charOfAliasBegin + 1;
                } else if (lineParts[i].content.charAt(beginIndex) == "#") {
                  beginIndex += 1;
                }
                charAtLinkBegin = lineParts[i].content.charAt(beginIndex);
                if (charAtLinkBegin == "]")
                  break;
              } else {
                let regMdLinkBegin = /\[/;
                let charAtLinkBeginIndex = lineParts[i].content.search(regMdLinkBegin) + 1;
                charAtLinkBegin = lineParts[i].content.charAt(charAtLinkBeginIndex);
                if (charAtLinkBegin === "]")
                  break;
              }
              if (settings.InlineLinkSpaceMode == 2 /* strict */ && prevTextEndSpaceState < 2 /* strict */) {
                lineParts[i - 1].content += " ";
                resultLine += " ";
                offset += 1;
              } else if (settings.InlineLinkSmartSpace && lineParts[i - 1].content.endsWith(" ")) {
                let tempContent = lineParts[i - 1].content + charAtLinkBegin;
                let regRevertSpace = /[\u4e00-\u9fa5] [\u4e00-\u9fa5]$/;
                if (regRevertSpace.test(tempContent)) {
                  lineParts[i - 1].content = lineParts[i - 1].content.substring(0, lineParts[i - 1].content.length - 1);
                  resultLine = resultLine.substring(0, resultLine.length - 1);
                  offset -= 1;
                }
              } else if (settings.InlineLinkSmartSpace && prevTextEndSpaceState == 0 /* none */) {
                let regNoNeedSpace = /[\u4e00-\u9fa5][\u4e00-\u9fa5]/g;
                let twoNeighborChars = charAtTextEnd + charAtLinkBegin;
                if (!regNoNeedSpace.test(twoNeighborChars)) {
                  lineParts[i - 1].content += " ";
                  resultLine += " ";
                  offset += 1;
                }
              } else if (!settings.InlineLinkSmartSpace && settings.InlineLinkSpaceMode > prevTextEndSpaceState) {
                lineParts[i - 1].content += " ";
                resultLine += " ";
                offset += 1;
              }
              break;
            case "code" /* code */:
              if (settings.InlineLinkSpaceMode > 0 /* none */ || settings.InlineCodeSpaceMode > 0 /* none */) {
                inlineChangeList.push({
                  text: " ",
                  begin: lineParts[i].begin,
                  end: lineParts[i].begin,
                  origin: ""
                });
                resultLine += " ";
                offset += 1;
              }
              break;
            case "formula" /* formula */:
              if (settings.InlineLinkSpaceMode > 0 /* none */ || settings.InlineFormulaSpaceMode > 0 /* none */) {
                inlineChangeList.push({
                  text: " ",
                  begin: lineParts[i].begin,
                  end: lineParts[i].begin,
                  origin: ""
                });
                resultLine += " ";
                offset += 1;
              }
              break;
            case "mdlink" /* mdlink */:
            case "wikilink" /* wikilink */:
              if (settings.InlineLinkSpaceMode > 0 /* none */) {
                inlineChangeList.push({
                  text: " ",
                  begin: lineParts[i].begin,
                  end: lineParts[i].begin,
                  origin: ""
                });
                resultLine += " ";
                offset += 1;
              }
              break;
            case "user-defined" /* user */:
              if (lineParts[i - 1].rightSpaceRequire > 0 /* none */ && settings.InlineLinkSpaceMode > 0 /* none */) {
                inlineChangeList.push({
                  text: " ",
                  begin: lineParts[i].begin,
                  end: lineParts[i].begin,
                  origin: ""
                });
                resultLine += " ";
                offset += 1;
              }
          }
          if (i === cursorLinePartIndex) {
            resultCursorCh = offset + cursorRelativeIndex;
          }
          resultLine += lineParts[i].content;
          offset += lineParts[i].content.length;
          prevPartType = lineParts[i].type;
          prevTextEndSpaceState = 0 /* none */;
          break;
        case "user-defined" /* user */:
          switch (prevPartType) {
            case "none" /* none */:
              break;
            case "text" /* text */:
              if (lineParts[i].leftSpaceRequire > prevTextEndSpaceState) {
                lineParts[i - 1].content += " ";
                resultLine += " ";
                offset += 1;
              }
              break;
            case "code" /* code */:
              if (lineParts[i].leftSpaceRequire > 0 /* none */ && settings.InlineCodeSpaceMode > 0 /* none */) {
                inlineChangeList.push({
                  text: " ",
                  begin: lineParts[i].begin,
                  end: lineParts[i].begin,
                  origin: ""
                });
                resultLine += " ";
                offset += 1;
              }
              break;
            case "formula" /* formula */:
              if (lineParts[i].leftSpaceRequire > 0 /* none */ && settings.InlineFormulaSpaceMode > 0 /* none */) {
                inlineChangeList.push({
                  text: " ",
                  begin: lineParts[i].begin,
                  end: lineParts[i].begin,
                  origin: ""
                });
                resultLine += " ";
                offset += 1;
              }
              break;
            case "mdlink" /* mdlink */:
            case "wikilink" /* wikilink */:
              if (lineParts[i].leftSpaceRequire > 0 /* none */ && settings.InlineLinkSpaceMode > 0 /* none */) {
                inlineChangeList.push({
                  text: " ",
                  begin: lineParts[i].begin,
                  end: lineParts[i].begin,
                  origin: ""
                });
                resultLine += " ";
                offset += 1;
              }
              break;
            case "user-defined" /* user */:
              if (lineParts[i].leftSpaceRequire > 0 /* none */ && lineParts[i - 1].rightSpaceRequire > 0 /* none */) {
                inlineChangeList.push({
                  text: " ",
                  begin: lineParts[i].begin,
                  end: lineParts[i].begin,
                  origin: ""
                });
                resultLine += " ";
                offset += 1;
              }
              break;
          }
          if (i === cursorLinePartIndex) {
            resultCursorCh = offset + cursorRelativeIndex;
          }
          resultLine += lineParts[i].content;
          offset += lineParts[i].content.length;
          prevPartType = "user-defined" /* user */;
          prevTextEndSpaceState = 0 /* none */;
          break;
      }
    }
    for (let i = 0; i < lineParts.length; i++) {
      if (lineParts[i].type === "text" /* text */ && lineParts[i].content != linePartsOrigin[i].content) {
        inlineChangeList.push({
          text: lineParts[i].content,
          begin: linePartsOrigin[i].begin,
          end: linePartsOrigin[i].end,
          origin: linePartsOrigin[i].content
        });
      }
    }
    inlineChangeList = inlineChangeList.sort((a, b) => a.begin - b.begin);
    return [resultLine, resultCursorCh, inlineChangeList];
  }
};
function matchWithReg(text, regExp, type, inlineTypeArray, checkArray = false, leftSpaceRe = 0 /* none */, rightSpaceRe = 0 /* none */) {
  let retArray = inlineTypeArray;
  let matchArray = [];
  retArray = retArray.sort((a, b) => a.begin - b.begin);
  while (true) {
    let match = regExp.exec(text);
    if (!match)
      break;
    let valid = true;
    if (checkArray) {
      for (let i = 0; i < retArray.length; i++) {
        if (regExp.lastIndex > retArray[i].begin && retArray[i].end > match.index) {
          valid = false;
          break;
        }
      }
    }
    if (!valid)
      continue;
    matchArray.push({
      content: match[0],
      type,
      begin: match.index,
      end: regExp.lastIndex,
      leftSpaceRequire: leftSpaceRe,
      rightSpaceRequire: rightSpaceRe
    });
  }
  retArray = retArray.concat(matchArray);
  return retArray;
}
function matchWithAbbr(text, type, inlineTypeArray, checkArray = false) {
  let retArray = inlineTypeArray;
  let matchArray = [];
  retArray = retArray.sort((a, b) => a.begin - b.begin);
  let regAbbr = /([a-zA-Z]\.)+/g;
  while (true) {
    let match = regAbbr.exec(text);
    if (!match)
      break;
    let valid = true;
    let isInBlockBegin = match.index == 0;
    if (checkArray) {
      for (let i = 0; i < retArray.length; i++) {
        if (match.index == retArray[i].end) {
          isInBlockBegin = true;
        }
        if (regAbbr.lastIndex > retArray[i].begin && retArray[i].end > match.index) {
          valid = false;
          break;
        }
      }
    }
    if (!isInBlockBegin && valid) {
      let regChar = /[a-zA-Z0-9]/;
      if (regChar.test(text.charAt(match.index - 1))) {
        valid = false;
      }
    }
    if (!valid)
      continue;
    matchArray.push({
      content: match[0],
      type,
      begin: match.index,
      end: regAbbr.lastIndex,
      leftSpaceRequire: 0 /* none */,
      rightSpaceRequire: 0 /* none */
    });
  }
  retArray = retArray.concat(matchArray);
  return retArray;
}
function splitTextWithLinkAndUserDefined(text, regExps) {
  let retArray = [];
  let regWikiLink = /\!{0,2}\[\[[^\[\]]*?\]\]/g;
  let regMdLink = /\!{0,2}\[[^\[\]]*?\]\([^\s]*\)/g;
  retArray = matchWithReg(text, regWikiLink, "wikilink" /* wikilink */, retArray);
  retArray = matchWithReg(text, regMdLink, "mdlink" /* mdlink */, retArray);
  let regExpList = [];
  let leftSRequireList = [];
  let rightSRequireList = [];
  let regNull = /^\s*$|^\/\//g;
  let regSRequire = /\|[\-=\+][\-=\+]$/;
  if (regExps) {
    let regs = regExps.split("\n");
    for (let i = 0; i < regs.length; i++) {
      if (regNull.test(regs[i]))
        continue;
      if (!regSRequire.test(regs[i]) || regs[i].length <= 3) {
        new import_obsidian.Notice("EasyTyping: \u7B2C" + String(i) + "\u884C\u81EA\u5B9A\u4E49\u6B63\u5219\u4E0D\u7B26\u5408\u89C4\u8303\n" + regs[i]);
        continue;
      }
      let regItem = regs[i].substring(0, regs[i].length - 3);
      let spaceReqString = regs[i].substring(regs[i].length - 3);
      let isValidReg = true;
      try {
        let regTemp = new RegExp(regItem, "g");
      } catch (error) {
        isValidReg = false;
        console.error("EasyTyping: Invalid RegExp:", regItem, error);
      }
      if (isValidReg) {
        regExpList.push(new RegExp(regItem, "g"));
        leftSRequireList.push(str2SpaceState(spaceReqString.charAt(1)));
        rightSRequireList.push(str2SpaceState(spaceReqString.charAt(2)));
      }
    }
    let regLen = regExpList.length;
    for (let i = 0; i < regLen; i++) {
      retArray = matchWithReg(text, regExpList[i], "user-defined" /* user */, retArray, true, leftSRequireList[i], rightSRequireList[i]);
    }
  }
  retArray = matchWithReg(text, /\d{1,2}:\d{1,2}(:\d{0,2}){0,1}/g, "user-defined" /* user */, retArray, true, 0 /* none */, 0 /* none */);
  retArray = matchWithAbbr(text, "user-defined" /* user */, retArray, true);
  retArray = retArray.sort((a, b) => a.begin - b.begin);
  let textArray = [];
  let textBegin = 0;
  let textEnd = 0;
  for (let i = 0; i < retArray.length; i++) {
    if (textBegin < retArray[i].begin) {
      textEnd = retArray[i].begin;
      textArray.push({
        content: text.substring(textBegin, textEnd),
        type: "text" /* text */,
        begin: textBegin,
        end: textEnd,
        leftSpaceRequire: 0 /* none */,
        rightSpaceRequire: 0 /* none */
      });
    }
    textBegin = retArray[i].end;
  }
  if (textBegin != text.length) {
    textArray.push({
      content: text.substring(textBegin, text.length),
      type: "text" /* text */,
      begin: textBegin,
      end: text.length,
      leftSpaceRequire: 0 /* none */,
      rightSpaceRequire: 0 /* none */
    });
  }
  retArray = retArray.concat(textArray);
  retArray = retArray.sort((a, b) => a.begin - b.begin);
  return retArray;
}
function str2SpaceState(s) {
  switch (s) {
    case "+":
      return 2 /* strict */;
    case "=":
      return 1 /* soft */;
    case "-":
    default:
      return 0 /* none */;
  }
}
function string2SpaceState(s) {
  if (Number(s) == 0 /* none */)
    return 0 /* none */;
  if (Number(s) == 1 /* soft */)
    return 1 /* soft */;
  if (Number(s) == 2 /* strict */)
    return 2 /* strict */;
  return 0 /* none */;
}
function getPosLineType(state, pos) {
  const line = state.doc.lineAt(pos);
  let line_number = line.number;
  const tree = (0, import_language.ensureSyntaxTree)(state, line.to);
  const token = tree.resolve(line.from, 1).name;
  if (token.contains("table")) {
    return "table" /* table */;
  }
  if (token.contains("hmd-frontmatter")) {
    return "frontmatter" /* frontmatter */;
  }
  if (token.contains("math")) {
    for (let p = line.from + 1; p < line.to; p += 1) {
      if (!tree.resolve(p, 1).name.contains("math")) {
        return "text" /* text */;
      }
    }
    return "formula" /* formula */;
  } else if (token.contains("code") && token.contains("block")) {
    for (let p = line.from + 1; p < line.to; p += 1) {
      let t = tree.resolve(p, 1).name;
      if (!(t.contains("code") && t.contains("block"))) {
        return "text" /* text */;
      }
    }
    return "codeblock" /* codeblock */;
  } else if (token.contains("quote") && !token.contains("callout")) {
    let callout_start_line = -1;
    for (let l = line_number - 1; l >= 1; l -= 1) {
      let l_line = state.doc.line(l);
      let l_token = tree.resolve(l_line.from, 1).name;
      if (!l_token.contains("quote")) {
        break;
      }
      if (l_token.contains("callout")) {
        callout_start_line = l;
        break;
      }
    }
    if (callout_start_line == -1)
      return "text" /* text */;
    let is_code_block = false;
    let reset = false;
    let reg_code_begin = /^>+ ```/;
    let reg_code_end = /^>+ ```$/;
    for (let l = callout_start_line + 1; l <= line_number; l += 1) {
      let l_line = state.doc.line(l);
      if (reset) {
        is_code_block = false;
        reset = false;
      }
      if (is_code_block && reg_code_end.test(l_line.text)) {
        is_code_block = true;
        reset = true;
      } else if (!is_code_block && reg_code_begin.test(l_line.text)) {
        is_code_block = true;
      }
    }
    if (is_code_block) {
      return "codeblock" /* codeblock */;
    } else
      return "text" /* text */;
  } else if (token.contains("list")) {
    for (let p = line.from + 1; p < line.to; p += 1) {
      let t = tree.resolve(p, 1).name;
      if (t.contains("code") && t.contains("block")) {
        return "codeblock" /* codeblock */;
      }
    }
  }
  return "text" /* text */;
}
function getPosLineType2(state, pos) {
  const line = state.doc.lineAt(pos);
  const tree = (0, import_language.syntaxTree)(state);
  const token = tree.resolve(line.from, 1).name;
  if (token.contains("hmd-frontmatter")) {
    return "frontmatter" /* frontmatter */;
  }
  if (token.contains("math")) {
    for (let p = line.from + 1; p < line.to; p += 1) {
      if (!tree.resolve(p, 1).name.contains("math")) {
        return "text" /* text */;
      }
    }
    return "formula" /* formula */;
  } else if (token.contains("code") && token.contains("block")) {
    for (let p = line.from + 1; p < line.to; p += 1) {
      let t = tree.resolve(p, 1).name;
      if (!(t.contains("code") && t.contains("block"))) {
        return "text" /* text */;
      }
    }
    return "codeblock" /* codeblock */;
  }
  for (let p = line.from; p < line.to; p += 1) {
    if (tree.resolve(p, 1).name.contains("list")) {
      return "list" /* list */;
    } else if (tree.resolve(p, 1).name.contains("callout")) {
      return "callout_title" /* callout_title */;
    }
  }
  if (token.contains("quote")) {
    return "quote" /* quote */;
  }
  return "text" /* text */;
}

// src/settings.ts
var import_obsidian2 = require("obsidian");

// src/lang/locale/en-US.ts
var locale = {
  settings: {
    symbolAutoPair: {
      name: "Symbol auto pair and delete with pair",
      desc: "Add auto-pairing and auto-deletion for various symbols such as \u300A\u300B, \u201C\u201D, \u300C\u300D, \u300E\u300F, \u3010\u3011, etc."
    },
    selectionReplace: {
      name: "Selection Replace Enhancement",
      desc: "Enhanced editing for selected text, e.g., pressing \uFFE5 \u2192 $selected text$, pressing \xB7 \u2192 `selected text`, \u300A \u2192 \u300Aselected text\u300B, etc."
    },
    fullWidthToHalfWidth: {
      name: "Convert successive full width symbol to half width symbol",
      desc: "Convert consecutive full-width symbols to half-width, e.g., \u3002\u3002\u2192 ., \uFF01\uFF01\u2192 !, \u300B\u300B\u2192 >"
    },
    basicInputEnhance: {
      name: "Basic symbol input enhance for Obsidian",
      desc: "Basic input enhancement for Obsidian, e.g., \u3010\u3010| \u2192 [[|]], starting with \u3001\u2192 /, starting with \u300B\u2192 >, \xB7\xB7| \u2192 `|`, `\xB7|` becomes code block, \uFFE5\uFFE5| \u2192 $|$"
    },
    codeblockEdit: {
      name: "Enhance codeblock edit",
      desc: "Improve editing in codeblocks (Tab, delete, paste, Cmd/Ctrl+A select)."
    },
    backspaceEdit: {
      name: "Enhance backspace edit",
      desc: "Improve backspace featurefor empty list item or empty quote line."
    },
    tabOut: {
      name: "Tabout",
      desc: "Tab out of inline code or paired symbols."
    },
    autoFormatting: {
      name: "Auto formatting when typing",
      desc: "Toggle auto-formatting of text while editing the document."
    },
    spaceBetweenChineseEnglish: {
      name: "Space between Chinese and English",
      desc: "Insert space between Chinese and English characters."
    },
    spaceBetweenChineseNumber: {
      name: "Space between Chinese and Number",
      desc: "Insert space between Chinese characters and numbers."
    },
    spaceBetweenEnglishNumber: {
      name: "Space between English and Number",
      desc: "Insert space between English characters and numbers."
    },
    quoteSpace: {
      name: "Space between quote character > and text",
      desc: "Insert space between quote character > and text."
    },
    deleteSpaceBetweenChinese: {
      name: "Delete the Space between Chinese characters",
      desc: "Remove spaces between Chinese characters."
    },
    capitalizeFirstLetter: {
      name: "Capitalize the first letter of every sentence",
      desc: "Capitalize the first letter of each sentence in English."
    },
    textPunctuationSpace: {
      name: "Smartly insert space between text and punctuation",
      desc: "Insert space between text and punctuation intelligently."
    },
    spaceStrategyInlineCode: {
      name: "Space strategy between inline code and text",
      desc: "No requirement: No space requirement between this category block and the surrounding text. Soft space: Only requires a soft space between this category block and the surrounding blocks. Soft space example: If the adjacent text on the left side of the current block is full-width punctuation like . , ; ? etc., and the adjacent text on the right side of the current block is all full-width or half-width punctuation. Strict space: Strictly add spaces between the current block and the adjacent text."
    },
    spaceStrategyInlineFormula: {
      name: "Space strategy between inline formula and text",
      desc: "Define the spacing strategy between inline formulas and text."
    },
    spaceStrategyLinkText: {
      name: "Space strategy between link and text",
      desc: "Define the spacing strategy between [[wikilink]] [mdlink](...) and text."
    },
    userDefinedRegexpSwitch: {
      name: "User Defined RegExp Switch",
      desc: "Toggle custom regular expressions, preventing formatting and setting space strategy between matched content and other text."
    },
    userDefinedRegexp: {
      name: "User-defined Regular Expression, one expression per line",
      desc: "User-defined regular expression, matched to the content is not formatted, one expression per line, do not feel free to add spaces at the end of the line.The end of each line of three characters fixed as | and two space strategy symbols, space strategy symbols for - = +, respectively, on behalf of not requiring spaces (-), soft spaces (=), strict spaces (+).These two space strategy symbols are the space strategy for the left and right sides of the matching block respectively"
    },
    excludeFoldersFiles: {
      name: "Exclude Folders/Files",
      desc: "This plugin will parse each line as an exclude folder or file. For example: DailyNote/, DailyNote/WeekNotes/, DailyNote/test.md"
    },
    fixMacOSContextMenu: {
      name: "Fix MacOS context-menu cursor position (Need to restart Obsidian)",
      desc: "Fix the issue where the cursor jumps to the next line when the context menu is invoked on MacOS (requires restarting Obsidian)."
    },
    fixMicrosoftIME: {
      name: "Fix Microsoft Input Method Issue",
      desc: "Adapt for older versions of Microsoft Input Method."
    },
    strictLineBreaks: {
      name: "Strict Line breaks Mode",
      desc: "In strict line breaks mode, pressing Enter once in normal text lines will produce two line breaks or two spaces and Enter."
    },
    enhanceModA: {
      name: "Enhance Mod+A selection in text",
      desc: "First select the current line, second select the current text block, third select the entire text."
    },
    collapsePersistentEnter: {
      name: "Collapse Persistent Enter",
      desc: "Adds same-level header line without expanding when pressing Enter on a collapsed header."
    },
    puncRectify: {
      name: "Punc rectify",
      desc: "Automatically convert English punctuation (, . ? !) between Chinese characters to full-width punctuation during typing (reversible)."
    },
    printDebugInfo: {
      name: "Print debug info in console",
      desc: "Print debug information in the console."
    },
    selectionReplaceRule: {
      name: "Selection Replace Rule",
      desc: "User defined Selection Replace Rule"
    },
    deleteRule: {
      name: "Delete Rule",
      desc: "Rule: Use | to indicate the cursor position. Tips: Using | to indicate the cursor position."
    },
    convertRule: {
      name: "Convert Rule",
      desc: "Rule: Use | to indicate the cursor position. Tips: Using | to indicate the cursor position."
    },
    trigger: {
      name: "Trigger"
    },
    left: {
      name: "Left"
    },
    right: {
      name: "Right"
    },
    oldPattern: {
      name: "Old Pattern"
    },
    newPattern: {
      name: "New Pattern"
    }
  },
  headers: {
    main: "Obsidian EasyTyping Plugin",
    githubDetail: "More detail is in Github: ",
    enhancedEditing: "Enhanced Editing Setting",
    customizeEditRule: "Customize Edit Convertion Rule",
    autoformatSetting: "Autoformat Setting",
    detailedSetting: "Detailed Setting Below",
    customRegexpBlock: "Custom regular expressions block",
    excludeFoldersFiles: "Exclude Folders/Files",
    experimentalFeatures: "Experimental Features",
    aboutRegexp: {
      header: "For knowledge about regular expressions, see ",
      text: "Yifeng Nguyen: A Concise Tutorial on Regular Expressions"
    },
    instructionsRegexp: {
      header: "Instructions and examples for using regular expression rules: ",
      text: "Customizing Regular Expression Rules"
    },
    customizeSelectionRule: "Customize Selection Replace Rule",
    customizeDeleteRule: "Customize Delete Rule",
    customizeConvertRule: "Customize Convert Rule",
    editSelectionReplaceRule: "Edit Selection Replace Rule"
  },
  dropdownOptions: {
    enterTwice: "Enter Twice",
    twoSpace: "Two Space",
    mixMode: "Mix Mode",
    onlyWhenTyping: "Only When Typing",
    globally: "Work Globally",
    noRequire: "No Require",
    softSpace: "Soft Space",
    strictSpace: "Strict Space",
    dummy: "Dummy",
    smart: "Smart"
  },
  toolTip: {
    switch: "Switch",
    editRule: "Edit rule",
    removeRule: "Remove rule",
    addRule: "Add Rule"
  },
  placeHolder: {
    triggerSymbol: "Trigger Symbol",
    newLeftSideString: "New Left Side String",
    newRightSideString: "New Right Side String",
    addRule: "Add Rule",
    noticeInvaidTrigger: "Inlvalid trigger, trigger must be a symbol of length 1 or symbol \u2014\u2014, \u2026\u2026",
    noticeWarnTriggerExists: "warning! Trigger %s is already exist!",
    noticeMissingInput: "missing input",
    beforeDelete: "Before Delete",
    newPattern: "New Pattern",
    noticeInvaidTriggerPatternContainSymbol: "Inlvalid trigger, pattern must contain symbol | which indicate cursor position",
    beforeConvert: "Before Convert",
    noticeInvalidPatternString: "Invalid pattern string!"
  },
  button: {
    update: "Update"
  }
};
var en_US_default = locale;

// src/lang/locale/zh-CN.ts
var locale2 = {
  settings: {
    symbolAutoPair: {
      name: "\u7B26\u53F7\u81EA\u52A8\u914D\u5BF9\u53CA\u5220\u9664\u914D\u5BF9",
      desc: "\u589E\u52A0\u591A\u79CD\u7B26\u53F7\u914D\u5BF9\u8F93\u5165\uFF0C\u914D\u5BF9\u5220\u9664\uFF0C\u5982\u300A\u300B, \u201C\u201D, \u300C\u300D, \u300E\u300F, \u3010\u3011\u7B49"
    },
    selectionReplace: {
      name: "\u9009\u4E2D\u6587\u672C\u66FF\u6362\u589E\u5F3A",
      desc: "\u9009\u4E2D\u6587\u672C\u60C5\u51B5\u4E0B\u7684\u7F16\u8F91\u589E\u5F3A\uFF0C\u6309\uFFE5\u2192$\u9009\u4E2D\u7684\u6587\u672C$, \u6309\xB7\u2192`\u9009\u4E2D\u7684\u6587\u672C`\uFF0C\u300A \u2192 \u300A\u9009\u4E2D\u7684\u6587\u672C\u300B\u7B49\u7B49"
    },
    fullWidthToHalfWidth: {
      name: "\u8FDE\u7EED\u8F93\u5165\u5168\u89D2\u7B26\u53F7\u8F6C\u534A\u89D2\u7B26\u53F7",
      desc: "\u8FDE\u7EED\u8F93\u5165\u5168\u89D2\u7B26\u53F7\u8F6C\u534A\u89D2\uFF0C\u3002\u3002\u2192 .\uFF0C\uFF01\uFF01\u2192 !\uFF0C \u300B\u300B\u2192 >"
    },
    basicInputEnhance: {
      name: "Obsidian \u7684\u57FA\u7840\u7B26\u53F7\u8F93\u5165\u589E\u5F3A",
      desc: "Obsidian \u7684\u57FA\u7840\u8F93\u5165\u589E\u5F3A\uFF0C\u5982\u3010\u3010| \u2192 [[|]]\uFF0C\u53E5\u9996\u7684\u3001\u2192 /\uFF0C\u53E5\u9996\u7684\u300B\u2192 >\uFF0C\xB7\xB7| \u2192 `|`\uFF0C `\xB7|` \u53D8\u6210\u4EE3\u7801\u5757\uFF0C\uFFE5\uFFE5| \u2192 $|$"
    },
    codeblockEdit: {
      name: "\u589E\u5F3A\u4EE3\u7801\u5757\u7F16\u8F91",
      desc: "\u589E\u5F3A\u4EE3\u7801\u5757\u5185\u7684\u7F16\u8F91\uFF08Cmd/Ctrl+A \u9009\u4E2D\u3001Tab\u3001\u5220\u9664\u3001\u7C98\u8D34\uFF09"
    },
    backspaceEdit: {
      name: "\u589E\u5F3A\u5220\u9664\u529F\u80FD",
      desc: "\u589E\u5F3A\u5220\u9664\u7A7A\u5217\u8868\u9879\u6216\u7A7A\u5F15\u7528\u884C\u7684\u529F\u80FD"
    },
    tabOut: {
      name: "Tab \u952E\u5149\u6807\u8DF3\u51FA",
      desc: "Tab \u952E\u8DF3\u51FA\u884C\u5185\u4EE3\u7801\u5757\u6216\u914D\u5BF9\u7B26\u53F7\u5757"
    },
    autoFormatting: {
      name: "\u8F93\u5165\u65F6\u81EA\u52A8\u683C\u5F0F\u5316",
      desc: "\u662F\u5426\u5728\u7F16\u8F91\u6587\u6863\u65F6\u81EA\u52A8\u683C\u5F0F\u5316\u6587\u672C\uFF0C\u81EA\u52A8\u683C\u5F0F\u5316\u7684\u603B\u5F00\u5173"
    },
    spaceBetweenChineseEnglish: {
      name: "\u4E2D\u6587\u4E0E\u82F1\u6587\u4E4B\u95F4\u7684\u7A7A\u683C",
      desc: "\u5728\u4E2D\u6587\u548C\u82F1\u6587\u4E4B\u95F4\u63D2\u5165\u7A7A\u683C\uFF0C\u53EF\u64A4\u9500"
    },
    spaceBetweenChineseNumber: {
      name: "\u4E2D\u6587\u4E0E\u6570\u5B57\u4E4B\u95F4\u7684\u7A7A\u683C",
      desc: "\u5728\u4E2D\u6587\u548C\u6570\u5B57\u4E4B\u95F4\u63D2\u5165\u7A7A\u683C\uFF0C\u53EF\u64A4\u9500"
    },
    spaceBetweenEnglishNumber: {
      name: "\u82F1\u6587\u4E0E\u6570\u5B57\u4E4B\u95F4\u7684\u7A7A\u683C",
      desc: "\u5728\u82F1\u6587\u548C\u6570\u5B57\u4E4B\u95F4\u63D2\u5165\u7A7A\u683C\uFF0C\u53EF\u64A4\u9500"
    },
    quoteSpace: {
      name: "\u5F15\u7528\u7B26\u53F7 > \u4E0E\u6587\u672C\u4E4B\u95F4\u81EA\u52A8\u7A7A\u683C",
      desc: "\u5728\u5F15\u7528\u7B26\u53F7 > \u4E0E\u6587\u672C\u4E4B\u95F4\u81EA\u52A8\u63D2\u5165\u7A7A\u683C\uFF0C\u4E0D\u53EF\u64A4\u9500"
    },
    deleteSpaceBetweenChinese: {
      name: "\u5220\u9664\u4E2D\u6587\u5B57\u7B26\u95F4\u7684\u7A7A\u683C",
      desc: "\u53BB\u9664\u4E2D\u6587\u5B57\u7B26\u4E4B\u95F4\u7684\u7A7A\u683C\uFF0C\u4E0D\u53EF\u64A4\u9500"
    },
    capitalizeFirstLetter: {
      name: "\u53E5\u9996\u5B57\u6BCD\u5927\u5199",
      desc: "\u82F1\u6587\u6BCF\u4E2A\u53E5\u9996\u5B57\u6BCD\u5927\u5199\uFF0C\u53EF\u64A4\u9500"
    },
    textPunctuationSpace: {
      name: "\u6587\u672C\u548C\u6807\u70B9\u95F4\u7A7A\u683C",
      desc: "\u5728\u6587\u672C\u548C\u6807\u70B9\u4E4B\u95F4\u667A\u80FD\u63D2\u5165\u7A7A\u683C"
    },
    spaceStrategyInlineCode: {
      name: "\u884C\u5185\u4EE3\u7801\u548C\u6587\u672C\u4E4B\u95F4\u7684\u7A7A\u683C\u7B56\u7565",
      desc: "\u65E0\u8981\u6C42\uFF1A\u5BF9\u672C\u7C7B\u522B\u5757\u4E0E\u5DE6\u53F3\u6587\u672C\u6CA1\u6709\u7A7A\u683C\u7684\u8981\u6C42\uFF0C\u8F6F\u7A7A\u683C\uFF1A\u5BF9\u672C\u7C7B\u522B\u5757\u4E0E\u5468\u56F4\u533A\u5757\u53EA\u8981\u6C42\u6709\u8F6F\u7A7A\u683C\uFF0C\u8F6F\u7A7A\u683C\u5982\u5F53\u524D\u5757\u5DE6\u8FB9\u7684\u4E34\u8FD1\u6587\u672C\u4E3A\u3002\uFF0C\uFF1B\uFF1F\u7B49\u5168\u89D2\u6807\u70B9\uFF0C\u5F53\u524D\u5757\u53F3\u8FB9\u7684\u4E34\u8FD1\u6587\u672C\u4E3A\u6240\u6709\u5168\u534A\u89D2\u6807\u70B9\uFF0C\u4E25\u683C\u7A7A\u683C\uFF1A\u5F53\u524D\u5757\u4E0E\u4E34\u8FD1\u6587\u672C\u4E4B\u95F4\u4E25\u683C\u6DFB\u52A0\u7A7A\u683C\u3002"
    },
    spaceStrategyInlineFormula: {
      name: "\u884C\u5185\u516C\u5F0F\u548C\u6587\u672C\u4E4B\u95F4\u7684\u7A7A\u683C\u7B56\u7565",
      desc: "\u5B9A\u4E49\u884C\u5185\u516C\u5F0F\u548C\u6587\u672C\u4E4B\u95F4\u7684\u7A7A\u683C\u7B56\u7565"
    },
    spaceStrategyLinkText: {
      name: "\u94FE\u63A5\u548C\u6587\u672C\u4E4B\u95F4\u7684\u7A7A\u683C\u7B56\u7565",
      desc: "\u5B9A\u4E49 [[wikilink]] [mdlink](...) \u548C\u6587\u672C\u4E4B\u95F4\u7684\u7A7A\u683C\u7B56\u7565"
    },
    userDefinedRegexpSwitch: {
      name: "\u7528\u6237\u5B9A\u4E49\u7684\u6B63\u5219\u8868\u8FBE\u5F0F\u5F00\u5173",
      desc: "\u81EA\u5B9A\u4E49\u6B63\u5219\u8868\u8FBE\u5F0F\u5F00\u5173\uFF0C\u5339\u914D\u5230\u7684\u5185\u5BB9\u4E0D\u8FDB\u884C\u683C\u5F0F\u5316\uFF0C\u4E14\u53EF\u4EE5\u8BBE\u7F6E\u5339\u914D\u5230\u7684\u5185\u5BB9\u5757\u4E0E\u5176\u4ED6\u5185\u5BB9\u4E4B\u95F4\u7684\u7A7A\u683C\u7B56\u7565"
    },
    userDefinedRegexp: {
      name: "\u7528\u6237\u5B9A\u4E49\u7684\u6B63\u5219\u8868\u8FBE\u5F0F",
      desc: "\u7528\u6237\u81EA\u5B9A\u4E49\u6B63\u5219\u8868\u8FBE\u5F0F\uFF0C\u5339\u914D\u5230\u7684\u5185\u5BB9\u4E0D\u8FDB\u884C\u683C\u5F0F\u5316\uFF0C\u6BCF\u884C\u4E00\u4E2A\u8868\u8FBE\u5F0F\uFF0C\u884C\u5C3E\u4E0D\u8981\u968F\u610F\u52A0\u7A7A\u683C\u3002\u6BCF\u884C\u672B\u5C3E3\u4E2A\u5B57\u7B26\u7684\u56FA\u5B9A\u4E3A|\u548C\u4E24\u4E2A\u7A7A\u683C\u7B56\u7565\u7B26\u53F7\uFF0C\u7A7A\u683C\u7B56\u7565\u7B26\u53F7\u4E3A-=+\uFF0C\u5206\u522B\u4EE3\u8868\u4E0D\u8981\u6C42\u7A7A\u683C(-)\uFF0C\u8F6F\u7A7A\u683C(=)\uFF0C\u4E25\u683C\u7A7A\u683C(+)\u3002\u8FD9\u4E24\u4E2A\u7A7A\u683C\u7B56\u7565\u7B26\u53F7\u5206\u522B\u4E3A\u5339\u914D\u533A\u5757\u7684\u5DE6\u53F3\u4E24\u8FB9\u7684\u7A7A\u683C\u7B56\u7565"
    },
    excludeFoldersFiles: {
      name: "\u6392\u9664\u6587\u4EF6\u5939/\u6587\u4EF6",
      desc: "\u8BE5\u63D2\u4EF6\u5C06\u6BCF\u884C\u89E3\u6790\u4E3A\u4E00\u4E2A\u6392\u9664\u6587\u4EF6\u5939\u6216\u6587\u4EF6\u3002\u4F8B\u5982\uFF1ADailyNote/, DailyNote/WeekNotes/, DailyNote/test.md"
    },
    fixMacOSContextMenu: {
      name: "\u4FEE\u590D MacOS \u53F3\u952E\u83DC\u5355\u5149\u6807\u4F4D\u7F6E",
      desc: "\u4FEE\u590D MacOS \u9F20\u6807\u53F3\u952E\u547C\u51FA\u83DC\u5355\u65F6\u5149\u6807\u8DF3\u5230\u4E0B\u4E00\u884C\u7684\u95EE\u9898 (\u9700\u8981\u91CD\u542F Obsidian \u751F\u6548)"
    },
    fixMicrosoftIME: {
      name: "\u4FEE\u590D\u5FAE\u8F6F\u8F93\u5165\u6CD5\u95EE\u9898",
      desc: "\u9002\u914D\u65E7\u7248\u5FAE\u8F6F\u8F93\u5165\u6CD5"
    },
    strictLineBreaks: {
      name: "\u4E25\u683C\u6362\u884C\u6A21\u5F0F\u56DE\u8F66\u589E\u5F3A",
      desc: "\u4E25\u683C\u6362\u884C\u7684\u8BBE\u7F6E\u4E0B\uFF0C\u5728\u666E\u901A\u6587\u672C\u884C\u8FDB\u884C\u4E00\u6B21\u56DE\u8F66\u4F1A\u6839\u636E\u6A21\u5F0F\u4EA7\u751F\u4E24\u4E2A\u6362\u884C\u7B26\u6216\u8005\u4E24\u4E2A\u7A7A\u683C\u548C\u56DE\u8F66"
    },
    enhanceModA: {
      name: "\u589E\u5F3A Ctrl/Cmd+A \u529F\u80FD",
      desc: "\u7B2C\u4E00\u6B21\u9009\u4E2D\u5F53\u524D\u884C\uFF0C\u7B2C\u4E8C\u6B21\u9009\u4E2D\u5F53\u524D\u6587\u672C\u5757\uFF0C\u7B2C\u4E09\u6B21\u9009\u4E2D\u5168\u6587\u3002"
    },
    collapsePersistentEnter: {
      name: "\u6807\u9898\u6298\u53E0\u4FDD\u5E8F",
      desc: "\u5728\u6298\u53E0\u7684\u540C\u7EA7\u6807\u9898\u884C\u6309\u56DE\u8F66\u4E0D\u4F1A\u5C55\u5F00\uFF0C\u76F4\u63A5\u6DFB\u52A0\u540C\u7EA7\u6807\u9898\u884C"
    },
    puncRectify: {
      name: "\u6807\u70B9\u77EB\u6B63",
      desc: "\u4EC5\u5728\u8F93\u5165\u8FC7\u7A0B\u4E2D\uFF0C\u4E2D\u6587\u95F4\u7684\u82F1\u6587\u6807\u70B9\uFF08,.?!\uFF09\u81EA\u52A8\u8F6C\u6362\u4E3A\u5168\u89D2\uFF08\u53EF\u64A4\u9500\uFF09"
    },
    printDebugInfo: {
      name: "\u5728\u63A7\u5236\u53F0\u8F93\u51FA\u8C03\u8BD5\u4FE1\u606F",
      desc: "\u5728\u63A7\u5236\u53F0\u8F93\u51FA\u8C03\u8BD5\u4FE1\u606F"
    },
    selectionReplaceRule: {
      name: "\u9009\u4E2D\u66FF\u6362\u89C4\u5219",
      desc: "\u7528\u6237\u5B9A\u4E49\u7684\u9009\u62E9\u66FF\u6362\u89C4\u5219"
    },
    deleteRule: {
      name: "\u5220\u9664\u89C4\u5219",
      desc: "\u89C4\u5219\uFF1A\u7528 | \u4EE3\u8868\u5149\u6807\u4F4D\u7F6E\uFF0C\u5FC5\u987B\u5305\u542B\u5149\u6807\u3002\u63D0\u793A\uFF1A\u4F7F\u7528 | \u8868\u793A\u5149\u6807\u4F4D\u7F6E\u3002"
    },
    convertRule: {
      name: "\u8F6C\u6362\u89C4\u5219",
      desc: "\u89C4\u5219\uFF1A\u7528 | \u4EE3\u8868\u5149\u6807\u4F4D\u7F6E\uFF0C\u5FC5\u987B\u5305\u542B\u5149\u6807\u3002\u63D0\u793A\uFF1A\u4F7F\u7528 | \u8868\u793A\u5149\u6807\u4F4D\u7F6E\u3002"
    },
    trigger: {
      name: "\u89E6\u53D1\u5668"
    },
    left: {
      name: "\u5DE6"
    },
    right: {
      name: "\u53F3"
    },
    oldPattern: {
      name: "\u65E7\u6A21\u5F0F"
    },
    newPattern: {
      name: "\u65B0\u6A21\u5F0F"
    }
  },
  headers: {
    main: "Obsidian EasyTyping \u63D2\u4EF6",
    githubDetail: "\u8BE6\u60C5\u89C1 Github\uFF1A",
    enhancedEditing: "\u589E\u5F3A\u7F16\u8F91\u8BBE\u7F6E",
    customizeEditRule: "\u81EA\u5B9A\u4E49\u7F16\u8F91\u8F6C\u6362\u89C4\u5219",
    autoformatSetting: "\u81EA\u52A8\u683C\u5F0F\u5316\u8BBE\u7F6E",
    detailedSetting: "\u8BE6\u7EC6\u8BBE\u7F6E\u5982\u4E0B",
    customRegexpBlock: "\u81EA\u5B9A\u4E49\u6B63\u5219\u533A\u5757",
    excludeFoldersFiles: "\u6307\u5B9A\u6587\u4EF6\u4E0D\u81EA\u52A8\u683C\u5F0F\u5316",
    experimentalFeatures: "\u5B9E\u9A8C\u529F\u80FD",
    aboutRegexp: {
      header: "\u6B63\u5219\u8868\u8FBE\u5F0F\u76F8\u5173\u77E5\u8BC6\uFF0C\u89C1 ",
      text: "\u300A\u962E\u4E00\u5CF0\uFF1A\u6B63\u5219\u8868\u8FBE\u5F0F\u7B80\u660E\u6559\u7A0B\u300B"
    },
    instructionsRegexp: {
      header: "\u6B63\u5219\u8868\u8FBE\u5F0F\u89C4\u5219\u4F7F\u7528\u8BF4\u660E\u4E0E\u793A\u4F8B\uFF1A ",
      text: "\u81EA\u5B9A\u4E49\u6B63\u5219\u8868\u8FBE\u5F0F\u89C4\u5219"
    },
    customizeSelectionRule: "\u81EA\u5B9A\u4E49\u9009\u4E2D\u6587\u672C\u7F16\u8F91\u589E\u5F3A\u89C4\u5219",
    customizeDeleteRule: "\u81EA\u5B9A\u4E49\u5220\u9664\u7F16\u8F91\u589E\u5F3A\u89C4\u5219",
    customizeConvertRule: "\u81EA\u5B9A\u4E49\u7F16\u8F91\u8F6C\u6362\u89C4\u5219",
    editSelectionReplaceRule: "\u7F16\u8F91\u9009\u4E2D\u66FF\u6362\u89C4\u5219"
  },
  dropdownOptions: {
    enterTwice: "\u4E24\u6B21\u56DE\u8F66",
    twoSpace: "\u52A0\u4E24\u4E2A\u7A7A\u683C",
    mixMode: "\u6DF7\u5408\u6A21\u5F0F",
    onlyWhenTyping: "\u8F93\u5165\u65F6\u751F\u6548",
    globally: "\u5168\u5C40\u751F\u6548",
    noRequire: "\u65E0\u8981\u6C42",
    softSpace: "\u8F6F\u7A7A\u683C",
    strictSpace: "\u4E25\u683C\u7A7A\u683C",
    dummy: "\u5446\u7A7A\u683C",
    smart: "\u667A\u80FD\u7A7A\u683C"
  },
  toolTip: {
    switch: "\u529F\u80FD\u5F00\u5173",
    editRule: "\u7F16\u8F91\u89C4\u5219",
    removeRule: "\u5220\u9664\u89C4\u5219",
    addRule: "\u6DFB\u52A0\u89C4\u5219"
  },
  placeHolder: {
    triggerSymbol: "\u89E6\u53D1\u7B26",
    newLeftSideString: "\u5DE6\u8FB9\u7B26\u53F7",
    newRightSideString: "\u53F3\u8FB9\u7B26\u53F7",
    addRule: "\u6DFB\u52A0\u89C4\u5219",
    noticeInvaidTrigger: "\u65E0\u6548\u7684\u89E6\u53D1\u7B26, \u89E6\u53D1\u7B26\u5FC5\u987B\u662F\u5355\u5B57\u7B26\u6216\u8005\u662F \u2014\u2014\u3001\u2026\u2026",
    noticeWarnTriggerExists: "\u65E0\u6548\u89C4\u5219! \u89E6\u53D1\u7B26 %s \u5DF2\u5B58\u5728",
    noticeMissingInput: "missing input",
    beforeDelete: "\u5220\u9664\u524D|",
    newPattern: "\u89E6\u53D1\u89C4\u5219\u540E\u5B57\u7B26\u4E32\u6A21\u5F0F",
    noticeInvaidTriggerPatternContainSymbol: "\u65E0\u6548\u89C4\u5219, \u8F6C\u6362\u524D\u6A21\u5F0F\u5FC5\u987B\u5305\u542B\u4EE3\u8868\u5149\u6807\u4F4D\u7F6E\u7684\u7B26\u53F7 |",
    beforeConvert: "\u8F6C\u6362\u524D|",
    noticeInvalidPatternString: "Invalid pattern string!"
  },
  button: {
    update: "\u66F4\u65B0"
  }
};
var zh_CN_default = locale2;

// src/lang/locale/ru-RU.ts
var locale3 = {
  settings: {
    symbolAutoPair: {
      name: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043F\u0430\u0440\u0430",
      desc: "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0430\u0432\u0442\u043E\u0437\u0430\u043A\u0440\u044B\u0442\u0438\u0435 \u0438 \u0430\u0432\u0442\u043E\u0437\u0430\u043A\u0440\u044B\u0442\u0438\u0435 \u0434\u043B\u044F \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432, \u0442\u0430\u043A\u0438\u0445 \u043A\u0430\u043A \u300A\u300B, \u201C\u201D, \u300C\u300D, \u300E\u300F, \u3010\u3011 \u0438 \u0442.\u0434."
    },
    selectionReplace: {
      name: "\u0423\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u0435 \u0437\u0430\u043C\u0435\u043D\u044B \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430",
      desc: "\u0423\u043B\u0443\u0447\u0448\u0435\u043D\u043D\u043E\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u043D\u0430\u0436\u0430\u0442\u0438\u0435 \uFFE5 \u2192 $\u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442$, \u043D\u0430\u0436\u0430\u0442\u0438\u0435 \xB7 \u2192 `\u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442`, \u300A \u2192 \u300A\u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442\u300B \u0438 \u0442.\u0434."
    },
    fullWidthToHalfWidth: {
      name: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044F \u043F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043F\u043E\u043B\u043D\u043E\u0448\u0438\u0440\u0438\u043D\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0432 \u043F\u043E\u043B\u0443\u0448\u0438\u0440\u0438\u043D\u043D\u044B\u0435",
      desc: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044F \u043F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043F\u043E\u043B\u043D\u043E\u0448\u0438\u0440\u0438\u043D\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0432 \u043F\u043E\u043B\u0443\u0448\u0438\u0440\u0438\u043D\u043D\u044B\u0435, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u3002\u3002\u2192 ., \uFF01\uFF01\u2192 !, \u300B\u300B\u2192 >"
    },
    basicInputEnhance: {
      name: "\u0423\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u0435 \u0431\u0430\u0437\u043E\u0432\u043E\u0433\u043E \u0432\u0432\u043E\u0434\u0430 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0434\u043B\u044F Obsidian",
      desc: "\u0423\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u0435 \u0431\u0430\u0437\u043E\u0432\u043E\u0433\u043E \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F Obsidian, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u3010\u3010| \u2192 [[|]], \u043D\u0430\u0447\u0430\u043B\u043E \u0441 \u3001\u2192 /, \u043D\u0430\u0447\u0430\u043B\u043E \u0441 \u300B\u2192 >, \xB7\xB7| \u2192 `|`, `\xB7|` \u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0441\u044F \u043A\u043E\u0434\u043E\u0432\u044B\u043C \u0431\u043B\u043E\u043A\u043E\u043C, \uFFE5\uFFE5| \u2192 $|$"
    },
    codeblockEdit: {
      name: "\u0423\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043A\u043E\u0434\u043E\u0432\u044B\u0445 \u0431\u043B\u043E\u043A\u043E\u0432",
      desc: "\u0423\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0432 \u043A\u043E\u0434\u043E\u0432\u044B\u0445 \u0431\u043B\u043E\u043A\u0430\u0445 (Tab, \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0435, \u0432\u0441\u0442\u0430\u0432\u043A\u0430, Cmd/Ctrl+A \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435)."
    },
    backspaceEdit: {
      name: "\u0423\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u0435 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F",
      desc: "\u0423\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u0435 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u043F\u0443\u0441\u0442\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0441\u043F\u0438\u0441\u043A\u0430 \u0438\u043B\u0438 \u043F\u0443\u0441\u0442\u044B\u0445 \u0441\u0442\u0440\u043E\u043A \u0441\u0441\u044B\u043B\u043E\u043A."
    },
    tabOut: {
      name: "Tabout",
      desc: "\u0412\u044B\u0439\u0442\u0438 \u0438\u0437 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430 \u0438\u043B\u0438 \u043F\u0430\u0440\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432."
    },
    autoFormatting: {
      name: "\u0410\u0432\u0442\u043E\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u043F\u0440\u0438 \u043D\u0430\u0431\u043E\u0440\u0435 \u0442\u0435\u043A\u0441\u0442\u0430",
      desc: "\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435/\u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0430\u0432\u0442\u043E\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0442\u0435\u043A\u0441\u0442\u0430 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430."
    },
    spaceBetweenChineseEnglish: {
      name: "\u041F\u0440\u043E\u0431\u0435\u043B \u043C\u0435\u0436\u0434\u0443 \u043A\u0438\u0442\u0430\u0439\u0441\u043A\u0438\u043C\u0438 \u0438 \u0430\u043D\u0433\u043B\u0438\u0439\u0441\u043A\u0438\u043C\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438",
      desc: "\u0412\u0441\u0442\u0430\u0432\u043A\u0430 \u043F\u0440\u043E\u0431\u0435\u043B\u0430 \u043C\u0435\u0436\u0434\u0443 \u043A\u0438\u0442\u0430\u0439\u0441\u043A\u0438\u043C\u0438 \u0438 \u0430\u043D\u0433\u043B\u0438\u0439\u0441\u043A\u0438\u043C\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438."
    },
    spaceBetweenChineseNumber: {
      name: "\u041F\u0440\u043E\u0431\u0435\u043B \u043C\u0435\u0436\u0434\u0443 \u043A\u0438\u0442\u0430\u0439\u0441\u043A\u0438\u043C\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438 \u0438 \u0447\u0438\u0441\u043B\u0430\u043C\u0438",
      desc: "\u0412\u0441\u0442\u0430\u0432\u043A\u0430 \u043F\u0440\u043E\u0431\u0435\u043B\u0430 \u043C\u0435\u0436\u0434\u0443 \u043A\u0438\u0442\u0430\u0439\u0441\u043A\u0438\u043C\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438 \u0438 \u0447\u0438\u0441\u043B\u0430\u043C\u0438."
    },
    spaceBetweenEnglishNumber: {
      name: "\u041F\u0440\u043E\u0431\u0435\u043B \u043C\u0435\u0436\u0434\u0443 \u0430\u043D\u0433\u043B\u0438\u0439\u0441\u043A\u0438\u043C\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438 \u0438 \u0447\u0438\u0441\u043B\u0430\u043C\u0438",
      desc: "\u0412\u0441\u0442\u0430\u0432\u043A\u0430 \u043F\u0440\u043E\u0431\u0435\u043B\u0430 \u043C\u0435\u0436\u0434\u0443 \u0430\u043D\u0433\u043B\u0438\u0439\u0441\u043A\u0438\u043C\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438 \u0438 \u0447\u0438\u0441\u043B\u0430\u043C\u0438."
    },
    quoteSpace: {
      name: "\u041F\u0440\u043E\u0431\u0435\u043B \u043C\u0435\u0436\u0434\u0443 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u043C > \u0438 \u0442\u0435\u043A\u0441\u0442\u043E\u043C",
      desc: "\u0412\u0441\u0442\u0430\u0432\u043A\u0430 \u043F\u0440\u043E\u0431\u0435\u043B\u0430 \u043C\u0435\u0436\u0434\u0443 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u043C > \u0438 \u0442\u0435\u043A\u0441\u0442\u043E\u043C."
    },
    deleteSpaceBetweenChinese: {
      name: "\u0423\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u0430 \u043C\u0435\u0436\u0434\u0443 \u043A\u0438\u0442\u0430\u0439\u0441\u043A\u0438\u043C\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438",
      desc: "\u0423\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043C\u0435\u0436\u0434\u0443 \u043A\u0438\u0442\u0430\u0439\u0441\u043A\u0438\u043C\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438."
    },
    capitalizeFirstLetter: {
      name: "\u0417\u0430\u0433\u043B\u0430\u0432\u043D\u0430\u044F \u0431\u0443\u043A\u0432\u0430 \u0432 \u043D\u0430\u0447\u0430\u043B\u0435 \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F",
      desc: "\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u0435 \u043F\u0435\u0440\u0432\u043E\u0439 \u0431\u0443\u043A\u0432\u044B \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0432 \u0430\u043D\u0433\u043B\u0438\u0439\u0441\u043A\u043E\u043C \u0432 \u0437\u0430\u0433\u043B\u0430\u0432\u043D\u0443\u044E."
    },
    textPunctuationSpace: {
      name: "\u0418\u043D\u0442\u0435\u043B\u043B\u0435\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u0430\u044F \u0432\u0441\u0442\u0430\u0432\u043A\u0430 \u043F\u0440\u043E\u0431\u0435\u043B\u0430 \u043C\u0435\u0436\u0434\u0443 \u0442\u0435\u043A\u0441\u0442\u043E\u043C \u0438 \u043F\u0443\u043D\u043A\u0442\u0443\u0430\u0446\u0438\u0435\u0439",
      desc: "\u0418\u043D\u0442\u0435\u043B\u043B\u0435\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u0430\u044F \u0432\u0441\u0442\u0430\u0432\u043A\u0430 \u043F\u0440\u043E\u0431\u0435\u043B\u0430 \u043C\u0435\u0436\u0434\u0443 \u0442\u0435\u043A\u0441\u0442\u043E\u043C \u0438 \u043F\u0443\u043D\u043A\u0442\u0443\u0430\u0446\u0438\u0435\u0439."
    },
    spaceStrategyInlineCode: {
      name: "\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044F \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043C\u0435\u0436\u0434\u0443 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u043C \u043A\u043E\u0434\u043E\u043C \u0438 \u0442\u0435\u043A\u0441\u0442\u043E\u043C",
      desc: "\u041D\u0435\u0442 \u0442\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u0438\u0439: \u041D\u0435\u0442 \u0442\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u0438\u0439 \u043A \u043F\u0440\u043E\u0431\u0435\u043B\u0430\u043C \u043C\u0435\u0436\u0434\u0443 \u044D\u0442\u0438\u043C \u0431\u043B\u043E\u043A\u043E\u043C \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0438 \u0438 \u043E\u043A\u0440\u0443\u0436\u0430\u044E\u0449\u0438\u043C \u0442\u0435\u043A\u0441\u0442\u043E\u043C. \u041C\u044F\u0433\u043A\u0438\u0439 \u043F\u0440\u043E\u0431\u0435\u043B: \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043C\u044F\u0433\u043A\u0438\u0439 \u043F\u0440\u043E\u0431\u0435\u043B \u043C\u0435\u0436\u0434\u0443 \u044D\u0442\u0438\u043C \u0431\u043B\u043E\u043A\u043E\u043C \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0438 \u0438 \u043E\u043A\u0440\u0443\u0436\u0430\u044E\u0449\u0438\u043C\u0438 \u0431\u043B\u043E\u043A\u0430\u043C\u0438. \u041F\u0440\u0438\u043C\u0435\u0440 \u043C\u044F\u0433\u043A\u043E\u0433\u043E \u043F\u0440\u043E\u0431\u0435\u043B\u0430: \u0415\u0441\u043B\u0438 \u043F\u0440\u0438\u043B\u0435\u0433\u0430\u044E\u0449\u0438\u0439 \u0442\u0435\u043A\u0441\u0442 \u0441\u043B\u0435\u0432\u0430 \u043E\u0442 \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u0431\u043B\u043E\u043A\u0430 - \u044D\u0442\u043E \u043F\u043E\u043B\u043D\u043E\u0448\u0438\u0440\u0438\u043D\u043D\u0430\u044F \u043F\u0443\u043D\u043A\u0442\u0443\u0430\u0446\u0438\u044F, \u0442\u0430\u043A\u0430\u044F \u043A\u0430\u043A . , ; ? \u0438 \u0442.\u0434., \u0430 \u043F\u0440\u0438\u043B\u0435\u0433\u0430\u044E\u0449\u0438\u0439 \u0442\u0435\u043A\u0441\u0442 \u0441\u043F\u0440\u0430\u0432\u0430 \u043E\u0442 \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u0431\u043B\u043E\u043A\u0430 - \u044D\u0442\u043E \u0432\u0441\u044F \u043F\u043E\u043B\u043D\u043E\u0448\u0438\u0440\u0438\u043D\u043D\u0430\u044F \u0438\u043B\u0438 \u043F\u043E\u043B\u0443\u0448\u0438\u0440\u0438\u043D\u043D\u0430\u044F \u043F\u0443\u043D\u043A\u0442\u0443\u0430\u0446\u0438\u044F. \u0421\u0442\u0440\u043E\u0433\u0438\u0439 \u043F\u0440\u043E\u0431\u0435\u043B: \u0421\u0442\u0440\u043E\u0433\u043E\u0435 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043C\u0435\u0436\u0434\u0443 \u0442\u0435\u043A\u0443\u0449\u0438\u043C \u0431\u043B\u043E\u043A\u043E\u043C \u0438 \u043F\u0440\u0438\u043B\u0435\u0433\u0430\u044E\u0449\u0438\u043C \u0442\u0435\u043A\u0441\u0442\u043E\u043C."
    },
    spaceStrategyInlineFormula: {
      name: "\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044F \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043C\u0435\u0436\u0434\u0443 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0439 \u0444\u043E\u0440\u043C\u0443\u043B\u043E\u0439 \u0438 \u0442\u0435\u043A\u0441\u0442\u043E\u043C",
      desc: "\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043C\u0435\u0436\u0434\u0443 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u043C\u0438 \u0444\u043E\u0440\u043C\u0443\u043B\u0430\u043C\u0438 \u0438 \u0442\u0435\u043A\u0441\u0442\u043E\u043C."
    },
    spaceStrategyLinkText: {
      name: "\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044F \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043C\u0435\u0436\u0434\u0443 \u0441\u0441\u044B\u043B\u043A\u043E\u0439 \u0438 \u0442\u0435\u043A\u0441\u0442\u043E\u043C",
      desc: "\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043C\u0435\u0436\u0434\u0443 [[\u0432\u0438\u043A\u0438\u0441\u0441\u044B\u043B\u043A\u0430\u043C\u0438]] [markdown-\u0441\u0441\u044B\u043B\u043A\u0430\u043C\u0438](...) \u0438 \u0442\u0435\u043A\u0441\u0442\u043E\u043C."
    },
    userDefinedRegexpSwitch: {
      name: "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u044B\u0445 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0439",
      desc: "\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435/\u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u044B\u0445 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0439, \u043F\u0440\u0435\u0434\u043E\u0442\u0432\u0440\u0430\u0449\u0435\u043D\u0438\u0435 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0438 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043C\u0435\u0436\u0434\u0443 \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0449\u0438\u043C \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u044B\u043C \u0438 \u0434\u0440\u0443\u0433\u0438\u043C \u0442\u0435\u043A\u0441\u0442\u043E\u043C."
    },
    userDefinedRegexp: {
      name: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0435 \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u043E\u0435 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0435, \u043E\u0434\u043D\u043E \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0443",
      desc: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0435 \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u043E\u0435 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0435, \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0449\u0435\u0435 \u0441 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u044B\u043C, \u043D\u0435 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044F, \u043E\u0434\u043D\u043E \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0443, \u043D\u0435 \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0439\u0442\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u044B \u0432 \u043A\u043E\u043D\u0446\u0435 \u0441\u0442\u0440\u043E\u043A\u0438.\u041A\u043E\u043D\u0435\u0446 \u043A\u0430\u0436\u0434\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u0444\u0438\u043A\u0441\u0438\u0440\u043E\u0432\u0430\u043D \u0442\u0440\u0435\u043C\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438: | \u0438 \u0434\u0432\u0443\u043C\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432, \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 - \u044D\u0442\u043E - = +, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u043E \u043E\u0431\u043E\u0437\u043D\u0430\u0447\u0430\u044E\u0442 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u0438\u044F \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 (-), \u043C\u044F\u0433\u043A\u0438\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u044B (=), \u0441\u0442\u0440\u043E\u0433\u0438\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u044B (+).\u042D\u0442\u0438 \u0434\u0432\u0430 \u0441\u0438\u043C\u0432\u043E\u043B\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u044F\u0432\u043B\u044F\u044E\u0442\u0441\u044F \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0435\u0439 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u0434\u043B\u044F \u043B\u0435\u0432\u043E\u0439 \u0438 \u043F\u0440\u0430\u0432\u043E\u0439 \u0441\u0442\u043E\u0440\u043E\u043D \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0449\u0435\u0433\u043E \u0431\u043B\u043E\u043A\u0430 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u043E"
    },
    excludeFoldersFiles: {
      name: "\u0418\u0441\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u0430\u043F\u043A\u0438/\u0444\u0430\u0439\u043B\u044B",
      desc: "\u042D\u0442\u043E\u0442 \u043F\u043B\u0430\u0433\u0438\u043D \u0431\u0443\u0434\u0435\u0442 \u043E\u0431\u0440\u0430\u0431\u0430\u0442\u044B\u0432\u0430\u0442\u044C \u043A\u0430\u0436\u0434\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443 \u043A\u0430\u043A \u0438\u0441\u043A\u043B\u044E\u0447\u0430\u0435\u043C\u0443\u044E \u043F\u0430\u043F\u043A\u0443 \u0438\u043B\u0438 \u0444\u0430\u0439\u043B. \u041D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: DailyNote/, DailyNote/WeekNotes/, DailyNote/test.md"
    },
    fixMacOSContextMenu: {
      name: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u043D\u043E\u0433\u043E \u043C\u0435\u043D\u044E MacOS (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u043A Obsidian)",
      desc: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u044B, \u043A\u043E\u0433\u0434\u0430 \u043A\u0443\u0440\u0441\u043E\u0440 \u043F\u0435\u0440\u0435\u0441\u043A\u0430\u043A\u0438\u0432\u0430\u0435\u0442 \u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443 \u043F\u0440\u0438 \u0432\u044B\u0437\u043E\u0432\u0435 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u043D\u043E\u0433\u043E \u043C\u0435\u043D\u044E \u043D\u0430 MacOS (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u043A Obsidian)."
    },
    fixMicrosoftIME: {
      name: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u044B \u0441 Microsoft Input Method",
      desc: "\u0410\u0434\u0430\u043F\u0442\u0430\u0446\u0438\u044F \u0434\u043B\u044F \u0441\u0442\u0430\u0440\u044B\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 Microsoft Input Method."
    },
    strictLineBreaks: {
      name: "\u0420\u0435\u0436\u0438\u043C \u0441\u0442\u0440\u043E\u0433\u0438\u0445 \u0440\u0430\u0437\u0440\u044B\u0432\u043E\u0432 \u0441\u0442\u0440\u043E\u043A",
      desc: "\u0412 \u0440\u0435\u0436\u0438\u043C\u0435 \u0441\u0442\u0440\u043E\u0433\u0438\u0445 \u0440\u0430\u0437\u0440\u044B\u0432\u043E\u0432 \u0441\u0442\u0440\u043E\u043A, \u043E\u0434\u043D\u043E\u043A\u0440\u0430\u0442\u043D\u043E\u0435 \u043D\u0430\u0436\u0430\u0442\u0438\u0435 Enter \u0432 \u043E\u0431\u044B\u0447\u043D\u044B\u0445 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0445 \u0441\u0442\u0440\u043E\u043A\u0430\u0445 \u0441\u043E\u0437\u0434\u0430\u0441\u0442 \u0434\u0432\u0430 \u0440\u0430\u0437\u0440\u044B\u0432\u0430 \u0441\u0442\u0440\u043E\u043A\u0438 \u0438\u043B\u0438 \u0434\u0432\u0430 \u043F\u0440\u043E\u0431\u0435\u043B\u0430 \u0438 Enter."
    },
    enhanceModA: {
      name: "\u0423\u043B\u0443\u0447\u0448\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 Mod+A \u0432 \u0442\u0435\u043A\u0441\u0442\u0435",
      desc: "\u0421\u043D\u0430\u0447\u0430\u043B\u0430 \u0432\u044B\u0434\u0435\u043B\u0438\u0442\u0435 \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443, \u0437\u0430\u0442\u0435\u043C \u0432\u044B\u0434\u0435\u043B\u0438\u0442\u0435 \u0442\u0435\u043A\u0443\u0449\u0438\u0439 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u0431\u043B\u043E\u043A, \u0437\u0430\u0442\u0435\u043C \u0432\u044B\u0434\u0435\u043B\u0438\u0442\u0435 \u0432\u0435\u0441\u044C \u0442\u0435\u043A\u0441\u0442."
    },
    collapsePersistentEnter: {
      name: "\u0421\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u043D\u0438\u0435 \u043F\u043E\u0441\u0442\u043E\u044F\u043D\u043D\u043E\u0433\u043E \u0432\u0432\u043E\u0434\u0430",
      desc: "\u0414\u043E\u0431\u0430\u0432\u043B\u044F\u0435\u0442 \u043E\u0434\u0438\u043D\u0430\u043A\u043E\u0432\u044B\u0435 \u0443\u0440\u043E\u0432\u043D\u0438 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432 \u0431\u0435\u0437 \u0440\u0430\u0441\u043A\u0440\u044B\u0442\u0438\u044F \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 Enter \u043D\u0430 \u0441\u0432\u0435\u0440\u043D\u0443\u0442\u043E\u043C \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0435."
    },
    puncRectify: {
      name: "\u041A\u043E\u0440\u0440\u0435\u043A\u0446\u0438\u044F \u043F\u0443\u043D\u043A\u0442\u0443\u0430\u0446\u0438\u0438",
      desc: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u043A\u043E\u043D\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044F \u0430\u043D\u0433\u043B\u0438\u0439\u0441\u043A\u043E\u0439 \u043F\u0443\u043D\u043A\u0442\u0443\u0430\u0446\u0438\u0438 (, . ? !) \u043C\u0435\u0436\u0434\u0443 \u043A\u0438\u0442\u0430\u0439\u0441\u043A\u0438\u043C\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438 \u0432 \u043F\u043E\u043B\u043D\u043E\u0448\u0438\u0440\u0438\u043D\u043D\u0443\u044E \u043F\u0443\u043D\u043A\u0442\u0443\u0430\u0446\u0438\u044E \u043F\u0440\u0438 \u043D\u0430\u0431\u043E\u0440\u0435 \u0442\u0435\u043A\u0441\u0442\u0430 (\u043E\u0431\u0440\u0430\u0442\u0438\u043C\u043E)."
    },
    printDebugInfo: {
      name: "\u0412\u044B\u0432\u043E\u0434 \u043E\u0442\u043B\u0430\u0434\u043E\u0447\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438 \u0432 \u043A\u043E\u043D\u0441\u043E\u043B\u044C",
      desc: "\u0412\u044B\u0432\u043E\u0434 \u043E\u0442\u043B\u0430\u0434\u043E\u0447\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438 \u0432 \u043A\u043E\u043D\u0441\u043E\u043B\u044C."
    },
    selectionReplaceRule: {
      name: "\u041F\u0440\u0430\u0432\u0438\u043B\u043E \u0437\u0430\u043C\u0435\u043D\u044B \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430",
      desc: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u043E \u0437\u0430\u043C\u0435\u043D\u044B \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430"
    },
    deleteRule: {
      name: "\u041F\u0440\u0430\u0432\u0438\u043B\u043E \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F",
      desc: "\u041F\u0440\u0430\u0432\u0438\u043B\u043E: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 | \u0434\u043B\u044F \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u044F \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430. \u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435 | \u0434\u043B\u044F \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u044F \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430."
    },
    convertRule: {
      name: "\u041F\u0440\u0430\u0432\u0438\u043B\u043E \u043F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u044F",
      desc: "\u041F\u0440\u0430\u0432\u0438\u043B\u043E: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 | \u0434\u043B\u044F \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u044F \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430. \u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435 | \u0434\u043B\u044F \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u044F \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430."
    },
    trigger: {
      name: "\u0422\u0440\u0438\u0433\u0433\u0435\u0440"
    },
    left: {
      name: "\u041B\u0435\u0432\u044B\u0439"
    },
    right: {
      name: "\u041F\u0440\u0430\u0432\u044B\u0439"
    },
    oldPattern: {
      name: "\u0421\u0442\u0430\u0440\u044B\u0439 \u0448\u0430\u0431\u043B\u043E\u043D"
    },
    newPattern: {
      name: "\u041D\u043E\u0432\u044B\u0439 \u0448\u0430\u0431\u043B\u043E\u043D"
    }
  },
  headers: {
    main: "\u041F\u043B\u0430\u0433\u0438\u043D Obsidian EasyTyping",
    githubDetail: "\u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0435\u0435 \u043D\u0430 Github: ",
    enhancedEditing: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u0443\u043B\u0443\u0447\u0448\u0435\u043D\u043D\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F",
    customizeEditRule: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043F\u0440\u0430\u0432\u0438\u043B\u0430 \u043F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F",
    autoformatSetting: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u0430\u0432\u0442\u043E\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F",
    detailedSetting: "\u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0430\u044F \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043D\u0438\u0436\u0435",
    customRegexpBlock: "\u0411\u043B\u043E\u043A \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u044B\u0445 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0439",
    excludeFoldersFiles: "\u0418\u0441\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u0430\u043F\u043A\u0438/\u0444\u0430\u0439\u043B\u044B",
    experimentalFeatures: "\u042D\u043A\u0441\u043F\u0435\u0440\u0438\u043C\u0435\u043D\u0442\u0430\u043B\u044C\u043D\u044B\u0435 \u0444\u0443\u043D\u043A\u0446\u0438\u0438",
    aboutRegexp: {
      header: "\u0414\u043B\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438 \u043E \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u044B\u0445 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u044F\u0445 \u0441\u043C. ",
      text: "Yifeng Nguyen: \u041A\u0440\u0430\u0442\u043A\u043E\u0435 \u0440\u0443\u043A\u043E\u0432\u043E\u0434\u0441\u0442\u0432\u043E \u043F\u043E \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u044B\u043C \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u044F\u043C"
    },
    instructionsRegexp: {
      header: "\u0418\u043D\u0441\u0442\u0440\u0443\u043A\u0446\u0438\u0438 \u0438 \u043F\u0440\u0438\u043C\u0435\u0440\u044B \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u043F\u0440\u0430\u0432\u0438\u043B \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u044B\u0445 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0439: ",
      text: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 \u043F\u0440\u0430\u0432\u0438\u043B \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u044B\u0445 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0439"
    },
    customizeSelectionRule: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043F\u0440\u0430\u0432\u0438\u043B\u0430 \u0437\u0430\u043C\u0435\u043D\u044B \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430",
    customizeDeleteRule: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043F\u0440\u0430\u0432\u0438\u043B\u0430 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F",
    customizeConvertRule: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043F\u0440\u0430\u0432\u0438\u043B\u0430 \u043F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u044F",
    editSelectionReplaceRule: "\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u0430 \u0437\u0430\u043C\u0435\u043D\u044B \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430"
  },
  dropdownOptions: {
    enterTwice: "\u0414\u0432\u0430\u0436\u0434\u044B \u043D\u0430\u0436\u043C\u0438\u0442\u0435 Enter",
    twoSpace: "\u0414\u0432\u0430 \u043F\u0440\u043E\u0431\u0435\u043B\u0430",
    mixMode: "\u0421\u043C\u0435\u0448\u0430\u043D\u043D\u044B\u0439 \u0440\u0435\u0436\u0438\u043C",
    onlyWhenTyping: "\u0422\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u0438 \u043D\u0430\u0431\u043E\u0440\u0435 \u0442\u0435\u043A\u0441\u0442\u0430",
    globally: "\u0420\u0430\u0431\u043E\u0442\u0430\u0442\u044C \u0433\u043B\u043E\u0431\u0430\u043B\u044C\u043D\u043E",
    noRequire: "\u041D\u0435\u0442 \u0442\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u0438\u0439",
    softSpace: "\u041C\u044F\u0433\u043A\u0438\u0439 \u043F\u0440\u043E\u0431\u0435\u043B",
    strictSpace: "\u0421\u0442\u0440\u043E\u0433\u0438\u0439 \u043F\u0440\u043E\u0431\u0435\u043B",
    dummy: "\u0424\u0438\u043A\u0442\u0438\u0432\u043D\u044B\u0439",
    smart: "\u0423\u043C\u043D\u044B\u0439"
  },
  toolTip: {
    switch: "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C",
    editRule: "\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u0440\u0430\u0432\u0438\u043B\u043E",
    removeRule: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043F\u0440\u0430\u0432\u0438\u043B\u043E",
    addRule: "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043F\u0440\u0430\u0432\u0438\u043B\u043E"
  },
  placeHolder: {
    triggerSymbol: "\u0421\u0438\u043C\u0432\u043E\u043B \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430",
    newLeftSideString: "\u041D\u043E\u0432\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 \u0441 \u043B\u0435\u0432\u043E\u0439 \u0441\u0442\u043E\u0440\u043E\u043D\u044B",
    newRightSideString: "\u041D\u043E\u0432\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 \u0441 \u043F\u0440\u0430\u0432\u043E\u0439 \u0441\u0442\u043E\u0440\u043E\u043D\u044B",
    addRule: "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043F\u0440\u0430\u0432\u0438\u043B\u043E",
    noticeInvaidTrigger: "\u041D\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u0442\u0440\u0438\u0433\u0433\u0435\u0440, \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u043C \u0434\u043B\u0438\u043D\u043E\u0439 1 \u0438\u043B\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u043C \u2014\u2014, \u2026\u2026",
    noticeWarnTriggerExists: "\u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435! \u0422\u0440\u0438\u0433\u0433\u0435\u0440 %s \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442!",
    noticeMissingInput: "\u041E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0432\u043E\u0434",
    beforeDelete: "\u0414\u043E \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F",
    newPattern: "\u041D\u043E\u0432\u044B\u0439 \u0448\u0430\u0431\u043B\u043E\u043D",
    noticeInvaidTriggerPatternContainSymbol: "\u041D\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u0442\u0440\u0438\u0433\u0433\u0435\u0440, \u0448\u0430\u0431\u043B\u043E\u043D \u0434\u043E\u043B\u0436\u0435\u043D \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C \u0441\u0438\u043C\u0432\u043E\u043B |, \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u044E\u0449\u0438\u0439 \u043D\u0430 \u043F\u043E\u0437\u0438\u0446\u0438\u044E \u043A\u0443\u0440\u0441\u043E\u0440\u0430",
    beforeConvert: "\u0414\u043E \u043F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u044F",
    noticeInvalidPatternString: "\u041D\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 \u0448\u0430\u0431\u043B\u043E\u043D\u0430!"
  },
  button: {
    update: "\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C"
  }
};
var ru_RU_default = locale3;

// src/lang/locale/zh-TW.ts
var locale4 = {
  settings: {
    symbolAutoPair: {
      name: "\u7B26\u865F\u81EA\u52D5\u914D\u5C0D\u53CA\u522A\u9664\u914D\u5C0D",
      desc: "\u589E\u52A0\u591A\u7A2E\u7B26\u865F\u914D\u5C0D\u8F38\u5165\uFF0C\u914D\u5C0D\u522A\u9664\uFF0C\u5982\u300A\u300B, \u201C\u201D, \u300C\u300D, \u300E\u300F, \u3010\u3011\u7B49"
    },
    selectionReplace: {
      name: "\u9078\u4E2D\u6587\u672C\u66FF\u63DB\u589E\u5F3A",
      desc: "\u9078\u4E2D\u6587\u672C\u60C5\u6CC1\u4E0B\u7684\u7DE8\u8F2F\u589E\u5F3A\uFF0C\u6309\uFFE5\u2192$\u9078\u4E2D\u7684\u6587\u672C$, \u6309\xB7\u2192`\u9078\u4E2D\u7684\u6587\u672C`\uFF0C\u300A \u2192 \u300A\u9078\u4E2D\u7684\u6587\u672C\u300B\u7B49\u7B49"
    },
    fullWidthToHalfWidth: {
      name: "\u9023\u7E8C\u8F38\u5165\u5168\u89D2\u7B26\u865F\u8F49\u534A\u89D2\u7B26\u865F",
      desc: "\u9023\u7E8C\u8F38\u5165\u5168\u89D2\u7B26\u865F\u8F49\u534A\u89D2\uFF0C\u3002\u3002\u2192 .\uFF0C\uFF01\uFF01\u2192 !\uFF0C \u300B\u300B\u2192 >"
    },
    basicInputEnhance: {
      name: "Obsidian \u7684\u57FA\u790E\u7B26\u865F\u8F38\u5165\u589E\u5F3A",
      desc: "Obsidian \u7684\u57FA\u790E\u8F38\u5165\u589E\u5F3A\uFF0C\u5982\u3010\u3010| \u2192 [[|]]\uFF0C\u53E5\u9996\u7684\u3001\u2192 /\uFF0C\u53E5\u9996\u7684\u300B\u2192 >\uFF0C\xB7\xB7| \u2192 `|`\uFF0C `\xB7|` \u8B8A\u6210\u4EE3\u78BC\u584A\uFF0C\uFFE5\uFFE5| \u2192 $|$"
    },
    codeblockEdit: {
      name: "\u589E\u5F3A\u4EE3\u78BC\u584A\u7DE8\u8F2F",
      desc: "\u589E\u5F3A\u4EE3\u78BC\u584A\u5167\u7684\u7DE8\u8F2F\uFF08Cmd/Ctrl+A \u9078\u4E2D\u3001Tab\u3001\u522A\u9664\u3001\u7C98\u8CBC\uFF09"
    },
    backspaceEdit: {
      name: "\u589E\u5F37\u522A\u9664\u529F\u80FD",
      desc: "\u589E\u5F37\u522A\u9664\u7A7A\u5217\u8868\u9805\u6216\u7A7A\u5F15\u7528\u884C\u7684\u529F\u80FD"
    },
    tabOut: {
      name: "Tab \u952E\u5149\u6807\u8DF3\u51FA",
      desc: "Tab \u952E\u8DF3\u51FA\u884C\u5167\u4EE3\u78BC\u584A\u6216\u914D\u5C0D\u7B26\u865F\u584A"
    },
    autoFormatting: {
      name: "\u8F38\u5165\u6642\u81EA\u52D5\u683C\u5F0F\u5316",
      desc: "\u662F\u5426\u5728\u7DE8\u8F2F\u6587\u6A94\u6642\u81EA\u52D5\u683C\u5F0F\u5316\u6587\u672C\uFF0C\u81EA\u52D5\u683C\u5F0F\u5316\u7684\u7E3D\u958B\u95DC"
    },
    spaceBetweenChineseEnglish: {
      name: "\u4E2D\u6587\u8207\u82F1\u6587\u4E4B\u9593\u7684\u7A7A\u683C",
      desc: "\u5728\u4E2D\u6587\u548C\u82F1\u6587\u4E4B\u9593\u63D2\u5165\u7A7A\u683C\uFF0C\u53EF\u53D6\u6D88"
    },
    spaceBetweenChineseNumber: {
      name: "\u4E2D\u6587\u8207\u6578\u5B57\u4E4B\u9593\u7684\u7A7A\u683C",
      desc: "\u5728\u4E2D\u6587\u548C\u6578\u5B57\u4E4B\u9593\u63D2\u5165\u7A7A\u683C\uFF0C\u53EF\u53D6\u6D88"
    },
    spaceBetweenEnglishNumber: {
      name: "\u82F1\u6587\u8207\u6578\u5B57\u4E4B\u9593\u7684\u7A7A\u683C",
      desc: "\u5728\u82F1\u6587\u548C\u6578\u5B57\u4E4B\u9593\u63D2\u5165\u7A7A\u683C\uFF0C\u53EF\u53D6\u6D88"
    },
    quoteSpace: {
      name: "\u5F15\u7528\u7B26\u865F > \u8207\u6587\u672C\u4E4B\u9593\u81EA\u52D5\u7A7A\u683C",
      desc: "\u5728\u5F15\u7528\u7B26\u865F > \u8207\u6587\u672C\u4E4B\u9593\u81EA\u52D5\u63D2\u5165\u7A7A\u683C\uFF0C\u4E0D\u53EF\u53D6\u6D88"
    },
    deleteSpaceBetweenChinese: {
      name: "\u522A\u9664\u4E2D\u6587\u5B57\u7B26\u9593\u7684\u7A7A\u683C",
      desc: "\u53BB\u9664\u4E2D\u6587\u5B57\u7B26\u4E4B\u9593\u7684\u7A7A\u683C\uFF0C\u4E0D\u53EF\u53D6\u6D88"
    },
    capitalizeFirstLetter: {
      name: "\u53E5\u9996\u5B57\u6BCD\u5927\u5BEB",
      desc: "\u82F1\u6587\u6BCF\u500B\u53E5\u9996\u5B57\u6BCD\u5927\u5BEB\uFF0C\u53EF\u53D6\u6D88"
    },
    textPunctuationSpace: {
      name: "\u6587\u672C\u548C\u6A19\u9EDE\u9593\u7A7A\u683C",
      desc: "\u5728\u6587\u672C\u548C\u6A19\u9EDE\u4E4B\u9593\u667A\u80FD\u63D2\u5165\u7A7A\u683C"
    },
    spaceStrategyInlineCode: {
      name: "\u884C\u5167\u4EE3\u78BC\u548C\u6587\u672C\u4E4B\u9593\u7684\u7A7A\u683C\u7B56\u7565",
      desc: "\u7121\u8981\u6C42\uFF1A\u5C0D\u672C\u985E\u5225\u584A\u8207\u5DE6\u53F3\u6587\u672C\u6C92\u6709\u7A7A\u683C\u7684\u8981\u6C42\uFF0C\u8EDF\u7A7A\u683C\uFF1A\u5C0D\u672C\u985E\u5225\u584A\u8207\u5468\u570D\u5340\u584A\u53EA\u8981\u6C42\u6709\u8EDF\u7A7A\u683C\uFF0C\u8EDF\u7A7A\u683C\u5982\u7576\u524D\u584A\u5DE6\u908A\u7684\u81E8\u8FD1\u6587\u672C\u70BA\u3002\uFF0C\uFF1B\uFF1F\u7B49\u5168\u89D2\u6A19\u9EDE\uFF0C\u7576\u524D\u584A\u53F3\u908A\u7684\u81E8\u8FD1\u6587\u672C\u70BA\u6240\u6709\u5168\u534A\u89D2\u6A19\u9EDE\uFF0C\u56B4\u683C\u7A7A\u683C\uFF1A\u7576\u524D\u584A\u8207\u81E8\u8FD1\u6587\u672C\u4E4B\u9593\u56B4\u683C\u6DFB\u52A0\u7A7A\u683C\u3002"
    },
    spaceStrategyInlineFormula: {
      name: "\u884C\u5167\u516C\u5F0F\u548C\u6587\u672C\u4E4B\u9593\u7684\u7A7A\u683C\u7B56\u7565",
      desc: "\u5B9A\u7FA9\u884C\u5167\u516C\u5F0F\u548C\u6587\u672C\u4E4B\u9593\u7684\u7A7A\u683C\u7B56\u7565"
    },
    spaceStrategyLinkText: {
      name: "\u9023\u7D50\u548C\u6587\u672C\u4E4B\u9593\u7684\u7A7A\u683C\u7B56\u7565",
      desc: "\u5B9A\u7FA9 [[wikilink]] [mdlink](...) \u548C\u6587\u672C\u4E4B\u9593\u7684\u7A7A\u683C\u7B56\u7565"
    },
    userDefinedRegexpSwitch: {
      name: "\u7528\u6236\u5B9A\u7FA9\u7684\u6B63\u5247\u8868\u9054\u5F0F\u958B\u95DC",
      desc: "\u81EA\u5B9A\u7FA9\u6B63\u5247\u8868\u9054\u5F0F\u958B\u95DC\uFF0C\u5339\u914D\u5230\u7684\u5167\u5BB9\u4E0D\u9032\u884C\u683C\u5F0F\u5316\uFF0C\u4E14\u53EF\u4EE5\u8A2D\u7F6E\u5339\u914D\u5230\u7684\u5167\u5BB9\u584A\u8207\u5176\u4ED6\u5167\u5BB9\u4E4B\u9593\u7684\u7A7A\u683C\u7B56\u7565"
    },
    userDefinedRegexp: {
      name: "\u7528\u6236\u5B9A\u7FA9\u7684\u6B63\u5247\u8868\u9054\u5F0F",
      desc: "\u7528\u6236\u81EA\u5B9A\u7FA9\u6B63\u5247\u8868\u9054\u5F0F\uFF0C\u5339\u914D\u5230\u7684\u5167\u5BB9\u4E0D\u9032\u884C\u683C\u5F0F\u5316\uFF0C\u6BCF\u884C\u4E00\u500B\u8868\u9054\u5F0F\uFF0C\u884C\u5C3E\u4E0D\u8981\u96A8\u610F\u52A0\u7A7A\u683C\u3002\u6BCF\u884C\u672B\u5C3E3\u500B\u5B57\u7B26\u7684\u56FA\u5B9A\u70BA|\u548C\u5169\u500B\u7A7A\u683C\u7B56\u7565\u7B26\u865F\uFF0C\u7A7A\u683C\u7B56\u7565\u7B26\u865F\u70BA-=+\uFF0C\u5206\u5225\u4EE3\u8868\u4E0D\u8981\u6C42\u7A7A\u683C(-)\uFF0C\u8EDF\u7A7A\u683C(=)\uFF0C\u56B4\u683C\u7A7A\u683C(+)\u3002\u9019\u5169\u500B\u7A7A\u683C\u7B56\u7565\u7B26\u865F\u5206\u5225\u70BA\u5339\u914D\u5340\u584A\u7684\u5DE6\u53F3\u5169\u908A\u7684\u7A7A\u683C\u7B56\u7565"
    },
    excludeFoldersFiles: {
      name: "\u6392\u9664\u6587\u4EF6\u593E/\u6587\u4EF6",
      desc: "\u8A72\u63D2\u4EF6\u5C07\u6BCF\u884C\u89E3\u6790\u70BA\u4E00\u500B\u6392\u9664\u6587\u4EF6\u593E\u6216\u6587\u4EF6\u3002\u4F8B\u5982\uFF1ADailyNote/, DailyNote/WeekNotes/, DailyNote/test.md"
    },
    fixMacOSContextMenu: {
      name: "\u4FEE\u5FA9 MacOS \u53F3\u9375\u83DC\u55AE\u5149\u6A19\u4F4D\u7F6E",
      desc: "\u4FEE\u5FA9 MacOS \u9F20\u6A19\u53F3\u9375\u547C\u51FA\u83DC\u55AE\u6642\u5149\u6A19\u8DF3\u5230\u4E0B\u4E00\u884C\u7684\u554F\u984C (\u9700\u8981\u91CD\u555F Obsidian \u751F\u6548)"
    },
    fixMicrosoftIME: {
      name: "\u4FEE\u5FA9\u5FAE\u8EDF\u8F38\u5165\u6CD5\u554F\u984C",
      desc: "\u9069\u914D\u820A\u7248\u5FAE\u8EDF\u8F38\u5165\u6CD5"
    },
    strictLineBreaks: {
      name: "\u56B4\u683C\u63DB\u884C\u6A21\u5F0F\u56DE\u8ECA\u589E\u5F37",
      desc: "\u56B4\u683C\u63DB\u884C\u7684\u8A2D\u7F6E\u4E0B\uFF0C\u5728\u666E\u901A\u6587\u672C\u884C\u9032\u884C\u4E00\u6B21\u56DE\u8ECA\u6703\u6839\u64DA\u6A21\u5F0F\u7522\u751F\u5169\u500B\u63DB\u884C\u7B26\u6216\u8005\u5169\u500B\u7A7A\u683C\u548C\u56DE\u8ECA"
    },
    enhanceModA: {
      name: "\u589E\u5F37 Mod+A \u529F\u80FD",
      desc: "\u7B2C\u4E00\u6B21\u9078\u4E2D\u7576\u524D\u884C\uFF0C\u7B2C\u4E8C\u6B21\u9078\u4E2D\u7576\u524D\u6587\u672C\u584A\uFF0C\u7B2C\u4E09\u6B21\u9078\u4E2D\u5168\u6587\u3002"
    },
    collapsePersistentEnter: {
      name: "\u6A19\u984C\u6298\u53E0\u4FDD\u5E8F",
      desc: "\u5728\u6298\u53E0\u7684\u540C\u7EA7\u6A19\u984C\u884C\u6309\u56DE\u8ECA\u4E0D\u6703\u5C55\u958B\uFF0C\u76F4\u63A5\u6DFB\u52A0\u540C\u7D1A\u6A19\u984C\u884C"
    },
    puncRectify: {
      name: "\u6A19\u9EDE\u77EB\u6B63",
      desc: "\u50C5\u5728\u8F38\u5165\u904E\u7A0B\u4E2D\uFF0C\u4E2D\u6587\u9593\u7684\u82F1\u6587\u6A19\u9EDE\uFF08,.?!\uFF09\u81EA\u52D5\u8F49\u63DB\u70BA\u5168\u89D2\uFF08\u53EF\u53D6\u6D88\uFF09"
    },
    printDebugInfo: {
      name: "\u5728\u63A7\u5236\u53F0\u8F38\u51FA\u8ABF\u8A66\u8CC7\u8A0A",
      desc: "\u5728\u63A7\u5236\u53F0\u8F38\u51FA\u8ABF\u8A66\u8CC7\u8A0A"
    },
    selectionReplaceRule: {
      name: "\u9078\u4E2D\u66FF\u63DB\u898F\u5247",
      desc: "\u7528\u6236\u5B9A\u7FA9\u7684\u9078\u4E2D\u66FF\u63DB\u898F\u5247"
    },
    deleteRule: {
      name: "\u522A\u9664\u898F\u5247",
      desc: "\u898F\u5247\uFF1A\u7528 | \u4EE3\u8868\u5149\u6A19\u4F4D\u7F6E\uFF0C\u5FC5\u9808\u5305\u542B\u5149\u6A19\u3002\u63D0\u793A\uFF1A\u4F7F\u7528 | \u8868\u793A\u5149\u6A19\u4F4D\u7F6E\u3002"
    },
    convertRule: {
      name: "\u8F49\u63DB\u898F\u5247",
      desc: "\u898F\u5247\uFF1A\u7528 | \u4EE3\u8868\u5149\u6A19\u4F4D\u7F6E\uFF0C\u5FC5\u9808\u5305\u542B\u5149\u6A19\u3002\u63D0\u793A\uFF1A\u4F7F\u7528 | \u8868\u793A\u5149\u6A19\u4F4D\u7F6E\u3002"
    },
    trigger: {
      name: "\u89F8\u767C\u5668"
    },
    left: {
      name: "\u5DE6"
    },
    right: {
      name: "\u53F3"
    },
    oldPattern: {
      name: "\u820A\u6A21\u5F0F"
    },
    newPattern: {
      name: "\u65B0\u6A21\u5F0F"
    }
  },
  headers: {
    main: "Obsidian EasyTyping \u63D2\u4EF6",
    githubDetail: "\u8A73\u60C5\u898B Github\uFF1A",
    enhancedEditing: "\u589E\u5F37\u7DE8\u8F2F\u8A2D\u7F6E",
    customizeEditRule: "\u81EA\u5B9A\u7FA9\u7DE8\u8F2F\u8F49\u63DB\u898F\u5247",
    autoformatSetting: "\u81EA\u52D5\u683C\u5F0F\u5316\u8A2D\u7F6E",
    detailedSetting: "\u8A73\u7D30\u8A2D\u7F6E\u5982\u4E0B",
    customRegexpBlock: "\u81EA\u5B9A\u7FA9\u6B63\u5247\u5340\u584A",
    excludeFoldersFiles: "\u6307\u5B9A\u6587\u4EF6\u4E0D\u81EA\u52D5\u683C\u5F0F\u5316",
    experimentalFeatures: "\u5BE6\u9A57\u529F\u80FD",
    aboutRegexp: {
      header: "\u6B63\u5247\u8868\u9054\u5F0F\u76F8\u95DC\u77E5\u8B58\uFF0C\u898B ",
      text: "\u300A\u962E\u4E00\u5CF0\uFF1A\u6B63\u5247\u8868\u9054\u5F0F\u7C21\u660E\u6559\u7A0B\u300B"
    },
    instructionsRegexp: {
      header: "\u6B63\u5247\u8868\u9054\u5F0F\u898F\u5247\u4F7F\u7528\u8AAA\u660E\u8207\u793A\u4F8B\uFF1A ",
      text: "\u81EA\u5B9A\u7FA9\u6B63\u5247\u8868\u9054\u5F0F\u898F\u5247"
    },
    customizeSelectionRule: "\u81EA\u5B9A\u7FA9\u9078\u4E2D\u6587\u672C\u7DE8\u8F2F\u589E\u5F3A\u898F\u5247",
    customizeDeleteRule: "\u81EA\u5B9A\u7FA9\u522A\u9664\u7DE8\u8F2F\u589E\u5F3A\u898F\u5247",
    customizeConvertRule: "\u81EA\u5B9A\u7FA9\u7DE8\u8F2F\u8F49\u63DB\u898F\u5247",
    editSelectionReplaceRule: "\u7DE8\u8F2F\u9078\u4E2D\u66FF\u63DB\u898F\u5247"
  },
  dropdownOptions: {
    enterTwice: "\u5169\u6B21\u56DE\u8ECA",
    twoSpace: "\u52A0\u5169\u500B\u7A7A\u683C",
    mixMode: "\u6DF7\u5408\u6A21\u5F0F",
    onlyWhenTyping: "\u8F38\u5165\u6642\u751F\u6548",
    globally: "\u5168\u5C40\u751F\u6548",
    noRequire: "\u7121\u8981\u6C42",
    softSpace: "\u8EDF\u7A7A\u683C",
    strictSpace: "\u56B4\u683C\u7A7A\u683C",
    dummy: "\u5446\u7A7A\u683C",
    smart: "\u667A\u80FD\u7A7A\u683C"
  },
  toolTip: {
    switch: "\u529F\u80FD\u958B\u95DC",
    editRule: "\u7DE8\u8F2F\u898F\u5247",
    removeRule: "\u522A\u9664\u898F\u5247",
    addRule: "\u6DFB\u52A0\u898F\u5247"
  },
  placeHolder: {
    triggerSymbol: "\u89F8\u767C\u7B26",
    newLeftSideString: "\u5DE6\u908A\u7B26\u865F",
    newRightSideString: "\u53F3\u908A\u7B26\u865F",
    addRule: "\u6DFB\u52A0\u898F\u5247",
    noticeInvaidTrigger: "\u7121\u6548\u7684\u89F8\u767C\u7B26, \u89F8\u767C\u7B26\u5FC5\u9808\u662F\u55AE\u5B57\u7B26\u6216\u8005\u662F \u2014\u2014\u3001\u2026\u2026",
    noticeWarnTriggerExists: "\u7121\u6548\u898F\u5247! \u89F8\u767C\u7B26 %s \u5DF2\u5B58\u5728",
    noticeMissingInput: "missing input",
    beforeDelete: "\u522A\u9664\u524D|",
    newPattern: "\u89F8\u767C\u898F\u5247\u5F8C\u5B57\u4E32\u6A21\u5F0F",
    noticeInvaidTriggerPatternContainSymbol: "\u7121\u6548\u898F\u5247, \u8F49\u63DB\u524D\u6A21\u5F0F\u5FC5\u9808\u5305\u542B\u4EE3\u8868\u5149\u6A19\u4F4D\u7F6E\u7684\u7B26\u865F |",
    beforeConvert: "\u8F49\u63DB\u524D|",
    noticeInvalidPatternString: "Invalid pattern string!"
  },
  button: {
    update: "\u66F4\u65B0"
  }
};
var zh_TW_default = locale4;

// src/settings.ts
var import_sprintf_js = __toESM(require_sprintf());
var DEFAULT_SETTINGS = {
  Tabout: true,
  SelectionEnhance: true,
  IntrinsicSymbolPairs: true,
  BaseObEditEnhance: true,
  FW2HWEnhance: true,
  BetterCodeEdit: true,
  BetterBackspace: true,
  AutoFormat: true,
  ExcludeFiles: "",
  ChineseEnglishSpace: true,
  ChineseNumberSpace: true,
  EnglishNumberSpace: true,
  ChineseNoSpace: true,
  QuoteSpace: true,
  PunctuationSpace: true,
  AutoCapital: true,
  AutoCapitalMode: "typing" /* OnlyWhenTyping */,
  PunctuationSpaceMode: "typing" /* OnlyWhenTyping */,
  InlineCodeSpaceMode: 1 /* soft */,
  InlineFormulaSpaceMode: 1 /* soft */,
  InlineLinkSpaceMode: 1 /* soft */,
  InlineLinkSmartSpace: true,
  UserDefinedRegSwitch: true,
  UserDefinedRegExp: "{{.*?}}|++\n<.*?>|--\n\\[\\!.*?\\][-+]{0,1}|-+\n(file:///|https?://|ftp://|obsidian://|zotero://|www.)[^\\s\uFF08\uFF09\u300A\u300B\u3002,\uFF0C\uFF01\uFF1F;\uFF1B\uFF1A\u201C\u201D\u2018\u2019\\)\\(\\[\\]\\{\\}']+|--\n\n[a-zA-Z0-9_\\-.]+@[a-zA-Z0-9_\\-.]+|++\n(?<!#)#[\\u4e00-\\u9fa5\\w-\\/]+|++",
  debug: false,
  userSelRepRuleTrigger: ["-", "#"],
  userSelRepRuleValue: [{ left: "~~", right: "~~" }, { left: "#", right: " " }],
  userDeleteRulesStrList: [["demo|", "|"]],
  userConvertRulesStrList: [[":)|", "\u{1F600}|"]],
  userSelRuleSettingsOpen: true,
  userDelRuleSettingsOpen: true,
  userCvtRuleSettingsOpen: true,
  StrictModeEnter: false,
  StrictLineMode: "enter_twice" /* EnterTwice */,
  EnhanceModA: false,
  TryFixChineseIM: true,
  PuncRectify: false,
  FixMacOSContextMenu: false,
  TryFixMSIME: false,
  CollapsePersistentEnter: false
};
var locale5 = en_US_default;
var EasyTypingSettingTab = class extends import_obsidian2.PluginSettingTab {
  constructor(app, plugin) {
    super(app, plugin);
    this.plugin = plugin;
  }
  display() {
    const { containerEl } = this;
    if (import_obsidian2.moment.locale() == "zh" || import_obsidian2.moment.locale() == "zh-cn") {
      locale5 = zh_CN_default;
    } else if (import_obsidian2.moment.locale().toLowerCase() == "zh-tw") {
      locale5 = zh_TW_default;
    } else if (import_obsidian2.moment.locale() == "ru") {
      locale5 = ru_RU_default;
    }
    containerEl.empty();
    containerEl.createEl("h1", { text: locale5.headers.main });
    containerEl.createEl("p", { text: locale5.headers.githubDetail }).createEl("a", {
      text: "easy-typing-obsidian",
      href: "https://github.com/Yaozhuwa/easy-typing-obsidian"
    });
    containerEl.createEl("h2", { text: locale5.headers.enhancedEditing });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.symbolAutoPair.name).setDesc(locale5.settings.symbolAutoPair.desc).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.IntrinsicSymbolPairs).onChange(async (value) => {
        this.plugin.settings.IntrinsicSymbolPairs = value;
        await this.plugin.saveSettings();
      });
    });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.selectionReplace.name).setDesc(locale5.settings.selectionReplace.desc).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.SelectionEnhance).onChange(async (value) => {
        this.plugin.settings.SelectionEnhance = value;
        await this.plugin.saveSettings();
      });
    });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.fullWidthToHalfWidth.name).setDesc(locale5.settings.fullWidthToHalfWidth.desc).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.FW2HWEnhance).onChange(async (value) => {
        this.plugin.settings.FW2HWEnhance = value;
        await this.plugin.saveSettings();
      });
    });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.basicInputEnhance.name).setDesc(locale5.settings.basicInputEnhance.desc).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.BaseObEditEnhance).onChange(async (value) => {
        this.plugin.settings.BaseObEditEnhance = value;
        await this.plugin.saveSettings();
      });
    });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.codeblockEdit.name).setDesc(locale5.settings.codeblockEdit.desc).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.BetterCodeEdit).onChange(async (value) => {
        this.plugin.settings.BetterCodeEdit = value;
        await this.plugin.saveSettings();
      });
    });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.backspaceEdit.name).setDesc(locale5.settings.backspaceEdit.desc).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.BetterBackspace).onChange(async (value) => {
        this.plugin.settings.BetterBackspace = value;
        await this.plugin.saveSettings();
      });
    });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.tabOut.name).setDesc(locale5.settings.tabOut.desc).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.Tabout).onChange(async (value) => {
        this.plugin.settings.Tabout = value;
        await this.plugin.saveSettings();
      });
    });
    containerEl.createEl("h2", { text: locale5.headers.customizeEditRule });
    this.buildUserSelRepRuleSetting(this.containerEl.createEl("details", {
      cls: "easytyping-nested-settings",
      attr: {
        ...this.plugin.settings.userSelRuleSettingsOpen ? { open: true } : {}
      }
    }));
    this.buildUserDeleteRuleSetting(this.containerEl.createEl("details", {
      cls: "easytyping-nested-settings",
      attr: {
        ...this.plugin.settings.userDelRuleSettingsOpen ? { open: true } : {}
      }
    }));
    this.buildUserConvertRuleSetting(this.containerEl.createEl("details", {
      cls: "easytyping-nested-settings",
      attr: {
        ...this.plugin.settings.userCvtRuleSettingsOpen ? { open: true } : {}
      }
    }));
    containerEl.createEl("h2", { text: locale5.headers.autoformatSetting });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.autoFormatting.name).setDesc(locale5.settings.autoFormatting.desc).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.AutoFormat).onChange(async (value) => {
        this.plugin.settings.AutoFormat = value;
        await this.plugin.saveSettings();
      });
    });
    containerEl.createEl("p", { text: locale5.headers.detailedSetting });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.spaceBetweenChineseEnglish.name).setDesc(locale5.settings.spaceBetweenChineseEnglish.desc).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.ChineseEnglishSpace).onChange(async (value) => {
        this.plugin.settings.ChineseEnglishSpace = value;
        await this.plugin.saveSettings();
      });
    });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.spaceBetweenChineseNumber.name).setDesc(locale5.settings.spaceBetweenChineseNumber.desc).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.ChineseNumberSpace).onChange(async (value) => {
        this.plugin.settings.ChineseNumberSpace = value;
        await this.plugin.saveSettings();
      });
    });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.spaceBetweenEnglishNumber.name).setDesc(locale5.settings.spaceBetweenEnglishNumber.desc).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.EnglishNumberSpace).onChange(async (value) => {
        this.plugin.settings.EnglishNumberSpace = value;
        await this.plugin.saveSettings();
      });
    });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.deleteSpaceBetweenChinese.name).setDesc(locale5.settings.deleteSpaceBetweenChinese.desc).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.ChineseNoSpace).onChange(async (value) => {
        this.plugin.settings.ChineseNoSpace = value;
        await this.plugin.saveSettings();
      });
    });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.quoteSpace.name).setDesc(locale5.settings.quoteSpace.desc).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.QuoteSpace).onChange(async (value) => {
        this.plugin.settings.QuoteSpace = value;
        await this.plugin.saveSettings();
      });
    });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.capitalizeFirstLetter.name).setDesc(locale5.settings.capitalizeFirstLetter.desc).addDropdown((dropdown) => {
      dropdown.addOption("typing" /* OnlyWhenTyping */, locale5.dropdownOptions.onlyWhenTyping);
      dropdown.addOption("global" /* Globally */, locale5.dropdownOptions.globally);
      dropdown.setValue(this.plugin.settings.AutoCapitalMode);
      dropdown.onChange(async (v) => {
        this.plugin.settings.AutoCapitalMode = v;
        await this.plugin.saveSettings();
      });
    }).addToggle((toggle) => {
      toggle.setTooltip(locale5.toolTip.switch);
      toggle.setValue(this.plugin.settings.AutoCapital).onChange(async (value) => {
        this.plugin.settings.AutoCapital = value;
        await this.plugin.saveSettings();
      });
    });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.textPunctuationSpace.name).setDesc(locale5.settings.textPunctuationSpace.desc).addDropdown((dropdown) => {
      dropdown.addOption("typing" /* OnlyWhenTyping */, locale5.dropdownOptions.onlyWhenTyping);
      dropdown.addOption("global" /* Globally */, locale5.dropdownOptions.globally);
      dropdown.setValue(this.plugin.settings.PunctuationSpaceMode);
      dropdown.onChange(async (v) => {
        this.plugin.settings.PunctuationSpaceMode = v;
        await this.plugin.saveSettings();
      });
    }).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.PunctuationSpace).onChange(async (value) => {
        this.plugin.settings.PunctuationSpace = value;
        await this.plugin.saveSettings();
      });
    });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.spaceStrategyInlineCode.name).setDesc(locale5.settings.spaceStrategyInlineCode.desc).addDropdown((dropdown) => {
      dropdown.addOption(String(0 /* none */), locale5.dropdownOptions.noRequire);
      dropdown.addOption(String(1 /* soft */), locale5.dropdownOptions.softSpace);
      dropdown.addOption(String(2 /* strict */), locale5.dropdownOptions.strictSpace);
      dropdown.setValue(String(this.plugin.settings.InlineCodeSpaceMode));
      dropdown.onChange(async (v) => {
        this.plugin.settings.InlineCodeSpaceMode = string2SpaceState(v);
        await this.plugin.saveSettings();
      });
    });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.spaceStrategyInlineFormula.name).setDesc(locale5.settings.spaceStrategyInlineFormula.desc).addDropdown((dropdown) => {
      dropdown.addOption(String(0 /* none */), locale5.dropdownOptions.noRequire);
      dropdown.addOption(String(1 /* soft */), locale5.dropdownOptions.softSpace);
      dropdown.addOption(String(2 /* strict */), locale5.dropdownOptions.strictSpace);
      dropdown.setValue(String(this.plugin.settings.InlineFormulaSpaceMode));
      dropdown.onChange(async (v) => {
        this.plugin.settings.InlineFormulaSpaceMode = string2SpaceState(v);
        await this.plugin.saveSettings();
      });
    });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.spaceStrategyLinkText.name).setDesc(locale5.settings.spaceStrategyLinkText.desc).addDropdown((dropdown) => {
      dropdown.addOption("dummy", locale5.dropdownOptions.dummy);
      dropdown.addOption("smart", locale5.dropdownOptions.smart);
      dropdown.setValue(this.plugin.settings.InlineLinkSmartSpace ? "smart" : "dummy");
      dropdown.onChange(async (v) => {
        this.plugin.settings.InlineLinkSmartSpace = v == "smart" ? true : false;
        await this.plugin.saveSettings();
      });
    }).addDropdown((dropdown) => {
      dropdown.addOption(String(0 /* none */), locale5.dropdownOptions.noRequire);
      dropdown.addOption(String(1 /* soft */), locale5.dropdownOptions.softSpace);
      dropdown.addOption(String(2 /* strict */), locale5.dropdownOptions.strictSpace);
      dropdown.setValue(String(this.plugin.settings.InlineLinkSpaceMode));
      dropdown.onChange(async (v) => {
        this.plugin.settings.InlineLinkSpaceMode = string2SpaceState(v);
        await this.plugin.saveSettings();
      });
    });
    containerEl.createEl("h2", { text: locale5.headers.customRegexpBlock });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.userDefinedRegexpSwitch.name).setDesc(locale5.settings.userDefinedRegexpSwitch.desc).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.UserDefinedRegSwitch).onChange(async (value) => {
        this.plugin.settings.UserDefinedRegSwitch = value;
        await this.plugin.saveSettings();
      });
    });
    containerEl.createEl("p", { text: locale5.headers.aboutRegexp.header }).createEl("a", {
      text: locale5.headers.aboutRegexp.text,
      href: "https://javascript.ruanyifeng.com/stdlib/regexp.html#"
    });
    containerEl.createEl("p", { text: locale5.headers.instructionsRegexp.header }).createEl("a", {
      text: locale5.headers.instructionsRegexp.text,
      href: "https://github.com/Yaozhuwa/easy-typing-obsidian/blob/master/UserDefinedRegExp.md"
    });
    const regContentAreaSetting = new import_obsidian2.Setting(containerEl);
    regContentAreaSetting.settingEl.setAttribute("style", "display: grid; grid-template-columns: 1fr;");
    regContentAreaSetting.setName(locale5.settings.userDefinedRegexp.name).setDesc(locale5.settings.userDefinedRegexp.desc);
    const regContentArea = new import_obsidian2.TextAreaComponent(regContentAreaSetting.controlEl);
    setAttributes(regContentArea.inputEl, {
      style: "margin-top: 12px; width: 100%;  height: 30vh;"
    });
    regContentArea.setValue(this.plugin.settings.UserDefinedRegExp).onChange(async (value) => {
      this.plugin.settings.UserDefinedRegExp = value;
      this.plugin.saveSettings();
    });
    containerEl.createEl("h2", { text: locale5.headers.excludeFoldersFiles });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.excludeFoldersFiles.name).setDesc(locale5.settings.excludeFoldersFiles.desc).addTextArea((text) => text.setValue(this.plugin.settings.ExcludeFiles).onChange(async (value) => {
      this.plugin.settings.ExcludeFiles = value;
      this.plugin.saveSettings();
    }));
    containerEl.createEl("h2", { text: locale5.headers.experimentalFeatures });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.strictLineBreaks.name).setDesc(locale5.settings.strictLineBreaks.desc).addDropdown((dropdown) => {
      dropdown.addOption("enter_twice" /* EnterTwice */, locale5.dropdownOptions.enterTwice);
      dropdown.addOption("two_space" /* TwoSpace */, locale5.dropdownOptions.twoSpace);
      dropdown.addOption("mix_mode" /* Mix */, locale5.dropdownOptions.mixMode);
      dropdown.setValue(this.plugin.settings.StrictLineMode);
      dropdown.onChange(async (v) => {
        this.plugin.settings.StrictLineMode = v;
        await this.plugin.saveSettings();
      });
    }).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.StrictModeEnter).onChange(async (value) => {
        this.plugin.settings.StrictModeEnter = value;
        await this.plugin.saveSettings();
      });
    });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.enhanceModA.name).setDesc(locale5.settings.enhanceModA.desc).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.EnhanceModA).onChange(async (value) => {
        this.plugin.settings.EnhanceModA = value;
        await this.plugin.saveSettings();
      });
    });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.collapsePersistentEnter.name).setDesc(locale5.settings.collapsePersistentEnter.desc).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.CollapsePersistentEnter).onChange(async (value) => {
        this.plugin.settings.CollapsePersistentEnter = value;
        await this.plugin.saveSettings();
      });
    });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.fixMicrosoftIME.name).setDesc(locale5.settings.fixMicrosoftIME.desc).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.TryFixMSIME).onChange(async (value) => {
        this.plugin.settings.TryFixMSIME = value;
        await this.plugin.saveSettings();
      });
    });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.fixMacOSContextMenu.name).setDesc(locale5.settings.fixMacOSContextMenu.desc).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.FixMacOSContextMenu).onChange(async (value) => {
        this.plugin.settings.FixMacOSContextMenu = value;
        await this.plugin.saveSettings();
      });
    });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.puncRectify.name).setDesc(locale5.settings.puncRectify.desc).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.PuncRectify).onChange(async (value) => {
        this.plugin.settings.PuncRectify = value;
        await this.plugin.saveSettings();
      });
    });
    new import_obsidian2.Setting(containerEl).setName(locale5.settings.printDebugInfo.name).setDesc(locale5.settings.printDebugInfo.desc).addToggle((toggle) => {
      toggle.setValue(this.plugin.settings.debug).onChange(async (value) => {
        this.plugin.settings.debug = value;
        setDebug(value);
        await this.plugin.saveSettings();
      });
    });
  }
  buildUserSelRepRuleSetting(containerEl) {
    containerEl.empty();
    containerEl.ontoggle = async () => {
      this.plugin.settings.userSelRuleSettingsOpen = containerEl.open;
      await this.plugin.saveSettings();
    };
    const summary = containerEl.createEl("summary", { cls: "easytyping-nested-settings" });
    summary.setText(locale5.headers.customizeSelectionRule);
    const selectionRuleSetting = new import_obsidian2.Setting(containerEl);
    selectionRuleSetting.setName(locale5.settings.selectionReplaceRule.name);
    const replaceRuleTrigger = new import_obsidian2.TextComponent(selectionRuleSetting.controlEl);
    replaceRuleTrigger.setPlaceholder(locale5.placeHolder.triggerSymbol);
    const replaceLeftString = new import_obsidian2.TextComponent(selectionRuleSetting.controlEl);
    replaceLeftString.setPlaceholder(locale5.placeHolder.newLeftSideString);
    const replaceRightString = new import_obsidian2.TextComponent(selectionRuleSetting.controlEl);
    replaceRightString.setPlaceholder(locale5.placeHolder.newRightSideString);
    selectionRuleSetting.addButton((button) => {
      button.setButtonText("+").setTooltip(locale5.placeHolder.addRule).onClick(async (buttonEl) => {
        let trigger = replaceRuleTrigger.inputEl.value;
        let left = replaceLeftString.inputEl.value;
        let right = replaceRightString.inputEl.value;
        if (trigger && (left || right)) {
          if (trigger.length != 1 && trigger != "\u2014\u2014" && trigger != "\u2026\u2026") {
            new import_obsidian2.Notice(locale5.placeHolder.noticeInvaidTrigger);
            return;
          }
          if (this.plugin.addUserSelectionRepRule(trigger, left, right)) {
            await this.plugin.saveSettings();
            this.display();
          } else {
            new import_obsidian2.Notice((0, import_sprintf_js.sprintf)(locale5.placeHolder.noticeWarnTriggerExists, trigger));
          }
        } else {
          new import_obsidian2.Notice(locale5.placeHolder.noticeMissingInput);
        }
      });
    });
    for (let i = 0; i < this.plugin.settings.userSelRepRuleTrigger.length; i++) {
      let trigger = this.plugin.settings.userSelRepRuleTrigger[i];
      let left_s = this.plugin.settings.userSelRepRuleValue[i].left;
      let right_s = this.plugin.settings.userSelRepRuleValue[i].right;
      let showStr = "Trigger: " + trigger + " \u2192 " + showString(left_s) + "selected" + showString(right_s);
      new import_obsidian2.Setting(containerEl).setName(showStr).addExtraButton((button) => {
        button.setIcon("gear").setTooltip(locale5.toolTip.editRule).onClick(() => {
          new SelectRuleEditModal(this.app, trigger, left_s, right_s, async (new_left, new_right) => {
            this.plugin.updateUserSelectionRepRule(i, new_left, new_right);
            await this.plugin.saveSettings();
            this.display();
          }).open();
        });
      }).addExtraButton((button) => {
        button.setIcon("trash").setTooltip(locale5.toolTip.removeRule).onClick(async () => {
          this.plugin.deleteUserSelectionRepRule(i);
          await this.plugin.saveSettings();
          this.display();
        });
      });
    }
  }
  buildUserDeleteRuleSetting(containerEl) {
    containerEl.empty();
    containerEl.ontoggle = async () => {
      this.plugin.settings.userDelRuleSettingsOpen = containerEl.open;
      await this.plugin.saveSettings();
    };
    const summary = containerEl.createEl("summary", { cls: "easytyping-nested-settings" });
    summary.setText(locale5.headers.customizeDeleteRule);
    const deleteRuleSetting = new import_obsidian2.Setting(containerEl);
    deleteRuleSetting.setName(locale5.settings.deleteRule.name).setDesc(locale5.settings.deleteRule.desc);
    const patternBefore = new import_obsidian2.TextAreaComponent(deleteRuleSetting.controlEl);
    patternBefore.setPlaceholder(locale5.placeHolder.beforeDelete);
    const patternAfter = new import_obsidian2.TextAreaComponent(deleteRuleSetting.controlEl);
    patternAfter.setPlaceholder(locale5.placeHolder.newPattern);
    deleteRuleSetting.addButton((button) => {
      button.setButtonText("+").setTooltip(locale5.toolTip.addRule).onClick(async (buttonEl) => {
        let before = patternBefore.inputEl.value;
        let after = patternAfter.inputEl.value;
        if (before && after) {
          if (findFirstPipeNotPrecededByBackslash(before) == -1) {
            new import_obsidian2.Notice(locale5.placeHolder.noticeInvaidTriggerPatternContainSymbol);
            return;
          } else {
            this.plugin.addUserDeleteRule(before, after);
            await this.plugin.saveSettings();
            this.display();
          }
        } else {
          new import_obsidian2.Notice(locale5.placeHolder.noticeMissingInput);
        }
      });
    });
    for (let i = 0; i < this.plugin.settings.userDeleteRulesStrList.length; i++) {
      let before = this.plugin.settings.userDeleteRulesStrList[i][0];
      let after = this.plugin.settings.userDeleteRulesStrList[i][1];
      let showStr = '"' + showString(before) + '"  delete.backwards  \u2192 "' + showString(after) + '"';
      new import_obsidian2.Setting(containerEl).setName(showStr).addExtraButton((button) => {
        button.setIcon("gear").setTooltip(locale5.toolTip.editRule).onClick(() => {
          new EditConvertRuleModal(this.app, "Delete Rule" /* delete */, before, after, async (new_before, new_after) => {
            this.plugin.updateUserDeleteRule(i, new_before, new_after);
            await this.plugin.saveSettings();
            this.display();
          }).open();
        });
      }).addExtraButton((button) => {
        button.setIcon("trash").setTooltip(locale5.toolTip.removeRule).onClick(async () => {
          this.plugin.deleteUserDeleteRule(i);
          await this.plugin.saveSettings();
          this.display();
        });
      });
    }
  }
  buildUserConvertRuleSetting(containerEl) {
    containerEl.empty();
    containerEl.ontoggle = async () => {
      this.plugin.settings.userCvtRuleSettingsOpen = containerEl.open;
      await this.plugin.saveSettings();
    };
    const summary = containerEl.createEl("summary", { cls: "easytyping-nested-settings" });
    summary.setText(locale5.headers.customizeConvertRule);
    const convertRuleSetting = new import_obsidian2.Setting(containerEl);
    convertRuleSetting.setName(locale5.settings.convertRule.name).setDesc(locale5.settings.convertRule.desc);
    const patternBefore = new import_obsidian2.TextAreaComponent(convertRuleSetting.controlEl);
    patternBefore.setPlaceholder(locale5.placeHolder.beforeConvert);
    const patternAfter = new import_obsidian2.TextAreaComponent(convertRuleSetting.controlEl);
    patternAfter.setPlaceholder(locale5.placeHolder.newPattern);
    convertRuleSetting.addButton((button) => {
      button.setButtonText("+").setTooltip(locale5.toolTip.addRule).onClick(async (buttonEl) => {
        let before = patternBefore.inputEl.value;
        let after = patternAfter.inputEl.value;
        if (before && after) {
          if (findFirstPipeNotPrecededByBackslash(before) == -1) {
            new import_obsidian2.Notice(locale5.placeHolder.noticeInvaidTriggerPatternContainSymbol);
            return;
          } else {
            this.plugin.addUserConvertRule(before, after);
            await this.plugin.saveSettings();
            this.display();
          }
        } else {
          new import_obsidian2.Notice(locale5.placeHolder.noticeMissingInput);
        }
      });
    });
    for (let i = 0; i < this.plugin.settings.userConvertRulesStrList.length; i++) {
      let before = this.plugin.settings.userConvertRulesStrList[i][0];
      let after = this.plugin.settings.userConvertRulesStrList[i][1];
      let showStr = '"' + showString(before) + '"  auto convert to "' + showString(after) + '"';
      new import_obsidian2.Setting(containerEl).setName(showStr).addExtraButton((button) => {
        button.setIcon("gear").setTooltip(locale5.toolTip.editRule).onClick(() => {
          new EditConvertRuleModal(this.app, "Convert Rule" /* convert */, before, after, async (new_before, new_after) => {
            this.plugin.updateUserConvertRule(i, new_before, new_after);
            await this.plugin.saveSettings();
            this.display();
          }).open();
        });
      }).addExtraButton((button) => {
        button.setIcon("trash").setTooltip(locale5.toolTip.removeRule).onClick(async () => {
          this.plugin.deleteUserConvertRule(i);
          await this.plugin.saveSettings();
          this.display();
        });
      });
    }
  }
};
function setAttributes(element, attributes) {
  for (let key in attributes) {
    element.setAttribute(key, attributes[key]);
  }
}
var SelectRuleEditModal = class extends import_obsidian2.Modal {
  constructor(app, trigger, left, right, onSubmit) {
    super(app);
    this.trigger = trigger;
    this.old_left = left;
    this.old_right = right;
    this.new_left = left;
    this.new_right = right;
    this.onSubmit = onSubmit;
  }
  onOpen() {
    const { contentEl } = this;
    contentEl.createEl("h1", { text: locale5.headers.editSelectionReplaceRule });
    new import_obsidian2.Setting(contentEl).setName(locale5.settings.trigger.name).addText((text) => {
      text.setValue(this.trigger);
      text.setDisabled(true);
    });
    new import_obsidian2.Setting(contentEl).setName(locale5.settings.left.name).addTextArea((text) => {
      text.setValue(this.old_left);
      text.onChange((value) => {
        this.new_left = value;
      });
    });
    new import_obsidian2.Setting(contentEl).setName(locale5.settings.right.name).addTextArea((text) => {
      text.setValue(this.old_right);
      text.onChange((value) => {
        this.new_right = value;
      });
    });
    new import_obsidian2.Setting(contentEl).addButton((btn) => btn.setButtonText(locale5.button.update).setCta().onClick(() => {
      this.close();
      this.onSubmit(this.new_left, this.new_right);
    }));
  }
  onClose() {
    let { contentEl } = this;
    contentEl.empty();
  }
};
var EditConvertRuleModal = class extends import_obsidian2.Modal {
  constructor(app, type, before, after, onSubmit) {
    super(app);
    this.type = type;
    this.old_before = before;
    this.old_after = after;
    this.new_before = before;
    this.new_after = after;
    this.onSubmit = onSubmit;
  }
  onOpen() {
    const { contentEl } = this;
    contentEl.createEl("h1", { text: "Edit " + this.type });
    new import_obsidian2.Setting(contentEl).setName(locale5.settings.oldPattern.name).addTextArea((text) => {
      text.setValue(this.old_before);
      text.onChange((value) => {
        this.new_before = value;
      });
    });
    new import_obsidian2.Setting(contentEl).setName(locale5.settings.newPattern.name).addTextArea((text) => {
      text.setValue(this.old_after);
      text.onChange((value) => {
        this.new_after = value;
      });
    });
    new import_obsidian2.Setting(contentEl).addButton((btn) => btn.setButtonText(locale5.button.update).setCta().onClick(() => {
      if (this.checkConvertPatternString(this.new_before, this.new_after)) {
        this.close();
        this.onSubmit(this.new_before, this.new_after);
      } else {
        new import_obsidian2.Notice(locale5.placeHolder.noticeInvalidPatternString);
      }
    }));
  }
  checkConvertPatternString(before, after) {
    if (findFirstPipeNotPrecededByBackslash(before) == -1)
      return false;
    return true;
  }
  onClose() {
    let { contentEl } = this;
    contentEl.empty();
  }
};

// src/main.ts
var import_view3 = require("@codemirror/view");
var import_language3 = require("@codemirror/language");

// src/syntax.ts
var import_language2 = require("@codemirror/language");
function isCodeBlockInPos(state, pos) {
  let codeBlockInfos = getCodeBlocksInfos(state);
  for (let i = 0; i < codeBlockInfos.length; i++) {
    if (pos >= codeBlockInfos[i].start_pos && pos <= codeBlockInfos[i].end_pos) {
      return true;
    }
  }
  return false;
}
function getCodeBlockInfoInPos(state, pos) {
  let codeBlockInfos = getCodeBlocksInfos(state);
  for (let i = 0; i < codeBlockInfos.length; i++) {
    if (pos >= codeBlockInfos[i].start_pos && pos <= codeBlockInfos[i].end_pos) {
      return codeBlockInfos[i];
    }
  }
  return null;
}
function selectCodeBlockInPos(view, selection) {
  let pos = selection.anchor;
  let codeBlockInfos = getCodeBlocksInfos(view.state);
  for (let i = 0; i < codeBlockInfos.length; i++) {
    if (pos >= codeBlockInfos[i].start_pos && pos <= codeBlockInfos[i].end_pos) {
      if (codeBlockInfos[i].code_start_pos == codeBlockInfos[i].code_end_pos) {
        view.dispatch({
          selection: {
            anchor: codeBlockInfos[i].start_pos,
            head: codeBlockInfos[i].end_pos
          }
        });
        return true;
      }
      let code_line_start = view.state.doc.lineAt(codeBlockInfos[i].code_start_pos);
      let isCodeSelected = selection.anchor == code_line_start.from && selection.head == codeBlockInfos[i].code_end_pos;
      let isCodeBlockSelected = selection.anchor == codeBlockInfos[i].start_pos && selection.head == codeBlockInfos[i].end_pos;
      if (isCodeSelected) {
        view.dispatch({
          selection: {
            anchor: codeBlockInfos[i].start_pos,
            head: codeBlockInfos[i].end_pos
          }
        });
        return true;
      }
      if (isCodeBlockSelected)
        return false;
      view.dispatch({
        selection: {
          anchor: code_line_start.from,
          head: codeBlockInfos[i].code_end_pos
        }
      });
      return true;
    }
  }
  return false;
}
function getCodeBlocksInfos(state) {
  let isCodeBlockBegin = false;
  let codeBlockInfos = [];
  let curCodeBlockInfo = null;
  const doc = state.doc;
  (0, import_language2.syntaxTree)(state).iterate({
    enter(node) {
      const nodeName = node.name;
      const nodeFrom = node.from;
      const nodeTo = node.to;
      const nodeText = state.sliceDoc(nodeFrom, nodeTo);
      if (nodeName.includes("codeblock-begin")) {
        isCodeBlockBegin = true;
        let start_pos = nodeFrom + nodeText.indexOf("`");
        let indent = start_pos - state.doc.lineAt(start_pos).from;
        let language = nodeText.trim().substring(3);
        curCodeBlockInfo = {
          start_pos,
          end_pos: -1,
          code_start_pos: -1,
          code_end_pos: -1,
          language: language.toLowerCase(),
          indent
        };
      } else if (nodeName.includes("codeblock-end")) {
        isCodeBlockBegin = false;
        if (curCodeBlockInfo != null) {
          curCodeBlockInfo.end_pos = nodeTo;
          if (doc.lineAt(curCodeBlockInfo.start_pos).number == doc.lineAt(curCodeBlockInfo.end_pos).number - 1) {
            curCodeBlockInfo.code_start_pos = doc.lineAt(curCodeBlockInfo.start_pos).to;
            curCodeBlockInfo.code_end_pos = doc.lineAt(curCodeBlockInfo.start_pos).to;
          } else {
            let code_start_line = doc.lineAt(curCodeBlockInfo.start_pos).number + 1;
            let code_end_line = doc.lineAt(curCodeBlockInfo.end_pos).number - 1;
            curCodeBlockInfo.code_start_pos = doc.line(code_start_line).from + curCodeBlockInfo.indent;
            curCodeBlockInfo.code_end_pos = doc.line(code_end_line).to;
          }
          codeBlockInfos.push(curCodeBlockInfo);
          curCodeBlockInfo = null;
        }
      }
    }
  });
  if (isCodeBlockBegin && curCodeBlockInfo) {
    curCodeBlockInfo.end_pos = doc.length;
    curCodeBlockInfo.code_end_pos = doc.length;
    if (doc.lines > doc.lineAt(curCodeBlockInfo.start_pos).number) {
      let start_line = doc.lineAt(curCodeBlockInfo.start_pos).number + 1;
      let code_start_pos = doc.line(start_line).from + curCodeBlockInfo.indent;
      curCodeBlockInfo.code_start_pos = code_start_pos < doc.length ? code_start_pos : doc.lineAt(curCodeBlockInfo.start_pos + 1).from;
    } else {
      curCodeBlockInfo.code_start_pos = doc.lineAt(curCodeBlockInfo.start_pos).to;
    }
    codeBlockInfos.push(curCodeBlockInfo);
    curCodeBlockInfo = null;
  }
  return codeBlockInfos;
}
function getQuoteInfoInPos(state, pos) {
  let quote_regex = /^(\s*)(>+) ?/;
  let callout_regex = /^(\s*)(>)+ \[![^\s]+\][+-]? ?/;
  let cur_line = state.doc.lineAt(pos);
  let match = cur_line.text.match(quote_regex);
  let is_callout = false;
  let cur_start_pos = -1;
  let cur_end_pos = -1;
  if (match) {
    let match_callout = cur_line.text.match(callout_regex);
    cur_start_pos = cur_line.from + (match_callout ? match_callout[0].length : match[0].length);
    cur_end_pos = cur_line.to;
    let quote_start_line = cur_line.number;
    let quote_end_line = quote_start_line;
    for (let i = quote_start_line + 1; i <= state.doc.lines; i += 1) {
      let line = state.doc.line(i);
      if (line.text.match(quote_regex)) {
        quote_end_line = i;
      } else
        break;
    }
    for (let i = quote_start_line; i >= 1; i -= 1) {
      let line = state.doc.line(i);
      let match_callout2 = line.text.match(callout_regex);
      let match_quote = line.text.match(quote_regex);
      if (match_callout2) {
        is_callout = true;
        quote_start_line = i;
      } else if (match_quote) {
        quote_start_line = i;
      } else
        break;
    }
    return {
      start_pos: state.doc.line(quote_start_line).from,
      end_pos: state.doc.line(quote_end_line).to,
      is_callout,
      cur_start_pos,
      cur_end_pos
    };
  } else {
    return null;
  }
}

// src/tabstops_state_field.ts
var import_view = require("@codemirror/view");
var import_state = require("@codemirror/state");
var addTabstopsEffect = import_state.StateEffect.define();
var removeTabstopEffect = import_state.StateEffect.define();
var removeAllTabstopsEffect = import_state.StateEffect.define();
var tabstopsStateField = import_state.StateField.define({
  create() {
    return [];
  },
  update(value, transaction) {
    let tabstopGroups = value;
    tabstopGroups.forEach((grp) => grp.map(transaction.changes));
    for (const effect of transaction.effects) {
      if (effect.is(addTabstopsEffect)) {
        tabstopGroups = [];
        tabstopGroups.unshift(...effect.value);
      } else if (effect.is(removeTabstopEffect)) {
        tabstopGroups.shift();
      } else if (effect.is(removeAllTabstopsEffect)) {
        tabstopGroups = [];
      }
    }
    return tabstopGroups;
  },
  provide: (field) => {
    return import_view.EditorView.decorations.of((view) => {
      const tabstopGroups = view.state.field(field);
      const decos = [];
      if (tabstopGroups.length >= 2) {
        decos.push(...tabstopGroups[1].getDecoRanges());
      }
      return import_view.Decoration.set(decos, true);
    });
  }
});
function getTabstopGroupsFromView(view) {
  const currentTabstopGroups = view.state.field(tabstopsStateField);
  return currentTabstopGroups;
}
function hasTabstops(view) {
  return getTabstopGroupsFromView(view).length > 0;
}
function addTabstops(view, tabstopGroups) {
  view.dispatch({
    effects: [addTabstopsEffect.of(tabstopGroups)]
  });
}
function removeTabstop(view) {
  view.dispatch({
    effects: [removeTabstopEffect.of(null)]
  });
}
function removeAllTabstops(view) {
  view.dispatch({
    effects: [removeAllTabstopsEffect.of(null)]
  });
}
function addTabstopsAndSelect(view, tabstopGroups) {
  addTabstops(view, tabstopGroups);
  tabstopGroups[0].select(view, false);
}
function tidyTabstops(view) {
  const currentTabstopGroups = getTabstopGroupsFromView(view);
  if (currentTabstopGroups.length === 1) {
    removeAllTabstops(view);
  }
}
function isInsideCurTabstop(view) {
  const currentTabstopGroups = getTabstopGroupsFromView(view);
  if (currentTabstopGroups.length > 1 && currentTabstopGroups[0].containsSelection(view.state.selection)) {
    return true;
  }
  return false;
}
function consumeAndGotoNextTabstop(view) {
  if (getTabstopGroupsFromView(view).length === 0)
    return false;
  removeTabstop(view);
  const oldSel = view.state.selection;
  const nextGrp = getTabstopGroupsFromView(view)[0];
  if (!nextGrp)
    return false;
  const shouldMoveToEndpoints = nextGrp.containsSelection(oldSel);
  nextGrp.select(view, shouldMoveToEndpoints);
  const newSel = view.state.selection;
  if (oldSel.eq(newSel))
    return consumeAndGotoNextTabstop(view);
  tidyTabstops(view);
  return true;
}

// src/tabstop.ts
var import_state2 = require("@codemirror/state");
var import_view2 = require("@codemirror/view");
var TABSTOP_DECO_CLASS = "easy-typing-tabstops";
var CURSOR_WIDGET_CLASS = "easy-typing-cursor-widget";
function getMarkerDecoration(from, to) {
  const className = `${TABSTOP_DECO_CLASS}`;
  if (from == to) {
    return import_view2.Decoration.widget({
      widget: new CursorWidget(),
      side: 0
    }).range(from);
  }
  return import_view2.Decoration.mark({
    inclusive: true,
    class: className
  }).range(from, to);
}
var TabstopGroup = class {
  constructor(tabstopSpecs) {
    const decos = tabstopSpecs.map((spec) => getMarkerDecoration(spec.from, spec.to));
    this.selections = tabstopSpecs.map((spec) => import_state2.EditorSelection.range(spec.from, spec.to));
    this.decos = import_view2.Decoration.set(decos, true);
  }
  select(view, selectEndpoints) {
    const sel = this.toEditorSelection();
    const toSelect = selectEndpoints ? getEditorSelectionEndpoints(sel) : sel;
    view.dispatch({
      selection: toSelect
    });
  }
  toSelectionRanges() {
    return this.selections;
  }
  toEditorSelection() {
    return import_state2.EditorSelection.create(this.toSelectionRanges());
  }
  containsSelection(selection) {
    function rangeLiesWithinSelection(range, sel) {
      for (const selRange of sel) {
        if (selRange.from <= range.from && selRange.to >= range.to) {
          return true;
        }
      }
      return false;
    }
    const tabstopRanges = this.toSelectionRanges();
    let result = true;
    for (const range of selection.ranges) {
      if (!rangeLiesWithinSelection(range, tabstopRanges)) {
        result = false;
        break;
      }
    }
    return result;
  }
  map(changes) {
    this.decos = this.decos.map(changes);
    this.selections = this.selections.map((range) => {
      let rangeFrom = changes.mapPos(range.from, -1);
      let rangeTo = changes.mapPos(range.to, 1);
      return import_state2.EditorSelection.range(rangeFrom, rangeTo);
    });
  }
  getDecoRanges() {
    const ranges = [];
    const cur = this.decos.iter();
    while (cur.value != null) {
      if (cur.from != cur.to) {
        ranges.push(cur.value.range(cur.from, cur.to));
      } else {
        ranges.push(cur.value.range(cur.from));
      }
      cur.next();
    }
    return ranges;
  }
};
function tabstopSpecsToTabstopGroups(tabstops) {
  const tabstopsByNumber = {};
  for (const tabstop of tabstops) {
    const n = String(tabstop.number);
    if (tabstopsByNumber[n]) {
      tabstopsByNumber[n].push(tabstop);
    } else {
      tabstopsByNumber[n] = [tabstop];
    }
  }
  const result = [];
  const numbers = Object.keys(tabstopsByNumber);
  numbers.sort((a, b) => parseInt(a) - parseInt(b));
  for (const number of numbers) {
    const grp = new TabstopGroup(tabstopsByNumber[number]);
    result.push(grp);
  }
  return result;
}
function getEditorSelectionEndpoints(sel) {
  const endpoints = sel.ranges.map((range) => import_state2.EditorSelection.range(range.to, range.to));
  return import_state2.EditorSelection.create(endpoints);
}
var CursorWidget = class extends import_view2.WidgetType {
  eq(widget) {
    return true;
  }
  toDOM(view) {
    const cursorEl = document.createElement("span");
    cursorEl.className = `${CURSOR_WIDGET_CLASS}`;
    cursorEl.textContent = "";
    return cursorEl;
  }
};

// src/main.ts
var EasyTypingPlugin = class extends import_obsidian3.Plugin {
  constructor() {
    super(...arguments);
    this.getDefaultIndentChar = () => {
      let useTab = this.app.vault.config.useTab === void 0 ? true : false;
      let tabSize = this.app.vault.config.tabSize == void 0 ? 4 : this.app.vault.config.tabSize;
      let default_indent = useTab ? "	" : " ".repeat(tabSize);
      return default_indent;
    };
    this.transactionFilterPlugin = (tr) => {
      const changes = [];
      if (!tr.docChanged)
        return tr;
      let selected = tr.startState.selection.asSingle().main.anchor != tr.startState.selection.asSingle().main.head;
      let changeTypeStr = getTypeStrOfTransac(tr);
      tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) => {
        var _a, _b, _c, _d;
        let changedStr = tr.startState.sliceDoc(fromA, toA);
        let changestr_ = changedStr.replace(/\s/g, "0");
        let insertedStr = inserted.sliceString(0);
        if ((_a = this.settings) == null ? void 0 : _a.debug) {
          console.log("[TransactionFilter] type, fromA, toA, changed, fromB, toB, inserted");
          console.log(changeTypeStr, fromA, toA, changedStr, fromB, toB, insertedStr);
        }
        if (getPosLineType(tr.startState, fromA) == "table" /* table */)
          return tr;
        if (this.settings.SelectionEnhance) {
          if ((changeTypeStr == "input.type" || changeTypeStr == "input.type.compose") && fromA != toA && (fromB + 1 === toB || insertedStr == "\u2014\u2014" || insertedStr == "\u2026\u2026")) {
            if (this.SelectionReplaceMap.has(insertedStr)) {
              changes.push({ changes: { from: fromA, insert: (_b = this.SelectionReplaceMap.get(insertedStr)) == null ? void 0 : _b.left }, userEvent: "EasyTyping.change" });
              changes.push({ changes: { from: toA, insert: (_c = this.SelectionReplaceMap.get(insertedStr)) == null ? void 0 : _c.right }, userEvent: "EasyTyping.change" });
              tr = tr.startState.update(...changes);
              return tr;
            }
          }
        }
        if (this.settings.BetterCodeEdit && changeTypeStr.contains("paste") && fromA == fromB && isCodeBlockInPos(tr.startState, fromA)) {
          print("\u68C0\u6D4B\u5230\u5728\u4EE3\u7801\u5757\u4E2D\u7C98\u8D34");
          let line = tr.startState.doc.lineAt(fromB).text;
          let base_indent_num = (_d = getCodeBlockInfoInPos(tr.startState, fromA)) == null ? void 0 : _d.indent;
          let base_indent = base_indent_num == 0 ? "" : " ".repeat(base_indent_num);
          let inserted_lines = insertedStr.split("\n");
          if (inserted_lines.length > 1) {
            let min_indent_space = Infinity;
            for (let line2 of inserted_lines) {
              if (!/^\s*$/.test(line2)) {
                let indent = line2.match(/^\s*/)[0].length;
                min_indent_space = Math.min(min_indent_space, indent);
              }
            }
            let adjusted_lines = inserted_lines.map((line2, index) => {
              let trimmed_line = line2.substring(min_indent_space);
              trimmed_line = trimmed_line.replace(/[\t]/g, this.getDefaultIndentChar());
              if (index === 0) {
                return trimmed_line;
              } else {
                return base_indent + trimmed_line;
              }
            });
            let new_insertedStr = adjusted_lines.join("\n");
            changes.push({
              changes: { from: fromA, to: toA, insert: new_insertedStr },
              selection: { anchor: fromA + new_insertedStr.length },
              userEvent: "EasyTyping.change"
            });
            tr = tr.startState.update(...changes);
            return tr;
          }
        }
        if (this.settings.BaseObEditEnhance && changeTypeStr.contains("paste") && fromA == fromB && fromA == tr.startState.doc.lineAt(toA).to) {
          const lineContent = tr.startState.doc.lineAt(toA).text;
          const listMatch = lineContent.match(/^(\s*)([-*+] \[.\]|[-*+]|\d+\.)\s/);
          const quoteMatch = lineContent.match(/^(\s*)(>+)(\s)?/);
          if (listMatch || quoteMatch) {
            let prefix = listMatch ? listMatch[1] + listMatch[2] + " " : quoteMatch[1] + quoteMatch[2] + " ";
            let indent_num = listMatch ? listMatch[1].length : quoteMatch[1].length;
            let indent_str = indent_num == 0 ? "" : " ".repeat(indent_num);
            let inserted_lines = insertedStr.split("\n");
            let min_indent_space = Infinity;
            for (let line of inserted_lines) {
              if (!/^\s*$/.test(line)) {
                let indent = line.match(/^\s*/)[0].length;
                min_indent_space = Math.min(min_indent_space, indent);
              }
            }
            let paste_list = true;
            for (let line of inserted_lines) {
              if (line.match(/^(\s*)([-*+] \[.\]|[-*+]|\d+\.)\s/) || /^\s*$/.test(line)) {
                continue;
              } else {
                let indent = line.match(/^\s*/)[0].length;
                if (indent < min_indent_space + 2) {
                  paste_list = false;
                  break;
                }
              }
            }
            let adjusted_lines = [];
            if (paste_list && listMatch) {
              adjusted_lines = inserted_lines.map((line, index) => {
                let trimmed_line = line.substring(min_indent_space);
                trimmed_line = trimmed_line.replace(/[\t]/g, this.getDefaultIndentChar());
                if (index === 0) {
                  trimmed_line = trimmed_line.replace(/^([-*+] \[.\]|[-*+]|\d+\.)\s/, "");
                  return trimmed_line;
                } else {
                  return indent_str + trimmed_line;
                }
              });
            } else {
              adjusted_lines = inserted_lines.map((line, index) => {
                let trimmed_line = line.substring(min_indent_space);
                trimmed_line = trimmed_line.replace(/[\t]/g, this.getDefaultIndentChar());
                if (index === 0) {
                  return trimmed_line;
                } else {
                  return prefix + trimmed_line;
                }
              });
            }
            let new_insertedStr = adjusted_lines.join("\n");
            changes.push({
              changes: { from: fromA, to: toA, insert: new_insertedStr },
              selection: { anchor: fromA + new_insertedStr.length },
              userEvent: "EasyTyping.change"
            });
            tr = tr.startState.update(...changes);
            return tr;
          }
        }
        if (selected)
          return tr;
        if (this.settings.TryFixMSIME && changeTypeStr == "input.type.compose" && changedStr == "" && /^[\u4e00-\u9fa5]+$/.test(insertedStr)) {
          print("MS-IME Compose detected:", insertedStr);
          tr = tr.startState.update(...changes);
          return tr;
        }
        let codeblockinfo = getCodeBlockInfoInPos(tr.startState, toA);
        if (this.settings.BetterCodeEdit && changeTypeStr == "delete.backward" && !selected && codeblockinfo && toA > tr.startState.doc.lineAt(codeblockinfo.start_pos).to) {
          let line_number = tr.startState.doc.lineAt(toA).number;
          let cur_line = tr.startState.doc.lineAt(toA);
          let list_code_indent = codeblockinfo.indent;
          if (list_code_indent !== 0) {
            print("list_code, indent: ", list_code_indent);
            if (toA == cur_line.from + list_code_indent) {
              changes.push({ changes: { from: tr.startState.doc.line(line_number - 1).to, to: toA, insert: "" }, userEvent: "EasyTyping.change" });
              tr = tr.startState.update(...changes);
              return tr;
            }
            if (fromA >= cur_line.from && fromA < cur_line.from + list_code_indent && toA > cur_line.from + list_code_indent) {
              changes.push({ changes: { from: cur_line.from + list_code_indent, to: toA, insert: "" }, userEvent: "EasyTyping.change" });
              tr = tr.startState.update(...changes);
              return tr;
            }
          }
        }
        if (changeTypeStr === "delete.backward" && this.settings.IntrinsicSymbolPairs) {
          if (this.SymbolPairsMap.has(changedStr) && this.SymbolPairsMap.get(changedStr) === tr.startState.sliceDoc(toA, toA + 1)) {
            changes.push({ changes: { from: fromA, to: toA + 1 }, userEvent: "EasyTyping.change" });
            tr = tr.startState.update(...changes);
            return tr;
          }
          let line_content = tr.startState.doc.lineAt(toA).text;
          let next_line_content = tr.startState.doc.sliceString(toA, toA + line_content.length + 1);
          if (/^\s*```$/.test(line_content) && "\n" + line_content == next_line_content) {
            changes.push({
              changes: {
                from: toA - 3,
                to: toA + line_content.length + 1,
                insert: ""
              },
              selection: { anchor: toA - 3 },
              userEvent: "EasyTyping.change"
            });
            tr = tr.startState.update(...changes);
            return tr;
          }
          for (let rule of this.IntrinsicDeleteRules) {
            let left = tr.startState.doc.sliceString(toA - rule.before.left.length, toA);
            let right = tr.startState.doc.sliceString(toA, toA + rule.before.right.length);
            if (left === rule.before.left && right === rule.before.right) {
              changes.push({
                changes: {
                  from: toA - rule.before.left.length,
                  to: toA + rule.before.right.length,
                  insert: rule.after.left + rule.after.right
                },
                selection: { anchor: toA - rule.before.left.length + rule.after.left.length },
                userEvent: "EasyTyping.change"
              });
              tr = tr.startState.update(...changes);
              return tr;
            }
          }
        }
        if (changeTypeStr == "delete.backward") {
          for (let rule of this.UserDeleteRules) {
            let leftDocStr = tr.startState.doc.sliceString(0, toA);
            let rightDocStr = tr.startState.doc.sliceString(toA);
            let leftRegexpStr = rule.before.left;
            if (isRegexp(rule.before.left)) {
              leftRegexpStr = leftRegexpStr.slice(2, -1);
            } else {
              leftRegexpStr = leftRegexpStr.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
            }
            let leftRegexp = new RegExp(leftRegexpStr + "$");
            let leftMatch = leftDocStr.match(leftRegexp);
            if (leftMatch) {
              let leftMatchStr = leftMatch[0];
              let matchList = leftMatch.slice(1);
              let matchPosBegin = toA - leftMatchStr.length;
              let rightRegexpStr = rule.before.right;
              if (isRegexp(rule.before.right)) {
                rightRegexpStr = rightRegexpStr.slice(2, -1);
              } else {
                rightRegexpStr = rightRegexpStr.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
              }
              let rightRegexp = new RegExp("^" + rightRegexpStr);
              let rightMatch = rightDocStr.match(rightRegexp);
              if (rightMatch) {
                let rightMatchStr = rightMatch[0];
                let matchPosEnd = toA + rightMatchStr.length;
                matchList.push(...rightMatch.slice(1));
                let [new_string, tabstops] = parseTheAfterPattern(rule.after_pattern, matchList);
                const updatedTabstops = tabstops.map((tabstop) => ({
                  ...tabstop,
                  from: tabstop.from + matchPosBegin,
                  to: tabstop.to + matchPosBegin
                }));
                let tabstopGroups = tabstopSpecsToTabstopGroups(updatedTabstops);
                changes.push({
                  changes: {
                    from: matchPosBegin,
                    to: matchPosEnd,
                    insert: new_string
                  },
                  selection: tabstopGroups[0].toEditorSelection(),
                  effects: [addTabstopsEffect.of(tabstopGroups)],
                  userEvent: "EasyTyping.change"
                });
                tr = tr.startState.update(...changes);
                return tr;
              }
            }
          }
        }
        if (changeTypeStr == "input.type" && insertedStr == "`\n```" && this.settings.BaseObEditEnhance) {
          const line_content = tr.startState.doc.lineAt(fromA).text;
          if (/^\s*``$/.test(line_content)) {
            changes.push({
              changes: { from: fromA, to: toA, insert: "`\n" + line_content + "`" },
              selection: { anchor: fromA + 1 },
              userEvent: "EasyTyping.change"
            });
            tr = tr.startState.update(...changes);
            return tr;
          }
        }
        if ((changeTypeStr == "input.type" || changeTypeStr == "input.type.compose") && fromA === toA && fromB + 1 === toB) {
          if (this.settings.BaseObEditEnhance) {
            if (insertedStr === "`" && toA - tr.startState.doc.lineAt(toA).from > 2 && tr.startState.sliceDoc(toA - 1, toA) === "`" && tr.startState.sliceDoc(toA - 2, toA - 1) != "`") {
              changes.push({
                changes: { from: toA, insert: "`" },
                selection: { anchor: toA },
                userEvent: "EasyTyping.change"
              });
              tr = tr.startState.update(...changes);
              return tr;
            }
            if (insertedStr == "\xB7") {
              let line_content = tr.startState.doc.lineAt(fromA).text;
              let ch_pos = fromA - tr.startState.doc.lineAt(fromA).from;
              if (/^\s*``$/.test(line_content) && ch_pos == line_content.length - 1) {
                changes.push({
                  changes: { from: fromA + 1, to: toA + 1, insert: "`\n" + line_content + "`" },
                  selection: { anchor: fromA + 2 },
                  userEvent: "EasyTyping.change"
                });
                tr = tr.startState.update(...changes);
                return tr;
              }
            }
            for (let rule of this.BasicConvRules) {
              if (insertedStr != rule.before.left.charAt(rule.before.left.length - 1))
                continue;
              if (rule.before.left.charAt(0) === "\n" && offsetToPos(tr.state.doc, fromA).line === 0 && toB - rule.before.left.length + 1 === 0) {
                let left = tr.state.doc.sliceString(toB - rule.before.left.length + 1, toB);
                let right = tr.state.doc.sliceString(toB, toB + rule.before.right.length);
                if (left === rule.before.left.substring(1) && right === rule.before.right) {
                  changes.push({
                    changes: {
                      from: toA - rule.before.left.length + 2,
                      to: toA + rule.before.right.length,
                      insert: rule.after.left.substring(1) + rule.after.right
                    },
                    selection: { anchor: toA - rule.before.left.length + rule.after.left.length + 1 },
                    userEvent: "EasyTyping.change"
                  });
                  tr = tr.startState.update(...changes);
                  return tr;
                }
              } else {
                let left = tr.state.doc.sliceString(toB - rule.before.left.length, toB);
                let right = tr.state.doc.sliceString(toB, toB + rule.before.right.length);
                if (left === rule.before.left && right === rule.before.right) {
                  changes.push({
                    changes: {
                      from: toA - rule.before.left.length + 1,
                      to: toA + rule.before.right.length,
                      insert: rule.after.left + rule.after.right
                    },
                    selection: { anchor: toA - rule.before.left.length + rule.after.left.length + 1 },
                    userEvent: "EasyTyping.change"
                  });
                  tr = tr.startState.update(...changes);
                  return tr;
                }
              }
            }
          }
          if (this.settings.FW2HWEnhance) {
            for (let rule of this.FW2HWSymbolRules) {
              if (insertedStr != rule.before.left.charAt(rule.before.left.length - 1))
                continue;
              let left = tr.state.doc.sliceString(toB - rule.before.left.length, toB);
              let right = tr.state.doc.sliceString(toB, toB + rule.before.right.length);
              if (left === rule.before.left && right === rule.before.right) {
                changes.push({
                  changes: {
                    from: toA - rule.before.left.length + 1,
                    to: toA + rule.before.right.length,
                    insert: rule.after.left + rule.after.right
                  },
                  selection: { anchor: toA - rule.before.left.length + rule.after.left.length + 1 },
                  userEvent: "EasyTyping.change"
                });
                tr = tr.startState.update(...changes);
                return tr;
              }
            }
          }
          if (this.settings.IntrinsicSymbolPairs) {
            for (let rule of this.IntrinsicAutoPairRulesPatch) {
              if (insertedStr != rule.before.left.charAt(rule.before.left.length - 1))
                continue;
              let left = tr.state.doc.sliceString(toB - rule.before.left.length, toB);
              let right = tr.state.doc.sliceString(toB, toB + rule.before.right.length);
              if (left === rule.before.left && right === rule.before.right) {
                changes.push({
                  changes: {
                    from: toA - rule.before.left.length + 1,
                    to: toA + rule.before.right.length,
                    insert: rule.after.left + rule.after.right
                  },
                  selection: { anchor: toA - rule.before.left.length + rule.after.left.length + 1 },
                  userEvent: "EasyTyping.change"
                });
                tr = tr.startState.update(...changes);
                return tr;
              }
            }
            if (this.SymbolPairsMap.has(insertedStr) && insertedStr != "'") {
              changes.push({
                changes: { from: fromA, to: toA, insert: insertedStr + this.SymbolPairsMap.get(insertedStr) },
                selection: { anchor: fromA + 1 },
                userEvent: "EasyTyping.change"
              });
              tr = tr.startState.update(...changes);
              return tr;
            } else if (insertedStr === "'") {
              let charBeforeCursor = tr.startState.sliceDoc(fromA - 1, fromA);
              if (["", " ", "\n"].includes(charBeforeCursor)) {
                changes.push({
                  changes: { from: fromA, to: toA, insert: "''" },
                  selection: { anchor: fromA + 1 },
                  userEvent: "EasyTyping.change"
                });
                tr = tr.startState.update(...changes);
                return tr;
              }
            }
            if (insertedStr === "\u201D" || insertedStr === "\u2019") {
              let tempStr = insertedStr === "\u201D" ? "\u201C\u201D" : "\u2018\u2019";
              changes.push({
                changes: { from: fromA, to: toA, insert: tempStr },
                selection: { anchor: fromA + 1 },
                userEvent: "EasyTyping.change"
              });
              tr = tr.startState.update(...changes);
              return tr;
            }
          }
        }
      });
      return tr;
    };
    this.viewUpdatePlugin = (update) => {
      if (this.onFormatArticle === true)
        return;
      let cursor_changed = update.transactions.find((tr2) => tr2.selection) != null;
      if (hasTabstops(update.view) && (update.docChanged || cursor_changed) && !update.view.composing && !isInsideCurTabstop(update.view)) {
        removeAllTabstops(update.view);
      }
      if (hasTabstops(update.view) && update.transactions.find((tr2) => tr2.isUserEvent("undo"))) {
        removeAllTabstops(update.view);
      }
      let notSelected = true;
      let mainSelection = update.view.state.selection.asSingle().main;
      if (mainSelection.anchor != mainSelection.head)
        notSelected = false;
      if (!update.docChanged)
        return;
      let isExcludeFile = this.isCurrentFileExclude();
      let tr = update.transactions[0];
      let changeType = getTypeStrOfTransac(tr);
      tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) => {
        var _a;
        let insertedStr = inserted.sliceString(0);
        let changedStr = tr.startState.doc.sliceString(fromA, toA);
        if ((_a = this.settings) == null ? void 0 : _a.debug) {
          console.log("[ViewUpdate] type, fromA, toA, changed, fromB, toB, inserted");
          console.log(changeType, fromA, toA, changedStr, fromB, toB, insertedStr);
          console.log("==>[Composing]", update.view.composing);
        }
        if (getPosLineType(update.view.state, fromB) == "table" /* table */) {
          return;
        }
        let cursor = update.view.state.selection.asSingle().main;
        if (update.view.composing) {
          if (this.compose_need_handle) {
            this.compose_end_pos = cursor.anchor;
          } else {
            this.compose_need_handle = true;
            this.compose_begin_pos = fromA;
            this.compose_end_pos = cursor.anchor;
          }
          return;
        }
        let change_from = fromB;
        let change_to = toB;
        let composeEnd = false;
        if (this.compose_need_handle) {
          composeEnd = true;
          this.compose_need_handle = false;
          change_from = this.compose_begin_pos;
          change_to = this.compose_end_pos;
        }
        if (changeType.contains("EasyTyping") || changeType == "undo" || changeType == "redo")
          return;
        if (changeType != "none" && notSelected && !changeType.includes("delete")) {
          if (this.triggerCvtRule(update.view, mainSelection.anchor))
            return;
          if (composeEnd && this.triggerPuncRectify(update.view, change_from))
            return;
          if (this.settings.AutoFormat && notSelected && !isExcludeFile && (changeType != "none" || insertedStr == "\n")) {
            if (getPosLineType(update.view.state, change_from) == "text" /* text */ || getPosLineType(update.view.state, change_from) == "table" /* table */) {
              let changes = this.Formater.formatLineOfDoc(update.state, this.settings, change_from, cursor.anchor, insertedStr);
              if (changes != null) {
                update.view.dispatch(...changes[0]);
                update.view.dispatch(changes[1]);
                return;
              }
            }
          }
        }
        if (this.settings.AutoFormat && !isExcludeFile && changeType == "input.paste" && !import_obsidian3.Platform.isIosApp) {
          let updateLineStart = update.state.doc.lineAt(fromB).number;
          let updateLineEnd = update.state.doc.lineAt(toB).number;
          if (updateLineStart == updateLineEnd && getPosLineType(update.view.state, toB) == "text" /* text */) {
            let changes = this.Formater.formatLineOfDoc(update.state, this.settings, fromB, toB, insertedStr);
            if (changes != null) {
              update.view.dispatch(...changes[0]);
              return;
            }
          } else {
            let all_changes = [];
            let inserted_array = insertedStr.split("\n");
            let update_start = fromB;
            for (let i = updateLineStart; i <= updateLineEnd; i++) {
              let real_inserted = inserted_array[i - updateLineStart];
              let changes = this.Formater.formatLineOfDoc(update.state, this.settings, update_start, update_start + real_inserted.length, real_inserted);
              if (changes != null) {
                all_changes.push(...changes[0]);
              }
              update_start += real_inserted.length + 1;
            }
            if (all_changes.length > 0) {
              update.view.dispatch(...all_changes);
              return;
            }
          }
        }
      });
    };
    this.handleTabDown = (view) => {
      if (consumeAndGotoNextTabstop(view)) {
        return true;
      }
      if (!this.settings.Tabout)
        return false;
      let state = view.state;
      let doc = state.doc;
      const tree = (0, import_language3.syntaxTree)(state);
      const s = view.state.selection;
      if (s.ranges.length > 1)
        return false;
      const pos = s.main.to;
      let line = doc.lineAt(pos);
      if (s.main.from == s.main.to && isCodeBlockInPos(state, pos)) {
        const default_indent = this.getDefaultIndentChar();
        view.dispatch({
          changes: {
            from: s.main.from,
            insert: default_indent
          },
          selection: {
            anchor: s.main.from + default_indent.length
          }
        });
        return true;
      }
      if (this.settings.BetterCodeEdit && pos - line.from != 0 && tree.resolve(pos - 1, 1).name.contains("inline-code")) {
        if (tree.resolve(pos, 1).name.contains("formatting-code_inline-code")) {
          view.dispatch({
            selection: { anchor: pos + 1, head: pos + 1 }
          });
          return true;
        }
        for (let p = pos + 1; p < line.to && tree.resolve(p, 1).name.contains("inline-code"); p += 1) {
          if (tree.resolve(p, 1).name.contains("formatting-code_inline-code")) {
            view.dispatch({
              selection: { anchor: p, head: p }
            });
            return true;
          }
          if (p == line.to - 1 && tree.resolve(p, 1).name.contains("inline-code")) {
            view.dispatch({
              selection: { anchor: p + 1, head: p + 1 }
            });
            return true;
          }
        }
      }
      let selection = view.state.selection.asSingle().main;
      let selected = selection.anchor != selection.head;
      if (selected) {
        let new_anchor = selection.anchor < selection.head ? selection.anchor : selection.head;
        let new_head = selection.anchor > selection.head ? selection.anchor : selection.head;
        for (let pstr of this.TaboutPairStrs) {
          if (doc.sliceString(new_anchor - pstr.left.length, new_anchor) == pstr.left && doc.sliceString(new_head, new_head + pstr.right.length) == pstr.right) {
            view.dispatch({
              selection: { anchor: new_head + pstr.right.length, head: new_head + pstr.right.length }
            });
            return true;
          }
        }
      } else {
        let taboutRes = taboutCursorInPairedString(line.text, pos - line.from, this.TaboutPairStrs);
        if (taboutRes.isSuccess) {
          view.dispatch({
            selection: { anchor: taboutRes.newPosition + line.from }
          });
          return true;
        }
      }
      return false;
    };
    this.handleEnter = (view) => {
      var _a, _b;
      let state = view.state;
      let doc = state.doc;
      const tree = (0, import_language3.syntaxTree)(state);
      const s = view.state.selection;
      if (s.ranges.length > 1)
        return false;
      const pos = s.main.to;
      let line = doc.lineAt(pos);
      let codeBlockInfo = getCodeBlockInfoInPos(state, pos);
      if (this.settings.CollapsePersistentEnter) {
        const editor = this.app.workspace.getActiveViewOfType(import_obsidian3.MarkdownView).editor;
        let fold_offsets = editor.getFoldOffsets();
        let all_foldable_lines = editor.getAllFoldableLines();
        let folded_lines = [];
        for (let offset of fold_offsets) {
          let folded = all_foldable_lines.find((l) => l.from == offset);
          if (folded) {
            folded_lines.push(folded);
          }
        }
        let folded_line = folded_lines.find((l) => pos >= l.from && pos <= l.to);
        if (folded_line) {
          let folded_first_line = doc.lineAt(folded_line.from).text;
          let reg_headings = /^#+ /;
          if (reg_headings.test(folded_first_line)) {
            let heading_level = (_a = folded_first_line.match(/^#+/)) == null ? void 0 : _a[0].length;
            let new_heading_level = heading_level;
            let new_heading_line = "\n" + "#".repeat(new_heading_level) + " ";
            let folded_last_line = doc.lineAt(folded_line.to).text;
            let folded_last_line_is_blank = /^\s*$/.test(folded_last_line);
            let new_heading_line_pos = editor.offsetToPos(folded_line.to);
            let new_cursor_pos = { line: new_heading_line_pos.line + 1, ch: new_heading_level + 1 };
            if (this.settings.StrictModeEnter && !folded_last_line_is_blank && (this.app.vault.config.strictLineBreaks || false)) {
              new_heading_line = "\n\n" + "#".repeat(new_heading_level) + " ";
              new_cursor_pos = { line: new_heading_line_pos.line + 2, ch: new_heading_level + 1 };
            }
            editor.replaceRange(new_heading_line, new_heading_line_pos);
            editor.setCursor(editor.offsetToPos(folded_line.from));
            editor.exec("toggleFold");
            editor.setCursor(new_cursor_pos);
            return true;
          }
        }
      }
      if (this.settings.BetterCodeEdit && codeBlockInfo && codeBlockInfo.code_start_pos !== doc.lineAt(codeBlockInfo.start_pos).to && pos >= codeBlockInfo.code_start_pos && pos <= codeBlockInfo.code_end_pos) {
        let line_indent_str = ((_b = line.text.match(/^\s*/)) == null ? void 0 : _b[0]) || "";
        view.dispatch({
          changes: { from: pos, to: pos, insert: "\n" + line_indent_str },
          selection: { anchor: pos + line_indent_str.length + 1, head: pos + line_indent_str.length + 1 },
          userEvent: "EasyTyping.handleEnter"
        });
        return true;
      }
      if (!this.settings.StrictModeEnter)
        return false;
      let strictLineBreaks = this.app.vault.config.strictLineBreaks || false;
      if (!strictLineBreaks)
        return false;
      if (/^\s*$/.test(line.text))
        return false;
      if (pos == line.from)
        return false;
      if (getPosLineType2(state, pos) == "quote" /* quote */) {
        let reg_quote = /^(\s*)(>+ ?)/;
        let quote_match = line.text.match(reg_quote);
        if (!quote_match)
          return false;
        let quote_indent_str = (quote_match == null ? void 0 : quote_match[1]) || "";
        let quote_level = (quote_match == null ? void 0 : quote_match[2].length) || 0;
        let quote_content = line.text.slice(quote_match[0].length);
        if (quote_content.trim() == "")
          return false;
        else {
          let space_str2 = "  ";
          if (quote_content.endsWith("  "))
            space_str2 = "";
          let inserted_str = space_str2 + "\n" + quote_match[0];
          if (this.settings.StrictLineMode == "enter_twice" /* EnterTwice */) {
            inserted_str = "\n" + quote_match[0] + "\n" + quote_match[0];
          }
          view.dispatch({
            changes: { from: pos, to: pos, insert: inserted_str },
            selection: { anchor: pos + inserted_str.length },
            userEvent: "EasyTyping.handleEnter"
          });
          return true;
        }
      }
      let space_str = "  ";
      if (line.text.endsWith("  "))
        space_str = "";
      if (line.number < doc.lines && !/^\s*$/.test(doc.line(line.number + 1).text)) {
        if (this.settings.StrictLineMode != "two_space" /* TwoSpace */)
          return false;
      }
      if (this.settings.StrictLineMode == "two_space" /* TwoSpace */ && getPosLineType2(state, pos) == "text" /* text */) {
        let inserted_str = space_str + "\n";
        view.dispatch({
          changes: { from: pos, to: pos, insert: inserted_str },
          selection: { anchor: pos + inserted_str.length, head: pos + inserted_str.length },
          userEvent: "EasyTyping.handleEnter"
        });
        return true;
      }
      if (getPosLineType2(state, pos) == "text" /* text */ || codeBlockInfo && pos == codeBlockInfo.end_pos && codeBlockInfo.indent == 0) {
        view.dispatch({
          changes: {
            from: pos,
            to: pos,
            insert: "\n\n"
          },
          selection: { anchor: pos + 2 },
          userEvent: "EasyTyping.handleEnter"
        });
        return true;
      }
      return false;
    };
    this.handleModA = (view) => {
      var _a;
      let selection = view.state.selection.main;
      let line = view.state.doc.lineAt(selection.anchor);
      let line_type = getPosLineType2(view.state, selection.anchor);
      let is_in_code_block = isCodeBlockInPos(view.state, selection.anchor);
      if (this.settings.EnhanceModA && line_type == "text" /* text */ && !is_in_code_block) {
        let [block_start, block_end] = this.getBlockLinesInPos(view.state, selection.head);
        if (selection.anchor <= view.state.doc.line(block_start).from && selection.head >= view.state.doc.line(block_end).to) {
          return false;
        }
        if (selection.anchor == line.from && selection.head == line.to) {
          if (block_start != block_end) {
            view.dispatch({
              selection: {
                anchor: view.state.doc.line(block_start).from,
                head: view.state.doc.line(block_end).to
              },
              userEvent: "EasyTyping.handleModA"
            });
            return true;
          }
          return false;
        }
        view.dispatch({
          selection: { anchor: line.from, head: line.to },
          userEvent: "EasyTyping.handleModA"
        });
        return true;
      }
      let quote_info = getQuoteInfoInPos(view.state, selection.head);
      if (this.settings.EnhanceModA && quote_info) {
        if (selection.anchor == quote_info.start_pos && selection.head == quote_info.end_pos) {
          return false;
        } else if (selection.anchor == quote_info.cur_start_pos && selection.head == quote_info.cur_end_pos) {
          view.dispatch({
            selection: { anchor: quote_info.start_pos, head: quote_info.end_pos },
            userEvent: "EasyTyping.handleModA"
          });
          return true;
        } else {
          view.dispatch({
            selection: { anchor: quote_info.cur_start_pos, head: quote_info.cur_end_pos },
            userEvent: "EasyTyping.handleModA"
          });
          return true;
        }
      }
      if (this.settings.EnhanceModA && line_type == "list" /* list */) {
        const reg_list = /^(\s*)([-*+] \[[^\]]\]|[-*+]|\d+\.)\s/;
        let reg_code_block = /^\s+```/;
        const listMatch = line.text.match(reg_list);
        if (!listMatch) {
          if (!reg_code_block.test(line.text)) {
            let cur_indent = ((_a = line.text.match(/^\s*/)) == null ? void 0 : _a[0].length) || 0;
            let selection_list = [];
            selection_list.push({ anchor: line.from + cur_indent, head: line.to });
            let list_start_line = line.number;
            for (let i = line.number - 1; i >= 1; i--) {
              const prevLine = view.state.doc.line(i);
              if (getPosLineType2(view.state, prevLine.from) == "list" /* list */) {
                list_start_line = i;
                break;
              }
            }
            let list_s_match = view.state.doc.line(list_start_line).text.match(reg_list);
            let list_s_start_idx = (list_s_match == null ? void 0 : list_s_match[0].length) || 0;
            selection_list.push({ anchor: view.state.doc.line(list_start_line).from + list_s_start_idx, head: line.to });
            if (selection.anchor <= selection_list[0].anchor && selection.head >= selection_list[0].head) {
              view.dispatch({ selection: selection_list[1], userEvent: "EasyTyping.handleModA" });
              return true;
            } else {
              view.dispatch({ selection: selection_list[0], userEvent: "EasyTyping.handleModA" });
              return true;
            }
          }
        } else {
          const cur_indent = listMatch[1].length;
          let selection_list = [];
          const contentStart = line.from + listMatch[0].length;
          selection_list.push({ anchor: contentStart, head: line.to });
          let endLine = line.number;
          for (let i = line.number + 1; i <= view.state.doc.lines; i++) {
            const nextLine = view.state.doc.line(i);
            const nextMatch = nextLine.text.match(/^(\s*)/);
            if (!nextMatch || nextMatch[0].length <= cur_indent)
              break;
            endLine = i;
          }
          let list_block_selection = { anchor: line.from, head: view.state.doc.line(endLine).to };
          selection_list.push(list_block_selection);
          let list_start_line = line.number;
          for (let i = line.number - 1; i >= 1; i--) {
            const prevLine = view.state.doc.line(i);
            const prevMatch = prevLine.text.match(/^(\s*)/);
            if (getPosLineType2(view.state, prevLine.from) == "list" /* list */ || prevMatch && prevMatch[0].length >= 2) {
              list_start_line = i;
            } else {
              break;
            }
          }
          let list_end_line = line.number;
          for (let i = line.number + 1; i <= view.state.doc.lines; i++) {
            const nextLine = view.state.doc.line(i);
            const nextMatch = nextLine.text.match(/^(\s*)/);
            if (getPosLineType2(view.state, nextLine.from) == "list" /* list */ || nextMatch && nextMatch[0].length >= 2) {
              list_end_line = i;
            } else {
              break;
            }
          }
          let list_all_selection = { anchor: view.state.doc.line(list_start_line).from, head: view.state.doc.line(list_end_line).to };
          if (list_all_selection.anchor != list_block_selection.anchor || list_all_selection.head != list_block_selection.head) {
            selection_list.push(list_all_selection);
          }
          selection_list.push({ anchor: 0, head: view.state.doc.length });
          let hit_idx = -1;
          for (let i = selection_list.length - 1; i >= 0; i--) {
            const sel = selection_list[i];
            if (selection.anchor <= sel.anchor && selection.head >= sel.head) {
              hit_idx = i;
              break;
            }
          }
          hit_idx += 1;
          if (hit_idx < selection_list.length) {
            view.dispatch({ selection: selection_list[hit_idx], userEvent: "EasyTyping.handleModA" });
            return true;
          }
          return false;
        }
      }
      if (!this.settings.BetterCodeEdit)
        return false;
      let mainSelection = view.state.selection.asSingle().main;
      return selectCodeBlockInPos(view, mainSelection);
    };
    this.onKeyup = (event, view) => {
      var _a;
      if ((_a = this.settings) == null ? void 0 : _a.debug) {
        console.log("Keyup:", event.key);
      }
      this.handleEndComposeTypeKey(event, view);
    };
    this.triggerCvtRule = (view, cursor_pos) => {
      let rules = [];
      if (this.settings.QuoteSpace)
        rules = rules.concat(this.ExtraBasicConvRules);
      if (this.settings.QuoteSpace)
        rules = rules.concat(this.QuoteSpaceRules);
      rules = rules.concat(this.UserConvertRules);
      for (let rule of rules) {
        let leftDocStr = view.state.doc.sliceString(0, cursor_pos);
        let rightDocStr = view.state.doc.sliceString(cursor_pos);
        let leftRegexpStr = rule.before.left;
        if (isRegexp(rule.before.left)) {
          leftRegexpStr = leftRegexpStr.slice(2, -1);
        } else {
          leftRegexpStr = leftRegexpStr.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
        }
        let leftRegexp = new RegExp(leftRegexpStr + "$");
        let leftMatch = leftDocStr.match(leftRegexp);
        if (leftMatch) {
          let leftMatchStr = leftMatch[0];
          let matchList = leftMatch.slice(1);
          let matchPosBegin = cursor_pos - leftMatchStr.length;
          let rightRegexpStr = rule.before.right;
          if (isRegexp(rule.before.right)) {
            rightRegexpStr = rightRegexpStr.slice(2, -1);
          } else {
            rightRegexpStr = rightRegexpStr.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
          }
          let rightRegexp = new RegExp("^" + rightRegexpStr);
          let rightMatch = rightDocStr.match(rightRegexp);
          if (rightMatch) {
            let rightMatchStr = rightMatch[0];
            let matchPosEnd = cursor_pos + rightMatchStr.length;
            matchList.push(...rightMatch.slice(1));
            let [new_string, tabstops] = parseTheAfterPattern(rule.after_pattern, matchList);
            const updatedTabstops = tabstops.map((tabstop) => ({
              ...tabstop,
              from: tabstop.from + matchPosBegin,
              to: tabstop.to + matchPosBegin
            }));
            view.dispatch({
              changes: {
                from: matchPosBegin,
                to: matchPosEnd,
                insert: new_string
              },
              userEvent: "EasyTyping.change"
            });
            addTabstopsAndSelect(view, tabstopSpecsToTabstopGroups(updatedTabstops));
            return true;
          }
        }
      }
      return false;
    };
    this.triggerPuncRectify = (view, change_from_pos) => {
      if (this.settings.PuncRectify && /[,.?!]/.test(view.state.doc.sliceString(change_from_pos - 1, change_from_pos))) {
        let punc = view.state.doc.sliceString(change_from_pos - 1, change_from_pos);
        if (change_from_pos > 2 && /[^\u4e00-\u9fa5]/.test(view.state.doc.sliceString(change_from_pos - 2, change_from_pos - 1))) {
        } else {
          view.dispatch({
            changes: {
              from: change_from_pos - 1,
              to: change_from_pos,
              insert: this.halfToFullSymbolMap.get(punc)
            },
            userEvent: "EasyTyping.change"
          });
          return true;
        }
      }
      return false;
    };
    this.handleEndComposeTypeKey = (event, view) => {
      if ((["Enter", "Process", " ", "Shift"].contains(event.key) || /\d/.test(event.key)) && this.compose_need_handle) {
        let cursor = view.state.selection.asSingle().main;
        if (cursor.head != cursor.anchor)
          return;
        let insertedStr = view.state.doc.sliceString(this.compose_begin_pos, cursor.anchor);
        this.compose_need_handle = false;
        if (this.triggerCvtRule(view, cursor.anchor))
          return;
        if (this.triggerPuncRectify(view, this.compose_begin_pos))
          return;
        if (this.settings.AutoFormat && !this.isCurrentFileExclude()) {
          if (getPosLineType(view.state, cursor.anchor) != "text" /* text */)
            return;
          let changes = this.Formater.formatLineOfDoc(view.state, this.settings, this.compose_begin_pos, cursor.anchor, insertedStr);
          if (changes != null) {
            view.dispatch(...changes[0]);
            view.dispatch(changes[1]);
            return;
          }
        }
      }
    };
    this.formatArticle = (editor, view) => {
      const editorView = editor.cm;
      const tree = (0, import_language3.ensureSyntaxTree)(editorView.state, editorView.state.doc.length);
      if (!tree) {
        new import_obsidian3.Notice("EasyTyping: Syntax tree is not ready yet, please wait a moment and try again later!", 5e3);
        return;
      }
      this.onFormatArticle = true;
      let lineCount = editor.lineCount();
      let new_article = "";
      let cs = editor.getCursor();
      let ch = 0;
      for (let i = 0; i < lineCount; i++) {
        if (i != 0)
          new_article += "\n";
        if (i != cs.line) {
          new_article += this.preFormatOneLine(editor, i + 1)[0];
        } else {
          let newData = this.preFormatOneLine(editor, i + 1, cs.ch);
          new_article += newData[0];
          ch = newData[1];
        }
      }
      editor.setValue(new_article);
      editor.setCursor({ line: cs.line, ch });
      this.onFormatArticle = false;
      new import_obsidian3.Notice("EasyTyping: Format Article Done!");
    };
    this.formatSelectionOrCurLine = (editor, view) => {
      if (!editor.somethingSelected() || editor.getSelection() === "") {
        let lineNumber = editor.getCursor().line;
        let newLineData = this.preFormatOneLine(editor, lineNumber + 1, editor.getCursor().ch);
        editor.replaceRange(newLineData[0], { line: lineNumber, ch: 0 }, { line: lineNumber, ch: editor.getLine(lineNumber).length });
        editor.setSelection({ line: lineNumber, ch: newLineData[1] });
        return;
      }
      let selection = editor.listSelections()[0];
      let begin = selection.anchor.line;
      let end = selection.head.line;
      if (begin > end) {
        let temp = begin;
        begin = end;
        end = temp;
      }
      let new_lines = "";
      for (let i = begin; i <= end; i++) {
        if (i != begin)
          new_lines += "\n";
        new_lines += this.preFormatOneLine(editor, i + 1)[0];
      }
      editor.replaceRange(new_lines, { line: begin, ch: 0 }, { line: end, ch: editor.getLine(end).length });
      if (selection.anchor.line < selection.head.line) {
        editor.setSelection({ line: selection.anchor.line, ch: 0 }, { line: selection.head.line, ch: editor.getLine(selection.head.line).length });
      } else {
        editor.setSelection({ line: selection.anchor.line, ch: editor.getLine(selection.anchor.line).length }, { line: selection.head.line, ch: 0 });
      }
    };
    this.formatOneLine = (editor, lineNumber) => {
      const editorView = editor.cm;
      let state = editorView.state;
      let line = state.doc.line(lineNumber);
      if (getPosLineType(state, line.from) == "text" /* text */ || getPosLineType(state, line.from) == "table" /* table */) {
        let oldLine = line.text;
        let newLine = this.Formater.formatLine(state, lineNumber, this.settings, oldLine.length, 0)[0];
        if (oldLine != newLine) {
          editor.replaceRange(newLine, { line: lineNumber - 1, ch: 0 }, { line: lineNumber - 1, ch: oldLine.length });
          editor.setCursor({ line: lineNumber - 1, ch: editor.getLine(lineNumber - 1).length });
        }
      }
      return;
    };
    this.preFormatOneLine = (editor, lineNumber, ch = -1) => {
      const editorView = editor.cm;
      let state = editorView.state;
      let line = state.doc.line(lineNumber);
      let newLine = line.text;
      let newCh = 0;
      let curCh = line.text.length;
      if (ch != -1) {
        curCh = ch;
      }
      if (getPosLineType(state, line.from) == "text" /* text */ || getPosLineType(state, line.from) == "table" /* table */) {
        let newLineData = this.Formater.formatLine(state, lineNumber, this.settings, curCh, 0);
        newLine = newLineData[0];
        newCh = newLineData[1];
      }
      return [newLine, newCh];
    };
    this.deleteBlankLines = (editor) => {
      var _a;
      if ((_a = this.settings) == null ? void 0 : _a.debug) {
        console.log("config.strictLineBreaks", this.app.vault.getConfig("strictLineBreaks"));
      }
      let strictLineBreaks = this.app.vault.config.strictLineBreaks || false;
      const editorView = editor.cm;
      let state = editorView.state;
      let doc = state.doc;
      const tree = (0, import_language3.ensureSyntaxTree)(state, doc.length);
      if (!tree) {
        new import_obsidian3.Notice("EasyTyping: Syntax tree is not ready yet, please wait a moment and try again later!", 5e3);
        return;
      }
      let start_line = 1;
      let end_line = doc.lines;
      let line_num = doc.lines;
      const selected = editor.somethingSelected() && editor.getSelection() != "";
      if (selected) {
        let selection = editor.listSelections()[0];
        let begin = selection.anchor.line + 1;
        let end = selection.head.line + 1;
        if (begin > end) {
          let temp = begin;
          begin = end;
          end = temp;
        }
        start_line = begin;
        end_line = end;
      }
      let delete_index = [];
      let blank_reg = /^\s*$/;
      let remain_next_blank = false;
      if (start_line != 1) {
        let node = tree.resolve(doc.line(start_line - 1).from, 1);
        if (node.name.contains("list") || node.name.contains("quote") || node.name.contains("blockid")) {
          remain_next_blank = true;
        }
      }
      if (end_line != line_num && !blank_reg.test(doc.line(end_line + 1).text)) {
        end_line += 1;
      }
      for (let i = start_line; i <= end_line; i++) {
        let line = doc.line(i);
        let pos = line.from;
        let node = tree.resolve(pos, 1);
        if (blank_reg.test(line.text) && !remain_next_blank) {
          delete_index.push(i);
          continue;
        } else if (blank_reg.test(line.text) && remain_next_blank) {
          remain_next_blank = false;
          continue;
        }
        if (node.name.contains("hr") && delete_index[delete_index.length - 1] == i - 1) {
          delete_index.pop();
        } else if (node.name.contains("list") || node.name.contains("quote") || node.name.contains("blockid")) {
          remain_next_blank = true;
        } else {
          remain_next_blank = false;
        }
      }
      let newContent = "";
      for (let i = 1; i < line_num; i++) {
        if (!delete_index.contains(i)) {
          newContent += doc.line(i).text + "\n";
        }
      }
      if (!delete_index.contains(line_num)) {
        newContent += doc.line(line_num).text;
      }
      editor.setValue(newContent);
    };
    this.getEditor = () => {
      let editor = null;
      let markdownView = this.app.workspace.getActiveViewOfType(import_obsidian3.MarkdownView);
      if (markdownView) {
        editor = markdownView.editor;
      }
      if (editor === null)
        console.log("can't get editor");
      return editor;
    };
  }
  async onload() {
    await this.loadSettings();
    this.selectionReplaceMapInitalData = [
      ["\u3010", { left: "[", right: "]" }],
      ["\uFFE5", { left: "$", right: "$" }],
      ["\xB7", { left: "`", right: "`" }],
      ["\xA5", { left: "$", right: "$" }],
      ["\u300A", { left: "\u300A", right: "\u300B" }],
      ["\u201C", { left: "\u201C", right: "\u201D" }],
      ["\u201D", { left: "\u201C", right: "\u201D" }],
      ["\uFF08", { left: "\uFF08", right: "\uFF09" }],
      ["<", { left: "<", right: ">" }],
      ['"', { left: '"', right: '"' }],
      ["'", { left: "'", right: "'" }],
      ["\u300C", { left: "\u300C", right: "\u300D" }],
      ["\u300E", { left: "\u300E", right: "\u300F" }]
    ];
    this.refreshSelectionReplaceRule();
    this.SymbolPairsMap = /* @__PURE__ */ new Map();
    let SymbolPairs = ["\u3010\u3011", "\uFF08\uFF09", "\u300A\u300B", "\u201C\u201D", "\u2018\u2019", "\u300C\u300D", "\u300E\u300F", "[]", "()", "{}", '""', "''"];
    for (let pairStr of SymbolPairs)
      this.SymbolPairsMap.set(pairStr.charAt(0), pairStr.charAt(1));
    this.halfToFullSymbolMap = /* @__PURE__ */ new Map([
      [".", "\u3002"],
      [",", "\uFF0C"],
      ["?", "\uFF1F"],
      ["!", "\uFF01"]
    ]);
    let BasicConvRuleStringList = [
      ["\xB7\xB7|", "`|`"],
      ["\uFF01\u3010\u3010|\u3011", "![[|]]"],
      ["\uFF01\u3010\u3010|", "![[|]]"],
      ["\u3010\u3010|\u3011", "[[|]]"],
      ["\u3010\u3010|", "[[|]]"],
      ["\uFFE5\uFFE5|", "$|$"],
      ["$\uFFE5|$", "$$\n|\n$$"],
      ["\xA5\xA5|", "$|$"],
      ["$\xA5|$", "$$\n|\n$$"],
      ["$$|$", "$$\n|\n$$"],
      ["$$|", "$|$"],
      ["\n\u300B|", "\n> |"],
      ["\n\u3001|", "\n/|"]
    ];
    let ExtraBasicConvRuleStringList = [["r/(?<=^|\\n)(\\s*>*) ?[>\u300B]/|", "[[0]]> |"]];
    let QuoteSpaceRuleStringList = [["r/(?<=^|\\n)(\\s*>+)([^ >\u300B]+)/|", "[[0]] [[1]]|"]];
    this.ExtraBasicConvRules = ruleStringList2RuleList(ExtraBasicConvRuleStringList);
    this.QuoteSpaceRules = ruleStringList2RuleList(QuoteSpaceRuleStringList);
    this.BasicConvRules = ruleStringList2RuleList(BasicConvRuleStringList);
    let FW2HWSymbolRulesStrList = [
      ["\u3002\u3002|", ".|"],
      ["\uFF01\uFF01|", "!|"],
      ["\uFF1B\uFF1B|", ";|"],
      ["\uFF0C\uFF0C|", ",|"],
      ["\uFF1A\uFF1A|", ":|"],
      ["\uFF1F\uFF1F|", "?|"],
      ["\uFF08\uFF08|\uFF09", "(|)"],
      ["\uFF08\uFF08|", "(|)"],
      ["\u201C\u201C|\u201D", '"|"'],
      ["\u201C\u201D|\u201D", '"|"'],
      ["\u2018\u2018|\u2019", "'|'"],
      ["\u2018\u2019|\u2019", "'|'"],
      ["\u300B\u300B|", ">|"],
      ["\u300A\u300A|\u300B", "<|"],
      ["\u300A\u300A|", "<|"]
    ];
    this.FW2HWSymbolRules = ruleStringList2RuleList(FW2HWSymbolRulesStrList);
    let fw2hw_rule_0 = { before: { left: "\uFF5C\uFF5C", right: "" }, after: { left: "|", right: "" } };
    this.FW2HWSymbolRules.push(fw2hw_rule_0);
    let DeleteRulesStrList = [["$|$", "|"], ["==|==", "|"], ["$$\n|\n$$", "|"]];
    this.IntrinsicDeleteRules = ruleStringList2RuleList(DeleteRulesStrList);
    let autoPairRulesPatchStrList = [
      ["\u3010\u3011|\u3011", "\u3010\u3011|"],
      ["\uFF08\uFF09|\uFF09", "\uFF08\uFF09|"],
      ["<>|>", "<>|"],
      ["\u300A\u300B|\u300B", "\u300A\u300B|"],
      ["\u300C\u300D|\u300D", "\u300C\u300D|"],
      ["\u300E\u300F|\u300F", "\u300E\u300F|"],
      ["()|)", "()|"],
      ["[]|]", "[]|"],
      ["{}|}", "{}|"],
      ["''|'", "''|"],
      ['""|"', '""|']
    ];
    this.IntrinsicAutoPairRulesPatch = ruleStringList2RuleList(autoPairRulesPatchStrList);
    let TaboutPairStrs = [
      "\u3010|\u3011",
      "\uFF08|\uFF09",
      "\u300A|\u300B",
      "\u201C|\u201D",
      "\u2018|\u2019",
      "\u300C|\u300D",
      "\u300E|\u300F",
      "'|'",
      '"|"',
      "$$|$$",
      "$|$",
      "__|__",
      "_|_",
      "==|==",
      "~~|~~",
      "**|**",
      "*|*",
      "[[|]]",
      "[|]",
      "{|}",
      "(|)",
      "<|>"
    ];
    this.TaboutPairStrs = TaboutPairStrs.map((s) => string2pairstring(s));
    this.refreshUserDeleteRule();
    this.refreshUserConvertRule();
    this.CurActiveMarkdown = "";
    this.compose_need_handle = false;
    this.Formater = new LineFormater();
    this.onFormatArticle = false;
    if (!this.settings) {
      console.error("EasyTyping: Settings not loaded properly, using defaults");
      this.settings = Object.assign({}, DEFAULT_SETTINGS);
    }
    setDebug(this.settings.debug);
    this.registerEditorExtension([
      import_state3.EditorState.transactionFilter.of(this.transactionFilterPlugin),
      import_view3.EditorView.updateListener.of(this.viewUpdatePlugin),
      import_state3.Prec.highest(import_view3.EditorView.domEventHandlers({
        "keyup": this.onKeyup
      })),
      tabstopsStateField.extension
    ]);
    this.registerEditorExtension(import_state3.Prec.highest(import_view3.keymap.of([
      {
        key: "Tab",
        run: (view) => {
          const success = this.handleTabDown(view);
          return success;
        }
      },
      {
        key: "Enter",
        run: (view) => {
          const success = this.handleEnter(view);
          return success;
        }
      },
      {
        key: "Mod-a",
        run: (view) => {
          const success = this.handleModA(view);
          return success;
        }
      },
      {
        key: "Backspace",
        run: (view) => {
          if (!this.settings.BetterBackspace)
            return false;
          return this.handleBackspace(view);
        }
      },
      {
        key: "Shift-Enter",
        run: (view) => {
          const success = this.handleShiftEnter(view);
          return success;
        }
      }
    ])));
    this.lang = window.localStorage.getItem("language");
    let command_name_map = this.getCommandNameMap();
    this.addCommand({
      id: "easy-typing-format-article",
      name: command_name_map.get("format_article"),
      editorCallback: (editor, view) => {
        this.formatArticle(editor, view);
      },
      hotkeys: [{
        modifiers: ["Mod", "Shift"],
        key: "s"
      }]
    });
    this.addCommand({
      id: "easy-typing-select-block",
      name: command_name_map.get("select_block"),
      editorCallback: (editor, view) => {
        this.selectBlockInCurser(editor.cm);
      }
    });
    this.addCommand({
      id: "easy-typing-format-selection",
      name: command_name_map.get("format_selection"),
      editorCallback: (editor, view) => {
        this.formatSelectionOrCurLine(editor, view);
      },
      hotkeys: [{
        modifiers: ["Mod", "Shift"],
        key: "l"
      }]
    });
    this.addCommand({
      id: "easy-typing-delete-blank-line",
      name: command_name_map.get("delete_blank_line"),
      editorCallback: (editor, view) => {
        this.deleteBlankLines(editor);
      },
      hotkeys: [{
        modifiers: ["Mod", "Shift"],
        key: "k"
      }]
    });
    this.addCommand({
      id: "easy-typing-goto-new-line-after-cur-line",
      name: command_name_map.get("goto_new_line_after_cur_line"),
      editorCallback: (editor, view) => {
        this.goNewLineAfterCurLine(editor.cm);
      },
      hotkeys: [{ modifiers: ["Mod"], key: "Enter" }]
    });
    this.addCommand({
      id: "easy-typing-insert-codeblock",
      name: command_name_map.get("insert_codeblock"),
      editorCallback: (editor, view) => {
        this.convert2CodeBlock(editor);
      },
      hotkeys: [{
        modifiers: ["Mod", "Shift"],
        key: "n"
      }]
    });
    this.addCommand({
      id: "easy-typing-format-switch",
      name: command_name_map.get("switch_autoformat"),
      callback: () => this.switchAutoFormatting(),
      hotkeys: [{
        modifiers: ["Ctrl"],
        key: "tab"
      }]
    });
    this.addCommand({
      id: "easy-typing-paste-without-format",
      name: command_name_map.get("paste_wo_format"),
      editorCallback: (editor) => this.normalPaste(editor),
      hotkeys: [
        {
          modifiers: ["Mod", "Shift"],
          key: "v"
        }
      ]
    });
    this.addCommand({
      id: "easy-typing-toggle-comment",
      name: command_name_map.get("toggle_comment"),
      editorCallback: (editor, view) => this.toggleComment(editor.cm),
      hotkeys: [{ modifiers: ["Mod"], key: "/" }]
    });
    this.addSettingTab(new EasyTypingSettingTab(this.app, this));
    this.registerEvent(this.app.workspace.on("active-leaf-change", (leaf) => {
      var _a;
      if (leaf.view.getViewType() == "markdown") {
        let file = this.app.workspace.getActiveFile();
        if (file != null && this.CurActiveMarkdown != file.path) {
          this.CurActiveMarkdown = file.path;
          if ((_a = this.settings) == null ? void 0 : _a.debug)
            new import_obsidian3.Notice("new md-file open: " + file.path);
        }
      }
    }));
    if (import_obsidian3.Platform.isMacOS && this.settings.FixMacOSContextMenu) {
      this.registerEvent(this.app.workspace.on("editor-menu", (menu, editor, view) => {
        if (editor.listSelections().length != 1)
          return;
        let selection = editor.listSelections()[0];
        let selected = editor.getSelection();
        if (selected == "\n") {
          editor.setSelection(selection.anchor, selection.anchor);
        }
      }));
    }
    console.log("Easy Typing Plugin loaded.");
  }
  onunload() {
    console.log("Easy Typing Plugin unloaded.");
  }
  async normalPaste(editor) {
    var _a;
    let clipboardText = await navigator.clipboard.readText();
    if (clipboardText === null || clipboardText === "")
      return;
    if ((_a = this.settings) == null ? void 0 : _a.debug)
      console.log("Normal Paste!!");
    const editorView = editor.cm;
    let mainSelection = editorView.state.selection.asSingle().main;
    editorView.dispatch({
      changes: { from: mainSelection.from, to: mainSelection.to, insert: clipboardText },
      selection: { anchor: mainSelection.from + clipboardText.length },
      userEvent: "EasyTyping.paste"
    });
  }
  getBlockLinesInPos(state, pos) {
    const strictLineBreaks = this.app.vault.config.strictLineBreaks || false;
    let line = state.doc.lineAt(pos);
    let block_start = line.number;
    let block_end = line.number;
    let reg_headings = /^#+ /;
    for (let i = line.number - 1; i >= 1; i--) {
      let line2 = state.doc.line(i);
      if (getPosLineType2(state, line2.from) == "text" /* text */ && line2.text !== "" && !reg_headings.test(line2.text)) {
        block_start = i;
        continue;
      }
      break;
    }
    for (let i = line.number + 1; i <= state.doc.lines; i++) {
      let line2 = state.doc.line(i);
      if (getPosLineType2(state, line2.from) == "text" /* text */ && line2.text !== "" && !reg_headings.test(line2.text)) {
        block_end = i;
        continue;
      }
      break;
    }
    return [block_start, block_end];
  }
  selectBlockInCurser(view) {
    let selection = view.state.selection.main;
    let line = view.state.doc.lineAt(selection.head);
    if (/^\s*$/.test(line.text))
      return false;
    let [block_start, block_end] = this.getBlockLinesInPos(view.state, selection.head);
    view.dispatch({
      selection: { anchor: view.state.doc.line(block_start).from, head: view.state.doc.line(block_end).to },
      userEvent: "EasyTyping.selectBlockInCurser"
    });
    return true;
  }
  toggleComment(view) {
    const state = view.state;
    const selection = state.selection.main;
    const codeBlockInfo = getCodeBlockInfoInPos(state, selection.from);
    if (codeBlockInfo) {
      return this.toggleCodeBlockComment(view);
    }
    return this.toggleMarkdownComment(selection.from, selection.to, view);
  }
  toggleCodeBlockComment(view) {
    const state = view.state;
    const selection = state.selection.main;
    const codeBlockInfo = getCodeBlockInfoInPos(state, selection.from);
    if (!codeBlockInfo)
      return false;
    const language = codeBlockInfo.language;
    const commentSymbol = this.getCommentSymbol(language.toLowerCase());
    if (!commentSymbol)
      return false;
    let changes = [];
    if (selection.from === selection.to) {
      const line = state.doc.lineAt(selection.from);
      let change = this.toggleCodeBlockLineComment(line.from, line.to, state.doc.sliceString(line.from, line.to), commentSymbol, selection.from);
      if (change && change.selection) {
        changes.push(change);
        view.dispatch({
          changes,
          selection: change.selection,
          userEvent: "EasyTyping.toggleComment"
        });
        return true;
      } else if (change) {
        changes.push(change);
      }
    } else {
      const fromLine = state.doc.lineAt(selection.from);
      const toLine = state.doc.lineAt(selection.to);
      for (let i = fromLine.number; i <= toLine.number; i++) {
        const line = state.doc.line(i);
        let change = this.toggleCodeBlockLineComment(line.from, line.to, state.doc.sliceString(line.from, line.to), commentSymbol);
        if (change) {
          changes.push(change);
        }
      }
    }
    view.dispatch({ changes, userEvent: "EasyTyping.toggleComment" });
    return true;
  }
  toggleCodeBlockLineComment(from, to, text, commentSymbol, cursor_pos) {
    if (text.trim() == "" && cursor_pos) {
      if (typeof commentSymbol === "string") {
        let new_pos = cursor_pos + commentSymbol.length + 1;
        return {
          from: cursor_pos,
          to: cursor_pos,
          insert: commentSymbol + " ",
          selection: { anchor: new_pos, head: new_pos }
        };
      } else {
        let new_pos = cursor_pos + commentSymbol.start.length + 1;
        return {
          from: cursor_pos,
          to: cursor_pos,
          insert: commentSymbol.start + "  " + commentSymbol.end,
          selection: { anchor: new_pos, head: new_pos }
        };
      }
    }
    if (text.trim() == "")
      return null;
    if (typeof commentSymbol === "string") {
      const trimmedText = text.trimStart();
      if (trimmedText.startsWith(commentSymbol)) {
        const commentIndex = text.indexOf(commentSymbol);
        return {
          from: from + commentIndex,
          to: from + commentIndex + commentSymbol.length + (trimmedText.startsWith(commentSymbol + " ") ? 1 : 0),
          insert: ""
        };
      } else {
        const indent = text.length - trimmedText.length;
        return {
          from: from + indent,
          to: from + indent,
          insert: commentSymbol + " "
        };
      }
    } else {
      const trimmedText = text.trim();
      if (trimmedText.startsWith(commentSymbol.start) && trimmedText.endsWith(commentSymbol.end)) {
        const commentStartIndex = text.indexOf(commentSymbol.start);
        return {
          from: from + commentStartIndex,
          to,
          insert: trimmedText.slice(commentSymbol.start.length + 1, -commentSymbol.end.length - 1)
        };
      } else {
        const indent = text.length - text.trimStart().length;
        return {
          from: from + indent,
          to,
          insert: `${commentSymbol.start} ${trimmedText} ${commentSymbol.end}`
        };
      }
    }
  }
  toggleMarkdownComment(from, to, view) {
    const state = view.state;
    const doc = state.doc;
    const changes = [];
    if (from === to) {
      const currentText = doc.sliceString(from - 3, to + 3);
      if (currentText === "%%  %%") {
        changes.push({
          from: from - 3,
          to: to + 3,
          insert: ""
        });
        view.dispatch({
          changes,
          selection: { anchor: from - 3, head: from - 3 },
          userEvent: "EasyTyping.toggleComment"
        });
        return true;
      }
      changes.push({
        from,
        to,
        insert: "%%  %%"
      });
      const newPos = from + 3;
      view.dispatch({
        changes,
        selection: { anchor: newPos, head: newPos },
        userEvent: "EasyTyping.toggleComment"
      });
    } else {
      const selectedText = doc.sliceString(from, to);
      if (selectedText.startsWith("%%") && selectedText.endsWith("%%")) {
        changes.push({
          from,
          to,
          insert: selectedText.slice(2, -2)
        });
      } else {
        changes.push({
          from,
          to,
          insert: `%%${selectedText}%%`
        });
      }
      view.dispatch({ changes, userEvent: "EasyTyping.toggleComment" });
    }
    return true;
  }
  getCommentSymbol(language) {
    const commentSymbols = {
      "js": "//",
      "javascript": "//",
      "ts": "//",
      "typescript": "//",
      "py": "#",
      "python": "#",
      "rb": "#",
      "ruby": "#",
      "java": "//",
      "c": "//",
      "cpp": "//",
      "cs": "//",
      "go": "//",
      "rust": "//",
      "swift": "//",
      "kotlin": "//",
      "php": "//",
      "css": { start: "/*", end: "*/" },
      "scss": { start: "/*", end: "*/" },
      "sql": "--",
      "shell": "#",
      "bash": "#",
      "powershell": "#",
      "html": { start: "<!--", end: "-->" },
      "matlab": "%",
      "markdown": { start: "%%", end: "%%" }
    };
    return commentSymbols[language] || null;
  }
  handleShiftEnter(view) {
    const state = view.state;
    const doc = state.doc;
    const selection = state.selection.main;
    if (selection.anchor != selection.head)
      return false;
    const line = doc.lineAt(selection.head);
    const lineContent = line.text;
    const taskListMatch = lineContent.match(/^(\s*)([-*+] \[.\])\s/);
    if (taskListMatch) {
      const [, indent, listMarker] = taskListMatch;
      let inserted = "\n" + indent + "  ";
      view.dispatch({
        changes: [{ from: selection.anchor, insert: inserted }],
        selection: { anchor: selection.anchor + inserted.length, head: selection.anchor + inserted.length },
        userEvent: "EasyTyping.handleShiftEnter"
      });
      return true;
    }
    return false;
  }
  goNewLineAfterCurLine(view) {
    const state = view.state;
    const doc = state.doc;
    const selection = state.selection.main;
    const line = doc.lineAt(selection.head);
    const lineContent = line.text;
    const listMatch = lineContent.match(/^(\s*)([-*+] \[.\]|[-*+]|\d+\.)\s/);
    const quoteMatch = lineContent.match(/^(\s*)(>+ ?)/);
    let changes;
    let newCursorPos;
    let prefix = "";
    if (listMatch) {
      const [, indent, listMarker] = listMatch;
      if (["-", "*", "+"].includes(listMarker)) {
        prefix = indent + listMarker + " ";
      } else if (listMarker.match(/[-*+] \[.\]/)) {
        prefix = indent + listMarker.replace(/\[.\]/g, "[ ]") + " ";
      } else {
        prefix = indent + (parseInt(listMarker) + 1) + ". ";
      }
    } else if (quoteMatch) {
      prefix = quoteMatch[1] + quoteMatch[2];
    }
    changes = [{ from: line.to, insert: "\n" + prefix }];
    newCursorPos = line.to + 1 + prefix.length;
    const tr = state.update({
      changes,
      selection: { anchor: newCursorPos, head: newCursorPos },
      userEvent: "EasyTyping.goNewLineAfterCurLine"
    });
    view.dispatch(tr);
    return true;
  }
  handleBackspace(view) {
    const state = view.state;
    const doc = state.doc;
    const selection = state.selection.main;
    if (selection.anchor != selection.head)
      return false;
    const line = doc.lineAt(selection.from);
    const lineContent = line.text;
    const listMatchEmpty = lineContent.match(/^\s*([-*+]|\d+\.) $/);
    const quoteMatchEmpty = lineContent.match(/^(\s*)(>+) ?$/);
    if ((listMatchEmpty || quoteMatchEmpty) && selection.anchor == line.to) {
      let changes;
      let newCursorPos;
      if (quoteMatchEmpty) {
        const quote_indent_str = quoteMatchEmpty[1];
        const quoteLevel = quoteMatchEmpty[2].length;
        if (quoteLevel > 1) {
          if (line.number > 1) {
            const prevLine = doc.line(line.number - 1);
            const prevLineContent = prevLine.text;
            const prevQuoteMatchEmpty = prevLineContent.match(/^(\s*)(>+) ?$/);
            if (prevQuoteMatchEmpty && prevQuoteMatchEmpty[1] == quote_indent_str && prevQuoteMatchEmpty[2].length == quoteLevel) {
              let temp_line = quote_indent_str + ">".repeat(quoteLevel - 1) + " ";
              let inseted = temp_line + "\n" + temp_line;
              changes = [{ from: prevLine.from, to: line.to, insert: inseted }];
              newCursorPos = prevLine.from + inseted.length;
            } else {
              const newQuotePrefix = ">".repeat(quoteLevel - 1) + " ";
              changes = [{ from: line.from, to: line.to, insert: newQuotePrefix }];
              newCursorPos = line.from + newQuotePrefix.length;
            }
          } else {
            const newQuotePrefix = ">".repeat(quoteLevel - 1) + " ";
            changes = [{ from: line.from, to: line.to, insert: newQuotePrefix }];
            newCursorPos = line.from + newQuotePrefix.length;
          }
        } else {
          if (line.number > 1) {
            const prevLine = doc.line(line.number - 1);
            const prevLineContent = prevLine.text;
            const prevQuoteMatch = prevLineContent.match(/^\s*(>+)/);
            if (prevQuoteMatch) {
              changes = [{ from: prevLine.to, to: line.to, insert: "" }];
              newCursorPos = prevLine.to;
            } else {
              changes = [{ from: line.from, to: line.to, insert: "" }];
              newCursorPos = line.from;
            }
          } else {
            changes = [{ from: line.from, to: line.to, insert: "" }];
            newCursorPos = line.from;
          }
        }
      } else {
        if (line.number > 1) {
          const prevLine = doc.line(line.number - 1);
          const prevLineContent = prevLine.text;
          const prevListMatch = prevLineContent.match(/^\s*([-*+]|\d+\.)\s/);
          if (prevListMatch) {
            changes = [{ from: prevLine.to, to: line.to, insert: "" }];
            newCursorPos = prevLine.to;
          } else {
            changes = [{ from: line.from, to: line.to, insert: "" }];
            newCursorPos = line.from;
          }
        } else {
          changes = [{ from: line.from, to: line.to, insert: "" }];
          newCursorPos = line.from;
        }
        let nextLineNumber = line.number + 1;
        const currentIndent = lineContent.match(/^\s*/)[0];
        const currentListMatch = lineContent.match(/^\s*(\d+)\.\s/);
        let expectedNextNumber = currentListMatch ? parseInt(currentListMatch[1], 10) + 1 : null;
        while (nextLineNumber <= doc.lines && expectedNextNumber !== null) {
          const nextLine = doc.line(nextLineNumber);
          const nextLineContent = nextLine.text;
          const nextListMatch = nextLineContent.match(/^\s*(\d+)\.\s/);
          if (nextListMatch) {
            const nextIndent = nextLineContent.match(/^\s*/)[0];
            if (nextIndent !== currentIndent) {
              break;
            }
            const nextListNumber = parseInt(nextListMatch[1], 10);
            if (nextListNumber === expectedNextNumber) {
              const newNextLineContent = nextLineContent.replace(/^\s*\d+\.\s/, `${nextIndent}${nextListNumber - 1}. `);
              changes.push({ from: nextLine.from, to: nextLine.to, insert: newNextLineContent });
              expectedNextNumber++;
            } else {
              break;
            }
          } else {
            break;
          }
          nextLineNumber++;
        }
      }
      const tr = state.update({
        changes,
        selection: { anchor: newCursorPos, head: newCursorPos },
        userEvent: "EasyTyping.handleBackspace"
      });
      view.dispatch(tr);
      return true;
    }
    return false;
  }
  isCurrentFileExclude() {
    if (this.CurActiveMarkdown == "") {
      let file = this.app.workspace.getActiveFile();
      if (file != null && this.CurActiveMarkdown != file.path) {
        this.CurActiveMarkdown = file.path;
      } else {
        return true;
      }
    }
    let excludePaths = this.settings.ExcludeFiles.split("\n");
    for (let epath of excludePaths) {
      if (epath.charAt(0) == "/")
        epath = epath.substring(1);
      if (this.CurActiveMarkdown == epath)
        return true;
      let len = epath.length;
      if (this.CurActiveMarkdown.substring(0, len) == epath && (this.CurActiveMarkdown.charAt(len) == "/" || this.CurActiveMarkdown.charAt(len) == "\\" || epath.charAt(len - 1) == "/" || epath.charAt(len - 1) == "\\")) {
        return true;
      }
    }
    return false;
  }
  switchAutoFormatting() {
    this.settings.AutoFormat = !this.settings.AutoFormat;
    let status = this.settings.AutoFormat ? "on" : "off";
    new import_obsidian3.Notice("EasyTyping: Autoformat is " + status + "!");
  }
  convert2CodeBlock(editor) {
    var _a;
    if ((_a = this.settings) == null ? void 0 : _a.debug)
      console.log("----- EasyTyping: insert code block-----");
    if (editor.somethingSelected && editor.getSelection() != "") {
      let selected = editor.getSelection();
      let selectedRange = editor.listSelections()[0];
      let anchor = selectedRange.anchor;
      let head = selectedRange.head;
      let replacement = "```\n" + selected + "\n```";
      if (anchor.line > head.line || anchor.line == head.line && anchor.ch > head.ch) {
        let temp = anchor;
        anchor = head;
        head = temp;
      }
      let dstLine = anchor.line;
      if (anchor.ch != 0) {
        replacement = "\n" + replacement;
        dstLine += 1;
      }
      if (head.ch != editor.getLine(head.line).length) {
        replacement = replacement + "\n";
      }
      editor.replaceSelection(replacement);
      editor.setCursor({ line: dstLine, ch: 3 });
    } else {
      let cs = editor.getCursor();
      let replace = "```\n```";
      let dstLine = cs.line;
      if (cs.ch != 0) {
        replace = "\n" + replace;
        dstLine += 1;
      }
      if (cs.ch != editor.getLine(cs.line).length) {
        replace = replace + "\n";
      }
      editor.replaceRange(replace, cs);
      editor.setCursor({ line: dstLine, ch: 3 });
    }
  }
  refreshSelectionReplaceRule() {
    this.SelectionReplaceMap = new Map(this.selectionReplaceMapInitalData);
    for (let i = 0; i < this.settings.userSelRepRuleTrigger.length; i++) {
      let trigger = this.settings.userSelRepRuleTrigger[i];
      let lefts = this.settings.userSelRepRuleValue[i].left;
      let rights = this.settings.userSelRepRuleValue[i].right;
      this.SelectionReplaceMap.set(trigger, { left: lefts, right: rights });
    }
  }
  addUserSelectionRepRule(trigger, left, right) {
    if (this.settings.userSelRepRuleTrigger.includes(trigger))
      return false;
    this.settings.userSelRepRuleTrigger.push(trigger);
    this.settings.userSelRepRuleValue.push({ left, right });
    this.refreshSelectionReplaceRule();
    return true;
  }
  deleteUserSelectionRepRule(idx) {
    if (idx < 0 || idx >= this.settings.userSelRepRuleTrigger.length)
      return;
    this.settings.userSelRepRuleTrigger.splice(idx, 1);
    this.settings.userSelRepRuleValue.splice(idx, 1);
    this.refreshSelectionReplaceRule();
  }
  updateUserSelectionRepRule(idx, left, right) {
    if (idx < 0 || idx >= this.settings.userSelRepRuleTrigger.length)
      return;
    this.settings.userSelRepRuleValue[idx].left = left;
    this.settings.userSelRepRuleValue[idx].right = right;
    this.refreshSelectionReplaceRule();
  }
  refreshUserDeleteRule() {
    this.UserDeleteRules = ruleStringList2RuleList(this.settings.userDeleteRulesStrList);
  }
  addUserDeleteRule(before, after) {
    this.settings.userDeleteRulesStrList.push([before, after]);
    this.refreshUserDeleteRule();
  }
  deleteUserDeleteRule(idx) {
    if (idx >= this.settings.userDeleteRulesStrList.length || idx < 0)
      return;
    this.settings.userDeleteRulesStrList.splice(idx, 1);
    this.refreshUserDeleteRule();
  }
  updateUserDeleteRule(idx, before, after) {
    if (idx >= this.settings.userDeleteRulesStrList.length || idx < 0)
      return;
    this.settings.userDeleteRulesStrList[idx][0] = before;
    this.settings.userDeleteRulesStrList[idx][1] = after;
    this.refreshUserDeleteRule();
  }
  refreshUserConvertRule() {
    this.UserConvertRules = ruleStringList2RuleList(this.settings.userConvertRulesStrList);
  }
  addUserConvertRule(before, after) {
    this.settings.userConvertRulesStrList.push([before, after]);
    this.refreshUserConvertRule();
  }
  deleteUserConvertRule(idx) {
    if (idx >= this.settings.userConvertRulesStrList.length || idx < 0)
      return;
    this.settings.userConvertRulesStrList.splice(idx, 1);
    this.refreshUserConvertRule();
  }
  getCommandNameMap() {
    const lang = window.localStorage.getItem("language");
    let command_name_map_en = /* @__PURE__ */ new Map([
      ["format_article", "Format current article"],
      ["format_selection", "Format selected text or current line"],
      ["delete_blank_line", "Delete blank lines of the selected or whole article"],
      ["insert_codeblock", "Insert code block w/wo selection"],
      ["switch_autoformat", "Switch autoformat"],
      ["paste_wo_format", "Paste without format"],
      ["toggle_comment", "Toggle comment"],
      ["goto_new_line_after_cur_line", "Go to new line after current line"],
      ["select_block", "Select current text block"]
    ]);
    let command_name_map_zh_TW = /* @__PURE__ */ new Map([
      ["format_article", "\u683C\u5F0F\u5316\u5168\u6587"],
      ["format_selection", "\u683C\u5F0F\u5316\u9078\u4E2D\u90E8\u5206/\u7576\u524D\u884C"],
      ["delete_blank_line", "\u522A\u9664\u9078\u4E2D\u90E8\u5206/\u5168\u6587\u7684\u591A\u9918\u7A7A\u767D\u884C"],
      ["insert_codeblock", "\u63D2\u5165\u4EE3\u78BC\u584A"],
      ["switch_autoformat", "\u5207\u63DB\u81EA\u52D5\u683C\u5F0F\u5316\u958B\u95DC"],
      ["paste_wo_format", "\u7121\u683C\u5F0F\u5316\u7C98\u8CBC"],
      ["toggle_comment", "\u5207\u63DB\u8A3B\u91CB"],
      ["goto_new_line_after_cur_line", "\u8DF3\u5230\u7576\u524D\u884C\u5F8C\u7684\u65B0\u884C"],
      ["select_block", "\u9078\u64C7\u7576\u524D\u6587\u672C\u584A"]
    ]);
    let command_name_map_zh = /* @__PURE__ */ new Map([
      ["format_article", "\u683C\u5F0F\u5316\u5168\u6587"],
      ["format_selection", "\u683C\u5F0F\u5316\u9009\u4E2D\u90E8\u5206/\u5F53\u524D\u884C"],
      ["delete_blank_line", "\u522A\u9664\u9009\u4E2D\u90E8\u5206/\u5168\u6587\u7684\u591A\u4F59\u7A7A\u767D\u884C"],
      ["insert_codeblock", "\u63D2\u5165\u4EE3\u7801\u5757"],
      ["switch_autoformat", "\u5207\u6362\u81EA\u52A8\u683C\u5F0F\u5316\u5F00\u5173"],
      ["paste_wo_format", "\u65E0\u683C\u5F0F\u5316\u7C98\u8D34"],
      ["toggle_comment", "\u5207\u6362\u6CE8\u91CA"],
      ["goto_new_line_after_cur_line", "\u8DF3\u5230\u5F53\u524D\u884C\u540E\u65B0\u884C"],
      ["select_block", "\u9009\u62E9\u5F53\u524D\u6587\u672C\u5757"]
    ]);
    let command_name_map_ru = /* @__PURE__ */ new Map([
      ["format_article", "\u0424\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0441\u0442\u0430\u0442\u044C\u044E"],
      ["format_selection", "\u0424\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442 \u0438\u043B\u0438 \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443"],
      ["delete_blank_line", "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043F\u0443\u0441\u0442\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u043C \u0438\u043B\u0438 \u0432\u0441\u0435\u0439 \u0441\u0442\u0430\u0442\u044C\u0435"],
      ["insert_codeblock", "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0431\u043B\u043E\u043A \u043A\u043E\u0434\u0430 \u0441/\u0431\u0435\u0437 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435\u043C"],
      ["switch_autoformat", "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0430\u0432\u0442\u043E\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435"],
      ["paste_wo_format", "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0431\u0435\u0437 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F"],
      ["toggle_comment", "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439"],
      ["goto_new_line_after_cur_line", "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043D\u043E\u0432\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u0435 \u043F\u043E\u0441\u043B\u0435 \u0442\u0435\u043A\u0443\u0449\u0435\u0439"],
      ["select_block", "\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0438\u0439 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u0431\u043B\u043E\u043A"]
    ]);
    let command_name_map = command_name_map_en;
    if (lang == "zh") {
      command_name_map = command_name_map_zh;
    } else if (lang == "zh-TW") {
      command_name_map = command_name_map_zh_TW;
    } else if (lang == "ru") {
      command_name_map = command_name_map_ru;
    }
    return command_name_map;
  }
  updateUserConvertRule(idx, before, after) {
    if (idx >= this.settings.userConvertRulesStrList.length || idx < 0)
      return;
    this.settings.userConvertRulesStrList[idx][0] = before;
    this.settings.userConvertRulesStrList[idx][1] = after;
    this.refreshUserConvertRule();
  }
  async loadSettings() {
    try {
      const userData = await this.loadData();
      this.settings = Object.assign({}, DEFAULT_SETTINGS, userData || {});
    } catch (error) {
      console.error("EasyTyping: Failed to load settings, using defaults:", error);
      this.settings = Object.assign({}, DEFAULT_SETTINGS);
    }
  }
  async saveSettings() {
    await this.saveData(this.settings);
  }
};


/* nosourcemap */