寺生まれで霊感の強いChrome拡張機能

本記事は[クソアプリ Advent Calender 2020](https://qiita.com/advent-calendar/2020/kuso-app) 21日目の記事です。

# 寺生まれって凄い

[寺生まれで霊感の強いTさんについて](https://dic.pixiv.net/a/%E5%AF%BA%E7%94%9F%E3%81%BE%E3%82%8C%E3%81%AET%E3%81%95%E3%82%93)

> (前略)
> 見ると顔の抉れた女が対向車線を走るトラックの方向を狂わそうと、
> 車体飛び移っている所だった！
> 「ハンドル頼んだぜ・・・」
> Tさんはそう呟くと車の窓から上半身を外に出し、狙いを定め
> 「破ぁーーーーー！！」と叫んだ
> するとTさんの両手から青白い光弾が飛びだし、女の霊を吹き飛ばした
> 「これで安心だな・・・」そう呟いて片手でタバコに火をつけるTさん。
> 寺生まれってスゲェ・・・その時初めてそう思った。
> <[出典](https://wikiwiki.jp/moudameder/%E3%82%B3%E3%83%94%E3%83%9A/%E5%AF%BA%E7%94%9F%E3%81%BE%E3%82%8C%E3%81%AET%E3%81%95%E3%82%93)>

どんな亡霊や妖怪の類も調伏するTさん。すごいですよね。
もし[青空文庫の怖い系小説](https://note.com/mimonelu/n/n84b11a67629e)を読んでいて、どうしても怖くなってしまい続きを読めなくなったとき、Tさんが颯爽と現れてくれたら心強いと思いませんか？

思ったので、ボタン一つでTさんを召喚できる Chrome 拡張機能を作りました。
Chrome拡張機能の開発は今回が初めての試みです。

# T san In Aozora 拡張機能

このAdvent Calendarのためだけに $5 払って**TsanInAozora**拡張機能を審査に出しましたが、申請したのが12月19日（土）だったため、**おそらく21日（月）には間に合いません。**

そのため使う場合は、下記のリポジトリをクローンして`chrome://extensions`のページから手動で導入をお願いします。~~（誰も使わんやろなぁ）~~

https://github.com/Hide-KC/TsanInAozora

[Chrome拡張機能のローカルの導入手順はこちらを参照](https://qiita.com/k__watanabe/items/4777ecf1242927768b53)

# 使い方

青空文庫の小説を表示中に右上のアクションボタンを押すと、`<body>`タグをTさんコピペに置換します。それだけ！
アクションボタンが出ない場合は、右側のパズルのピースのようなアイコンを押してピン止めしてください。

なお、`https://www.aozora.gr.jp/cards/.*/files/.*.html`に一致するページがアクティブになってる場合のみ動作します。

> 置換前
![qiita_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209042/4db83b49-a43f-917b-dd76-b69da7acc00a.png)

> 置換後
![qiita_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209042/bd75ea60-443d-fdf8-c659-86ca1aee5da1.png)

# こだわりポイント

### Content Script側でしかDOM操作はできない

今回は`<body>`タグを書き換えるため、DOM操作が必要になります。
しかし、上述したようにDOMはContent Script側でしか操作ができないっぽいため、次のようにListenerを追加して、アクションボタンからのメッセージを取得し置換を行いました。

```js
// content_script.js
chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
  
  const regex = new RegExp('https://www\.aozora\.gr\.jp/cards/.*/files/.*\.html');
  const found = msg.url.match(regex);
  console.log(msg.url);

  if (found && msg.command == "summon") {
    var src = document.getElementsByTagName("body")[0].innerHTML;
    var dst = "その時だった！</br>「破ぁーーーーーーーーーーーーーーーーーッ！」</br>青白い光弾が爆ぜる。寺生まれで霊感の強いＴさんだ！</br>「危ない所だったが、間に合ってよかったぜ」</br>Ｔさんはそう言うと、風のように颯爽と去っていった。</br>寺生まれって本当に凄い。私は改めてそう思った。";
    document.getElementsByTagName("body")[0].innerHTML = dst;
  }
});
```

文字列直書き……（ ＾ω＾）

[Chrome拡張機能でDOMを操作する方法](https://trycatchand.blogspot.com/2014/05/how-to-manipulate-dom-from-chrome-extension.html?m=1)

### アイコン

![icon128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209042/2692c1a3-8b60-54bc-6459-fdda371f4b44.png)

[配色アイデア手帖](https://www.amazon.co.jp/dp/B07881DSZQ/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)を基に、怪談をイメージして夏っぽい色合い（紺と黄色）を選んでみました。
また、クソアプリなのでクソダサアイコンを目指し、Paint.netで30分くらいで作成しました。

# 元ネタ

こちらのしおりがバズっていたので。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">どんな怖い小説も一瞬でハッピーエンドにする最強のしおり作りました <a href="https://t.co/ZQbHSFjc9P">pic.twitter.com/ZQbHSFjc9P</a></p>&mdash; Ri-さむMSX (@RiMSX) <a href="https://twitter.com/RiMSX/status/1087699951990169600?ref_src=twsrc%5Etfw">January 22, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 宣伝とか

少し前にVSCodeの記事を書いたりしています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">VSCodeの記事が公開されましたので宣伝٩( ᐛ )و<br><br>Visual Studio Codeのうれしい機能を使いこなして、初心者を最速で脱出する！《VScode実践入門》 <a href="https://twitter.com/hashtag/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2Hub?src=hash&amp;ref_src=twsrc%5Etfw">#エンジニアHub</a> - エンジニアHub｜若手Webエンジニアのキャリアを考える！ <a href="https://t.co/mcKPAAy8b4">https://t.co/mcKPAAy8b4</a></p>&mdash; KC@インク沼 (@kcpoipoi) <a href="https://twitter.com/kcpoipoi/status/1141905644531773440?ref_src=twsrc%5Etfw">June 21, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

[VSCodeで回転寿司](https://marketplace.visualstudio.com/items?itemName=kcpoipoi.sushi-buffet)やってみたり。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Flow Many Sushi on VS Code<br>（拡張機能名: Sushi Buffet）<br>流れるSushi。CSSけっこうがんばった。マーケットプレイスに公開済 <a href="https://t.co/9B6YGR6llc">pic.twitter.com/9B6YGR6llc</a></p>&mdash; KC@インク沼 (@kcpoipoi) <a href="https://twitter.com/kcpoipoi/status/1123986180532527104?ref_src=twsrc%5Etfw">May 2, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

あとは技術書典に少しだけサークル参加してたり、普段はAndroidアプリを作ったりしています。
本当ならクソAndroidアプリを投稿する予定だったのですが、~~締切間に合いそうになかったので~~急遽こちらのネタに差し替えるムーヴをかましました。

拡張機能の開発方法はちょいちょい調べていましたが、いざ実装してみたら30分で動作確認、実質１時間程度でリリースレベルまで作れてしまいました。めっちゃ簡単ですね。

せっかくお金支払ったのですから、気が向いたらまた何か作ってみたいですね。
明日はnishinoshakeさんの投稿です。クソ期待して待機しましょう。