前回で作成したOpenAIチャットのデモはいろいろと改善点が盛りだくさんです。その1つは、OpenAIからのレスはテキストなのですがMarkdownの形式で来ます。今回はこの表示をHTMLに変換します。
OpenAIからのレス
OpenAIからのレスは以下のようなテキストできます。
2023年10月4日以降の日本の祝日は以下の通りです: - 体育の日(スポーツの日):10月9日 - 文化の日:11月3日 - 勤労感謝の日:11月23日 12月から年末までの祭日はありません。
MarkdownのWikiを参照すると、
上で使用されているハイフン(‐)は、順序無しリストのアイテム、HTMLでは<ul>の<li>の使用ということになります。
しかし、これを無視すると以下のような表示(前回)となります。
無視しないでHTMLに変換して、
のように表示したいです。
ソースコード
今回の機能を追加したソースコードは、前回のOpenAIチャットをもとにして違うgitブランチ(chat-openai-markdown)としました。
レポジトリはこちらですが、すでにデモのソースコードをインストールしているなら、以下でスイッチできます。
$ git fetch $ git checkout chat-openai-markdown
を実行してブランチをゲットできます。
前回のブランチのchat-openaiとの差分は以下です。
$ git diff chat-openai --name-status M package-lock.json M package.json M resources/js/components/ChatMessages.vue
MarkdownのテキストからHTMLの変換のために、今回はmarkdown-itのパッケージが必要です。それゆえに以下の実行が必要です。
$ npm install
最後に、前回と同様に以下のコマンドを実行すると、ブラウザでテストが可能です。
$ npm run build $ php artisan serve
markdown-itをChatMessages.vueに取り込む
差分で見たように、今回コードの変更はChatmessages.vueのみです。サーバー側ではなくフロントエンドでHTML変換です。
以下のコードで変更の部分にコメントしました。非常に簡単です。
<script setup> import MarkdownIt from 'markdown-it'; // MarkdownからHTMLへの変換のパッケージ const markdown = new MarkdownIt(); // 初期化 defineProps({ messages: Array, user: Object }); </script> <template> <ul style="list-style:none"> <li v-for="message in messages" :key="message.id" :class="message.user.id === user.id ? 'text-end' : 'text-start'"> <div class="header"> <strong> <span v-if="message.user.id === user.id">私</span> <span v-else>{{ message.user.name }}さん</span> </strong> </div> <p v-if="message.user.id === user.id">{{ message.message }}</p> <p v-else v-html="markdown.render(message.message)"></p> // ここでHTMLに変換 </li> </ul> </template> // 以下は変換後のスタイル設定 <style> ul { list-style-type: square; } pre, code { background-color:pink; padding: 4px; } </style>
以下は、コードのMarkdownをHTML変換した例です。
メルマガ購読の申し込みはこちらから。