如何在文本区域的自动替换脚本中使用直引号和智能引号?

How to use straight and smart quotes in auto-replace script for textarea?

我真的再次陷入了如何正确组合这些行以自动将直引号替换为文本区域中的智能引号的问题。

它早些时候工作,但是在我添加一行以修复光标在替换字符后移动到末尾之后。

这是目前的样子:

    var area = document.getElementById("textarea1");

    var getCount = function (str, search) {
        return str.split(search).length - 1;
    };

    var replaceText = function (search, replaceWith) {
        if (area.value.indexOf(search) >= 0) {
            var start = area.selectionStart;
            var end = area.selectionEnd;
            var textBefore = area.value.substr(0, end);
            var lengthDiff = (replaceWith.length - search.length) * getCount(textBefore, search);
            area.value = area.value.replace(search, replaceWith);
            area.selectionStart = start + lengthDiff;
            area.selectionEnd = end + lengthDiff;
        }
    };

    area.addEventListener("keypress", function (e) {
        setTimeout(function () {
            replaceText(" ,", ",")
            replaceText(" ;", ";")
            replaceText(" .", ".")
            replaceText("  ", " ")
            replaceText("--", "—")
            replaceText(/(^|[-\u2014\s(\["])'/g, "\u2018")
            replaceText(/'/g, "\u2019")
            replaceText(/(^|[-\u2014/\[(\u2018\s])"/g, "\u201c")
            replaceText(/"/g, "\u201d");
        }, 0)
    });
<textarea id="textarea1" cols="40" rows="8"></textarea>

逗号、分号、句点、长破折号和双空格有效already.But它不适用于引号。我该怎么做才能更正这些正则表达式行?

这正是我卡住的地方:

replaceText(/(^|[-\u2014\s(\["])'/g, "\u2018")
replaceText(/'/g, "\u2019")
replaceText(/(^|[-\u2014/\[(\u2018\s])"/g, "\u201c")
replaceText(/"/g, "\u201d");

提前致谢

在您的 replaceText 中,您需要区分传递正则表达式或字符串的时间。 .indexOf() 不接受正则表达式。

此外,我建议将按键事件更改为 input

片段:

window.addEventListener('DOMContentLoaded', function(e) {
  var area = document.getElementById("textarea1");

  var getCount = function (str, search) {
      return str.split(search).length - 1;
  };

  var replaceText = function (search, replaceWith) {
      if (typeof(search) == "object") {
          area.value = area.value.replace(search, replaceWith);
          return;
      }
      if (area.value.indexOf(search) >= 0) {
          var start = area.selectionStart;
          var end = area.selectionEnd;
          var textBefore = area.value.substr(0, end);
          var lengthDiff = (replaceWith.length - search.length) * getCount(textBefore, search);
          area.value = area.value.replace(search, replaceWith);
          area.selectionStart = start + lengthDiff;
          area.selectionEnd = end + lengthDiff;
      }
  };

  area.addEventListener("input", function (e) {
      replaceText(" ,", ",");
      replaceText(" ;", ";");
      replaceText(" .", ".");
      replaceText("  ", " ");
      replaceText("--", "—");
      replaceText(/(^|[-\u2014\s(\["])'/g, "\u2018");
      replaceText(/'/g, "\u2019");
      replaceText(/(^|[-\u2014/\[(\u2018\s])"/g, "\u201c");
      replaceText(/"/g, "\u201d");
  });
});
<textarea id="textarea1" cols="40" rows="8"></textarea>