HTML Tidy - Добавлять открывающие теги вместо удаления закрывающих тегов? - PullRequest
2 голосов
/ 01 мая 2010

Можно ли настроить HTML Tidy следующим образом:

Учитывая HTML:

lorem ipsum</em> dolar sit amet.</p>

Чтобы он генерировал

<p><em>lorem ipsum</em> dolar sit amet.</p>

Вместо того, чтобы просто удалить закрывающие теги?

Большое спасибо

Мэтт

Ответы [ 2 ]

2 голосов
/ 01 мая 2010

Я в основном согласен с ответом Sky Sanders. кроме:

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

Вы можете написать синтаксический анализатор, который обеспечивает описанную функциональность, без необходимости выводить какие-либо намерения, работая просто детерминистически. Можно легко (да, более или менее легко :)) написать алгоритм, который делает эту работу. Идея была бы:

Добавление закрывающих тегов

В конце концов, это можно сделать с помощью HTML Tidy, и каждый браузер / парсер делает это неявно (я не говорю о допустимом XHTML здесь):

<div>some <span><em>text</span> here</div>

получает

<div>some <span><em>text</em></span> here</div>

Добавление открывающих тегов

Теперь мы можем создать алгоритм, который анализирует следующее, начиная с конца строки и выполняя обратный поиск:

<div>some <span>text</em></span> here</div>

для получения следующего, потому что он видит, что тег em встроен в тег span.

<div>some <span><em>text</em></span> here</div>

Объединение этих двух

Теперь мы должны написать алгоритм, который добавляет и отсутствующие закрывающие и открывающие теги. Теперь давайте возьмем этот HTML-фрагмент:

<div>some <span>text</em> here</div>

Сначала примените метод «добавить все отсутствующие закрывающие теги»:

<div>some <span>text</em> here</span></div>

Алгоритм здесь предполагает, что каждый закрывающий и открывающий тег, следующий за <span>, внедряется в span. Он останавливается только в том случае, если видит закрывающий тег для некоторого открывающего тега, который был до <span>. В данном случае это </div>, который имел действительный открывающий тег <div> ранее. Затем примените ту же семантику при обратном поиске, как описано ранее:

<div>some <span><em>text</em> here</span></div>

и вуаля.

Имеет ли это смысл?

По моему мнению: Нет. Это технически возможно, но не стоит усилий. Вы должны будете реализовать свой собственный анализатор вместе с этими псевдоинтеллектуальными методами, описанными выше. Кроме того, это применило бы к html семантику, которой нет в любом случае: каждый браузер / парсер просто игнорирует изолированные закрывающие теги, так почему вы хотите обратить на них внимание?

Если я еще не смог убедить вас, рассмотрите семантику html:

some <b>text</b> here читается как: «напечатать« некоторые ». Начать рендеринг жирным шрифтом. Напечатать« текст ». Остановить рендеринг жирным шрифтом. Напечатать« здесь ».»

В то время как:

some text</b> here читается как: «напечатать« некоторый текст ». Прекратить выделение жирным шрифтом». «Что? Я даже не начал выдавать что-нибудь смелое !? Я просто проигнорирую это ...»:)

2 голосов
/ 01 мая 2010

Нет. HTML Tidy не предоставляет эту опцию.

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

Определение того, когда тег должен быть закрыт, должен ли он быть закрыт в этой точке или нет, может быть выполнено парсером с использованием правил html.

...