Featured image of post HugoのShortcodesでブログカードリンクを作る

HugoのShortcodesでブログカードリンクを作る

先の記事に書いたとおり、Hugoは静的サイトということもあって、ブログカードに利用しているOpen Graphの情報は記事に埋め込むことにしました。

以下の記事でお知らせした通り、はてなブログで公開していたブログをHugoで作り直して、さくらのレンタルサーバーに移設しました。 はてなブログか...
はてなブログからHugo記事に移行するためのスクリプトを作った

移行した記事では以下のようにMarkdownのHugoのshortcodeを使って必要な情報を記載してあり、その表示方法、つまりHTMLの構造やCSSによるスタイリングは後から調整できるようにしていました。

1
2
3
{{< card url="https://blog.tomoyukim.net/entry/script-migrate-hatena2hugo/" img="https://blog.tomoyukim.net/entry/script-migrate-hatena2hugo/cover.jpg" title="はてなブログからHugo記事に移行するためのスクリプトを作った" >}}
以下の記事でお知らせした通り、はてなブログで公開していたブログをHugoで作り直して、さくらのレンタルサーバーに移設しました。 はてなブログか...
{{< /card >}}

HTMLで直接埋め込んでしまうと後からの修正が難しいのですが、この方法なら後から記事の装飾だけ変更できます。 Hugoのthemeを将来変更したりした場合もこのようにしておけば安心です。

この辺りはソフトウェア開発の設計手法と同じですね。

ShortcodesのHTMLテンプレート作成

独自のshortcodesの作り方は以下の公式サイトにガイドがあります。

Create Your Own Shortcodes | HUGO

ブログカードリンク用のHTMLテンプレートは laytouts/shortcodes/card.html に配置し、以下のようにしました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
{{- $description := .Inner -}}
{{- $url := .Get "url" -}}
{{- $image := .Get "img" -}}
{{- $title := .Get "title" -}}

<div class="blogcard">
  <div class="blogcard-content">
    <div class="blogcard-title">
      <a class="link" href="{{ $url }}">
	{{ $title | truncate 80}}
      </a>
    </div>
    <div class="blogcard-excerpt">
      {{ $description }}
    </div>
  </div>
  <div class="blogcard-thumbnail">
    <img src="{{ $image }}" alt="{{ $title }}" />
  </div>
</div>

SCSSでテーマのスタイルを考慮する

スタイリングでは利用しているテーマを意識する必要があります。

テーマの中で定義されているカラーパレットなどのデザインパターンに沿っていないと、ブログカードリンクが浮いてしまうからです。

このブログでは、「Stack」というHugoテーマを使っています。

Card-style Hugo theme designed for bloggers. Contribute to CaiJimmy/hugo-theme-stack development by creating an account on GitHub.
GitHub - CaiJimmy/hugo-theme-stack: Card-style Hugo theme designed for bloggers

例えばこのテーマには、ダークテーマとライトテーマを切り替える機能があります。

そのため、切り替えが行われても表示が崩れてしまわないように、定義されているSCSSの変数などを適切に参照するようにしておきます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
@mixin widget {
    display: flex;
    justify-content: flex-start;
    align-items: stretch;
    margin: 2rem 0;
    padding: 2rem;
    border: 1px solid var(--accent-color-darker);
}
@mixin line-clamp($line-num:1) {
    display: -webkit-box;
    -webkit-line-clamp: $line-num;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
@mixin font($size:1.0, $weight:normal) {
    font-size: #{$size}rem;
    line-height: $size;
    font-weight: $weight;
}

// Blogcard widget
.blogcard {
    @include widget;
    .blogcard-content {
	flex-grow: 1;
    }
    .blogcard-title {
	@include font(1.6, bold);
	@include line-clamp;

	padding-right: 2rem;
	margin-bottom: 1rem;
    }
    .blogcard-excerpt {
	@include font(1.2);
	@include line-clamp(2);

	padding-right: 2rem;
	color: var(--body-text-color);
    }
    .blogcard-thumbnail {
	width: auto;
	height: auto;
	max-width: 20%;
    }
}

この中にある、 border: 1px solid var(--accent-color-darker); などの変数が、テーマに由来するものになっています。テーマのSCSSは通常 themes/your-theme/assets/scss/ 以下に配置されているので、どのようなスタイルパーツがあるか確認できます。

まとめ

このブログで利用しているブログカードリンクについて、Shortcodesの実装紹介でした。

移行した記事だけでなく、新たに公開する記事でも利用しているため、Shortcodesになっていると非常に便利です。

一方で、OpenGraphの情報を取得して毎回Shortcodesを記述するのは手間がかかります。私はEmacsとox-hugoで記事を書いているため、OpenGraph情報の取得からShortcodsシンタックスの記述までを実行するelispを作って利用しています。

そちらについては、また別の記事にまとめたいと思います。

Built with Hugo
テーマ StackJimmy によって設計されています。