# Проблема с рендерингом Markdown при изображении, окруженном HTML

**URL:** https://meta.discourse.org/t/markdown-rendering-issue-with-image-surrounded-with-html/152801
**Category:** Bug
**Created:** [26.Май.2020 17:21:21 UTC](https://meta.discourse.org/t/markdown-rendering-issue-with-image-surrounded-with-html/152801 "2020-05-26T17:21:21Z")
**Posts on this page:** 5
**Page:** 2

<div class="post-metadata">

### Author: ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)
#### Post date: [11.Август.2021 04:25:10 UTC](https://meta.discourse.org/t/markdown-rendering-issue-with-image-surrounded-with-html/152801/27 "2021-08-11T04:25:10Z")

</div>

Да, если вы полностью пойдете по этому пути, вам придется пожертвовать возможностью редактирования контента в Discourse ради полной целостности HTML.

Мне казалось, что может существовать некий компромисс, при котором этот подход применяется только к тегам `img` в импортированных HTML-постах.

Но сейчас я начинаю сомневаться в этом. Выделение этого подхода потребует изменений во многих частях обработки постов.

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [11.Август.2021 11:29:48 UTC](https://meta.discourse.org/t/markdown-rendering-issue-with-image-surrounded-with-html/152801/28 "2021-08-11T11:29:48Z")

</div>

> [@angus](#):
>
> Да, если говорить проще, возможно, код мог бы поддерживать загрузку горячих ссылок на изображения без необходимости преобразования `img` в markdown.

Да, я думаю, что это, вероятно, лучший вариант. Я начал работу над этим ещё в июне 2020 года, но в итоге это потребовало слишком много усилий, и мне пришлось переключиться на другие проекты. У меня было несколько подходов к разрешению URL-адресов вида `upload://` в тегах `<img`… ни один из них не идеален. Из моих заметок:

* * *

### Вариант 1 реализации:

В конвейере markdown разбирать содержимое каждого html\_block (немного злоупотребляя библиотекой `xss.js`) и обрабатывать любые теги изображений с атрибутами src вида `upload://`.

Плюсы: всё в конвейере markdown, такая обработка выполняется только для токенов html\_block

Минусы: довольно некорректное использование санитайзера `xss.js`. Это может быть не идеальный парсер HTML5

> <https://github.com/davidtaylorhq/discourse/commit/39b14af21bcc0cb442a23c45b09ddfa095c06174>
>
> This is implemented within the markdown.it pipeline. Each 'html\_block' token is …scanned for img nodes with upload-protocol src attributes. These are then translated into real URLs using the existing method.

Этот вариант можно улучшить, используя на сервере стандартную реализацию DOM на JavaScript (например, jsdom), но это кажется довольно громоздким решением.

### Вариант 2 реализации:

Разрешить атрибуты src вида `upload://` на всём протяжении конвейера markdown, а затем заменить их позже. На клиенте это на самом деле довольно просто — мы уже асинхронно заменяли URL-адреса `upload://` после обработки. На сервере это требует дополнительного шага обработки с использованием Nokogiri.

Плюсы: парсер соответствует стандартам HTML5

Минусы: различная реализация на клиенте и сервере, немного усложняет конвейер

> <https://github.com/davidtaylorhq/discourse/commit/2ae1dafeca20fdd8717fbed0eb3b6c0fa0fe0644>
>
> This is implemented outside the markdown pipeline. The upload:// src is left in …place during markdown cooking, then replaced afterwards. When cooking in the browser, this is handled in a decorateCooked method. On the server, it is handled using Nokogiri immediately after cooking.

* * *

Я думаю, что вариант 2, вероятно, стоит выбрать. Тогда нам нужно будет обновить задачу `pull_hotlinked_images`, чтобы она сохраняла теги `<img`, не заменяя их на Markdown. Надеюсь, скоро у меня найдётся время вернуться к этому 🤞

---

<div class="post-metadata">

### Author: ![mattdm](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mattdm/32/216484_2.png) [@mattdm](https://meta.discourse.org/u/mattdm)
#### Post date: [20.Август.2021 21:06:55 UTC](https://meta.discourse.org/t/markdown-rendering-issue-with-image-surrounded-with-html/152801/29 "2021-08-20T21:06:55Z")

</div>

Я действительно не понимаю, в чём здесь сложность. Очевидно, что HTML-тег изображения заменяется на markdown — например, `![](upload://6zqK52dO23i1JsYH2oyMU12U2ro.jpeg)`. Почему бы просто не добавить два символа переноса строки перед `!`? Это обеспечит корректный рендеринг и позволит функции загрузки изображений работать, предотвращая битые картинки и проблемы с межсайтовыми запросами.

Существует ли реальная, а не теоретическая ситуация, когда этот пробел может вызвать проблему? И является ли эта проблема _хуже_, чем текущее состояние плагина, когда «картинки постоянно ломаются»?

@david, вы отмечаете, что «решение с переносом строки, вероятно, не будет реализовано», потому что «для нас ключевым моментом является сохранение целостности контента». Но целостность контента уже нарушена при вставке тегов изначально. Я… действительно не понимаю, как это может быть лучше.

В данный момент _каждый раз_, когда кто-то добавляет изображение в свой пост в WordPress, картинки возвращаются битыми, и мне часто приходится сталкиваться с комментариями «картинки не работают», которые теперь часто сопровождаются ответами «да, это потому что Discourse ужасен». Я хотел бы избежать обоих этих проблем.

Я понимаю, что настройка «не загружать изображения» может служить обходным путём, но на самом деле я _хочу_, чтобы изображения загружались, поэтому надеюсь, что это можно будет использовать лишь как временное решение.

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [29.Март.2022 10:51:21 UTC](https://meta.discourse.org/t/markdown-rendering-issue-with-image-surrounded-with-html/152801/30 "2022-03-29T10:51:21Z")

</div>

Это должно быть исправлено следующим образом:

> <https://github.com/discourse/discourse/commit/720e1ca9e79a00acf72e77a42de3f421ff661081>
>
> Previously, our \`upload://\` protocol urls were only supported in markdown image …tags. This meant that our PullHotlinkedImages job was forced to convert \`\<img\` tags to markdown. Depending on the exact syntax, this can actually cause the image to break.
> 
> This commit adds support for \`upload://\` inside regular HTML \`\<img\` tags. In a future commit, we'll be able to use this to make our PullHotlinkedImages job much more robust.
> 
> Context at https://meta.discourse.org/t/152801

> <https://github.com/discourse/discourse/commit/b2a8dc4c0fb80a6ef7721b310f2c59eebb218670>
>
> Under some conditions, replacing an \`\<img\` with \`!\[\]()\` can break rendering, and… make the image disappear.
> 
> Context at https://meta.discourse.org/t/152801

Давайте попробуем это здесь на Мета.

```plaintext
<div>
Изображение в HTML-блоке:
<img src="..." width=100 height=100>
</div>

```

Изображение в HTML-блоке: ![](https://global.discourse-cdn.com/meta/original/3X/f/c/fc92fefd9e43791e7e4d0db208ecee016a228980.jpeg)

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [04.Апрель.2022 07:00:57 UTC](https://meta.discourse.org/t/markdown-rendering-issue-with-image-surrounded-with-html/152801/31 "2022-04-04T07:00:57Z")

</div>

Эта тема была автоматически закрыта через 5 дней. Новые ответы больше не принимаются.

[Previous page](https://meta.discourse.org/t/markdown-rendering-issue-with-image-surrounded-with-html/152801.md?page=1)
