@wizzlethorpe/vaults 0.6.1 → 0.7.1
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/README.md +135 -17
- package/dist/build.js +501 -190
- package/dist/build.js.map +1 -1
- package/dist/commands/build.js +4 -4
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/init.js +13 -10
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/password.js +3 -1
- package/dist/commands/password.js.map +1 -1
- package/dist/commands/patreon.js +30 -20
- package/dist/commands/patreon.js.map +1 -1
- package/dist/commands/preview.js +10 -8
- package/dist/commands/preview.js.map +1 -1
- package/dist/commands/push.js +11 -9
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/role.js +5 -0
- package/dist/commands/role.js.map +1 -1
- package/dist/config.js +30 -15
- package/dist/config.js.map +1 -1
- package/dist/escape.js +29 -0
- package/dist/escape.js.map +1 -0
- package/dist/favicon.js +3 -36
- package/dist/favicon.js.map +1 -1
- package/dist/foundry-importer.js +61 -0
- package/dist/foundry-importer.js.map +1 -0
- package/dist/images.js +0 -30
- package/dist/images.js.map +1 -1
- package/dist/index.js +37 -4
- package/dist/index.js.map +1 -1
- package/dist/migrate/0.6-legacy-auth-settings.js +96 -0
- package/dist/migrate/0.6-legacy-auth-settings.js.map +1 -0
- package/dist/migrate/0.7-vaults-dir.js +74 -0
- package/dist/migrate/0.7-vaults-dir.js.map +1 -0
- package/dist/migrate/registry.js +6 -0
- package/dist/migrate/registry.js.map +1 -0
- package/dist/migrate/run.js +38 -0
- package/dist/migrate/run.js.map +1 -0
- package/dist/migrate/types.js +8 -0
- package/dist/migrate/types.js.map +1 -0
- package/dist/paths.js +66 -0
- package/dist/paths.js.map +1 -0
- package/dist/render/auth-template.js +23 -141
- package/dist/render/auth-template.js.map +1 -1
- package/dist/render/bases.js +56 -44
- package/dist/render/bases.js.map +1 -1
- package/dist/render/callouts.js +29 -10
- package/dist/render/callouts.js.map +1 -1
- package/dist/render/embed.js +124 -26
- package/dist/render/embed.js.map +1 -1
- package/dist/render/extensions.js +68 -0
- package/dist/render/extensions.js.map +1 -0
- package/dist/render/external-links.js +32 -0
- package/dist/render/external-links.js.map +1 -0
- package/dist/render/footer.js +37 -0
- package/dist/render/footer.js.map +1 -0
- package/dist/render/frontmatter.js +17 -0
- package/dist/render/frontmatter.js.map +1 -0
- package/dist/render/handlers/assets.js +123 -0
- package/dist/render/handlers/assets.js.map +1 -0
- package/dist/render/handlers/builtin/battlemap.js +199 -0
- package/dist/render/handlers/builtin/battlemap.js.map +1 -0
- package/dist/render/handlers/builtin/dice.js +78 -0
- package/dist/render/handlers/builtin/dice.js.map +1 -0
- package/dist/render/handlers/builtin/fm-code.js +50 -0
- package/dist/render/handlers/builtin/fm-code.js.map +1 -0
- package/dist/render/handlers/builtin/fm.js +83 -0
- package/dist/render/handlers/builtin/fm.js.map +1 -0
- package/dist/render/handlers/builtin/index.js +13 -0
- package/dist/render/handlers/builtin/index.js.map +1 -0
- package/dist/render/handlers/builtin/inline-format.js +26 -0
- package/dist/render/handlers/builtin/inline-format.js.map +1 -0
- package/dist/render/handlers/builtin/statblock.js +491 -0
- package/dist/render/handlers/builtin/statblock.js.map +1 -0
- package/dist/render/handlers/dispatch.js +182 -0
- package/dist/render/handlers/dispatch.js.map +1 -0
- package/dist/render/handlers/loader.js +90 -0
- package/dist/render/handlers/loader.js.map +1 -0
- package/dist/render/handlers/types.js +60 -0
- package/dist/render/handlers/types.js.map +1 -0
- package/dist/render/image-srcs.js +42 -0
- package/dist/render/image-srcs.js.map +1 -0
- package/dist/render/layout.js +62 -9
- package/dist/render/layout.js.map +1 -1
- package/dist/render/pipeline.js +38 -9
- package/dist/render/pipeline.js.map +1 -1
- package/dist/render/preview.js +53 -18
- package/dist/render/preview.js.map +1 -1
- package/dist/render/slug.js +5 -0
- package/dist/render/slug.js.map +1 -1
- package/dist/render/styles.js +124 -15
- package/dist/render/styles.js.map +1 -1
- package/dist/render/wikilink.js +15 -4
- package/dist/render/wikilink.js.map +1 -1
- package/dist/scan.js +1 -1
- package/dist/scan.js.map +1 -1
- package/dist/settings.js +25 -4
- package/dist/settings.js.map +1 -1
- package/dist/version.js +36 -0
- package/dist/version.js.map +1 -0
- package/package.json +12 -12
- package/dist/api.js +0 -42
- package/dist/api.js.map +0 -1
- package/dist/render/mcp-template.js +0 -239
- package/dist/render/mcp-template.js.map +0 -1
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
// Built-in code-block `statblock` handler — D&D 5e creature statblocks.
|
|
2
|
+
//
|
|
3
|
+
// Schema is compatible with the Fantasy Statblocks Obsidian plugin so the
|
|
4
|
+
// same source renders in Obsidian (via the plugin) and on the published
|
|
5
|
+
// wiki (via this handler):
|
|
6
|
+
//
|
|
7
|
+
// ```statblock
|
|
8
|
+
// name: Goblin
|
|
9
|
+
// size: Small
|
|
10
|
+
// type: humanoid
|
|
11
|
+
// ac: 15
|
|
12
|
+
// hp: 7
|
|
13
|
+
// hit_dice: 2d6
|
|
14
|
+
// speed: 30 ft.
|
|
15
|
+
// stats: [8, 14, 10, 10, 8, 8]
|
|
16
|
+
// saves:
|
|
17
|
+
// - dexterity: 5
|
|
18
|
+
// skillsaves:
|
|
19
|
+
// - stealth: 6
|
|
20
|
+
// senses: darkvision 60 ft., passive Perception 9
|
|
21
|
+
// languages: Common, Goblin
|
|
22
|
+
// cr: "1/4"
|
|
23
|
+
// traits:
|
|
24
|
+
// - name: Nimble Escape
|
|
25
|
+
// desc: The goblin can take the Disengage or Hide action as a bonus action.
|
|
26
|
+
// actions:
|
|
27
|
+
// - name: Scimitar
|
|
28
|
+
// desc: "*Melee Weapon Attack:* +4 to hit. *Hit:* 5 (1d6 + 2) slashing damage."
|
|
29
|
+
// ```
|
|
30
|
+
//
|
|
31
|
+
// Coverage: name/size/type/subtype/alignment, ac (+ ac_class), hp (+ hit_dice),
|
|
32
|
+
// speed, six abilities (stats), saves, skillsaves, damage_*, condition_immunities,
|
|
33
|
+
// senses, languages, cr, traits, spells (basic spellcasting list), actions,
|
|
34
|
+
// reactions, legendary_actions (+ legendary_description). Inline markdown in
|
|
35
|
+
// `desc` fields supports **bold**, *italic*, and `code`. Other Fantasy Statblocks
|
|
36
|
+
// features (innate spellcasting, PF2e/13th-age custom layouts, dice-roller
|
|
37
|
+
// integration, JS callbacks, image fields) are not supported in v1.
|
|
38
|
+
import yaml from "js-yaml";
|
|
39
|
+
import { htmlEscape } from "../../../escape.js";
|
|
40
|
+
import { registerBuiltinAssets } from "../assets.js";
|
|
41
|
+
const ABILITY_NAMES = ["STR", "DEX", "CON", "INT", "WIS", "CHA"];
|
|
42
|
+
const ABILITY_SHORT = {
|
|
43
|
+
strength: "Str", dexterity: "Dex", constitution: "Con",
|
|
44
|
+
intelligence: "Int", wisdom: "Wis", charisma: "Cha",
|
|
45
|
+
};
|
|
46
|
+
function modifier(score) {
|
|
47
|
+
const mod = Math.floor((score - 10) / 2);
|
|
48
|
+
return mod >= 0 ? `+${mod}` : String(mod);
|
|
49
|
+
}
|
|
50
|
+
// Tiny inline-markdown formatter for desc fields. Pre-substituted handler
|
|
51
|
+
// HTML (e.g. `dice:` buttons) reaches us as sentinel tokens emitted by
|
|
52
|
+
// preprocessHandlers below. We html-escape and apply bold/italic/code
|
|
53
|
+
// first, then splice the original handler HTML back over the tokens.
|
|
54
|
+
// Wikilinks are still NOT processed (would require coupling to the
|
|
55
|
+
// broader render pipeline). Authors who need wikilinks should put them
|
|
56
|
+
// in a separate paragraph outside the statblock.
|
|
57
|
+
//
|
|
58
|
+
// Token format is a distinctive ASCII sentinel: htmlEscape leaves the
|
|
59
|
+
// underscores and digits alone, the bold/italic/code regexes can't
|
|
60
|
+
// match across it, and the chance a user writes this exact string in a
|
|
61
|
+
// desc is effectively zero.
|
|
62
|
+
const TOKEN_RE = /__VAULTSTATBLOCK_HANDLER_(\d+)__/g;
|
|
63
|
+
function makeToken(i) { return `__VAULTSTATBLOCK_HANDLER_${i}__`; }
|
|
64
|
+
function formatInline(s, spliceback) {
|
|
65
|
+
let out = htmlEscape(s);
|
|
66
|
+
out = out.replace(/\*\*([^*]+)\*\*/g, "<strong>$1</strong>");
|
|
67
|
+
out = out.replace(/(^|[^*])\*([^*\n]+)\*(?!\*)/g, "$1<em>$2</em>");
|
|
68
|
+
out = out.replace(/`([^`]+)`/g, "<code>$1</code>");
|
|
69
|
+
out = out.replace(TOKEN_RE, (_, idx) => spliceback[Number(idx)] ?? "");
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Walk every string field in the monster, replace `` `prefix: …` ``
|
|
74
|
+
* inline-handler invocations with sentinel tokens, and remember the
|
|
75
|
+
* resulting HTML in `spliceback`. The synchronous formatInline pass below
|
|
76
|
+
* then weaves the tokens back in after escaping. Two-step so the rest of
|
|
77
|
+
* statblock rendering stays sync.
|
|
78
|
+
*
|
|
79
|
+
* Generic (Object.keys + typeof === "string") so future fields tokenize
|
|
80
|
+
* automatically — a new top-level string field doesn't need plumbing.
|
|
81
|
+
*/
|
|
82
|
+
async function preprocessHandlers(m, ctx) {
|
|
83
|
+
const spliceback = [];
|
|
84
|
+
const tokenize = async (s) => {
|
|
85
|
+
if (!s || !s.includes("`"))
|
|
86
|
+
return s;
|
|
87
|
+
// Local regex (not module-level) so /g state doesn't leak across calls.
|
|
88
|
+
const re = /`([a-z][\w-]*):\s*([^`]*)`/g;
|
|
89
|
+
let out = "";
|
|
90
|
+
let last = 0;
|
|
91
|
+
let match;
|
|
92
|
+
while ((match = re.exec(s)) !== null) {
|
|
93
|
+
const replaced = await ctx.applyInlineHandlers(match[0]);
|
|
94
|
+
if (replaced === match[0])
|
|
95
|
+
continue; // unhandled prefix; leave in place
|
|
96
|
+
out += s.slice(last, match.index);
|
|
97
|
+
out += makeToken(spliceback.length);
|
|
98
|
+
spliceback.push(replaced);
|
|
99
|
+
last = match.index + match[0].length;
|
|
100
|
+
}
|
|
101
|
+
if (last === 0)
|
|
102
|
+
return s; // nothing matched
|
|
103
|
+
out += s.slice(last);
|
|
104
|
+
return out;
|
|
105
|
+
};
|
|
106
|
+
// Top-level scalar string fields (name, ac, hp, speed, cr, senses, …).
|
|
107
|
+
const mAny = m;
|
|
108
|
+
for (const k of Object.keys(mAny)) {
|
|
109
|
+
if (typeof mAny[k] === "string")
|
|
110
|
+
mAny[k] = await tokenize(mAny[k]);
|
|
111
|
+
}
|
|
112
|
+
// Per-entry name and desc inside trait/action lists. Nested traits are
|
|
113
|
+
// hoisted to the top level prefixed with the parent's name (v1: flat).
|
|
114
|
+
const list = async (xs) => {
|
|
115
|
+
if (!xs)
|
|
116
|
+
return;
|
|
117
|
+
// Inline-flatten one level of nested .traits[].traits before tokenizing.
|
|
118
|
+
for (let i = 0; i < xs.length; i++) {
|
|
119
|
+
const x = xs[i];
|
|
120
|
+
if (Array.isArray(x.traits) && x.traits.length) {
|
|
121
|
+
const parentName = x.name ?? "";
|
|
122
|
+
const flattened = x.traits.map((nested) => ({
|
|
123
|
+
...nested,
|
|
124
|
+
name: parentName ? `${parentName}: ${nested.name ?? ""}`.trim() : (nested.name ?? ""),
|
|
125
|
+
}));
|
|
126
|
+
delete x.traits;
|
|
127
|
+
xs.splice(i + 1, 0, ...flattened);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
for (const x of xs) {
|
|
131
|
+
if (typeof x.name === "string")
|
|
132
|
+
x.name = await tokenize(x.name);
|
|
133
|
+
if (typeof x.desc === "string")
|
|
134
|
+
x.desc = await tokenize(x.desc);
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
await list(m.traits);
|
|
138
|
+
await list(m.actions);
|
|
139
|
+
await list(m.bonus_actions);
|
|
140
|
+
await list(m.reactions);
|
|
141
|
+
await list(m.legendary_actions);
|
|
142
|
+
await list(m.mythic_actions);
|
|
143
|
+
await list(m.lair_actions);
|
|
144
|
+
await list(m.triggered_actions);
|
|
145
|
+
// spells: each entry is a string OR object. Tokenize string values
|
|
146
|
+
// (top-level entries and per-key values inside object entries) so
|
|
147
|
+
// dice:/fm: work inside.
|
|
148
|
+
if (m.spells) {
|
|
149
|
+
for (let i = 0; i < m.spells.length; i++) {
|
|
150
|
+
const s = m.spells[i];
|
|
151
|
+
if (typeof s === "string") {
|
|
152
|
+
m.spells[i] = (await tokenize(s)) ?? s;
|
|
153
|
+
}
|
|
154
|
+
else if (s && typeof s === "object") {
|
|
155
|
+
for (const k of Object.keys(s)) {
|
|
156
|
+
const v = s[k];
|
|
157
|
+
if (typeof v === "string")
|
|
158
|
+
s[k] = (await tokenize(v)) ?? v;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return spliceback;
|
|
164
|
+
}
|
|
165
|
+
function property(label, value, spliceback) {
|
|
166
|
+
if (value === undefined || value === "")
|
|
167
|
+
return "";
|
|
168
|
+
return `<p class="statblock-property"><strong>${label}</strong> ${formatInline(value, spliceback)}</p>`;
|
|
169
|
+
}
|
|
170
|
+
function header(m, spliceback) {
|
|
171
|
+
const name = m.name ?? "Unnamed";
|
|
172
|
+
const sub = [m.size, m.type, m.subtype && `(${m.subtype})`, m.alignment]
|
|
173
|
+
.filter(Boolean).join(" ");
|
|
174
|
+
// The image path is treated as a vault-relative reference; we emit it
|
|
175
|
+
// verbatim. Authors typically use a path their wiki's image cache serves
|
|
176
|
+
// (e.g. "portraits/foo.webp"). The sanitizer allows src/alt/class on img.
|
|
177
|
+
const img = m.image
|
|
178
|
+
? `<img class="statblock-image" src="${htmlEscape(m.image)}" alt="${htmlEscape(name)}">`
|
|
179
|
+
: "";
|
|
180
|
+
// Rendered as a div, not an h2: the page sanitizer restricts <h2> to
|
|
181
|
+
// class="sr-only" only (GFM footnotes use it). The name is also not part
|
|
182
|
+
// of the page's article outline — pages can have multiple statblocks.
|
|
183
|
+
return (`<div class="statblock-header">` +
|
|
184
|
+
img +
|
|
185
|
+
`<div class="statblock-name">${formatInline(name, spliceback)}</div>` +
|
|
186
|
+
(sub ? `<p class="statblock-subheading">${formatInline(sub, spliceback)}</p>` : "") +
|
|
187
|
+
`</div>`);
|
|
188
|
+
}
|
|
189
|
+
function topProperties(m, spliceback) {
|
|
190
|
+
const parts = [];
|
|
191
|
+
if (m.ac !== undefined) {
|
|
192
|
+
parts.push(property("Armor Class", m.ac_class ? `${m.ac} (${m.ac_class})` : String(m.ac), spliceback));
|
|
193
|
+
}
|
|
194
|
+
if (m.hp !== undefined) {
|
|
195
|
+
parts.push(property("Hit Points", m.hit_dice ? `${m.hp} (${m.hit_dice})` : String(m.hp), spliceback));
|
|
196
|
+
}
|
|
197
|
+
if (m.speed !== undefined)
|
|
198
|
+
parts.push(property("Speed", String(m.speed), spliceback));
|
|
199
|
+
return parts.join("");
|
|
200
|
+
}
|
|
201
|
+
function stats(m) {
|
|
202
|
+
if (!m.stats || m.stats.length !== 6)
|
|
203
|
+
return "";
|
|
204
|
+
const cells = m.stats.map((score, i) => `<div class="statblock-stat">` +
|
|
205
|
+
`<div class="statblock-stat-name">${ABILITY_NAMES[i]}</div>` +
|
|
206
|
+
`<div class="statblock-stat-value">${score} (${modifier(score)})</div>` +
|
|
207
|
+
`</div>`).join("");
|
|
208
|
+
return `<div class="statblock-stats">${cells}</div>`;
|
|
209
|
+
}
|
|
210
|
+
// FS accepts saves/skillsaves either as an array of single-key objects OR a
|
|
211
|
+
// single multi-key object. Normalize to a flat list of [key, val] pairs.
|
|
212
|
+
function bonusList(entries, labelFor) {
|
|
213
|
+
if (!entries)
|
|
214
|
+
return "";
|
|
215
|
+
const pairs = [];
|
|
216
|
+
if (Array.isArray(entries)) {
|
|
217
|
+
for (const entry of entries) {
|
|
218
|
+
for (const [k, v] of Object.entries(entry)) {
|
|
219
|
+
if (typeof v === "number")
|
|
220
|
+
pairs.push([k, v]);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
else if (typeof entries === "object") {
|
|
225
|
+
for (const [k, v] of Object.entries(entries)) {
|
|
226
|
+
if (typeof v === "number")
|
|
227
|
+
pairs.push([k, v]);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
if (!pairs.length)
|
|
231
|
+
return "";
|
|
232
|
+
return pairs.map(([key, val]) => {
|
|
233
|
+
const sign = val >= 0 ? "+" : "";
|
|
234
|
+
return `${labelFor(key)} ${sign}${val}`;
|
|
235
|
+
}).join(", ");
|
|
236
|
+
}
|
|
237
|
+
function midProperties(m, spliceback) {
|
|
238
|
+
const saves = bonusList(m.saves, k => ABILITY_SHORT[k.toLowerCase()] ?? k);
|
|
239
|
+
const skills = bonusList(m.skillsaves, k => k.charAt(0).toUpperCase() + k.slice(1));
|
|
240
|
+
return [
|
|
241
|
+
property("Saving Throws", saves || undefined, spliceback),
|
|
242
|
+
property("Skills", skills || undefined, spliceback),
|
|
243
|
+
property("Damage Vulnerabilities", m.damage_vulnerabilities, spliceback),
|
|
244
|
+
property("Damage Resistances", m.damage_resistances, spliceback),
|
|
245
|
+
property("Damage Immunities", m.damage_immunities, spliceback),
|
|
246
|
+
property("Condition Immunities", m.condition_immunities, spliceback),
|
|
247
|
+
property("Senses", m.senses, spliceback),
|
|
248
|
+
property("Languages", m.languages, spliceback),
|
|
249
|
+
property("Challenge", m.cr !== undefined ? String(m.cr) : undefined, spliceback),
|
|
250
|
+
].join("");
|
|
251
|
+
}
|
|
252
|
+
function trait(t, spliceback) {
|
|
253
|
+
return `<p class="statblock-trait">` +
|
|
254
|
+
`<strong><em>${formatInline(t.name ?? "", spliceback)}.</em></strong> ` +
|
|
255
|
+
formatInline(t.desc ?? "", spliceback) +
|
|
256
|
+
`</p>`;
|
|
257
|
+
}
|
|
258
|
+
// Render a single per-level line: bold label + comma-separated, auto-italicized
|
|
259
|
+
// spell list. Used for both string entries (split on first `:`) and object
|
|
260
|
+
// entries (key = label, value = spell list string).
|
|
261
|
+
function spellLevelLine(label, list, spliceback) {
|
|
262
|
+
const spellList = list.split(",")
|
|
263
|
+
.map(s => s.trim()).filter(Boolean)
|
|
264
|
+
.map(s => `<em>${formatInline(s, spliceback)}</em>`)
|
|
265
|
+
.join(", ");
|
|
266
|
+
return `<p class="statblock-spell-level">` +
|
|
267
|
+
`<strong>${formatInline(label, spliceback)}</strong>: ${spellList}` +
|
|
268
|
+
`</p>`;
|
|
269
|
+
}
|
|
270
|
+
// Render Fantasy Statblocks `spells:` — first entry is intro prose shown as
|
|
271
|
+
// a Spellcasting trait header; remaining entries are per-level lines.
|
|
272
|
+
//
|
|
273
|
+
// Each entry can be a string (split on `:`) OR an object whose keys are
|
|
274
|
+
// level labels and values are the spell list strings (FS Spell type).
|
|
275
|
+
// Entries without a `:` fall through as plain paragraphs.
|
|
276
|
+
function spellcasting(spells, spliceback) {
|
|
277
|
+
if (!spells?.length)
|
|
278
|
+
return "";
|
|
279
|
+
const [first, ...rest] = spells;
|
|
280
|
+
// Object as the first entry has no obvious "intro prose" interpretation;
|
|
281
|
+
// treat all entries as levels in that case (no Spellcasting header).
|
|
282
|
+
const introIsString = typeof first === "string";
|
|
283
|
+
const head = introIsString
|
|
284
|
+
? `<p class="statblock-trait">` +
|
|
285
|
+
`<strong><em>Spellcasting.</em></strong> ` +
|
|
286
|
+
formatInline(first, spliceback) +
|
|
287
|
+
`</p>`
|
|
288
|
+
: "";
|
|
289
|
+
const levels = introIsString ? rest : spells;
|
|
290
|
+
const lines = levels.map(entry => {
|
|
291
|
+
if (typeof entry === "string") {
|
|
292
|
+
const colon = entry.indexOf(":");
|
|
293
|
+
if (colon < 0)
|
|
294
|
+
return `<p class="statblock-spell-level">${formatInline(entry, spliceback)}</p>`;
|
|
295
|
+
return spellLevelLine(entry.slice(0, colon), entry.slice(colon + 1), spliceback);
|
|
296
|
+
}
|
|
297
|
+
// Object form: render each key/value pair as its own level line.
|
|
298
|
+
return Object.entries(entry)
|
|
299
|
+
.map(([label, list]) => spellLevelLine(label, String(list ?? ""), spliceback))
|
|
300
|
+
.join("");
|
|
301
|
+
}).join("");
|
|
302
|
+
return head + lines;
|
|
303
|
+
}
|
|
304
|
+
function section(label, items, spliceback, intro) {
|
|
305
|
+
if (!items?.length)
|
|
306
|
+
return "";
|
|
307
|
+
// `label` is hard-coded ("Actions"/"Reactions"/…); escape rather than
|
|
308
|
+
// formatInline so a literal "*" in a future label doesn't get italicised.
|
|
309
|
+
return `<div class="statblock-section">` +
|
|
310
|
+
`<h3 class="statblock-section-heading">${htmlEscape(label)}</h3>` +
|
|
311
|
+
(intro ? `<p class="statblock-section-intro">${formatInline(intro, spliceback)}</p>` : "") +
|
|
312
|
+
items.map(t => trait(t, spliceback)).join("") +
|
|
313
|
+
`</div>`;
|
|
314
|
+
}
|
|
315
|
+
export const statblockHandler = {
|
|
316
|
+
codeBlock: "statblock",
|
|
317
|
+
async render(content, ctx) {
|
|
318
|
+
let m;
|
|
319
|
+
try {
|
|
320
|
+
m = yaml.load(content) ?? {};
|
|
321
|
+
}
|
|
322
|
+
catch (err) {
|
|
323
|
+
return {
|
|
324
|
+
html: `<div class="statblock statblock-error">` +
|
|
325
|
+
`<strong>statblock parse error:</strong> ` +
|
|
326
|
+
htmlEscape(err instanceof Error ? err.message : String(err)) +
|
|
327
|
+
`</div>`,
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
// Pre-substitute any `prefix: …` inline-handler invocations in desc
|
|
331
|
+
// fields with sentinel tokens; spliceback holds the resulting HTML and
|
|
332
|
+
// formatInline weaves it back in after escaping.
|
|
333
|
+
const spliceback = await preprocessHandlers(m, ctx);
|
|
334
|
+
const spellsHtml = spellcasting(m.spells, spliceback);
|
|
335
|
+
const traitsHtml = m.traits?.length || spellsHtml
|
|
336
|
+
? `<div class="statblock-section">${(m.traits ?? []).map(t => trait(t, spliceback)).join("")}${spellsHtml}</div>`
|
|
337
|
+
: "";
|
|
338
|
+
const sourceText = Array.isArray(m.source) ? m.source.join(", ") : m.source;
|
|
339
|
+
const sourceHtml = sourceText
|
|
340
|
+
? `<p class="statblock-source"><em>${formatInline(sourceText, spliceback)}</em></p>`
|
|
341
|
+
: "";
|
|
342
|
+
const noteHtml = m.note
|
|
343
|
+
? `<p class="statblock-note"><em>${formatInline(m.note, spliceback)}</em></p>`
|
|
344
|
+
: "";
|
|
345
|
+
const body = [
|
|
346
|
+
header(m, spliceback),
|
|
347
|
+
`<div class="statblock-rule"></div>`,
|
|
348
|
+
`<div class="statblock-block">${topProperties(m, spliceback)}</div>`,
|
|
349
|
+
`<div class="statblock-rule"></div>`,
|
|
350
|
+
stats(m),
|
|
351
|
+
`<div class="statblock-rule"></div>`,
|
|
352
|
+
`<div class="statblock-block">${midProperties(m, spliceback)}</div>`,
|
|
353
|
+
`<div class="statblock-rule statblock-rule-tapered"></div>`,
|
|
354
|
+
traitsHtml,
|
|
355
|
+
section("Actions", m.actions, spliceback),
|
|
356
|
+
section("Bonus Actions", m.bonus_actions, spliceback),
|
|
357
|
+
section("Reactions", m.reactions, spliceback),
|
|
358
|
+
section("Legendary Actions", m.legendary_actions, spliceback, m.legendary_description),
|
|
359
|
+
section("Mythic Actions", m.mythic_actions, spliceback, m.mythic_description),
|
|
360
|
+
section("Lair Actions", m.lair_actions, spliceback),
|
|
361
|
+
section("Triggered Actions", m.triggered_actions, spliceback),
|
|
362
|
+
sourceHtml,
|
|
363
|
+
noteHtml,
|
|
364
|
+
].join("");
|
|
365
|
+
return { html: `<div class="statblock">${body}</div>` };
|
|
366
|
+
},
|
|
367
|
+
};
|
|
368
|
+
// Visual style follows the standard D&D 5e statblock (parchment, scarlet
|
|
369
|
+
// rules, small-caps headings) but uses `.statblock-*` class names borrowed
|
|
370
|
+
// from the Fantasy Statblocks plugin where they overlap, so a vault user
|
|
371
|
+
// could supply their own theme by overriding the same selectors. CSS
|
|
372
|
+
// variables match Fantasy Statblocks' palette tokens for portability.
|
|
373
|
+
const STATBLOCK_CSS = `
|
|
374
|
+
.statblock {
|
|
375
|
+
--statblock-primary-color: #7a200d;
|
|
376
|
+
--statblock-rule-color: #922610;
|
|
377
|
+
--statblock-bg: #fdf1dc;
|
|
378
|
+
--statblock-heading-font: "Libre Baskerville", "Lora", Georgia, serif;
|
|
379
|
+
--statblock-content-font: "Noto Sans", Calibri, Helvetica, Arial, sans-serif;
|
|
380
|
+
|
|
381
|
+
background: var(--statblock-bg);
|
|
382
|
+
color: #000;
|
|
383
|
+
border: 1px solid #ddd;
|
|
384
|
+
box-shadow: 0 0 1.5em #ddd;
|
|
385
|
+
padding: 0.6rem 0.75rem;
|
|
386
|
+
margin: 1rem 0;
|
|
387
|
+
font-family: var(--statblock-content-font);
|
|
388
|
+
font-size: 14px;
|
|
389
|
+
line-height: 1.4;
|
|
390
|
+
}
|
|
391
|
+
.statblock p { margin: 0.15rem 0; }
|
|
392
|
+
.statblock-name {
|
|
393
|
+
font-family: var(--statblock-heading-font);
|
|
394
|
+
font-size: 1.6rem;
|
|
395
|
+
font-variant: small-caps;
|
|
396
|
+
font-weight: 700;
|
|
397
|
+
color: var(--statblock-primary-color);
|
|
398
|
+
margin: 0;
|
|
399
|
+
line-height: 1.1;
|
|
400
|
+
}
|
|
401
|
+
.statblock-subheading {
|
|
402
|
+
font-style: italic;
|
|
403
|
+
font-size: 0.9rem;
|
|
404
|
+
margin: 0.1rem 0 0;
|
|
405
|
+
}
|
|
406
|
+
.statblock-rule {
|
|
407
|
+
height: 5px;
|
|
408
|
+
background: var(--statblock-rule-color);
|
|
409
|
+
border: none;
|
|
410
|
+
margin: 0.4rem 0;
|
|
411
|
+
clip-path: polygon(0 0, 100% 0, 100% 30%, 0 100%);
|
|
412
|
+
}
|
|
413
|
+
.statblock-rule-tapered {
|
|
414
|
+
clip-path: polygon(0 0, 100% 0, 95% 100%, 5% 100%);
|
|
415
|
+
}
|
|
416
|
+
.statblock-block { margin: 0.3rem 0; }
|
|
417
|
+
.statblock-property {
|
|
418
|
+
color: var(--statblock-primary-color);
|
|
419
|
+
}
|
|
420
|
+
.statblock-property strong {
|
|
421
|
+
font-weight: bold;
|
|
422
|
+
}
|
|
423
|
+
.statblock-stats {
|
|
424
|
+
display: grid;
|
|
425
|
+
grid-template-columns: repeat(6, 1fr);
|
|
426
|
+
gap: 0.25rem;
|
|
427
|
+
text-align: center;
|
|
428
|
+
color: var(--statblock-primary-color);
|
|
429
|
+
margin: 0.3rem 0;
|
|
430
|
+
}
|
|
431
|
+
.statblock-stat-name {
|
|
432
|
+
font-weight: bold;
|
|
433
|
+
font-variant: small-caps;
|
|
434
|
+
}
|
|
435
|
+
.statblock-section { margin-top: 0.6rem; }
|
|
436
|
+
.statblock-section-heading {
|
|
437
|
+
font-family: var(--statblock-heading-font);
|
|
438
|
+
font-variant: small-caps;
|
|
439
|
+
font-weight: normal;
|
|
440
|
+
font-size: 1.3rem;
|
|
441
|
+
color: var(--statblock-primary-color);
|
|
442
|
+
border-bottom: 1px solid var(--statblock-primary-color);
|
|
443
|
+
margin: 0.5rem 0 0.3rem;
|
|
444
|
+
}
|
|
445
|
+
.statblock-trait {
|
|
446
|
+
margin: 0.3rem 0;
|
|
447
|
+
text-indent: -1rem;
|
|
448
|
+
padding-left: 1rem;
|
|
449
|
+
}
|
|
450
|
+
.statblock-trait strong em {
|
|
451
|
+
font-weight: bold;
|
|
452
|
+
font-style: italic;
|
|
453
|
+
}
|
|
454
|
+
.statblock-spell-level {
|
|
455
|
+
margin: 0.15rem 0 0.15rem 1rem;
|
|
456
|
+
text-indent: -1rem;
|
|
457
|
+
padding-left: 1rem;
|
|
458
|
+
}
|
|
459
|
+
.statblock-section-intro {
|
|
460
|
+
font-style: italic;
|
|
461
|
+
margin: 0.3rem 0;
|
|
462
|
+
}
|
|
463
|
+
.statblock-error {
|
|
464
|
+
background: #fde7e3;
|
|
465
|
+
color: #7a200d;
|
|
466
|
+
border-color: #7a200d;
|
|
467
|
+
}
|
|
468
|
+
.statblock-image {
|
|
469
|
+
float: right;
|
|
470
|
+
width: 75px;
|
|
471
|
+
height: 75px;
|
|
472
|
+
object-fit: cover;
|
|
473
|
+
margin: 0 0 0.4rem 0.5rem;
|
|
474
|
+
border: 2px solid var(--statblock-rule-color);
|
|
475
|
+
border-radius: 2px;
|
|
476
|
+
}
|
|
477
|
+
.statblock-source,
|
|
478
|
+
.statblock-note {
|
|
479
|
+
font-size: 0.85rem;
|
|
480
|
+
margin-top: 0.4rem;
|
|
481
|
+
color: #555;
|
|
482
|
+
}
|
|
483
|
+
`;
|
|
484
|
+
registerBuiltinAssets(statblockHandler, {
|
|
485
|
+
styles: [{ source: "builtin/statblock.css", content: STATBLOCK_CSS }],
|
|
486
|
+
// Styles ride into the Foundry-import bundle so synced statblocks
|
|
487
|
+
// render identically. Scripts intentionally omitted: dice runtime is
|
|
488
|
+
// replaced by Foundry's [[/r]] enricher in links.mjs.
|
|
489
|
+
foundry: { styles: true },
|
|
490
|
+
});
|
|
491
|
+
//# sourceMappingURL=statblock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statblock.js","sourceRoot":"","sources":["../../../../src/render/handlers/builtin/statblock.ts"],"names":[],"mappings":"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"}
|