Привет! У меня есть несколько постов, импортированных из другого программного обеспечения для форумов, в заголовках которых есть переносы строк. В превью поста они отображаются корректно, но в окончательном «запечённом» посте они не рендерятся как заголовки. Я наблюдаю эту проблему как на своём форуме, обновлённом вчера, так и здесь, на Discourse Meta:
Тест заголовка с переносами строк
Обычный абзац.
Заголовок без переносов строк
Тег <h2> остаётся пустым, а текст после него оборачивается в <p>:
<h2 dir="ltr">
</h2><p dir="ltr">Тест заголовка с переносами строк</p>
На 99% уверен, что это недавняя регрессия, так как я специально проверял заголовки в импортированных постах от того же пользователя в процессе миграции, и мы с ним оба помним, что они отображались корректно.
2 лайка
sam
(Sam Saffron)
11.Апрель.2023 01:16:39
3
Хм, учитывая упомянутые выше вещи, связанные с направлением слева направо, @Osama , это может быть связано с недавно добавленным CSS-переключателем?
2 лайка
Osama
12.Апрель.2023 01:56:27
4
Думаю, нет, потому что итоговый/обработанный HTML поста неверен, а CSS-переключатель (будь то старый или новый) вообще не участвует в процессе обработки поста.
^ Текст внутри тега <p> должен находиться внутри тега <h2>, и тега <p> вообще быть не должно (на мой взгляд).
6 лайков
selase
(Selase Krakani)
08.Май.2023 18:15:47
5
Это, похоже, происходит во время обработки, а именно при парсинге Markdown.
sanitized = markdown(working_text, options)
doc = Nokogiri::HTML5.fragment(sanitized)
add_nofollow = !options[:omit_nofollow] && SiteSetting.add_rel_nofollow_to_user_content
add_rel_attributes_to_user_content(doc, add_nofollow)
strip_hidden_unicode_bidirectional_characters(doc)
sanitize_hotlinked_media(doc)
add_mentions(doc, user_id: opts[:user_id]) if SiteSetting.enable_mentions
scrubber = Loofah::Scrubber.new { |node| node.remove if node.name == "script" }
loofah_fragment = Loofah.fragment(doc.to_html)
loofah_fragment.scrub!(scrubber).to_html
Передача заголовка с переносами строк в PrettyText.markdown возвращает содержимое заголовка, обернутое в тег p.
Затем при очистке параграф извлекается из тега заголовка, что приводит к следующему результату:
Думаю, это происходит потому, что параграф внутри тега заголовка не соответствует спецификации?
Я всё ещё изучаю код парсера Markdown, чтобы понять, почему содержимое изначально оборачивается в тег p.
2 лайка
sam
(Sam Saffron)
09.Май.2023 00:02:51
7
О, это очень связано с:
Took a quick look out of curiosity. It looks like an issue with the Nokogiri library.
[image]
From what uses Discourse here:
Loofah.fragment uses Nokogiri’s HTML4 parser.
This could be fixed using Loofah.html5_fragment as long as Nokogiri >= 1.14.0 and Loofah >= 2.21.0. Discourse already uses Nokogiri::HTML5.fragment; that would make sense.
Note: Loofah 2.21.0 is not yet released; currently in RC1.
Я готов подождать ещё несколько недель, пока Loofah не выпустит обновление.
Напишу твит Майку, чтобы упомянуть об этом.
2 лайка
Selase Krakani, пост:5, тема:261043:
Думаю, это происходит потому, что абзац внутри тега заголовка не соответствует спецификации?
Привет! Спасибо, что разобрались в этом. HTML не обращает внимания на переносы строк, поэтому технически это корректно:
<h2>
Heading test with line breaks
</h2>
Кажется, проблема в парсере Markdown, который работает после или внутри HTML-парсера и генерирует теги <p> для переносов строк.
1 лайк
nat
(Natalie T)
20.Июнь.2023 12:40:21
11
Привет! Мы исправили это с помощью
main ← loofah
merged 01:49AM - 20 Jun 23 UTC
https://meta.discourse.org/t/markdown-preview-and-result-differ/263878
The re… sult of this markdown had different results in the composer preview and the post. This is solved by updating Loofah to the latest version and using html5 fragments like our user had reported. While the change was only needed in [cooked_post_processor.rb](https://github.com/discourse/discourse/pull/21500/files#diff-67de7f44aa04f02ceba9770e5d83b4465add3bd4297be871f94a2233cd4831a7), I've updated the other areas of our codebase to also use the html5 fragment.
> <strike>
>
> Additionally, how come
>
> ```qml
> import QtQuick
> import QtQuick.Controls 2.15 as QQC2
> import QtQuick.Layouts
> import QtPositioning
> ```
>
> and prepension of `QQC2` before `Action`, `Button`, `ApplicationWindow`, and `Frame` doesn't work, whereas
>
> ```qml
> import QtQuick
> import QtQuick.Controls
> import QtQuick.Layouts
> import QtPositioning
> import QtQuick.Controls 2.15 as QQC2
> ```
>
> and addition of `QQC2.Button` (per https://discuss.kde.org/t/qml-pyqt6-cant-get-native-control-appearance/1240/2?u=rokejulianlockhart) does?
>
> </strike>
<img width="643" alt="Screenshot 2023-05-11 at 3 15 36 PM" src="https://github.com/discourse/discourse/assets/1555215/e7087502-b0a1-4219-be0b-ad3904cc6a6f">
Related:
- ~~https://github.com/discourse/discourse/pull/21500~~
- https://github.com/discourse/discourse-footnote/pull/62
- https://github.com/discourse/discourse-bbcode/pull/50
как видно здесь:
Заголовок с разрывами строк
Обычный абзац.
Заголовок без разрывов строк
8 лайков
Рад это слышать, спасибо @nat ! Это требует перепрошивки постов?
2 лайка
nat
(Natalie T)
20.Июнь.2023 13:21:14
13
Да, это требует перепекания — мы не можем сделать это автоматически с помощью этого исправления, так как это дорогостоящая операция.
3 лайка
nat
(Natalie T)
Закрыл(а) тему
22.Июнь.2023 12:40:48
14
Эта тема была автоматически закрыта через 2 дня. Новые ответы больше не принимаются.