MENU

Nextjs ワードプレス コードブロック コピー機能

🗨:
以下の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>
  );
}

主な変更点を説明します。

  1. createMarkup関数: ダイナミックにHTMLを生成するために、dangerouslySetInnerHTMLのためのラッパー関数を作成しました。
  2. コピー機能の追加: navigator.clipboard.writeTextを使って、コードがクリックされたときにその内容をクリップボードにコピーする機能を追加しました。
  3. onClickイベントハンドラ: コードが含まれている code タグをクリックすることで、その中のテキストをコピーできるようになっています。

この実装で、ユーザーはコードをクリックすることでそれを簡単にコピーできるようになります。コードの右上にそのボタンを置くことはできませんが(HTML構成としてはそのように表示されません)、テキストのクリックによって同様の結果を達成しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次