Как получить обратно исходные «сырые» данные, создавшие пост?

Если я вставляю HTML в тему для её создания, Discourse автоматически переформатирует HTML (он его «готовит»), сохраняя часть (но не всю) исходную разметку и удаляя HTML-теги из отображения.

Есть ли способ позже получить исходный HTML, который я вставил при создании темы? Ближайший вариант, который я нашёл, — это выполнить API-запрос с параметром «raw=true» в эндпоинте и посмотреть ответ в response.data.post_stream.posts[0].raw, как описано здесь.

Однако возвращаемый «сырой» текст не является исходным HTML. Я точно не знаю, что это такое — похоже на базовую «приготовленную» тему, из которой удалены все пробелы.

Есть ли способ получить обратно тот исходный HTML, который я вставил?

Конечно, есть маршрут для просмотра исходного содержимого сообщения. Используйте своё сообщение в качестве примера. URL-адрес:

https://meta.discourse.org/t/get-back-the-real-raw-data-that-created-a-post/189183

Чтобы увидеть исходное содержимое, замените /t/slug на /raw.

https://meta.discourse.org/raw/189183

Спасибо, но это, похоже, не работает у меня. Я хотел бы получать данные, сохраняющие точный HTML-код так, как он был при первоначальной вставке — то есть, если в исходном HTML был, например, тег div, то и в возвращаемых данных должен быть этот тег div.

Например, в ответе в режиме «raw» я вижу форматирование Markdown, хотя в исходных данных его не было.

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

Ok. Here’s my attempt at an example:

I wrote a few lines of different formatting in a word processor, and the html produced was:


Original HTML:

<style>
     ...
     /* Style Definitions */
     table.MsoNormalTable
    	{mso-style-name:"Table Normal";
    	mso-tstyle-rowband-size:0;
    	mso-tstyle-colband-size:0;
    	mso-style-noshow:yes;
    	mso-style-priority:99;
    	mso-style-parent:"";
    	mso-padding-alt:0in 5.4pt 0in 5.4pt;
    	mso-para-margin:0in;
    	mso-pagination:widow-orphan;
    	font-size:12.0pt;
    	font-family:"Calibri",sans-serif;
    	mso-ascii-font-family:Calibri;
    	mso-ascii-theme-font:minor-latin;
    	mso-hansi-font-family:Calibri;
    	mso-hansi-theme-font:minor-latin;
    	mso-bidi-font-family:"Times New Roman";
    	mso-bidi-theme-font:minor-bidi;}
    </style>
    <![endif]-->
    </head>

    <body lang=EN-US style='tab-interval:.5in;word-wrap:break-word'>
    <!--StartFragment-->

    <p class=MsoNormal>Here is some text. Font family = Calibri, size 12pt<o:p></o:p></p>

    <p class=MsoNormal><o:p>&nbsp;</o:p></p>

    <p class=MsoNormal><b>This text is bold</b>.<o:p></o:p></p>

    <p class=MsoNormal><o:p>&nbsp;</o:p></p>

    <p class=MsoNormal><i>This text is italicized</i>.<o:p></o:p></p>

    <p class=MsoNormal><o:p>&nbsp;</o:p></p>

    <p class=MsoNormal><span style='font-size:18.0pt'>This text is in a larger font
    = Calibri, size 18</span>.<o:p></o:p></p>

    <p class=MsoNormal><o:p>&nbsp;</o:p></p>

    <p class=MsoNormal align=center style='text-align:center'><span
    style='font-size:11.0pt;font-family:"Garamond",serif'>And here is some more random
    text that is centered = Garamond, size 11. Lorem ipsum dolor sit amet,
    consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et
    dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
    laboris nisi ut aliquip ex ea commodo consequat.<o:p></o:p></span></p>

    <!--EndFragment-->
    </body>

    </html>

Cooked Discourse Post:

If I paste this html into a discourse post, it looks like this (after it goes through the “cook” process):

Here is some text. Font family = Calibri, size 12pt

 

This text is bold.

 

This text is italicized.

 

This text is in a larger font = Calibri, size 18.

 

And here is some more random text that is centered = Garamond, size 11. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.


What I’m Trying to Get Back

It’s fine for Discourse to cook the post and display it like it does. But what I want now is to be able to later take a post and get back the original, underlying HTML. So the data I get back should look like this:

<body lang=EN-US style='tab-interval:.5in;word-wrap:break-word'>
<!--StartFragment-->

<p class=MsoNormal>Here is some text. Font family = Calibri, size 12pt<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal><b>This text is bold</b>.<o:p></o:p></p>

(etc.)

Right now if I plug in the “raw” endpoint like you provided, it does not provide this html. Rather, it just provides the text with, it seems, most formatting and spacing removed.

Is it possible to get the original, underlying html back?

