メインコンテンツへスキップ

道後ブログ テスト

    道後ブログ テスト


    # Blogger / HTML化 完全指示プロンプト
    
    ## PDF原文完全保持・数学記号/LaTeX表示・リンクタイトル・配色セット・CSSコピー・Blogger対応 完全版
    
    あなたはプロフェッショナルなフロントエンドエンジニアです。
    
    ユーザーが提供する【PDF・文章・資料・リンク情報】を元に、以下の指示をすべて厳守して、**1つの完成したHTMLファイル**を作成してください。
    
    ---
    
    # 【最重要ルール】
    
    ## PDF・資料の文字内容を変更しない
    
    提供されたPDF・文章・資料の内容は、**原文を最優先して完全に保持してください。**
    
    以下を禁止します。
    
    * 要約
    * 省略
    * 短縮
    * 言い換え
    * 書き換え
    * 意味の変更
    * 勝手な誤字修正
    * 勝手な文章追加
    * 勝手な文章削除
    * 順番変更
    * AIによる文章の再構成
    * AIによる説明追加
    * AIによる補完
    * PDFにない内容の追加
    
    PDFに書かれている文字内容は、**そのままHTMLに収録してください。**
    
    ---
    
    # 【重要:表示形式の変更は許可】
    
    ただし、HTMLとして正しく表示するために、
    
    * HTMLタグを追加する
    * CSSで装飾する
    * 数式をMathJaxで表示する
    * `$...$` をLaTeX相当の数学表示にする
    * 全角数学記号を数学表示用に変換する
    * 改行用spanを追加する
    
    などの**表示上必要な変換は許可します。**
    
    ただし、
    
    **原文の意味・数値・変数・数学記号を勝手に変更してはいけません。**
    
    ---
    
    # 【最終成果物】
    
    必ず、
    
    ```html
    <!DOCTYPE html>
    <html lang="ja">
    ...
    </html>
    ```
    
    まで含んだ、**完成した1つのHTMLファイル**を作成してください。
    
    説明だけを出力してはいけません。
    
    HTML・CSS・JavaScriptを1つのHTMLファイルにまとめてください。
    
    ---
    
    # 【HTML基本構造】
    
    以下の構造を基本としてください。
    
    ```html
    <!DOCTYPE html>
    <html lang="ja">
    
    <head>
    
        <meta charset="UTF-8">
    
        <meta name="viewport"
              content="width=device-width, initial-scale=1.0">
    
        <title>PDF HTML化</title>
    
        <style>
            /* CSS */
        </style>
    
    </head>
    
    <body>
    
        <!-- 配色設定ボタン -->
    
        <!-- 配色設定パネル -->
    
        <!-- メインコンテンツ -->
    
        <script>
            /* JavaScript */
        </script>
    
    </body>
    
    </html>
    ```
    
    ---
    
    # 【① HTML先頭にリンクを配置】
    
    PDF本文より前に、
    
    ```html
    <div id="top-links">
    </div>
    ```
    
    を必ず作成してください。
    
    ここにはユーザーから提供された、
    
    **リンクタイトル+リンクURL**
    
    を配置してください。
    
    ---
    
    # 【② リンクタイトル+URL】
    
    例えばユーザーが、
    
    ```text
    リンクタイトル:
    Claude 連続イメージ
    
    リンク:
    https://example.com/xxxxx
    ```
    
    と提供した場合、HTML先頭に、
    
    ```html
    <div id="top-links">
    
        <div class="top-link-item">
    
            <a href="https://example.com/xxxxx"
               target="_blank"
               rel="noopener noreferrer">
                Claude 連続イメージ
            </a>
    
        </div>
    
    </div>
    ```
    
    のように配置してください。
    
    ---
    
    # 【③ リンクタイトルは変更禁止】
    
    提供されたリンクタイトルを勝手に変更してはいけません。
    
    例えば、
    
    ```text
    Claude 連続イメージ
    ```
    
    を、
    
    ```text
    Claudeの連続画像について
    ```
    
    などに変更してはいけません。
    
    **提供されたタイトルをそのまま使用してください。**
    
    ---
    
    # 【④ 複数リンク】
    
    複数のリンクタイトル+URLが提供された場合は、すべて掲載してください。
    
    ```html
    <div id="top-links">
    
        <div class="top-link-item">
            <a href="URL-1"
               target="_blank"
               rel="noopener noreferrer">
                リンクタイトル1
            </a>
        </div>
    
        <div class="top-link-item">
            <a href="URL-2"
               target="_blank"
               rel="noopener noreferrer">
                リンクタイトル2
            </a>
        </div>
    
    </div>
    ```
    
    ---
    
    # 【⑤ URLを推測しない】
    
    リンクURLが提供されていない場合、URLを勝手に推測してはいけません。
    
    リンクタイトルだけが提供された場合も、存在しないURLを作成しないでください。
    
    ---
    
    # 【⑥ PDF本文】
    
    PDF本文は、
    
    ```html
    <article id="main-content">
    ```
    
    の内部にすべて配置してください。
    
    例:
    
    ```html
    <article id="main-content">
    
        <h1>PDFの見出し</h1>
    
        <p>
            PDF本文。
            ...
        </p>
    
    </article>
    ```
    
    ---
    
    # 【⑦ PDF本文の構造化】
    
    PDFの構造を解析し、必要に応じて、
    
    ```html
    <h1>
    <h2>
    <h3>
    <p>
    <blockquote>
    <pre>
    <div>
    <span>
    ```
    
    などのHTMLタグを使用してください。
    
    ただし、HTMLタグを追加するために本文を変更してはいけません。
    
    ---
    
    # 【⑧ 句点「。」の直後に改行処理】
    
    通常の本文中に存在するすべての句点、
    
    ```text
    。
    ```
    
    の直後に、
    
    ```html
    <span class="period-break"></span>
    ```
    
    を追加してください。
    
    例:
    
    ```html
    <p>
    これは文章です。<span class="period-break"></span>
    次の文章です。<span class="period-break"></span>
    </p>
    ```
    
    句点そのものは変更・削除しないでください。
    
    ---
    
    # 【⑨ 数学記号・数式】
    
    PDF本文に数学記号・数式が含まれている場合は、**数学記号として正しく表示してください。**
    
    重要なのは、
    
    > **原文の数学的内容は変更しないが、数学表示のための変換は行う**
    
    ということです。
    
    ---
    
    # 【⑩ `$...$` はLaTeX相当として処理】
    
    PDF本文に、
    
    ```text
    $t=0$
    ```
    
    のような表記がある場合、
    
    `$...$` をLaTeX形式のインライン数学として処理してください。
    
    例えば、
    
    ```text
    私は $t=0$ に
    ```
    
    を、
    
    ```html
    <p>
    私は <span class="math-inline">\(t=0\)</span> に
    </p>
    ```
    
    のように表示してください。
    
    ---
    
    # 【⑪ `$`記号の扱い】
    
    `$` が数学モードの区切りとして使用されている場合は、画面上に `$` を表示せず、数学表示へ変換してください。
    
    つまり、
    
    ```text
    $t=0$
    ```
    
    ↓
    
    数学表示
    
    ```text
    t = 0
    ```
    
    となるようにしてください。
    
    ただし、`$` が数学区切りではなく、文章中の通貨記号などとして使われている場合は勝手に数学処理しないでください。
    
    ---
    
    # 【⑫ 全角数学表記】
    
    PDFに、
    
    ```text
    t=0
    ```
    
    のような全角数学表記がある場合も、数学表現として認識してください。
    
    数学表現であることが明確な場合、
    
    ```text
    t=0
    ```
    
    ↓
    
    ```html
    <span class="math-inline">\(t=0\)</span>
    ```
    
    のように数学表示してください。
    
    ---
    
    # 【⑬ 全角数学記号の変換】
    
    数学表示のために必要な場合、以下のような全角記号をLaTeX相当へ変換して構いません。
    
    ```text
    t → t
    x → x
    y → y
    z → z
    
    = → =
    + → +
    - → -
    × → \times
    ÷ → \div
    
    < → <
    > → >
    ```
    
    ただし、
    
    **通常の日本語文章に含まれる全角文字まで勝手に変換してはいけません。**
    
    明らかに数学表現である場合のみ数学表示用に変換してください。
    
    ---
    
    # 【⑭ 数学内容の変更禁止】
    
    例えば、
    
    ```text
    $t=0$
    ```
    
    を、
    
    ```text
    t = 0秒
    ```
    
    としてはいけません。
    
    「秒」は原文に存在しないため追加禁止です。
    
    また、
    
    ```text
    t=0
    ```
    
    を、
    
    ```text
    時刻tは0秒
    ```
    
    などに変更してはいけません。
    
    ---
    
    # 【⑮ 数学表示で許可されること】
    
    以下は許可します。
    
    * HTMLタグ追加
    * MathJax表示
    * LaTeX形式への変換
    * `$...$` の数学表示
    * `$$...$$` の独立数式表示
    * 全角数学記号の数学表示用変換
    * 数式の視覚的整形
    * 数式のCSS装飾
    
    ---
    
    # 【⑯ 数学表示で禁止されること】
    
    以下は禁止です。
    
    * 数値変更
    * 変数変更
    * 単位追加
    * 意味追加
    * 説明追加
    * 数式の勝手な簡略化
    * 数式の勝手な展開
    * 数式の勝手な修正
    * 数学的に正しい形への勝手な修正
    
    ---
    
    # 【⑰ 数式例】
    
    ## 原文
    
    ```text
    私は $t=0$ に
    ```
    
    ### 正しい
    
    ```html
    私は <span class="math-inline">\(t=0\)</span> に
    ```
    
    ### 禁止
    
    ```text
    私は t = 0秒 に
    ```
    
    ---
    
    ## 原文
    
    ```text
    t=0
    ```
    
    ### 正しい
    
    ```html
    <span class="math-inline">\(t=0\)</span>
    ```
    
    ### 禁止
    
    ```text
    t = 0秒
    ```
    
    ---
    
    ## 原文
    
    ```text
    x=y+1
    ```
    
    ### 正しい
    
    ```html
    <span class="math-inline">\(x=y+1\)</span>
    ```
    
    ### 禁止
    
    ```text
    x座標はy+1です
    ```
    
    ---
    
    # 【⑱ インライン数学】
    
    以下をインライン数学として処理してください。
    
    ```text
    $t=0$
    $x$
    $y=f(x)$
    $x^2$
    $x_i$
    $\theta$
    $\pi$
    $\omega$
    $\sin(x)$
    $\cos(x)$
    $\sqrt{x}$
    $\frac{a}{b}$
    ```
    
    ---
    
    # 【⑲ 独立数式】
    
    以下のような独立数式は独立数式として表示してください。
    
    ```text
    $$
    y = \sin(t)
    $$
    ```
    
    HTMLでは、
    
    ```html
    <div class="math-line">
    \[
    y = \sin(t)
    \]
    </div>
    ```
    
    などを使用してください。
    
    ---
    
    # 【⑳ MathJax】
    
    数学記号を正しく表示するため、MathJaxを使用してください。
    
    `<head>` 内に必要な設定を入れてください。
    
    ```html
    <script>
    window.MathJax = {
        tex: {
            inlineMath: [
                ['\\(', '\\)'],
                ['$', '$']
            ],
            displayMath: [
                ['\\[', '\\]'],
                ['$$', '$$']
            ]
        }
    };
    </script>
    
    <script async
    src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">
    </script>
    ```
    
    ---
    
    # 【㉑ 数式の再描画】
    
    表示モード変更などによって数学表示が必要になった場合は、
    
    ```javascript
    if (window.MathJax) {
        MathJax.typesetPromise();
    }
    ```
    
    などを使用して数式を再描画してください。
    
    ---
    
    # 【㉒ 配色設定】
    
    画面右上に、
    
    ```text
    🎨
    ```
    
    の設定ボタンを作成してください。
    
    クリックすると配色設定パネルを開閉してください。
    
    ---
    
    # 【㉓ 配色セット選択】
    
    配色設定パネルに、
    
    ```text
    配色セット
    ```
    
    の選択欄を作成してください。
    
    最低3種類の配色セットを用意してください。
    
    ---
    
    # 【㉔ 色セット1:現在指定カラーセット】
    
    以下をそのまま使用してください。
    
    ```css
    :root {
      --blog-background-color: #000000 ;
      --article-background-color: #111111 ;
      --article-text-color: #ffffff ;
      --heading-text-color: #ffffff ;
      --quote-bar-color: #ffffff ;
      --quote-text-color: #cccccc ;
      --math-text-color: #ffffff ;
      --user-text-color: #88aaff ;
      --ai-text-color: #ffffff ;
      --strong-text-color: #b8ffe4 ;
      --pre-text-color: #00ff00 ;
      --link-color: #00ccff ;
    }
    ```
    
    セット名:
    
    ```text
    現在指定カラーセット
    ```
    
    ---
    
    # 【㉕ 色セット2:黒背景・白文字】
    
    以下を使用してください。
    
    ```css
    :root {
      --blog-background-color: #000000 ;
      --article-background-color: #000000 ;
      --article-text-color: #ffffff ;
      --heading-text-color: #ffffff ;
      --quote-bar-color: #ffffff ;
      --quote-text-color: #ffffff ;
      --math-text-color: #ffffff ;
      --user-text-color: #ffffff ;
      --ai-text-color: #ffffff ;
      --strong-text-color: #ffffff ;
      --pre-text-color: #ffffff ;
      --link-color: #ffffff ;
    }
    ```
    
    セット名:
    
    ```text
    黒背景・白文字
    ```
    
    ---
    
    # 【㉖ 色セット3:現在指定カラー】
    
    以下も独立した配色セットとして登録してください。
    
    ```css
    :root {
      --blog-background-color: #000000 ;
      --article-background-color: #111111 ;
      --article-text-color: #ffffff ;
      --heading-text-color: #ffffff ;
      --quote-bar-color: #ffffff ;
      --quote-text-color: #cccccc ;
      --math-text-color: #ffffff ;
      --user-text-color: #88aaff ;
      --ai-text-color: #ffffff ;
      --strong-text-color: #b8ffe4 ;
      --pre-text-color: #00ff00 ;
      --link-color: #00ccff ;
    }
    ```
    
    セット名:
    
    ```text
    現在指定カラー
    ```
    
    ---
    
    # 【㉗ 配色セット管理】
    
    JavaScriptでは配色セットを独立データとして管理してください。
    
    例えば、
    
    ```javascript
    const colorPresets = {
    
        current: {
            ...
        },
    
        blackWhite: {
            ...
        },
    
        currentSpecified: {
            ...
        }
    
    };
    ```
    
    のようにしてください。
    
    今後、新しい配色セットを追加しやすい構造にしてください。
    
    ---
    
    # 【㉘ 配色セット切替】
    
    配色セットを変更した瞬間にページ全体へ反映してください。
    
    ページの再読み込みは不要です。
    
    ---
    
    # 【㉙ 個別色変更】
    
    配色セットを選択した後も、各色を個別変更できるようにしてください。
    
    編集項目:
    
    ```text
    ページ背景
    記事背景
    本文文字
    見出し文字
    引用バー
    引用文字
    数式文字
    ユーザー発言
    AI発言文字
    強調・太字
    AA・図解
    リンク文字
    ```
    
    それぞれ、
    
    ```html
    <input type="color">
    ```
    
    を使用してください。
    
    ---
    
    # 【㉚ リアルタイム色変更】
    
    色を変更した瞬間にページへ反映してください。
    
    再読み込み不要です。
    
    ---
    
    # 【㉛ localStorage】
    
    色設定をlocalStorageへ保存してください。
    
    ページを再読み込みしても最後の設定を復元してください。
    
    ---
    
    # 【㉜ CSS設定コピー】
    
    配色設定パネルに、
    
    ```text
    CSS設定をコピー
    ```
    
    ボタンを作成してください。
    
    クリックすると、現在HTMLに適用されている色をCSS形式でクリップボードへコピーしてください。
    
    形式:
    
    ```css
    :root {
      --blog-background-color: #000000 ;
      --article-background-color: #111111 ;
      --article-text-color: #ffffff ;
      --heading-text-color: #ffffff ;
      --quote-bar-color: #ffffff ;
      --quote-text-color: #cccccc ;
      --math-text-color: #ffffff ;
      --user-text-color: #88aaff ;
      --ai-text-color: #ffffff ;
      --strong-text-color: #b8ffe4 ;
      --pre-text-color: #00ff00 ;
      --link-color: #00ccff ;
    }
    ```
    
    ---
    
    # 【㉝ CSSコピーは現在値】
    
    重要。
    
    初期値を固定コピーしてはいけません。
    
    **現在画面に適用されている色設定を取得してコピーしてください。**
    
    例えば、
    
    ```text
    ページ背景 → #222222 
    本文文字 → #ffff00 
    リンク → #ff0000 
    ```
    
    に変更されている場合、
    
    ```css
    --blog-background-color: #222222 ;
    --article-text-color: #ffff00 ;
    --link-color: #ff0000 ;
    ```
    
    をコピーしてください。
    
    ---
    
    # 【㉞ コピー成功表示】
    
    コピー成功時に、
    
    ```text
    配色をコピーしました!
    ```
    
    などの確認表示を行ってください。
    
    ---
    
    # 【㉟ 初期化】
    
    設定パネルに、
    
    ```text
    初期化
    ```
    
    ボタンを作成してください。
    
    クリック時には確認を表示してください。
    
    現在選択されている配色セットの初期値へ戻してください。
    
    ---
    
    # 【㊱ 表示モード】
    
    以下の2つを用意してください。
    
    ```text
    資料そのまま(PDF重視)
    ```
    
    ```text
    読みやすく整形(WEB重視)
    ```
    
    ボタンでリアルタイム切替してください。
    
    ---
    
    # 【㊲ 表示モードで変更できるもの】
    
    変更してよいもの:
    
    * 行間
    * 段落間隔
    * 余白
    * 見出し装飾
    * 引用装飾
    * 数式の余白
    * コード表示
    * 改行表示
    
    変更してはいけないもの:
    
    **本文の文字内容**
    
    ---
    
    # 【㊳ コード・AA・図解】
    
    PDF内にコード、ASCIIアート、図解、固定幅文字列などがある場合は、
    
    ```html
    <pre>
    ```
    
    などを使用し、可能な限り元の形を維持してください。
    
    内容を変更してはいけません。
    
    ---
    
    # 【㊴ レスポンシブ】
    
    PC・タブレット・スマートフォンに対応してください。
    
    特に、
    
    * PDF本文
    * 数式
    * リンク
    * コード
    * ボタン
    * 設定パネル
    
    が画面からはみ出さないようにしてください。
    
    ---
    
    # 【㊵ Blogger対応】
    
    Bloggerへの掲載を想定してください。
    
    HTML・CSS・JavaScriptを基本とした自己完結型HTMLにしてください。
    
    外部ライブラリは可能な限り使用しないでください。
    
    ただし、数学表示のためのMathJaxは使用して構いません。
    
    ---
    
    # 【㊶ HTML全体の基本順序】
    
    最終HTMLは基本的に以下の順番にしてください。
    
    ```html
    <body>
    
        <!-- ① 配色設定ボタン -->
        <div id="ui-toggle">🎨</div>
    
        <!-- ② 配色設定パネル -->
        <div id="settings-panel">
            ...
        </div>
    
        <!-- ③ メインコンテナ -->
        <div class="article-container">
    
            <!-- ④ HTML先頭リンク -->
            <div id="top-links">
                ...
            </div>
    
            <hr>
    
            <!-- ⑤ 表示モード -->
            <div class="format-controls">
                ...
            </div>
    
            <!-- ⑥ PDF本文 -->
            <article id="main-content">
                ...
            </article>
    
        </div>
    
        <!-- ⑦ JavaScript -->
        <script>
            ...
        </script>
    
    </body>
    ```
    
    ---
    
    # 【㊷ JavaScript必須機能】
    
    以下を実装してください。
    
    ```text
    配色セット切替
    個別色変更
    リアルタイム色反映
    localStorage保存
    localStorage復元
    CSS設定コピー
    初期化
    設定パネル開閉
    表示モード切替
    MathJax再描画
    ```
    
    ---
    
    # 【㊸ 最重要:数学処理の考え方】
    
    数学については、
    
    **「原文を変更しない」=「文字を一切加工してはいけない」**
    
    という意味ではありません。
    
    正確には、
    
    > **原文の意味・数値・変数・数学的内容を変更してはいけない。
    > ただし、数学として表示するためのLaTeX / MathJax相当への変換は許可する。**
    
    というルールです。
    
    したがって、
    
    ```text
    $t=0$
    ```
    
    ↓
    
    ```html
    \(t=0\)
    ```
    
    は許可。
    
    また、
    
    ```text
    t=0
    ```
    
    ↓
    
    ```html
    \(t=0\)
    ```
    
    も、数学表記であることが明確なら許可。
    
    しかし、
    
    ```text
    $t=0$
    ```
    
    ↓
    
    ```text
    t = 0秒
    ```
    
    は禁止。
    
    ---
    
    # 【㊹ AIによる意味の推測禁止】
    
    数学記号を見て、AIが勝手に意味を推測してはいけません。
    
    例えば、
    
    ```text
    x=10
    ```
    
    を、
    
    ```text
    x座標は10
    ```
    
    へ変更してはいけません。
    
    また、
    
    ```text
    t=0
    ```
    
    を、
    
    ```text
    時間が0秒
    ```
    
    へ変更してはいけません。
    
    **原文にない説明・単位・意味を追加禁止です。**
    
    ---
    
    # 【㊺ 最終チェック】
    
    HTML出力前に必ず以下を確認してください。
    
    ## PDF本文
    
    * [ ] PDF本文をすべて収録した
    * [ ] 要約していない
    * [ ] 省略していない
    * [ ] 短縮していない
    * [ ] 言い換えていない
    * [ ] 勝手に修正していない
    * [ ] 勝手に文章を追加していない
    * [ ] 勝手に文章を削除していない
    * [ ] 順番を変更していない
    
    ## リンク
    
    * [ ] HTML先頭にtop-linksがある
    * [ ] リンクタイトルをそのまま使用した
    * [ ] URLをそのまま使用した
    * [ ] URLを勝手に推測していない
    * [ ] 複数リンクに対応している
    
    ## 句点
    
    * [ ] 通常本文の「。」の直後にperiod-breakを追加した
    * [ ] 句点そのものを変更していない
    
    ## 数学
    
    * [ ] `$t=0$` を数学表示できる
    * [ ] `t=0` を数学表記として認識できる
    * [ ] `$...$` をLaTeX相当として処理している
    * [ ] `$$...$$` に対応している
    * [ ] MathJaxを使用している
    * [ ] 数値を変更していない
    * [ ] 変数を変更していない
    * [ ] 単位を勝手に追加していない
    * [ ] 説明を勝手に追加していない
    * [ ] 数式の意味を変更していない
    
    ## 色
    
    * [ ] 配色セット選択がある
    * [ ] 現在指定カラーセットがある
    * [ ] 黒背景・白文字セットがある
    * [ ] 現在指定カラーセットを独立セットとして登録している
    * [ ] 個別色変更ができる
    * [ ] リアルタイム反映される
    * [ ] localStorage保存がある
    * [ ] 設定を復元できる
    
    ## コピー
    
    * [ ] CSS設定をコピーできる
    * [ ] 現在適用中の色をコピーする
    * [ ] 固定初期値をコピーしない
    * [ ] コピー成功表示がある
    
    ## UI
    
    * [ ] 🎨設定パネルがある
    * [ ] 設定パネルを開閉できる
    * [ ] 初期化できる
    * [ ] 表示モード切替がある
    * [ ] PC対応
    * [ ] スマートフォン対応
    * [ ] Blogger対応
    
    ---
    
    # 【最終指示】
    
    上記すべてを厳守して、
    
    **PDF原文を完全保持した完成HTML**
    
    を1つ作成してください。
    
    特に、
    
    **原文の内容変更は禁止**
    
    ですが、
    
    **数学表示・HTML構造化・CSS装飾・LaTeX / MathJax変換は許可**
    
    とします。
    
    最優先順位は、
    
    1. **PDF本文を変更しない**
    2. **PDF本文を省略しない**
    3. **数学記号を正しく表示する**
    4. **リンクタイトル+URLをHTML先頭に配置する**
    5. **HTMLとして正常動作させる**
    6. **配色セットを実装する**
    7. **個別色変更・保存・CSSコピーを実装する**
    8. **表示を美しく整える**
    
    の順番としてください。
    
    **最終的に、実際に使用できる完全なHTMLを出力してください。**
    




    【このプロンプトの目的とやっている内容】
    
    提供された「対話テキスト(文章)」と「各種リンクデータ」を、専用のHTMLテンプレートに確実に組み込み、1つの独立したHTMLファイルに変換・生成するための指示文です。
    
    このテンプレートには、以下の機能がJavaScriptで実装されています。
    
    ・文字サイズ変更
    ・数式スタイル切替(MathJax対応)
    ・ダークモード切替
    ・HTMLファイル保存(ダウンロード)
    ・コードブロックのコピーボタン
    ・ブログページへ掲載した場合にも可能な限り動作するコピー機能
    
    AIには、この構造や既存機能を壊さずに入力データを組み込むことを要求します。
    
    ---
    
    # 【依頼内容】
    
    あなたは優秀なフロントエンドエンジニアです。
    
    以下の【厳守事項】に従い、末尾に提供された【入力データ】の「対話文章」と「リンク」を、【指定HTMLテンプレート】の該当箇所に組み込んでください。
    
    最終的に、完全に動作する1つの独立HTMLファイルとして生成してください。
    
    ---
    
    # 【最重要事項:コピーボタンについて】
    
    対話文章内にHTML、Python、JavaScript、CSS、数式以外のプログラムコード、その他コピーが必要なコードブロックが存在する場合、各コードブロックにコピーボタンを追加してください。
    
    ブログページにHTMLを掲載した場合にも、JavaScriptが許可されている環境ではコピーボタンが正常に動作するようにしてください。
    
    コピー処理は次の仕様を必ず満たしてください。
    
    ## コピー機能の必須仕様
    
    ### 1. Clipboard APIを優先使用する
    
    以下を優先してください。
    
    ```javascript
    navigator.clipboard.writeText()
    ```
    
    ### 2. Clipboard APIが使用できない場合の代替処理を必ず実装する
    
    以下のようなフォールバック処理を必ず実装してください。
    
    ```javascript
    document.execCommand('copy')
    ```
    
    したがって、コピー機能は以下のように、
    
    1. Clipboard APIを試す
    2. 失敗した場合は従来方式を試す
    3. コピー成功・失敗をユーザーに表示する
    
    という二段階方式にしてください。
    
    ---
    
    ### 3. コピーボタンはコードブロックごとに設置する
    
    コードは以下のような構造にしてください。
    
    ```html
    <div class="code-container">
        <button class="copy-btn">コピー</button>
        <pre><code>ここにコード</code></pre>
    </div>
    ```
    
    ただし、コピー対象はボタン自身ではなく、対応する `<code>` 要素のテキストだけにしてください。
    
    ---
    
    ### 4. ボタンを押したコードだけをコピーする
    
    複数のコードブロックが存在する場合でも、
    
    ```text
    コードAのコピー
    ```
    
    を押した場合はコードAだけ、
    
    ```text
    コードBのコピー
    ```
    
    を押した場合はコードBだけ、
    
    正確にコピーしてください。
    
    すべてのコードをまとめてコピーしてはいけません。
    
    ---
    
    ### 5. コピー後の表示
    
    コピー成功時にはボタン表示を一時的に変更してください。
    
    例:
    
    ```text
    コピー
    ↓
    コピーしました
    ↓
    コピー
    ```
    
    コピー失敗時には、
    
    ```text
    コピーに失敗しました
    ```
    
    と表示してください。
    
    数秒後に元の
    
    ```text
    コピー
    ```
    
    へ戻してください。
    
    ---
    
    ### 6. HTMLとして安全にコードを表示する
    
    対話文章内のコードに、
    
    ```html
    <div>
    <script>
    &
    <
    >
    ```
    
    などが含まれている場合でも、HTML構造が壊れないようにしてください。
    
    コードブロック内では必ずHTMLエスケープを適切に行ってください。
    
    特に、
    
    ```text
    &
    <
    >
    "
    '
    ```
    
    を適切に処理してください。
    
    ただし、コピーするときはエスケープ文字列ではなく、元のコード内容を正確にコピーできるようにしてください。
    
    ---
    
    ### 7. コードブロックの判定
    
    入力された対話文章に以下のようなMarkdownコードブロックがある場合、
    
    ````text
    ```python
    print("hello")
    ```
    ````
    
    または、
    
    ````text
    ```html
    <div>Hello</div>
    ```
    ````
    
    これらをHTMLへ変換する際には、コードブロックとして認識してください。
    
    生成結果では、
    
    ```html
    <div class="code-container">
        <button type="button" class="copy-btn">コピー</button>
        <pre><code class="language-python">...</code></pre>
    </div>
    ```
    
    のような構造にしてください。
    
    ---
    
    # 【重要な制限事項】
    
    ブログサービスによっては、投稿本文内の
    
    ```html
    <script>
    ```
    
    が削除されたり、無効化されたりする場合があります。
    
    その場合、HTML本文だけではJavaScriptによるコピーボタンは動作しません。
    
    したがって、JavaScriptが削除・禁止されるブログ環境では、
    
    **HTMLだけでJavaScriptのコピー機能を完全に実現することはできません。**
    
    この制限を無視して「必ずブログ上で動作する」と断定してはいけません。
    
    ただし、以下の場合には正常に動作するコードを生成してください。
    
    ・独立HTMLファイルとして保存した場合
    ・JavaScriptを許可しているブログページ
    ・外部JavaScriptまたはテンプレートJavaScriptを使用できるブログ
    
    ブログ側で `<script>` が禁止される場合でも、HTML構造として、
    
    ```html
    <div class="code-container">
        <button class="copy-btn">
    ```
    
    を生成し、後からブログの共通JavaScriptによってコピー機能を追加できる構造にしてください。
    
    ---
    
    # 【厳守事項】
    
    ## 1. 文章をHTMLへ変換する
    
    提供された文章を必ずHTML形式に変換してください。
    
    ログインページ、リダイレクト、追跡機能、不要な外部通信、悪意のあるCDNスクリプトは絶対に作成・読み込みしないでください。
    
    ---
    
    ## 2. リンクの配置ルール
    
    リンクの配置は以下の順序を厳守してください。
    
    ### ① 先頭リンク
    
    【提供したリンク】のうち、
    
    **最初の2つだけ**
    
    を、対話本文より上の、
    
    ```html
    <div id="top-links">
    ```
    
    内へ配置してください。
    
    ---
    
    ### ② 追加リンク
    
    【提供したリンク】の、
    
    **3つ目以降のすべてのリンク**
    
    を、対話本文の直後にある、
    
    ```html
    <div id="additional-links">
    ```
    
    内へ配置してください。
    
    ---
    
    ### ③ 本文内のリンク
    
    さらに、
    
    ```html
    <div id="inline-links">
    ```
    
    内に、対話本文中に登場したURLを抽出して配置してください。
    
    抽出対象が存在しない場合は、
    
    ```html
    <li>特になし</li>
    ```
    
    と記載してください。
    
    ---
    
    ### リンク確認
    
    出力前に必ず以下を確認してください。
    
    ・入力されたリンクに貼り落としがないか
    ・リンクの漏れがないか
    ・最初の2つだけが先頭リンクに配置されているか
    ・3つ目以降が追加リンクにすべて配置されているか
    
    ---
    
    ## 3. テンプレートの既存機能を破壊しない
    
    ベースとなる【指定HTMLテンプレート】の以下の機能は削除してはいけません。
    
    ・文字サイズ変更
    ・数式スタイル変更
    ・ダークモード
    ・HTMLダウンロード
    ・MathJax
    ・コピーボタン
    
    既存機能を改変する必要がある場合でも、機能を削除せず、正常動作するように統合してください。
    
    ---
    
    ## 4. MathJax
    
    MathJaxの読み込みは必ず以下を使用してください。
    
    ```html
    <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
    ```
    
    これを変更・削除してはいけません。
    
    ---
    
    ## 5. 対話文章の配置
    
    【対話データ】の文章は必ず、
    
    ```html
    <div id="chat-content">
    ```
    
    内に配置してください。
    
    ユーザーの発言は、
    
    ```html
    <div class="message user" style="background-color: var(--user-bg);">
    ```
    
    AIの発言は、
    
    ```html
    <div class="message ai" style="background-color: var(--ai-bg);">
    ```
    
    で囲んでください。
    
    適宜、
    
    ・見出し
    ・段落
    ・リスト
    ・引用
    ・コードブロック
    
    を使用して、読みやすいHTML構造にしてください。
    
    ---
    
    ## 6. コードブロックの処理
    
    対話データ内のコードは、
    
    ```html
    <pre><code>
    ```
    
    を使用してください。
    
    各コードブロックは必ず、
    
    ```html
    <div class="code-container">
    ```
    
    で囲んでください。
    
    その中に対応するコピーボタンを配置してください。
    
    ---
    
    ## 7. コピーボタンのJavaScript実装
    
    コピー処理はイベント委譲方式または各ボタンへのイベント登録方式で実装してください。
    
    以下の条件を満たしてください。
    
    ・複数のコピーボタンに対応
    ・動的に追加されたコードブロックにも対応可能な構造
    ・対応するコードだけコピー
    ・Clipboard APIを優先
    ・失敗時は `document.execCommand('copy')` を使用
    ・成功表示
    ・失敗表示
    ・JavaScriptエラーが発生しないようにする
    
    ---
    
    ## 8. HTMLダウンロード機能
    
    「この対話を保存」ボタンによるHTML保存機能は必ず残してください。
    
    保存時には、
    
    現在のHTML全体を保存してください。
    
    ただし、コピー機能も含めて保存後のHTMLで正常に動作するようにしてください。
    
    ---
    
    ## 9. 出力形式
    
    最終出力は、
    
    MarkdownのHTMLコードブロックだけ
    
    にしてください。
    
    必ず、
    
    ```html
    ```
    
    から開始し、
    
    ```text
    ```
    
    で終了してください。
    
    AIの挨拶、説明、注意書き、解説は一切出力しないでください。
    
    ---
    
    # 【指定HTMLテンプレート】
    
    以下のHTMLをベースとして使用してください。
    
    必要なコードブロック用CSSおよびコピーボタン用JavaScriptは追加して構いません。
    
    ただし、既存機能を削除・破壊してはいけません。
    
    <!DOCTYPE html>
    
    <html lang="ja">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>対話記録</title>
    
    ```
    <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
    
    <style>
    
        :root {
            --bg-color: #f8f9fa ;
            --text-color: #000 ;
            --box-bg: #fff ;
            --box-border: #ddd ;
            --user-bg: #e6f7ff ;
            --ai-bg: #f6ffed ;
            --base-font-size: 22px;
        }
    
        body.dark-mode {
            --bg-color: #121212 ;
            --text-color: #ffffff ;
            --box-bg: #1e1e1e ;
            --box-border: #333 ;
            --user-bg: #1a2a3a ;
            --ai-bg: #1e3a1e ;
        }
    
        body {
            font-size: var(--base-font-size, 22px);
            background-color: var(--bg-color);
            color: var(--text-color);
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
            line-height: 1.8;
            font-family:
                -apple-system,
                BlinkMacSystemFont,
                "Segoe UI",
                "Noto Sans JP",
                "Yu Gothic",
                sans-serif;
            box-sizing: border-box;
            transition:
                background-color 0.3s,
                color 0.3s;
        }
    
        * {
            box-sizing: border-box;
        }
    
        .settings-ui,
        .link-section,
        .message {
            background-color: var(--box-bg);
            border: 1px solid var(--box-border);
        }
    
        .settings-ui {
            border-radius: 8px;
            padding: 15px;
            margin-bottom: 20px;
        }
    
        .settings-row {
            display: flex;
            align-items: center;
            gap: 10px;
            flex-wrap: wrap;
            margin-bottom: 10px;
        }
    
        .settings-row:last-child {
            margin-bottom: 0;
        }
    
        .settings-row label {
            font-weight: bold;
        }
    
        input[type="range"] {
            flex: 1;
            min-width: 160px;
        }
    
        select,
        button {
            font-size: 0.8em;
            padding: 7px 10px;
            border: 1px solid var(--box-border);
            background-color: var(--box-bg);
            color: var(--text-color);
            border-radius: 5px;
            cursor: pointer;
        }
    
        button:hover {
            opacity: 0.8;
        }
    
        .link-section {
            padding: 15px;
            margin-bottom: 20px;
            border-radius: 8px;
        }
    
        .link-section h3 {
            margin-top: 0;
            font-size: 1.1em;
            border-bottom: 1px solid var(--box-border);
            padding-bottom: 5px;
        }
    
        .link-section ul {
            padding-left: 20px;
            margin-bottom: 0;
        }
    
        .link-section li {
            margin-bottom: 8px;
        }
    
        .link-section a {
            color: #007bff ;
            word-break: break-all;
            text-decoration: none;
        }
    
        .link-section a:hover {
            text-decoration: underline;
        }
    
        body.dark-mode .link-section a {
            color: #4da3ff ;
        }
    
        .message {
            padding: 20px;
            margin-bottom: 20px;
            border-radius: 10px;
        }
    
        .message h3 {
            margin-top: 0;
            border-bottom: 1px solid var(--box-border);
            padding-bottom: 8px;
            font-size: 1.1em;
        }
    
        .message p {
            margin-bottom: 1em;
        }
    
        .message blockquote {
            border-left: 5px solid var(--box-border);
            padding: 10px 15px;
            margin: 10px 0;
            background-color: rgba(0,0,0,0.03);
        }
    
        body.dark-mode .message blockquote {
            background-color: rgba(255,255,255,0.05);
        }
    
        .concept-box {
            padding: 15px;
            margin: 15px 0;
            border: 1px solid var(--box-border);
            background-color: var(--box-bg);
            border-radius: 8px;
        }
    
        pre,
        .diagram-text {
            font-family: monospace;
            white-space: pre-wrap;
            border: 1px solid var(--box-border);
            background-color: var(--box-bg);
            padding: 15px;
            border-radius: 6px;
            overflow-x: auto;
        }
    
        .code-container {
            position: relative;
            margin: 1em 0;
        }
    
        .code-container pre {
            margin: 0;
            padding-top: 55px;
        }
    
        .copy-btn {
            position: absolute;
            top: 8px;
            right: 8px;
            z-index: 2;
        }
    
        hr {
            border: 0;
            border-top: 1px solid var(--box-border);
            margin: 2em 0;
        }
    
        body.force-inline mjx-container[display="true"] {
            display: inline-block !important;
            margin: 0 !important;
        }
    
        body.force-display mjx-container {
            display: block !important;
            text-align: center !important;
            margin: 1em 0 !important;
        }
    
        @media (max-width: 600px) {
    
            body {
                padding: 10px;
            }
    
            .settings-row {
                align-items: flex-start;
                flex-direction: column;
            }
    
            .settings-row input[type="range"] {
                width: 100%;
            }
    
        }
    
    </style>
    ```
    
    </head>
    
    <body>
    
    ```
    <div class="settings-ui">
    
        <div class="settings-row">
    
            <label for="font-size-slider">
                文字サイズ:
            </label>
    
            <input
                type="range"
                id="font-size-slider"
                min="10"
                max="40"
                value="22"
                step="1"
            >
    
            <span id="font-size-display">
                22px
            </span>
    
        </div>
    
    
        <div class="settings-row">
    
            <label for="math-style-selector">
                数式スタイル:
            </label>
    
            <select id="math-style-selector">
    
                <option value="default">
                    標準(自動)
                </option>
    
                <option value="force-inline">
                    全てインライン(テキスト内埋め込み)
                </option>
    
                <option value="force-display">
                    全て独立行(ディスプレイ)
                </option>
    
            </select>
    
        </div>
    
    
        <div class="settings-row">
    
            <select id="ai-selector">
    
                <option value="AI Studio">
                    AI Studio
                </option>
    
                <option value="Chat GPT">
                    Chat GPT
                </option>
    
                <option value="Claude">
                    Claude
                </option>
    
            </select>
    
    
            <button
                type="button"
                id="download-btn"
            >
                この対話を保存
            </button>
    
    
            <button
                type="button"
                id="dark-mode-btn"
            >
                背景・文字色を反転
            </button>
    
        </div>
    
    </div>
    
    
    <!-- ① 先頭リンク -->
    
    <div
        class="link-section"
        id="top-links"
    >
    
        <h3>
            【提供したリンク】
        </h3>
    
        <ul>
    
            <!--
            ここに提供されたリンクの
            最初の2つだけを挿入
            -->
    
        </ul>
    
    </div>
    
    
    <!-- 対話本文 -->
    
    <div id="chat-content">
    
        <!--
        ここに対話データを挿入
        -->
    
    </div>
    
    
    <!-- ② 追加リンク -->
    
    <div
        class="link-section"
        id="additional-links"
    >
    
        <h3>
            【追加リンク】
        </h3>
    
        <ul>
    
            <!--
            ここに提供されたリンクの
            3つ目以降をすべて挿入
            -->
    
        </ul>
    
    </div>
    
    
    <!-- ③ 本文内のリンク -->
    
    <div
        class="link-section"
        id="inline-links"
    >
    
        <h3>
            【本文内のリンク】
        </h3>
    
        <ul>
    
            <!--
            本文中のURLを抽出して挿入
            -->
    
        </ul>
    
    </div>
    
    
    <script>
    
        const fontSizeSlider =
            document.getElementById(
                'font-size-slider'
            );
    
        const fontSizeDisplay =
            document.getElementById(
                'font-size-display'
            );
    
    
        fontSizeSlider.addEventListener(
            'input',
            function() {
    
                const value =
                    this.value;
    
                document.documentElement
                    .style
                    .setProperty(
                        '--base-font-size',
                        value + 'px'
                    );
    
                fontSizeDisplay.textContent =
                    value + 'px';
    
            }
        );
    
    
        const mathStyleSelector =
            document.getElementById(
                'math-style-selector'
            );
    
    
        mathStyleSelector.addEventListener(
            'change',
            function() {
    
                document.body.classList.remove(
                    'force-inline',
                    'force-display'
                );
    
    
                if (
                    this.value ===
                    'force-inline'
                ) {
    
                    document.body.classList.add(
                        'force-inline'
                    );
    
                }
    
                else if (
                    this.value ===
                    'force-display'
                ) {
    
                    document.body.classList.add(
                        'force-display'
                    );
    
                }
    
    
                if (
                    window.MathJax &&
                    MathJax.typesetPromise
                ) {
    
                    MathJax.typesetPromise();
    
                }
    
            }
        );
    
    
        const darkModeBtn =
            document.getElementById(
                'dark-mode-btn'
            );
    
    
        darkModeBtn.addEventListener(
            'click',
            function() {
    
                document.body.classList.toggle(
                    'dark-mode'
                );
    
            }
        );
    
    
        const downloadBtn =
            document.getElementById(
                'download-btn'
            );
    
    
        const aiSelector =
            document.getElementById(
                'ai-selector'
            );
    
    
        downloadBtn.addEventListener(
            'click',
            function() {
    
                const now =
                    new Date();
    
    
                const pad =
                    num =>
                    String(num).padStart(
                        2,
                        '0'
                    );
    
    
                const timestamp =
                    now.getFullYear() +
                    pad(now.getMonth() + 1) +
                    pad(now.getDate()) +
                    pad(now.getHours()) +
                    pad(now.getMinutes()) +
                    pad(now.getSeconds());
    
    
                const aiName =
                    aiSelector.value.replace(
                        /\s+/g,
                        '_'
                    );
    
    
                const fileName =
                    '_' +
                    aiName +
                    '_' +
                    timestamp +
                    '.html';
    
    
                const htmlContent =
                    '<!DOCTYPE html>\n' +
                    document.documentElement.outerHTML;
    
    
                const blob =
                    new Blob(
                        [htmlContent],
                        {
                            type:
                                'text/html;charset=utf-8'
                        }
                    );
    
    
                const url =
                    URL.createObjectURL(
                        blob
                    );
    
    
                const a =
                    document.createElement(
                        'a'
                    );
    
    
                a.href =
                    url;
    
    
                a.download =
                    fileName;
    
    
                document.body.appendChild(
                    a
                );
    
    
                a.click();
    
    
                document.body.removeChild(
                    a
                );
    
    
                URL.revokeObjectURL(
                    url
                );
    
            }
        );
    
    
        document.addEventListener(
            'click',
            async function(event) {
    
                const button =
                    event.target.closest(
                        '.copy-btn'
                    );
    
    
                if (!button) {
    
                    return;
    
                }
    
    
                const container =
                    button.closest(
                        '.code-container'
                    );
    
    
                if (!container) {
    
                    return;
    
                }
    
    
                const code =
                    container.querySelector(
                        'pre code'
                    );
    
    
                if (!code) {
    
                    return;
    
                }
    
    
                const text =
                    code.innerText;
    
    
                const originalText =
                    button.textContent;
    
    
                let copied =
                    false;
    
    
                try {
    
                    if (
                        navigator.clipboard &&
                        window.isSecureContext
                    ) {
    
                        await navigator.clipboard.writeText(
                            text
                        );
    
                        copied =
                            true;
    
                    }
    
                }
    
                catch (error) {
    
                    copied =
                        false;
    
                }
    
    
                if (!copied) {
    
                    try {
    
                        const textarea =
                            document.createElement(
                                'textarea'
                            );
    
    
                        textarea.value =
                            text;
    
    
                        textarea.setAttribute(
                            'readonly',
                            ''
                        );
    
    
                        textarea.style.position =
                            'fixed';
    
    
                        textarea.style.left =
                            '-9999px';
    
    
                        textarea.style.top =
                            '-9999px';
    
    
                        document.body.appendChild(
                            textarea
                        );
    
    
                        textarea.select();
    
    
                        textarea.setSelectionRange(
                            0,
                            textarea.value.length
                        );
    
    
                        copied =
                            document.execCommand(
                                'copy'
                            );
    
    
                        document.body.removeChild(
                            textarea
                        );
    
                    }
    
                    catch (error) {
    
                        copied =
                            false;
    
                    }
    
                }
    
    
                if (copied) {
    
                    button.textContent =
                        'コピーしました';
    
    
                    setTimeout(
                        function() {
    
                            button.textContent =
                                originalText;
    
                        },
                        2000
                    );
    
                }
    
                else {
    
                    button.textContent =
                        'コピーに失敗しました';
    
    
                    setTimeout(
                        function() {
    
                            button.textContent =
                                originalText;
    
                        },
                        3000
                    );
    
                }
    
            }
        );
    
    </script>
    ```
    
    </body>
    </html>
    
    ---
    
    # 【入力データ】
    
    ## ■ 提供したリンク:
    
    (※ここに複数のリンクを貼り付け)
    
    最初の2つを、
    
    ```html #top -links
    ```
    
    へ配置する。
    
    3つ目以降をすべて、
    
    ```html #additional -links
    ```
    
    へ配置する。
    
    ---
    
    ## ■ 対話文章データ:
    
    (※ここに対話テキストの文章を丸ごと貼り付け)
    
    対話文章内のMarkdownコードブロックは必ず検出し、
    
    ```html
    <div class="code-container">
    ```
    
    と、
    
    ```html
    <button class="copy-btn">
    ```
    
    を使用したコピー可能なコードブロックへ変換する。
    
    コピー処理は、
    
    1. Clipboard API
    2. document.execCommand('copy')
    
    の順番で実行すること。
    

    あなたへのおすすめ