学習センターへ戻る

サイトガイド

Markdown・記事属性 完全ガイド

分類: 構文と属性 言語: JA

初めての修正から新規記事作成まで、Markdown、frontmatter、メディア、記事構成、PR 前確認を一つにまとめたリファレンスです。

目次

これは最初から最後まで暗記する教材ではなく、必要なときに参照するリファレンスです。初めての貢献では上のルートを選び、編集中に見出し、リンク、画像、メディア、frontmatter で迷ったときだけ該当章へ移動してください。

編集を始める前に

最短で確実な流れは次のとおりです。

  1. 対象が src/content/ 配下にあり、zh.mdja.mden.md が目的の言語と一致することを確認します。
  2. 今回の目的に必要な箇所だけを変更し、新しい事実には追跡可能な出典を用意します。
  3. frontmatter の両方の ---、既存フィールド、インデント、引用符を保ちます。
  4. Pull Request を作成する前に Preview / Changes で差分を確認します。

本サイトは Wikitext ではなく Markdown を使用します。構文記号は半角 ASCII で入力してください。日本語・中国語入力の全角記号は Markdown として機能しません。

初心者の原則:小さく正確な変更を優先してください。無関係な段落をついでに整理せず、AI の出力を事実の出典として扱わないでください。

見出し

# で見出しを作成します。記号の数が階層に対応し、最大6階層まで使えます。# の後ろには半角スペースが必要です。ページタイトルは frontmatter から表示されるため、記事本文は通常 ## から始めます。

記述例:

## レベル2の見出し
### レベル3の見出し

表示例:

レベル3の見出し例

テキストの書式

記述例:

**太字テキスト**
*斜体テキスト*
***太字斜体テキスト***
~~取り消し線テキスト~~
`インラインコード`

表示例:

太字テキスト斜体テキスト太字斜体テキスト取り消し線テキストインラインコード

リスト

箇条書きリスト

- または + を使用します。

記述例:

- 項目1
- 項目2

表示例:

  • 項目1
  • 項目2

リスト記号の後ろには、必ず半角スペースを入れてください。

番号付きリスト

数字の後ろにピリオドを付けます。

記述例:

1. 手順1
2. 手順2
3. 手順3

表示例:

  1. 手順1
  2. 手順2
  3. 手順3

ハイパーリンク

記述例:

