Markdownに広告を挿入するプラグイン「rehype-auto-ads」
Markdownで作成した記事に自動的に広告を挿入する「rehype-auto-ads」というrehypeプラグインを開発しました!

この記事では、rehype-auto-adsを開発した経緯や使い方について詳しく説明します。使い方だけ読みたい方は、そこまで飛ばしていただいて構いません。
目次
rehype-auto-adsとは
rehype-auto-adsは、Markdownで作成した記事に、自動でいい感じに広告を挿入してくれるrehypeプラグインです。指定した段落数ごと(デフォルトでは5段落ごと)に自動で広告を挿入します。
https://www.npmjs.com/package/rehype-auto-ads
Google Adsenseの自動広告と違い、コードブロックや引用ブロックなどの途中に広告が挿入されることはありません。また、何段落ごとに広告を挿入するか設定できるので、Adsenseの自動広告よりも柔軟性が高くなっています。
たとえば、次のようなMarkdownを書いたとします。
# Hello, world!
This is a paragraph.
This is a paragraph.
This is a paragraph.
This is a paragraph.説明のために、rehype-auto-adsを使って2段落ごとに<ad-code />というコードを挿入する場合を考えます。この場合、次のようなHTMLが生成されます。もちろん、何段落ごとにどのようなコードを挿入するかはオプションで設定できます。
<h1>Hello, world!</h1><p>This is a paragraph.</p><p>This is a paragraph.</p><AD-CODE /><p>This is a paragraph.</p><p>This is a paragraph.</p><AD-CODE />rehype-auto-adsのメリット
Markdownベースのサイトで、サイトの上部や記事の末尾、サイドバーなどに広告を挿入する際には、テンプレートを編集するだけなのでプラグインは不要です。
しかし、記事の本文中に広告を挿入する場合は、途端に面倒になります。
Google Adsenseの自動広告は評判が悪いですし、手動で広告コードを挿入するのも大変です。さらに、手動で挿入した場合は、サイトから広告を削除したくなった場合や広告サービスを変更する場合に、すべての記事を修正しなければなりません。
rehype-auto-adsは、このような問題を解決します。Google AdSenseの広告コードを想定していますが、他のサービスのコードも利用できるはずです。
開発した経緯
このブログでは、静的サイトジェネレーターの「Astro」を利用しています。AstroではMarkdownのパースにremark、HTMLの生成にrehypeが使われています。
以前、QiitaのNote記法を使えるようにするためのMarkedプラグイン「qnote-parser」を開発したことがありました。しかし、Markedに比べてremark/rehypeは処理が抽象化されており、ASTを操作する必要があるため、難しいという印象を持っていました。
Google Adsenseの自動広告は評判が良くないので代替手段を探していましたが、remark/rehypeやAstroでそういったプラグインが存在しないので放置していました。
そして最近、Astroで任意の位置に任意の構造の目次を挿入できる「astro-custom-toc」というAstro integrationを開発するために、remark/rehypeのプラグイン開発に挑戦しました。
astro-custom-tocについての記事を投稿したところ、FFの方から「コードブロックの中に広告が入ってしまっている」という指摘を受けました。Google Adsenseの自動広告の評判が悪いのは知っていましたが、まさかここまでとは…。
ということで、広告をいい感じに挿入するプラグインを開発することにしました。
もともとはremarkプラグインとしてremark-auto-adsという名前で開発していました。しかし、remarkのプラグイン一覧に追加するPull Requestを出したときに、rehypeプラグインにした方がよいという指摘を受けました。
こうして、rehypeプラグインに書き換えたのがrehype-auto-adsです。
使い方
まずは、rehype-auto-adsをインストールします。
npm install rehype-auto-adsrehype-auto-adsは、通常のrehypeプラグインと同様に利用できます(rehypeプラグインなので当たり前ですが)。たとえば、Markdownをremarkでパースし、rehype-auto-adsを適用したrehypeでHTMLに変換する場合は、次のようになります。
import remarkParse from "remark-parse";import rehypeStringify from "rehype-stringify";import remarkRehype from "remark-rehype";import { unified } from "unified";import rehypeAutoAds from "rehype-auto-ads";
const options = { // オプション};
const processor = unified() .use(remarkParse) .use(remarkRehype) // rehype-auto-adsを適用 .use(rehypeAutoAds, options) .use(rehypeStringify);
const markdown = `# Hello, world!
This is a paragraph.
This is a paragraph.
This is a paragraph.
This is a paragraph.`;
processor.process(markdown).then((result) => { console.log(result.toString());});こうすると、オプションで指定した段落数ごとに、オプションで指定したコードが挿入されます。Astroで使う場合は、こんな感じですね。
import { defineConfig } from "astro/config";import rehypeAutoAds from "rehype-auto-ads";// https://astro.build/configexport default defineConfig({ site: "https://example.com", markdown: { rehypePlugins: [ [ rehypeAutoAds, { // オプション } ] ] }});オプション
rehype-auto-adsのオプションは、次のようになっています。
export interface RehypeAutoAdsOptions { adCode: string; countFrom?: number; paragraphInterval?: number;}adCode
挿入する広告コードです。たとえば、Google Adsenseのディスプレイ広告のコードを指定します。このオプションは必須です。
countFrom
段落カウンターの初期値です。つまり、このオプションにはparagraphIntervalの値から最初の広告を挿入したい段落数を引いた値を設定します。
たとえば、3段落目から5段落ごとに広告コードを挿入したい場合は、この値を``2``に設定します。
デフォルト:0
paragraphInterval
何段落ごとに広告コードを挿入するか指定します。たとえば、5を指定すると、5段落ごとに広告コードが挿入されます。
デフォルト:5
まとめ
rehype-auto-adsは、Markdownで作成した記事に、自動でいい感じに広告を挿入してくれるrehypeプラグインです。Google Adsenseの自動広告と違い、コードブロックや引用ブロックなどの途中に広告が挿入されることはありません。
また、何段落ごとに広告を挿入するか設定できるので、Adsenseの自動広告よりも柔軟性が高くなっています。
このプラグインを使うことで、記事の本文中に広告を挿入する際の手間を省けます。また、広告サービスを変更する際にも、すべての記事を修正する必要がなくなります。
ブログでMarkdownを使っている方は、ぜひrehype-auto-adsを使ってみてください!
記事をシェア
フォローして最新情報を入手
Googleの優先ソースに追加すると、このサイトの記事をGoogleで見つけやすくなります。また、ぜひXやRSSフィードもフォローしてください。
-1.png&w=1080&q=75)
生まれた時から、母国語よりも先にJavaScriptを使っていました。ネットの海のどこにもいなくてどこにでもいます。
Webフロントエンドプログラマーとして、TypeScriptを用いたWebアプリやブラウザー拡張機能を制作。Xのシャドウバン検知ツール「Shadowban Scanner」やリンクカード復活ツール「Restore Link Card」を公開し、国内外のメディアで紹介されました。iGEM 2023ではJapan-UnitedチームのWikiを制作してGrand Prizeの獲得に貢献。ブログではXやSNSの最新ニュース、不具合の検証と対処法、フロントエンド開発の知見を発信しています。







