<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hugo on namaraii.com</title><link>https://namaraii.com/tags/hugo/</link><description>Recent content in Hugo on namaraii.com</description><generator>Hugo -- gohugo.io</generator><language>ja</language><managingEditor>hitoshi@namaraii.com (竹内 仁 (TAKEUCHI Hitoshi))</managingEditor><webMaster>hitoshi@namaraii.com (竹内 仁 (TAKEUCHI Hitoshi))</webMaster><copyright>© 2026 TAKEUCHI Hitoshi, All Rights Reserved.</copyright><lastBuildDate>Thu, 11 Dec 2025 15:32:41 +0900</lastBuildDate><atom:link href="https://namaraii.com/tags/hugo/index.xml" rel="self" type="application/rss+xml"/><item><title>Hugoで楽譜を描画する(abcjs)</title><link>https://namaraii.com/posts/hugo_abcjs/</link><pubDate>Thu, 11 Dec 2025 15:32:41 +0900</pubDate><author>hitoshi@namaraii.com (竹内 仁 (TAKEUCHI Hitoshi))</author><guid>https://namaraii.com/posts/hugo_abcjs/</guid><description>&lt;p&gt;&lt;a href="https://namaraii.com/posts/abcjs/" &gt;abcjs&lt;/a&gt;という&lt;a href="https://namaraii.com/posts/abc_notation/" &gt;ABC記譜法&lt;/a&gt;で書いたテキストから楽譜を描画するライブラリを使って、Hugoで作成するページで楽譜を表示できるようにする。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;music-abc&lt;/code&gt;を指定したコードブロックに対して処理するようにレンダーフックを定義する。&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="codeblock-title"&gt;layouts/_default/_markup/render-codeblock-music-abc.html&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go-html-template" data-lang="go-html-template"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;$src&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.Inner&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;safeHTML&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;$uuid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;md5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;$src&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="cp"&gt;{{-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;$uuid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;load&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;$src&lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;ABCJS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;renderAbc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="cp"&gt;{{-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;$uuid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;responsive&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;resize&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.Page.Store.Set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;hasMusicAbc&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;楽譜を描画するエリア（&lt;code&gt;&amp;lt;div id=&amp;quot;{{- $uuid }}&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;）のIDを決め打ちにしてしまうと、ノート内に複数のコードブロックを書けないのでMD5ハッシュを生成し、IDとして使用した。&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="codeblock-title"&gt;layouts/partials/head.html&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go-html-template" data-lang="go-html-template"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.Page.Store.Get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;hasMusicAbc&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://cdnjs.cloudflare.com/ajax/libs/abcjs/6.1.7/abcjs-basic-min.js&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;ヘッダにabcjsをロードする処理を追加。ページ内に&lt;code&gt;music-abc&lt;/code&gt;を指定したコードブロックがある場合（hasMusicAbcがtrue）のみロードするようにした。&lt;/p&gt;
&lt;p&gt;obsidian-plugin-abcjsに楽譜の表示例がある。&lt;/p&gt;</description></item><item><title>フォトギャラリーサイトを立てた</title><link>https://namaraii.com/posts/20251003-photo-gallery/</link><pubDate>Fri, 03 Oct 2025 09:01:47 +0900</pubDate><author>hitoshi@namaraii.com (竹内 仁 (TAKEUCHI Hitoshi))</author><guid>https://namaraii.com/posts/20251003-photo-gallery/</guid><description>&lt;p&gt;いままでに撮ってきた写真をまとめたいと思い&lt;a href="https://github.com/nicokaiser/hugo-theme-gallery?utm_source=chatgpt.com" target="_blank" rel="noreferrer"&gt;nicokaiser/hugo-theme-gallery: Gallery Theme for Hugo&lt;/a&gt;という､フォトギャラリー向けHugoのテーマを使ってフォトギャラリーサイトを立てた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://photos.namaraii.com/" target="_blank" rel="noreferrer"&gt;TAKEUCHI Hitoshi - Gallery&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://gyazo.com/c0b9b81350e95cdbccd0f9d5b16623bf" target="_blank" rel="noreferrer"&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="auto"
 alt="Image from Gyazo"
 width="1339"
 height="1389"
 src="https://namaraii.com/images/20251003-photo-gallery-remote-001_hu_9933f4364e893e0b.jpg"
 srcset="https://namaraii.com/images/20251003-photo-gallery-remote-001_hu_9933f4364e893e0b.jpg 800w, https://namaraii.com/images/20251003-photo-gallery-remote-001_hu_8176f2bfbf85f69d.jpg 1280w"
 sizes="(min-width: 768px) 50vw, 65vw"
 data-zoom-src="https://namaraii.com/images/20251003-photo-gallery-remote-001.jpg"&gt;&lt;/figure&gt;
