ホームページ >ウェブフロントエンド >jsチュートリアル >Bear Blog で Webmention インタラクションを表示するためのステップバイステップ ガイド

Bear Blog で Webmention インタラクションを表示するためのステップバイステップ ガイド

Barbara Streisand
Barbara Streisandオリジナル
2024-11-03 15:15:02655ブラウズ

Step-by-Step Guide to Show Webmention Interactions on Bear Blog

この投稿では、Webmention.io API を使用して、人々がブログ投稿に対して行ったすべてのインタラクションを表示する方法を示します。

これを機能させるには 2 つのものが必要です:

  1. Webmention.io サービスを使用するには、Web サイトを設定する必要があります。
  2. 各ブログ投稿の下にインタラクションを表示するには、少しカスタム JavaScript が必要です。

Webmention.io のセットアップ自体は、この Web サイトですでに詳細な手順が提供されているため、この投稿の範囲外です。

それでは、必要なカスタム JavaScript に進みましょう。

JavaScript コード

以下は完全な JavaScript コードです。コードの後に​​各部分がどのように機能するかを説明します。

if (document.querySelector("body").classList.contains("post")) {
  function setContent(child) {
    switch (child["wm-property"]) {
      case "in-reply-to":
        return child.content?.text;
      case "like-of":
        return "liked this";
      case "repost-of":
        return "reposted this";
      default:
        return "interacted with this post in an unknown way";
    }
  }

  async function fetchInteractions(headerTitle) {
    const response = await fetch("https://webmention.io/api/mentions.jf2?target=" + document.URL);
    const data = await response.json();
    if (data && data.children.length > 0) {

      const interactions = document.createElement("div");
      interactions.innerHTML = `<h3>${headerTitle ?? "Interactions"}</h3>`;

      for (const child of data.children) {
        const interaction = document.createElement("div");

        interaction.innerHTML = `
              <p>
                  <strong><a href="${child.author.url}" target="_blank">${child.author.name}</a></strong>
                  <small> - ${new Date(child["wm-received"]).toLocaleString("en-US", {
          month: "short",
          day: "numeric",
          year: "numeric",
        })}</small>
              </p>
              <blockquote>${setContent(child)}</blockquote>
          `;

        interactions.appendChild(interaction);
      }

      const upvoteForm = document.getElementById("upvote-form");
      upvoteForm.parentNode.insertBefore(interactions, upvoteForm.nextSibling);
    }
  }

  fetchInteractions(document.currentScript.getAttribute("data-interactions"));
}

主なロジックは fetchInteractions() 関数内にあり、この関数は 1 つのパラメーター (すべてのインタラクションのヘッダーとして表示するテキスト) を受け入れます。デフォルトでは、ヘッダー テキストは「Interactions」ですが、