Оптимизировать характеристики замены текста словарем - PullRequest
1 голос
/ 17 мая 2019

Я разрабатываю расширение для 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 Ответ

0 голосов
/ 18 мая 2019

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

Это намного быстрее, потому что он запоминает регулярные выражения, так что их не нужно создавать заново на каждом узле.

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

function skim() {
  dicomap.map((replace_entry)=>{
    tree.currentNode.nodeValue = tree.currentNode.nodeValue.replace(replace_entry[0],replace_entry[mode]);
  });

  if(tree.nextNode()) setTimeout(skim);
}
skim();
...