Нужна помощь в изменении существующего расширения поиска регулярных выражений - PullRequest
0 голосов
/ 17 августа 2010

Я бы хотел ускорить разработку расширений, изменив существующее расширение.У меня нет опыта работы с JavaScript, но у меня есть опыт работы с C, C ++, Java и Python.Я выбрал расширение Regular Expression Search от bizsimon.Вот код JavaScript скрипта содержимого, который я пытаюсь понять.

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { sendResponse(chrome_regex_search(request.exp)); });

function chrome_regex_search(exp) {
 var tw=document.createTreeWalker(document.getElementsByTagName("body")[0], NodeFilter.SHOW_TEXT, null, false); 
 while (node = tw.nextNode()) {
  node.parentNode.innerHTML=node.parentNode.innerHTML.replace(/<font class="chrome_search_highlight"[^>]*>(.+)<\/font>/igm, '$1');
 }

 try {
  var pattern=eval("/(>[^<]*)("+exp+")([^<]*<)/igm");
  var tw=document.createTreeWalker(document.getElementsByTagName("body")[0], NodeFilter.SHOW_TEXT, null, false); 
  while(node=tw.nextNode()) { 
   node.parentNode.innerHTML=node.parentNode.innerHTML.replace(pattern, '$1<font class="chrome_search_highlight" style="background: yellow">$2</font>$3'); 
  }
  return {"count": document.getElementsByClassName("chrome_search_highlight").length};
 } catch(e) {
  return {"count": 0};
 }  
}

И вот мои вопросы:

  1. Что делает этот код?

    node.parentNode.innerHTML = node.parentNode.innerHTML.replace (/]*>(.+) / igm, '$ 1');

  2. Мне бы хотелосьдобавить кнопки навигации, которые позволяют пользователю переходить от одного результата поиска к другому.Какие изменения требуются в скрипте?Я предполагаю, что теперь мне нужно будет сохранить состояние, которое запоминает, какой результат поиска в настоящее время посещается.Как заставить браузер переходить с одного результата поиска на другой?
  3. Буду очень признателен за любые полезные комментарии, которые помогут понять код или даже прохождение кода.

Ответы [ 2 ]

1 голос
/ 18 августа 2010
  • Вопрос № 1: как сказал Джейсон С., он удаляет тег <font>: особенно те, которые относятся к классу "chrome_search_highlight". Другими словами, он проходит по дереву узлов элемента body и удаляет выделенные фрагменты предыдущего поиска.
  • Затем во втором цикле обхода дерева добавляются те же самые шрифтовые теги вокруг вхождений предоставленного регулярного выражения. Загадочная группа (>[^<]*) до и аналогичная группа после, регулярное выражение существует для того, чтобы убедиться, что вы соответствуете фактическому тексту страницы, а не имени элемента HTML, имени или значению атрибута. То есть поисковому запросу регулярного выражения должно предшествовать >, за которым не следует < до тех пор, пока поисковое совпадение не будет.

В кровать ...

1 голос
/ 17 августа 2010

для вашего вопроса # 1: этот код выглядит так, как будто он пытается убрать тег <font> из HTML, например изменить <font ...>real content here</font> на real content here.

просто дополнительный комментарий: предпочитайте использовать от new Regexp(somestring) до eval("/"+somestring+"/"), так как eval может привести к возможной дыре в безопасности. (подробности синтаксиса см. Документы MDC )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...