日本語 | English
テンプレート

テンプレート

Vivliostyle CLI は、あらかじめ定義されたファイル構成や設定、コンテンツを持つプロジェクトを生成するためのテンプレートシステムを提供しています。テンプレートは create コマンド実行時に適用されます。

テンプレートを使用する

プロジェクト作成時に --template オプションでテンプレートを指定できます:

vivliostyle create my-project --template gh:org/repo/templates/awesome-template

npm create book でも同様に指定できます:

npm create book -- --template gh:org/repo/templates/awesome-template

ビルトインテンプレート

Vivliostyle CLI には以下のプリセットが付属しています:

名前 説明
minimal 空の Markdown ファイル 1 つだけのミニマルなテンプレート
basic 英語のスターターコンテンツを含む基本テンプレート
basic-ja 日本語のスターターコンテンツを含む基本テンプレート

これらのプリセットは vivliostyle create を対話形式で実行したときに選択するか、直接指定することもできます:

vivliostyle create my-project --template minimal

テンプレートソースの種類

--template オプションには次の 3 種類の形式を指定できます。

リモート(giget 形式)

[provider]:repo[/subpath][#ref] の形式でリモートリポジトリからテンプレートをダウンロードします。テンプレートのダウンロード元は giget の形式で指定できます。

# GitHub から取得
--template gh:org/repo/templates/my-template

# 特定のブランチまたはタグを指定
--template gh:org/repo/templates/my-template#v2.0.0

# GitLab から取得
--template gitlab:org/repo/templates/my-template

ローカルディレクトリ

相対パスまたは絶対パスでローカルディレクトリを指定します:

--template ./my-custom-template
--template ../shared-templates/book-template

node_modules/.git/ を除く全ファイルが再帰的にコピーされます。

Vivliostyle Themes固有のテンプレート

インストールした Vivliostyle Themes のパッケージが package.jsonvivliostyle.template フィールドでテンプレートを提供している場合、プロジェクト作成の対話フローの中でそのテンプレートが選択肢として表示されます。Theme パッケージへのテンプレートの組み込み方は Theme パッケージでテンプレートを提供する を参照してください。

テンプレート変数

テンプレートのファイルには Handlebars 式を埋め込むことができ、プロジェクト作成時に実際の値に置き換えられます。UTF-8 のテキストファイルのみが処理対象で、バイナリファイル(画像など)はそのままコピーされます。

利用可能な変数

変数 説明
projectPath string プロジェクトのパス
title string タイトル
author string 著者名
language string 言語コード(BCP 47)
theme ThemeSpecifier \| undefined テーマ設定
themePackage object \| undefined テーマパッケージのメタデータ
themePackage.name string テーマパッケージ名
themePackage.version string テーマパッケージバージョン
cliVersion string Vivliostyle CLI のバージョン
coreVersion string Vivliostyle Core のバージョン
browser object \| undefined ブラウザ設定
browser.type string ブラウザの種類(例:"chrome"
browser.tag string \| undefined ブラウザのタグ

テーマパッケージが カスタムプロンプト を定義している場合、ユーザーの回答も各プロンプトの name をキーとするテンプレート変数として使用できます。

ビルトインヘルパー

以下の Handlebars ヘルパーが登録されています:

ヘルパー 説明 入力例 → 出力例
upper 大文字に変換 my bookMY BOOK
lower 小文字に変換 My Bookmy book
capital キャピタルケースに変換 my bookMy Book
camel キャメルケースに変換 my bookmyBook
snake スネークケースに変換 my bookmy_book
kebab ケバブケースに変換 my bookmy-book
proper タイトルケースに変換 a guide to vivliostyleA Guide to Vivliostyle
lorem Lorem ipsum のダミーテキストを挿入 (引数なし)
json JSON 文字列にシリアライズ オブジェクト → JSON 文字列

例:vivliostyle.config.js

// @ts-check
import { defineConfig } from '@vivliostyle/cli';

export default defineConfig({
  title: "{{proper title}}",
  author: "{{author}}",
  {{#if language}}
  language: "{{language}}",
  {{/if}}
  {{#if theme}}
  theme: {{json theme}},
  {{/if}}
  image: "ghcr.io/vivliostyle/cli:{{cliVersion}}",
  entry: ["manuscript.md"],
});

例:package.json

{
  "name": "{{kebab title}}",
  "description": "{{proper title}}",
  "author": "{{author}}",
  "version": "0.0.0",
  "type": "module",
  "private": true,
  "scripts": {
    "build": "vivliostyle build",
    "preview": "vivliostyle preview"
  },
  "dependencies": {
    "@vivliostyle/cli": "{{cliVersion}}"
  }
}

Theme パッケージでテンプレートを提供する

Vivliostyle Themes のパッケージには、1 つ以上のプロジェクトテンプレートをバンドルできます。テンプレートは package.jsonvivliostyle.template フィールドで宣言します:

{
  "name": "my-vivliostyle-theme",
  "version": "1.0.0",
  "vivliostyle": {
    "theme": {
      "name": "My Theme",
      "style": "./theme.css"
    },
    "template": {
      "default": {
        "name": "デフォルトテンプレート",
        "description": "基本的なスタート地点",
        "source": "org/my-vivliostyle-theme/template/default"
      },
      "with-prompts": {
        "name": "カスタムオプション付きテンプレート",
        "source": "org/my-vivliostyle-theme/template/with-prompts",
        "prompt": [
          {
            "type": "text",
            "name": "subtitle",
            "message": "サブタイトルを入力してください:",
            "required": false
          },
          {
            "type": "select",
            "name": "pageSize",
            "message": "ページサイズを選択してください:",
            "options": ["A4", "A5", "B5"]
          }
        ]
      }
    }
  }
}

vivliostyle.template の各キーはテンプレート ID です。値のオブジェクトには以下のフィールドがあります:

フィールド 必須 説明
name string 対話プロンプトに表示される名前
description string ヒントとして表示される短い説明
source string ダウンロードするテンプレートの参照先
prompt PromptOption[] ユーザーへの追加質問の定義

source フィールドには --template オプションと同じく giget 形式でダウンロードするテンプレートを指定します。

カスタムプロンプト

prompt 配列を使うと、プロジェクト作成時にユーザーへの追加質問を定義できます。回答は Handlebars 式で利用できるテンプレート変数になります。

以下のプロンプトタイプが使用できます:

text

自由入力のテキストフィールドです。

{
  "type": "text",
  "name": "subtitle",
  "message": "サブタイトルを入力してください:",
  "placeholder": "(省略可)",
  "defaultValue": "",
  "initialValue": "",
  "required": false
}

select

一覧から 1 つを選択します。

{
  "type": "select",
  "name": "pageSize",
  "message": "ページサイズを選択してください:",
  "options": [
    { "value": "A4", "label": "A4(210×297 mm)", "hint": "標準" },
    { "value": "A5", "label": "A5(148×210 mm)" },
    "B5"
  ],
  "initialValue": "A4"
}

選択肢には文字列またはオブジェクト(valuelabelhint フィールド)を指定できます。

multiSelect

一覧から複数を選択します。

{
  "type": "multiSelect",
  "name": "features",
  "message": "含める機能を選択してください:",
  "options": ["toc", "cover", "bibliography"]
}

autocomplete

タイプアヘッドによる絞り込みができる単一選択です。

{
  "type": "autocomplete",
  "name": "locale",
  "message": "ロケールを選択してください:",
  "options": ["en", "ja", "zh", "fr", "de"]
}

autocompleteMultiSelect

タイプアヘッドによる絞り込みができる複数選択です。

{
  "type": "autocompleteMultiSelect",
  "name": "locales",
  "message": "対応するロケールを選択してください:",
  "options": ["en", "ja", "zh", "fr", "de"]
}

テンプレートディレクトリの構成

source に指定したディレクトリ以下にテンプレートファイルを配置します。ファイルは新しいプロジェクトディレクトリにコピーされ、テンプレート変数が置き換えられます。

my-vivliostyle-theme/
├── package.json               # vivliostyle.template を宣言
├── theme.css
└── template/
    └── default/
        ├── vivliostyle.config.js   # {{title}}、{{author}} などを使用
        ├── manuscript.md
        └── assets/
            └── cover.webp          # バイナリファイルはそのままコピー

ミニマルテンプレートの例

最小構成のテンプレートの例として、Markdown ファイル 1 つと設定ファイルだけで構成された例を示します。

vivliostyle.config.js

// @ts-check
import { defineConfig } from '@vivliostyle/cli';

export default defineConfig({
  title: "{{proper title}}",
  author: "{{author}}",
  entry: ["manuscript.md"],
});

manuscript.md

# {{proper title}}

ユーザーが vivliostyle create my-book --title "はじめての本" --author "山田 太郎" を実行すると、次のように置き換えられます:

vivliostyle.config.js(置き換え後):

// @ts-check
import { defineConfig } from '@vivliostyle/cli';

export default defineConfig({
  title: "はじめての本",
  author: "山田 太郎",
  entry: ["manuscript.md"],
});