create-riebeckite 0.0.26 → 0.0.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/index.js +2047 -2041
- package/dist/src/scaffold/content-pages.d.ts +1 -1
- package/dist/src/scaffold/deployment.d.ts +1 -1
- package/dist/src/scaffold/index.js +2161 -2155
- package/dist/src/scaffold/readme.d.ts +3 -0
- package/dist/src/scaffold/readme_demos.d.ts +27 -0
- package/dist/src/scaffold/template-loader.d.ts +1 -1
- package/dist/src/scaffold/template_options.d.ts +13 -0
- package/dist/src/scaffold/template_types.d.ts +17 -0
- package/dist/src/scaffold/templates.d.ts +5 -52
- package/dist/src/scaffold/utilities.d.ts +1 -1
- package/dist/src/scaffold/version.d.ts +1 -1
- package/dist/src/scaffold/wrangler-defaults.d.ts +0 -4
- package/package.json +2 -2
- package/templates/scaffold/deployment/github-actions/deploy.yml +25 -4
- package/templates/scaffold/presets/empty/app/style.css +1 -11
- package/templates/scaffold/presets/minimal/app/style.css +0 -11
- package/templates/scaffold/presets/showcase/app/components/site-header.tsx +6 -5
- package/templates/scaffold/presets/showcase/app/style.css +20 -91
- package/templates/scaffold/presets/starter/app/components/site-header.tsx +6 -5
- package/templates/scaffold/presets/starter/app/style.css +20 -91
package/dist/src/index.js
CHANGED
|
@@ -1188,2170 +1188,2053 @@ function spawnCommand(command, args, cwd) {
|
|
|
1188
1188
|
import fs2 from "node:fs/promises";
|
|
1189
1189
|
import path3 from "node:path";
|
|
1190
1190
|
|
|
1191
|
-
// src/scaffold/
|
|
1192
|
-
var
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1191
|
+
// src/scaffold/readme_demos.ts
|
|
1192
|
+
var README_DEMOS = {
|
|
1193
|
+
"@riebeckite/plugin-obsidian-markdown/callout": {
|
|
1194
|
+
title: { en: "Callouts", ja: "コールアウト" },
|
|
1195
|
+
intro: {
|
|
1196
|
+
en: "A block quote with a `[!type]` marker becomes a styled callout panel.",
|
|
1197
|
+
ja: "`[!type]` マーカー付きブロック引用をスタイル付きパネルに変換します。"
|
|
1198
|
+
},
|
|
1199
|
+
markdown: [
|
|
1200
|
+
"> [!tip] Try it",
|
|
1201
|
+
"> A callout is a block quote with a `[!type]` marker. `[!info]`,",
|
|
1202
|
+
"> `[!warning]`, and `[!question]` render the same way."
|
|
1203
|
+
].join("\n")
|
|
1203
1204
|
},
|
|
1204
|
-
"@riebeckite/plugin-
|
|
1205
|
-
|
|
1205
|
+
"@riebeckite/plugin-obsidian-markdown/wikilinks": {
|
|
1206
|
+
title: { en: "Wikilinks and embeds", ja: "ウィキリンクと埋め込み" },
|
|
1207
|
+
intro: {
|
|
1208
|
+
en: "`[[...]]` links and `![[...]]` embeds resolve to real permalinks from the content manifest.",
|
|
1209
|
+
ja: "`[[...]]` リンクと `![[...]]` 埋め込みは、コンテンツマニフェストから実際のパーマリンクへ解決されます。"
|
|
1210
|
+
},
|
|
1211
|
+
markdown: "Read the [[guide]] and [[index]] pages. `![[index]]` embeds the note inline."
|
|
1212
|
+
},
|
|
1213
|
+
"@riebeckite/plugin-code-enhance": {
|
|
1214
|
+
title: { en: "Code with a toolbar", ja: "ツールバー付きコード" },
|
|
1215
|
+
intro: {
|
|
1216
|
+
en: "Code fences get line numbers, a filename bar, line highlighting, and a copy button.",
|
|
1217
|
+
ja: "コードフェンスに行番号・ファイル名バー・行ハイライト・コピーボタンが付きます。"
|
|
1218
|
+
},
|
|
1206
1219
|
markdown: fence(
|
|
1207
|
-
"
|
|
1220
|
+
"ts",
|
|
1208
1221
|
[
|
|
1209
|
-
"
|
|
1210
|
-
"
|
|
1211
|
-
"
|
|
1222
|
+
"// Syntax highlighting, line numbers, and a copy button",
|
|
1223
|
+
"export function hello(name: string): string {",
|
|
1224
|
+
' return "Hello, " + name + "!";',
|
|
1225
|
+
"}"
|
|
1212
1226
|
].join("\n")
|
|
1213
1227
|
)
|
|
1214
1228
|
},
|
|
1215
|
-
"@riebeckite/plugin-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
"
|
|
1219
|
-
"
|
|
1220
|
-
|
|
1221
|
-
"image: /ogp/page.png",
|
|
1222
|
-
"date: 2026-09-30",
|
|
1223
|
-
"publish: true",
|
|
1224
|
-
"---",
|
|
1225
|
-
"",
|
|
1226
|
-
"# Search-friendly title"
|
|
1227
|
-
].join("\n")
|
|
1228
|
-
},
|
|
1229
|
-
"@riebeckite/plugin-toc": {
|
|
1230
|
-
summary: "Builds a table of contents from Markdown headings.",
|
|
1231
|
-
markdown: [
|
|
1232
|
-
"# Page",
|
|
1233
|
-
"",
|
|
1234
|
-
"## First section",
|
|
1235
|
-
"",
|
|
1236
|
-
"### Nested section",
|
|
1237
|
-
"",
|
|
1238
|
-
"## Second section"
|
|
1239
|
-
].join("\n")
|
|
1240
|
-
},
|
|
1241
|
-
"@riebeckite/plugin-properties": {
|
|
1242
|
-
summary: "Renders selected frontmatter properties in the article metadata slot.",
|
|
1229
|
+
"@riebeckite/plugin-code-tabs": {
|
|
1230
|
+
title: { en: "Code tabs", ja: "タブ切り替えコード" },
|
|
1231
|
+
intro: {
|
|
1232
|
+
en: 'Adjacent `tab="..."` fences become one tabbed group; `syncTabs: true` keeps the same label in sync across groups.',
|
|
1233
|
+
ja: '隣り合う `tab="..."` フェンスがタブグループになります。`syncTabs: true` でページ内の同じラベルを同期できます。'
|
|
1234
|
+
},
|
|
1243
1235
|
markdown: [
|
|
1244
|
-
"
|
|
1245
|
-
"
|
|
1246
|
-
"modified: 2026-09-30",
|
|
1247
|
-
"tags: [riebeckite, demo]",
|
|
1248
|
-
"status: active",
|
|
1249
|
-
"---"
|
|
1236
|
+
fence('ts tab="React"', 'const greeting = "Hello from React";'),
|
|
1237
|
+
fence('js tab="Vanilla"', 'console.log("Hello from JavaScript");')
|
|
1250
1238
|
].join("\n")
|
|
1251
1239
|
},
|
|
1252
|
-
"@riebeckite/plugin-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
"
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
"
|
|
1260
|
-
|
|
1240
|
+
"@riebeckite/plugin-mermaid": {
|
|
1241
|
+
title: { en: "Mermaid", ja: "Mermaid" },
|
|
1242
|
+
intro: {
|
|
1243
|
+
en: "A `mermaid` fence becomes a rendered diagram at build time.",
|
|
1244
|
+
ja: "`mermaid` フェンスはビルド時にレンダリングされた図になります。"
|
|
1245
|
+
},
|
|
1246
|
+
markdown: fence(
|
|
1247
|
+
"mermaid",
|
|
1248
|
+
[
|
|
1249
|
+
"flowchart LR",
|
|
1250
|
+
" A[Note] --> B{Published?}",
|
|
1251
|
+
" B -->|yes| C[Site]",
|
|
1252
|
+
" B -->|no| D[Draft]"
|
|
1253
|
+
].join("\n")
|
|
1254
|
+
)
|
|
1261
1255
|
},
|
|
1262
|
-
"@riebeckite/plugin-
|
|
1263
|
-
|
|
1264
|
-
|
|
1256
|
+
"@riebeckite/plugin-d2": {
|
|
1257
|
+
title: { en: "D2", ja: "D2" },
|
|
1258
|
+
intro: {
|
|
1259
|
+
en: "A `d2` fence is compiled into an SVG diagram.",
|
|
1260
|
+
ja: "`d2` フェンスが SVG 図にコンパイルされます。"
|
|
1261
|
+
},
|
|
1262
|
+
markdown: fence("d2", "site: Riebeckite\n content -> build -> deploy")
|
|
1265
1263
|
},
|
|
1266
|
-
"@riebeckite/plugin-
|
|
1267
|
-
|
|
1268
|
-
|
|
1264
|
+
"@riebeckite/plugin-graphviz": {
|
|
1265
|
+
title: { en: "Graphviz / DOT", ja: "Graphviz / DOT" },
|
|
1266
|
+
intro: {
|
|
1267
|
+
en: "A `dot` fence is rendered with a configurable engine (here `dot`).",
|
|
1268
|
+
ja: "`dot` フェンスが指定のエンジン(ここでは `dot`)でレンダリングされます。"
|
|
1269
|
+
},
|
|
1270
|
+
markdown: fence(
|
|
1271
|
+
"dot",
|
|
1272
|
+
"digraph G {\n notes -> pages;\n pages -> html;\n}"
|
|
1273
|
+
)
|
|
1269
1274
|
},
|
|
1270
|
-
"@riebeckite/plugin-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
"
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
"
|
|
1278
|
-
|
|
1275
|
+
"@riebeckite/plugin-chartjs": {
|
|
1276
|
+
title: { en: "Chart.js", ja: "Chart.js" },
|
|
1277
|
+
intro: {
|
|
1278
|
+
en: "A `chart` JSON fence renders with Chart.js; a caption comes from the block `title`.",
|
|
1279
|
+
ja: "`chart` JSON フェンスが Chart.js で描画されます。キャプションはブロックの `title` から取られます。"
|
|
1280
|
+
},
|
|
1281
|
+
markdown: fence(
|
|
1282
|
+
"chart",
|
|
1283
|
+
`{
|
|
1284
|
+
"type": "bar",
|
|
1285
|
+
"data": {
|
|
1286
|
+
"labels": ["Mon", "Tue", "Wed"],
|
|
1287
|
+
"datasets": [{ "label": "Visits", "data": [12, 19, 8] }]
|
|
1288
|
+
}
|
|
1289
|
+
}`
|
|
1290
|
+
)
|
|
1279
1291
|
},
|
|
1280
|
-
"@riebeckite/plugin-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
"
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
"
|
|
1288
|
-
|
|
1292
|
+
"@riebeckite/plugin-vega-lite": {
|
|
1293
|
+
title: { en: "Vega-Lite", ja: "Vega-Lite" },
|
|
1294
|
+
intro: {
|
|
1295
|
+
en: "A `vega-lite` JSON specification becomes a Vega chart.",
|
|
1296
|
+
ja: "`vega-lite` の JSON 仕様が Vega チャートになります。"
|
|
1297
|
+
},
|
|
1298
|
+
markdown: fence(
|
|
1299
|
+
"vega-lite",
|
|
1300
|
+
`{
|
|
1301
|
+
"title": "Revenue",
|
|
1302
|
+
"data": {
|
|
1303
|
+
"values": [
|
|
1304
|
+
{ "category": "A", "value": 28 },
|
|
1305
|
+
{ "category": "B", "value": 55 }
|
|
1306
|
+
]
|
|
1289
1307
|
},
|
|
1290
|
-
"
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
].join("\n")
|
|
1308
|
+
"mark": "bar",
|
|
1309
|
+
"encoding": {
|
|
1310
|
+
"x": { "field": "category", "type": "nominal" },
|
|
1311
|
+
"y": { "field": "value", "type": "quantitative" }
|
|
1312
|
+
}
|
|
1313
|
+
}`
|
|
1314
|
+
)
|
|
1298
1315
|
},
|
|
1299
|
-
"@riebeckite/plugin-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
"
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1316
|
+
"@riebeckite/plugin-wavedrom": {
|
|
1317
|
+
title: { en: "WaveDrom", ja: "WaveDrom" },
|
|
1318
|
+
intro: {
|
|
1319
|
+
en: "A `wavedrom` JSON fence becomes a digital timing diagram.",
|
|
1320
|
+
ja: "`wavedrom` JSON フェンスがデジタルタイミング図になります。"
|
|
1321
|
+
},
|
|
1322
|
+
markdown: fence(
|
|
1323
|
+
"wavedrom",
|
|
1324
|
+
`{
|
|
1325
|
+
"signal": [
|
|
1326
|
+
{ "name": "clk", "wave": "p......" },
|
|
1327
|
+
{ "name": "bus", "wave": "x.34.5x", "data": "head body tail" }
|
|
1328
|
+
]
|
|
1329
|
+
}`
|
|
1330
|
+
)
|
|
1307
1331
|
},
|
|
1308
|
-
"@riebeckite/plugin-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
"
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
"
|
|
1316
|
-
|
|
1332
|
+
"@riebeckite/plugin-markmap": {
|
|
1333
|
+
title: { en: "Markmap", ja: "Markmap" },
|
|
1334
|
+
intro: {
|
|
1335
|
+
en: "A `markmap` fence turns its heading outline into an interactive mind map.",
|
|
1336
|
+
ja: "`markmap` フェンスの見出し構成がインタラクティブなマインドマップになります。"
|
|
1337
|
+
},
|
|
1338
|
+
markdown: fence(
|
|
1339
|
+
"markmap",
|
|
1340
|
+
[
|
|
1341
|
+
"# Project",
|
|
1342
|
+
"",
|
|
1343
|
+
"## Design",
|
|
1344
|
+
"",
|
|
1345
|
+
"### Notation",
|
|
1346
|
+
"### Rendering",
|
|
1347
|
+
"",
|
|
1348
|
+
"## Delivery"
|
|
1349
|
+
].join("\n")
|
|
1350
|
+
)
|
|
1317
1351
|
},
|
|
1318
|
-
"@riebeckite/plugin-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
markdown:
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
"@riebeckite/plugin-lightbox": {
|
|
1335
|
-
summary: "Makes image links open in a lightbox when the configured trigger class is present.",
|
|
1336
|
-
markdown: "[](./images/photo.jpg){.rr-lightbox-trigger}"
|
|
1337
|
-
},
|
|
1338
|
-
"@riebeckite/plugin-highlight": {
|
|
1339
|
-
summary: "Highlights marked inline text.",
|
|
1340
|
-
markdown: "This sentence contains ==highlighted text== inside normal Markdown."
|
|
1341
|
-
},
|
|
1342
|
-
"@riebeckite/plugin-code-annotations": {
|
|
1343
|
-
summary: "Renders code diffs with syntax highlighting for the target language.",
|
|
1344
|
-
markdown: [
|
|
1345
|
-
"```diff ts",
|
|
1346
|
-
"+ const answer = 42",
|
|
1347
|
-
"- const answer = 0",
|
|
1348
|
-
"console.log(answer)",
|
|
1349
|
-
"```"
|
|
1350
|
-
].join("\n")
|
|
1351
|
-
},
|
|
1352
|
-
"@riebeckite/plugin-shortcodes": {
|
|
1353
|
-
summary: "Expands built-in shortcode syntax inside Markdown.",
|
|
1354
|
-
markdown: '::youtube[id=dQw4w9WgXcQ]\n\n::figure[Demo image]{src="/images/demo.png"}'
|
|
1355
|
-
},
|
|
1356
|
-
"@riebeckite/plugin-series": {
|
|
1357
|
-
summary: "Groups Markdown pages into a reading series using frontmatter.",
|
|
1358
|
-
markdown: [
|
|
1359
|
-
"---",
|
|
1360
|
-
"series: riebeckite-guide",
|
|
1361
|
-
"series_title: Riebeckite Guide",
|
|
1362
|
-
"series_order: 2",
|
|
1363
|
-
"---"
|
|
1364
|
-
].join("\n")
|
|
1365
|
-
},
|
|
1366
|
-
"@riebeckite/plugin-taxonomy": {
|
|
1367
|
-
summary: "Builds tag/folder taxonomy pages from Markdown metadata and content location.",
|
|
1368
|
-
markdown: ["---", "tags: [design, notes]", "---", "", "# Tagged note"].join(
|
|
1369
|
-
"\n"
|
|
1352
|
+
"@riebeckite/plugin-map": {
|
|
1353
|
+
title: { en: "Maps", ja: "地図" },
|
|
1354
|
+
intro: {
|
|
1355
|
+
en: "A `map` fence embeds an OpenStreetMap: a static fallback (coordinates and links) first, upgraded to an interactive map when JavaScript is available.",
|
|
1356
|
+
ja: "`map` フェンスが OpenStreetMap を埋め込みます。まず静的なフォールバック(座標とリンク)を表示し、JavaScript がある場合はインタラクティブな地図に拡張します。"
|
|
1357
|
+
},
|
|
1358
|
+
markdown: fence(
|
|
1359
|
+
"map",
|
|
1360
|
+
[
|
|
1361
|
+
"center: 35.6812, 139.7671",
|
|
1362
|
+
"zoom: 13",
|
|
1363
|
+
"label: Tokyo Station",
|
|
1364
|
+
"markers:",
|
|
1365
|
+
" - 35.6812, 139.7671 | Tokyo Station",
|
|
1366
|
+
" - 35.6586, 139.7454 | Tokyo Tower"
|
|
1367
|
+
].join("\n")
|
|
1370
1368
|
)
|
|
1371
1369
|
},
|
|
1372
|
-
"@riebeckite/plugin-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1370
|
+
"@riebeckite/plugin-marp": {
|
|
1371
|
+
title: { en: "Marp slides", ja: "Marp スライド" },
|
|
1372
|
+
intro: {
|
|
1373
|
+
en: "A `marp` fence renders slides, separated by `---`.",
|
|
1374
|
+
ja: "`marp` フェンスがスライドとして描画されます。スライドは `---` で区切ります。"
|
|
1375
|
+
},
|
|
1378
1376
|
markdown: fence(
|
|
1379
|
-
"
|
|
1380
|
-
["
|
|
1377
|
+
'marp title="Intro deck"',
|
|
1378
|
+
["# First slide", "", "- a bullet", "", "---", "", "# Second slide"].join(
|
|
1381
1379
|
"\n"
|
|
1382
1380
|
)
|
|
1383
1381
|
)
|
|
1384
1382
|
},
|
|
1385
|
-
"@riebeckite/plugin-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
"
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
"---"
|
|
1393
|
-
].join("\n")
|
|
1394
|
-
},
|
|
1395
|
-
"@riebeckite/plugin-excalidraw": {
|
|
1396
|
-
summary: "Embeds Excalidraw drawings referenced from Markdown.",
|
|
1397
|
-
markdown: "![[Architecture.excalidraw]]\n\n"
|
|
1398
|
-
},
|
|
1399
|
-
"@riebeckite/plugin-excalibrain": {
|
|
1400
|
-
summary: "Builds an Excalibrain-style local graph from links, tags, headings, and inferred relationships.",
|
|
1401
|
-
markdown: "# Concept\n\nLinks to [[Parent idea]], [[Sibling idea]], and [[Related idea]] become graph relationships."
|
|
1402
|
-
},
|
|
1403
|
-
"@riebeckite/plugin-canvas": {
|
|
1404
|
-
summary: "Embeds Obsidian Canvas JSON as a rendered canvas/fallback.",
|
|
1405
|
-
markdown: '```canvas\n{ "nodes": [], "edges": [] }\n```'
|
|
1406
|
-
},
|
|
1407
|
-
"@riebeckite/plugin-flashcards": {
|
|
1408
|
-
summary: "Turns Q/A style Markdown into flashcards.",
|
|
1409
|
-
markdown: [
|
|
1410
|
-
"# Flashcards",
|
|
1411
|
-
"",
|
|
1412
|
-
"Q: What is Riebeckite?",
|
|
1413
|
-
"A: A content-first static site framework.",
|
|
1414
|
-
"",
|
|
1415
|
-
"---",
|
|
1416
|
-
"",
|
|
1417
|
-
"What does SSG mean?::Static Site Generation"
|
|
1418
|
-
].join("\n")
|
|
1383
|
+
"@riebeckite/plugin-qr-code": {
|
|
1384
|
+
title: { en: "QR codes", ja: "QR コード" },
|
|
1385
|
+
intro: {
|
|
1386
|
+
en: "A `qr` fence becomes an inline SVG QR code, encoded entirely at build time.",
|
|
1387
|
+
ja: "`qr` フェンスがインライン SVG の QR コードになります(ビルド時に全てエンコードされます)。"
|
|
1388
|
+
},
|
|
1389
|
+
markdown: fence("qr", "# caption: Project page\nhttps://example.com/")
|
|
1419
1390
|
},
|
|
1420
|
-
"@riebeckite/plugin-
|
|
1421
|
-
|
|
1422
|
-
|
|
1391
|
+
"@riebeckite/plugin-rich-embed": {
|
|
1392
|
+
title: { en: "Rich embeds", ja: "リッチ埋め込み" },
|
|
1393
|
+
intro: {
|
|
1394
|
+
en: "An `embed` fence turns a URL into a YouTube, Vimeo, Spotify, CodePen, or Gist embed.",
|
|
1395
|
+
ja: "`embed` フェンスの URL が YouTube・Vimeo・Spotify・CodePen・Gist の埋め込みになります。"
|
|
1396
|
+
},
|
|
1397
|
+
markdown: fence(
|
|
1398
|
+
"embed",
|
|
1399
|
+
[
|
|
1400
|
+
"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
|
|
1401
|
+
"title: Demo video",
|
|
1402
|
+
"caption: A short caption",
|
|
1403
|
+
"aspect: 16/9"
|
|
1404
|
+
].join("\n")
|
|
1405
|
+
)
|
|
1423
1406
|
},
|
|
1424
|
-
"@riebeckite/plugin-
|
|
1425
|
-
|
|
1426
|
-
|
|
1407
|
+
"@riebeckite/plugin-gallery": {
|
|
1408
|
+
title: { en: "Gallery cards", ja: "ギャラリーカード" },
|
|
1409
|
+
intro: {
|
|
1410
|
+
en: "A `gallery` YAML fence renders a responsive grid of cards — handy for theme or project showcases.",
|
|
1411
|
+
ja: "`gallery` の YAML フェンスがレスポンシブなカードグリッドを描画します。テーマやプロジェクトの紹介に便利です。"
|
|
1412
|
+
},
|
|
1413
|
+
markdown: fence(
|
|
1414
|
+
"gallery",
|
|
1415
|
+
[
|
|
1416
|
+
"columns: 3",
|
|
1417
|
+
"items:",
|
|
1418
|
+
" - title: Default",
|
|
1419
|
+
" description: A clean, typographic theme.",
|
|
1420
|
+
" meta: v0.0.5",
|
|
1421
|
+
" href: https://riebeckite.dev/docs/themes/default",
|
|
1422
|
+
" - title: Minimal",
|
|
1423
|
+
" description: Stripped back to the essentials.",
|
|
1424
|
+
" meta: v0.0.5",
|
|
1425
|
+
" href: https://riebeckite.dev/docs/themes/minimal",
|
|
1426
|
+
" - title: Gruvbox",
|
|
1427
|
+
" description: A warm, high-contrast palette.",
|
|
1428
|
+
" meta: v0.0.5",
|
|
1429
|
+
" href: https://riebeckite.dev/docs/themes/gruvbox"
|
|
1430
|
+
].join("\n")
|
|
1431
|
+
)
|
|
1427
1432
|
},
|
|
1428
|
-
"@riebeckite/plugin-
|
|
1429
|
-
|
|
1433
|
+
"@riebeckite/plugin-dataview": {
|
|
1434
|
+
title: { en: "Dataview", ja: "Dataview" },
|
|
1435
|
+
intro: {
|
|
1436
|
+
en: "A `dataview` query renders a table of notes from the manifest.",
|
|
1437
|
+
ja: "`dataview` クエリがマニフェストからノート一覧を描画します。"
|
|
1438
|
+
},
|
|
1430
1439
|
markdown: fence(
|
|
1431
|
-
"
|
|
1440
|
+
"dataview",
|
|
1432
1441
|
[
|
|
1433
|
-
"
|
|
1434
|
-
"
|
|
1435
|
-
"
|
|
1436
|
-
"
|
|
1437
|
-
"
|
|
1438
|
-
" plugins.md"
|
|
1442
|
+
'TABLE file.name AS "Name", status',
|
|
1443
|
+
"FROM #project",
|
|
1444
|
+
'WHERE status = "active"',
|
|
1445
|
+
"SORT file.name asc",
|
|
1446
|
+
"LIMIT 10"
|
|
1439
1447
|
].join("\n")
|
|
1440
1448
|
)
|
|
1441
1449
|
},
|
|
1442
|
-
"@riebeckite/plugin-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
"
|
|
1446
|
-
""
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
"
|
|
1450
|
-
|
|
1450
|
+
"@riebeckite/plugin-query": {
|
|
1451
|
+
title: { en: "Query", ja: "Query" },
|
|
1452
|
+
intro: {
|
|
1453
|
+
en: "A `query` fence is YAML that filters and sorts entries from the manifest.",
|
|
1454
|
+
ja: "`query` フェンスの YAML でマニフェストのエントリを絞り込み・並べ替えできます。"
|
|
1455
|
+
},
|
|
1456
|
+
markdown: fence(
|
|
1457
|
+
"query",
|
|
1458
|
+
[
|
|
1459
|
+
"filter:",
|
|
1460
|
+
" tags:",
|
|
1461
|
+
" any: [diary]",
|
|
1462
|
+
"sort:",
|
|
1463
|
+
" field: date",
|
|
1464
|
+
" order: desc",
|
|
1465
|
+
"limit: 5"
|
|
1466
|
+
].join("\n")
|
|
1467
|
+
)
|
|
1451
1468
|
},
|
|
1452
|
-
"@riebeckite/plugin-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
"
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
"
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1469
|
+
"@riebeckite/plugin-bases": {
|
|
1470
|
+
title: { en: "Base views", ja: "Base ビュー" },
|
|
1471
|
+
intro: {
|
|
1472
|
+
en: "A `base` YAML fence renders a Base table view.",
|
|
1473
|
+
ja: "`base` YAML フェンスが Base のテーブルビューを描画します。"
|
|
1474
|
+
},
|
|
1475
|
+
markdown: fence(
|
|
1476
|
+
"base",
|
|
1477
|
+
[
|
|
1478
|
+
"filters:",
|
|
1479
|
+
" and:",
|
|
1480
|
+
' - file.hasTag("featured")',
|
|
1481
|
+
"properties:",
|
|
1482
|
+
" file.name:",
|
|
1483
|
+
" displayName: Title",
|
|
1484
|
+
"views:",
|
|
1485
|
+
" - type: table",
|
|
1486
|
+
" name: Featured",
|
|
1487
|
+
" limit: 10"
|
|
1488
|
+
].join("\n")
|
|
1489
|
+
)
|
|
1463
1490
|
},
|
|
1464
|
-
"@riebeckite/plugin-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
"
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
"
|
|
1491
|
+
"@riebeckite/plugin-kanban": {
|
|
1492
|
+
title: { en: "Kanban boards", ja: "カンバンボード" },
|
|
1493
|
+
intro: {
|
|
1494
|
+
en: "A note whose body is `##` columns of task lists becomes a board; `#tags` and `[[wikilinks]]` work inside cards.",
|
|
1495
|
+
ja: "本文が `##` 列とタスクリストでできたノートはボードになります。カード内では `#タグ` や `[[ウィキリンク]]` も使えます。"
|
|
1496
|
+
},
|
|
1497
|
+
markdown: fence(
|
|
1498
|
+
"md",
|
|
1499
|
+
[
|
|
1500
|
+
"## Backlog",
|
|
1501
|
+
"",
|
|
1502
|
+
"- [ ] Draft the release notes",
|
|
1503
|
+
"- [ ] Link to [[index]]",
|
|
1504
|
+
"",
|
|
1505
|
+
"## Done",
|
|
1506
|
+
"",
|
|
1507
|
+
"- [x] Publish the fixture"
|
|
1508
|
+
].join("\n")
|
|
1509
|
+
)
|
|
1510
|
+
}
|
|
1511
|
+
};
|
|
1512
|
+
var ENGLISH_ONLY_PAGES = /* @__PURE__ */ new Set([
|
|
1513
|
+
"guide",
|
|
1514
|
+
"reference/plugins",
|
|
1515
|
+
"reference/themes"
|
|
1516
|
+
]);
|
|
1517
|
+
function fence(language, body) {
|
|
1518
|
+
const tick = "```";
|
|
1519
|
+
return `${tick}${language}
|
|
1520
|
+
${body}
|
|
1521
|
+
${tick}`;
|
|
1522
|
+
}
|
|
1523
|
+
function hasPlugin(preset, packageName) {
|
|
1524
|
+
return preset.plugins.some((plugin) => plugin.package === packageName);
|
|
1525
|
+
}
|
|
1526
|
+
function demoPackage(key) {
|
|
1527
|
+
return key.split("/", 2).join("/");
|
|
1528
|
+
}
|
|
1529
|
+
var README_DEMO_ORDER = [
|
|
1530
|
+
"@riebeckite/plugin-obsidian-markdown/callout",
|
|
1531
|
+
"@riebeckite/plugin-obsidian-markdown/wikilinks",
|
|
1532
|
+
"@riebeckite/plugin-code-enhance",
|
|
1533
|
+
"@riebeckite/plugin-code-tabs",
|
|
1534
|
+
"@riebeckite/plugin-mermaid",
|
|
1535
|
+
"@riebeckite/plugin-d2",
|
|
1536
|
+
"@riebeckite/plugin-graphviz",
|
|
1537
|
+
"@riebeckite/plugin-chartjs",
|
|
1538
|
+
"@riebeckite/plugin-vega-lite",
|
|
1539
|
+
"@riebeckite/plugin-wavedrom",
|
|
1540
|
+
"@riebeckite/plugin-markmap",
|
|
1541
|
+
"@riebeckite/plugin-map",
|
|
1542
|
+
"@riebeckite/plugin-marp",
|
|
1543
|
+
"@riebeckite/plugin-qr-code",
|
|
1544
|
+
"@riebeckite/plugin-rich-embed",
|
|
1545
|
+
"@riebeckite/plugin-gallery",
|
|
1546
|
+
"@riebeckite/plugin-dataview",
|
|
1547
|
+
"@riebeckite/plugin-query",
|
|
1548
|
+
"@riebeckite/plugin-bases",
|
|
1549
|
+
"@riebeckite/plugin-kanban"
|
|
1550
|
+
];
|
|
1551
|
+
|
|
1552
|
+
// src/scaffold/template_options.ts
|
|
1553
|
+
var OPTION_DEPTH = {
|
|
1554
|
+
empty: 0,
|
|
1555
|
+
minimal: 0,
|
|
1556
|
+
starter: 2,
|
|
1557
|
+
showcase: 3
|
|
1558
|
+
};
|
|
1559
|
+
function optionContext(preset, variables) {
|
|
1560
|
+
return {
|
|
1561
|
+
variables,
|
|
1562
|
+
languages: preset.languages,
|
|
1563
|
+
depth: OPTION_DEPTH[preset.name]
|
|
1564
|
+
};
|
|
1565
|
+
}
|
|
1566
|
+
function renderOptionValue(value, context) {
|
|
1567
|
+
return typeof value === "function" ? value(context) : value;
|
|
1568
|
+
}
|
|
1569
|
+
function renderOptions(options, context) {
|
|
1570
|
+
if (options === void 0) return null;
|
|
1571
|
+
if (typeof options === "string") return options;
|
|
1572
|
+
if (typeof options === "function") return options(context);
|
|
1573
|
+
const fields = Object.entries(options).filter(([, field]) => field.depth <= context.depth).map(
|
|
1574
|
+
([key, field]) => `${key}: ${renderOptionValue(field.value, context)}`
|
|
1575
|
+
);
|
|
1576
|
+
return fields.length === 0 ? null : `{ ${fields.join(", ")} }`;
|
|
1577
|
+
}
|
|
1578
|
+
function pluginExpression(plugin, preset, variables) {
|
|
1579
|
+
const options = renderOptions(
|
|
1580
|
+
plugin.options,
|
|
1581
|
+
optionContext(preset, variables)
|
|
1582
|
+
);
|
|
1583
|
+
return options === null ? `${plugin.factory}()` : `${plugin.factory}(${options})`;
|
|
1584
|
+
}
|
|
1585
|
+
function readmePluginOptions(variables, preset, plugin) {
|
|
1586
|
+
return renderOptions(plugin.options, optionContext(preset, variables));
|
|
1587
|
+
}
|
|
1588
|
+
|
|
1589
|
+
// src/scaffold/content-pages.ts
|
|
1590
|
+
var HELPERS = {
|
|
1591
|
+
en: "https://github.com/Rerurate514/riebeckite/blob/main/docs/README.md",
|
|
1592
|
+
ja: "https://github.com/Rerurate514/riebeckite/blob/main/docs/README.ja.md"
|
|
1593
|
+
};
|
|
1594
|
+
var PLUGIN_INDEX_URL = "https://github.com/Rerurate514/riebeckite/tree/main/packages/plugins";
|
|
1595
|
+
var THEMES_INDEX_URL = "https://github.com/Rerurate514/riebeckite/tree/main/packages/themes";
|
|
1596
|
+
var GALLERY_PACKAGE = "@riebeckite/plugin-gallery";
|
|
1597
|
+
var PLUGIN_MARKDOWN_GUIDES = {
|
|
1598
|
+
"@riebeckite/plugin-color-mode": {
|
|
1599
|
+
summary: "Adds the light/dark/system color-mode control to the app shell. Markdown does not need special syntax; every page inherits the toggle.",
|
|
1600
|
+
markdown: "Write any page normally. Use the color-mode control in the header to see the same Markdown under light and dark tokens."
|
|
1601
|
+
},
|
|
1602
|
+
"@riebeckite/plugin-l10n": {
|
|
1603
|
+
summary: "Routes translated Markdown files by language suffix and keeps the default-language file unsuffixed.",
|
|
1604
|
+
markdown: fence(
|
|
1605
|
+
"text",
|
|
1606
|
+
[
|
|
1607
|
+
"content/about.md # default language",
|
|
1608
|
+
"content/about.ja.md # Japanese version served under /ja/about/",
|
|
1609
|
+
"content/about.fr.md # French version served under /fr/about/"
|
|
1610
|
+
].join("\n")
|
|
1611
|
+
)
|
|
1612
|
+
},
|
|
1613
|
+
"@riebeckite/plugin-seo": {
|
|
1614
|
+
summary: "Turns Markdown frontmatter and site config into metadata, feeds, sitemap, and robots output.",
|
|
1615
|
+
markdown: [
|
|
1616
|
+
"---",
|
|
1617
|
+
"title: Search-friendly title",
|
|
1618
|
+
"description: Page-specific summary used for meta tags and cards.",
|
|
1619
|
+
"image: /ogp/page.png",
|
|
1620
|
+
"date: 2026-09-30",
|
|
1621
|
+
"publish: true",
|
|
1622
|
+
"---",
|
|
1623
|
+
"",
|
|
1624
|
+
"# Search-friendly title"
|
|
1472
1625
|
].join("\n")
|
|
1473
1626
|
},
|
|
1474
|
-
"@riebeckite/plugin-
|
|
1475
|
-
summary: "
|
|
1476
|
-
markdown:
|
|
1627
|
+
"@riebeckite/plugin-toc": {
|
|
1628
|
+
summary: "Builds a table of contents from Markdown headings.",
|
|
1629
|
+
markdown: [
|
|
1630
|
+
"# Page",
|
|
1631
|
+
"",
|
|
1632
|
+
"## First section",
|
|
1633
|
+
"",
|
|
1634
|
+
"### Nested section",
|
|
1635
|
+
"",
|
|
1636
|
+
"## Second section"
|
|
1637
|
+
].join("\n")
|
|
1477
1638
|
},
|
|
1478
|
-
"@riebeckite/plugin-
|
|
1479
|
-
summary: "
|
|
1480
|
-
markdown:
|
|
1639
|
+
"@riebeckite/plugin-properties": {
|
|
1640
|
+
summary: "Renders selected frontmatter properties in the article metadata slot.",
|
|
1641
|
+
markdown: [
|
|
1642
|
+
"---",
|
|
1643
|
+
"created: 2026-09-30",
|
|
1644
|
+
"modified: 2026-09-30",
|
|
1645
|
+
"tags: [riebeckite, demo]",
|
|
1646
|
+
"status: active",
|
|
1647
|
+
"---"
|
|
1648
|
+
].join("\n")
|
|
1481
1649
|
},
|
|
1482
|
-
"@riebeckite/plugin-
|
|
1483
|
-
summary: "
|
|
1650
|
+
"@riebeckite/plugin-alias": {
|
|
1651
|
+
summary: "Creates redirects from old Markdown paths declared in frontmatter.",
|
|
1484
1652
|
markdown: [
|
|
1485
1653
|
"---",
|
|
1486
|
-
"
|
|
1654
|
+
"aliases:",
|
|
1655
|
+
" - /old-page/",
|
|
1656
|
+
" - /notes/previous-name/",
|
|
1657
|
+
"---"
|
|
1658
|
+
].join("\n")
|
|
1659
|
+
},
|
|
1660
|
+
"@riebeckite/plugin-search": {
|
|
1661
|
+
summary: "Indexes published Markdown pages for client-side search. No special syntax is required; searchable text comes from each page body and metadata.",
|
|
1662
|
+
markdown: "# Indexed page\n\nThis body text becomes searchable after the site is built."
|
|
1663
|
+
},
|
|
1664
|
+
"@riebeckite/plugin-backlinks": {
|
|
1665
|
+
summary: "Shows pages that link to the current page. Use normal Markdown links or Obsidian wikilinks.",
|
|
1666
|
+
markdown: "Mention another page with [[guide]] or [the guide](/guide/). The target page can show this page as a backlink."
|
|
1667
|
+
},
|
|
1668
|
+
"@riebeckite/plugin-related-posts": {
|
|
1669
|
+
summary: "Finds related pages from tags and backlink relationships.",
|
|
1670
|
+
markdown: [
|
|
1671
|
+
"---",
|
|
1672
|
+
"tags: [typescript, static-site]",
|
|
1487
1673
|
"---",
|
|
1488
1674
|
"",
|
|
1489
|
-
"
|
|
1675
|
+
"Link to [[another-note]] to strengthen the relationship."
|
|
1490
1676
|
].join("\n")
|
|
1491
1677
|
},
|
|
1492
|
-
"@riebeckite/plugin-
|
|
1493
|
-
summary: "
|
|
1678
|
+
"@riebeckite/plugin-share": {
|
|
1679
|
+
summary: "Adds share links to rendered pages. Markdown does not need special syntax; page title and URL are used automatically.",
|
|
1494
1680
|
markdown: [
|
|
1495
1681
|
"---",
|
|
1496
|
-
"title:
|
|
1497
|
-
"publish: true",
|
|
1682
|
+
"title: Shareable article",
|
|
1498
1683
|
"---",
|
|
1499
1684
|
"",
|
|
1500
|
-
"
|
|
1685
|
+
"# Shareable article"
|
|
1501
1686
|
].join("\n")
|
|
1502
|
-
}
|
|
1503
|
-
};
|
|
1504
|
-
function pluginReadmeUrl(slug) {
|
|
1505
|
-
return `https://github.com/Rerurate514/riebeckite/blob/main/packages/plugins/${slug}/README.md`;
|
|
1506
|
-
}
|
|
1507
|
-
function themeReadmeUrl(slug) {
|
|
1508
|
-
return `https://github.com/Rerurate514/riebeckite/blob/main/packages/themes/${slug}/README.md`;
|
|
1509
|
-
}
|
|
1510
|
-
function contentPageFiles(variables, preset) {
|
|
1511
|
-
const defaultLang = defaultLanguageForLocale(variables.locale);
|
|
1512
|
-
const files = [];
|
|
1513
|
-
const localized = preset.languages.length > 1;
|
|
1514
|
-
const pushLocalized = (basePath, build) => {
|
|
1515
|
-
if (!localized) {
|
|
1516
|
-
files.push({
|
|
1517
|
-
path: `content/${basePath}.md`,
|
|
1518
|
-
content: build(defaultLang)
|
|
1519
|
-
});
|
|
1520
|
-
return;
|
|
1521
|
-
}
|
|
1522
|
-
for (const language of SCAFFOLD_LANGUAGES) {
|
|
1523
|
-
const suffix = language === defaultLang ? "" : `.${language}`;
|
|
1524
|
-
files.push({
|
|
1525
|
-
path: `content/${basePath}${suffix}.md`,
|
|
1526
|
-
content: build(language)
|
|
1527
|
-
});
|
|
1528
|
-
}
|
|
1529
|
-
};
|
|
1530
|
-
const pushEnglishOnly = (basePath, build) => {
|
|
1531
|
-
const suffix = defaultLang === "en" ? "" : ".en";
|
|
1532
|
-
files.push({
|
|
1533
|
-
path: `content/${basePath}${suffix}.md`,
|
|
1534
|
-
content: build()
|
|
1535
|
-
});
|
|
1536
|
-
};
|
|
1537
|
-
for (const page of preset.contentPages) {
|
|
1538
|
-
if (page === "framework/plugins") {
|
|
1539
|
-
pushLocalized(
|
|
1540
|
-
"framework/plugins",
|
|
1541
|
-
(language) => pluginsContent(language)
|
|
1542
|
-
);
|
|
1543
|
-
} else if (page === "framework/themes") {
|
|
1544
|
-
pushLocalized(
|
|
1545
|
-
"framework/themes",
|
|
1546
|
-
(language) => themesContent(language, preset)
|
|
1547
|
-
);
|
|
1548
|
-
} else if (page === "examples") {
|
|
1549
|
-
pushLocalized(
|
|
1550
|
-
"examples",
|
|
1551
|
-
(language) => examplesContent(preset, language)
|
|
1552
|
-
);
|
|
1553
|
-
} else if (page === "reference/plugins") {
|
|
1554
|
-
pushEnglishOnly(
|
|
1555
|
-
"reference/plugins",
|
|
1556
|
-
() => referencePluginsContent(preset, variables)
|
|
1557
|
-
);
|
|
1558
|
-
} else if (page === "reference/themes") {
|
|
1559
|
-
pushEnglishOnly("reference/themes", () => referenceThemesContent(preset));
|
|
1560
|
-
}
|
|
1561
|
-
}
|
|
1562
|
-
return files;
|
|
1563
|
-
}
|
|
1564
|
-
function read(text2, language) {
|
|
1565
|
-
return text2[language];
|
|
1566
|
-
}
|
|
1567
|
-
function frontmatter() {
|
|
1568
|
-
return ["---", "publish: true", "---", ""].join("\n");
|
|
1569
|
-
}
|
|
1570
|
-
function heading(level, text2) {
|
|
1571
|
-
return `${"#".repeat(level)} ${text2}`;
|
|
1572
|
-
}
|
|
1573
|
-
function codeBlock(language, code) {
|
|
1574
|
-
return `\`\`\`${language}
|
|
1575
|
-
${code}
|
|
1576
|
-
\`\`\`
|
|
1577
|
-
`;
|
|
1578
|
-
}
|
|
1579
|
-
var THEMES_COPY = {
|
|
1580
|
-
title: {
|
|
1581
|
-
en: "Themes",
|
|
1582
|
-
ja: "テーマ",
|
|
1583
|
-
"zh-CN": "主题",
|
|
1584
|
-
es: "Temas",
|
|
1585
|
-
de: "Themen",
|
|
1586
|
-
fr: "Thèmes",
|
|
1587
|
-
ko: "테마"
|
|
1588
1687
|
},
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1688
|
+
"@riebeckite/plugin-changelog": {
|
|
1689
|
+
summary: "Surfaces recent or per-note update information from Markdown metadata.",
|
|
1690
|
+
markdown: [
|
|
1691
|
+
"---",
|
|
1692
|
+
"title: Updated article",
|
|
1693
|
+
"modified: 2026-09-30",
|
|
1694
|
+
"---"
|
|
1695
|
+
].join("\n")
|
|
1597
1696
|
},
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1697
|
+
"@riebeckite/plugin-webmention": {
|
|
1698
|
+
summary: "Displays webmentions for the page URL when data is available. Markdown controls the canonical page metadata.",
|
|
1699
|
+
markdown: [
|
|
1700
|
+
"---",
|
|
1701
|
+
"title: Mentionable page",
|
|
1702
|
+
"canonical: https://example.com/mentionable-page/",
|
|
1703
|
+
"---"
|
|
1704
|
+
].join("\n")
|
|
1606
1705
|
},
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1706
|
+
"@riebeckite/plugin-recent-posts": {
|
|
1707
|
+
summary: "Builds recent-post lists from dated Markdown entries.",
|
|
1708
|
+
markdown: [
|
|
1709
|
+
"---",
|
|
1710
|
+
"title: New post",
|
|
1711
|
+
"date: 2026-09-30",
|
|
1712
|
+
"publish: true",
|
|
1713
|
+
"---"
|
|
1714
|
+
].join("\n")
|
|
1615
1715
|
},
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
"zh-CN": "本模板使用 `@riebeckite/theme-default`。想尝试其他主题:",
|
|
1620
|
-
es: "Este starter usa `@riebeckite/theme-default`. Para probar otro tema:",
|
|
1621
|
-
de: "Dieser Starter verwendet `@riebeckite/theme-default`. Um ein anderes Theme zu testen:",
|
|
1622
|
-
fr: "Ce starter utilise `@riebeckite/theme-default`. Pour essayer un autre thème :",
|
|
1623
|
-
ko: "이 스타터는 `@riebeckite/theme-default`를 사용합니다. 다른 테마를 시도하려면:"
|
|
1716
|
+
"@riebeckite/plugin-attachment": {
|
|
1717
|
+
summary: "Enhances links to downloadable assets, including size display when enabled.",
|
|
1718
|
+
markdown: "Download the handout: [slides.pdf](/attachments/slides.pdf)"
|
|
1624
1719
|
},
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
"zh-CN": "安装该包:",
|
|
1629
|
-
es: "Instala el paquete:",
|
|
1630
|
-
de: "Installiere das Paket:",
|
|
1631
|
-
fr: "Installez le paquet :",
|
|
1632
|
-
ko: "패키지를 설치합니다:"
|
|
1720
|
+
"@riebeckite/plugin-pdf": {
|
|
1721
|
+
summary: "Embeds linked PDFs with a viewer/fallback UI.",
|
|
1722
|
+
markdown: ""
|
|
1633
1723
|
},
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
"zh-CN": "在 `riebeckite.config.ts` 中将 `theme` 指向新工厂函数:",
|
|
1638
|
-
es: "Apunta `theme` al nuevo factory en `riebeckite.config.ts`:",
|
|
1639
|
-
de: "Setze `theme` in `riebeckite.config.ts` auf den neuen Factory:",
|
|
1640
|
-
fr: "Pointez `theme` vers le nouveau factory dans `riebeckite.config.ts` :",
|
|
1641
|
-
ko: "`riebeckite.config.ts`의 `theme`를 새 팩토리로 변경합니다:"
|
|
1724
|
+
"@riebeckite/plugin-media": {
|
|
1725
|
+
summary: "Enhances Markdown audio/video embeds with lazy loading and captions.",
|
|
1726
|
+
markdown: "\n\n"
|
|
1642
1727
|
},
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
"zh-CN": "内置主题一览",
|
|
1647
|
-
es: "Los temas incluidos",
|
|
1648
|
-
de: "Die mitgelieferten Themes",
|
|
1649
|
-
fr: "Les thèmes inclus",
|
|
1650
|
-
ko: "내장 테마 목록"
|
|
1728
|
+
"@riebeckite/plugin-responsive-image": {
|
|
1729
|
+
summary: "Rewrites Markdown image embeds into responsive images with configured widths and formats.",
|
|
1730
|
+
markdown: ""
|
|
1651
1731
|
},
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
"zh-CN": "主题",
|
|
1656
|
-
es: "Tema",
|
|
1657
|
-
de: "Theme",
|
|
1658
|
-
fr: "Thème",
|
|
1659
|
-
ko: "테마"
|
|
1732
|
+
"@riebeckite/plugin-lightbox": {
|
|
1733
|
+
summary: "Makes image links open in a lightbox when the configured trigger class is present.",
|
|
1734
|
+
markdown: "[](./images/photo.jpg){.rr-lightbox-trigger}"
|
|
1660
1735
|
},
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
"zh-CN": "说明",
|
|
1665
|
-
es: "Descripción",
|
|
1666
|
-
de: "Beschreibung",
|
|
1667
|
-
fr: "Description",
|
|
1668
|
-
ko: "설명"
|
|
1736
|
+
"@riebeckite/plugin-highlight": {
|
|
1737
|
+
summary: "Highlights marked inline text.",
|
|
1738
|
+
markdown: "This sentence contains ==highlighted text== inside normal Markdown."
|
|
1669
1739
|
},
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
};
|
|
1680
|
-
var THEMES = [
|
|
1681
|
-
{
|
|
1682
|
-
slug: "default",
|
|
1683
|
-
factory: "defaultTheme()",
|
|
1684
|
-
desc: {
|
|
1685
|
-
en: "The default theme: clean design tokens, light/dark/system color modes, and article layouts.",
|
|
1686
|
-
ja: "デフォルトテーマ:クリーンなデザイントークン、ライト/ダーク/システムのカラーモード、記事レイアウト。",
|
|
1687
|
-
"zh-CN": "默认主题:简洁的设计令牌、浅色/深色/系统配色与文章布局。",
|
|
1688
|
-
es: "El tema por defecto: tokens limpios, modos claro/oscuro/sistema y distintos diseños de artículo.",
|
|
1689
|
-
de: "Das Standard-Theme: klare Design-Tokens, Licht/Dunkel/System-Modi und Artikel-Layouts.",
|
|
1690
|
-
fr: "Le thème par défaut : tokens épurés, modes clair/sombre/système et mises en page d'article.",
|
|
1691
|
-
ko: "기본 테마: 깔끔한 디자인 토큰, 라이트/다크/시스템 컬러 모드, 아티클 레이아웃."
|
|
1692
|
-
}
|
|
1740
|
+
"@riebeckite/plugin-code-annotations": {
|
|
1741
|
+
summary: "Renders code diffs with syntax highlighting for the target language.",
|
|
1742
|
+
markdown: [
|
|
1743
|
+
"```diff ts",
|
|
1744
|
+
"+ const answer = 42",
|
|
1745
|
+
"- const answer = 0",
|
|
1746
|
+
"console.log(answer)",
|
|
1747
|
+
"```"
|
|
1748
|
+
].join("\n")
|
|
1693
1749
|
},
|
|
1694
|
-
{
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
desc: {
|
|
1698
|
-
en: "A quiet, typography-first theme.",
|
|
1699
|
-
ja: "文字組みを重視した静かなテーマ。",
|
|
1700
|
-
"zh-CN": "以排版为先的简洁主题。",
|
|
1701
|
-
es: "Un tema sobrio, centrado en la tipografía.",
|
|
1702
|
-
de: "Ein ruhiges, typografieorientiertes Theme.",
|
|
1703
|
-
fr: "Un thème sobre, axé sur la typographie.",
|
|
1704
|
-
ko: "타이포그래피 우선의 차분한 테마."
|
|
1705
|
-
}
|
|
1750
|
+
"@riebeckite/plugin-shortcodes": {
|
|
1751
|
+
summary: "Expands built-in shortcode syntax inside Markdown.",
|
|
1752
|
+
markdown: '::youtube[id=dQw4w9WgXcQ]\n\n::figure[Demo image]{src="/images/demo.png"}'
|
|
1706
1753
|
},
|
|
1707
|
-
{
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
"
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
fr: "Une palette rose douce aux accents chaleureux.",
|
|
1717
|
-
ko: "부드러운 핑크 팔레트와 따뜻한 액센트."
|
|
1718
|
-
}
|
|
1754
|
+
"@riebeckite/plugin-series": {
|
|
1755
|
+
summary: "Groups Markdown pages into a reading series using frontmatter.",
|
|
1756
|
+
markdown: [
|
|
1757
|
+
"---",
|
|
1758
|
+
"series: riebeckite-guide",
|
|
1759
|
+
"series_title: Riebeckite Guide",
|
|
1760
|
+
"series_order: 2",
|
|
1761
|
+
"---"
|
|
1762
|
+
].join("\n")
|
|
1719
1763
|
},
|
|
1720
|
-
{
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
ja: "Gruvbox 風の温かみのあるレトロパレット。",
|
|
1726
|
-
"zh-CN": "受 Gruvbox 启发的温暖复古配色。",
|
|
1727
|
-
es: "Una paleta retro cálida inspirada en Gruvbox.",
|
|
1728
|
-
de: "Eine warme, von Gruvbox inspirierte Retro-Palette.",
|
|
1729
|
-
fr: "Une palette rétro chaleureuse inspirée de Gruvbox.",
|
|
1730
|
-
ko: "Gruvbox에서 영감을 받은 따뜻한 레트로 팔레트."
|
|
1731
|
-
}
|
|
1764
|
+
"@riebeckite/plugin-taxonomy": {
|
|
1765
|
+
summary: "Builds tag/folder taxonomy pages from Markdown metadata and content location.",
|
|
1766
|
+
markdown: ["---", "tags: [design, notes]", "---", "", "# Tagged note"].join(
|
|
1767
|
+
"\n"
|
|
1768
|
+
)
|
|
1732
1769
|
},
|
|
1733
|
-
{
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
desc: {
|
|
1737
|
-
en: "A modern night palette with an optional neon accent.",
|
|
1738
|
-
ja: "ネオンオプション付きのモダンなナイトパレット。",
|
|
1739
|
-
"zh-CN": "现代夜间配色,可选霓虹点缀。",
|
|
1740
|
-
es: "Una paleta nocturna moderna con acento neón opcional.",
|
|
1741
|
-
de: "Eine moderne Night-Palette mit optionalem Neon-Akzent.",
|
|
1742
|
-
fr: "Une palette nocturne moderne avec accent néon optionnel.",
|
|
1743
|
-
ko: "네온 액센트를 선택할 수 있는 모던한 나이트 팔레트."
|
|
1744
|
-
}
|
|
1770
|
+
"@riebeckite/plugin-autocardlink": {
|
|
1771
|
+
summary: "Turns suitable standalone links into rich card links.",
|
|
1772
|
+
markdown: "https://example.com/articles/riebeckite-introduction"
|
|
1745
1773
|
},
|
|
1746
|
-
{
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
}
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
1774
|
+
"@riebeckite/plugin-plantuml": {
|
|
1775
|
+
summary: "A `plantuml` fence is rendered to SVG through the configured PlantUML server.",
|
|
1776
|
+
markdown: fence(
|
|
1777
|
+
"plantuml",
|
|
1778
|
+
["@startuml", "Alice -> Bob: Hello", "Bob --> Alice: Hi", "@enduml"].join(
|
|
1779
|
+
"\n"
|
|
1780
|
+
)
|
|
1781
|
+
)
|
|
1782
|
+
},
|
|
1783
|
+
"@riebeckite/plugin-discord-embed": {
|
|
1784
|
+
summary: "Renders Discord-style rich embed metadata from frontmatter or embed blocks.",
|
|
1785
|
+
markdown: [
|
|
1786
|
+
"---",
|
|
1787
|
+
"title: Discord preview",
|
|
1788
|
+
"description: A page with rich metadata for card rendering.",
|
|
1789
|
+
"image: /images/card.png",
|
|
1790
|
+
"---"
|
|
1791
|
+
].join("\n")
|
|
1792
|
+
},
|
|
1793
|
+
"@riebeckite/plugin-excalidraw": {
|
|
1794
|
+
summary: "Embeds Excalidraw drawings referenced from Markdown.",
|
|
1795
|
+
markdown: "![[Architecture.excalidraw]]\n\n"
|
|
1796
|
+
},
|
|
1797
|
+
"@riebeckite/plugin-excalibrain": {
|
|
1798
|
+
summary: "Builds an Excalibrain-style local graph from links, tags, headings, and inferred relationships.",
|
|
1799
|
+
markdown: "# Concept\n\nLinks to [[Parent idea]], [[Sibling idea]], and [[Related idea]] become graph relationships."
|
|
1800
|
+
},
|
|
1801
|
+
"@riebeckite/plugin-canvas": {
|
|
1802
|
+
summary: "Embeds Obsidian Canvas JSON as a rendered canvas/fallback.",
|
|
1803
|
+
markdown: '```canvas\n{ "nodes": [], "edges": [] }\n```'
|
|
1804
|
+
},
|
|
1805
|
+
"@riebeckite/plugin-flashcards": {
|
|
1806
|
+
summary: "Turns Q/A style Markdown into flashcards.",
|
|
1807
|
+
markdown: [
|
|
1808
|
+
"# Flashcards",
|
|
1809
|
+
"",
|
|
1810
|
+
"Q: What is Riebeckite?",
|
|
1811
|
+
"A: A content-first static site framework.",
|
|
1812
|
+
"",
|
|
1813
|
+
"---",
|
|
1814
|
+
"",
|
|
1815
|
+
"What does SSG mean?::Static Site Generation"
|
|
1816
|
+
].join("\n")
|
|
1817
|
+
},
|
|
1818
|
+
"@riebeckite/plugin-local-graph": {
|
|
1819
|
+
summary: "Shows nearby notes based on Markdown links and wikilinks.",
|
|
1820
|
+
markdown: "# Local graph source\n\nConnect this page to [[guide]], [[examples]], and [[reference/plugins]]."
|
|
1821
|
+
},
|
|
1822
|
+
"@riebeckite/plugin-hover-preview": {
|
|
1823
|
+
summary: "Shows previews when hovering internal links generated from Markdown.",
|
|
1824
|
+
markdown: "Hover this internal link: [Guide](/guide/) or this wikilink: [[guide]]."
|
|
1825
|
+
},
|
|
1826
|
+
"@riebeckite/plugin-garden-explorer": {
|
|
1827
|
+
summary: "Adds garden navigation/explorer UI from the content tree. Markdown files and folders become the source data.",
|
|
1828
|
+
markdown: fence(
|
|
1829
|
+
"text",
|
|
1799
1830
|
[
|
|
1800
|
-
|
|
1801
|
-
"",
|
|
1802
|
-
"
|
|
1803
|
-
"
|
|
1804
|
-
"
|
|
1831
|
+
"content/",
|
|
1832
|
+
" notes/",
|
|
1833
|
+
" ideas.md",
|
|
1834
|
+
" projects.md",
|
|
1835
|
+
" reference/",
|
|
1836
|
+
" plugins.md"
|
|
1805
1837
|
].join("\n")
|
|
1806
1838
|
)
|
|
1807
|
-
);
|
|
1808
|
-
lines.push(heading(2, read(copy.tableHeading, language)), "");
|
|
1809
|
-
lines.push(
|
|
1810
|
-
`| ${read(copy.columnTheme, language)} | ${read(copy.columnDescription, language)} |`
|
|
1811
|
-
);
|
|
1812
|
-
lines.push("| --- | --- |");
|
|
1813
|
-
for (const theme of THEMES) {
|
|
1814
|
-
const packageName = `@riebeckite/theme-${theme.slug}`;
|
|
1815
|
-
lines.push(
|
|
1816
|
-
`| [\`${packageName}\`](${themeReadmeUrl(theme.slug)}) · \`${theme.factory}\` | ${read(theme.desc, language)} |`
|
|
1817
|
-
);
|
|
1818
|
-
}
|
|
1819
|
-
lines.push("");
|
|
1820
|
-
lines.push(heading(2, read(copy.note, language)), "");
|
|
1821
|
-
lines.push("");
|
|
1822
|
-
lines.push(`[Riebeckite themes on GitHub](${THEMES_INDEX_URL})`, "");
|
|
1823
|
-
lines.push("");
|
|
1824
|
-
return lines.join("\n");
|
|
1825
|
-
}
|
|
1826
|
-
var PLUGINS_COPY = {
|
|
1827
|
-
title: {
|
|
1828
|
-
en: "Plugins",
|
|
1829
|
-
ja: "プラグイン",
|
|
1830
|
-
"zh-CN": "插件",
|
|
1831
|
-
es: "Plugins",
|
|
1832
|
-
de: "Plugins",
|
|
1833
|
-
fr: "Plugins",
|
|
1834
|
-
ko: "플러그인"
|
|
1835
|
-
},
|
|
1836
|
-
intro: {
|
|
1837
|
-
en: "Riebeckite's power comes from its plugin ecosystem — over fifty packages that extend Markdown, rendering, search, SEO, and more. Below are representative examples grouped by capability; every entry links to its full README.",
|
|
1838
|
-
ja: "Riebeckite の力はプラグインエコシステムにあります——50 以上のパッケージが Markdown・描画・検索・SEO などを拡張します。ここでは代表的なプラグインを機能別に紹介します。各項目のリンクから詳細な README を参照できます。",
|
|
1839
|
-
"zh-CN": "Riebeckite 的强大来自其插件生态——五十多个扩展 Markdown、渲染、搜索、SEO 等的包。下面按能力分组展示代表性示例,每一项都链接到完整 README。",
|
|
1840
|
-
es: "El poder de Riebeckite viene de su ecosistema de plugins — más de cincuenta paquetes que extienden Markdown, renderizado, búsqueda, SEO y más. Aquí tienes ejemplos representativos agrupados por capacidad; cada uno enlaza a su README completo.",
|
|
1841
|
-
de: "Riebeckites Stärke kommt aus seinem Plugin-Ökosystem — über fünfzig Pakete, die Markdown, Rendering, Suche, SEO und mehr erweitern. Hier finden sich repräsentative Beispiele nach Fähigkeit gruppiert; jeder Eintrag verlinkt auf sein volles README.",
|
|
1842
|
-
fr: "La puissance de Riebeckite vient de son écosystème de plugins — plus de cinquante paquets qui étendent Markdown, le rendu, la recherche, le SEO et plus encore. Voici des exemples représentatifs groupés par capacité ; chaque entrée renvoie vers son README complet.",
|
|
1843
|
-
ko: "Riebeckite의 힘은 플러그인 생태계에 있습니다 — Markdown·렌더링·검색·SEO 등을 확장하는 50개 이상의 패키지. 아래는 기능별로 대표적인 예를 소개하며, 각 항목은 전체 README로 연결됩니다."
|
|
1844
1839
|
},
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1840
|
+
"@riebeckite/plugin-ux": {
|
|
1841
|
+
summary: "Adds reading UX such as progress, back-to-top, scroll spy, and copy buttons. Markdown headings and code blocks provide the anchors.",
|
|
1842
|
+
markdown: [
|
|
1843
|
+
"## Long section",
|
|
1844
|
+
"",
|
|
1845
|
+
"```ts",
|
|
1846
|
+
"console.log('copy me')",
|
|
1847
|
+
"```"
|
|
1848
|
+
].join("\n")
|
|
1853
1849
|
},
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1850
|
+
"@riebeckite/plugin-daily-notes": {
|
|
1851
|
+
summary: "Extracts daily-note summaries/snippets from dated Markdown files.",
|
|
1852
|
+
markdown: [
|
|
1853
|
+
"---",
|
|
1854
|
+
"daily-summary: Shipped the plugin reference page.",
|
|
1855
|
+
"---",
|
|
1856
|
+
"",
|
|
1857
|
+
"```daily-snippet",
|
|
1858
|
+
"Updated the showcase examples.",
|
|
1859
|
+
"```"
|
|
1860
|
+
].join("\n")
|
|
1862
1861
|
},
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
1862
|
+
"@riebeckite/plugin-rename": {
|
|
1863
|
+
summary: "Creates redirects when Markdown entries declare previous paths or when rename data is available.",
|
|
1864
|
+
markdown: [
|
|
1865
|
+
"---",
|
|
1866
|
+
"previousPaths:",
|
|
1867
|
+
" - /old-slug/",
|
|
1868
|
+
" - /notes/old-title/",
|
|
1869
|
+
"---"
|
|
1870
|
+
].join("\n")
|
|
1871
1871
|
},
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
"zh-CN": "完整的插件索引位于仓库中:",
|
|
1876
|
-
es: "El índice completo de plugins vive en el repositorio:",
|
|
1877
|
-
de: "Der vollständige Plugin-Index liegt im Repository:",
|
|
1878
|
-
fr: "L'index complet des plugins se trouve dans le dépôt :",
|
|
1879
|
-
ko: "전체 플러그인 목록은 저장소에 있습니다:"
|
|
1872
|
+
"@riebeckite/plugin-text-fragment": {
|
|
1873
|
+
summary: "Adds text-fragment friendly copy/open behavior for selected Markdown text.",
|
|
1874
|
+
markdown: "Select this sentence in the rendered page and copy a text-fragment link to it."
|
|
1880
1875
|
},
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
"zh-CN": "GitHub 上的 Riebeckite 插件",
|
|
1885
|
-
es: "Plugins de Riebeckite en GitHub",
|
|
1886
|
-
de: "Riebeckite-Plugins auf GitHub",
|
|
1887
|
-
fr: "Plugins Riebeckite sur GitHub",
|
|
1888
|
-
ko: "GitHub의 Riebeckite 플러그인"
|
|
1876
|
+
"@riebeckite/plugin-quality": {
|
|
1877
|
+
summary: "Reports accessibility/content quality diagnostics from rendered Markdown output.",
|
|
1878
|
+
markdown: "\n\nUse headings in order: #, then ##, then ###."
|
|
1889
1879
|
},
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1880
|
+
"@riebeckite/plugin-deploy": {
|
|
1881
|
+
summary: "Adds deployment integration for the generated site. Markdown does not need syntax; published pages become deployable output.",
|
|
1882
|
+
markdown: [
|
|
1883
|
+
"---",
|
|
1884
|
+
"publish: true",
|
|
1885
|
+
"---",
|
|
1886
|
+
"",
|
|
1887
|
+
"# This page is included in the deployed site"
|
|
1888
|
+
].join("\n")
|
|
1898
1889
|
},
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1890
|
+
"@riebeckite/plugin-diagnostics": {
|
|
1891
|
+
summary: "Reports diagnostics such as missing required frontmatter, orphan pages, and unused assets.",
|
|
1892
|
+
markdown: [
|
|
1893
|
+
"---",
|
|
1894
|
+
"title: Required title",
|
|
1895
|
+
"publish: true",
|
|
1896
|
+
"---",
|
|
1897
|
+
"",
|
|
1898
|
+
"Link orphan pages from another note to clear orphan diagnostics."
|
|
1899
|
+
].join("\n")
|
|
1907
1900
|
}
|
|
1908
1901
|
};
|
|
1909
|
-
|
|
1910
|
-
{
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
en: "Audio and video embeds from plain links.",
|
|
1958
|
-
ja: "プレーンなリンクから音声・動画を埋め込み。",
|
|
1959
|
-
"zh-CN": "从普通链接嵌入音频和视频。",
|
|
1960
|
-
es: "Incrusta audio y vídeo desde enlaces simples.",
|
|
1961
|
-
de: "Audio- und Video-Embeds aus einfachen Links.",
|
|
1962
|
-
fr: "Embeds audio et vidéo depuis de simples liens.",
|
|
1963
|
-
ko: "일반 링크에서 오디오·비디오 임베드."
|
|
1964
|
-
}
|
|
1965
|
-
}
|
|
1966
|
-
]
|
|
1967
|
-
},
|
|
1968
|
-
{
|
|
1969
|
-
title: {
|
|
1970
|
-
en: "Diagrams and presentation",
|
|
1971
|
-
ja: "図とプレゼンテーション",
|
|
1972
|
-
"zh-CN": "图表与演示",
|
|
1973
|
-
es: "Diagramas y presentación",
|
|
1974
|
-
de: "Diagramme und Präsentation",
|
|
1975
|
-
fr: "Diagrammes et présentation",
|
|
1976
|
-
ko: "다이어그램과 프레젠테이션"
|
|
1977
|
-
},
|
|
1978
|
-
summary: {
|
|
1979
|
-
en: "Turn fenced code blocks into diagrams, charts, and slide decks.",
|
|
1980
|
-
ja: "フェンスコードブロックを図やチャート、スライドに変換。",
|
|
1981
|
-
"zh-CN": "将围栏代码块变成图表与幻灯片。",
|
|
1982
|
-
es: "Convierte bloques de código en diagramas, gráficas y diapositivas.",
|
|
1983
|
-
de: "Verwandle fenced Code-Blöcke in Diagramme, Charts und Folien.",
|
|
1984
|
-
fr: "Transformez des blocs de code en diagrammes, graphiques et diapositives.",
|
|
1985
|
-
ko: "fenced 코드 블록을 다이어그램·차트·슬라이드로 전환."
|
|
1986
|
-
},
|
|
1987
|
-
plugins: [
|
|
1988
|
-
{
|
|
1989
|
-
slug: "mermaid",
|
|
1990
|
-
desc: {
|
|
1991
|
-
en: "Mermaid diagrams from fenced code blocks.",
|
|
1992
|
-
ja: "フェンスコードブロックから Mermaid 図を描画。",
|
|
1993
|
-
"zh-CN": "从围栏代码块渲染 Mermaid 图表。",
|
|
1994
|
-
es: "Diagramas Mermaid desde bloques de código delimitados.",
|
|
1995
|
-
de: "Mermaid-Diagramme aus fenced Code-Blöcken.",
|
|
1996
|
-
fr: "Diagrammes Mermaid depuis des blocs de code délimités.",
|
|
1997
|
-
ko: "fenced 코드 블록에서 Mermaid 다이어그램 렌더링."
|
|
1998
|
-
}
|
|
1999
|
-
},
|
|
2000
|
-
{
|
|
2001
|
-
slug: "graphviz",
|
|
2002
|
-
desc: {
|
|
2003
|
-
en: "DOT / Graphviz diagrams.",
|
|
2004
|
-
ja: "DOT / Graphviz 図。",
|
|
2005
|
-
"zh-CN": "DOT / Graphviz 图表。",
|
|
2006
|
-
es: "Diagramas DOT / Graphviz.",
|
|
2007
|
-
de: "DOT / Graphviz-Diagramme.",
|
|
2008
|
-
fr: "Diagrammes DOT / Graphviz.",
|
|
2009
|
-
ko: "DOT / Graphviz 다이어그램."
|
|
2010
|
-
}
|
|
2011
|
-
},
|
|
2012
|
-
{
|
|
2013
|
-
slug: "d2",
|
|
2014
|
-
desc: {
|
|
2015
|
-
en: "Diagrams in the D2 language.",
|
|
2016
|
-
ja: "D2 言語によるダイアグラム。",
|
|
2017
|
-
"zh-CN": "使用 D2 语言绘制图表。",
|
|
2018
|
-
es: "Diagramas en lenguaje D2.",
|
|
2019
|
-
de: "Diagramme in der Sprache D2.",
|
|
2020
|
-
fr: "Diagrammes en langage D2.",
|
|
2021
|
-
ko: "D2 언어 다이어그램."
|
|
2022
|
-
}
|
|
2023
|
-
},
|
|
2024
|
-
{
|
|
2025
|
-
slug: "excalidraw",
|
|
2026
|
-
desc: {
|
|
2027
|
-
en: "Renders Excalidraw sketch files.",
|
|
2028
|
-
ja: "Excalidraw スケッチファイルを描画。",
|
|
2029
|
-
"zh-CN": "渲染 Excalidraw 草图文件。",
|
|
2030
|
-
es: "Renderiza bocetos de Excalidraw.",
|
|
2031
|
-
de: "Rendert Excalidraw-Skizzen.",
|
|
2032
|
-
fr: "Rend les croquis Excalidraw.",
|
|
2033
|
-
ko: "Excalidraw 스케치 파일 렌더링."
|
|
2034
|
-
}
|
|
2035
|
-
},
|
|
2036
|
-
{
|
|
2037
|
-
slug: "gallery",
|
|
2038
|
-
desc: {
|
|
2039
|
-
en: "Card grids for theme or project showcases.",
|
|
2040
|
-
ja: "テーマやプロジェクトの紹介向けカードグリッド。",
|
|
2041
|
-
"zh-CN": "用于主题或项目展示的卡片网格。",
|
|
2042
|
-
es: "Cuadrículas de tarjetas para escaparates de temas o proyectos.",
|
|
2043
|
-
de: "Kartenraster für Theme- oder Projekt-Showcases.",
|
|
2044
|
-
fr: "Grilles de cartes pour vitrines de thèmes ou de projets.",
|
|
2045
|
-
ko: "테마·프로젝트 소개용 카드 그리드."
|
|
2046
|
-
}
|
|
2047
|
-
}
|
|
2048
|
-
]
|
|
2049
|
-
},
|
|
2050
|
-
{
|
|
2051
|
-
title: {
|
|
2052
|
-
en: "Code and reading experience",
|
|
2053
|
-
ja: "コードと読書体験",
|
|
2054
|
-
"zh-CN": "代码与阅读体验",
|
|
2055
|
-
es: "Código y experiencia de lectura",
|
|
2056
|
-
de: "Code und Leseerlebnis",
|
|
2057
|
-
fr: "Code et expérience de lecture",
|
|
2058
|
-
ko: "코드와 읽기 경험"
|
|
2059
|
-
},
|
|
2060
|
-
summary: {
|
|
2061
|
-
en: "Better code blocks and a comfortable reading experience.",
|
|
2062
|
-
ja: "読みやすいコードブロックと快適な読書体験。",
|
|
2063
|
-
"zh-CN": "更好的代码块与舒适的阅读体验。",
|
|
2064
|
-
es: "Mejores bloques de código y una lectura cómoda.",
|
|
2065
|
-
de: "Bessere Code-Blöcke und ein angenehmes Leseerlebnis.",
|
|
2066
|
-
fr: "De meilleurs blocs de code et une lecture confortable.",
|
|
2067
|
-
ko: "더 나은 코드 블록과 편안한 읽기 경험."
|
|
2068
|
-
},
|
|
2069
|
-
plugins: [
|
|
2070
|
-
{
|
|
2071
|
-
slug: "code-enhance",
|
|
2072
|
-
desc: {
|
|
2073
|
-
en: "Syntax highlighting, line numbers, and code toolbars.",
|
|
2074
|
-
ja: "シンタックスハイライト・行番号・コードツールバー。",
|
|
2075
|
-
"zh-CN": "语法高亮、行号与代码工具栏。",
|
|
2076
|
-
es: "Resaltado de sintaxis, números de línea y barras de código.",
|
|
2077
|
-
de: "Syntax-Highlighting, Zeilennummern und Code-Symbolleisten.",
|
|
2078
|
-
fr: "Coloration syntaxique, numéros de ligne et barres de code.",
|
|
2079
|
-
ko: "구문 강조, 줄 번호, 코드 도구 모음."
|
|
2080
|
-
}
|
|
2081
|
-
},
|
|
2082
|
-
{
|
|
2083
|
-
slug: "code-tabs",
|
|
2084
|
-
desc: {
|
|
2085
|
-
en: "Accessible tabbed code blocks.",
|
|
2086
|
-
ja: "アクセシブルなタブ式コードブロック。",
|
|
2087
|
-
"zh-CN": "无障碍的标签式代码块。",
|
|
2088
|
-
es: "Bloques de código con pestañas accesibles.",
|
|
2089
|
-
de: "Barrierefreie Code-Blöcke mit Tabs.",
|
|
2090
|
-
fr: "Blocs de code à onglets accessibles.",
|
|
2091
|
-
ko: "접근성 있는 탭식 코드 블록."
|
|
2092
|
-
}
|
|
2093
|
-
},
|
|
2094
|
-
{
|
|
2095
|
-
slug: "toc",
|
|
2096
|
-
desc: {
|
|
2097
|
-
en: "A scroll-aware table of contents.",
|
|
2098
|
-
ja: "スクロール追従の目次。",
|
|
2099
|
-
"zh-CN": "随滚动高亮的目录。",
|
|
2100
|
-
es: "Una tabla de contenidos que sigue el scroll.",
|
|
2101
|
-
de: "Ein scrollgesteuertes Inhaltsverzeichnis.",
|
|
2102
|
-
fr: "Une table des matières qui suit le défilement.",
|
|
2103
|
-
ko: "스크롤을 따라가는 목차."
|
|
2104
|
-
}
|
|
2105
|
-
},
|
|
2106
|
-
{
|
|
2107
|
-
slug: "backlinks",
|
|
2108
|
-
desc: {
|
|
2109
|
-
en: "Lists notes that link to the current one.",
|
|
2110
|
-
ja: "現在のノートを参照するノートを一覧表示。",
|
|
2111
|
-
"zh-CN": "列出链接到当前笔记的笔记。",
|
|
2112
|
-
es: "Lista las notas que enlazan con la actual.",
|
|
2113
|
-
de: "Listet Notizen, die auf die aktuelle verlinken.",
|
|
2114
|
-
fr: "Liste les notes qui pointent vers la note courante.",
|
|
2115
|
-
ko: "현재 노트를 링크한 노트 목록."
|
|
2116
|
-
}
|
|
2117
|
-
}
|
|
2118
|
-
]
|
|
2119
|
-
},
|
|
2120
|
-
{
|
|
2121
|
-
title: {
|
|
2122
|
-
en: "Search and navigation",
|
|
2123
|
-
ja: "検索とナビゲーション",
|
|
2124
|
-
"zh-CN": "搜索与导航",
|
|
2125
|
-
es: "Búsqueda y navegación",
|
|
2126
|
-
de: "Suche und Navigation",
|
|
2127
|
-
fr: "Recherche et navigation",
|
|
2128
|
-
ko: "검색과 탐색"
|
|
2129
|
-
},
|
|
2130
|
-
summary: {
|
|
2131
|
-
en: "Find and move through your notes quickly.",
|
|
2132
|
-
ja: "ノートをすばやく探して移動する。",
|
|
2133
|
-
"zh-CN": "快速查找并在笔记之间穿梭。",
|
|
2134
|
-
es: "Encuentra y recorre tus notas rápidamente.",
|
|
2135
|
-
de: "Notizen schnell finden und durch sie navigieren.",
|
|
2136
|
-
fr: "Retrouvez et parcourez vos notes rapidement.",
|
|
2137
|
-
ko: "노트를 빠르게 찾고 이동하기."
|
|
2138
|
-
},
|
|
2139
|
-
plugins: [
|
|
2140
|
-
{
|
|
2141
|
-
slug: "search",
|
|
2142
|
-
desc: {
|
|
2143
|
-
en: "Client-side full-text search with a Ctrl+K modal.",
|
|
2144
|
-
ja: "Ctrl+K モーダル付きのクライアント側全文検索。",
|
|
2145
|
-
"zh-CN": "带 Ctrl+K 弹窗的客户端全文搜索。",
|
|
2146
|
-
es: "Búsqueda de texto completo en el cliente con modal Ctrl+K.",
|
|
2147
|
-
de: "Clientseitige Volltextsuche mit Ctrl+K-Modal.",
|
|
2148
|
-
fr: "Recherche plein texte côté client avec modal Ctrl+K.",
|
|
2149
|
-
ko: "Ctrl+K 모달이 있는 클라이언트 전체 텍스트 검색."
|
|
2150
|
-
}
|
|
2151
|
-
},
|
|
2152
|
-
{
|
|
2153
|
-
slug: "garden-explorer",
|
|
2154
|
-
desc: {
|
|
2155
|
-
en: "An interactive graph and search explorer.",
|
|
2156
|
-
ja: "ノートのグラフと検索を探索するインタラクティブビュー。",
|
|
2157
|
-
"zh-CN": "交互式图谱与搜索探索器。",
|
|
2158
|
-
es: "Un explorador interactivo de grafo y búsqueda.",
|
|
2159
|
-
de: "Ein interaktiver Graph- und Such-Explorer.",
|
|
2160
|
-
fr: "Un explorateur interactif de graphe et de recherche.",
|
|
2161
|
-
ko: "노트 그래프와 검색을 탐색하는 대화형 뷰."
|
|
2162
|
-
}
|
|
2163
|
-
},
|
|
2164
|
-
{
|
|
2165
|
-
slug: "local-graph",
|
|
2166
|
-
desc: {
|
|
2167
|
-
en: "A link graph around the current note.",
|
|
2168
|
-
ja: "ノート周辺のリンクグラフ。",
|
|
2169
|
-
"zh-CN": "当前笔记周边的链接图谱。",
|
|
2170
|
-
es: "Un grafo de enlaces alrededor de la nota actual.",
|
|
2171
|
-
de: "Ein Link-Graph rund um die aktuelle Notiz.",
|
|
2172
|
-
fr: "Un graphe de liens autour de la note courante.",
|
|
2173
|
-
ko: "현재 노트 주변의 링크 그래프."
|
|
2174
|
-
}
|
|
2175
|
-
},
|
|
2176
|
-
{
|
|
2177
|
-
slug: "permalink",
|
|
2178
|
-
desc: {
|
|
2179
|
-
en: "Stable, configurable permalinks.",
|
|
2180
|
-
ja: "安定したカスタマイズ可能なパーマリンク。",
|
|
2181
|
-
"zh-CN": "稳定、可配置的永久链接。",
|
|
2182
|
-
es: "Permalinks estables y configurables.",
|
|
2183
|
-
de: "Stabile, konfigurierbare Permalinks.",
|
|
2184
|
-
fr: "Permaliens stables et configurables.",
|
|
2185
|
-
ko: "안정적이고 설정 가능한 고유 주소."
|
|
2186
|
-
}
|
|
2187
|
-
}
|
|
2188
|
-
]
|
|
2189
|
-
},
|
|
2190
|
-
{
|
|
2191
|
-
title: {
|
|
2192
|
-
en: "Publishing and SEO",
|
|
2193
|
-
ja: "公開と SEO",
|
|
2194
|
-
"zh-CN": "发布与 SEO",
|
|
2195
|
-
es: "Publicación y SEO",
|
|
2196
|
-
de: "Veröffentlichung und SEO",
|
|
2197
|
-
fr: "Publication et SEO",
|
|
2198
|
-
ko: "배포와 SEO"
|
|
2199
|
-
},
|
|
2200
|
-
summary: {
|
|
2201
|
-
en: "Ship a site that search engines and readers both understand.",
|
|
2202
|
-
ja: "検索エンジンにも読者にも伝わるサイトを公開する。",
|
|
2203
|
-
"zh-CN": "发布搜索引擎和读者都能理解的站点。",
|
|
2204
|
-
es: "Publica un sitio que buscan buscadores y lectores por igual.",
|
|
2205
|
-
de: "Veröffentliche eine Seite, die Suchmaschinen und Leser gleichermaßen verstehen.",
|
|
2206
|
-
fr: "Publiez un site que moteurs de recherche et lecteurs comprennent.",
|
|
2207
|
-
ko: "검색 엔진과 독자 모두가 이해하는 사이트를 배포."
|
|
2208
|
-
},
|
|
2209
|
-
plugins: [
|
|
2210
|
-
{
|
|
2211
|
-
slug: "seo",
|
|
2212
|
-
desc: {
|
|
2213
|
-
en: "SEO metadata, sitemaps, RSS/Atom/JSON feeds, and robots.txt.",
|
|
2214
|
-
ja: "SEO メタデータ・サイトマップ・RSS/Atom/JSON フィード・robots.txt。",
|
|
2215
|
-
"zh-CN": "SEO 元数据、站点地图、RSS/Atom/JSON 订阅与 robots.txt。",
|
|
2216
|
-
es: "Metadatos SEO, sitemaps, feeds RSS/Atom/JSON y robots.txt.",
|
|
2217
|
-
de: "SEO-Metadaten, Sitemaps, RSS/Atom/JSON-Feeds und robots.txt.",
|
|
2218
|
-
fr: "Métadonnées SEO, sitemaps, flux RSS/Atom/JSON et robots.txt.",
|
|
2219
|
-
ko: "SEO 메타데이터·사이트맵·RSS/Atom/JSON 피드·robots.txt."
|
|
2220
|
-
}
|
|
2221
|
-
},
|
|
2222
|
-
{
|
|
2223
|
-
slug: "l10n",
|
|
2224
|
-
desc: {
|
|
2225
|
-
en: "Localized URLs, a language switcher, and hreflang metadata — this site runs on it.",
|
|
2226
|
-
ja: "ローカライズ済み URL・言語スイッチャー・hreflang メタデータ——このサイトもこれで動いています。",
|
|
2227
|
-
"zh-CN": "本地化 URL、语言切换器与 hreflang 元数据——本站就运行在它之上。",
|
|
2228
|
-
es: "URLs localizadas, selector de idioma y metadatos hreflang — este sitio se ejecuta sobre él.",
|
|
2229
|
-
de: "Lokalisierte URLs, Sprachumschalter und hreflang-Metadaten — diese Seite läuft darauf.",
|
|
2230
|
-
fr: "URLs localisées, sélecteur de langue et métadonnées hreflang — ce site repose dessus.",
|
|
2231
|
-
ko: "로컬라이즈된 URL·언어 전환 UI·hreflang 메타데이터 — 이 사이트가 동작하는 기반입니다."
|
|
2232
|
-
}
|
|
2233
|
-
},
|
|
2234
|
-
{
|
|
2235
|
-
slug: "rich-embed",
|
|
2236
|
-
desc: {
|
|
2237
|
-
en: "Build-time rich media cards for external links.",
|
|
2238
|
-
ja: "外部リンクのビルド時リッチメディアカード。",
|
|
2239
|
-
"zh-CN": "外部链接的构建时富媒体卡片。",
|
|
2240
|
-
es: "Tarjetas multimedia en build para enlaces externos.",
|
|
2241
|
-
de: "Rich-Media-Karten für externe Links zur Build-Zeit.",
|
|
2242
|
-
fr: "Cartes média construites à la compilation pour les liens externes.",
|
|
2243
|
-
ko: "외부 링크의 빌드 시점 리치 미디어 카드."
|
|
2244
|
-
}
|
|
2245
|
-
},
|
|
2246
|
-
{
|
|
2247
|
-
slug: "deploy",
|
|
2248
|
-
desc: {
|
|
2249
|
-
en: "Static deployment output for hosting services.",
|
|
2250
|
-
ja: "ホスティングサービス向けの静的デプロイ出力。",
|
|
2251
|
-
"zh-CN": "面向托管服务的静态部署产物。",
|
|
2252
|
-
es: "Salida de despliegue estático para servicios de hosting.",
|
|
2253
|
-
de: "Statische Deployment-Ausgabe für Hosting-Dienste.",
|
|
2254
|
-
fr: "Sortie de déploiement statique pour les services d'hébergement.",
|
|
2255
|
-
ko: "호스팅 서비스용 정적 배포 산출물."
|
|
2256
|
-
}
|
|
2257
|
-
}
|
|
2258
|
-
]
|
|
2259
|
-
},
|
|
2260
|
-
{
|
|
2261
|
-
title: {
|
|
2262
|
-
en: "Content and developer experience",
|
|
2263
|
-
ja: "コンテンツと開発体験",
|
|
2264
|
-
"zh-CN": "内容与开发者体验",
|
|
2265
|
-
es: "Contenido y experiencia de desarrollo",
|
|
2266
|
-
de: "Content und Developer Experience",
|
|
2267
|
-
fr: "Contenu et expérience développeur",
|
|
2268
|
-
ko: "콘텐츠와 개발자 경험"
|
|
2269
|
-
},
|
|
2270
|
-
summary: {
|
|
2271
|
-
en: "Query, organize, and keep your content healthy.",
|
|
2272
|
-
ja: "コンテンツを検索・整理し、健全に保つ。",
|
|
2273
|
-
"zh-CN": "查询、整理并保持内容健康。",
|
|
2274
|
-
es: "Consulta, organiza y mantén sano tu contenido.",
|
|
2275
|
-
de: "Content abfragen, organisieren und gesund halten.",
|
|
2276
|
-
fr: "Requêter, organiser et garder votre contenu sain.",
|
|
2277
|
-
ko: "콘텐츠를 조회·정리하고 건강하게 유지."
|
|
2278
|
-
},
|
|
2279
|
-
plugins: [
|
|
2280
|
-
{
|
|
2281
|
-
slug: "dataview",
|
|
2282
|
-
desc: {
|
|
2283
|
-
en: "Build-time queries over your notes.",
|
|
2284
|
-
ja: "ノートに対するビルド時クエリ。",
|
|
2285
|
-
"zh-CN": "对笔记的构建时查询。",
|
|
2286
|
-
es: "Consultas en build sobre tus notas.",
|
|
2287
|
-
de: "Build-Zeit-Abfragen über deine Notizen.",
|
|
2288
|
-
fr: "Requêtes temps de build sur vos notes.",
|
|
2289
|
-
ko: "노트에 대한 빌드 시점 조회."
|
|
2290
|
-
}
|
|
2291
|
-
},
|
|
2292
|
-
{
|
|
2293
|
-
slug: "kanban",
|
|
2294
|
-
desc: {
|
|
2295
|
-
en: "Obsidian-style Kanban boards from Markdown lists.",
|
|
2296
|
-
ja: "Markdown リストから Obsidian スタイルのカンバンボードを作成。",
|
|
2297
|
-
"zh-CN": "从 Markdown 列表创建 Obsidian 风格看板。",
|
|
2298
|
-
es: "Tableros Kanban estilo Obsidian desde listas Markdown.",
|
|
2299
|
-
de: "Obsidian-ähnliche Kanban-Boards aus Markdown-Listen.",
|
|
2300
|
-
fr: "Tableaux Kanban façon Obsidian depuis des listes Markdown.",
|
|
2301
|
-
ko: "Markdown 목록에서 Obsidian 스타일 칸반 보드 생성."
|
|
2302
|
-
}
|
|
2303
|
-
},
|
|
2304
|
-
{
|
|
2305
|
-
slug: "responsive-image",
|
|
2306
|
-
desc: {
|
|
2307
|
-
en: "Responsive images with lazy loading.",
|
|
2308
|
-
ja: "レスポンシブ画像と遅延読み込み。",
|
|
2309
|
-
"zh-CN": "响应式图片与懒加载。",
|
|
2310
|
-
es: "Imágenes responsive con carga diferida.",
|
|
2311
|
-
de: "Responsive Bilder mit Lazy Loading.",
|
|
2312
|
-
fr: "Images responsives avec chargement différé.",
|
|
2313
|
-
ko: "지연 로딩 지원 반응형 이미지."
|
|
2314
|
-
}
|
|
2315
|
-
},
|
|
2316
|
-
{
|
|
2317
|
-
slug: "quality",
|
|
2318
|
-
desc: {
|
|
2319
|
-
en: "Static quality and accessibility checks.",
|
|
2320
|
-
ja: "静的品質・アクセシビリティ検査。",
|
|
2321
|
-
"zh-CN": "静态质量与可访问性检查。",
|
|
2322
|
-
es: "Inspección estática de calidad y accesibilidad.",
|
|
2323
|
-
de: "Statische Qualitäts- und Barrierefreiheitsprüfung.",
|
|
2324
|
-
fr: "Contrôle statique de qualité et d'accessibilité.",
|
|
2325
|
-
ko: "정적 품질·접근성 검사."
|
|
2326
|
-
}
|
|
2327
|
-
}
|
|
2328
|
-
]
|
|
2329
|
-
}
|
|
2330
|
-
];
|
|
2331
|
-
function pluginsContent(language) {
|
|
2332
|
-
const copy = PLUGINS_COPY;
|
|
2333
|
-
const categories = PLUGIN_CATEGORIES;
|
|
2334
|
-
const lines = [frontmatter()];
|
|
2335
|
-
lines.push(heading(1, read(copy.title, language)), "");
|
|
2336
|
-
lines.push(read(copy.intro, language), "");
|
|
2337
|
-
lines.push(heading(2, read(copy.installHeading, language)), "");
|
|
2338
|
-
lines.push(read(copy.installStep1, language), "");
|
|
2339
|
-
lines.push(codeBlock("sh", "npm install @riebeckite/plugin-mermaid"));
|
|
2340
|
-
lines.push(read(copy.installStep2, language), "");
|
|
2341
|
-
lines.push(
|
|
2342
|
-
codeBlock(
|
|
2343
|
-
"ts",
|
|
2344
|
-
[
|
|
2345
|
-
'import { defineConfig } from "@riebeckite/core";',
|
|
2346
|
-
'import { l10n } from "@riebeckite/plugin-l10n";',
|
|
2347
|
-
'import { mermaid } from "@riebeckite/plugin-mermaid";',
|
|
2348
|
-
'import { obsidianMarkdown } from "@riebeckite/plugin-obsidian-markdown";',
|
|
2349
|
-
"",
|
|
2350
|
-
"export default defineConfig({",
|
|
2351
|
-
" // ...",
|
|
2352
|
-
" plugins: [obsidianMarkdown(), l10n({ ... }), mermaid()],",
|
|
2353
|
-
"});"
|
|
2354
|
-
].join("\n")
|
|
2355
|
-
)
|
|
2356
|
-
);
|
|
2357
|
-
lines.push(read(copy.fullList, language), "");
|
|
2358
|
-
lines.push(
|
|
2359
|
-
`[${read(copy.fullListLabel, language)}](${PLUGIN_INDEX_URL})`,
|
|
2360
|
-
""
|
|
2361
|
-
);
|
|
2362
|
-
for (const category of categories) {
|
|
2363
|
-
lines.push(heading(2, read(category.title, language)), "");
|
|
2364
|
-
lines.push(read(category.summary, language), "");
|
|
2365
|
-
lines.push(
|
|
2366
|
-
`| ${read(copy.columnPlugin, language)} | ${read(copy.columnDescription, language)} |`
|
|
2367
|
-
);
|
|
2368
|
-
lines.push("| --- | --- |");
|
|
2369
|
-
for (const plugin of category.plugins) {
|
|
2370
|
-
const packageName = `@riebeckite/plugin-${plugin.slug}`;
|
|
2371
|
-
lines.push(
|
|
2372
|
-
`| [\`${packageName}\`](${pluginReadmeUrl(plugin.slug)}) | ${read(plugin.desc, language)} |`
|
|
1902
|
+
function pluginReadmeUrl(slug) {
|
|
1903
|
+
return `https://github.com/Rerurate514/riebeckite/blob/main/packages/plugins/${slug}/README.md`;
|
|
1904
|
+
}
|
|
1905
|
+
function themeReadmeUrl(slug) {
|
|
1906
|
+
return `https://github.com/Rerurate514/riebeckite/blob/main/packages/themes/${slug}/README.md`;
|
|
1907
|
+
}
|
|
1908
|
+
function contentPageFiles(variables, preset) {
|
|
1909
|
+
const defaultLang = defaultLanguageForLocale(variables.locale);
|
|
1910
|
+
const files = [];
|
|
1911
|
+
const localized = preset.languages.length > 1;
|
|
1912
|
+
const pushLocalized = (basePath, build) => {
|
|
1913
|
+
if (!localized) {
|
|
1914
|
+
files.push({
|
|
1915
|
+
path: `content/${basePath}.md`,
|
|
1916
|
+
content: build(defaultLang)
|
|
1917
|
+
});
|
|
1918
|
+
return;
|
|
1919
|
+
}
|
|
1920
|
+
for (const language of SCAFFOLD_LANGUAGES) {
|
|
1921
|
+
const suffix = language === defaultLang ? "" : `.${language}`;
|
|
1922
|
+
files.push({
|
|
1923
|
+
path: `content/${basePath}${suffix}.md`,
|
|
1924
|
+
content: build(language)
|
|
1925
|
+
});
|
|
1926
|
+
}
|
|
1927
|
+
};
|
|
1928
|
+
const pushEnglishOnly = (basePath, build) => {
|
|
1929
|
+
const suffix = defaultLang === "en" ? "" : ".en";
|
|
1930
|
+
files.push({
|
|
1931
|
+
path: `content/${basePath}${suffix}.md`,
|
|
1932
|
+
content: build()
|
|
1933
|
+
});
|
|
1934
|
+
};
|
|
1935
|
+
for (const page of preset.contentPages) {
|
|
1936
|
+
if (page === "framework/plugins") {
|
|
1937
|
+
pushLocalized(
|
|
1938
|
+
"framework/plugins",
|
|
1939
|
+
(language) => pluginsContent(language)
|
|
1940
|
+
);
|
|
1941
|
+
} else if (page === "framework/themes") {
|
|
1942
|
+
pushLocalized(
|
|
1943
|
+
"framework/themes",
|
|
1944
|
+
(language) => themesContent(language, preset)
|
|
1945
|
+
);
|
|
1946
|
+
} else if (page === "examples") {
|
|
1947
|
+
pushLocalized(
|
|
1948
|
+
"examples",
|
|
1949
|
+
(language) => examplesContent(preset, language)
|
|
2373
1950
|
);
|
|
1951
|
+
} else if (page === "reference/plugins") {
|
|
1952
|
+
pushEnglishOnly(
|
|
1953
|
+
"reference/plugins",
|
|
1954
|
+
() => referencePluginsContent(preset, variables)
|
|
1955
|
+
);
|
|
1956
|
+
} else if (page === "reference/themes") {
|
|
1957
|
+
pushEnglishOnly("reference/themes", () => referenceThemesContent(preset));
|
|
2374
1958
|
}
|
|
2375
|
-
lines.push("");
|
|
2376
1959
|
}
|
|
2377
|
-
|
|
2378
|
-
lines.push(
|
|
2379
|
-
`Riebeckite: [documentation](${HELPERS.en}) · [日本語ドキュメント](${HELPERS.ja})`,
|
|
2380
|
-
""
|
|
2381
|
-
);
|
|
2382
|
-
lines.push("");
|
|
2383
|
-
return lines.join("\n");
|
|
1960
|
+
return files;
|
|
2384
1961
|
}
|
|
2385
|
-
function
|
|
2386
|
-
return language
|
|
1962
|
+
function read(text2, language) {
|
|
1963
|
+
return text2[language];
|
|
2387
1964
|
}
|
|
2388
|
-
|
|
2389
|
-
|
|
2390
|
-
|
|
2391
|
-
|
|
1965
|
+
function frontmatter() {
|
|
1966
|
+
return ["---", "publish: true", "---", ""].join("\n");
|
|
1967
|
+
}
|
|
1968
|
+
function heading(level, text2) {
|
|
1969
|
+
return `${"#".repeat(level)} ${text2}`;
|
|
1970
|
+
}
|
|
1971
|
+
function codeBlock(language, code) {
|
|
1972
|
+
return `\`\`\`${language}
|
|
1973
|
+
${code}
|
|
1974
|
+
\`\`\`
|
|
1975
|
+
`;
|
|
1976
|
+
}
|
|
1977
|
+
var THEMES_COPY = {
|
|
1978
|
+
title: {
|
|
1979
|
+
en: "Themes",
|
|
1980
|
+
ja: "テーマ",
|
|
1981
|
+
"zh-CN": "主题",
|
|
1982
|
+
es: "Temas",
|
|
1983
|
+
de: "Themen",
|
|
1984
|
+
fr: "Thèmes",
|
|
1985
|
+
ko: "테마"
|
|
2392
1986
|
},
|
|
2393
1987
|
intro: {
|
|
2394
|
-
en: "
|
|
2395
|
-
ja: "
|
|
2396
|
-
|
|
2397
|
-
|
|
2398
|
-
|
|
2399
|
-
|
|
2400
|
-
|
|
2401
|
-
"@riebeckite/plugin-canvas",
|
|
2402
|
-
"@riebeckite/plugin-flashcards"
|
|
2403
|
-
];
|
|
2404
|
-
var STARTER_EXAMPLES = {
|
|
2405
|
-
heading: {
|
|
2406
|
-
en: "Example",
|
|
2407
|
-
ja: "サンプル"
|
|
1988
|
+
en: "A theme changes the whole look and feel of a site — colors, typography, and layout — without touching your content or routes. Riebeckite ships with six themes; switch by installing a package and changing one line.",
|
|
1989
|
+
ja: "テーマを変えるだけで、色・文字組み・レイアウトといったサイト全体の見た目が変わります。コンテンツやルートには一切触れる必要はありません。Riebeckite には 6 つのテーマが用意されており、パッケージをインストールして 1 行書き換えるだけで切り替えられます。",
|
|
1990
|
+
"zh-CN": "主题能整体改变站点的观感——配色、排版与布局——而无需改动你的内容或路由。Riebeckite 内置六个主题,安装一个包、改一行配置即可切换。",
|
|
1991
|
+
es: "Un tema cambia toda la apariencia del sitio — colores, tipografía y diseño — sin tocar tu contenido ni tus rutas. Riebeckite incluye seis temas: instala un paquete y cambia una línea.",
|
|
1992
|
+
de: "Ein Theme verändert das gesamte Erscheinungsbild einer Seite — Farben, Typografie, Layout — ohne dass du Inhalte oder Routen anfasst. Riebeckite bringt sechs Themes mit; der Wechsel ist eine Paketinstallation plus eine Zeile.",
|
|
1993
|
+
fr: "Un thème change tout l'aspect d'un site — couleurs, typographie, mise en page — sans toucher au contenu ni aux routes. Riebeckite fournit six thèmes ; installez un paquet et changez une ligne.",
|
|
1994
|
+
ko: "테마를 바꾸면 색상·타이포그래피·레이아웃 등 사이트 전체 분위기가 달라집니다. 콘텐츠나 라우트는 건드릴 필요가 없습니다. Riebeckite는 6개 테마를 제공하며 패키지 설치 후 한 줄만 바꾸면 전환됩니다."
|
|
2408
1995
|
},
|
|
2409
|
-
|
|
2410
|
-
en: "
|
|
2411
|
-
ja: "
|
|
1996
|
+
galleryHeading: {
|
|
1997
|
+
en: "Theme gallery",
|
|
1998
|
+
ja: "テーマギャラリー",
|
|
1999
|
+
"zh-CN": "主题画廊",
|
|
2000
|
+
es: "Galería de temas",
|
|
2001
|
+
de: "Theme-Galerie",
|
|
2002
|
+
fr: "Galerie des thèmes",
|
|
2003
|
+
ko: "테마 갤러리"
|
|
2412
2004
|
},
|
|
2413
|
-
|
|
2414
|
-
en: "
|
|
2415
|
-
ja: "
|
|
2005
|
+
switchHeading: {
|
|
2006
|
+
en: "Switching themes",
|
|
2007
|
+
ja: "テーマの切り替え",
|
|
2008
|
+
"zh-CN": "切换主题",
|
|
2009
|
+
es: "Cambiar de tema",
|
|
2010
|
+
de: "Theme wechseln",
|
|
2011
|
+
fr: "Changer de thème",
|
|
2012
|
+
ko: "테마 전환"
|
|
2416
2013
|
},
|
|
2417
|
-
|
|
2418
|
-
en: "
|
|
2419
|
-
ja: "
|
|
2014
|
+
switchCurrent: {
|
|
2015
|
+
en: "This starter uses `@riebeckite/theme-default`. To try another theme:",
|
|
2016
|
+
ja: "このスターターは `@riebeckite/theme-default` を使っています。別のテーマを試すには:",
|
|
2017
|
+
"zh-CN": "本模板使用 `@riebeckite/theme-default`。想尝试其他主题:",
|
|
2018
|
+
es: "Este starter usa `@riebeckite/theme-default`. Para probar otro tema:",
|
|
2019
|
+
de: "Dieser Starter verwendet `@riebeckite/theme-default`. Um ein anderes Theme zu testen:",
|
|
2020
|
+
fr: "Ce starter utilise `@riebeckite/theme-default`. Pour essayer un autre thème :",
|
|
2021
|
+
ko: "이 스타터는 `@riebeckite/theme-default`를 사용합니다. 다른 테마를 시도하려면:"
|
|
2420
2022
|
},
|
|
2421
|
-
|
|
2422
|
-
en: "
|
|
2423
|
-
ja: "
|
|
2023
|
+
switchStep1: {
|
|
2024
|
+
en: "Install the package:",
|
|
2025
|
+
ja: "パッケージをインストール:",
|
|
2026
|
+
"zh-CN": "安装该包:",
|
|
2027
|
+
es: "Instala el paquete:",
|
|
2028
|
+
de: "Installiere das Paket:",
|
|
2029
|
+
fr: "Installez le paquet :",
|
|
2030
|
+
ko: "패키지를 설치합니다:"
|
|
2424
2031
|
},
|
|
2425
|
-
|
|
2426
|
-
en: "
|
|
2427
|
-
ja: "
|
|
2032
|
+
switchStep2: {
|
|
2033
|
+
en: "Point `theme` at the new factory in `riebeckite.config.ts`:",
|
|
2034
|
+
ja: "`riebeckite.config.ts` の `theme` を新しいファクトリに変更:",
|
|
2035
|
+
"zh-CN": "在 `riebeckite.config.ts` 中将 `theme` 指向新工厂函数:",
|
|
2036
|
+
es: "Apunta `theme` al nuevo factory en `riebeckite.config.ts`:",
|
|
2037
|
+
de: "Setze `theme` in `riebeckite.config.ts` auf den neuen Factory:",
|
|
2038
|
+
fr: "Pointez `theme` vers le nouveau factory dans `riebeckite.config.ts` :",
|
|
2039
|
+
ko: "`riebeckite.config.ts`의 `theme`를 새 팩토리로 변경합니다:"
|
|
2428
2040
|
},
|
|
2429
|
-
|
|
2430
|
-
en: "
|
|
2431
|
-
ja: "
|
|
2041
|
+
tableHeading: {
|
|
2042
|
+
en: "The bundled themes",
|
|
2043
|
+
ja: "同梱テーマ一覧",
|
|
2044
|
+
"zh-CN": "内置主题一览",
|
|
2045
|
+
es: "Los temas incluidos",
|
|
2046
|
+
de: "Die mitgelieferten Themes",
|
|
2047
|
+
fr: "Les thèmes inclus",
|
|
2048
|
+
ko: "내장 테마 목록"
|
|
2432
2049
|
},
|
|
2433
|
-
|
|
2434
|
-
en: "
|
|
2435
|
-
ja: "
|
|
2050
|
+
columnTheme: {
|
|
2051
|
+
en: "Theme",
|
|
2052
|
+
ja: "テーマ",
|
|
2053
|
+
"zh-CN": "主题",
|
|
2054
|
+
es: "Tema",
|
|
2055
|
+
de: "Theme",
|
|
2056
|
+
fr: "Thème",
|
|
2057
|
+
ko: "테마"
|
|
2058
|
+
},
|
|
2059
|
+
columnDescription: {
|
|
2060
|
+
en: "Description",
|
|
2061
|
+
ja: "説明",
|
|
2062
|
+
"zh-CN": "说明",
|
|
2063
|
+
es: "Descripción",
|
|
2064
|
+
de: "Beschreibung",
|
|
2065
|
+
fr: "Description",
|
|
2066
|
+
ko: "설명"
|
|
2067
|
+
},
|
|
2068
|
+
note: {
|
|
2069
|
+
en: "Every theme supports light/dark color modes, typography, and article layouts; see each README for the full option list.",
|
|
2070
|
+
ja: "すべてのテーマでライト/ダーク切り替え、文字組み、記事レイアウトをサポートしています。詳しいオプションは各 README を参照してください。",
|
|
2071
|
+
"zh-CN": "所有主题都支持明暗配色、排版与文章布局,完整选项请见各 README。",
|
|
2072
|
+
es: "Todos los temas admiten modos claro/oscuro, tipografía y diseño de artículo; consulta cada README para la lista completa de opciones.",
|
|
2073
|
+
de: "Jedes Theme unterstützt Hell/Dunkel-Modi, Typografie und Artikel-Layouts; die vollständige Optionsliste steht im jeweiligen README.",
|
|
2074
|
+
fr: "Chaque thème prend en charge les modes clair/sombre, la typographie et les mises en page d'article ; voir chaque README pour la liste complète des options.",
|
|
2075
|
+
ko: "모든 테마가 라이트/다크 모드, 타이포그래피, 아티클 레이아웃을 지원합니다. 전체 옵션은 각 README를 참조하세요."
|
|
2436
2076
|
}
|
|
2437
2077
|
};
|
|
2438
|
-
|
|
2439
|
-
|
|
2440
|
-
|
|
2441
|
-
|
|
2442
|
-
|
|
2443
|
-
|
|
2444
|
-
|
|
2445
|
-
|
|
2446
|
-
|
|
2447
|
-
|
|
2448
|
-
|
|
2449
|
-
|
|
2450
|
-
|
|
2451
|
-
|
|
2452
|
-
|
|
2453
|
-
|
|
2454
|
-
|
|
2455
|
-
|
|
2456
|
-
|
|
2457
|
-
|
|
2458
|
-
|
|
2459
|
-
|
|
2460
|
-
|
|
2461
|
-
|
|
2462
|
-
|
|
2463
|
-
"",
|
|
2464
|
-
readSummary(STARTER_EXAMPLES.frontmatterBody, language),
|
|
2465
|
-
"",
|
|
2466
|
-
codeBlock(
|
|
2467
|
-
"yaml",
|
|
2468
|
-
["---", "publish: true", "title: Example", "---"].join("\n")
|
|
2469
|
-
),
|
|
2470
|
-
""
|
|
2471
|
-
].join("\n");
|
|
2472
|
-
}
|
|
2473
|
-
function examplesContent(preset, language) {
|
|
2474
|
-
if (preset.name === "starter") return starterExamplesContent(language);
|
|
2475
|
-
const lines = [
|
|
2476
|
-
frontmatter(),
|
|
2477
|
-
heading(1, readSummary(EXAMPLES_COPY.heading, language)),
|
|
2478
|
-
"",
|
|
2479
|
-
readSummary(EXAMPLES_COPY.intro, language),
|
|
2480
|
-
""
|
|
2481
|
-
];
|
|
2482
|
-
for (const key of README_DEMO_ORDER) {
|
|
2483
|
-
const packageName = demoPackage(key);
|
|
2484
|
-
if (!hasPlugin(preset, packageName)) continue;
|
|
2485
|
-
const demo = README_DEMOS[key];
|
|
2486
|
-
lines.push(heading(2, readSummary(demo.title, language)), "");
|
|
2487
|
-
lines.push(readSummary(demo.intro, language), "");
|
|
2488
|
-
lines.push(demo.markdown, "");
|
|
2489
|
-
}
|
|
2490
|
-
if (preset.name === "showcase") {
|
|
2491
|
-
for (const packageName of SHOWCASE_GUIDE_DEMOS) {
|
|
2492
|
-
if (!hasPlugin(preset, packageName)) continue;
|
|
2493
|
-
const guide = PLUGIN_MARKDOWN_GUIDES[packageName];
|
|
2494
|
-
if (!guide) continue;
|
|
2495
|
-
lines.push(
|
|
2496
|
-
heading(2, packageName.replace("@riebeckite/plugin-", "")),
|
|
2497
|
-
""
|
|
2498
|
-
);
|
|
2499
|
-
lines.push(guide.summary, "");
|
|
2500
|
-
lines.push(guide.markdown, "");
|
|
2078
|
+
var THEMES = [
|
|
2079
|
+
{
|
|
2080
|
+
slug: "default",
|
|
2081
|
+
factory: "defaultTheme()",
|
|
2082
|
+
desc: {
|
|
2083
|
+
en: "The default theme: clean design tokens, light/dark/system color modes, and article layouts.",
|
|
2084
|
+
ja: "デフォルトテーマ:クリーンなデザイントークン、ライト/ダーク/システムのカラーモード、記事レイアウト。",
|
|
2085
|
+
"zh-CN": "默认主题:简洁的设计令牌、浅色/深色/系统配色与文章布局。",
|
|
2086
|
+
es: "El tema por defecto: tokens limpios, modos claro/oscuro/sistema y distintos diseños de artículo.",
|
|
2087
|
+
de: "Das Standard-Theme: klare Design-Tokens, Licht/Dunkel/System-Modi und Artikel-Layouts.",
|
|
2088
|
+
fr: "Le thème par défaut : tokens épurés, modes clair/sombre/système et mises en page d'article.",
|
|
2089
|
+
ko: "기본 테마: 깔끔한 디자인 토큰, 라이트/다크/시스템 컬러 모드, 아티클 레이아웃."
|
|
2090
|
+
}
|
|
2091
|
+
},
|
|
2092
|
+
{
|
|
2093
|
+
slug: "minimal",
|
|
2094
|
+
factory: "minimalTheme()",
|
|
2095
|
+
desc: {
|
|
2096
|
+
en: "A quiet, typography-first theme.",
|
|
2097
|
+
ja: "文字組みを重視した静かなテーマ。",
|
|
2098
|
+
"zh-CN": "以排版为先的简洁主题。",
|
|
2099
|
+
es: "Un tema sobrio, centrado en la tipografía.",
|
|
2100
|
+
de: "Ein ruhiges, typografieorientiertes Theme.",
|
|
2101
|
+
fr: "Un thème sobre, axé sur la typographie.",
|
|
2102
|
+
ko: "타이포그래피 우선의 차분한 테마."
|
|
2501
2103
|
}
|
|
2502
|
-
}
|
|
2503
|
-
|
|
2504
|
-
|
|
2505
|
-
|
|
2506
|
-
|
|
2507
|
-
|
|
2508
|
-
|
|
2509
|
-
|
|
2510
|
-
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
lines.push("| Package | Factory | Options |");
|
|
2515
|
-
lines.push("| --- | --- | --- |");
|
|
2516
|
-
for (const plugin of preset.plugins) {
|
|
2517
|
-
const options = readmePluginOptions(variables, preset, plugin);
|
|
2518
|
-
const cell = options === null ? "—" : `\`${options}\``;
|
|
2519
|
-
lines.push(
|
|
2520
|
-
`| [\`${plugin.package}\`](${pluginReadmeUrl(plugin.package.replace(/^@riebeckite\/plugin-/, ""))}) | \`${plugin.factory}\` | ${cell} |`
|
|
2521
|
-
);
|
|
2522
|
-
}
|
|
2523
|
-
lines.push("");
|
|
2524
|
-
lines.push(heading(2, "Markdown behavior"), "");
|
|
2525
|
-
lines.push(
|
|
2526
|
-
"Every registered plugin is listed below with the Markdown that triggers it,",
|
|
2527
|
-
"or with the Markdown/frontmatter/content shape it reads when the plugin is",
|
|
2528
|
-
"site-wide rather than block-based. Paste the examples into files under",
|
|
2529
|
-
"`content/` and run `npm exec riebeckite dev` to inspect the rendered result.",
|
|
2530
|
-
""
|
|
2531
|
-
);
|
|
2532
|
-
for (const plugin of preset.plugins) {
|
|
2533
|
-
const demoKeys = README_DEMO_ORDER.filter(
|
|
2534
|
-
(key) => demoPackage(key) === plugin.package
|
|
2535
|
-
);
|
|
2536
|
-
const guide = PLUGIN_MARKDOWN_GUIDES[plugin.package];
|
|
2537
|
-
const slug = plugin.package.replace(/^@riebeckite\/plugin-/, "");
|
|
2538
|
-
lines.push(heading(3, plugin.package), "");
|
|
2539
|
-
lines.push(
|
|
2540
|
-
`Factory: \`${plugin.factory}\` · [README](${pluginReadmeUrl(slug)})`,
|
|
2541
|
-
""
|
|
2542
|
-
);
|
|
2543
|
-
if (guide) {
|
|
2544
|
-
lines.push(guide.summary, "");
|
|
2545
|
-
lines.push(guide.markdown, "");
|
|
2104
|
+
},
|
|
2105
|
+
{
|
|
2106
|
+
slug: "sakura",
|
|
2107
|
+
factory: "sakuraTheme()",
|
|
2108
|
+
desc: {
|
|
2109
|
+
en: "A soft pink palette with warm accents.",
|
|
2110
|
+
ja: "やわらかいピンクと温かみのあるアクセントのテーマ。",
|
|
2111
|
+
"zh-CN": "柔和的粉色配色与温暖点缀。",
|
|
2112
|
+
es: "Una paleta rosa suave con acentos cálidos.",
|
|
2113
|
+
de: "Eine weiche rosa Palette mit warmen Akzenten.",
|
|
2114
|
+
fr: "Une palette rose douce aux accents chaleureux.",
|
|
2115
|
+
ko: "부드러운 핑크 팔레트와 따뜻한 액센트."
|
|
2546
2116
|
}
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
|
|
2551
|
-
|
|
2117
|
+
},
|
|
2118
|
+
{
|
|
2119
|
+
slug: "gruvbox",
|
|
2120
|
+
factory: "gruvboxTheme()",
|
|
2121
|
+
desc: {
|
|
2122
|
+
en: "A warm, retro palette inspired by Gruvbox.",
|
|
2123
|
+
ja: "Gruvbox 風の温かみのあるレトロパレット。",
|
|
2124
|
+
"zh-CN": "受 Gruvbox 启发的温暖复古配色。",
|
|
2125
|
+
es: "Una paleta retro cálida inspirada en Gruvbox.",
|
|
2126
|
+
de: "Eine warme, von Gruvbox inspirierte Retro-Palette.",
|
|
2127
|
+
fr: "Une palette rétro chaleureuse inspirée de Gruvbox.",
|
|
2128
|
+
ko: "Gruvbox에서 영감을 받은 따뜻한 레트로 팔레트."
|
|
2552
2129
|
}
|
|
2553
|
-
|
|
2554
|
-
|
|
2555
|
-
|
|
2556
|
-
|
|
2557
|
-
|
|
2130
|
+
},
|
|
2131
|
+
{
|
|
2132
|
+
slug: "tokyonight",
|
|
2133
|
+
factory: "tokyonightTheme()",
|
|
2134
|
+
desc: {
|
|
2135
|
+
en: "A modern night palette with an optional neon accent.",
|
|
2136
|
+
ja: "ネオンオプション付きのモダンなナイトパレット。",
|
|
2137
|
+
"zh-CN": "现代夜间配色,可选霓虹点缀。",
|
|
2138
|
+
es: "Una paleta nocturna moderna con acento neón opcional.",
|
|
2139
|
+
de: "Eine moderne Night-Palette mit optionalem Neon-Akzent.",
|
|
2140
|
+
fr: "Une palette nocturne moderne avec accent néon optionnel.",
|
|
2141
|
+
ko: "네온 액센트를 선택할 수 있는 모던한 나이트 팔레트."
|
|
2142
|
+
}
|
|
2143
|
+
},
|
|
2144
|
+
{
|
|
2145
|
+
slug: "rerurate",
|
|
2146
|
+
factory: "rerurateTheme()",
|
|
2147
|
+
desc: {
|
|
2148
|
+
en: "The author's personal design language.",
|
|
2149
|
+
ja: "作者自身のデザインをテーマにしたテーマ。",
|
|
2150
|
+
"zh-CN": "作者个人的设计风格主题。",
|
|
2151
|
+
es: "El lenguaje de diseño personal del autor.",
|
|
2152
|
+
de: "Die persönliche Designsprache des Autors.",
|
|
2153
|
+
fr: "Le langage de design personnel de l'auteur.",
|
|
2154
|
+
ko: "저자의 개인 디자인 언어 테마."
|
|
2558
2155
|
}
|
|
2559
2156
|
}
|
|
2560
|
-
|
|
2561
|
-
|
|
2562
|
-
|
|
2157
|
+
];
|
|
2158
|
+
var THEME_LABELS = {
|
|
2159
|
+
default: "Default",
|
|
2160
|
+
minimal: "Minimal",
|
|
2161
|
+
sakura: "Sakura",
|
|
2162
|
+
gruvbox: "Gruvbox",
|
|
2163
|
+
tokyonight: "Tokyo Night",
|
|
2164
|
+
rerurate: "Rerurate"
|
|
2165
|
+
};
|
|
2166
|
+
function themeGalleryFence(description) {
|
|
2167
|
+
const items = ["columns: 3", "items:"];
|
|
2168
|
+
for (const theme of THEMES) {
|
|
2169
|
+
const label = THEME_LABELS[theme.slug] ?? theme.slug;
|
|
2170
|
+
items.push(` - title: ${JSON.stringify(label)}`);
|
|
2171
|
+
items.push(` description: ${JSON.stringify(description(theme))}`);
|
|
2172
|
+
items.push(` meta: ${JSON.stringify(theme.factory)}`);
|
|
2173
|
+
items.push(` href: ${JSON.stringify(themeReadmeUrl(theme.slug))}`);
|
|
2174
|
+
}
|
|
2175
|
+
return fence("gallery", items.join("\n"));
|
|
2563
2176
|
}
|
|
2564
|
-
function
|
|
2177
|
+
function themesContent(language, preset) {
|
|
2178
|
+
const copy = THEMES_COPY;
|
|
2565
2179
|
const lines = [frontmatter()];
|
|
2566
|
-
lines.push(heading(1,
|
|
2567
|
-
lines.push(
|
|
2568
|
-
"The bundled themes. Switch by installing a package and changing the",
|
|
2569
|
-
"`theme` factory in `riebeckite.config.ts`.",
|
|
2570
|
-
""
|
|
2571
|
-
);
|
|
2180
|
+
lines.push(heading(1, read(copy.title, language)), "");
|
|
2181
|
+
lines.push(read(copy.intro, language), "");
|
|
2572
2182
|
if (hasPlugin(preset, GALLERY_PACKAGE)) {
|
|
2573
|
-
lines.push(heading(2,
|
|
2183
|
+
lines.push(heading(2, read(copy.galleryHeading, language)), "");
|
|
2574
2184
|
lines.push(
|
|
2575
|
-
themeGalleryFence((theme) => theme.desc
|
|
2185
|
+
themeGalleryFence((theme) => read(theme.desc, language)),
|
|
2576
2186
|
""
|
|
2577
2187
|
);
|
|
2578
2188
|
}
|
|
2579
|
-
lines.push(
|
|
2580
|
-
lines.push(
|
|
2189
|
+
lines.push(heading(2, read(copy.switchHeading, language)), "");
|
|
2190
|
+
lines.push(read(copy.switchCurrent, language), "");
|
|
2191
|
+
lines.push(read(copy.switchStep1, language), "");
|
|
2192
|
+
lines.push(codeBlock("sh", "npm install @riebeckite/theme-sakura"));
|
|
2193
|
+
lines.push(read(copy.switchStep2, language), "");
|
|
2194
|
+
lines.push(
|
|
2195
|
+
codeBlock(
|
|
2196
|
+
"ts",
|
|
2197
|
+
[
|
|
2198
|
+
'import { sakuraTheme } from "@riebeckite/theme-sakura";',
|
|
2199
|
+
"",
|
|
2200
|
+
"export default defineConfig({",
|
|
2201
|
+
" theme: sakuraTheme(),",
|
|
2202
|
+
"});"
|
|
2203
|
+
].join("\n")
|
|
2204
|
+
)
|
|
2205
|
+
);
|
|
2206
|
+
lines.push(heading(2, read(copy.tableHeading, language)), "");
|
|
2207
|
+
lines.push(
|
|
2208
|
+
`| ${read(copy.columnTheme, language)} | ${read(copy.columnDescription, language)} |`
|
|
2209
|
+
);
|
|
2210
|
+
lines.push("| --- | --- |");
|
|
2581
2211
|
for (const theme of THEMES) {
|
|
2582
2212
|
const packageName = `@riebeckite/theme-${theme.slug}`;
|
|
2583
2213
|
lines.push(
|
|
2584
|
-
`| [\`${packageName}\`](${themeReadmeUrl(theme.slug)})
|
|
2214
|
+
`| [\`${packageName}\`](${themeReadmeUrl(theme.slug)}) · \`${theme.factory}\` | ${read(theme.desc, language)} |`
|
|
2585
2215
|
);
|
|
2586
2216
|
}
|
|
2587
|
-
lines.push("");
|
|
2588
|
-
lines.push(
|
|
2589
|
-
lines.push("");
|
|
2590
|
-
|
|
2591
|
-
|
|
2592
|
-
|
|
2593
|
-
|
|
2594
|
-
var
|
|
2595
|
-
|
|
2596
|
-
|
|
2597
|
-
|
|
2598
|
-
|
|
2599
|
-
|
|
2600
|
-
|
|
2601
|
-
|
|
2602
|
-
|
|
2217
|
+
lines.push("");
|
|
2218
|
+
lines.push(heading(2, read(copy.note, language)), "");
|
|
2219
|
+
lines.push("");
|
|
2220
|
+
lines.push(`[Riebeckite themes on GitHub](${THEMES_INDEX_URL})`, "");
|
|
2221
|
+
lines.push("");
|
|
2222
|
+
return lines.join("\n");
|
|
2223
|
+
}
|
|
2224
|
+
var PLUGINS_COPY = {
|
|
2225
|
+
title: {
|
|
2226
|
+
en: "Plugins",
|
|
2227
|
+
ja: "プラグイン",
|
|
2228
|
+
"zh-CN": "插件",
|
|
2229
|
+
es: "Plugins",
|
|
2230
|
+
de: "Plugins",
|
|
2231
|
+
fr: "Plugins",
|
|
2232
|
+
ko: "플러그인"
|
|
2233
|
+
},
|
|
2234
|
+
intro: {
|
|
2235
|
+
en: "Riebeckite's power comes from its plugin ecosystem — over fifty packages that extend Markdown, rendering, search, SEO, and more. Below are representative examples grouped by capability; every entry links to its full README.",
|
|
2236
|
+
ja: "Riebeckite の力はプラグインエコシステムにあります——50 以上のパッケージが Markdown・描画・検索・SEO などを拡張します。ここでは代表的なプラグインを機能別に紹介します。各項目のリンクから詳細な README を参照できます。",
|
|
2237
|
+
"zh-CN": "Riebeckite 的强大来自其插件生态——五十多个扩展 Markdown、渲染、搜索、SEO 等的包。下面按能力分组展示代表性示例,每一项都链接到完整 README。",
|
|
2238
|
+
es: "El poder de Riebeckite viene de su ecosistema de plugins — más de cincuenta paquetes que extienden Markdown, renderizado, búsqueda, SEO y más. Aquí tienes ejemplos representativos agrupados por capacidad; cada uno enlaza a su README completo.",
|
|
2239
|
+
de: "Riebeckites Stärke kommt aus seinem Plugin-Ökosystem — über fünfzig Pakete, die Markdown, Rendering, Suche, SEO und mehr erweitern. Hier finden sich repräsentative Beispiele nach Fähigkeit gruppiert; jeder Eintrag verlinkt auf sein volles README.",
|
|
2240
|
+
fr: "La puissance de Riebeckite vient de son écosystème de plugins — plus de cinquante paquets qui étendent Markdown, le rendu, la recherche, le SEO et plus encore. Voici des exemples représentatifs groupés par capacité ; chaque entrée renvoie vers son README complet.",
|
|
2241
|
+
ko: "Riebeckite의 힘은 플러그인 생태계에 있습니다 — Markdown·렌더링·검색·SEO 등을 확장하는 50개 이상의 패키지. 아래는 기능별로 대표적인 예를 소개하며, 각 항목은 전체 README로 연결됩니다."
|
|
2242
|
+
},
|
|
2243
|
+
installHeading: {
|
|
2244
|
+
en: "Adding a plugin",
|
|
2245
|
+
ja: "プラグインの追加",
|
|
2246
|
+
"zh-CN": "添加插件",
|
|
2247
|
+
es: "Añadir un plugin",
|
|
2248
|
+
de: "Ein Plugin hinzufügen",
|
|
2249
|
+
fr: "Ajouter un plugin",
|
|
2250
|
+
ko: "플러그인 추가"
|
|
2251
|
+
},
|
|
2252
|
+
installStep1: {
|
|
2253
|
+
en: "Install the package:",
|
|
2254
|
+
ja: "パッケージをインストール:",
|
|
2255
|
+
"zh-CN": "安装该包:",
|
|
2256
|
+
es: "Instala el paquete:",
|
|
2257
|
+
de: "Installiere das Paket:",
|
|
2258
|
+
fr: "Installez le paquet :",
|
|
2259
|
+
ko: "패키지를 설치합니다:"
|
|
2260
|
+
},
|
|
2261
|
+
installStep2: {
|
|
2262
|
+
en: "Register it in the `plugins` array of `riebeckite.config.ts`:",
|
|
2263
|
+
ja: "`riebeckite.config.ts` の `plugins` 配列に登録:",
|
|
2264
|
+
"zh-CN": "在 `riebeckite.config.ts` 的 `plugins` 数组中注册:",
|
|
2265
|
+
es: "Regístralo en el array `plugins` de `riebeckite.config.ts`:",
|
|
2266
|
+
de: "Registriere es im `plugins`-Array der `riebeckite.config.ts`:",
|
|
2267
|
+
fr: "Enregistrez-le dans le tableau `plugins` de `riebeckite.config.ts` :",
|
|
2268
|
+
ko: "`riebeckite.config.ts`의 `plugins` 배열에 등록합니다:"
|
|
2269
|
+
},
|
|
2270
|
+
fullList: {
|
|
2271
|
+
en: "The complete plugin index lives in the repository:",
|
|
2272
|
+
ja: "全プラグインの一覧はリポジトリにあります:",
|
|
2273
|
+
"zh-CN": "完整的插件索引位于仓库中:",
|
|
2274
|
+
es: "El índice completo de plugins vive en el repositorio:",
|
|
2275
|
+
de: "Der vollständige Plugin-Index liegt im Repository:",
|
|
2276
|
+
fr: "L'index complet des plugins se trouve dans le dépôt :",
|
|
2277
|
+
ko: "전체 플러그인 목록은 저장소에 있습니다:"
|
|
2278
|
+
},
|
|
2279
|
+
fullListLabel: {
|
|
2280
|
+
en: "Riebeckite plugins on GitHub",
|
|
2281
|
+
ja: "GitHub の Riebeckite プラグイン",
|
|
2282
|
+
"zh-CN": "GitHub 上的 Riebeckite 插件",
|
|
2283
|
+
es: "Plugins de Riebeckite en GitHub",
|
|
2284
|
+
de: "Riebeckite-Plugins auf GitHub",
|
|
2285
|
+
fr: "Plugins Riebeckite sur GitHub",
|
|
2286
|
+
ko: "GitHub의 Riebeckite 플러그인"
|
|
2287
|
+
},
|
|
2288
|
+
columnPlugin: {
|
|
2289
|
+
en: "Plugin",
|
|
2290
|
+
ja: "プラグイン",
|
|
2291
|
+
"zh-CN": "插件",
|
|
2292
|
+
es: "Plugin",
|
|
2293
|
+
de: "Plugin",
|
|
2294
|
+
fr: "Plugin",
|
|
2295
|
+
ko: "플러그인"
|
|
2296
|
+
},
|
|
2297
|
+
columnDescription: {
|
|
2298
|
+
en: "What it does",
|
|
2299
|
+
ja: "できること",
|
|
2300
|
+
"zh-CN": "作用",
|
|
2301
|
+
es: "Qué hace",
|
|
2302
|
+
de: "Funktion",
|
|
2303
|
+
fr: "Rôle",
|
|
2304
|
+
ko: "기능"
|
|
2305
|
+
}
|
|
2306
|
+
};
|
|
2307
|
+
var PLUGIN_CATEGORIES = [
|
|
2308
|
+
{
|
|
2309
|
+
title: {
|
|
2310
|
+
en: "Markdown and notes",
|
|
2311
|
+
ja: "マークダウンとノート",
|
|
2312
|
+
"zh-CN": "Markdown 与笔记",
|
|
2313
|
+
es: "Markdown y notas",
|
|
2314
|
+
de: "Markdown und Notizen",
|
|
2315
|
+
fr: "Markdown et notes",
|
|
2316
|
+
ko: "마크다운과 노트"
|
|
2603
2317
|
},
|
|
2604
|
-
|
|
2605
|
-
|
|
2606
|
-
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
2612
|
-
|
|
2613
|
-
|
|
2614
|
-
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
|
|
2618
|
-
|
|
2619
|
-
|
|
2620
|
-
|
|
2621
|
-
|
|
2622
|
-
|
|
2623
|
-
|
|
2624
|
-
|
|
2625
|
-
|
|
2626
|
-
|
|
2318
|
+
summary: {
|
|
2319
|
+
en: "Everyday note-taking tuned for Obsidian vaults.",
|
|
2320
|
+
ja: "Obsidian ボールト向けの日常ノート機能。",
|
|
2321
|
+
"zh-CN": "为 Obsidian 库打造的日常笔记功能。",
|
|
2322
|
+
es: "Toma de notas diaria afinada para bóvedas Obsidian.",
|
|
2323
|
+
de: "Alltägliche Notizfunktionen, optimiert für Obsidian-Vaults.",
|
|
2324
|
+
fr: "Prise de notes quotidienne pensée pour les coffres Obsidian.",
|
|
2325
|
+
ko: "Obsidian 볼트에 맞춘 일상 노트 기능."
|
|
2326
|
+
},
|
|
2327
|
+
plugins: [
|
|
2328
|
+
{
|
|
2329
|
+
slug: "obsidian-markdown",
|
|
2330
|
+
desc: {
|
|
2331
|
+
en: "Obsidian-flavored Markdown: wikilinks, embeds, callouts, and tags.",
|
|
2332
|
+
ja: "Obsidian 風マークダウン:ウィキリンク・埋め込み・コールアウト・タグ。",
|
|
2333
|
+
"zh-CN": "Obsidian 风格 Markdown:双链、嵌入、标注与标签。",
|
|
2334
|
+
es: "Markdown estilo Obsidian: wikilinks, embeds, callouts y etiquetas.",
|
|
2335
|
+
de: "Obsidian-Markdown: Wikilinks, Einbettungen, Callouts und Tags.",
|
|
2336
|
+
fr: "Markdown façon Obsidian : wikilinks, embeds, callouts et tags.",
|
|
2337
|
+
ko: "Obsidian 스타일 마크다운: 위키링크, 임베드, 콜아웃, 태그."
|
|
2338
|
+
}
|
|
2339
|
+
},
|
|
2340
|
+
{
|
|
2341
|
+
slug: "attachment",
|
|
2342
|
+
desc: {
|
|
2343
|
+
en: "Renders attached files and embeds assets via wikilinks.",
|
|
2344
|
+
ja: "ウィキリンクによるファイル添付とアセットの埋め込み表示。",
|
|
2345
|
+
"zh-CN": "通过双链渲染附件并嵌入资源。",
|
|
2346
|
+
es: "Renderiza archivos adjuntos e incrusta assets con wikilinks.",
|
|
2347
|
+
de: "Rendert Dateianhänge und bettet Assets per Wikilinks ein.",
|
|
2348
|
+
fr: "Rend les fichiers joints et embarque les ressources via wikilinks.",
|
|
2349
|
+
ko: "위키링크로 첨부 파일을 렌더링하고 자산을 임베드."
|
|
2350
|
+
}
|
|
2351
|
+
},
|
|
2352
|
+
{
|
|
2353
|
+
slug: "media",
|
|
2354
|
+
desc: {
|
|
2355
|
+
en: "Audio and video embeds from plain links.",
|
|
2356
|
+
ja: "プレーンなリンクから音声・動画を埋め込み。",
|
|
2357
|
+
"zh-CN": "从普通链接嵌入音频和视频。",
|
|
2358
|
+
es: "Incrusta audio y vídeo desde enlaces simples.",
|
|
2359
|
+
de: "Audio- und Video-Embeds aus einfachen Links.",
|
|
2360
|
+
fr: "Embeds audio et vidéo depuis de simples liens.",
|
|
2361
|
+
ko: "일반 링크에서 오디오·비디오 임베드."
|
|
2362
|
+
}
|
|
2363
|
+
}
|
|
2364
|
+
]
|
|
2365
|
+
},
|
|
2366
|
+
{
|
|
2367
|
+
title: {
|
|
2368
|
+
en: "Diagrams and presentation",
|
|
2369
|
+
ja: "図とプレゼンテーション",
|
|
2370
|
+
"zh-CN": "图表与演示",
|
|
2371
|
+
es: "Diagramas y presentación",
|
|
2372
|
+
de: "Diagramme und Präsentation",
|
|
2373
|
+
fr: "Diagrammes et présentation",
|
|
2374
|
+
ko: "다이어그램과 프레젠테이션"
|
|
2375
|
+
},
|
|
2376
|
+
summary: {
|
|
2377
|
+
en: "Turn fenced code blocks into diagrams, charts, and slide decks.",
|
|
2378
|
+
ja: "フェンスコードブロックを図やチャート、スライドに変換。",
|
|
2379
|
+
"zh-CN": "将围栏代码块变成图表与幻灯片。",
|
|
2380
|
+
es: "Convierte bloques de código en diagramas, gráficas y diapositivas.",
|
|
2381
|
+
de: "Verwandle fenced Code-Blöcke in Diagramme, Charts und Folien.",
|
|
2382
|
+
fr: "Transformez des blocs de code en diagrammes, graphiques et diapositives.",
|
|
2383
|
+
ko: "fenced 코드 블록을 다이어그램·차트·슬라이드로 전환."
|
|
2384
|
+
},
|
|
2385
|
+
plugins: [
|
|
2386
|
+
{
|
|
2387
|
+
slug: "mermaid",
|
|
2388
|
+
desc: {
|
|
2389
|
+
en: "Mermaid diagrams from fenced code blocks.",
|
|
2390
|
+
ja: "フェンスコードブロックから Mermaid 図を描画。",
|
|
2391
|
+
"zh-CN": "从围栏代码块渲染 Mermaid 图表。",
|
|
2392
|
+
es: "Diagramas Mermaid desde bloques de código delimitados.",
|
|
2393
|
+
de: "Mermaid-Diagramme aus fenced Code-Blöcken.",
|
|
2394
|
+
fr: "Diagrammes Mermaid depuis des blocs de code délimités.",
|
|
2395
|
+
ko: "fenced 코드 블록에서 Mermaid 다이어그램 렌더링."
|
|
2396
|
+
}
|
|
2397
|
+
},
|
|
2398
|
+
{
|
|
2399
|
+
slug: "graphviz",
|
|
2400
|
+
desc: {
|
|
2401
|
+
en: "DOT / Graphviz diagrams.",
|
|
2402
|
+
ja: "DOT / Graphviz 図。",
|
|
2403
|
+
"zh-CN": "DOT / Graphviz 图表。",
|
|
2404
|
+
es: "Diagramas DOT / Graphviz.",
|
|
2405
|
+
de: "DOT / Graphviz-Diagramme.",
|
|
2406
|
+
fr: "Diagrammes DOT / Graphviz.",
|
|
2407
|
+
ko: "DOT / Graphviz 다이어그램."
|
|
2408
|
+
}
|
|
2409
|
+
},
|
|
2410
|
+
{
|
|
2411
|
+
slug: "d2",
|
|
2412
|
+
desc: {
|
|
2413
|
+
en: "Diagrams in the D2 language.",
|
|
2414
|
+
ja: "D2 言語によるダイアグラム。",
|
|
2415
|
+
"zh-CN": "使用 D2 语言绘制图表。",
|
|
2416
|
+
es: "Diagramas en lenguaje D2.",
|
|
2417
|
+
de: "Diagramme in der Sprache D2.",
|
|
2418
|
+
fr: "Diagrammes en langage D2.",
|
|
2419
|
+
ko: "D2 언어 다이어그램."
|
|
2420
|
+
}
|
|
2421
|
+
},
|
|
2422
|
+
{
|
|
2423
|
+
slug: "excalidraw",
|
|
2424
|
+
desc: {
|
|
2425
|
+
en: "Renders Excalidraw sketch files.",
|
|
2426
|
+
ja: "Excalidraw スケッチファイルを描画。",
|
|
2427
|
+
"zh-CN": "渲染 Excalidraw 草图文件。",
|
|
2428
|
+
es: "Renderiza bocetos de Excalidraw.",
|
|
2429
|
+
de: "Rendert Excalidraw-Skizzen.",
|
|
2430
|
+
fr: "Rend les croquis Excalidraw.",
|
|
2431
|
+
ko: "Excalidraw 스케치 파일 렌더링."
|
|
2432
|
+
}
|
|
2433
|
+
},
|
|
2434
|
+
{
|
|
2435
|
+
slug: "gallery",
|
|
2436
|
+
desc: {
|
|
2437
|
+
en: "Card grids for theme or project showcases.",
|
|
2438
|
+
ja: "テーマやプロジェクトの紹介向けカードグリッド。",
|
|
2439
|
+
"zh-CN": "用于主题或项目展示的卡片网格。",
|
|
2440
|
+
es: "Cuadrículas de tarjetas para escaparates de temas o proyectos.",
|
|
2441
|
+
de: "Kartenraster für Theme- oder Projekt-Showcases.",
|
|
2442
|
+
fr: "Grilles de cartes pour vitrines de thèmes ou de projets.",
|
|
2443
|
+
ko: "테마·프로젝트 소개용 카드 그리드."
|
|
2444
|
+
}
|
|
2445
|
+
}
|
|
2446
|
+
]
|
|
2447
|
+
},
|
|
2448
|
+
{
|
|
2449
|
+
title: {
|
|
2450
|
+
en: "Code and reading experience",
|
|
2451
|
+
ja: "コードと読書体験",
|
|
2452
|
+
"zh-CN": "代码与阅读体验",
|
|
2453
|
+
es: "Código y experiencia de lectura",
|
|
2454
|
+
de: "Code und Leseerlebnis",
|
|
2455
|
+
fr: "Code et expérience de lecture",
|
|
2456
|
+
ko: "코드와 읽기 경험"
|
|
2457
|
+
},
|
|
2458
|
+
summary: {
|
|
2459
|
+
en: "Better code blocks and a comfortable reading experience.",
|
|
2460
|
+
ja: "読みやすいコードブロックと快適な読書体験。",
|
|
2461
|
+
"zh-CN": "更好的代码块与舒适的阅读体验。",
|
|
2462
|
+
es: "Mejores bloques de código y una lectura cómoda.",
|
|
2463
|
+
de: "Bessere Code-Blöcke und ein angenehmes Leseerlebnis.",
|
|
2464
|
+
fr: "De meilleurs blocs de code et une lecture confortable.",
|
|
2465
|
+
ko: "더 나은 코드 블록과 편안한 읽기 경험."
|
|
2466
|
+
},
|
|
2467
|
+
plugins: [
|
|
2468
|
+
{
|
|
2469
|
+
slug: "code-enhance",
|
|
2470
|
+
desc: {
|
|
2471
|
+
en: "Syntax highlighting, line numbers, and code toolbars.",
|
|
2472
|
+
ja: "シンタックスハイライト・行番号・コードツールバー。",
|
|
2473
|
+
"zh-CN": "语法高亮、行号与代码工具栏。",
|
|
2474
|
+
es: "Resaltado de sintaxis, números de línea y barras de código.",
|
|
2475
|
+
de: "Syntax-Highlighting, Zeilennummern und Code-Symbolleisten.",
|
|
2476
|
+
fr: "Coloration syntaxique, numéros de ligne et barres de code.",
|
|
2477
|
+
ko: "구문 강조, 줄 번호, 코드 도구 모음."
|
|
2478
|
+
}
|
|
2479
|
+
},
|
|
2480
|
+
{
|
|
2481
|
+
slug: "code-tabs",
|
|
2482
|
+
desc: {
|
|
2483
|
+
en: "Accessible tabbed code blocks.",
|
|
2484
|
+
ja: "アクセシブルなタブ式コードブロック。",
|
|
2485
|
+
"zh-CN": "无障碍的标签式代码块。",
|
|
2486
|
+
es: "Bloques de código con pestañas accesibles.",
|
|
2487
|
+
de: "Barrierefreie Code-Blöcke mit Tabs.",
|
|
2488
|
+
fr: "Blocs de code à onglets accessibles.",
|
|
2489
|
+
ko: "접근성 있는 탭식 코드 블록."
|
|
2490
|
+
}
|
|
2491
|
+
},
|
|
2492
|
+
{
|
|
2493
|
+
slug: "toc",
|
|
2494
|
+
desc: {
|
|
2495
|
+
en: "A scroll-aware table of contents.",
|
|
2496
|
+
ja: "スクロール追従の目次。",
|
|
2497
|
+
"zh-CN": "随滚动高亮的目录。",
|
|
2498
|
+
es: "Una tabla de contenidos que sigue el scroll.",
|
|
2499
|
+
de: "Ein scrollgesteuertes Inhaltsverzeichnis.",
|
|
2500
|
+
fr: "Une table des matières qui suit le défilement.",
|
|
2501
|
+
ko: "스크롤을 따라가는 목차."
|
|
2502
|
+
}
|
|
2503
|
+
},
|
|
2504
|
+
{
|
|
2505
|
+
slug: "backlinks",
|
|
2506
|
+
desc: {
|
|
2507
|
+
en: "Lists notes that link to the current one.",
|
|
2508
|
+
ja: "現在のノートを参照するノートを一覧表示。",
|
|
2509
|
+
"zh-CN": "列出链接到当前笔记的笔记。",
|
|
2510
|
+
es: "Lista las notas que enlazan con la actual.",
|
|
2511
|
+
de: "Listet Notizen, die auf die aktuelle verlinken.",
|
|
2512
|
+
fr: "Liste les notes qui pointent vers la note courante.",
|
|
2513
|
+
ko: "현재 노트를 링크한 노트 목록."
|
|
2514
|
+
}
|
|
2515
|
+
}
|
|
2516
|
+
]
|
|
2517
|
+
},
|
|
2518
|
+
{
|
|
2519
|
+
title: {
|
|
2520
|
+
en: "Search and navigation",
|
|
2521
|
+
ja: "検索とナビゲーション",
|
|
2522
|
+
"zh-CN": "搜索与导航",
|
|
2523
|
+
es: "Búsqueda y navegación",
|
|
2524
|
+
de: "Suche und Navigation",
|
|
2525
|
+
fr: "Recherche et navigation",
|
|
2526
|
+
ko: "검색과 탐색"
|
|
2527
|
+
},
|
|
2528
|
+
summary: {
|
|
2529
|
+
en: "Find and move through your notes quickly.",
|
|
2530
|
+
ja: "ノートをすばやく探して移動する。",
|
|
2531
|
+
"zh-CN": "快速查找并在笔记之间穿梭。",
|
|
2532
|
+
es: "Encuentra y recorre tus notas rápidamente.",
|
|
2533
|
+
de: "Notizen schnell finden und durch sie navigieren.",
|
|
2534
|
+
fr: "Retrouvez et parcourez vos notes rapidement.",
|
|
2535
|
+
ko: "노트를 빠르게 찾고 이동하기."
|
|
2536
|
+
},
|
|
2537
|
+
plugins: [
|
|
2538
|
+
{
|
|
2539
|
+
slug: "search",
|
|
2540
|
+
desc: {
|
|
2541
|
+
en: "Client-side full-text search with a Ctrl+K modal.",
|
|
2542
|
+
ja: "Ctrl+K モーダル付きのクライアント側全文検索。",
|
|
2543
|
+
"zh-CN": "带 Ctrl+K 弹窗的客户端全文搜索。",
|
|
2544
|
+
es: "Búsqueda de texto completo en el cliente con modal Ctrl+K.",
|
|
2545
|
+
de: "Clientseitige Volltextsuche mit Ctrl+K-Modal.",
|
|
2546
|
+
fr: "Recherche plein texte côté client avec modal Ctrl+K.",
|
|
2547
|
+
ko: "Ctrl+K 모달이 있는 클라이언트 전체 텍스트 검색."
|
|
2548
|
+
}
|
|
2549
|
+
},
|
|
2550
|
+
{
|
|
2551
|
+
slug: "garden-explorer",
|
|
2552
|
+
desc: {
|
|
2553
|
+
en: "An interactive graph and search explorer.",
|
|
2554
|
+
ja: "ノートのグラフと検索を探索するインタラクティブビュー。",
|
|
2555
|
+
"zh-CN": "交互式图谱与搜索探索器。",
|
|
2556
|
+
es: "Un explorador interactivo de grafo y búsqueda.",
|
|
2557
|
+
de: "Ein interaktiver Graph- und Such-Explorer.",
|
|
2558
|
+
fr: "Un explorateur interactif de graphe et de recherche.",
|
|
2559
|
+
ko: "노트 그래프와 검색을 탐색하는 대화형 뷰."
|
|
2560
|
+
}
|
|
2561
|
+
},
|
|
2562
|
+
{
|
|
2563
|
+
slug: "local-graph",
|
|
2564
|
+
desc: {
|
|
2565
|
+
en: "A link graph around the current note.",
|
|
2566
|
+
ja: "ノート周辺のリンクグラフ。",
|
|
2567
|
+
"zh-CN": "当前笔记周边的链接图谱。",
|
|
2568
|
+
es: "Un grafo de enlaces alrededor de la nota actual.",
|
|
2569
|
+
de: "Ein Link-Graph rund um die aktuelle Notiz.",
|
|
2570
|
+
fr: "Un graphe de liens autour de la note courante.",
|
|
2571
|
+
ko: "현재 노트 주변의 링크 그래프."
|
|
2572
|
+
}
|
|
2573
|
+
},
|
|
2574
|
+
{
|
|
2575
|
+
slug: "permalink",
|
|
2576
|
+
desc: {
|
|
2577
|
+
en: "Stable, configurable permalinks.",
|
|
2578
|
+
ja: "安定したカスタマイズ可能なパーマリンク。",
|
|
2579
|
+
"zh-CN": "稳定、可配置的永久链接。",
|
|
2580
|
+
es: "Permalinks estables y configurables.",
|
|
2581
|
+
de: "Stabile, konfigurierbare Permalinks.",
|
|
2582
|
+
fr: "Permaliens stables et configurables.",
|
|
2583
|
+
ko: "안정적이고 설정 가능한 고유 주소."
|
|
2584
|
+
}
|
|
2627
2585
|
}
|
|
2628
|
-
|
|
2629
|
-
|
|
2630
|
-
|
|
2631
|
-
|
|
2632
|
-
|
|
2586
|
+
]
|
|
2587
|
+
},
|
|
2588
|
+
{
|
|
2589
|
+
title: {
|
|
2590
|
+
en: "Publishing and SEO",
|
|
2591
|
+
ja: "公開と SEO",
|
|
2592
|
+
"zh-CN": "发布与 SEO",
|
|
2593
|
+
es: "Publicación y SEO",
|
|
2594
|
+
de: "Veröffentlichung und SEO",
|
|
2595
|
+
fr: "Publication et SEO",
|
|
2596
|
+
ko: "배포와 SEO"
|
|
2597
|
+
},
|
|
2598
|
+
summary: {
|
|
2599
|
+
en: "Ship a site that search engines and readers both understand.",
|
|
2600
|
+
ja: "検索エンジンにも読者にも伝わるサイトを公開する。",
|
|
2601
|
+
"zh-CN": "发布搜索引擎和读者都能理解的站点。",
|
|
2602
|
+
es: "Publica un sitio que buscan buscadores y lectores por igual.",
|
|
2603
|
+
de: "Veröffentliche eine Seite, die Suchmaschinen und Leser gleichermaßen verstehen.",
|
|
2604
|
+
fr: "Publiez un site que moteurs de recherche et lecteurs comprennent.",
|
|
2605
|
+
ko: "검색 엔진과 독자 모두가 이해하는 사이트를 배포."
|
|
2606
|
+
},
|
|
2607
|
+
plugins: [
|
|
2608
|
+
{
|
|
2609
|
+
slug: "seo",
|
|
2610
|
+
desc: {
|
|
2611
|
+
en: "SEO metadata, sitemaps, RSS/Atom/JSON feeds, and robots.txt.",
|
|
2612
|
+
ja: "SEO メタデータ・サイトマップ・RSS/Atom/JSON フィード・robots.txt。",
|
|
2613
|
+
"zh-CN": "SEO 元数据、站点地图、RSS/Atom/JSON 订阅与 robots.txt。",
|
|
2614
|
+
es: "Metadatos SEO, sitemaps, feeds RSS/Atom/JSON y robots.txt.",
|
|
2615
|
+
de: "SEO-Metadaten, Sitemaps, RSS/Atom/JSON-Feeds und robots.txt.",
|
|
2616
|
+
fr: "Métadonnées SEO, sitemaps, flux RSS/Atom/JSON et robots.txt.",
|
|
2617
|
+
ko: "SEO 메타데이터·사이트맵·RSS/Atom/JSON 피드·robots.txt."
|
|
2618
|
+
}
|
|
2619
|
+
},
|
|
2620
|
+
{
|
|
2621
|
+
slug: "l10n",
|
|
2622
|
+
desc: {
|
|
2623
|
+
en: "Localized URLs, a language switcher, and hreflang metadata — this site runs on it.",
|
|
2624
|
+
ja: "ローカライズ済み URL・言語スイッチャー・hreflang メタデータ——このサイトもこれで動いています。",
|
|
2625
|
+
"zh-CN": "本地化 URL、语言切换器与 hreflang 元数据——本站就运行在它之上。",
|
|
2626
|
+
es: "URLs localizadas, selector de idioma y metadatos hreflang — este sitio se ejecuta sobre él.",
|
|
2627
|
+
de: "Lokalisierte URLs, Sprachumschalter und hreflang-Metadaten — diese Seite läuft darauf.",
|
|
2628
|
+
fr: "URLs localisées, sélecteur de langue et métadonnées hreflang — ce site repose dessus.",
|
|
2629
|
+
ko: "로컬라이즈된 URL·언어 전환 UI·hreflang 메타데이터 — 이 사이트가 동작하는 기반입니다."
|
|
2630
|
+
}
|
|
2631
|
+
},
|
|
2632
|
+
{
|
|
2633
|
+
slug: "rich-embed",
|
|
2634
|
+
desc: {
|
|
2635
|
+
en: "Build-time rich media cards for external links.",
|
|
2636
|
+
ja: "外部リンクのビルド時リッチメディアカード。",
|
|
2637
|
+
"zh-CN": "外部链接的构建时富媒体卡片。",
|
|
2638
|
+
es: "Tarjetas multimedia en build para enlaces externos.",
|
|
2639
|
+
de: "Rich-Media-Karten für externe Links zur Build-Zeit.",
|
|
2640
|
+
fr: "Cartes média construites à la compilation pour les liens externes.",
|
|
2641
|
+
ko: "외부 링크의 빌드 시점 리치 미디어 카드."
|
|
2642
|
+
}
|
|
2643
|
+
},
|
|
2644
|
+
{
|
|
2645
|
+
slug: "deploy",
|
|
2646
|
+
desc: {
|
|
2647
|
+
en: "Static deployment output for hosting services.",
|
|
2648
|
+
ja: "ホスティングサービス向けの静的デプロイ出力。",
|
|
2649
|
+
"zh-CN": "面向托管服务的静态部署产物。",
|
|
2650
|
+
es: "Salida de despliegue estático para servicios de hosting.",
|
|
2651
|
+
de: "Statische Deployment-Ausgabe für Hosting-Dienste.",
|
|
2652
|
+
fr: "Sortie de déploiement statique pour les services d'hébergement.",
|
|
2653
|
+
ko: "호스팅 서비스용 정적 배포 산출물."
|
|
2654
|
+
}
|
|
2633
2655
|
}
|
|
2634
|
-
|
|
2635
|
-
|
|
2636
|
-
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
|
|
2640
|
-
|
|
2641
|
-
|
|
2642
|
-
|
|
2643
|
-
|
|
2644
|
-
|
|
2645
|
-
|
|
2646
|
-
|
|
2647
|
-
|
|
2648
|
-
|
|
2649
|
-
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
|
|
2653
|
-
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
2659
|
-
|
|
2660
|
-
|
|
2661
|
-
|
|
2662
|
-
|
|
2663
|
-
|
|
2664
|
-
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
if (preset.theme) {
|
|
2668
|
-
dependencies[preset.theme.package] = RIEBECKITE_VERSION;
|
|
2669
|
-
}
|
|
2670
|
-
return `${JSON.stringify(
|
|
2671
|
-
{
|
|
2672
|
-
name: variables.name,
|
|
2673
|
-
private: true,
|
|
2674
|
-
version: "0.0.0",
|
|
2675
|
-
type: "module",
|
|
2676
|
-
scripts: {
|
|
2677
|
-
dev: "riebeckite dev",
|
|
2678
|
-
build: "riebeckite build",
|
|
2679
|
-
check: "riebeckite check",
|
|
2680
|
-
doctor: "riebeckite doctor",
|
|
2681
|
-
inspect: "riebeckite inspect"
|
|
2656
|
+
]
|
|
2657
|
+
},
|
|
2658
|
+
{
|
|
2659
|
+
title: {
|
|
2660
|
+
en: "Content and developer experience",
|
|
2661
|
+
ja: "コンテンツと開発体験",
|
|
2662
|
+
"zh-CN": "内容与开发者体验",
|
|
2663
|
+
es: "Contenido y experiencia de desarrollo",
|
|
2664
|
+
de: "Content und Developer Experience",
|
|
2665
|
+
fr: "Contenu et expérience développeur",
|
|
2666
|
+
ko: "콘텐츠와 개발자 경험"
|
|
2667
|
+
},
|
|
2668
|
+
summary: {
|
|
2669
|
+
en: "Query, organize, and keep your content healthy.",
|
|
2670
|
+
ja: "コンテンツを検索・整理し、健全に保つ。",
|
|
2671
|
+
"zh-CN": "查询、整理并保持内容健康。",
|
|
2672
|
+
es: "Consulta, organiza y mantén sano tu contenido.",
|
|
2673
|
+
de: "Content abfragen, organisieren und gesund halten.",
|
|
2674
|
+
fr: "Requêter, organiser et garder votre contenu sain.",
|
|
2675
|
+
ko: "콘텐츠를 조회·정리하고 건강하게 유지."
|
|
2676
|
+
},
|
|
2677
|
+
plugins: [
|
|
2678
|
+
{
|
|
2679
|
+
slug: "dataview",
|
|
2680
|
+
desc: {
|
|
2681
|
+
en: "Build-time queries over your notes.",
|
|
2682
|
+
ja: "ノートに対するビルド時クエリ。",
|
|
2683
|
+
"zh-CN": "对笔记的构建时查询。",
|
|
2684
|
+
es: "Consultas en build sobre tus notas.",
|
|
2685
|
+
de: "Build-Zeit-Abfragen über deine Notizen.",
|
|
2686
|
+
fr: "Requêtes temps de build sur vos notes.",
|
|
2687
|
+
ko: "노트에 대한 빌드 시점 조회."
|
|
2688
|
+
}
|
|
2682
2689
|
},
|
|
2683
|
-
|
|
2684
|
-
|
|
2685
|
-
|
|
2686
|
-
|
|
2687
|
-
|
|
2688
|
-
|
|
2689
|
-
|
|
2690
|
-
|
|
2691
|
-
|
|
2690
|
+
{
|
|
2691
|
+
slug: "kanban",
|
|
2692
|
+
desc: {
|
|
2693
|
+
en: "Obsidian-style Kanban boards from Markdown lists.",
|
|
2694
|
+
ja: "Markdown リストから Obsidian スタイルのカンバンボードを作成。",
|
|
2695
|
+
"zh-CN": "从 Markdown 列表创建 Obsidian 风格看板。",
|
|
2696
|
+
es: "Tableros Kanban estilo Obsidian desde listas Markdown.",
|
|
2697
|
+
de: "Obsidian-ähnliche Kanban-Boards aus Markdown-Listen.",
|
|
2698
|
+
fr: "Tableaux Kanban façon Obsidian depuis des listes Markdown.",
|
|
2699
|
+
ko: "Markdown 목록에서 Obsidian 스타일 칸반 보드 생성."
|
|
2700
|
+
}
|
|
2701
|
+
},
|
|
2702
|
+
{
|
|
2703
|
+
slug: "responsive-image",
|
|
2704
|
+
desc: {
|
|
2705
|
+
en: "Responsive images with lazy loading.",
|
|
2706
|
+
ja: "レスポンシブ画像と遅延読み込み。",
|
|
2707
|
+
"zh-CN": "响应式图片与懒加载。",
|
|
2708
|
+
es: "Imágenes responsive con carga diferida.",
|
|
2709
|
+
de: "Responsive Bilder mit Lazy Loading.",
|
|
2710
|
+
fr: "Images responsives avec chargement différé.",
|
|
2711
|
+
ko: "지연 로딩 지원 반응형 이미지."
|
|
2712
|
+
}
|
|
2713
|
+
},
|
|
2714
|
+
{
|
|
2715
|
+
slug: "quality",
|
|
2716
|
+
desc: {
|
|
2717
|
+
en: "Static quality and accessibility checks.",
|
|
2718
|
+
ja: "静的品質・アクセシビリティ検査。",
|
|
2719
|
+
"zh-CN": "静态质量与可访问性检查。",
|
|
2720
|
+
es: "Inspección estática de calidad y accesibilidad.",
|
|
2721
|
+
de: "Statische Qualitäts- und Barrierefreiheitsprüfung.",
|
|
2722
|
+
fr: "Contrôle statique de qualité et d'accessibilité.",
|
|
2723
|
+
ko: "정적 품질·접근성 검사."
|
|
2724
|
+
}
|
|
2692
2725
|
}
|
|
2693
|
-
|
|
2694
|
-
null,
|
|
2695
|
-
2
|
|
2696
|
-
)}
|
|
2697
|
-
`;
|
|
2698
|
-
}
|
|
2699
|
-
function riebeckiteConfig(preset, variables) {
|
|
2700
|
-
const { title, description, baseUrl, locale } = variables;
|
|
2701
|
-
const lines = ['import { defineConfig } from "@riebeckite/core";'];
|
|
2702
|
-
for (const plugin of preset.plugins) {
|
|
2703
|
-
lines.push(`import { ${plugin.factory} } from "${plugin.package}";`);
|
|
2704
|
-
}
|
|
2705
|
-
if (preset.theme) {
|
|
2706
|
-
lines.push(
|
|
2707
|
-
`import { ${preset.theme.factory} } from "${preset.theme.package}";`
|
|
2708
|
-
);
|
|
2709
|
-
}
|
|
2710
|
-
lines.push("");
|
|
2711
|
-
lines.push("export default defineConfig({");
|
|
2712
|
-
lines.push(" site: {");
|
|
2713
|
-
lines.push(` title: ${JSON.stringify(title)},`);
|
|
2714
|
-
lines.push(` description: ${JSON.stringify(description)},`);
|
|
2715
|
-
lines.push(` baseUrl: ${JSON.stringify(baseUrl)},`);
|
|
2716
|
-
lines.push(` locale: ${JSON.stringify(locale)},`);
|
|
2717
|
-
lines.push(' defaultOgImage: "/ogp.png",');
|
|
2718
|
-
lines.push(" },");
|
|
2719
|
-
lines.push(" content: {");
|
|
2720
|
-
lines.push(' directory: "content",');
|
|
2721
|
-
lines.push(" },");
|
|
2722
|
-
if (preset.theme) {
|
|
2723
|
-
const theme = preset.theme;
|
|
2724
|
-
lines.push(
|
|
2725
|
-
` theme: ${theme.options ? `${theme.factory}(${theme.options})` : `${theme.factory}()`},`
|
|
2726
|
-
);
|
|
2727
|
-
}
|
|
2728
|
-
lines.push(" plugins: [");
|
|
2729
|
-
for (const plugin of preset.plugins) {
|
|
2730
|
-
lines.push(` ${pluginExpression(plugin, preset, variables)},`);
|
|
2726
|
+
]
|
|
2731
2727
|
}
|
|
2732
|
-
|
|
2733
|
-
|
|
2734
|
-
|
|
2735
|
-
|
|
2736
|
-
|
|
2737
|
-
|
|
2738
|
-
|
|
2739
|
-
|
|
2740
|
-
|
|
2741
|
-
|
|
2742
|
-
|
|
2743
|
-
|
|
2744
|
-
|
|
2745
|
-
|
|
2746
|
-
|
|
2747
|
-
|
|
2748
|
-
|
|
2749
|
-
}
|
|
2750
|
-
|
|
2751
|
-
|
|
2752
|
-
|
|
2753
|
-
|
|
2754
|
-
|
|
2755
|
-
|
|
2756
|
-
|
|
2757
|
-
|
|
2758
|
-
([key, field]) => `${key}: ${renderOptionValue(field.value, context)}`
|
|
2759
|
-
);
|
|
2760
|
-
return fields.length === 0 ? null : `{ ${fields.join(", ")} }`;
|
|
2761
|
-
}
|
|
2762
|
-
function pluginExpression(plugin, preset, variables) {
|
|
2763
|
-
const options = renderOptions(
|
|
2764
|
-
plugin.options,
|
|
2765
|
-
optionContext(preset, variables)
|
|
2728
|
+
];
|
|
2729
|
+
function pluginsContent(language) {
|
|
2730
|
+
const copy = PLUGINS_COPY;
|
|
2731
|
+
const categories = PLUGIN_CATEGORIES;
|
|
2732
|
+
const lines = [frontmatter()];
|
|
2733
|
+
lines.push(heading(1, read(copy.title, language)), "");
|
|
2734
|
+
lines.push(read(copy.intro, language), "");
|
|
2735
|
+
lines.push(heading(2, read(copy.installHeading, language)), "");
|
|
2736
|
+
lines.push(read(copy.installStep1, language), "");
|
|
2737
|
+
lines.push(codeBlock("sh", "npm install @riebeckite/plugin-mermaid"));
|
|
2738
|
+
lines.push(read(copy.installStep2, language), "");
|
|
2739
|
+
lines.push(
|
|
2740
|
+
codeBlock(
|
|
2741
|
+
"ts",
|
|
2742
|
+
[
|
|
2743
|
+
'import { defineConfig } from "@riebeckite/core";',
|
|
2744
|
+
'import { l10n } from "@riebeckite/plugin-l10n";',
|
|
2745
|
+
'import { mermaid } from "@riebeckite/plugin-mermaid";',
|
|
2746
|
+
'import { obsidianMarkdown } from "@riebeckite/plugin-obsidian-markdown";',
|
|
2747
|
+
"",
|
|
2748
|
+
"export default defineConfig({",
|
|
2749
|
+
" // ...",
|
|
2750
|
+
" plugins: [obsidianMarkdown(), l10n({ ... }), mermaid()],",
|
|
2751
|
+
"});"
|
|
2752
|
+
].join("\n")
|
|
2753
|
+
)
|
|
2766
2754
|
);
|
|
2767
|
-
|
|
2768
|
-
}
|
|
2769
|
-
var REPO = "https://github.com/Rerurate514/riebeckite";
|
|
2770
|
-
var README_INTRO = {
|
|
2771
|
-
empty: {
|
|
2772
|
-
en: "A blank Riebeckite application shell — no theme, no plugins, no components, and no content. Everything is yours to add.",
|
|
2773
|
-
ja: "空の Riebeckite アプリケーションシェルです。テーマもプラグインもコンポーネントもコンテンツもなく、すべてを自由に追加できます。"
|
|
2774
|
-
},
|
|
2775
|
-
minimal: {
|
|
2776
|
-
en: "The smallest readable Riebeckite site: Obsidian Markdown, the minimal theme, and a single page you can read end to end.",
|
|
2777
|
-
ja: "最小で読みやすい Riebeckite サイトです。Obsidian マークダウン・minimal テーマ・1 ページだけで、サイトの組み立て方を学べます。"
|
|
2778
|
-
},
|
|
2779
|
-
starter: {
|
|
2780
|
-
en: "Recommended default: a practical Markdown garden with search, navigation, and reading essentials.",
|
|
2781
|
-
ja: "大半のサイトにおすすめの既定構成です。検索・ナビゲーション・閲覧に必要な機能を備えた実用的な Markdown サイトを作れます。"
|
|
2782
|
-
},
|
|
2783
|
-
showcase: {
|
|
2784
|
-
en: "A feature-rich example that demonstrates the Riebeckite plugin ecosystem with rendered samples, reference pages, and local fixtures.",
|
|
2785
|
-
ja: "Riebeckite の Plugin エコシステムを実際に確認できる機能紹介用の構成です。描画例・リファレンスページ・ローカルのフィクスチャを含みます。"
|
|
2786
|
-
}
|
|
2787
|
-
};
|
|
2788
|
-
var README_WORDS = {
|
|
2789
|
-
en: {
|
|
2790
|
-
included: "What's included",
|
|
2791
|
-
languages: "Languages",
|
|
2792
|
-
theme: "Theme",
|
|
2793
|
-
plugins: "Plugins",
|
|
2794
|
-
pages: "Content pages",
|
|
2795
|
-
commands: "Commands",
|
|
2796
|
-
localization: "Localization",
|
|
2797
|
-
localizationBody: "Content lives in `content/` as plain Markdown. Translations sit next to the default file using the `<base>.<lang>.md` convention (`about.ja.md`, `about.en.md`). The default language keeps the unsuffixed path; the rest are served under `/lang/`. To add or remove a language, edit the `l10n(...)` plugin in `riebeckite.config.ts` and add or remove the matching translation files.",
|
|
2798
|
-
extending: "Extending",
|
|
2799
|
-
extendingBody: "Plugins and themes are registered in `riebeckite.config.ts`. Install a package, import its factory, and add it to the `plugins` array — or point `theme` at another theme factory. See the Riebeckite repository for the full plugin and theme index.",
|
|
2800
|
-
none: "none",
|
|
2801
|
-
noPlugins: "no plugins",
|
|
2802
|
-
single: "single language",
|
|
2803
|
-
configReference: "Configuration reference",
|
|
2804
|
-
configReferenceBody: "`riebeckite.config.ts` registers every plugin below with its full option set. Treat it as a starting point; the documented options live in the [configuration reference](https://riebeckite.dev/docs/reference/configuration-reference) and each plugin's package README.",
|
|
2805
|
-
factory: "Factory",
|
|
2806
|
-
options: "Options",
|
|
2807
|
-
emDash: "—",
|
|
2808
|
-
demoPages: "Try the demos",
|
|
2809
|
-
demoPagesBody: "The generated site ships content pages that exercise these features:",
|
|
2810
|
-
copyDemos: "Copy-paste demos",
|
|
2811
|
-
copyDemosBody: "Paste any of these snippets into a Markdown file under `content/` and run `npm exec riebeckite dev`. Each one renders through a plugin this preset registers."
|
|
2812
|
-
},
|
|
2813
|
-
ja: {
|
|
2814
|
-
included: "含まれているもの",
|
|
2815
|
-
languages: "言語",
|
|
2816
|
-
theme: "テーマ",
|
|
2817
|
-
plugins: "プラグイン",
|
|
2818
|
-
pages: "コンテンツページ",
|
|
2819
|
-
commands: "コマンド",
|
|
2820
|
-
localization: "ローカライズ",
|
|
2821
|
-
localizationBody: "コンテンツは `content/` にプレーンな Markdown として置きます。翻訳ページは既定ファイルの隣に `<base>.<lang>.md` の規則で配置します(`about.ja.md`、`about.en.md` など)。既定言語は接尾辞なしのパス、それ以外は `/lang/` のパスで配信されます。言語の追加・削除は `riebeckite.config.ts` の `l10n(...)` プラグインを編集し、対応する翻訳ファイルを追加・削除してください。",
|
|
2822
|
-
extending: "拡張",
|
|
2823
|
-
extendingBody: "プラグインとテーマは `riebeckite.config.ts` で登録します。パッケージをインストールし、ファクトリを import して `plugins` 配列に追加するか、`theme` を別のテーマファクトリに変更します。全プラグイン・テーマの一覧は Riebeckite リポジトリを参照してください。",
|
|
2824
|
-
none: "なし",
|
|
2825
|
-
noPlugins: "プラグインなし",
|
|
2826
|
-
single: "単一言語",
|
|
2827
|
-
configReference: "設定リファレンス",
|
|
2828
|
-
configReferenceBody: "`riebeckite.config.ts` には、以下の全プラグインが全オプション付きで登録されています。これは出発点として使い、設定の仕様は[設定リファレンス](https://riebeckite.dev/docs/reference/configuration-reference)と各プラグインパッケージの README を確認してください。",
|
|
2829
|
-
factory: "ファクトリ",
|
|
2830
|
-
options: "オプション",
|
|
2831
|
-
emDash: "—",
|
|
2832
|
-
demoPages: "デモを試す",
|
|
2833
|
-
demoPagesBody: "生成されたサイトには、各機能を体験できるコンテンツページが含まれています:",
|
|
2834
|
-
copyDemos: "コピーして使えるデモ",
|
|
2835
|
-
copyDemosBody: "以下のスニペットを `content/` 配下の Markdown ファイルに貼り付けて `npm exec riebeckite dev` を実行してください。それぞれ、このプリセットが登録しているプラグインでレンダリングされます。"
|
|
2836
|
-
}
|
|
2837
|
-
};
|
|
2838
|
-
function readme(preset, variables) {
|
|
2839
|
-
const ja = defaultLanguageForLocale(variables.locale) === "ja";
|
|
2840
|
-
return ja ? readmeJa(preset, variables) : readmeEn(preset, variables);
|
|
2841
|
-
}
|
|
2842
|
-
function readmeEn(preset, variables) {
|
|
2843
|
-
const words = README_WORDS.en;
|
|
2844
|
-
const lines = [
|
|
2845
|
-
`# ${variables.title}`,
|
|
2846
|
-
"",
|
|
2847
|
-
README_INTRO[preset.name].en,
|
|
2848
|
-
""
|
|
2849
|
-
];
|
|
2850
|
-
if (preset.readme !== "short") {
|
|
2851
|
-
lines.push(`## ${words.included}`, "");
|
|
2852
|
-
lines.push(
|
|
2853
|
-
`- **${words.languages}**: ${languagesLabel(preset, variables, words)}`
|
|
2854
|
-
);
|
|
2855
|
-
lines.push(
|
|
2856
|
-
`- **${words.theme}**: ${preset.theme ? `\`${preset.theme.package}\`` : words.none}`
|
|
2857
|
-
);
|
|
2858
|
-
lines.push(
|
|
2859
|
-
`- **${words.plugins}** (${preset.plugins.length}): ${preset.plugins.length === 0 ? words.noPlugins : preset.plugins.map((p) => `\`${p.package}\``).join(", ")}`
|
|
2860
|
-
);
|
|
2861
|
-
lines.push(`- **${words.pages}**: ${pagesLabel(preset) ?? words.none}`);
|
|
2862
|
-
lines.push("");
|
|
2863
|
-
if (preset.readme === "rich") {
|
|
2864
|
-
lines.push(...configurationReferenceLines(preset, variables, words));
|
|
2865
|
-
}
|
|
2866
|
-
}
|
|
2867
|
-
lines.push(`## ${words.commands}`, "");
|
|
2755
|
+
lines.push(read(copy.fullList, language), "");
|
|
2868
2756
|
lines.push(
|
|
2869
|
-
|
|
2870
|
-
"npm install",
|
|
2871
|
-
"npm exec riebeckite check",
|
|
2872
|
-
"npm exec riebeckite dev",
|
|
2873
|
-
"npm exec riebeckite build",
|
|
2874
|
-
"```",
|
|
2757
|
+
`[${read(copy.fullListLabel, language)}](${PLUGIN_INDEX_URL})`,
|
|
2875
2758
|
""
|
|
2876
2759
|
);
|
|
2877
|
-
|
|
2878
|
-
lines.push(
|
|
2879
|
-
|
|
2880
|
-
"",
|
|
2881
|
-
"- `content/index.md`: the first published page.",
|
|
2882
|
-
"- `riebeckite.config.ts`: set `site.title`, `site.baseUrl`, and `content.directory`.",
|
|
2883
|
-
"- `public/favicon.ico`: replace the site icon when you are ready.",
|
|
2884
|
-
""
|
|
2885
|
-
);
|
|
2886
|
-
}
|
|
2887
|
-
if (variables.externalContent === true) {
|
|
2888
|
-
lines.push(...deploymentSecretLines("en"));
|
|
2889
|
-
}
|
|
2890
|
-
if (preset.readme === "rich") {
|
|
2891
|
-
lines.push(...demoPagesLines(preset, variables, words, "en"));
|
|
2892
|
-
lines.push(...copyPasteDemoLines(preset, words, "en"));
|
|
2893
|
-
lines.push(`## ${words.localization}`, "");
|
|
2894
|
-
lines.push(words.localizationBody, "");
|
|
2895
|
-
lines.push(`## ${words.extending}`, "");
|
|
2896
|
-
lines.push(words.extendingBody, "");
|
|
2897
|
-
lines.push(
|
|
2898
|
-
`- Docs: [English](${REPO}/blob/main/docs/README.md)`,
|
|
2899
|
-
` · [日本語](${REPO}/blob/main/docs/README.ja.md)`,
|
|
2900
|
-
""
|
|
2901
|
-
);
|
|
2902
|
-
}
|
|
2903
|
-
return lines.join("\n");
|
|
2904
|
-
}
|
|
2905
|
-
function readmeJa(preset, variables) {
|
|
2906
|
-
const words = README_WORDS.ja;
|
|
2907
|
-
const lines = [
|
|
2908
|
-
`# ${variables.title}`,
|
|
2909
|
-
"",
|
|
2910
|
-
README_INTRO[preset.name].ja,
|
|
2911
|
-
""
|
|
2912
|
-
];
|
|
2913
|
-
if (preset.readme !== "short") {
|
|
2914
|
-
lines.push(`## ${words.included}`, "");
|
|
2915
|
-
lines.push(
|
|
2916
|
-
`- **${words.languages}**: ${languagesLabel(preset, variables, words)}`
|
|
2917
|
-
);
|
|
2918
|
-
lines.push(
|
|
2919
|
-
`- **${words.theme}**: ${preset.theme ? `\`${preset.theme.package}\`` : words.none}`
|
|
2920
|
-
);
|
|
2760
|
+
for (const category of categories) {
|
|
2761
|
+
lines.push(heading(2, read(category.title, language)), "");
|
|
2762
|
+
lines.push(read(category.summary, language), "");
|
|
2921
2763
|
lines.push(
|
|
2922
|
-
|
|
2764
|
+
`| ${read(copy.columnPlugin, language)} | ${read(copy.columnDescription, language)} |`
|
|
2923
2765
|
);
|
|
2924
|
-
lines.push(
|
|
2925
|
-
|
|
2926
|
-
|
|
2927
|
-
lines.push(
|
|
2766
|
+
lines.push("| --- | --- |");
|
|
2767
|
+
for (const plugin of category.plugins) {
|
|
2768
|
+
const packageName = `@riebeckite/plugin-${plugin.slug}`;
|
|
2769
|
+
lines.push(
|
|
2770
|
+
`| [\`${packageName}\`](${pluginReadmeUrl(plugin.slug)}) | ${read(plugin.desc, language)} |`
|
|
2771
|
+
);
|
|
2928
2772
|
}
|
|
2773
|
+
lines.push("");
|
|
2929
2774
|
}
|
|
2930
|
-
lines.push(
|
|
2775
|
+
lines.push("");
|
|
2931
2776
|
lines.push(
|
|
2932
|
-
|
|
2933
|
-
"npm install",
|
|
2934
|
-
"npm exec riebeckite check",
|
|
2935
|
-
"npm exec riebeckite dev",
|
|
2936
|
-
"npm exec riebeckite build",
|
|
2937
|
-
"```",
|
|
2777
|
+
`Riebeckite: [documentation](${HELPERS.en}) · [日本語ドキュメント](${HELPERS.ja})`,
|
|
2938
2778
|
""
|
|
2939
2779
|
);
|
|
2940
|
-
|
|
2941
|
-
lines.push(
|
|
2942
|
-
"## 最初に編集する場所",
|
|
2943
|
-
"",
|
|
2944
|
-
"- `content/index.md`: 最初に公開されるページです。",
|
|
2945
|
-
"- `riebeckite.config.ts`: `site.title`、`site.baseUrl`、`content.directory` を設定します。",
|
|
2946
|
-
"- `public/favicon.ico`: 必要になったらサイトアイコンを置き換えます。",
|
|
2947
|
-
""
|
|
2948
|
-
);
|
|
2949
|
-
}
|
|
2950
|
-
if (variables.externalContent === true) {
|
|
2951
|
-
lines.push(...deploymentSecretLines("ja"));
|
|
2952
|
-
}
|
|
2953
|
-
if (preset.readme === "rich") {
|
|
2954
|
-
lines.push(...demoPagesLines(preset, variables, words, "ja"));
|
|
2955
|
-
lines.push(...copyPasteDemoLines(preset, words, "ja"));
|
|
2956
|
-
lines.push(`## ${words.localization}`, "");
|
|
2957
|
-
lines.push(words.localizationBody, "");
|
|
2958
|
-
lines.push(`## ${words.extending}`, "");
|
|
2959
|
-
lines.push(words.extendingBody, "");
|
|
2960
|
-
lines.push(
|
|
2961
|
-
`- ドキュメント: [English](${REPO}/blob/main/docs/README.md)`,
|
|
2962
|
-
` · [日本語](${REPO}/blob/main/docs/README.ja.md)`,
|
|
2963
|
-
""
|
|
2964
|
-
);
|
|
2965
|
-
}
|
|
2780
|
+
lines.push("");
|
|
2966
2781
|
return lines.join("\n");
|
|
2967
2782
|
}
|
|
2968
|
-
function
|
|
2969
|
-
|
|
2970
|
-
return [
|
|
2971
|
-
"## デプロイ用 Secret",
|
|
2972
|
-
"",
|
|
2973
|
-
"GitHub Actions のデプロイは content repository を読み、Cloudflare へ配信します。初回実行の前に、次の repository secret を登録してください。",
|
|
2974
|
-
"",
|
|
2975
|
-
`- \`${GITHUB_ACTIONS_SECRETS.RIEBECKITE_CONTENT_READ_TOKEN}\` — **この Site Repository** に登録します。content repository が private / internal のときだけ必要です。content repository に限定した fine-grained token を作成し、**Contents: read** を付与します。`,
|
|
2976
|
-
`- \`${GITHUB_ACTIONS_SECRETS.SITE_DISPATCH_TOKEN}\` — **content repository** に登録します。content repository の \`notify-site.yml\` からこの Site へ更新を通知するために使います。この Site Repository に限定した fine-grained token を作成し、**Contents: read and write** を付与します。`,
|
|
2977
|
-
`- \`${GITHUB_ACTIONS_SECRETS.CLOUDFLARE_API_TOKEN}\` と \`${GITHUB_ACTIONS_SECRETS.CLOUDFLARE_ACCOUNT_ID}\` — **この Site Repository** に登録し、Cloudflare へのデプロイに使います。`,
|
|
2978
|
-
"",
|
|
2979
|
-
`workflow はこれらの secret 名を参照するだけで、値は含みません。値は絶対に commit しないでください。全体の手順は [別 Content Repository のガイド](${REPO}/blob/main/docs/docs/guides/deployment/separate-content-repository.md) を参照してください。`,
|
|
2980
|
-
""
|
|
2981
|
-
];
|
|
2982
|
-
}
|
|
2983
|
-
return [
|
|
2984
|
-
"## Deployment secrets",
|
|
2985
|
-
"",
|
|
2986
|
-
"The GitHub Actions deployment reads the content repository and deploys to Cloudflare. Add these repository secrets before the first run:",
|
|
2987
|
-
"",
|
|
2988
|
-
`- \`${GITHUB_ACTIONS_SECRETS.RIEBECKITE_CONTENT_READ_TOKEN}\` — in **this site repository**. Required only when the content repository is private or internal. Use a fine-grained token scoped to the content repository with **Contents: read**.`,
|
|
2989
|
-
`- \`${GITHUB_ACTIONS_SECRETS.SITE_DISPATCH_TOKEN}\` — in the **content repository**. Lets its \`notify-site.yml\` dispatch updates to this site. Use a fine-grained token scoped to this site repository with **Contents: read and write**.`,
|
|
2990
|
-
`- \`${GITHUB_ACTIONS_SECRETS.CLOUDFLARE_API_TOKEN}\` and \`${GITHUB_ACTIONS_SECRETS.CLOUDFLARE_ACCOUNT_ID}\` — in **this site repository** for the Cloudflare deploy.`,
|
|
2991
|
-
"",
|
|
2992
|
-
`The workflows reference these secret names and never contain their values. Never commit the values. See the [separate content repository guide](${REPO}/blob/main/docs/docs/guides/deployment/separate-content-repository.md) for the full setup.`,
|
|
2993
|
-
""
|
|
2994
|
-
];
|
|
2995
|
-
}
|
|
2996
|
-
function languagesLabel(preset, variables, words) {
|
|
2997
|
-
if (preset.languages.length === 0) return words.none;
|
|
2998
|
-
if (preset.languages.length === 1) {
|
|
2999
|
-
const language = preset.name === "starter" ? defaultLanguageForLocale(variables.locale) : preset.languages[0];
|
|
3000
|
-
return `${language} (${words.single})`;
|
|
3001
|
-
}
|
|
3002
|
-
return preset.languages.join(", ");
|
|
3003
|
-
}
|
|
3004
|
-
function pagesLabel(preset) {
|
|
3005
|
-
if (preset.contentPages.length === 0) return null;
|
|
3006
|
-
return preset.contentPages.map((page) => `/${page}`).join(", ");
|
|
2783
|
+
function readSummary(text2, language) {
|
|
2784
|
+
return language === "ja" ? text2.ja ?? text2.en : text2.en;
|
|
3007
2785
|
}
|
|
3008
|
-
var
|
|
3009
|
-
|
|
3010
|
-
|
|
3011
|
-
|
|
3012
|
-
en: "A block quote with a `[!type]` marker becomes a styled callout panel.",
|
|
3013
|
-
ja: "`[!type]` マーカー付きブロック引用をスタイル付きパネルに変換します。"
|
|
3014
|
-
},
|
|
3015
|
-
markdown: [
|
|
3016
|
-
"> [!tip] Try it",
|
|
3017
|
-
"> A callout is a block quote with a `[!type]` marker. `[!info]`,",
|
|
3018
|
-
"> `[!warning]`, and `[!question]` render the same way."
|
|
3019
|
-
].join("\n")
|
|
3020
|
-
},
|
|
3021
|
-
"@riebeckite/plugin-obsidian-markdown/wikilinks": {
|
|
3022
|
-
title: { en: "Wikilinks and embeds", ja: "ウィキリンクと埋め込み" },
|
|
3023
|
-
intro: {
|
|
3024
|
-
en: "`[[...]]` links and `![[...]]` embeds resolve to real permalinks from the content manifest.",
|
|
3025
|
-
ja: "`[[...]]` リンクと `![[...]]` 埋め込みは、コンテンツマニフェストから実際のパーマリンクへ解決されます。"
|
|
3026
|
-
},
|
|
3027
|
-
markdown: "Read the [[guide]] and [[index]] pages. `![[index]]` embeds the note inline."
|
|
3028
|
-
},
|
|
3029
|
-
"@riebeckite/plugin-code-enhance": {
|
|
3030
|
-
title: { en: "Code with a toolbar", ja: "ツールバー付きコード" },
|
|
3031
|
-
intro: {
|
|
3032
|
-
en: "Code fences get line numbers, a filename bar, line highlighting, and a copy button.",
|
|
3033
|
-
ja: "コードフェンスに行番号・ファイル名バー・行ハイライト・コピーボタンが付きます。"
|
|
3034
|
-
},
|
|
3035
|
-
markdown: fence(
|
|
3036
|
-
"ts",
|
|
3037
|
-
[
|
|
3038
|
-
"// Syntax highlighting, line numbers, and a copy button",
|
|
3039
|
-
"export function hello(name: string): string {",
|
|
3040
|
-
' return "Hello, " + name + "!";',
|
|
3041
|
-
"}"
|
|
3042
|
-
].join("\n")
|
|
3043
|
-
)
|
|
3044
|
-
},
|
|
3045
|
-
"@riebeckite/plugin-code-tabs": {
|
|
3046
|
-
title: { en: "Code tabs", ja: "タブ切り替えコード" },
|
|
3047
|
-
intro: {
|
|
3048
|
-
en: 'Adjacent `tab="..."` fences become one tabbed group; `syncTabs: true` keeps the same label in sync across groups.',
|
|
3049
|
-
ja: '隣り合う `tab="..."` フェンスがタブグループになります。`syncTabs: true` でページ内の同じラベルを同期できます。'
|
|
3050
|
-
},
|
|
3051
|
-
markdown: [
|
|
3052
|
-
fence('ts tab="React"', 'const greeting = "Hello from React";'),
|
|
3053
|
-
fence('js tab="Vanilla"', 'console.log("Hello from JavaScript");')
|
|
3054
|
-
].join("\n")
|
|
3055
|
-
},
|
|
3056
|
-
"@riebeckite/plugin-mermaid": {
|
|
3057
|
-
title: { en: "Mermaid", ja: "Mermaid" },
|
|
3058
|
-
intro: {
|
|
3059
|
-
en: "A `mermaid` fence becomes a rendered diagram at build time.",
|
|
3060
|
-
ja: "`mermaid` フェンスはビルド時にレンダリングされた図になります。"
|
|
3061
|
-
},
|
|
3062
|
-
markdown: fence(
|
|
3063
|
-
"mermaid",
|
|
3064
|
-
[
|
|
3065
|
-
"flowchart LR",
|
|
3066
|
-
" A[Note] --> B{Published?}",
|
|
3067
|
-
" B -->|yes| C[Site]",
|
|
3068
|
-
" B -->|no| D[Draft]"
|
|
3069
|
-
].join("\n")
|
|
3070
|
-
)
|
|
3071
|
-
},
|
|
3072
|
-
"@riebeckite/plugin-d2": {
|
|
3073
|
-
title: { en: "D2", ja: "D2" },
|
|
3074
|
-
intro: {
|
|
3075
|
-
en: "A `d2` fence is compiled into an SVG diagram.",
|
|
3076
|
-
ja: "`d2` フェンスが SVG 図にコンパイルされます。"
|
|
3077
|
-
},
|
|
3078
|
-
markdown: fence("d2", "site: Riebeckite\n content -> build -> deploy")
|
|
3079
|
-
},
|
|
3080
|
-
"@riebeckite/plugin-graphviz": {
|
|
3081
|
-
title: { en: "Graphviz / DOT", ja: "Graphviz / DOT" },
|
|
3082
|
-
intro: {
|
|
3083
|
-
en: "A `dot` fence is rendered with a configurable engine (here `dot`).",
|
|
3084
|
-
ja: "`dot` フェンスが指定のエンジン(ここでは `dot`)でレンダリングされます。"
|
|
3085
|
-
},
|
|
3086
|
-
markdown: fence(
|
|
3087
|
-
"dot",
|
|
3088
|
-
"digraph G {\n notes -> pages;\n pages -> html;\n}"
|
|
3089
|
-
)
|
|
3090
|
-
},
|
|
3091
|
-
"@riebeckite/plugin-chartjs": {
|
|
3092
|
-
title: { en: "Chart.js", ja: "Chart.js" },
|
|
3093
|
-
intro: {
|
|
3094
|
-
en: "A `chart` JSON fence renders with Chart.js; a caption comes from the block `title`.",
|
|
3095
|
-
ja: "`chart` JSON フェンスが Chart.js で描画されます。キャプションはブロックの `title` から取られます。"
|
|
3096
|
-
},
|
|
3097
|
-
markdown: fence(
|
|
3098
|
-
"chart",
|
|
3099
|
-
`{
|
|
3100
|
-
"type": "bar",
|
|
3101
|
-
"data": {
|
|
3102
|
-
"labels": ["Mon", "Tue", "Wed"],
|
|
3103
|
-
"datasets": [{ "label": "Visits", "data": [12, 19, 8] }]
|
|
3104
|
-
}
|
|
3105
|
-
}`
|
|
3106
|
-
)
|
|
3107
|
-
},
|
|
3108
|
-
"@riebeckite/plugin-vega-lite": {
|
|
3109
|
-
title: { en: "Vega-Lite", ja: "Vega-Lite" },
|
|
3110
|
-
intro: {
|
|
3111
|
-
en: "A `vega-lite` JSON specification becomes a Vega chart.",
|
|
3112
|
-
ja: "`vega-lite` の JSON 仕様が Vega チャートになります。"
|
|
3113
|
-
},
|
|
3114
|
-
markdown: fence(
|
|
3115
|
-
"vega-lite",
|
|
3116
|
-
`{
|
|
3117
|
-
"title": "Revenue",
|
|
3118
|
-
"data": {
|
|
3119
|
-
"values": [
|
|
3120
|
-
{ "category": "A", "value": 28 },
|
|
3121
|
-
{ "category": "B", "value": 55 }
|
|
3122
|
-
]
|
|
3123
|
-
},
|
|
3124
|
-
"mark": "bar",
|
|
3125
|
-
"encoding": {
|
|
3126
|
-
"x": { "field": "category", "type": "nominal" },
|
|
3127
|
-
"y": { "field": "value", "type": "quantitative" }
|
|
3128
|
-
}
|
|
3129
|
-
}`
|
|
3130
|
-
)
|
|
3131
|
-
},
|
|
3132
|
-
"@riebeckite/plugin-wavedrom": {
|
|
3133
|
-
title: { en: "WaveDrom", ja: "WaveDrom" },
|
|
3134
|
-
intro: {
|
|
3135
|
-
en: "A `wavedrom` JSON fence becomes a digital timing diagram.",
|
|
3136
|
-
ja: "`wavedrom` JSON フェンスがデジタルタイミング図になります。"
|
|
3137
|
-
},
|
|
3138
|
-
markdown: fence(
|
|
3139
|
-
"wavedrom",
|
|
3140
|
-
`{
|
|
3141
|
-
"signal": [
|
|
3142
|
-
{ "name": "clk", "wave": "p......" },
|
|
3143
|
-
{ "name": "bus", "wave": "x.34.5x", "data": "head body tail" }
|
|
3144
|
-
]
|
|
3145
|
-
}`
|
|
3146
|
-
)
|
|
2786
|
+
var EXAMPLES_COPY = {
|
|
2787
|
+
heading: {
|
|
2788
|
+
en: "Examples",
|
|
2789
|
+
ja: "サンプル集"
|
|
3147
2790
|
},
|
|
3148
|
-
|
|
3149
|
-
|
|
3150
|
-
|
|
3151
|
-
|
|
3152
|
-
|
|
3153
|
-
|
|
3154
|
-
|
|
3155
|
-
|
|
3156
|
-
|
|
3157
|
-
|
|
3158
|
-
|
|
3159
|
-
|
|
3160
|
-
|
|
3161
|
-
|
|
3162
|
-
|
|
3163
|
-
"",
|
|
3164
|
-
"## Delivery"
|
|
3165
|
-
].join("\n")
|
|
3166
|
-
)
|
|
2791
|
+
intro: {
|
|
2792
|
+
en: "Rendered examples for the diagram, chart, and code features in this preset. Fenced code blocks are turned into output at build time by the relevant plugins, while code blocks gain toolbars from the code plugins. Each section below is copy-pasteable into a Markdown document.",
|
|
2793
|
+
ja: "このプリセットに含まれる図表・チャート・コード機能の描画例です。フェンス付きコードブロックは対応するプラグインによりビルド時に出力へ変換され、コードブロックにはツールバーが付きます。以下の各セクションは、Markdown 文書にそのままコピーして使えます。"
|
|
2794
|
+
}
|
|
2795
|
+
};
|
|
2796
|
+
var SHOWCASE_GUIDE_DEMOS = [
|
|
2797
|
+
"@riebeckite/plugin-plantuml",
|
|
2798
|
+
"@riebeckite/plugin-excalidraw",
|
|
2799
|
+
"@riebeckite/plugin-canvas",
|
|
2800
|
+
"@riebeckite/plugin-flashcards"
|
|
2801
|
+
];
|
|
2802
|
+
var STARTER_EXAMPLES = {
|
|
2803
|
+
heading: {
|
|
2804
|
+
en: "Example",
|
|
2805
|
+
ja: "サンプル"
|
|
3167
2806
|
},
|
|
3168
|
-
|
|
3169
|
-
|
|
3170
|
-
|
|
3171
|
-
en: "A `map` fence embeds an OpenStreetMap: a static fallback (coordinates and links) first, upgraded to an interactive map when JavaScript is available.",
|
|
3172
|
-
ja: "`map` フェンスが OpenStreetMap を埋め込みます。まず静的なフォールバック(座標とリンク)を表示し、JavaScript がある場合はインタラクティブな地図に拡張します。"
|
|
3173
|
-
},
|
|
3174
|
-
markdown: fence(
|
|
3175
|
-
"map",
|
|
3176
|
-
[
|
|
3177
|
-
"center: 35.6812, 139.7671",
|
|
3178
|
-
"zoom: 13",
|
|
3179
|
-
"label: Tokyo Station",
|
|
3180
|
-
"markers:",
|
|
3181
|
-
" - 35.6812, 139.7671 | Tokyo Station",
|
|
3182
|
-
" - 35.6586, 139.7454 | Tokyo Tower"
|
|
3183
|
-
].join("\n")
|
|
3184
|
-
)
|
|
2807
|
+
intro: {
|
|
2808
|
+
en: "A small page showing what Riebeckite Markdown can do. Copy any section into your own files.",
|
|
2809
|
+
ja: "Riebeckite の Markdown でできることをまとめた小さなページです。必要なセクションを自分のファイルにコピーできます。"
|
|
3185
2810
|
},
|
|
3186
|
-
|
|
3187
|
-
|
|
3188
|
-
|
|
3189
|
-
en: "A `marp` fence renders slides, separated by `---`.",
|
|
3190
|
-
ja: "`marp` フェンスがスライドとして描画されます。スライドは `---` で区切ります。"
|
|
3191
|
-
},
|
|
3192
|
-
markdown: fence(
|
|
3193
|
-
'marp title="Intro deck"',
|
|
3194
|
-
["# First slide", "", "- a bullet", "", "---", "", "# Second slide"].join(
|
|
3195
|
-
"\n"
|
|
3196
|
-
)
|
|
3197
|
-
)
|
|
2811
|
+
linksHeading: {
|
|
2812
|
+
en: "Links",
|
|
2813
|
+
ja: "リンク"
|
|
3198
2814
|
},
|
|
3199
|
-
|
|
3200
|
-
|
|
3201
|
-
|
|
3202
|
-
en: "A `qr` fence becomes an inline SVG QR code, encoded entirely at build time.",
|
|
3203
|
-
ja: "`qr` フェンスがインライン SVG の QR コードになります(ビルド時に全てエンコードされます)。"
|
|
3204
|
-
},
|
|
3205
|
-
markdown: fence("qr", "# caption: Project page\nhttps://example.com/")
|
|
2815
|
+
linksBody: {
|
|
2816
|
+
en: "WikiLinks connect pages: [[guide]] opens Getting started. Regular Markdown links work as well — [Home](/) returns to the home page.",
|
|
2817
|
+
ja: "WikiLink でページをつなげます:[[guide]] は Getting started を開きます。通常の Markdown リンクも使えます — [Home](/) でホームに戻れます。"
|
|
3206
2818
|
},
|
|
3207
|
-
|
|
3208
|
-
|
|
3209
|
-
|
|
3210
|
-
en: "An `embed` fence turns a URL into a YouTube, Vimeo, Spotify, CodePen, or Gist embed.",
|
|
3211
|
-
ja: "`embed` フェンスの URL が YouTube・Vimeo・Spotify・CodePen・Gist の埋め込みになります。"
|
|
3212
|
-
},
|
|
3213
|
-
markdown: fence(
|
|
3214
|
-
"embed",
|
|
3215
|
-
[
|
|
3216
|
-
"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
|
|
3217
|
-
"title: Demo video",
|
|
3218
|
-
"caption: A short caption",
|
|
3219
|
-
"aspect: 16/9"
|
|
3220
|
-
].join("\n")
|
|
3221
|
-
)
|
|
2819
|
+
codeHeading: {
|
|
2820
|
+
en: "Code",
|
|
2821
|
+
ja: "コード"
|
|
3222
2822
|
},
|
|
3223
|
-
|
|
3224
|
-
|
|
3225
|
-
|
|
3226
|
-
|
|
3227
|
-
|
|
3228
|
-
|
|
3229
|
-
|
|
3230
|
-
|
|
2823
|
+
codeIntro: {
|
|
2824
|
+
en: "A fenced code block keeps its formatting and gains a toolbar from the code plugins:",
|
|
2825
|
+
ja: "フェンス付きコードブロックは書式を保ったまま表示され、コード系プラグインでツールバーが付きます:"
|
|
2826
|
+
},
|
|
2827
|
+
frontmatterHeading: {
|
|
2828
|
+
en: "Frontmatter",
|
|
2829
|
+
ja: "フロントマター"
|
|
2830
|
+
},
|
|
2831
|
+
frontmatterBody: {
|
|
2832
|
+
en: "The block between the `---` lines at the top of a file controls the page. `publish: true` keeps it in the built site:",
|
|
2833
|
+
ja: "ファイル先頭の `---` に挟まれた部分がページを制御します。`publish: true` を書き続けるとビルド対象に残ります:"
|
|
2834
|
+
}
|
|
2835
|
+
};
|
|
2836
|
+
function starterExamplesContent(language) {
|
|
2837
|
+
return [
|
|
2838
|
+
frontmatter(),
|
|
2839
|
+
heading(1, readSummary(STARTER_EXAMPLES.heading, language)),
|
|
2840
|
+
"",
|
|
2841
|
+
readSummary(STARTER_EXAMPLES.intro, language),
|
|
2842
|
+
"",
|
|
2843
|
+
heading(2, readSummary(STARTER_EXAMPLES.linksHeading, language)),
|
|
2844
|
+
"",
|
|
2845
|
+
readSummary(STARTER_EXAMPLES.linksBody, language),
|
|
2846
|
+
"",
|
|
2847
|
+
heading(2, readSummary(STARTER_EXAMPLES.codeHeading, language)),
|
|
2848
|
+
"",
|
|
2849
|
+
readSummary(STARTER_EXAMPLES.codeIntro, language),
|
|
2850
|
+
"",
|
|
2851
|
+
codeBlock(
|
|
2852
|
+
"ts",
|
|
3231
2853
|
[
|
|
3232
|
-
"
|
|
3233
|
-
"
|
|
3234
|
-
"
|
|
3235
|
-
" description: A clean, typographic theme.",
|
|
3236
|
-
" meta: v0.0.5",
|
|
3237
|
-
" href: https://riebeckite.dev/docs/themes/default",
|
|
3238
|
-
" - title: Minimal",
|
|
3239
|
-
" description: Stripped back to the essentials.",
|
|
3240
|
-
" meta: v0.0.5",
|
|
3241
|
-
" href: https://riebeckite.dev/docs/themes/minimal",
|
|
3242
|
-
" - title: Gruvbox",
|
|
3243
|
-
" description: A warm, high-contrast palette.",
|
|
3244
|
-
" meta: v0.0.5",
|
|
3245
|
-
" href: https://riebeckite.dev/docs/themes/gruvbox"
|
|
2854
|
+
"export function hello(): string {",
|
|
2855
|
+
' return "Hello from Riebeckite";',
|
|
2856
|
+
"}"
|
|
3246
2857
|
].join("\n")
|
|
3247
|
-
)
|
|
2858
|
+
),
|
|
2859
|
+
"",
|
|
2860
|
+
heading(2, readSummary(STARTER_EXAMPLES.frontmatterHeading, language)),
|
|
2861
|
+
"",
|
|
2862
|
+
readSummary(STARTER_EXAMPLES.frontmatterBody, language),
|
|
2863
|
+
"",
|
|
2864
|
+
codeBlock(
|
|
2865
|
+
"yaml",
|
|
2866
|
+
["---", "publish: true", "title: Example", "---"].join("\n")
|
|
2867
|
+
),
|
|
2868
|
+
""
|
|
2869
|
+
].join("\n");
|
|
2870
|
+
}
|
|
2871
|
+
function examplesContent(preset, language) {
|
|
2872
|
+
if (preset.name === "starter") return starterExamplesContent(language);
|
|
2873
|
+
const lines = [
|
|
2874
|
+
frontmatter(),
|
|
2875
|
+
heading(1, readSummary(EXAMPLES_COPY.heading, language)),
|
|
2876
|
+
"",
|
|
2877
|
+
readSummary(EXAMPLES_COPY.intro, language),
|
|
2878
|
+
""
|
|
2879
|
+
];
|
|
2880
|
+
for (const key of README_DEMO_ORDER) {
|
|
2881
|
+
const packageName = demoPackage(key);
|
|
2882
|
+
if (!hasPlugin(preset, packageName)) continue;
|
|
2883
|
+
const demo = README_DEMOS[key];
|
|
2884
|
+
lines.push(heading(2, readSummary(demo.title, language)), "");
|
|
2885
|
+
lines.push(readSummary(demo.intro, language), "");
|
|
2886
|
+
lines.push(demo.markdown, "");
|
|
2887
|
+
}
|
|
2888
|
+
if (preset.name === "showcase") {
|
|
2889
|
+
for (const packageName of SHOWCASE_GUIDE_DEMOS) {
|
|
2890
|
+
if (!hasPlugin(preset, packageName)) continue;
|
|
2891
|
+
const guide = PLUGIN_MARKDOWN_GUIDES[packageName];
|
|
2892
|
+
if (!guide) continue;
|
|
2893
|
+
lines.push(
|
|
2894
|
+
heading(2, packageName.replace("@riebeckite/plugin-", "")),
|
|
2895
|
+
""
|
|
2896
|
+
);
|
|
2897
|
+
lines.push(guide.summary, "");
|
|
2898
|
+
lines.push(guide.markdown, "");
|
|
2899
|
+
}
|
|
2900
|
+
}
|
|
2901
|
+
return lines.join("\n");
|
|
2902
|
+
}
|
|
2903
|
+
function referencePluginsContent(preset, variables) {
|
|
2904
|
+
const lines = [frontmatter()];
|
|
2905
|
+
lines.push(heading(1, "Plugin reference"), "");
|
|
2906
|
+
lines.push(
|
|
2907
|
+
"Every plugin registered by this preset, with the factory and options",
|
|
2908
|
+
"used in `riebeckite.config.ts`. Full documentation lives in each package",
|
|
2909
|
+
"README.",
|
|
2910
|
+
""
|
|
2911
|
+
);
|
|
2912
|
+
lines.push("| Package | Factory | Options |");
|
|
2913
|
+
lines.push("| --- | --- | --- |");
|
|
2914
|
+
for (const plugin of preset.plugins) {
|
|
2915
|
+
const options = readmePluginOptions(variables, preset, plugin);
|
|
2916
|
+
const cell = options === null ? "—" : `\`${options}\``;
|
|
2917
|
+
lines.push(
|
|
2918
|
+
`| [\`${plugin.package}\`](${pluginReadmeUrl(plugin.package.replace(/^@riebeckite\/plugin-/, ""))}) | \`${plugin.factory}\` | ${cell} |`
|
|
2919
|
+
);
|
|
2920
|
+
}
|
|
2921
|
+
lines.push("");
|
|
2922
|
+
lines.push(heading(2, "Markdown behavior"), "");
|
|
2923
|
+
lines.push(
|
|
2924
|
+
"Every registered plugin is listed below with the Markdown that triggers it,",
|
|
2925
|
+
"or with the Markdown/frontmatter/content shape it reads when the plugin is",
|
|
2926
|
+
"site-wide rather than block-based. Paste the examples into files under",
|
|
2927
|
+
"`content/` and run `npm exec riebeckite dev` to inspect the rendered result.",
|
|
2928
|
+
""
|
|
2929
|
+
);
|
|
2930
|
+
for (const plugin of preset.plugins) {
|
|
2931
|
+
const demoKeys = README_DEMO_ORDER.filter(
|
|
2932
|
+
(key) => demoPackage(key) === plugin.package
|
|
2933
|
+
);
|
|
2934
|
+
const guide = PLUGIN_MARKDOWN_GUIDES[plugin.package];
|
|
2935
|
+
const slug = plugin.package.replace(/^@riebeckite\/plugin-/, "");
|
|
2936
|
+
lines.push(heading(3, plugin.package), "");
|
|
2937
|
+
lines.push(
|
|
2938
|
+
`Factory: \`${plugin.factory}\` · [README](${pluginReadmeUrl(slug)})`,
|
|
2939
|
+
""
|
|
2940
|
+
);
|
|
2941
|
+
if (guide) {
|
|
2942
|
+
lines.push(guide.summary, "");
|
|
2943
|
+
lines.push(guide.markdown, "");
|
|
2944
|
+
}
|
|
2945
|
+
for (const key of demoKeys) {
|
|
2946
|
+
const demo = README_DEMOS[key];
|
|
2947
|
+
lines.push(heading(4, demo.title.en), "");
|
|
2948
|
+
lines.push(demo.intro.en, "");
|
|
2949
|
+
lines.push(demo.markdown, "");
|
|
2950
|
+
}
|
|
2951
|
+
if (!guide && demoKeys.length === 0) {
|
|
2952
|
+
lines.push(
|
|
2953
|
+
"This plugin has no Markdown-specific demo in the scaffold yet. See its package README for the exact behavior and options.",
|
|
2954
|
+
""
|
|
2955
|
+
);
|
|
2956
|
+
}
|
|
2957
|
+
}
|
|
2958
|
+
lines.push(`[Riebeckite plugins on GitHub](${PLUGIN_INDEX_URL})`, "");
|
|
2959
|
+
lines.push("");
|
|
2960
|
+
return lines.join("\n");
|
|
2961
|
+
}
|
|
2962
|
+
function referenceThemesContent(preset) {
|
|
2963
|
+
const lines = [frontmatter()];
|
|
2964
|
+
lines.push(heading(1, "Theme reference"), "");
|
|
2965
|
+
lines.push(
|
|
2966
|
+
"The bundled themes. Switch by installing a package and changing the",
|
|
2967
|
+
"`theme` factory in `riebeckite.config.ts`.",
|
|
2968
|
+
""
|
|
2969
|
+
);
|
|
2970
|
+
if (hasPlugin(preset, GALLERY_PACKAGE)) {
|
|
2971
|
+
lines.push(heading(2, "Theme gallery"), "");
|
|
2972
|
+
lines.push(
|
|
2973
|
+
themeGalleryFence((theme) => theme.desc.en),
|
|
2974
|
+
""
|
|
2975
|
+
);
|
|
2976
|
+
}
|
|
2977
|
+
lines.push("| Theme | Factory | Description |");
|
|
2978
|
+
lines.push("| --- | --- | --- |");
|
|
2979
|
+
for (const theme of THEMES) {
|
|
2980
|
+
const packageName = `@riebeckite/theme-${theme.slug}`;
|
|
2981
|
+
lines.push(
|
|
2982
|
+
`| [\`${packageName}\`](${themeReadmeUrl(theme.slug)}) | \`${theme.factory}\` | ${read(theme.desc, "en")} |`
|
|
2983
|
+
);
|
|
2984
|
+
}
|
|
2985
|
+
lines.push("");
|
|
2986
|
+
lines.push(`[Riebeckite themes on GitHub](${THEMES_INDEX_URL})`, "");
|
|
2987
|
+
lines.push("");
|
|
2988
|
+
return lines.join("\n");
|
|
2989
|
+
}
|
|
2990
|
+
|
|
2991
|
+
// src/scaffold/readme.ts
|
|
2992
|
+
var REPO = "https://github.com/Rerurate514/riebeckite";
|
|
2993
|
+
var README_PAGE_LINKS = {
|
|
2994
|
+
"framework/plugins": { en: "Plugin tour", ja: "プラグインツアー" },
|
|
2995
|
+
"framework/themes": { en: "Theme tour", ja: "テーマツアー" },
|
|
2996
|
+
guide: { en: "Getting-started guide", ja: "はじめにガイド" },
|
|
2997
|
+
examples: { en: "Examples", ja: "サンプル集" },
|
|
2998
|
+
"reference/plugins": { en: "Plugin reference", ja: "プラグインリファレンス" },
|
|
2999
|
+
"reference/themes": { en: "Theme reference", ja: "テーマリファレンス" }
|
|
3000
|
+
};
|
|
3001
|
+
var README_INTRO = {
|
|
3002
|
+
empty: {
|
|
3003
|
+
en: "A blank Riebeckite application shell — no theme, no plugins, no components, and no content. Everything is yours to add.",
|
|
3004
|
+
ja: "空の Riebeckite アプリケーションシェルです。テーマもプラグインもコンポーネントもコンテンツもなく、すべてを自由に追加できます。"
|
|
3248
3005
|
},
|
|
3249
|
-
|
|
3250
|
-
|
|
3251
|
-
|
|
3252
|
-
en: "A `dataview` query renders a table of notes from the manifest.",
|
|
3253
|
-
ja: "`dataview` クエリがマニフェストからノート一覧を描画します。"
|
|
3254
|
-
},
|
|
3255
|
-
markdown: fence(
|
|
3256
|
-
"dataview",
|
|
3257
|
-
[
|
|
3258
|
-
'TABLE file.name AS "Name", status',
|
|
3259
|
-
"FROM #project",
|
|
3260
|
-
'WHERE status = "active"',
|
|
3261
|
-
"SORT file.name asc",
|
|
3262
|
-
"LIMIT 10"
|
|
3263
|
-
].join("\n")
|
|
3264
|
-
)
|
|
3006
|
+
minimal: {
|
|
3007
|
+
en: "The smallest readable Riebeckite site: Obsidian Markdown, the minimal theme, and a single page you can read end to end.",
|
|
3008
|
+
ja: "最小で読みやすい Riebeckite サイトです。Obsidian マークダウン・minimal テーマ・1 ページだけで、サイトの組み立て方を学べます。"
|
|
3265
3009
|
},
|
|
3266
|
-
|
|
3267
|
-
|
|
3268
|
-
|
|
3269
|
-
en: "A `query` fence is YAML that filters and sorts entries from the manifest.",
|
|
3270
|
-
ja: "`query` フェンスの YAML でマニフェストのエントリを絞り込み・並べ替えできます。"
|
|
3271
|
-
},
|
|
3272
|
-
markdown: fence(
|
|
3273
|
-
"query",
|
|
3274
|
-
[
|
|
3275
|
-
"filter:",
|
|
3276
|
-
" tags:",
|
|
3277
|
-
" any: [diary]",
|
|
3278
|
-
"sort:",
|
|
3279
|
-
" field: date",
|
|
3280
|
-
" order: desc",
|
|
3281
|
-
"limit: 5"
|
|
3282
|
-
].join("\n")
|
|
3283
|
-
)
|
|
3010
|
+
starter: {
|
|
3011
|
+
en: "Recommended default: a practical Markdown garden with search, navigation, and reading essentials.",
|
|
3012
|
+
ja: "大半のサイトにおすすめの既定構成です。検索・ナビゲーション・閲覧に必要な機能を備えた実用的な Markdown サイトを作れます。"
|
|
3284
3013
|
},
|
|
3285
|
-
|
|
3286
|
-
|
|
3287
|
-
|
|
3288
|
-
|
|
3289
|
-
|
|
3290
|
-
|
|
3291
|
-
|
|
3292
|
-
|
|
3293
|
-
|
|
3294
|
-
|
|
3295
|
-
|
|
3296
|
-
|
|
3297
|
-
|
|
3298
|
-
|
|
3299
|
-
|
|
3300
|
-
|
|
3301
|
-
|
|
3302
|
-
|
|
3303
|
-
|
|
3304
|
-
|
|
3305
|
-
|
|
3014
|
+
showcase: {
|
|
3015
|
+
en: "A feature-rich example that demonstrates the Riebeckite plugin ecosystem with rendered samples, reference pages, and local fixtures.",
|
|
3016
|
+
ja: "Riebeckite の Plugin エコシステムを実際に確認できる機能紹介用の構成です。描画例・リファレンスページ・ローカルのフィクスチャを含みます。"
|
|
3017
|
+
}
|
|
3018
|
+
};
|
|
3019
|
+
var README_WORDS = {
|
|
3020
|
+
en: {
|
|
3021
|
+
included: "What's included",
|
|
3022
|
+
languages: "Languages",
|
|
3023
|
+
theme: "Theme",
|
|
3024
|
+
plugins: "Plugins",
|
|
3025
|
+
pages: "Content pages",
|
|
3026
|
+
commands: "Commands",
|
|
3027
|
+
localization: "Localization",
|
|
3028
|
+
localizationBody: "Content lives in `content/` as plain Markdown. Translations sit next to the default file using the `<base>.<lang>.md` convention (`about.ja.md`, `about.en.md`). The default language keeps the unsuffixed path; the rest are served under `/lang/`. To add or remove a language, edit the `l10n(...)` plugin in `riebeckite.config.ts` and add or remove the matching translation files.",
|
|
3029
|
+
extending: "Extending",
|
|
3030
|
+
extendingBody: "Plugins and themes are registered in `riebeckite.config.ts`. Install a package, import its factory, and add it to the `plugins` array — or point `theme` at another theme factory. See the Riebeckite repository for the full plugin and theme index.",
|
|
3031
|
+
none: "none",
|
|
3032
|
+
noPlugins: "no plugins",
|
|
3033
|
+
single: "single language",
|
|
3034
|
+
configReference: "Configuration reference",
|
|
3035
|
+
configReferenceBody: "`riebeckite.config.ts` registers every plugin below with its full option set. Treat it as a starting point; the documented options live in the [configuration reference](https://riebeckite.dev/docs/reference/configuration-reference) and each plugin's package README.",
|
|
3036
|
+
factory: "Factory",
|
|
3037
|
+
options: "Options",
|
|
3038
|
+
emDash: "—",
|
|
3039
|
+
demoPages: "Try the demos",
|
|
3040
|
+
demoPagesBody: "The generated site ships content pages that exercise these features:",
|
|
3041
|
+
copyDemos: "Copy-paste demos",
|
|
3042
|
+
copyDemosBody: "Paste any of these snippets into a Markdown file under `content/` and run `npm exec riebeckite dev`. Each one renders through a plugin this preset registers."
|
|
3306
3043
|
},
|
|
3307
|
-
|
|
3308
|
-
|
|
3309
|
-
|
|
3310
|
-
|
|
3311
|
-
|
|
3312
|
-
|
|
3313
|
-
|
|
3314
|
-
|
|
3315
|
-
|
|
3316
|
-
|
|
3317
|
-
|
|
3318
|
-
|
|
3319
|
-
|
|
3320
|
-
|
|
3321
|
-
|
|
3322
|
-
|
|
3323
|
-
|
|
3324
|
-
|
|
3325
|
-
|
|
3044
|
+
ja: {
|
|
3045
|
+
included: "含まれているもの",
|
|
3046
|
+
languages: "言語",
|
|
3047
|
+
theme: "テーマ",
|
|
3048
|
+
plugins: "プラグイン",
|
|
3049
|
+
pages: "コンテンツページ",
|
|
3050
|
+
commands: "コマンド",
|
|
3051
|
+
localization: "ローカライズ",
|
|
3052
|
+
localizationBody: "コンテンツは `content/` にプレーンな Markdown として置きます。翻訳ページは既定ファイルの隣に `<base>.<lang>.md` の規則で配置します(`about.ja.md`、`about.en.md` など)。既定言語は接尾辞なしのパス、それ以外は `/lang/` のパスで配信されます。言語の追加・削除は `riebeckite.config.ts` の `l10n(...)` プラグインを編集し、対応する翻訳ファイルを追加・削除してください。",
|
|
3053
|
+
extending: "拡張",
|
|
3054
|
+
extendingBody: "プラグインとテーマは `riebeckite.config.ts` で登録します。パッケージをインストールし、ファクトリを import して `plugins` 配列に追加するか、`theme` を別のテーマファクトリに変更します。全プラグイン・テーマの一覧は Riebeckite リポジトリを参照してください。",
|
|
3055
|
+
none: "なし",
|
|
3056
|
+
noPlugins: "プラグインなし",
|
|
3057
|
+
single: "単一言語",
|
|
3058
|
+
configReference: "設定リファレンス",
|
|
3059
|
+
configReferenceBody: "`riebeckite.config.ts` には、以下の全プラグインが全オプション付きで登録されています。これは出発点として使い、設定の仕様は[設定リファレンス](https://riebeckite.dev/docs/reference/configuration-reference)と各プラグインパッケージの README を確認してください。",
|
|
3060
|
+
factory: "ファクトリ",
|
|
3061
|
+
options: "オプション",
|
|
3062
|
+
emDash: "—",
|
|
3063
|
+
demoPages: "デモを試す",
|
|
3064
|
+
demoPagesBody: "生成されたサイトには、各機能を体験できるコンテンツページが含まれています:",
|
|
3065
|
+
copyDemos: "コピーして使えるデモ",
|
|
3066
|
+
copyDemosBody: "以下のスニペットを `content/` 配下の Markdown ファイルに貼り付けて `npm exec riebeckite dev` を実行してください。それぞれ、このプリセットが登録しているプラグインでレンダリングされます。"
|
|
3067
|
+
}
|
|
3068
|
+
};
|
|
3069
|
+
function readme(preset, variables) {
|
|
3070
|
+
const ja = defaultLanguageForLocale(variables.locale) === "ja";
|
|
3071
|
+
return ja ? readmeJa(preset, variables) : readmeEn(preset, variables);
|
|
3072
|
+
}
|
|
3073
|
+
function readmeEn(preset, variables) {
|
|
3074
|
+
const words = README_WORDS.en;
|
|
3075
|
+
const lines = [
|
|
3076
|
+
`# ${variables.title}`,
|
|
3077
|
+
"",
|
|
3078
|
+
README_INTRO[preset.name].en,
|
|
3079
|
+
""
|
|
3080
|
+
];
|
|
3081
|
+
if (preset.readme !== "short") {
|
|
3082
|
+
lines.push(`## ${words.included}`, "");
|
|
3083
|
+
lines.push(
|
|
3084
|
+
`- **${words.languages}**: ${languagesLabel(preset, variables, words)}`
|
|
3085
|
+
);
|
|
3086
|
+
lines.push(
|
|
3087
|
+
`- **${words.theme}**: ${preset.theme ? `\`${preset.theme.package}\`` : words.none}`
|
|
3088
|
+
);
|
|
3089
|
+
lines.push(
|
|
3090
|
+
`- **${words.plugins}** (${preset.plugins.length}): ${preset.plugins.length === 0 ? words.noPlugins : preset.plugins.map((p) => `\`${p.package}\``).join(", ")}`
|
|
3091
|
+
);
|
|
3092
|
+
lines.push(`- **${words.pages}**: ${pagesLabel(preset) ?? words.none}`);
|
|
3093
|
+
lines.push("");
|
|
3094
|
+
if (preset.readme === "rich") {
|
|
3095
|
+
lines.push(...configurationReferenceLines(preset, variables, words));
|
|
3096
|
+
}
|
|
3097
|
+
}
|
|
3098
|
+
lines.push(`## ${words.commands}`, "");
|
|
3099
|
+
lines.push(
|
|
3100
|
+
"```sh",
|
|
3101
|
+
"npm install",
|
|
3102
|
+
"npm exec riebeckite check",
|
|
3103
|
+
"npm exec riebeckite dev",
|
|
3104
|
+
"npm exec riebeckite build",
|
|
3105
|
+
"```",
|
|
3106
|
+
""
|
|
3107
|
+
);
|
|
3108
|
+
if (preset.name !== "empty") {
|
|
3109
|
+
lines.push(
|
|
3110
|
+
"## First edits",
|
|
3111
|
+
"",
|
|
3112
|
+
"- `content/index.md`: the first published page.",
|
|
3113
|
+
"- `riebeckite.config.ts`: set `site.title`, `site.baseUrl`, and `content.directory`.",
|
|
3114
|
+
"- `public/favicon.ico`: replace the site icon when you are ready.",
|
|
3115
|
+
""
|
|
3116
|
+
);
|
|
3117
|
+
}
|
|
3118
|
+
if (variables.externalContent === true) {
|
|
3119
|
+
lines.push(...deploymentSecretLines("en"));
|
|
3120
|
+
}
|
|
3121
|
+
if (preset.readme === "rich") {
|
|
3122
|
+
lines.push(...demoPagesLines(preset, variables, words, "en"));
|
|
3123
|
+
lines.push(...copyPasteDemoLines(preset, words, "en"));
|
|
3124
|
+
lines.push(`## ${words.localization}`, "");
|
|
3125
|
+
lines.push(words.localizationBody, "");
|
|
3126
|
+
lines.push(`## ${words.extending}`, "");
|
|
3127
|
+
lines.push(words.extendingBody, "");
|
|
3128
|
+
lines.push(
|
|
3129
|
+
`- Docs: [English](${REPO}/blob/main/docs/README.md)`,
|
|
3130
|
+
` · [日本語](${REPO}/blob/main/docs/README.ja.md)`,
|
|
3131
|
+
""
|
|
3132
|
+
);
|
|
3133
|
+
}
|
|
3134
|
+
return lines.join("\n");
|
|
3135
|
+
}
|
|
3136
|
+
function readmeJa(preset, variables) {
|
|
3137
|
+
const words = README_WORDS.ja;
|
|
3138
|
+
const lines = [
|
|
3139
|
+
`# ${variables.title}`,
|
|
3140
|
+
"",
|
|
3141
|
+
README_INTRO[preset.name].ja,
|
|
3142
|
+
""
|
|
3143
|
+
];
|
|
3144
|
+
if (preset.readme !== "short") {
|
|
3145
|
+
lines.push(`## ${words.included}`, "");
|
|
3146
|
+
lines.push(
|
|
3147
|
+
`- **${words.languages}**: ${languagesLabel(preset, variables, words)}`
|
|
3148
|
+
);
|
|
3149
|
+
lines.push(
|
|
3150
|
+
`- **${words.theme}**: ${preset.theme ? `\`${preset.theme.package}\`` : words.none}`
|
|
3151
|
+
);
|
|
3152
|
+
lines.push(
|
|
3153
|
+
`- **${words.plugins}**(${preset.plugins.length} 個): ${preset.plugins.length === 0 ? words.noPlugins : preset.plugins.map((p) => `\`${p.package}\``).join(", ")}`
|
|
3154
|
+
);
|
|
3155
|
+
lines.push(`- **${words.pages}**: ${pagesLabel(preset) ?? words.none}`);
|
|
3156
|
+
lines.push("");
|
|
3157
|
+
if (preset.readme === "rich") {
|
|
3158
|
+
lines.push(...configurationReferenceLines(preset, variables, words));
|
|
3159
|
+
}
|
|
3160
|
+
}
|
|
3161
|
+
lines.push(`## ${words.commands}`, "");
|
|
3162
|
+
lines.push(
|
|
3163
|
+
"```sh",
|
|
3164
|
+
"npm install",
|
|
3165
|
+
"npm exec riebeckite check",
|
|
3166
|
+
"npm exec riebeckite dev",
|
|
3167
|
+
"npm exec riebeckite build",
|
|
3168
|
+
"```",
|
|
3169
|
+
""
|
|
3170
|
+
);
|
|
3171
|
+
if (preset.name !== "empty") {
|
|
3172
|
+
lines.push(
|
|
3173
|
+
"## 最初に編集する場所",
|
|
3174
|
+
"",
|
|
3175
|
+
"- `content/index.md`: 最初に公開されるページです。",
|
|
3176
|
+
"- `riebeckite.config.ts`: `site.title`、`site.baseUrl`、`content.directory` を設定します。",
|
|
3177
|
+
"- `public/favicon.ico`: 必要になったらサイトアイコンを置き換えます。",
|
|
3178
|
+
""
|
|
3179
|
+
);
|
|
3326
3180
|
}
|
|
3327
|
-
|
|
3328
|
-
|
|
3329
|
-
|
|
3330
|
-
|
|
3331
|
-
|
|
3332
|
-
|
|
3333
|
-
|
|
3334
|
-
|
|
3335
|
-
};
|
|
3336
|
-
|
|
3337
|
-
|
|
3338
|
-
|
|
3339
|
-
|
|
3340
|
-
|
|
3341
|
-
|
|
3342
|
-
|
|
3343
|
-
return
|
|
3344
|
-
${body}
|
|
3345
|
-
${tick}`;
|
|
3181
|
+
if (variables.externalContent === true) {
|
|
3182
|
+
lines.push(...deploymentSecretLines("ja"));
|
|
3183
|
+
}
|
|
3184
|
+
if (preset.readme === "rich") {
|
|
3185
|
+
lines.push(...demoPagesLines(preset, variables, words, "ja"));
|
|
3186
|
+
lines.push(...copyPasteDemoLines(preset, words, "ja"));
|
|
3187
|
+
lines.push(`## ${words.localization}`, "");
|
|
3188
|
+
lines.push(words.localizationBody, "");
|
|
3189
|
+
lines.push(`## ${words.extending}`, "");
|
|
3190
|
+
lines.push(words.extendingBody, "");
|
|
3191
|
+
lines.push(
|
|
3192
|
+
`- ドキュメント: [English](${REPO}/blob/main/docs/README.md)`,
|
|
3193
|
+
` · [日本語](${REPO}/blob/main/docs/README.ja.md)`,
|
|
3194
|
+
""
|
|
3195
|
+
);
|
|
3196
|
+
}
|
|
3197
|
+
return lines.join("\n");
|
|
3346
3198
|
}
|
|
3347
|
-
function
|
|
3348
|
-
|
|
3199
|
+
function deploymentSecretLines(language) {
|
|
3200
|
+
if (language === "ja") {
|
|
3201
|
+
return [
|
|
3202
|
+
"## デプロイ用 Secret",
|
|
3203
|
+
"",
|
|
3204
|
+
"GitHub Actions のデプロイは content repository を読み、Cloudflare へ配信します。初回実行の前に、次の repository secret を登録してください。",
|
|
3205
|
+
"",
|
|
3206
|
+
`- \`${GITHUB_ACTIONS_SECRETS.RIEBECKITE_CONTENT_READ_TOKEN}\` — **この Site Repository** に登録します。content repository が private / internal のときだけ必要です。content repository に限定した fine-grained token を作成し、**Contents: read** を付与します。`,
|
|
3207
|
+
`- \`${GITHUB_ACTIONS_SECRETS.SITE_DISPATCH_TOKEN}\` — **content repository** に登録します。content repository の \`notify-site.yml\` からこの Site へ更新を通知するために使います。この Site Repository に限定した fine-grained token を作成し、**Contents: read and write** を付与します。`,
|
|
3208
|
+
`- \`${GITHUB_ACTIONS_SECRETS.CLOUDFLARE_API_TOKEN}\` と \`${GITHUB_ACTIONS_SECRETS.CLOUDFLARE_ACCOUNT_ID}\` — **この Site Repository** に登録し、Cloudflare へのデプロイに使います。`,
|
|
3209
|
+
"",
|
|
3210
|
+
`workflow はこれらの secret 名を参照するだけで、値は含みません。値は絶対に commit しないでください。全体の手順は [別 Content Repository のガイド](${REPO}/blob/main/docs/docs/guides/deployment/separate-content-repository.md) を参照してください。`,
|
|
3211
|
+
""
|
|
3212
|
+
];
|
|
3213
|
+
}
|
|
3214
|
+
return [
|
|
3215
|
+
"## Deployment secrets",
|
|
3216
|
+
"",
|
|
3217
|
+
"The GitHub Actions deployment reads the content repository and deploys to Cloudflare. Add these repository secrets before the first run:",
|
|
3218
|
+
"",
|
|
3219
|
+
`- \`${GITHUB_ACTIONS_SECRETS.RIEBECKITE_CONTENT_READ_TOKEN}\` — in **this site repository**. Required only when the content repository is private or internal. Use a fine-grained token scoped to the content repository with **Contents: read**.`,
|
|
3220
|
+
`- \`${GITHUB_ACTIONS_SECRETS.SITE_DISPATCH_TOKEN}\` — in the **content repository**. Lets its \`notify-site.yml\` dispatch updates to this site. Use a fine-grained token scoped to this site repository with **Contents: read and write**.`,
|
|
3221
|
+
`- \`${GITHUB_ACTIONS_SECRETS.CLOUDFLARE_API_TOKEN}\` and \`${GITHUB_ACTIONS_SECRETS.CLOUDFLARE_ACCOUNT_ID}\` — in **this site repository** for the Cloudflare deploy.`,
|
|
3222
|
+
"",
|
|
3223
|
+
`The workflows reference these secret names and never contain their values. Never commit the values. See the [separate content repository guide](${REPO}/blob/main/docs/docs/guides/deployment/separate-content-repository.md) for the full setup.`,
|
|
3224
|
+
""
|
|
3225
|
+
];
|
|
3349
3226
|
}
|
|
3350
|
-
function
|
|
3351
|
-
|
|
3227
|
+
function languagesLabel(preset, variables, words) {
|
|
3228
|
+
if (preset.languages.length === 0) return words.none;
|
|
3229
|
+
if (preset.languages.length === 1) {
|
|
3230
|
+
const language = preset.name === "starter" ? defaultLanguageForLocale(variables.locale) : preset.languages[0];
|
|
3231
|
+
return `${language} (${words.single})`;
|
|
3232
|
+
}
|
|
3233
|
+
return preset.languages.join(", ");
|
|
3352
3234
|
}
|
|
3353
|
-
function
|
|
3354
|
-
|
|
3235
|
+
function pagesLabel(preset) {
|
|
3236
|
+
if (preset.contentPages.length === 0) return null;
|
|
3237
|
+
return preset.contentPages.map((page) => `/${page}`).join(", ");
|
|
3355
3238
|
}
|
|
3356
3239
|
function configurationReferenceLines(preset, variables, words) {
|
|
3357
3240
|
const lines = [
|
|
@@ -3395,28 +3278,6 @@ function demoPagesLines(preset, variables, words, language) {
|
|
|
3395
3278
|
lines.push("");
|
|
3396
3279
|
return lines;
|
|
3397
3280
|
}
|
|
3398
|
-
var README_DEMO_ORDER = [
|
|
3399
|
-
"@riebeckite/plugin-obsidian-markdown/callout",
|
|
3400
|
-
"@riebeckite/plugin-obsidian-markdown/wikilinks",
|
|
3401
|
-
"@riebeckite/plugin-code-enhance",
|
|
3402
|
-
"@riebeckite/plugin-code-tabs",
|
|
3403
|
-
"@riebeckite/plugin-mermaid",
|
|
3404
|
-
"@riebeckite/plugin-d2",
|
|
3405
|
-
"@riebeckite/plugin-graphviz",
|
|
3406
|
-
"@riebeckite/plugin-chartjs",
|
|
3407
|
-
"@riebeckite/plugin-vega-lite",
|
|
3408
|
-
"@riebeckite/plugin-wavedrom",
|
|
3409
|
-
"@riebeckite/plugin-markmap",
|
|
3410
|
-
"@riebeckite/plugin-map",
|
|
3411
|
-
"@riebeckite/plugin-marp",
|
|
3412
|
-
"@riebeckite/plugin-qr-code",
|
|
3413
|
-
"@riebeckite/plugin-rich-embed",
|
|
3414
|
-
"@riebeckite/plugin-gallery",
|
|
3415
|
-
"@riebeckite/plugin-dataview",
|
|
3416
|
-
"@riebeckite/plugin-query",
|
|
3417
|
-
"@riebeckite/plugin-bases",
|
|
3418
|
-
"@riebeckite/plugin-kanban"
|
|
3419
|
-
];
|
|
3420
3281
|
function copyPasteDemoLines(preset, words, language) {
|
|
3421
3282
|
const lines = [
|
|
3422
3283
|
`## ${words.copyDemos}`,
|
|
@@ -3435,6 +3296,151 @@ function copyPasteDemoLines(preset, words, language) {
|
|
|
3435
3296
|
return lines;
|
|
3436
3297
|
}
|
|
3437
3298
|
|
|
3299
|
+
// src/scaffold/version.ts
|
|
3300
|
+
var RIEBECKITE_VERSION = "^0.0.28";
|
|
3301
|
+
|
|
3302
|
+
// src/scaffold/templates.ts
|
|
3303
|
+
function siteTemplateFiles(preset, variables, options = {}) {
|
|
3304
|
+
return [
|
|
3305
|
+
{ path: "package.json", content: packageJson(preset, variables, options) },
|
|
3306
|
+
{
|
|
3307
|
+
path: "riebeckite.config.ts",
|
|
3308
|
+
content: riebeckiteConfig(preset, variables)
|
|
3309
|
+
},
|
|
3310
|
+
...copyTemplateTree("base"),
|
|
3311
|
+
...utilityTemplateFiles(options.utilities ?? SCAFFOLD_DEFAULT_UTILITIES),
|
|
3312
|
+
...copyTemplateTree(
|
|
3313
|
+
`presets/${preset.name}`,
|
|
3314
|
+
{},
|
|
3315
|
+
(filePath) => !filePath.startsWith("content/")
|
|
3316
|
+
),
|
|
3317
|
+
...presetContentFiles(preset, variables),
|
|
3318
|
+
{ path: "README.md", content: readme(preset, variables) },
|
|
3319
|
+
...contentPageFiles(variables, preset)
|
|
3320
|
+
];
|
|
3321
|
+
}
|
|
3322
|
+
var CONTENT_LANGUAGE_PATTERN = /^(.*)\.([a-z]{2}(?:-[A-Z]{2})?)\.md$/;
|
|
3323
|
+
function presetContentFiles(preset, variables) {
|
|
3324
|
+
const defaultLanguage = defaultLanguageForLocale(variables.locale);
|
|
3325
|
+
const files = copyTemplateTree(`presets/${preset.name}/content`);
|
|
3326
|
+
if (preset.languages.length <= 1) {
|
|
3327
|
+
const selected = /* @__PURE__ */ new Map();
|
|
3328
|
+
for (const file of files) {
|
|
3329
|
+
const match = CONTENT_LANGUAGE_PATTERN.exec(file.path);
|
|
3330
|
+
if (!match || !SCAFFOLD_LANGUAGES.includes(match[2])) {
|
|
3331
|
+
selected.set(file.path, { file, score: 0 });
|
|
3332
|
+
continue;
|
|
3333
|
+
}
|
|
3334
|
+
const [, base, language] = match;
|
|
3335
|
+
const score = language === defaultLanguage ? 2 : language === "en" ? 1 : 0;
|
|
3336
|
+
const current = selected.get(base);
|
|
3337
|
+
if (!current || score > current.score) {
|
|
3338
|
+
selected.set(base, { file, score });
|
|
3339
|
+
}
|
|
3340
|
+
}
|
|
3341
|
+
return [...selected.entries()].map(([relativePath, { file }]) => ({
|
|
3342
|
+
path: `content/${relativePath.endsWith(".md") ? relativePath : `${relativePath}.md`}`,
|
|
3343
|
+
content: replaceTitle(file.content, variables.title)
|
|
3344
|
+
}));
|
|
3345
|
+
}
|
|
3346
|
+
return files.map((file) => {
|
|
3347
|
+
const match = CONTENT_LANGUAGE_PATTERN.exec(file.path);
|
|
3348
|
+
let relativePath = file.path;
|
|
3349
|
+
if (match && SCAFFOLD_LANGUAGES.includes(match[2])) {
|
|
3350
|
+
const [, base, language] = match;
|
|
3351
|
+
relativePath = language === defaultLanguage ? `${base}.md` : `${base}.${language}.md`;
|
|
3352
|
+
}
|
|
3353
|
+
return {
|
|
3354
|
+
path: `content/${relativePath}`,
|
|
3355
|
+
content: replaceTitle(file.content, variables.title)
|
|
3356
|
+
};
|
|
3357
|
+
});
|
|
3358
|
+
}
|
|
3359
|
+
function replaceTitle(content, title) {
|
|
3360
|
+
return typeof content === "string" ? content.split("{{title}}").join(title) : content;
|
|
3361
|
+
}
|
|
3362
|
+
function packageJson(preset, variables, options) {
|
|
3363
|
+
const dependencies = {
|
|
3364
|
+
"@riebeckite/core": RIEBECKITE_VERSION,
|
|
3365
|
+
"@riebeckite/honox": RIEBECKITE_VERSION,
|
|
3366
|
+
"@riebeckite/ui": RIEBECKITE_VERSION,
|
|
3367
|
+
hono: "^4.12.25",
|
|
3368
|
+
honox: "0.1.56"
|
|
3369
|
+
};
|
|
3370
|
+
for (const plugin of preset.plugins) {
|
|
3371
|
+
dependencies[plugin.package] = RIEBECKITE_VERSION;
|
|
3372
|
+
}
|
|
3373
|
+
if (preset.theme) {
|
|
3374
|
+
dependencies[preset.theme.package] = RIEBECKITE_VERSION;
|
|
3375
|
+
}
|
|
3376
|
+
return `${JSON.stringify(
|
|
3377
|
+
{
|
|
3378
|
+
name: variables.name,
|
|
3379
|
+
private: true,
|
|
3380
|
+
version: "0.0.0",
|
|
3381
|
+
type: "module",
|
|
3382
|
+
scripts: {
|
|
3383
|
+
dev: "riebeckite dev",
|
|
3384
|
+
build: "riebeckite build",
|
|
3385
|
+
check: "riebeckite check",
|
|
3386
|
+
doctor: "riebeckite doctor",
|
|
3387
|
+
inspect: "riebeckite inspect"
|
|
3388
|
+
},
|
|
3389
|
+
dependencies,
|
|
3390
|
+
devDependencies: {
|
|
3391
|
+
"@hono/vite-build": "^1.11.1",
|
|
3392
|
+
"@hono/node-server": "^1.19.17",
|
|
3393
|
+
"@riebeckite/cli": RIEBECKITE_VERSION,
|
|
3394
|
+
"@types/node": "^24.5.2",
|
|
3395
|
+
typescript: "^5.0.0",
|
|
3396
|
+
vite: "^8.0.9",
|
|
3397
|
+
...options.cloudflareWorkers ? { wrangler: WRANGLER_VERSION } : {}
|
|
3398
|
+
}
|
|
3399
|
+
},
|
|
3400
|
+
null,
|
|
3401
|
+
2
|
|
3402
|
+
)}
|
|
3403
|
+
`;
|
|
3404
|
+
}
|
|
3405
|
+
function riebeckiteConfig(preset, variables) {
|
|
3406
|
+
const { title, description, baseUrl, locale } = variables;
|
|
3407
|
+
const lines = ['import { defineConfig } from "@riebeckite/core";'];
|
|
3408
|
+
for (const plugin of preset.plugins) {
|
|
3409
|
+
lines.push(`import { ${plugin.factory} } from "${plugin.package}";`);
|
|
3410
|
+
}
|
|
3411
|
+
if (preset.theme) {
|
|
3412
|
+
lines.push(
|
|
3413
|
+
`import { ${preset.theme.factory} } from "${preset.theme.package}";`
|
|
3414
|
+
);
|
|
3415
|
+
}
|
|
3416
|
+
lines.push("");
|
|
3417
|
+
lines.push("export default defineConfig({");
|
|
3418
|
+
lines.push(" site: {");
|
|
3419
|
+
lines.push(` title: ${JSON.stringify(title)},`);
|
|
3420
|
+
lines.push(` description: ${JSON.stringify(description)},`);
|
|
3421
|
+
lines.push(` baseUrl: ${JSON.stringify(baseUrl)},`);
|
|
3422
|
+
lines.push(` locale: ${JSON.stringify(locale)},`);
|
|
3423
|
+
lines.push(' defaultOgImage: "/ogp.png",');
|
|
3424
|
+
lines.push(" },");
|
|
3425
|
+
lines.push(" content: {");
|
|
3426
|
+
lines.push(' directory: "content",');
|
|
3427
|
+
lines.push(" },");
|
|
3428
|
+
if (preset.theme) {
|
|
3429
|
+
const theme = preset.theme;
|
|
3430
|
+
lines.push(
|
|
3431
|
+
` theme: ${theme.options ? `${theme.factory}(${theme.options})` : `${theme.factory}()`},`
|
|
3432
|
+
);
|
|
3433
|
+
}
|
|
3434
|
+
lines.push(" plugins: [");
|
|
3435
|
+
for (const plugin of preset.plugins) {
|
|
3436
|
+
lines.push(` ${pluginExpression(plugin, preset, variables)},`);
|
|
3437
|
+
}
|
|
3438
|
+
lines.push(" ],");
|
|
3439
|
+
lines.push("});");
|
|
3440
|
+
return `${lines.join("\n")}
|
|
3441
|
+
`;
|
|
3442
|
+
}
|
|
3443
|
+
|
|
3438
3444
|
// src/scaffold/next-steps.ts
|
|
3439
3445
|
function formatScaffoldNextSteps(relativeDirectory, options = {}) {
|
|
3440
3446
|
const lines = ["Next steps:"];
|