<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Markdown on ララジャパン</title>
        <link>https://www.larajapan.com/tags/markdown/</link>
        <description>Recent content in Markdown on ララジャパン</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>ja</language>
        <lastBuildDate>Sat, 14 Oct 2023 02:31:28 +0900</lastBuildDate><atom:link href="https://www.larajapan.com/tags/markdown/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>OpenAIのレスをHTML表示</title>
        <link>https://www.larajapan.com/2023/10/14/openai%E3%81%AE%E3%83%AC%E3%82%B9%E3%82%92html%E8%A1%A8%E7%A4%BA/</link>
        <pubDate>Sat, 14 Oct 2023 02:31:28 +0900</pubDate>
        
        <guid>https://www.larajapan.com/2023/10/14/openai%E3%81%AE%E3%83%AC%E3%82%B9%E3%82%92html%E8%A1%A8%E7%A4%BA/</guid>
        <description>&lt;p&gt;前回で作成したOpenAIチャットのデモはいろいろと改善点が盛りだくさんです。その１つは、OpenAIからのレスはテキストなのですが&lt;strong&gt;Markdown&lt;/strong&gt;の形式で来ます。今回はこの表示をHTMLに変換します。&lt;/p&gt;
&lt;h2&gt;OpenAIからのレス&lt;/h2&gt;
OpenAIからのレスは以下のようなテキストできます。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 2023年10月4日以降の日本の祝日は以下の通りです：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- 体育の日（スポーツの日）：10月9日
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- 文化の日：11月3日
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- 勤労感謝の日：11月23日
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;12月から年末までの祭日はありません。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;https://ja.wikipedia.org/wiki/Markdown&#34; rel=&#34;noopener&#34; target=&#34;_blank&#34;&gt;Markdown&lt;/a&gt;のWikiを参照すると、
上で使用されているハイフン（‐）は、順序無しリストのアイテム、HTMLでは&lt;ul&gt;の&lt;strong&gt;&lt;li&gt;&lt;/strong&gt;の使用ということになります。
しかし、これを無視すると以下のような表示（前回）となります。
&lt;a href=&#34;chat.png&#34;&gt;&lt;img src=&#34;chat.png&#34; alt=&#34;&#34; width=&#34;795&#34; height=&#34;385&#34; class=&#34;alignnone size-full wp-image-8737&#34; /&gt;&lt;/a&gt;
無視しないでHTMLに変換して、
&lt;a href=&#34;markdown1.png&#34;&gt;&lt;img src=&#34;markdown1.png&#34; alt=&#34;&#34; width=&#34;932&#34; height=&#34;181&#34; class=&#34;alignnone size-full wp-image-8809&#34; /&gt;&lt;/a&gt;
のように表示したいです。&lt;/p&gt;
&lt;h2&gt;ソースコード&lt;/h2&gt;
今回の機能を追加したソースコードは、前回のOpenAIチャットをもとにして違うgitブランチ（chat-openai-markdown）としました。
レポジトリは&lt;a href=&#34;https://github.com/lotsofbytes/laravel-chat/tree/chat-openai-markdown&#34; rel=&#34;noopener&#34; target=&#34;_blank&#34;&gt;こちら&lt;/a&gt;ですが、すでにデモのソースコードをインストールしているなら、以下でスイッチできます。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git fetch
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git checkout chat-openai-markdown
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;を実行してブランチをゲットできます。
前回のブランチのchat-openaiとの差分は以下です。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git diff chat-openai --name-status
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;M       package-lock.json
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;M       package.json
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;M       resources/js/components/ChatMessages.vue
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;MarkdownのテキストからHTMLの変換のために、今回は&lt;a href=&#34;https://github.com/markdown-it/markdown-it&#34; rel=&#34;noopener&#34; target=&#34;_blank&#34;&gt;markdown-it&lt;/a&gt;のパッケージが必要です。それゆえに以下の実行が必要です。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ npm install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最後に、前回と同様に以下のコマンドを実行すると、ブラウザでテストが可能です。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ npm run build
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ php artisan serve
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;markdown-itをChatMessages.vueに取り込む&lt;/h2&gt;
差分で見たように、今回コードの変更はChatmessages.vueのみです。サーバー側ではなくフロントエンドでHTML変換です。
以下のコードで変更の部分にコメントしました。非常に簡単です。
&lt;div class=&#34;code-filename&#34;&gt;ChatMessages.vue&lt;/div&gt;
```js
&lt;script setup&gt;
import MarkdownIt from &#39;markdown-it&#39;; // MarkdownからHTMLへの変換のパッケージ
const markdown = new MarkdownIt(); // 初期化
defineProps({
  messages: Array,
  user: Object
});
&lt;/script&gt;
&lt;template&gt;
  &lt;ul style=&#34;list-style:none&#34;&gt;
    &lt;li v-for=&#34;message in messages&#34;
      :key=&#34;message.id&#34;
      :class=&#34;message.user.id === user.id ? &#39;text-end&#39; : &#39;text-start&#39;&#34;&gt;
      &lt;div class=&#34;header&#34;&gt;
        &lt;strong&gt;
          &lt;span v-if=&#34;message.user.id === user.id&#34;&gt;私&lt;/span&gt;
          &lt;span v-else&gt;{{ message.user.name }}さん&lt;/span&gt;
        &lt;/strong&gt;
      &lt;/div&gt;
      &lt;p v-if=&#34;message.user.id === user.id&#34;&gt;{{ message.message }}&lt;/p&gt;
      &lt;p v-else v-html=&#34;markdown.render(message.message)&#34;&gt;&lt;/p&gt; // ここでHTMLに変換
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/template&gt;
// 以下は変換後のスタイル設定
&lt;style&gt;
ul {
  list-style-type: square;
}
&lt;p&gt;pre, code {
background-color:pink;
padding: 4px;
}
&lt;/style&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;



以下は、コードのMarkdownをHTML変換した例です。

&amp;lt;a href=&amp;#34;markdown2.png&amp;#34;&amp;gt;&amp;lt;img src=&amp;#34;markdown2.png&amp;#34; alt=&amp;#34;&amp;#34; width=&amp;#34;932&amp;#34; height=&amp;#34;458&amp;#34; class=&amp;#34;alignnone size-full wp-image-8814&amp;#34; /&amp;gt;&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;</description>
        </item>
        
    </channel>
</rss>