Похоже, я всё ещё что-то упускаю или пропустил шаг. Я только что создал пост на try.discourse.org: https://try.discourse.org/t/testing-html-cooking/1405. Исходное содержимое доступно по ссылке https://try.discourse.org/raw/1405. Оно действительно выглядит так, как вы описывали.

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

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

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

Элементы из вашего фрагмента, которые видны в raw

Смотрите: https://meta.discourse.org/raw/189183/7

Вот какой-то текст. Шрифт — Calibri, размер 12 пт

 

Этот текст выделен жирным.

Но если вы скопируете содержимое из Word и вставите его, весь HTML будет преобразован в разметку Markdown на стороне клиента.

Спасибо всем. Да, @pfaffman, это хотя бы частично объясняет мою путаницу здесь.

Допустим, цель — скопировать текст из Word, вставить его в тему Discourse, а позже посмотреть на «сырые» данные темы и восстановить исходное форматирование из Word.

Возможно ли это?


РЕДАКТИРОВАНИЕ: Вот, возможно, более понятный пример (надеюсь). Вот HTML-код:

<html>
<body>

<h1>Заголовок</h1>

<p style="font-size: 35pt">Этот текст должен быть очень большим</p>

</body>
</html>

Если вывести результат (например, в редакторе «Попробуй сам» на W3Schools здесь), получится две строки текста, причём слова «Этот текст должен быть очень большим» будут отображаться крупнее первой строки — что соответствует стилю “font-size: 35pt”.

Если скопировать этот вывод (не сам HTML-код, а именно результат) и вставить его в большинство мест, форматирование сохраняется. Например, при вставке в Gmail форматирование остаётся, при вставке в Microsoft Word — тоже; в обоих случаях вторая строка, как и положено, больше первой.

Однако в Discourse форматирование теряется даже в окне «сырого» редактора: всё форматирование удаляется, за исключением добавления маркдауна «#» к заголовку h1.

Таким образом, если скопировать сам HTML-код и вставить его в редактор, код действительно сохраняется, и его можно вернуть в исходном виде. Но если вставить результат выполнения HTML-кода, форматирование теряется, даже в «сыром» виде.

Когда я вставляю вывод в Gmail или Word, и они сохраняют форматирование, значит, они сохраняют HTML. Discourse же, похоже, удаляет HTML при вставке результата выполнения HTML-кода.

Возможно ли предотвратить это удаление?

Нет. Вы можете посмотреть в редакторе и увидеть исходный текст, который создаётся при вставке из Word. Это всё, что есть, поскольку магия преобразования в буфер обмена Markdown происходит в браузере между моментом вставки и моментом отображения в окне редактора.

Вот ключевое непонимание: «raw» — это Markdown, а не HTML.

У нас есть магия :sparkles:, которая преобразует HTML в Markdown при вставке в редактор.

И ещё больше запутывает то, что в Markdown может содержаться HTML. :man_shrugging:

Но такое преобразование не происходит (в редакторе), если вставлять настоящий HTML-код. Именно это, как я думаю, я упустил ранее.

Или, возможно, как сказал @pfaffman, преобразование действительно происходит в любом случае, но Markdown сохраняет HTML, если вставить его как чистый код, но не если вставить результат выполнения кода.

Правильно, чтобы это работало, в буфере обмена должен быть контент типа text/html.

Можно ли сохранять в Markdown и другие форматы, например RTF (Rich Text Format), так же, как HTML?

HTML сам по себе не сохраняется в Markdown, но некоторые важные теги поддерживаются (например, <em> акцент), так как мы стараемся следовать закону Постела там, где это не вызывает проблем.

Какую проблему вы пытаетесь решить?

Цель — понять, как работает процесс (это актуально для нескольких проектов). Этот разговор уже помог в этом. У меня всё ещё остаётся вопрос: можно ли получить доступ к исходному отформатированному тексту при копировании из Microsoft Word?

Нет. Вам нужно изучить JavaScript-код, который обрабатывает это при вставке.

Это связано с обработкой «HTML в Markdown», которая происходит при вставке.

Вот соответствующий исходный файл. Вы заметите несколько элементов, специфичных для Microsoft Word (например, MsoListParagraphCxSpFirst).

https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/app/lib/to-markdown.js

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

Это очень полезно. Просто уточню: почему обработка через Notepad может иметь значение?

Это приведет к удалению всего форматирования Word, и у вас останется только обычный текст.

Это происходит потому, что при «копировании» чего-либо приложение предоставляет другим программам, в которые вы вставляете данные, несколько разных представлений этой информации. Discourse выбирает «разнообразный» вариант со всем форматированием Word, тогда как Блокнот выбирает «простой» вариант. Пропустив данные через Блокнот, вы оставляете для Discourse только «простой» вариант.