柔軟で使いやすい小さな静的 Web サイトジェネレーター。必要な Web サイト構造やブログ固有の概念がないため、柔軟です。標準の HTML サイトから始めて、徐々に tinystatic を導入できるので、使い方は簡単です。
tinystatic の概念は単純です。入力ディレクトリ内のすべてのファイルから、Web サーバーのパブリック ディレクトリとして使用できるファイルを出力ディレクトリに作成します。 tinystatic が出力ファイルを生成する方法は、入力ファイルの拡張子によって異なります。Markdown は HTML に変換され、CSS、JS、および画像は単純にコピーされます。マークダウン ファイルと HTML ファイルの場合、ファイルの先頭にメタデータを指定できます。このファイルのメタデータでテンプレートを指定し、別のディレクトリにテンプレートを提供することで、Go の HTML テンプレート エンジンを利用できます。ここでは典型的なブログ Web サイトの例を示します。クイック スタート ガイドについては、以下を参照してください。
オペレーティング システム用の tinystatic バイナリをダウンロードします。
必要に応じて、バイナリを/usr/bin
などの既存のディレクトリに配置するか、バイナリの親ディレクトリをパス変数に追加することにより、シェル パスにバイナリを追加します。
tinystatic をパスに追加した場合は、次のように呼び出すことができるはずです。
tinystatic -help
それ以外の場合は、呼び出すときに tinystatic バイナリへのパスを指定する必要があります。
/path/to/tinystatic -help
事前に構築されたバイナリを使用したくない場合は、Tinystatic をコンパイルするために Golang コンパイラをインストールする必要があります。次に、次のコマンドを実行して tinystatic をインストールできます。
go install -u github.com/julvo/tinystatic
または、リポジトリのクローンを作成し、このリポジトリのルート ディレクトリでgo install
またはgo build
実行します。
これは、単一の HTML ページから始めて tinystatic の機能を 1 つずつ紹介する、小さなブログを構築する 10 分間のチュートリアルです。
まず、 routes
というフォルダーを作成します。このフォルダー内に、次の内容を含む単一の HTML ファイルindex.html
を作成します。
<!doctype html >
< html >
< head >
< title > Our first tinystatic website </ title >
</ head >
< body >
< h1 > Welcome to our blog </ h1 >
</ body >
</ html >
これで、初めてtinystatic
実行できるようになりました。デフォルトでは、 tinystatic は、 routes
ディレクトリを含むディレクトリで呼び出されることが想定されていますが、 -routes
パラメータを使用して変更できます。コマンドを実行すると、 routes
フォルダーの横にフォルダーoutput
表示されるはずです。ファイル構造は次のようになります。
my-blog/
routes/
index.html
output/
index.html
これで、出力ディレクトリで Web サーバーを実行できるようになりました。たとえば、Python の組み込みサーバーを使用して、 http://localhost:8000
で Web サイトを開きます。
cd output
python3 -m http.server
これまでのところ、tinystatic が行ったのは、 index.html
routes
からoutput
にコピーすることだけでした。それほど役に立ちませんでしたが、しばらくお待ちください...
2 番目の HTML ファイル (例: about.html
をroutes
に追加しましょう。
<!doctype html >
< html >
< head >
< title > Our first tinystatic website </ title >
</ head >
< body >
< h1 > About us </ h1 >
</ body >
</ html >
tinystatic
再度実行し、Web サーバーがまだ実行されている状態で、 http://localhost:8000/about
に移動できるようになります。 tinystatic が次のように 1 つのindex.html
をabout
フォルダーを作成したため、このルートには.html
が存在しないことに注意してください。
output/
index.html
about/
index.html
現在のページで気に入らないのは、基本的な HTML 構造がすべて重複していることです。 index.html
とabout.html
には共有テンプレートを使用した方がよいのではないでしょうか?これを行うには、 routes
フォルダーの隣にtemplates
というフォルダーを作成し、その中に HTML ファイルdefault.html
を配置します。
my-blog/
routes/
index.html
about.html
templates/
default.html
default.html
の内容は次のようになります。
<!doctype html >
< html >
< head >
< title > Our first tinystatic website </ title >
</ head >
< body >
{{template "body" .}}
</ body >
</ html >
また、 routes/index.html
の内容を次のように変更します。
---
template: default.html
---
{{define "body"}}
< h1 > Welcome to our blog </ h1 >
{{end}}
そしてroutes/about.html
の内容を
---
template: default.html
---
{{define "body"}}
< h1 > About us </ h1 >
{{end}}
tinystatic
再度実行すると、出力は前の出力と同じになりますが、HTML スケルトンは 1 か所に統合されました。
先ほど説明したように、ファイルの先頭にあるメタ データにテンプレート名を指定することで、コンテンツをレンダリングするテンプレートを指定できます。他のテンプレート (以下を参照) を含めたり、Go のテンプレート パイプラインを使用したりすることもできます。レンダリング中に、ファイルの先頭で定義されたメタ データ、フィールドRoute.Href
、 Route.FilePath
、およびRoute.Meta
を持つ構造体Route
にアクセスできます。これもファイルの先頭で定義されたメタ データのマップです。さらに、すべてのルートのスライス (Go を初めて使用する人のための配列と考えてください) であるRoutes
にアクセスできます。これについては、後ほど詳しく説明します。
このメタデータを Go のテンプレート プリミティブと併用して、現在のページに応じてページ タイトルを変更してみましょう。このために、 routes/about.html
のメタデータを次のように変更します。
---
template: default.html
title: About
---
最後にtemplates/default.html
次のように変更します
<!doctype html >
< html >
< head >
< title > {{if .title}} {{.title}} | {{end}}Our first tinystatic website </ title >
</ head >
< body >
{{template "body" .}}
</ body >
</ html >
Web サイトを再生成すると、ブラウザーにはインデックスと About ページに異なるページ タイトルが表示されるはずです。
次に、ルート フォルダーにいくつかのブログ投稿を作成しましょう。
routes/
index.html
about.html
posts/
first_post.md
second_post.md
これらの.md
ファイル内にマークダウンを配置し、 routes/index.html
およびroutes/about.html
でメタデータを指定した方法と同様に、テンプレートをdefault.html
として指定するメタデータ セクションを上部に配置します。 first_post.md
の場合、これは次のようになります。
---
template : default.html
title : First Post
---
# Here could be some fine content
tinystatic
を再度実行して出力を再生成すると、 http://localhost:8000/posts/first_post
およびhttp://localhost:8000/posts/second_post
にアクセスできるようになります。マークダウンは HTML に変換され、 body
というテンプレート内に配置され、 templates/default.html
の{{template "body" .}}
プレースホルダーにレンダリングされます。これが.html
ファイルとどのように異なるかに注意してください。.html ファイルでは、 {{define "body"}} ... {{end}}
を手動で呼び出す必要があります。
次に、前述のRoutes
スライスを使用して投稿のリストを作成しましょう。 routes/index.html
の内容を次のように変更します。
---
template: default.html
---
{{define "body"}}
< h1 > Welcome to our blog </ h1 >
< ul >
{{range .Routes | filterFilePath "**/posts/*.md"}}
< li >
< a href = {{.Href}} > {{.title}} </ a >
</ li >
{{end}}
</ ul >
再生成後、インデックス ページに投稿のリストが表示されるはずです。 Routes
スライスは、事前定義されたヘルパー関数を使用してフィルタリングできるすべてのルートのリストを提供します。
.Routes | filterFilePath "**/posts/*.md"
、posts というフォルダー内の.md
で終わるすべてのファイルを表示します.Routes | sortAsc "title"
メタデータフィールドのtitle
に基づいてルートを並べ替えます。.Routes | limit 10
最初の 10 ルートのみを取得するには.Routes | limit 10
.Routes | offset 3
最初の 3 つのルートをスキップするには、 .Routes | offset 3
.Routes | filter "title" "*Post"
パターンに一致するメタデータフィールドのtitle
に基づいてフィルタリングします*Post
.Routes | filterFileName "*.md"
*.md
で終わるすべてのファイルを取得します.Routes | filterHref "/*"
すべてのトップレベルのルートを取得します.Routes | filterFilePath "**/posts/*.md" | sortDesc "title" | limit 10
上記のいくつかを組み合わせるには.Routes | filterFilePath "**/posts/*.md" | sortDesc "title" | limit 10
次に、投稿に他のページとは異なるレイアウトを使用したいと思います。投稿にはテキストの前に画像が必要です。そのため、投稿のメタデータで画像の URL を定義します。したがって、次の内容を含むtemplates/post.html
という 2 番目のテンプレートを追加します。
<!doctype html >
< html >
< head >
< title > {{if .title}} {{.title}} | {{end}}Our first tinystatic website </ title >
</ head >
< body >
< img src = {{.image}} />
{{template "body" .}}
</ body >
</ html >
投稿メタデータを次のように変更します
---
template: post.html
title: First Post
image: https://some-image.url
---
出力を再生成すると、投稿の上に美しい画像が表示されるはずです。ただし、テンプレート内に再び HTML コードが重複してしまいました。これを改善するために、 routes
とtemplates
の隣に、 partials
という別のフォルダーを作成します。パーシャル内で、 head.html
というファイルを作成します。
{{define "head"}}
< head >
< title > {{if .title}} {{.title}} | {{end}}Our first tinystatic website </ title >
</ head >
{{end}}
そして、テンプレート内の<head>...</head>
{{template "head" .}}
に置き換えます。次のようになります。
<!doctype html >
< html >
{{template "head" .}}
< body >
{{template "body" .}}
</ body >
</ html >
異なるテンプレート間のコードの複製を最小限に抑えました。このpartials
ディレクトリを使用して、ナビゲーション バーやフッターなど、あらゆる種類の繰り返しコンポーネントを保存できます。
実際には、このチュートリアルで使用したフォルダー名を使用してプロジェクトを構造化する必要はないことに注意してください。これらのフォルダー名は単なるデフォルトですが、それぞれのコマンド ライン引数を使用して変更できます (詳細についてはtinystatic -help
参照してください)。
ブログの完全な例はここにあります。