Оптимизировать характеристики замены текста словарем

Я разрабатываю расширение для Firefox.

Подводя итог, скажем, это проверка орфографии, примененная к странице с большим количеством ошибок.

Но это очень медленно, потому что слишком много шагов.

(1) Я создаю TreeWalker, который фильтрует только непустые текстовые узлы

var tree = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, {
  acceptNode: function(node) {
    if (node.parentNode.nodeName !== "SCRIPT" && node.nodeValue.trim().length > 0) {
      return NodeFilter.FILTER_ACCEPT;
    }
  }
}, false);

(2) Цикл while скользит по TreeWalker

(3) В этом цикле while цикл for просматривает словарь (довольно большой) со сложным RegEx

const dico = [
  ['suffix1','suffix2','correction'],
  ['','',''],
  ['','',''],
  // a lot of lines
];

(4) текст заменен

dl = dico.length;

function skim(){
  while (tree.nextNode()) {
    for (var i=0; i < dl ; i++) {
      var r1 = new RegExp("([a-zÀ-ÖÙ-öù-üœŒ]+)?(" + dico[i][0] + ")[-/·∙.•](" + dico[i][1] + ")[-/·∙.•]?(s)?(?![a-z])", "gi");
      tree.currentNode.nodeValue = tree.currentNode.nodeValue.replace(r1, dico[i][3]);
    }
  }
}

Кроме того, я хотел бы использовать другую функцию, которая выделяет орфографические ошибки, что означает добавление большого количества узлов элементов между текстовыми узлами.

Как я могу оптимизировать это, пожалуйста? :)

На данный момент единственное решение, которое я нашел, - это упростить словарь, но я покончил с этим. И замените TreeWalker эквивалентами, но это быстрее.

Спасибо !

Всего 1 ответ


Это обновление с предложениями KostasX и Jonas Wilms.

Намного быстрее, но функция пропускает некоторые узлы и останавливается очень рано.

var timeout;

function skim() {
  if (!tree.nextNode()) { clearTimeout(timeout); }
  dicomap.map((replace_entry)=>{
    tree.currentNode.nodeValue = tree.currentNode.nodeValue.replace(replace_entry[0],replace_entry[mode]);
  });
  tree.nextNode()
  timeout = setTimeout(skim,0);
}

Есть идеи?

10000