BETA

genという静的ジェネレーターを作った

投稿日:2020-03-23
最終更新:2020-03-23

hugoに疲れてしまったので…

https://github.com/Qs-F/gen

TL;DR

genの特徴

  • 他のmarkdownがimportできる (front matterのimport)
  • 見通しがいい
  • simpleに、markdownファイル -> htmlファイル
  • importlayout{{ .__content__ }} 以外にデフォルトの機能がない

hugoという静的htmlのジェネレーターがあります。これはかなり高機能な一方、使いこなすのがとても難しいと私は感じています。
挙動にimplicitな部分が多いとも感じており、例えば、デフォルトでuglyでないurlを推奨しているせいか、/path/to/hogehoge 的なかっこいいページを生成したい人にはいいんですが、私はただ単にmarkdownをそのままのstructureを保ったままhtmlを生成してほしいだけだったのです。
でもuglify urlのconfigをいじっても、どうもうまいこと解決せず、同一ディレクトリに同一内容の _index.md と index.md を両方持たなければならないこともありました (/path/to/ でただ index.html を表示してほしいだけだったのに、環境によって自動的に /path/to にリダイレクトされてしまい _index.html がないと言われてうまくいかないことが)。
また、configがyamlファイルを通してだったり、どうも面倒だなと感じることが多かったです。
そこで、機能をかなり絞った静的ジェネレーターの gen を作りました。

https://github.com/Qs-F/gen

これは単純で、

$ gen -base hoge -src hoge/content -dst hoge/dist  

のように使います。baseはプロジェクトに必要な全ファイルを含むようなディレクトリ、srcはコンテンツのmarkdownのディレクトリ、要するに生成したいstructureのroot、dstは吐き出すディレクトリです。dstもbase内に含まれるようにしてください。
genの特徴は、本当に必要なものはmarkdownファイルのみです。お好みでtemplate(いわゆるlayout)としてhtmlファイルも必要になってきます。
例えば、今 example ディレクトリをプロジェクトのrootとします。pwdは `/path/to/example` です。

<!-- content/index.md -->  
---  
title: Hello  
author:  
  name: CreatorQsF  
  display: たふみ  
layout: layout/index.html  
name: gen  
import:  
- content/site.md  
---  
## {{ .name }}の紹介です。  
これは{{ .name }}の紹介ページです。  
<!-- content/site.md -->  
---  
sitename: de-liKeR  
---  
<!-- layout/index.html -->  
<!doctype html>  
<html lang="ja">  
  <head>  
    <meta charset="utf-8">  
    <title>{{ .title }}</title>  
  </head>  
  <body>  
    <header>  
      <h1>{{ .title }} - {{ .sitename }}</title>  
    </header>  
    <article>  
      {{ .__content__ }}  
    </article>  
    <footer>  
      <p>Written by <a href="/user/{{ .author.name }}">{{ .author.display }}</a></p>  
    </footer>  
  </body>  
</html>  

こんな感じになっているとしましょう。
そうするとここでgenを叩くと…

$ gen -base . -src content -dst ./dist  

_example/dist/index.htmlがこうなります。

<!-- layout/index.html -->  
<!doctype html>  
<html lang="ja">  
  <head>  
    <meta charset="utf-8">  
    <title>Hello</title>  
  </head>  
  <body>  
    <header>  
      <h1>Hello - de-liKeR</title>  
    </header>  
    <article>  
      <h2>genの紹介です。</h2>  
<p>これはgenの紹介ページです。</p>  
</article>  
    <footer>  
      <p>Written by <a href="/user/CreatorQsF">たふみ</a></p>  
    </footer>  
  </body>  
</html>  

要するに、genは他のmarkdownをimportして、front materの解決をして、htmlを吐き出せる、そういうツールになっています。
もっとくわしいexampleは、 https://github.com/Qs-F/gen の_exampleディレクトリ以下にあるので参考にしてください。
個人的には、ひさびさにいいものが作れた気がしています。
ソースが書き散らかされているので、予定していた機能がほぼ作れた今、必要なのはリファクタリングでしょう。がんばります…。
あとエラー周辺はかなり不親切なので、もう少しちゃんと詰めてあげなければいけません。
内部的な話をすると、lib/genではmarkdownやhtmlにspecificな処理はしておらず、 Loader と Expander で処理されています。なので、cmd.goを参考にしながら、 lib/loader/... や lib/expander/... を参考にしつつほしいファイルのloaderとexpanderを書けば、variableをresolveしつつファイルを書き出す、そういうことが可能です。
おわり

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう