スタンドアロンなナレッジベースの作成

html,CSS,JavaScriptを用いてスタンドアロンかつマークダウン記法によって書かれたナレッジベースを作りました。

CSSやJavaScriptのライブラリは、CDNからコピー&ペーストする形で、できる限りダウンロードを避けて製作しました。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8" />
  <title>ホーム - テーブル検索</title>
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <link rel="stylesheet" href="./assets/css/water.css">
  <link rel="stylesheet" href="./assets/css/animate.css">
  <link rel="stylesheet" href="./assets/css/print.css">
  <style>
    table {
      width: 100%;
      border-collapse: collapse;
      table-layout: fixed;
    }
    th, td {
      padding: 0.6em;
      word-break: break-word;
    }
  </style>
</head>
<body>
  <h1>ホーム</h1>
  <p>ページ名、説明、カテゴリから検索:</p>
  <input type="search" id="search" placeholder="例:開発、連絡先" />

  <table>
    <thead>
      <tr>
        <th>タイトル</th>
        <th>説明</th>
        <th>カテゴリ</th>
      </tr>
    </thead>
    <tbody id="pageTableBody">
      <!-- JSで動的に埋め込み -->
    </tbody>
  </table>
  <script src="./assets/js/fuse.js"></script>
  <script src="./assets/js/marked.js"></script>
  <script>
    const pages = [
      {
        title: "自己紹介",
        url: "profile.html",
        description: "筆者の経歴やスキルセットの紹介ページ。",
        category: "プロフィール"
      },
      {
        title: "プロジェクト一覧",
        url: "projects.html",
        description: "これまでに関わったプロジェクトの一覧です。",
        category: "制作物"
      },
      {
        title: "お問い合わせ",
        url: "contact.html",
        description: "メールやSNSでの連絡手段をまとめています。",
        category: "連絡先"
      },
      {
        title: "開発ノート",
        url: "devlog.html",
        description: "開発中の記録やアイデアを書き留めています。",
        category: "ブログ"
      },
      {
        title: "テストページ",
        url: "test.html",
        description: "デザインや機能のテスト用ページです。",
        category: "その他"
      }
    ];

    const fuse = new Fuse(pages, {
      keys: ["title", "description", "category"],
      threshold: 0.4
    });

    const input = document.getElementById("search");
    const tbody = document.getElementById("pageTableBody");

    function renderTable(results) {
      tbody.innerHTML = "";
      results.forEach(({ item }) => {
        const tr = document.createElement("tr");

        const tdTitle = document.createElement("td");
        const a = document.createElement("a");
        a.href = item.url;
        a.textContent = item.title;
        tdTitle.appendChild(a);

        const tdDesc = document.createElement("td");
        tdDesc.textContent = item.description;

        const tdCat = document.createElement("td");
        tdCat.textContent = item.category;
        tdCat.className = "category";

        tr.appendChild(tdTitle);
        tr.appendChild(tdDesc);
        tr.appendChild(tdCat);

        tbody.appendChild(tr);
      });
    }

    renderTable(pages.map(p => ({ item: p })));

    input.addEventListener("input", () => {
      const query = input.value.trim();
      if (!query) {
        renderTable(pages.map(p => ({ item: p })));
      } else {
        const results = fuse.search(query);
        renderTable(results);
      }
    });
  </script>
</body>
</html>
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <title>Markdown Viewer</title>
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link rel="stylesheet" href="./assets/css/water.css">
    <link rel="stylesheet" href="./assets/css/animate.css">
    <link rel="stylesheet" href="./assets/css/print.css">
  </head>
  <body class="full-height">
    <div id="bg"></div>
    <main>
      <pre id="markdown-source" style="display: none;">
<!-- ここからMarkdown記法 -->
# サンプル見出し

これは**マークダウン**のテストです。
記法
- リスト1
- リスト2
- リスト3  

これは `file:///C:/Users/Example/` のように書きます。

```plaintext
file:///C:/Users/Example/
```

<!-- ここまでMarkdown記法 -->
    </pre>
      <div id="markdown-rendered" class="animate__animated animate__fadeInUp"></div>
    </main>
    <script src="./assets/js/marked.js"></script>
    <script>
    // 1. プレ要素からマークダウン文字列を取得
    const markdownText = document.getElementById("markdown-source").textContent;

    // 2. marked.js を使ってHTMLに変換
    const html = marked.parse(markdownText);

    // 3. 変換したHTMLをレンダリングエリアに出力
    document.getElementById("markdown-rendered").innerHTML = html;
  </script>
  </body>
</html>

Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です