[本サイト](https://kamitsubaki.wiki/ja/)

表示例:

本サイト

| で列を区切り、- で見出し行との区切りを定義します。

記述例:

| アーティスト | 楽曲名 | 歌詞 |
| :--- | :---: | ---: |
| KAF | 糸 | 省略 |
| RIM | 1999 | 省略 |

表示例:

アーティスト楽曲名歌詞
KAF省略
RIM1999省略

配置方法:

  • :---:左揃え
  • :---::中央揃え
  • ---::右揃え

Frontmatter

ファイル上部のFrontmatterには、編集する記事の属性を記述します。

Frontmatterの開始記号と終了記号には、どちらも --- を使用します。

例:

---
locale: ja
translationKey: example-entry
title: 記事の例
---

表示結果: ページはこれらのフィールドからタイトル、言語間の関連、メタデータを生成します。YAML ブロック自体は記事本文に表示されません。

画像の挿入

記述例:

![花譜「糸」のカバー画像](/images/songs/shi.webp)

表示結果: この位置に画像が表示されます。画像がまだ追加されていない場合も、代替テキストが内容を説明します。

画像ファイルは public/images/ に配置しますが、Markdown の URL は /images/ から始め、public を含めません。情報を持つ画像には内容を説明する代替テキストを付け、装飾画像では ![](...) のように空にできます。

Markdown エディターについて

Markdown形式のファイルを作成するために、特別なエディターは必要ありません。

メモ帳などの基本的なテキストエディターでも、保存時に拡張子を .md に変更すればMarkdownファイルを作成できます。

Markdownに慣れていない方には、リアルタイムプレビューに対応したエディターの方が使いやすい場合があります。

本ページの作成者は、機能が充実しており、複数のプラットフォームに対応しているObsidianを推奨します。

Wiki 短縮構文と管理されたメディア

Markdown の基本を学んだ後は、ルビ、折りたたみ、意味付けのために、サイトが対応する一部の HTML を使用できます。本文の HTML はビルド時に安全化されるため、ブラウザーが対応するすべての要素を利用できるわけではありません。

安全境界

本文では次の種類の要素だけを許可します。

  • 構造:ph1h6blockquotehrbrdivspan
  • テキストの意味付け:aabbrbstrongiemusdelmarksmallcodeprekbdsampvarsubsupciteqtime
  • リストとデータ:ulollidldtddtabletheadtbodytfoottrthtd
  • Wiki 向け表現:rubyrtrpdetailssummaryfigurefigcaptionpictureimgsource

属性もホワイトリスト方式です。通常のリンク、画像の代替テキスト、表のセル結合などは保持されますが、class はサイト側で実装済みの用途だけに制限されます。次の内容は削除されます。

  • scriptstyleiframeobjectembedform など、コード実行や任意の外部コンテンツ読み込みにつながる要素。
  • onclickonmouseoveronerror などすべての on* イベント属性と、インライン style
  • javascript: など危険な URL スキーム。本文で指定した id / name には安全な接頭辞が付き、ページ側のオブジェクトを上書きできません。

投稿者がこの HTML を直接書く必要は通常ありません。下記の Wiki 短縮構文を優先してください。サイト側のコードが対応する要素を生成し、その結果も同じホワイトリストで検査されます。新しい操作が必要な場合は PR で再利用可能な短縮構文を提案し、スクリプトや外部プレイヤーのコードを記事へ貼り付けないでください。

Wiki 短縮構文一覧

短縮構文は関数に似た {{名前::引数}} 形式です。名前と引数の数は固定されています。

用途構文
ルビ{{ruby::本文::読み}}
読みとローマ字{{ruby::本文::かな::romaji}}
ネタバレ / 伏せ字{{spoiler::隠す文字}}
強調表示{{mark::重要}}
略語の説明{{abbr::V.W.P::Virtual Witch Phenomenon}}
キーボード入力{{kbd::Ctrl+K}}
機械可読の日付{{time::表示文字::2026-07-19}}
小文字、上付き、下付き{{small::文字}}{{sup::2}}{{sub::2}}
歌詞切り替えボタン{{lyrics-controls::ja}}(各ファイルでは zh / en に変更)

インライン構文の引数はプレーンテキストです。内部に Markdown や HTML を入れず、二重コロン :: を引数の区切りとして使います。Markdown 表の中でも列を壊しません。名前や引数数が誤っている場合は元の文字列が表示されるため、Preview で間違いを確認できます。

記述例:

{{mark::重要な内容}}
{{abbr::V.W.P::Virtual Witch Phenomenon}}
{{kbd::Ctrl+K}} を押す
{{time::2026年7月19日::2026-07-19}}
H{{sub::2}}O と x{{sup::2}}
{{small::補足説明}}

表示例:

重要な内容V.W.PCtrl+K を押す、、H2O と x2補足説明

楽曲ページでは {{lyrics-controls::ja}} を独立した段落にし、.my-lyric-box 歌詞コンテナの直前に置きます。サイトが各言語用のルビ、翻訳、ローマ字、同期歌詞ボタンを生成し、日本語版では翻訳ボタンを自動的に省略します。引数はファイルの locale と一致させてください。

歌詞ページの完全な書き方

歌詞ページは、ローカライズされた切り替えボタン、歌詞コンテナ、繰り返す歌詞行の3部分で構成します。ボタンは独立した段落としてコンテナの直前に置き、各 lyric-line に原文1行を記述します。

コード構文

{{lyrics-controls::言語}}

<div class="my-lyric-box">

<div class="lyric-line">
<div class="jp-lyric">
<ruby>原文<rt class="furi">かな</rt><rt class="roma">romaji</rt></ruby>
</div>
</div>

</div>
  • 言語 は現在のファイルに合わせて zhjaen のいずれかにします。
  • furi は「注音を表示」ボタンで切り替えるかな、roma はローマ字トラックです。
  • 中国語訳は cn-lyric、英語訳は trans-lyric を使い、日本語ファイルでは翻訳用 <div> を記述しません。
  • かな自体にルビが不要な場合は、ローマ字だけを書けます:<ruby>なら<rt class="roma">nara</rt></ruby>
  • 行を増やすたびに lyric-line 一式を複製します。この生 HTML ブロック内に {{ruby::...}} 短縮構文を置かないでください。HTML ブロック内部では Markdown 短縮構文が再解析されません。

書き方

日本語の楽曲ファイルへコピーできる、1行分の完全な例です。

{{lyrics-controls::ja}}

<div class="my-lyric-box">

<div class="lyric-line">
<div class="jp-lyric">
<ruby>間違<rt class="furi">まちが</rt><rt class="roma">machiga</rt></ruby><ruby>い<rt class="roma">i</rt></ruby>
</div>
</div>

</div>

実例

上のコードは、操作できる歌詞練習コンポーネントとして表示されます。

同期歌詞のタイムライン

カラオケ風の単語アニメーションを表示する場合は、各歌詞単位の直前に [mm:ss.xx] または [mm:ss.xxx] のタイムタグを記述します。時刻は歌詞タイマーの開始点を基準とした、その単位の開始時刻です。再生中は隣り合うタイムタグの間を左から右へ連続的に塗り進めます。「再生」で 00:00.00 から計時し、タイムタグ付きの行をクリックするとその行へ移動して再生を続け、「リセット」で先頭へ戻ります。

  • mmss はそれぞれ2桁、小数部は2桁または3桁です。例:[00:03.50][01:02.345]
  • タイムタグは対象の <ruby> またはプレーンテキストへ空白を入れず直結します。個別に強調する単位ごとに開始時刻が必要です。
  • .jp-lyric の最初のタイムタグは、その行をクリックしたときの移動先にもなります。翻訳行がある場合は、先頭に原文と同じ行開始時刻を付けることを推奨します。
  • 各単位は次のタイムタグまで塗り進みます。行末の単位は次の行まで続き、最終行には短い自動終了時間が適用されます。
  • 時刻は再生順に増加させます。一部の行だけにタイムタグを付けることもでき、タグのない行は通常表示のままです。
  • 投稿者が書くのは角括弧のタイムタグだけです。サイト生成後の lrc-taglrc-word、スクリプトを手書きしないでください。時刻は実際に試聴して調整し、AI に推測させないでください。
  • 現在の歌詞タイマーは独立しており、上部の YouTube、bilibili、その他の試聴プレイヤーの再生位置を自動取得しません。

書き方

{{lyrics-controls::ja}}

<div class="my-lyric-box">

<div class="lyric-line">
<div class="jp-lyric">
[00:00.00]<ruby>間違<rt class="furi">まちが</rt><rt class="roma">machiga</rt></ruby>[00:00.80]<ruby>い<rt class="roma">i</rt></ruby>
</div>
</div>

</div>

実例

同期歌詞を有効にすると、次の2つの日本語単位が 0 秒と 0.8 秒から順に左から右へ塗られます。

歌詞 HTML を生成する AI プロンプト

長い歌詞では、手元にある原文、読み、ローマ字、翻訳を AI に機械的に整形させられます。AI を歌詞・翻訳・読みの出典にはせず、貼り付け前に全行を確認し、入力内容の出典が今回の投稿に利用できることも確認してください。

プロンプト構文

次の全文を AI にコピーし、最後の5つの入力欄だけを置き換えます。

あなたは KAMITSUBAKI Wiki の歌詞 HTML 整形アシスタントです。私が提供した歌詞トラックだけをサイト形式へ変換してください。

必須条件:
1. 入力だけを変換し、歌詞の追加、翻訳、書き換え、不足する読みの推測をしない。
2. Markdown に直接貼り付けられる内容だけを出力し、説明やコードフェンスを付けない。
3. 先頭に {{lyrics-controls::ファイル言語}} を出力し、その後に <div class="my-lyric-box"> を1つだけ生成する。
4. 入力1行につき <div class="lyric-line"> を1つ使い、日本語原文を <div class="jp-lyric"> に入れる。
5. かなとローマ字がある場合は <ruby>原文<rt class="furi">かな</rt><rt class="roma">romaji</rt></ruby> を使う。
6. ローマ字だけなら <ruby>原文<rt class="roma">romaji</rt></ruby> を使い、信頼できる読みがなければ原文をそのまま残す。
7. 中国語訳は cn-lyric、英語訳は trans-lyric を使う。日本語ファイルまたは翻訳未入力では翻訳 div を生成しない。
8. 行数、順序、句読点、文字を厳密に維持する。単語単位の対応が不明な場合は、提供された1行分の読みを1つの ruby にまとめ、勝手に分割しない。
9. テキスト中の <、>、& をエスケープする。style、すべての on* 属性、script、iframe、id、指示されていない要素を出力しない。
10. すべての div、ruby、rt が正しく閉じていることを確認し、ボタンと歌詞コンテナの間には空行を1つだけ置く。

【ファイル言語】
zh / ja / en

【日本語原文:1行につき歌詞1行】
ここに貼り付け

【かな:任意、行数を原文と一致させる】
ここに貼り付け

【ローマ字:任意、行数を原文と一致させる】
ここに貼り付け

【翻訳:任意、行数を原文と一致させる】
ここに貼り付け

書き方

入力欄だけを次のように置き換えます。

【ファイル言語】
ja

【日本語原文】
間違い

【かな】
まちがい

【ローマ字】
machigai

【翻訳】

出力例

正しい AI 出力は次のようになり、そのまま楽曲本文へ貼り付けられます。

{{lyrics-controls::ja}}

<div class="my-lyric-box">
<div class="lyric-line">
<div class="jp-lyric">
<ruby>間違い<rt class="furi">まちがい</rt><rt class="roma">machigai</rt></ruby>
</div>
</div>
</div>

Ruby ルビ

表示する本文と読みだけを記述します。

{{ruby::局部壊死::きょくぶえし}}

文字単位で正確に対応させる場合は、短縮構文を続けて記述します。

{{ruby::観::かん}}{{ruby::測::そく}}{{ruby::所::じょ}}

表示結果:

  • かんそくじょ

初期状態で隠したい補足内容

短い内容には伏せ字構文、長い補足には次のブロック形式を使います。どちらも記事固有の JavaScript を必要としません。

spoiler の引数はプレーンテキスト専用です。{{spoiler::...}} の内側に **太字**、Markdown リンク、HTML を入れると、短縮構文がソースのまま表示されます。伏せ字全体を太字にする場合は **{{spoiler::隠す文字}}** と記述してください。見出し、リスト、リンクなどを隠す内容に混在させる場合は、次節の details ブロックを使用します。

記述例:

物語の結末:{{spoiler::初期状態では隠れる文字}}

表示例:

物語の結末:初期状態では隠れる文字

折りたたみと展開

対になる details マーカーを使います。開始・終了マーカーはそれぞれ独立した段落にし、前後に空行を置いてください。内部では通常の Markdown を使用できます。

{{details::全曲リストを表示}}

1. 1曲目
2. **2曲目**

{{/details}}

表示結果:

全曲リストを表示
  1. 1曲目
  2. 2曲目

通常の段落は空行で分けます。表のセルなど特殊な場所だけ、ホワイトリストに含まれる <br> を使用してください。

音声・動画の埋め込み

本サイトでは共通のメディア短縮構文を使用できます。次の構文を1行だけで記述すると、ビルド時にレスポンシブで安全な遅延読み込み iframe が生成されます。

@[プロバイダー](メディア ID または共有 URL "任意のタイトル")

プロバイダー名は youtubebilibiliapple-musicspotifyneteaseqq-music に対応しています。YouTube、bilibili、NetEase Cloud Music、QQ Music は動画・楽曲 ID の直接指定にも対応し、すべてのプロバイダーで一般的な共有 URL を使用できます。

@[youtube](3Wtx6k2vInU "花譜 - 糸")
@[bilibili](BV1CJ411b7Ym "花譜 - 糸")
@[apple-music](https://music.apple.com/cn/song/example/123456789)
@[spotify](https://open.spotify.com/track/4cOdK2wGLETKBW3PvgPWqT)
@[netease](2637083551)
@[qq-music](001ABCDEF)

表示例:

YouTube花譜 - 糸

集約メディア切り替え

同じ作品に複数プラットフォームの公式コンテンツがある場合、既存のメディア短縮構文を一つの集約ブロックにまとめられます。ページには選択中のソースと切り替えボタンが表示され、従来の単独 @[provider](...) 構文はそのまま利用できます。

コード構文
{{media-switcher::切り替えタイトル}}
@[1つ目のプロバイダー](メディアIDまたは共有URL "任意のキャプション")
@[2つ目のプロバイダー](メディアIDまたは共有URL "任意のキャプション")
{{/media-switcher}}
書き方
  • 作品名や「公式視聴」など、現在の言語に合うタイトルが必須です。
  • 各項目は従来のメディア構文を使い、対応プロバイダーと URL の検証規則も同じです。
  • 各行は空行を挟まず続けて記述できます。一行にまとめても解析されますが、レビューと保守のため、プラットフォームごとに一行で書くことを推奨します。
  • 一つのブロックには異なる 2–6 プラットフォームを指定できます。同じプロバイダーの重複、集約ブロックの入れ子、通常段落の混在はできません。
  • すべてのソースが有効である必要があります。不明なプロバイダー、危険な URL、不正な ID が一つでもある場合、ブロック全体は iframe を生成せず、修正できるようソーステキストを表示します。
  • JavaScript がない場合は検証済みプレイヤーを順番に表示します。JavaScript がある場合はボタン、方向キー、Home、End で切り替えられます。
実例
{{media-switcher::花譜 - 糸}}
@[bilibili](BV1CJ411b7Ym "花譜 - 糸")
@[youtube](3Wtx6k2vInU "花譜 - 糸")
{{/media-switcher}}

表示例:

花譜 - 糸

bilibili花譜 - 糸
YouTube花譜 - 糸

同じ Markdown 表のセルに複数の短縮構文を続けて記述すると、記述順に縦方向へ表示されます。そのセルには短縮構文と空白だけを記述し、説明文を混在させないでください。

| 作曲 | 作詞 | プレイヤー |
| --- | --- | --- |
| Wiz_nicc | Wiz_nicc | @[bilibili](BV13ZZNYQEQx) @[netease](2637083551) |

認識できないプロバイダーや URL は通常のリンクとして残り、任意の第三者 iframe は生成されません。新規コンテンツでは、許可プロバイダー、プライバシー属性、サイズ、スタイルを統一するため短縮構文を使用し、第三者サイトの生の <iframe> を貼り付けないでください。

アーティストページの外部リンク・ブランドカード

アーティストページでは、2 か所に公式リンクを記述できます。どちらも同じプラットフォーム判定とブランド表示を使いますが、記述方法は異なります。

情報欄の公式リンク

情報欄では frontmatter の officialLinks を使用します。各項目には表示名 label と完全な URL href の両方が必要です。

officialLinks:
  - label: "公式サイト"
    href: "https://kaf.kamitsubaki.jp/"
  - label: "YouTube"
    href: "https://www.youtube.com/@virtual_kaf"

本文の外部リンク

本文では、独立したレベル2見出し ## 外部リンク を正確に記述し、その直下に通常の Markdown 箇条書きリストを置きます。各リンクの文字列にはプラットフォーム名またはページ名を含めてください。

## 外部リンク

- [公式サイト](https://kaf.kamitsubaki.jp/)
- [YouTube](https://www.youtube.com/@virtual_kaf)
- [X (Twitter)](https://x.com/virtual_kaf)
  • - YouTube:<https://...>- <https://...>、説明文だけの項目は使用しないでください。これらの形式では完全なカードを生成できません。
  • 「出典と外部リンク」のような複合見出しは使用しないでください。根拠資料は独立した ## 出典 に、読者向けの公式サイトや SNS は ## 外部リンク に分けます。
  • 中国語・日本語・英語のアーティスト本文では、それぞれ 外部链接外部リンクExternal Links を使用します。サイトが認識できるよう、見出しを正確に記述してください。
  • JavaScript が有効な場合、アーティストページではリストがプラットフォーム Logo、ブランド色、外部リンク矢印を備えたレスポンシブなリンクカードになります。フォーム用ボタンではなく、移動用リンクとしての意味は保たれます。JavaScript がない場合は、読みやすくクリック可能な通常のリストとして残ります。
  • Bilibili、YouTube、X/Twitter、TikTok、Instagram、Weibo、Niconico、Spotify、Apple Music、NetEase Cloud Music、pixiv、piapro、Steam、Wikipedia、KAMITSUBAKI 公式サイトを識別できます。その他の URL には汎用サイト表示を使用します。
  • プラットフォームの SVG やリモート Logo 画像を本文へ貼り付けないでください。アイコンはサイト側で一元管理します。

PR 前チェック

  • ファイルパスと locale が対応し、各言語版で同じ translationKey を使っている。
  • 2 つの ---、YAML のインデント、フィールド型を壊していない。
  • 日付は YYYY-MM-DD、再生時間は MM:SS または HH:MM:SS
  • 新しい事実に信頼できる出典があり、リンクが開き、情報画像に適切な代替テキストがある。
  • アーティスト本文のリンクは独立した ## 外部リンク- [表示名](URL) のリストを使い、生の URL や複合見出しがない。
  • メディアは @[provider](...) を使用し、本文にスクリプト、イベント属性、認証情報、トークン、個人情報がない。
  • Preview / Changes に今回の変更だけがあり、他言語や無関係な内容を誤って削除していない。

属性ブロックガイド

記事を編集する際に、Frontmatterの属性が何を意味するのか分からない場合は、以下の説明を参照してください。

共通部分

以下の属性は、すべての記事カテゴリーで共通して使用されます。

  • locale:文書の言語版を示します。zh は中国語、en は英語、ja は日本語を表します。編集している記事の言語に対応する値を入力してください。
  • translationKey:同一記事の多言語版を関連付ける共通識別子です。同じ記事の中国語・日本語・英語ファイルには、同一の値を設定してください。

記述例:

locale: ja
translationKey: kaf-originals-shi

結果: このファイルは日本語コレクションに入り、同じ translationKey を持つ中国語・英語ファイルと関連付けられます。

アーティスト部分

最小例:

name: 花譜
romanizedName: KAF
statusLabel: 活動状態
status: 活動中
image: /images/artists/kaf.webp

表示結果: アーティストページに「花譜 / KAF」、活動状態、人物画像が表示されます。

属性必須役割と入力内容
localezh / ja / enはい現在の記事の言語
translationKey文字列はい同一人物の各言語版で共通して使用する識別子
code文字列いいえ人物番号、資料番号、または内部コード
name文字列はい現在の言語で表示する人物名
romanizedName文字列はいローマ字名、ラテン文字名、または国際表示名
categoryTitle文字列いいえ所属カテゴリーのメインタイトル
categorySubtitle文字列いいえ所属カテゴリーのサブタイトル、または英語による説明
categoryOrder数値いいえカテゴリー間の並び順。通常は小さい値ほど先に表示されます
itemOrder数値いいえ現在の人物を所属カテゴリー内で並べるための値
meta文字列いいえ一覧カードに表示する短い補足情報。役割、所属、短い概要などを記述します
debutDate文字列いいえデビュー日。YYYY-MM-DD 形式を推奨しますが、Schemaでは強制されません
profileTagline文字列いいえ人物詳細ページに表示する紹介用の短い文
designCredits文字列配列いいえキャラクターデザイン、ビジュアルデザイン、モデリングなどを担当した制作者の一覧
affiliations文字列配列いいえ所属レーベル、グループ、企画、または組織
officialLinksオブジェクト配列いいえ公式サイトおよび公式SNSへのリンク
officialLinks[].label文字列はいOfficial SiteYouTube などのリンク名
officialLinks[].href文字列はい公式リンクのURL
featuredEntriesオブジェクト配列いいえ人物ページで重点的に関連付ける他の記事
featuredEntries[].label文字列はい関連コンテンツの表示名
featuredEntries[].href文字列はい関連記事へのパス
featuredEntries[].kind固定列挙値はい関連コンテンツの種類。artistprojectalbumsong のいずれかのみ使用できます
theme共通テーマオブジェクトいいえ人物詳細ページで使用する個別の配色
statusLabel文字列はい「活動状況」など、状態欄に表示する見出し
status文字列はい「活動中」「活動終了」などの実際の状態
inactiveブール値いいえ非活動状態かどうか。通常、true は活動終了済み、またはアーカイブ済みであることを示します
image文字列はい人物のメイン画像、アイコン、または立ち絵へのパス
seo共通SEOオブジェクトいいえ現在の記事の検索エンジンおよび共有用情報

企画部分

最小例:

kind: project
title: 神椿市建設中。
description: 神椿の世界観プロジェクト
order: 10

表示結果: 企画は order 順に並び、タイトルと説明が一覧カードに使われます。

属性必須役割と入力内容
localezh / ja / enはい現在の企画記事の言語
translationKey文字列はい同一企画の各言語版で共通して使用する識別子
kind文字列はいprojectgamevirtual-world などの企画種類。Schemaでは固定値に制限されていません
title文字列はい企画名
description文字列はい企画の短い説明。通常は一覧カードやページの概要に使用されます
order数値はい企画一覧における並び順
seo共通SEOオブジェクトいいえ検索エンジンおよび共有用情報

ログ部分

最小例:

date: "2026-07-19"
type: update
title: サイト内容の更新
order: 10

表示結果: ログページに日付、種類、タイトルが表示され、order 順に並びます。

属性必須役割と入力内容
localezh / ja / enはい現在のログ記事の言語
translationKey文字列はい同一ログの各言語版で共通して使用する識別子
date文字列はいログの日付。YYYY-MM-DD 形式を推奨しますが、Schemaでは検証されません
type文字列はいupdatenoticemaintenance などのログ種類
title文字列はいログのタイトル
summary文字列いいえログの短い概要
order数値はいログの並び順
seo共通SEOオブジェクトいいえ検索エンジンおよび共有用情報

楽曲部分

楽曲ファイルは アーティスト ID / カテゴリ / 楽曲 ID / 言語.md の構造にします(例:songs/kaf/originals/shi/ja.md)。第1階層のアーティストフォルダが記事の正規保存先となり、カテゴリフォルダは関連する全アーティストの一覧で共通して使われます。推奨フォルダは originals(オリジナル曲)、covers(カバー曲)、genealogy(系譜曲)、suites(組曲)、collaborations(コラボ曲)、projects(企画曲)です。独自のフォルダも自動的に新しいカテゴリになります。

最小例:

title: 
artist: 花譜
artistId: kaf
releaseDate: "2018-12-06"
duration: "03:52"

複数アーティストで記事を共有する場合: 同一録音には楽曲フォルダを1つだけ作成します。代表となるアーティストを正規保存先に選び、artistId をパスの第1階層と一致させたうえで、掲載先となる全アーティスト ID を artistIds に記述します。たとえば「古傷」は songs/harusaruhi/collaborations/古傷-furukizu/ だけに保存します。

title: 古傷
artist: 幸祜×春猿火
artistId: harusaruhi
artistIds:
  - harusaruhi
  - koko
code: apple-1678038919

この場合、同じフォルダ内の zh.mdja.mden.md だけを管理すれば、同じ記事が春猿火と幸祜の「コラボ曲」一覧に表示され、どちらからも同じ正規ページへ移動します。songs/koko/ に本文、translationKey、画像情報を複製しないでください。artistIds には必ず artistId を含め、重複させないでください。artistId を先頭に置くことを推奨します。code を使う場合は録音ごとに一意とし、別の楽曲フォルダで再利用しないでください。

表示結果: 楽曲ページにタイトル、アーティスト、公開日、再生時間が表示され、artistIds に記載した各アーティストの楽曲一覧に分類されます。artistIds を省略した場合は artistId の一覧だけに表示されます。

属性必須役割と入力内容
localezh / ja / enはい現在の楽曲記事の言語
translationKey文字列はい同一楽曲の各言語版で共通して使用する識別子
title文字列はい楽曲タイトル
artist文字列はいメインアーティストまたは歌唱者名
artistId小文字英数字 IDはい正規保存先のアーティスト ID(例:kaf)。パスの最初のフォルダと一致させます
artistIds小文字英数字 ID のリストいいえ同じ記事を掲載する全アーティストの一覧。複数アーティスト曲では必須で、artistId を含め、重複させません
composer文字列いいえ作曲者
lyricist文字列いいえ作詞者
album文字列いいえ収録アルバム
duration文字列いいえ楽曲の長さ。03:45 形式を推奨しますが、Schemaでは検証されません
releaseDate文字列いいえリリース日。YYYY-MM-DD 形式を推奨します
code文字列いいえ録音固有の番号、資料番号、または内部コード。別の楽曲フォルダで重複させません
categoryTitle文字列いいえ所属カテゴリーのタイトル
categorySubtitle文字列いいえ所属カテゴリーのサブタイトル
categoryOrder数値いいえカテゴリー間の並び順
itemOrder数値いいえ所属カテゴリー内での楽曲の並び順
image文字列いいえ楽曲画像、シングルジャケット、またはアルバムジャケットへのパス
seo共通SEOオブジェクトいいえ検索エンジンおよび共有用情報

アルバム部分

最小例:

title: 観測α
artist: 花譜
type: Album
releaseDate: "2019-09-11"
tracks:
  - number: 1
    title: 
    songId: kaf/originals/shi

表示結果: アルバム情報と収録曲一覧が生成され、songId のある曲は本サイトの楽曲ページへ移動できます。

属性必須役割と入力内容
localezh / ja / enはい現在のアルバム記事の言語
translationKey文字列はい同一アルバムの各言語版で共通して使用する識別子
title文字列はいアルバムタイトル
romanizedTitle文字列いいえローマ字、ラテン文字、または国際表示用のタイトル
artist文字列はいメインアーティスト
type文字列いいえAlbumEPMini Album などの作品種別
description文字列いいえ詳細ページの見出し付近に表示する短い説明
releaseDate文字列いいえリリース日。YYYY-MM-DD 形式を推奨します
label文字列いいえリリースレーベル
catalogNumber文字列いいえ規格品番またはカタログ番号
trackCount数値いいえ総曲数
duration文字列いいえアルバムの総時間
code文字列いいえ一覧番号、資料番号、または内部コード
categoryTitle文字列いいえ所属カテゴリーのタイトル
categorySubtitle文字列いいえ所属カテゴリーのサブタイトル
categoryOrder数値いいえカテゴリー間の並び順
itemOrder数値いいえ所属カテゴリー内でのアルバムの並び順
image文字列いいえアルバムジャケットへのパスまたは URL
officialLinksオブジェクト配列いいえ公式ページ、購入、配信リンク。各項目に labelhref を指定します
tracksオブジェクト配列いいえ収録曲一覧。各項目の title は必須で、discnumberartistdurationsongId も指定できます
tracks[].songId文字列いいえ本サイト内の楽曲記事へのパス。例:kaf/originals/shi
theme共通テーマオブジェクトいいえアルバム詳細ページの配色
seo共通SEOオブジェクトいいえ検索エンジンおよび共有用情報

楽曲・アルバム補完基準

補完作業には、個別にレビューできる2段階の完成度があります。

  • カタログ掲載可能: パス、必須メタデータ、公式出典、ローカルの高解像度画像、公式リンク、最小限の本文が信頼できる状態です。曲目リンク、歌詞、長文の3言語化が未完成でも、不足範囲を明示すれば受け入れられます。
  • 完成記事: 確認済み曲目、サイト内楽曲リンク、本文、利用可能な歌詞資料、3言語を補います。不明な項目を埋めることは完成ではありません。
ディレクトリのコード構文
songs/<artistId>/<category>/<songId>/<locale>.md
albums/<artistId>/<albumId>/<locale>.md
書き方

楽曲はアーティスト、次に曲種で分類します。アルバムはアーティストとアルバム ID のみで整理し、アーティスト分類 UI をアルバムのフォルダに重複させません。artistIdsongIdalbumId は安定した小文字 slug を使い、3言語で同じ translationKey を共有します。

実例
src/content/songs/kaf/originals/shi/
├── zh.md
├── ja.md
└── en.md

src/content/albums/kaf/kansoku-alpha/
├── zh.md
├── ja.md
└── en.md
楽曲記事の受け入れ基準
  • パスの artistId、カテゴリ、songId がメタデータと一致する。該当する場合は originalscoversgenealogysuitescollaborationsprojects を再利用する。
  • 曲名、日付、クレジットは公式サイト、公式投稿の説明欄、正規リリースページ、信頼できるインタビューで確認する。AI 出力は出典ではない。
  • categoryOrderitemOrder は既存項目と衝突せず、公開順またはサイト内順序を安定させる。
  • image はリポジトリ内の実在する画像を参照し、期限付き URL、検索サムネイル、仮画像、不要な複製を使わない。
  • @[bilibili](BV...) など管理されたメディア構文を使い、生の <iframe>、自動再生、非公式再投稿を追加しない。
  • 本文で作品の概要と追跡可能な出典を示す。歌詞は任意。追加する場合は原文・翻訳・ローマ字を区別し、歌詞コントロールを再利用し、出典と著作権範囲を確認する。
  • zh.mdja.mden.md の同時追加を優先する。不足する翻訳や事実は PR に列挙し、架空の文章や仮文で埋めない。
アルバム記事の受け入れ基準
  • カタログ掲載可能の最低条件: 作品名、アーティスト、種類、確認済みリリース情報、公式ジャケット、少なくとも1件の公式または正規配信リンク、3言語共通の translationKey、出典に基づく短い本文。
  • Apple Music などの正規サービスまたは公式商品ページから取得できる最高品質のジャケットを優先する。可能なら正方形で 1500 × 1500 以上とし、検索サムネイル、スクリーンショット、仮画像、人工的な拡大画像を使わない。
  • ジャケットは public/images/albums/<artistId>/<albumId>.jpg に保存し、frontmatter では /images/albums/<artistId>/<albumId>.jpg を参照する。第三者画像 URL に依存しない。
  • trackCount は確認済み総曲数と一致させる。tracks を記載する場合はディスク番号、順序、曲名、アーティスト、時間を公式曲目表と照合する。
  • tracks[].songId はリンク先の楽曲記事が存在するときだけ追加する。未作成曲は title のみで保持し、壊れたリンクを作らない。
  • 通常盤、再発盤、リミックス盤、ライブ盤は公式に別リリースの場合のみ分け、別版の日付や曲目を混在させない。
  • 曲目や本文が不完全なら記事と PR の両方で範囲を示す。架空データで埋めず、完全収録と誤認させない。
  • 構造メタデータ、曲順、画像、リンクは3言語で揃え、表示名と本文だけを自然に翻訳する。
本文のコード構文
## 作品について

作品の位置づけ、リリース背景、確認済みの制作情報を説明します。

## 公式視聴

@[bilibili](BVxxxxxxxxxx)

## 補完状況

基本情報と公式リンクは完了済みです。曲目リンクは対応する楽曲記事の作成後に追加します。

## 出典

- [公式作品ページ](https://example.com/official)
- [Apple Music](https://music.apple.com/example)
書き方

出典が支える内容だけを断定します。補完状況では、何が完了し何が不足しているかをレビュー担当者と次の編集者に伝え、計画や推測を百科事実として書きません。

実例

現在の参考として src/content/songs/kaf/src/content/albums/kaf/public/images/albums/kaf/ を確認してください。提出前に次を実行します。

pnpm check
pnpm test
pnpm build

チェック通過は技術上の最低条件であり、出典、曲順、リンク、画像品質のレビューを代替しません。

高度な使い方:対応する生 HTML

通常は短縮構文が簡単ですが、旧記事の保守や細かなマークアップのため、従来の安全な HTML 形式も引き続き利用できます。HTML は前述のホワイトリスト内に限定され、styleonmouseoveronclickscript、生の iframe はサニタイザーによって削除されます。

HTML Ruby ルビ

記述例:

<ruby>局部壊死<rt>きょくぶえし</rt></ruby>
<ruby>観<rt>かん</rt>測<rt>そく</rt>所<rt>じょ</rt></ruby>

表示例:

局部壊死きょくぶえしかんそくじょ

HTML 伏せ字

インラインスタイルやマウスイベント属性に依存した旧形式は利用できません。安全な生 HTML では、サイト定義の wiki-spoiler クラスを使用します。

記述例:

<span class="wiki-spoiler" tabindex="0">初期状態では隠れる文字</span>

表示例:

初期状態では隠れる文字

HTML 折りたたみ

記述例:

<details>
  <summary>全曲リストを表示</summary>
  <p>この補足内容は初期状態では閉じています。</p>
</details>

表示例:

全曲リストを表示

この補足内容は初期状態では閉じています。

HTML の意味要素と改行

記述例:

<mark>重要</mark>
<abbr title="Virtual Witch Phenomenon">V.W.P</abbr>
<kbd>Ctrl+K</kbd> を押す<br>
H<sub>2</sub>O と x<sup>2</sup>

表示例:

重要V.W.PCtrl+K を押す
H2O と x2

生 HTML はホワイトリスト内の静的マークアップ専用です。メディアには @[provider](...)、歌詞操作には {{lyrics-controls::ja}} を使い、操作機能はサイトコードで一元管理してください。