Как я могу получить действительные первые 300 символов HTML или Markdown? - PullRequest
2 голосов
/ 02 октября 2010

Я создаю блог (и остальную часть сайта), используя Python и Flask . Сообщения в блоге написаны в Markdown и преобразованы в HTML с использованием креативно названного Markdown в Python . Уценка (для будущего редактирования) и HTML (для отображения) хранятся в базе данных.

Я хочу иметь возможность автоматически получать первые 300 символов текста (или 500, или 200 - я не определил число) для использования на страницах, когда я не хочу показать полный пост в блоге (как на первой странице). Однако проблема в том, что любой простой способ сделать это потенциально оставит меня с неверным HTML или Markdown :

HTML:

<p><em>Here</em> is <strong>formatted</strong> text.</p>

Если я получу первые десять символов этого, это оставит меня на полпути через в формате , и мне как-то понадобится закрыть теги <strong> и <p>.

уценка:

*Here* is **formatted** text.

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

Есть ли какой-нибудь способ, которым я могу сделать это без необходимости писать анализатор HTML или Markdown? Или мне лучше было бы просто преобразовать HTML в простой текст?

Ответы [ 4 ]

2 голосов
/ 02 октября 2010

Если вы согласны с тем, что сводки представляют собой просто текст, тогда ответ Адама, безусловно, лучший - сначала преобразуйте его в простой текст, а затем обрежьте.

Если вы хотите сохранить форматирование, то вот еще одинidea:

  • Преобразование из Markdown в HTML.
  • Запуск HTML-кода с помощью синтаксического анализатора, который выдаст вам поток токенов (например, Perl's HTML :: TokeParser:: Simple , но я уверен, что есть что-то сопоставимое для Python - или вы можете превратить любой анализатор событий в один из них).
  • Когда вы получите токены элемента, скопируйте их ввывод, сохраняя при этом стопку незакрытых тегов.
  • Когда вы получаете текстовые токены, скопируйте их в вывод, сохраняя при этом количество выводимого текста.
  • Когда выполучите текстовый токен, который поставит вас за предел, скопируйте только достаточное количество символов, чтобы достичь предела, сгенерируйте закрывающие теги для любых незамкнутых тегов в вашем стеке и остановите обработку.

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

2 голосов
/ 02 октября 2010

Действительно, самым простым и безопасным способом было бы сгенерировать HTML из источника Markdown, преобразовать его в простой текст (см. html2plaintext ) и затем сократить его до 300 символов.

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

1 голос
/ 02 октября 2010

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

libxml поддерживает синтаксический анализ html на основе событий.Я уверен, что есть один для уценки, но не посмотрел.

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

1 голос
/ 02 октября 2010

не знаю, применимо ли это в Python, но этот учебник может вам помочь.По сути, он сканирует незамеченный тег после обрезки текста и автоматически закрывает его.

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