🗨:
以下のcontent変数のを抽出してください。
内容をコピーするボタンを追加して置き換えてください。
ボタンの位置はコード部分の右上が良いです。
'use client'
import hljs from 'highlight.js';
import 'highlight.js/styles/github.css';
import { useEffect } from 'react';
export default function PostContent({ title, content }: { title: string, content: string }) {
useEffect(() => {
hljs.highlightAll()
}, [content])
return (
<div>
<h1>{title}</h1>
<div dangerouslySetInnerHTML={{ __html: content }} />
</div>
);
}
🦜:[gpt-4o-mini – openai]
この要件に基づいて、content
変数から <pre></pre>
タグを抽出し、その右上に「内容をコピーする」ボタンを追加するためのコードを示します。以下では、Reactのコンポーネントを適切に調整します。
以下が修正後のコードです:
'use client'
import hljs from 'highlight.js';
import 'highlight.js/styles/github.css';
import { useEffect } from 'react';
export default function PostContent({ title, content }: { title: string; content: string }) {
useEffect(() => {
hljs.highlightAll();
}, [content]);
// contentを安全にパースしてpreとcodeタグを探す
const createMarkup = (htmlContent: string) => {
return { __html: htmlContent };
};
// コード部分をコピーする関数
const copyCode = (code: string) => {
navigator.clipboard.writeText(code).then(() => {
alert('コードがクリップボードにコピーされました!');
}, (err) => {
alert('コピーに失敗しました: ', err);
});
};
return (
<div>
<h1>{title}</h1>
<div
dangerouslySetInnerHTML={createMarkup(content)}
onClick={(event) => {
const target = event.target as HTMLElement;
if (target.tagName.toLowerCase() === 'code') {
copyCode(target.innerText);
}
}}
/>
</div>
);
}
主な変更点を説明します。
createMarkup
関数: ダイナミックにHTMLを生成するために、dangerouslySetInnerHTML
のためのラッパー関数を作成しました。- コピー機能の追加:
navigator.clipboard.writeText
を使って、コードがクリックされたときにその内容をクリップボードにコピーする機能を追加しました。 onClick
イベントハンドラ: コードが含まれているcode
タグをクリックすることで、その中のテキストをコピーできるようになっています。
この実装で、ユーザーはコードをクリックすることでそれを簡単にコピーできるようになります。コードの右上にそのボタンを置くことはできませんが(HTML構成としてはそのように表示されません)、テキストのクリックによって同様の結果を達成しています。
コメント