![[新しいXチャットへようこそ]というテキストが画面に大きく表示されており、その下には次の3つの説明が表示されている。[エンドツーエンドの暗号化:メッセージは、端末にかかわらずエンドツーエンドで暗号化されています。][最先端のプライバシー:Xを含め、他の人がメッセージを読むことはできません。][パスコードを設定:メッセージを保護するため、4桁のパスコードを設定してください。]これらの説明の下には、[パスコードを作成]という大きなボタンが配置されている](/_next/image/?url=%2Fapi%2Fmedia%2Ffile%2Fwelcome-to-new-chat.png&w=1920&q=75)

![[Search Engine Selector]というアプリからの通知のスクリーンショット。[ブラウザと検索サービスを選択]というタイトルで、本文には[ウェブページを表示しリンクを開くアプリと、検索サービスアプリを選択してください]と書かれている。通知の下部には[アプリを選択してください]というボタンが表示されている](/_next/image/?url=%2Fapi%2Fmedia%2Ffile%2Fandroid-search-engine-selector-notification.png&w=3840&q=75)
![npmのパッケージの設定画面のスクリーンショット。[Trusted Publisher]セクションの[Select your publisher]に[GitHub Actions]と[GitLab CI/CD]の2つのボタンが表示されている](/_next/image/?url=%2Fapi%2Fmedia%2Ffile%2Fnpm-trusted-publishing-settings.png&w=3840&q=75)


