📚

[js] リンク先の Markdown をオシャレに表示するカスタムエレメントをつくろう

2024/02/20に公開

^.,.^ < Hey! 青色きつねです。
リンク先の.mdをfetchしてきてデザインを調整しつつ表示するカスタムエレメントをBlueFox(Edge拡張)のフロントために書いたよ。普通ライブラリを探すんだろうけど、野生動物には今のGoogleは難しすぎるの。

https://developer.mozilla.org/ja/docs/Web/API/Window/customElements

できあがったもの

こうすると、

<mark-down src="/docs/README.md"></mark-down>

こうなる。
インスタントに表示することができる。たかだか表示のためだけにSSRだなんだと色々したくない場合に便利。

使うライブラリ

MarkdownをHtmlにしてくれる
https://github.com/markedjs/marked
シンタックスハイライトしてくれる
https://github.com/highlightjs/highlight.js
その他:
ベースのデザインに使っているUiKit
https://github.com/uikit/uikit
DOM操作に使うライブラリ(querySelectorで代用可)
https://github.com/xoFeulB/BlueFoxJs

ソース

https://github.com/xoFeulB/BlueFox/blob/v0.3/js/md-src.js

せつめいしょ

分かりやすいようにコードをちょっと削ってみます。

  1. fetchしてきたmd(htmlもいけます)をmarkedでパースしてdivに入れます。
  2. codeタグの中をいい具合に着色したいので、codeの中をhighlightしてcodeの中に入れなおします。
  3. ついでにcodeの中身をクリップボードに入れるボタンを作っときます

ちなみにfetchなのでローカルファイルだと動きません

window.customElements.define("mark-down", class extends HTMLElement {
  constructor() {
    (async () => {
      super();
      let div = document.createElement("div");
      try {
        let r = await fetch(this.attributes.src.value);
        let text = await r.text();
        if (r.ok) {
          div.innerHTML = marked.parse(text);
        }
        await BlueFoxJs.Walker.walkHorizontally({
          _scope_: div,
          "code": async ($) => {
            $.element.innerHTML = highlight.highlight(
              $.element.textContent,
              {
                language: $.element.className
              }
            ).value;
            let button = document.createElement("button");
            button.addEventListener("click", async (event) => {
              navigator.clipboard.writeText($.element.textContent);
            });
            let menu = document.createElement("div");
            menu.append(button);
            $.element.parentElement.prepend(menu);
          }
        });
      } catch (e) {

      }
      this.appendChild(div);
    })();
  }
});

GitHubに転がってるREADMEを読み込んでみる

画像は相対パスだと無理なものの、普通に使えそう

つかいどころ

ホームページやブログ… はSEOが壊滅しちゃいそう。
Webアプリとかブラウザ拡張機能には丁度いいかも。ちゃんとライブラリにしようかな


Social

https://github.com/xoFeulB
https://twitter.com/xoFeulB
https://bsky.app/profile/xofeulb.bluefox.tech

Discussion