&lt;/a&gt;
Hugoの運用に慣れていれば使い方は簡単で､ただ写真を表示したいだけならフォルダへ写真をコピーするだけで良い。&lt;/p&gt;
&lt;p&gt;写真に説明文を付けたい場合は､写真があるフォルダのindex.mdに書くか､Exifのタイトルを設定すればOK&lt;/p&gt;
&lt;p&gt;themes/gallery/exampleSite配下のサンプルを見れば雰囲気はわかると思う。&lt;/p&gt;
&lt;p&gt;git pushすれば公開するGitHub Actionsを書いたので､簡単に公開できるようになったし､これからは撮りっぱなしにせず､ここへ少しずつまとめていきたい。&lt;/p&gt;
&lt;p&gt;むかし撮った写真をあらためて眺めていると､その時の記憶がよみがえってきて楽しいですね。&lt;/p&gt;</description></item><item><title>Hugoのショートコードをうまく使い回す方法</title><link>https://namaraii.com/posts/hugo_plugin/</link><pubDate>Fri, 08 Sep 2023 00:00:00 +0900</pubDate><author>hitoshi@namaraii.com (竹内 仁 (TAKEUCHI Hitoshi))</author><guid>https://namaraii.com/posts/hugo_plugin/</guid><description>&lt;p&gt;Hugoには他のCMSではよくある､機能を拡張するためのプラグインを提供する仕組みがない。&lt;/p&gt;
&lt;p&gt;このため､あるテーマの中に便利なショートコードがあったとして､それを別のテーマで使用しようとした場合､&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テーマディレクトリ/layouts/shortcodes配下のショートコードのソースを､別のテーマの/layouts/shortcodes配下､またはルート配下の/layouts/shortcodesへコピーする&lt;/li&gt;
&lt;li&gt;ショートコードにスタイルが設定されている場合､スタイルシートの中から必要な部分を抜き出し､別のテーマのスタイルシートへコピーする&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という煩雑な手順が必要となるが､先日､以下のショートコードのインストール手順を読んでいたら､うまい方法でショートコードを提供していた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mfg92/hugo-shortcode-gallery/tree/master" target="_blank" rel="noreferrer"&gt;mfg92/hugo-shortcode-gallery: A theme components with a gallery shortcode for the static site generator hugo.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;まずショートコードのコードをテーマディレクトリ配下へcloneする。その後､config.tomlでテーマを以下のように指定する。&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;your-main-theme&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hugo-shortcode-gallery&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;そもそもテーマを複数指定できることを知らなかったが､この設定により&lt;code&gt;your-main-theme&lt;/code&gt;テーマに加え&lt;code&gt;hugo-shortcode-gallery&lt;/code&gt;テーマも参照されることになる。&lt;/p&gt;
&lt;p&gt;そして､&lt;code&gt;hugo-shortcode-gallery&lt;/code&gt;配下は以下のようなファイル構成になっている。&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo-shortcode-gallery
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── LICENSE.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── README.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── assets
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   └── shortcode-gallery
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   ├── filterbar.sass
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   └── font-awesome
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   ├── compress-alt-solid.svg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   ├── expand-alt-solid.svg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   └── license.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── config.toml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── layouts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   └── shortcodes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   └── gallery.html
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── static
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── shortcode-gallery
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── jquery-3.7.0.min.js
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── justified_gallery
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │   ├── LICENSE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │   ├── jquery.justifiedGallery.js
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │   ├── jquery.justifiedGallery.min.js
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │   ├── justifiedGallery.css
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │   └── justifiedGallery.min.css
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── lazy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │   ├── jquery.lazy.js
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │   └── jquery.lazy.min.js
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── swipebox
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── css
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │   ├── swipebox.css
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │   └── swipebox.min.css
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── img
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │   ├── icons.png
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │   ├── icons.svg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │   └── loader.gif
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── js
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── jquery.swipebox.js
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── jquery.swipebox.min.js
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;14 directories, 23 files&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;テーマと言ってもlayouts配下にあるのはショートコードのみである。そしてassetsとstaticディレクトリ配下にショートコードで使用するファイルだけを置くというのは､汎用的にショートコードを提供する方法として手軽で良いと思った。&lt;/p&gt;</description></item><item><title>Hugoでイメージギャラリー hugo-shortcode-gallery</title><link>https://namaraii.com/posts/20230818/</link><pubDate>Fri, 18 Aug 2023 07:06:05 +0900</pubDate><author>hitoshi@namaraii.com (竹内 仁 (TAKEUCHI Hitoshi))</author><guid>https://namaraii.com/posts/20230818/</guid><description>&lt;p&gt;Hugoでイメージギャラリーを実装する方法を調べていたところ、hugo-shortcode-galleryというのがお手軽で良さそうだった。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/mfg92/hugo-shortcode-gallery" target="_blank" rel="noreferrer"&gt;mfg92/hugo-shortcode-gallery: A theme components with a gallery shortcode for the static site generator hugo.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;インストールするとgalleryというショートコードが使えるようになる。以下が実例。&lt;/p&gt;
&lt;p&gt;このページがあるディレクトリに&lt;code&gt;images&lt;/code&gt;というディレクトリを作成して画像を置き、ショートコードのパラメタに&lt;code&gt;match=&amp;quot;images/*&amp;quot;&lt;/code&gt;と書き、その他、必要なパラメタを指定するだけで、こんなサムネイルを表示してくれる。&lt;/p&gt;
&lt;p&gt;インストールもthemeディレクトリでcloneしてconfig.tomlを修正するだけなので簡単だ。&lt;/p&gt;</description></item><item><title>Hugoのショートコード入力を支援するChrome拡張</title><link>https://namaraii.com/posts/hugo_shortcoder/</link><pubDate>Tue, 15 Aug 2023 00:00:00 +0900</pubDate><author>hitoshi@namaraii.com (竹内 仁 (TAKEUCHI Hitoshi))</author><guid>https://namaraii.com/posts/hugo_shortcoder/</guid><description>&lt;p&gt;自分用にHugoのショートコードの入力を支援するChrome拡張を書いた。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/htakeuchi/HugoShortcoder" target="_blank" rel="noreferrer"&gt;htakeuchi/HugoShortcoder: Chrome extension to copy Hugo shortcode to clipboard according to open URL.&lt;/a&gt;&lt;/p&gt;

&lt;h2 class="relative group"&gt;機能
 &lt;div id="機能" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e6%a9%9f%e8%83%bd" aria-label="アンカー"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;たとえばHugoの公式ショートコードでTweetを引用しようとすると、&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;URLからユーザIDとTweet ID?を調べる。&lt;/li&gt;
&lt;li&gt;URLが&lt;code&gt;https://twitter.com/SanDiegoZoo/status/1453110110599868418&lt;/code&gt;だとすると&lt;/li&gt;
&lt;li&gt;{{&amp;lt; tweet user=&amp;quot;SanDiegoZoo&amp;quot; id=&amp;quot;1453110110599868418&amp;quot; &amp;gt;}}の形式でショートコードを書く&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ことになり、なかなか面倒だ。&lt;/p&gt;
&lt;p&gt;この機能拡張はこれらを支援するもので、引用したいページを開きコンテキストメニューから機能拡張を起動すれば、URLからショートコードを組み立ててクリップボードへコピーされる。&lt;/p&gt;
&lt;p&gt;サポートしているサービスは以下の通り。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gist&lt;/li&gt;
&lt;li&gt;Instagram&lt;/li&gt;
&lt;li&gt;X (Twitter)&lt;/li&gt;
&lt;li&gt;Vimeo&lt;/li&gt;
&lt;li&gt;YouTube&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらのサービス以外のページでは、Markdown形式でページタイトルとURLのリンクが作成され、クリップボードへコピーされる。&lt;/p&gt;

&lt;h2 class="relative group"&gt;使用方法
 &lt;div id="使用方法" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95" aria-label="アンカー"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;せっかくなので、Chromeウェブストアで公開しようかと思ったが、機能拡張が悪用されるケース多いせいか、手続きが煩雑になっていたため、野良で使うことにした。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/htakeuchi/HugoShortcoder/releases/tag/v1.0" target="_blank" rel="noreferrer"&gt;Release v1.0 · htakeuchi/HugoShortcoder&lt;/a&gt; からzipをダウンロードし、 任意のディレクトリで解凍する&lt;/li&gt;
&lt;li&gt;Chromeを起動し&lt;code&gt;設定&lt;/code&gt;-&lt;code&gt;拡張機能&lt;/code&gt;を選択する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;デベロッパーモード&lt;/code&gt;をオンにして&lt;code&gt;パッケージ化されていない拡張機能を読み込む&lt;/code&gt;ボタンをクリック&lt;/li&gt;
&lt;li&gt;1.のディレクトリを選択&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以上でマウス右クリックで表示されるコンテキストメニューに&lt;code&gt;HugoShortcoder&lt;/code&gt;が追加される。&lt;/p&gt;</description></item><item><title>D2 Declarative Diagramming</title><link>https://namaraii.com/posts/d2/</link><pubDate>Thu, 12 Jan 2023 00:00:00 +0900</pubDate><author>hitoshi@namaraii.com (竹内 仁 (TAKEUCHI Hitoshi))</author><guid>https://namaraii.com/posts/d2/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/terrastruct/d2" target="_blank" rel="noreferrer"&gt;terrastruct/d2: D2 is a modern diagram scripting language that turns text to diagrams.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;テキストからダイアグラムを生成するツール。類似のツールとしてはMermaid、GraphViz、PlantUMLなどがあり、以下のサイトでこれらのツールで同じダイアグラムを書く場合の比較が可能。このサイトはD2開発元によるものらしい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://text-to-diagram.com/" target="_blank" rel="noreferrer"&gt;Text to diagram&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class="relative group"&gt;テキストと出力の例
 &lt;div id="テキストと出力の例" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e3%83%86%e3%82%ad%e3%82%b9%e3%83%88%e3%81%a8%e5%87%ba%e5%8a%9b%e3%81%ae%e4%be%8b" aria-label="アンカー"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;公式サイトからの引用&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-d2" data-lang="d2"&gt;# Actors
hans: Hans Niemann

defendants: {
 mc: Magnus Carlsen
 playmagnus: Play Magnus Group
 chesscom: Chess.com
 naka: Hikaru Nakamura

 mc -&amp;gt; playmagnus: Owns majority
 playmagnus &amp;lt;-&amp;gt; chesscom: Merger talks
 chesscom -&amp;gt; naka: Sponsoring
}

# Accusations
hans -&amp;gt; defendants: &amp;#39;sueing for $100M&amp;#39;

# Offense
defendants.naka -&amp;gt; hans: Accused of cheating on his stream
defendants.mc -&amp;gt; hans: Lost then withdrew with accusations
defendants.chesscom -&amp;gt; hans: 72 page report of cheating&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="auto"
 alt="image"
 width="954"
 height="1216"
 src="https://namaraii.com/images/d2-001_hu_856d3ce5ae0943f7.png"
 srcset="https://namaraii.com/images/d2-001_hu_856d3ce5ae0943f7.png 800w, https://namaraii.com/images/d2-001.png 1280w"
 sizes="(min-width: 768px) 50vw, 65vw"
 data-zoom-src="https://namaraii.com/images/d2-001.png"&gt;&lt;/figure&gt;

&lt;h2 class="relative group"&gt;インストール
 &lt;div id="インストール" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" aria-label="アンカー"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/terrastruct/d2/blob/master/docs/INSTALL.md" target="_blank" rel="noreferrer"&gt;d2/INSTALL.md at master · terrastruct/d2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Macの場合は&lt;code&gt;brew install d2&lt;/code&gt;でOK&lt;/p&gt;</description></item><item><title>Hugoのローカルサーバでページが表示されないパターン</title><link>https://namaraii.com/posts/hugo_timezone/</link><pubDate>Thu, 29 Dec 2022 00:00:00 +0900</pubDate><author>hitoshi@namaraii.com (竹内 仁 (TAKEUCHI Hitoshi))</author><guid>https://namaraii.com/posts/hugo_timezone/</guid><description>&lt;p&gt;&lt;a href="https://namaraii.com/posts/hugo/" &gt;Hugo&lt;/a&gt;で作成したページが&lt;code&gt;hugo serve&lt;/code&gt;しても表示されない場合がある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;timeZoneを指定していない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;以下の両条件を満たしていると実行する時刻によっては表示されない
&lt;ul&gt;
&lt;li&gt;config.tomlでtimeZoneを明示していない
&lt;ul&gt;
&lt;li&gt;timeZone = &amp;ldquo;Japan&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ページのFront Matterのdateを日付のみ指定し時刻を省略
&lt;ul&gt;
&lt;li&gt;date: 2022-12-29&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;このパターンにハマってしまった。&lt;code&gt;hugo serve&lt;/code&gt;のオプションを調べていて&lt;code&gt;--buildFuture&lt;/code&gt;を付けてみたら表示され気付いた。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;draftフラグを設定している&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ページのFront Matterがtrueになっている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Obsidianのノートを外部公開する場合のデッドリンク問題</title><link>https://namaraii.com/posts/obsidian_publish_deadlink/</link><pubDate>Wed, 28 Dec 2022 00:00:00 +0900</pubDate><author>hitoshi@namaraii.com (竹内 仁 (TAKEUCHI Hitoshi))</author><guid>https://namaraii.com/posts/obsidian_publish_deadlink/</guid><description>&lt;h2 class="relative group"&gt;ページタイトル変更時の問題
 &lt;div id="ページタイトル変更時の問題" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e3%83%9a%e3%83%bc%e3%82%b8%e3%82%bf%e3%82%a4%e3%83%88%e3%83%ab%e5%a4%89%e6%9b%b4%e6%99%82%e3%81%ae%e5%95%8f%e9%a1%8c" aria-label="アンカー"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Obsidianでノート名（ファイル名）を変更した場合、そのノートに張られているリンクは自動的に修正される。このため、Obsidian単体で使っている限りは気軽にノート名を変更して問題ない。&lt;/p&gt;
&lt;p&gt;ページの内容が変化した場合、それにあわせてノート名を変更したくなるのは自然なことで、Obsidianはそれをアプリケーションの機能として実現しているわけだ。&lt;/p&gt;
&lt;p&gt;ただ、&lt;a href="https://obsidian.md/publish" target="_blank" rel="noreferrer"&gt;Obsidian Publish&lt;/a&gt;やQuartzなどを使って、Obsidianのノートをインターネット上で公開する際には、外部サイトからリンクを張られる可能性がある点を考慮する必要がある。&lt;/p&gt;
&lt;p&gt;Obsidianを単体で使うときのように気軽にノート名を変更してしまうと、外部サイトからのリンクがデッドリンクになってしまうからだ。&lt;/p&gt;
&lt;p&gt;この問題に対してScrapboxは、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ページタイトルをURLにする(ページタイトルとは別に一意なページIDを持っている)&lt;/li&gt;
&lt;li&gt;外部からのアクセス時、ページが無くなっていた場合は、そのURLのアクセスログからページIDを探し、ページIDから移動先へリダイレクトする&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という方法で対応しているようだ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://scrapbox.io/shokai/wiki%E3%81%A7%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AEURL%E3%82%92ID%E3%81%AB%E3%81%99%E3%82%8B%E3%81%A8%E7%B5%B6%E5%AF%BE%E3%81%AB%E3%81%86%E3%81%BE%E3%81%8F%E3%81%84%E3%81%8B%E3%81%AA%E3%81%84" target="_blank" rel="noreferrer"&gt;wikiでページのURLをIDにすると絶対にうまくいかない - 橋本商会&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class="relative group"&gt;本サイトでの対応
 &lt;div id="本サイトでの対応" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e6%9c%ac%e3%82%b5%e3%82%a4%e3%83%88%e3%81%a7%e3%81%ae%e5%af%be%e5%bf%9c" aria-label="アンカー"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;本サイトではこのページタイトル問題について、以下のように対応している。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ノート名（ファイル名）は半角英数字と一部の記号(&lt;code&gt;-&lt;/code&gt; &lt;code&gt;_&lt;/code&gt;)だけを使用する
&lt;ul&gt;
&lt;li&gt;Markdownファイルとしての取り扱いを考慮&lt;/li&gt;
&lt;li&gt;ノート名（ファイル名）は基本的に変更しない（外部公開時のパーマリンク維持のため）
&lt;ul&gt;
&lt;li&gt;それでも変更したくなったらFront Matterに&lt;code&gt;aliases&lt;/code&gt;を書いておけば大丈夫そう
&lt;ul&gt;
&lt;li&gt;これはHugoの機能。ただしまだQuartzでは試していない。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ノートのタイトルはFront Matterの&lt;code&gt;title&lt;/code&gt;を使用する
&lt;ul&gt;
&lt;li&gt;URLの構成要素ではなくなるので気軽に変更できる&lt;/li&gt;
&lt;li&gt;ただ、これだとファイルエクスプローラなどで視認性が落ちてしまう…
&lt;ul&gt;
&lt;li&gt;ファイル名表示を&lt;code&gt;title&lt;/code&gt;があればそれを使用するプラグインがあった&lt;/li&gt;
&lt;li&gt;obsidian-front-matter-title&lt;/li&gt;
&lt;li&gt;オプションの&lt;code&gt;Alias title&lt;/code&gt;を&lt;code&gt;ON&lt;/code&gt;にすれば、Aliasを本来の目的で使用できなくなるものの、Wikiリンクの補完時に日本語のtitle、ファイル名のどちらでも候補を検索できるようになる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;現時点では大きな問題は無さそうだが、しばらく運用して再評価したい。&lt;/p&gt;</description></item><item><title>Hugoでローカルサーバのみ実行する処理を書く方法</title><link>https://namaraii.com/posts/hugo_isserver/</link><pubDate>Fri, 23 Dec 2022 00:00:00 +0900</pubDate><author>hitoshi@namaraii.com (竹内 仁 (TAKEUCHI Hitoshi))</author><guid>https://namaraii.com/posts/hugo_isserver/</guid><description>&lt;p&gt;Hugoで&lt;code&gt;hugo serve&lt;/code&gt;で起動するローカルサーバでのみ実行する処理を書きたい場合、&lt;code&gt;.Site.IsServer&lt;/code&gt;を参照すれば良い。ローカルサーバの場合&lt;code&gt;True&lt;/code&gt;が設定されている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gohugo.io/variables/site/" target="_blank" rel="noreferrer"&gt;Site Variables |Hugo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go-html-template" data-lang="go-html-template"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.Site.IsServer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;$notes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.Site.RegularPages.ByDate.Reverse&lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;$notes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.Site.RegularPages.ByLastmod.Reverse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</description></item><item><title>Hugoで本文の先頭画像をアイキャッチとして使用する</title><link>https://namaraii.com/posts/hugo_auto_eyecatch/</link><pubDate>Fri, 23 Dec 2022 00:00:00 +0900</pubDate><author>hitoshi@namaraii.com (竹内 仁 (TAKEUCHI Hitoshi))</author><guid>https://namaraii.com/posts/hugo_auto_eyecatch/</guid><description>&lt;p&gt;Hugoでアイキャッチ画像を取り扱う場合、ページのfront matterでアイキャッチ画像を指定し、&lt;a href="https://gohugo.io/variables/page/#page-level-params" target="_blank" rel="noreferrer"&gt;ページレベルパラメタ&lt;/a&gt;で取得するのが確実だが、アイキャッチ画像が指定されていない場合、記事内の画像をアイキャッチ画像として扱えれば便利なケースが多い。&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="codeblock-title"&gt;layouts/partials/summary.html&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go-html-template" data-lang="go-html-template"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;$image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;findRE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;lt;img.*?src=([^&amp;gt;]*)?&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;$image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;figure&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ellipsis card_img&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;$image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;safeHTML&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ellipsis card_summary&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.Summary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;上のコードは正規表現で&amp;lt;img&amp;gt;タグを検索し存在すれば画像を出力し、存在しなければサマリを出力するもの。&lt;/p&gt;</description></item></channel></rss>