投稿を作成した実際の「生の」データを取得するには?

HTMLをトピックに貼り付けると、Discourseは自動的にそのHTMLを再フォーマット(「調理」)し、一部の(すべてではない)元の書式を保持しつつ、表示からはHTMLタグを除去します。

作成時にトピックに貼り付けた元のHTMLを後から取得する方法はありますか?最も近い方法として、エンドポイントに「raw=true」を付けてAPI呼び出しを行い、response.data.post_stream.posts[0].raw 以下のレスポンスを確認するというものがあります(こちらで説明されています)。

ただし、返ってくる「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 タグが含まれている必要があります。

私が「raw」レスポンスで見つけたものでは、元データに何もマークダウン形式が含まれていなかったにもかかわらず、マークダウン形式が含まれていました。

今、私が言いたいことを示す例を作成してみます。

「いいね!」 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?

つまり、まだ手順が追えていないか、何か手順を見落としているようです。just に try.discourse.org で投稿を作成しました:https://try.discourse.org/t/testing-html-cooking/1405。生コンテンツは https://try.discourse.org/raw/1405 です。この生コンテンツは、あなたが言うべき姿と確かに似ています。

これを再現する方法について、手順をステップバイステップで教えていただけますか?あなたが上記で共有した「元の HTML」をベースに、有効な HTML になるよう先頭に <html><head> タグを追加し、本文にその 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\u003eHere is some text. Font family = Calibri, size 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\u003eThis text is bold\u003c/b\u003e.\u003co:p\u003e\u003c/o:p\u003e\u003c/p\u003e

ただし、Word から内容をコピーして貼り付けると、フロントエンド側ですべての HTML が Markdown に変換されてしまいます。

「いいね!」 1

ありがとうございます、皆さん。はい、@pfaffman さん、私の混乱の一部はまさにそこにあると思います。

例えば、Word からコピーして Discourse のトピックに貼り付け、後でそのトピックの「生データ」を見て、元の Word の書式を取り戻せるようにしたい、とします。

それは可能でしょうか?


編集:もっと明確な例を示します(願わくば)。以下は HTML です:

<html>
<body>

<h1>見出し</h1>

<p style="font-size: 35pt">このテキストは非常に大きく表示されるはずです</p>

</body>
</html>

この出力を印刷すると(例えば、W3Schools の「Try it」エディター こちら で)、2 行のテキストが生成され、「このテキストは非常に大きく表示されるはずです」という言葉が 1 行目よりも大きく表示されます。これは「font-size: 35pt」というスタイル設定と一致しています。

その出力(HTML コードではなく、表示結果)をコピーして、多くの場所に貼り付けると、書式が保持されます。例えば、Gmail に貼り付けると書式が保持されますし、Microsoft Word に貼り付けても書式が保持されます。どちらの場合も、2 行目は正しく 1 行目よりも大きくなります。

しかし、Discourse では、生エディターウィンドウであっても書式が失われます。すべての書式が削除され、h1 に対して Markdown の「#」が追加されるだけです。

そのため、実際の HTML コードをコピーしてエディターに貼り付けると、確かに HTML コードは保持され、生形式で取り戻すことができます。しかし、HTML コードの出力結果を貼り付けると、生形式であっても書式は失われます。

Gmail や Word に出力結果を貼り付けると書式が保持されるということは、それらは HTML を保持しているはずです。一方、Discourse は、HTML の出力結果を貼り付けると、HTML を剥ぎ取ってしまうようです。

剥ぎ取らないようにすることは可能でしょうか?

いいえ。コンポーザーを確認すると、Word から貼り付けた際に生成される生テキストが表示されます。ブラウザ上で、貼り付けた瞬間からコンポーザーウィンドウに表示されるまでの間に、貼り付けバッファから Markdown への変換という魔法が実行されるため、これ以上何も表示されません。

「いいね!」 3

ここが重要な誤解です:「raw」は HTML ではなく Markdown です。

コンポーザーに貼り付けた際に HTML を Markdown に変換する「魔法」:sparkles: が備わっています。

「いいね!」 4

さらに混乱を招くのは、その Markdown に HTML を含めることができる点です。 :man_shrugging:

「いいね!」 3

ただし、実際の HTML コードを貼り付けた場合は、この変換はコンポーザー内で発生しません。これが私が以前見落としていた点だと思います。

あるいは、@pfaffman さんがおっしゃったように、変換は常に発生しているのかもしれませんが、生のコードを貼り付けた場合は Markdown が HTML を保持できるものの、コードの出力結果を貼り付けた場合は保持できないのかもしれません。

はい、クリップボード内のコンテンツタイプが text/html である必要があります。

「いいね!」 2

他の形式(RTF:リッチテキスト形式など)も、HTML と同様に Markdown 内で保持することはできますか?

HTML はマークダウンにおいて厳密に「保存」されているわけではありませんが、問題を引き起こさない限りポステルの法則に従うよう努めているため、いくつかの重要なタグ(例:\u003cem\u003e \u003cem\u003e強調\u003c/em\u003e)はサポートされています。

どのような問題を解決しようとしていますか?

目的は、プロセスの仕組みを理解することです(いくつかのプロジェクトに関連します)。この会話ですでにその点については理解できました。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 が認識するのは「プレーン」バージョンのみとなります。