разобрать вложенный li внутри ul и ol - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть сценарий, в котором когда li попадает под ul , мне нужно заменить его точкой (.), А когда приходит li и ol , мне нужно заменить его на число.

Но проблема в том, что ...

1) Это не делает для вложенного li

2) Добавляется на том же уровне. Тот же уровень означает, что как только он найдет li, он сначала добавит точка (.) , а затем добавит число .

Что я хочу

1) Всякий раз, когда li входит в ul, следует добавить точку (.).

2) Всякий раз, когда li входит внутрь ol, следует добавить число.

data = "<ol>\n<li>Introduction\n<ol>\n<li>hyy ssss</li>\n</ol>\n</li>\n<li>Description</li>\n<li>Observation</li>\n<li>Results</li>\n<li>Summary</li>\n</ol>\n<ul>\n<li>Introduction</li>\n<li>Description\n<ul>\n<li>Observation\n<ul>\n<li>Results\n<ul>\n<li>Summary</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n</li>\n<li>Overview</li>\n</ul>\n<p>All the testing regarding bullet points would have been covered with the above content. Hence publishing this content will make an entry in in the selected  page, cricket page and so on.</p>\n"

    content = Nokogiri::HTML.parse(data)
    content.at('ul').children.xpath("//li").each { |li| li.inner_html="\u2022 "+li.inner_html }
    content.at('ol').children.xpath("//li").each_with_index { |li,index| li.inner_html="#{index} "+li.inner_html }

1 Ответ

0 голосов
/ 25 апреля 2018

Возможно, вам нужно это:

content.css('ol').reverse.each do |ol| 
  ol.css('> li').each_with_index { |li,index| li.inner_html="#{index + 1} "+li.inner_html }
end
content.css('ul > li').reverse.each { |li| li.inner_html="\u2022 "+li.inner_html }

puts content

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<ol>
  <li>1 Introduction
    <ol>
      <li>1 hyy ssss</li>
    </ol>
  </li>
  <li>2 Description</li>
  <li>3 Observation</li>
  <li>4 Results</li>
  <li>5 Summary</li>
</ol>
<ul>
  <li>• Introduction</li>
  <li>• Description
    <ul>
      <li>• Observation
        <ul>
          <li>• Results
            <ul>
              <li>• Summary</li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
  </li>
  <li>• Overview</li>
</ul>
</body></html>

Причина совершения reverse -
Рассмотрим дом:

<ul>
  <li>Description
    <ul>
      <li>Observation</li>
    </ul>
  </li>
</ul>

Когда вы делаете content.css('ul > li'), вы получаете в порядке [описание, наблюдение]. Без reverse, когда вы запускаете фрагмент, вы изменяете описание , но это также изменит узел object_id из наблюдение . Затем вы изменили узел наблюдения , который нигде не указан в content. Поэтому я поменял его и приобрел children перед родителями. Сделав это, я убедился, что сначала меняю дочерний элемент, а затем изменил родительский, чтобы parent знал об изменении дочернего элемента и нигде не было ни одного ссылочного узла.

Предположим, идентификатор узла описания равен 1234, а идентификатор узла наблюдения равен 2345. Когда вы мутировали описание , оно изменилось само, но также изменило и его дочерний элемент (2345). Новый идентификатор объекта может быть 3456 и 4567 соответственно. Затем вы изменили 2345 (по итерации), но это не дает никакого эффекта, потому что ваш content показывает 3456 -> 4567

Надеюсь, это имеет смысл.

...