如何取回创建帖子的原始“原始”数据?

如果我将一些 HTML 粘贴到主题中以创建主题,Discourse 会自动重新格式化 HTML(即“烹饪”它),保留部分(但非全部)底层格式,并从视图中移除 HTML 标签。

我是否可以在之后获取我在创建主题时粘贴的原始 HTML?我能找到的最接近的方法是使用 API 调用,在端点中添加 raw=true,然后查看 response.data.post_stream.posts[0].raw 下的响应,正如 此处 所描述的那样。

然而,返回的“原始”文本并不是我粘贴的原始 HTML。我不确定它具体是什么——它看起来像是移除了所有空格的普通“已烹饪”主题内容。

我是否有办法获取我粘贴进去的原始 HTML?

3 个赞

当然,有一个路由可以查看帖子的原始内容。请以您的帖子为例。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
7 个赞

谢谢,但这似乎对我不管用。我希望返回的数据能保留我最初粘贴时的原始 HTML 格式——例如,如果原始 HTML 中包含 div 标签,那么返回的数据中也应包含该 div 标签。

我发现“原始”响应中包含了 Markdown 格式,而原始数据中并没有这些格式。

我现在会整理一个示例来说明我的意思。

1 个赞

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><head> 标签使其成为有效的 HTML,然后用该 HTML 创建了一个帖子。

1 个赞

你说得对。原始链接确实看起来就是我想要的那个。我不确定之前为什么行不通。我会测试几件事,然后再回复。

1 个赞

我认为问题在于,当你粘贴到浏览器时,你想要的那部分 HTML 会被转换,因此这些内容永远不会到达 raw

你可以在 raw 中看到的来自你片段的内容

请查看 https://meta.discourse.org/raw/189183/7

\u003cbody lang=EN-US style=‘tab-interval:.5in;word-wrap:break-word’\u003e
\u003c!–StartFragment–\u003e

\u003cp class=MsoNormal\u003e这里是一些文本。字体为 Calibri,字号 12pt\u003co:p\u003e\u003c/o:p\u003e\u003c/p\u003e

\u003cp class=MsoNormal\u003e\u003co:p\u003e\u0026nbsp;\u003c/o:p\u003e\u003c/p\u003e

\u003cp class=MsoNormal\u003e\u003cb\u003e此文本为粗体\u003c/b\u003e。\u003co:p\u003e\u003c/o:p\u003e\u003c/p\u003e

但如果你从 Word 复制内容然后粘贴,所有 HTML 都会被前端转换为 Markdown。

1 个赞

谢谢各位。是的,@pfaffman,这至少部分解释了我目前的困惑。

假设目标是:从 Word 复制内容,然后粘贴到 Discourse 话题中;之后还能查看该话题的“原始”数据,并恢复 Word 中的原始格式。

这可行吗?


编辑:这里或许是一个更清晰的例子(希望如此)。下面是一段 HTML:

<!DOCTYPE html>
<html>
<body>

<h1>Heading</h1>

<p style="font-size: 35pt">This text should be very big</p>

</body>
</html>

如果我输出这段代码(例如在 W3Schools 的在线编辑器 这里 中运行),会生成两行文本,其中“这行文字应该非常大”显示得比第一行更大,这与样式“font-size: 35pt”一致。

如果我复制该输出(不是 HTML 代码,而是渲染后的结果),然后在大多数地方粘贴,格式会被保留。例如,粘贴到 Gmail 时格式保留,粘贴到 Microsoft Word 时格式也保留——在这两种情况下,第二行确实比第一行更大。

但在 Discourse 中,即使是在原始编辑器窗口中,格式也会丢失:除为 h1 添加了一个 Markdown 的“#”符号外,所有格式都被移除了。

因此,如果我直接复制实际的 HTML 代码并粘贴到编辑器中,HTML 代码确实会被保留,我也可以以原始形式获取它。但是,如果我粘贴的是 HTML 代码的渲染结果,格式就会丢失,即使在原始形式下也是如此。

当我把渲染结果粘贴到 Gmail 或 Word 时,它们保留了格式,这说明它们内部保留了 HTML。而 Discourse 似乎在我粘贴 HTML 渲染结果时,会剥离其中的 HTML。

有没有可能不剥离它?

不。你可以在编辑器中查看从 Word 粘贴时生成的原始文本。这就是全部内容,因为从剪贴板到 Markdown 的转换魔法发生在浏览器中,即在你粘贴之后、在编辑器窗口中看到内容之前。

3 个赞

这里有一个关键的误解:raw 是 Markdown,而不是 HTML。

我们拥有魔法 :sparkles:,当你粘贴到编辑器时,它会将 HTML 转换为 Markdown。

4 个赞

更让人困惑的是,Markdown 中还可以包含 HTML。 :man_shrugging:

3 个赞

但是,如果您粘贴的是实际的 HTML 代码,这种转换就不会发生(在编辑器中)。我想我之前忽略了这一点。

或者,正如 @pfaffman 所说,转换确实无论何时都会发生,但如果粘贴的是纯代码,Markdown 可以保留 HTML;但如果粘贴的是代码的输出结果,则无法保留。

没错,剪贴板中的内容类型必须为 text/html 才能生效。

2 个赞

其他格式(如 RTF 富文本格式)是否也能像 HTML 一样在 Markdown 中保留?

HTML 本身并未在 Markdown 中“保留”,只是我们支持了一些重要标签(例如 <em> 强调),只要遵循“后尔定律”且不会引发问题,我们就会这样做。

您试图解决什么问题?

目标是了解该流程的运作方式(对几个项目相关)。这次对话已经在这方面提供了帮助。我仍然想知道,当你从 Microsoft Word 复制内容时,是否能够保留原始格式文本。

不能。你需要查看在粘贴时处理该内容的 JavaScript 代码。

1 个赞

这是由于“HTML 转 Markdown”的处理机制,该机制在粘贴时触发。

以下是相关的源文件。您会注意到其中包含若干针对 Microsoft Word 的特殊处理(例如 MsoListParagraphCxSpFirst)。

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

为确保获取纯文本,请先将粘贴内容通过记事本或类似工具处理后再粘贴。

2 个赞

这非常有帮助。只是想确认一下:为什么经过记事本处理会有所不同?

这样做会移除所有 Word 格式,只留下纯文本。

出现这种情况是因为,当你“复制”内容时,应用程序实际上会将数据以多种不同视图呈现给目标粘贴应用。Discourse 选择了带有完整 Word 格式的“富文本”版本,而记事本则选择“纯文本”版本。通过记事本中转后,Discourse 只能看到“纯文本”版本。