Hugoでブログカードを作成する(resources.GetRemote利用)

以前、 HugoでAMP対応のブログカードを作るでAPIサーバを利用したブログカードの作成方法を紹介した。このときは、getJSONを利用していた。

Hugo v0.91.0resources.GetRemoteが実装され、getJSONgetCSV以外にもresources.GetRemoteを利用できるようになった。

Release v0.91.0 · gohugoio/hugo

resources.GetRemoteを利用したブログカードの作り方のメモ。

resources.GetRemoteを利用したブログカードの作り方

resources.GetRemoteを利用して、ビルド時に指定したURLへアクセスして、OGPを取得する。 結果は、以下のような形となる。

resources.GetRemoteを利用したブログカード作成

markdownファイル

{{< blogcard "http://example.com" >}}のように記述する。

content/blog/blogcard.md
{{< blogcard "https://www.meganii.com/blog/2022/08/14/migration-from-github-to-cloudflare-pages/" >}}
{{< blogcard "https://www.meganii.com/blog/2022/08/11/proxying-cloudinary-with-cloudflare-workers/" >}}
{{< blogcard "http://example.com" >}}

Shortcodeの中身は次のとおり。

layouts/shortcodes/blogcard.html
{{- $url := (.Get 0) -}}
{{- with $result := resources.GetRemote $url -}}
    {{- with $result.Err -}}
        {{- warnf "%s" . -}}{{- . -}}
    {{- else -}}
        {{- $title := "" -}}
        {{- $description := "" -}}
        {{- $image := "" -}}
        {{- with $head := index (findRE `<head>(.|\n)*?</head>` $result.Content) 0 -}}
            {{- range $meta := findRE `<meta.*?>` $head -}}
                {{- $name := replaceRE `<.*name=\"(.*?)\".*>` "$1" $meta -}}
                {{- $property := replaceRE `<.*property=\"(.*?)\".*>` "$1" $meta -}}
                {{- $content := replaceRE `<.*content=\"(.*?)\".*>` "$1" $meta -}}
                {{- if eq $property "og:title" -}}
                    {{- $title = $content -}}
                {{- else if eq $property "og:description" -}}
                    {{- $description = $content -}}
                {{- else if eq $property "og:image" -}}
                    {{- $image = $content -}}
                {{- end -}}
                {{- if and (eq $description "") (eq $name "description") -}}
                    {{- $description = $content -}}
                {{- end -}}
            {{- end -}}
            {{- if eq $title "" -}}
                {{- with index (findRE `<title>(.*?)</title>` $head) 0 -}}
                    {{- $title = replaceRE `<title>(.*?)</title>` "$1" . -}}
                {{- end -}}
            {{- end -}}
        {{- end -}}

        {{- $thumbnail_url := "" -}}
        {{- with $image -}}
            {{- with $thumbnail := resources.GetRemote $image -}}
                {{- with $thumbnail.Err -}}
                    {{- warnf "%s" . -}}{{- . -}}
                {{- else -}}
                    {{- $thumbnail_url = $thumbnail.RelPermalink -}}
                {{- end -}}
            {{- end -}}
        {{- end -}}

        <div style="margin-top: 10px;">
            <a href="{{- $url -}}" style="padding: 12px;border: solid 1px #eee;display: flex;text-decoration: none;color: #000;" onMouseOver="this.style.opacity='0.9'">
                <div style="flex-shrink: 0;">
                    <img src="{{ with $thumbnail_url }}{{- . -}}{{- else -}}/noimage.png{{- end -}}" alt="" width="100" height="100" style="object-fit: contain;" />
                </div>
                <div style="margin-left: 10px;">
                    <h2 style="margin: 0;padding-bottom: 13px;border: none;font-size: 16px;">
                        {{- $title -}}
                    </h2>
                    <p style="margin: 0;font-size: 13px;word-break: break-word;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 3;overflow: hidden;">
                        {{- $description | plainify | safeHTML -}}
                    </p>
                </div>
            </a>
        </div>
    {{- end -}}
{{- end -}}

参考

Backlinks

静的サイトジェネレータHugo
Hugo入門 静的サイトジェネレータ「Hugo」でシンプルブログサイトを構築する 静的サイトジェネレータ「Hugo」インストール 静的サイトジェネレータ「Hugo」〜公開方法〜 サイト構築 Hugoのテーマでsubmoduleを使う方法 HugoでのシンタックスハイライトにPython Pygmentsが不要となった HugoのRelated Contentを利用して関連記事を表示する gulpで画像の最適化 Hugoソースコードリーディング〜Taxonomy〜 Render Hooks for Code Blocksを利用してコードブロックにファイル名を表示する Hugoでブログカードを作成する(resources.GetRemote利用) Templates 【Hugo】Partial Templateでは複数returnを記述する早期Returnを使えない 【Hugo】images.TextでOGP画像を生成する Shortcodes Hugo Shortcodesの作り方 HugoのShortcodesを利用してAmazon紹介リンクタグを作成 HugoでAMP対応のブログカードを作る AMP対応 AMP向けのミニマルCSSフレームワーク「1BX」をHugoに導入した AMPページの最適化〜ぼくのAMPサイトがこんなに遅い訳がない〜 AMP OptimizerによるAMPのさらなる最適化 AMP Service WorkerでPrefetch Linksを実現する Data Driven Content Hugoで人気記事を表示するためJSONを返すAPIサーバを作りData-driven Contentを試してみた Tailwind CSS HugoでTailwindCSSを利用しAMP Validなページを生成する ビルド npm-run-allでローカルAPI serverとHugo serverを同時に実行する GitHub Actionsのスケジューラ実行を利用して定期的にビルドする Circle CIでHugoのビルド・デプロイを実行する コンテンツ作成 Git pre-commitフックでFrontmatterの「更新日時」を自動更新する Hugoでブログ記事一覧ページ(ブログアーカイブページ)を作成する 移行 はてなダイアリーからはてなブログ経由で独自ドメインのブログに記事を移行しました JekyllからHugoへの移行ポイント Hugoで生成した静的サイトのホスト先をさくらVPSからNetlifyに変更する 書籍
2017-12-31