@wizzlethorpe/vaults 0.13.5 → 0.15.0
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 +2 -2
- package/dist/asset-refs.js +282 -0
- package/dist/asset-refs.js.map +1 -0
- package/dist/auth.js.map +1 -1
- package/dist/build.js +393 -544
- package/dist/build.js.map +1 -1
- package/dist/commands/build.js +0 -4
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/preview.js +0 -4
- package/dist/commands/preview.js.map +1 -1
- package/dist/commands/push.js +4 -9
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/role.js +55 -14
- package/dist/commands/role.js.map +1 -1
- package/dist/config.js +25 -5
- package/dist/config.js.map +1 -1
- package/dist/escape.js +20 -0
- package/dist/escape.js.map +1 -1
- package/dist/foundry-adventure.js +86 -0
- package/dist/foundry-adventure.js.map +1 -0
- package/dist/foundry-defaults.js +65 -0
- package/dist/foundry-defaults.js.map +1 -0
- package/dist/foundry-grafts.js +610 -0
- package/dist/foundry-grafts.js.map +1 -0
- package/dist/foundry-html.js +196 -0
- package/dist/foundry-html.js.map +1 -0
- package/dist/foundry-importer.bundle.js +1192 -322
- package/dist/foundry-importer.js +2 -7
- package/dist/foundry-importer.js.map +1 -1
- package/dist/foundry-meta.js +56 -0
- package/dist/foundry-meta.js.map +1 -0
- package/dist/foundry-module-journal.js +133 -0
- package/dist/foundry-module-journal.js.map +1 -0
- package/dist/foundry-module-render.js +75 -0
- package/dist/foundry-module-render.js.map +1 -0
- package/dist/foundry-module.js +1082 -0
- package/dist/foundry-module.js.map +1 -0
- package/dist/foundry-types.js +28 -0
- package/dist/foundry-types.js.map +1 -0
- package/dist/foundry-version.js +30 -0
- package/dist/foundry-version.js.map +1 -0
- package/dist/frontmatter-defaults.js +68 -0
- package/dist/frontmatter-defaults.js.map +1 -0
- package/dist/index.js +5 -9
- package/dist/index.js.map +1 -1
- package/dist/manifest.js +115 -0
- package/dist/manifest.js.map +1 -0
- package/dist/migrate/0.15-foundry-patch-keys.js +51 -0
- package/dist/migrate/0.15-foundry-patch-keys.js.map +1 -0
- package/dist/migrate/0.15-foundry-pinned-id.js +68 -0
- package/dist/migrate/0.15-foundry-pinned-id.js.map +1 -0
- package/dist/migrate/files.js +66 -0
- package/dist/migrate/files.js.map +1 -0
- package/dist/migrate/registry.js +4 -0
- package/dist/migrate/registry.js.map +1 -1
- package/dist/migrate/run.js +36 -2
- package/dist/migrate/run.js.map +1 -1
- package/dist/render/auth-template.js +331 -42
- package/dist/render/auth-template.js.map +1 -1
- package/dist/render/bases.js +22 -38
- package/dist/render/bases.js.map +1 -1
- package/dist/render/cover.js +23 -1
- package/dist/render/cover.js.map +1 -1
- package/dist/render/handlers/assets.js +5 -34
- package/dist/render/handlers/assets.js.map +1 -1
- package/dist/render/handlers/builtin/battlemap.js +4 -1
- package/dist/render/handlers/builtin/battlemap.js.map +1 -1
- package/dist/render/handlers/builtin/download.js +90 -0
- package/dist/render/handlers/builtin/download.js.map +1 -0
- package/dist/render/handlers/builtin/fm-code.js +2 -2
- package/dist/render/handlers/builtin/fm-code.js.map +1 -1
- package/dist/render/handlers/builtin/foundry-manifest.js +158 -0
- package/dist/render/handlers/builtin/foundry-manifest.js.map +1 -0
- package/dist/render/handlers/builtin/fvtt-link.js +39 -0
- package/dist/render/handlers/builtin/fvtt-link.js.map +1 -0
- package/dist/render/handlers/builtin/index.js +4 -1
- package/dist/render/handlers/builtin/index.js.map +1 -1
- package/dist/render/handlers/builtin/statblock.js +0 -4
- package/dist/render/handlers/builtin/statblock.js.map +1 -1
- package/dist/render/handlers/types.js.map +1 -1
- package/dist/render/pipeline.js +4 -1
- package/dist/render/pipeline.js.map +1 -1
- package/dist/render/slug.js +0 -5
- package/dist/render/slug.js.map +1 -1
- package/dist/settings.js +156 -21
- package/dist/settings.js.map +1 -1
- package/dist/zip.js +78 -0
- package/dist/zip.js.map +1 -0
- package/package.json +4 -3
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
// Turn a page's rendered article HTML into what a Foundry journal wants:
|
|
2
|
+
// links become Foundry UUIDs, media becomes `@vaults/<variant>/<path>`
|
|
3
|
+
// references the provider resolves on the reader's machine.
|
|
4
|
+
//
|
|
5
|
+
// The variant segment is load-bearing: each role's deploy holds only the
|
|
6
|
+
// files its pages reference, so resolving without it means guessing, and
|
|
7
|
+
// guessing upward hands a player a file their role was built to withhold.
|
|
8
|
+
// A `.foundry.html` suffix marks a body to inline; anything else is a file.
|
|
9
|
+
import { createHash } from "node:crypto";
|
|
10
|
+
import { htmlAttr, htmlUnescape } from "./escape.js";
|
|
11
|
+
const ANCHOR_RE = /<a\b([^>]*)>([\s\S]*?)<\/a>/gi;
|
|
12
|
+
const MEDIA_SRC_RE = /<(img|audio|video)\b([^>]*?)src="([^"]+)"([^>]*)>/gi;
|
|
13
|
+
const HREF_RE = /\bhref="([^"]+)"/i;
|
|
14
|
+
const CLASS_RE = /\bclass="([^"]+)"/i;
|
|
15
|
+
const TAG_RE = /<[^>]+>/g;
|
|
16
|
+
/** `"/Characters/Marlo"` back to `"Characters/Marlo.md"`. */
|
|
17
|
+
export function pathFromHref(href) {
|
|
18
|
+
// The entity pass comes first because it is the parser layer: the serializer
|
|
19
|
+
// wrote `'` as `'`, and only what it produces is percent-encoded.
|
|
20
|
+
const unescaped = htmlUnescape(href);
|
|
21
|
+
if (!unescaped.startsWith("/"))
|
|
22
|
+
return null;
|
|
23
|
+
const clean = unescaped.split("#")[0].split("?")[0];
|
|
24
|
+
let decoded;
|
|
25
|
+
try {
|
|
26
|
+
decoded = decodeURIComponent(clean);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
decoded = clean;
|
|
30
|
+
}
|
|
31
|
+
const trimmed = decoded.replace(/^\/+/, "").replace(/\.html$/i, "");
|
|
32
|
+
return trimmed ? `${trimmed}.md` : null;
|
|
33
|
+
}
|
|
34
|
+
/** The UUID a link to `path` should carry, or null if nothing points there. */
|
|
35
|
+
export function uuidFor(path, index, prefer = "journal") {
|
|
36
|
+
const target = index.targets.get(path);
|
|
37
|
+
if (!target)
|
|
38
|
+
return null;
|
|
39
|
+
const docUuid = target.doc
|
|
40
|
+
? (index.packaging === "adventure"
|
|
41
|
+
? `${target.doc.type}.${target.doc.id}`
|
|
42
|
+
: `Compendium.${index.moduleId}.${target.doc.pack}.${target.doc.type}.${target.doc.id}`)
|
|
43
|
+
: null;
|
|
44
|
+
const pageUuid = target.entry && target.page
|
|
45
|
+
? (index.packaging === "adventure"
|
|
46
|
+
? `JournalEntry.${target.entry}.JournalEntryPage.${target.page}`
|
|
47
|
+
: `Compendium.${index.moduleId}.${index.journalPack}.JournalEntry.${target.entry}.JournalEntryPage.${target.page}`)
|
|
48
|
+
: null;
|
|
49
|
+
return prefer === "doc" ? (docUuid ?? pageUuid) : (pageUuid ?? docUuid);
|
|
50
|
+
}
|
|
51
|
+
const stripTags = (s) => s.replace(TAG_RE, "").trim();
|
|
52
|
+
/** `}` inside a label would close the enricher early. */
|
|
53
|
+
const escapeBraces = (s) => s.replace(/\{/g, "{").replace(/\}/g, "}");
|
|
54
|
+
/**
|
|
55
|
+
* Rewrite internal links to Foundry UUID enrichers.
|
|
56
|
+
*
|
|
57
|
+
* A link the index cannot place is left exactly as it is: an unresolved
|
|
58
|
+
* wikilink already renders as broken-styled text on the wiki, and turning it
|
|
59
|
+
* into a UUID that resolves to nothing would look worse in Foundry, not
|
|
60
|
+
* better.
|
|
61
|
+
*/
|
|
62
|
+
export function rewriteLinks(html, index) {
|
|
63
|
+
return html.replace(ANCHOR_RE, (whole, attrs, inner) => {
|
|
64
|
+
const cls = CLASS_RE.exec(attrs)?.[1] ?? "";
|
|
65
|
+
const card = /\bbases-card\b/.test(cls);
|
|
66
|
+
if (!card && !/\binternal-link\b/.test(cls))
|
|
67
|
+
return whole;
|
|
68
|
+
if (/\bis-unresolved\b/.test(cls))
|
|
69
|
+
return whole;
|
|
70
|
+
const href = HREF_RE.exec(attrs)?.[1];
|
|
71
|
+
if (!href)
|
|
72
|
+
return whole;
|
|
73
|
+
const path = pathFromHref(href);
|
|
74
|
+
if (!path)
|
|
75
|
+
return whole;
|
|
76
|
+
const uuid = uuidFor(path, index, /\bfvtt-doc-link\b/.test(cls) ? "doc" : "journal");
|
|
77
|
+
if (!uuid)
|
|
78
|
+
return whole;
|
|
79
|
+
// A card's layout lives in its markup, which an @UUID enricher would
|
|
80
|
+
// flatten to a text link. A content-link anchor keeps the markup and
|
|
81
|
+
// Foundry's click handler opens the document all the same.
|
|
82
|
+
if (card) {
|
|
83
|
+
return `<a class="${htmlAttr(cls)} content-link" draggable="true" data-link="" data-uuid="${htmlAttr(uuid)}">${inner}</a>`;
|
|
84
|
+
}
|
|
85
|
+
const label = escapeBraces(stripTags(inner));
|
|
86
|
+
return label ? `@UUID[${uuid}]{${label}}` : `@UUID[${uuid}]`;
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Point media at the variant-scoped file the provider should fetch.
|
|
91
|
+
*
|
|
92
|
+
* Where a file lands is a runtime fact — it depends on the world it is being
|
|
93
|
+
* built into — so the CLI names what it wants rather than guessing a path.
|
|
94
|
+
*/
|
|
95
|
+
export function rewriteAssets(html, variant) {
|
|
96
|
+
const mark = (p) => `@vaults/${variant}/${p.replace(/^\/+/, "")}`;
|
|
97
|
+
let out = html.replace(MEDIA_SRC_RE, (whole, tag, before, src, after) => src.startsWith("/") ? `<${tag}${before}src="${htmlAttr(mark(src))}"${after}>` : whole);
|
|
98
|
+
out = out.replace(ANCHOR_RE, (whole, attrs, inner) => {
|
|
99
|
+
const cls = CLASS_RE.exec(attrs)?.[1] ?? "";
|
|
100
|
+
if (!/\bpassthrough-link\b/.test(cls))
|
|
101
|
+
return whole;
|
|
102
|
+
const href = HREF_RE.exec(attrs)?.[1];
|
|
103
|
+
if (!href?.startsWith("/"))
|
|
104
|
+
return whole;
|
|
105
|
+
return `<a${attrs.replace(HREF_RE, `href="${htmlAttr(mark(href))}"`)}>${inner}</a>`;
|
|
106
|
+
});
|
|
107
|
+
return out;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Rewrite `@vault/PATH` values inside a document patch to vault references.
|
|
111
|
+
*
|
|
112
|
+
* `@vault/` is the authoring form: written by hand in frontmatter, and left in
|
|
113
|
+
* the Scene sidecars exported from Foundry. It has no variant because the
|
|
114
|
+
* author is describing their own vault, where there is only one copy of the
|
|
115
|
+
* file. Resolving it means deciding which role's copy this document reads, and
|
|
116
|
+
* that is the same decision `visibility` already made for the body.
|
|
117
|
+
*/
|
|
118
|
+
export function rewriteVaultRefs(value, variant) {
|
|
119
|
+
if (typeof value === "string") {
|
|
120
|
+
return (value.startsWith("@vault/")
|
|
121
|
+
? `@vaults/${variant}/${value.slice("@vault/".length)}`
|
|
122
|
+
: value);
|
|
123
|
+
}
|
|
124
|
+
if (Array.isArray(value))
|
|
125
|
+
return value.map((v) => rewriteVaultRefs(v, variant));
|
|
126
|
+
if (value && typeof value === "object") {
|
|
127
|
+
return Object.fromEntries(Object.entries(value)
|
|
128
|
+
.map(([k, v]) => [k, rewriteVaultRefs(v, variant)]));
|
|
129
|
+
}
|
|
130
|
+
return value;
|
|
131
|
+
}
|
|
132
|
+
/** Everything a body needs before it can be a journal page. */
|
|
133
|
+
/**
|
|
134
|
+
* Wrap role-gated callouts in Foundry's own secret sections.
|
|
135
|
+
*
|
|
136
|
+
* A player-visible document carries the GM's body, so DM callouts reach the
|
|
137
|
+
* table inside it — hidden by Foundry from anyone below owner, which is what
|
|
138
|
+
* `<section class="secret">` means to a journal. Hidden, not absent: the text
|
|
139
|
+
* is in the document's data, the same trade the old sync made.
|
|
140
|
+
*/
|
|
141
|
+
/** Where the element opening at `start` closes, balancing same-name tags. */
|
|
142
|
+
function elementEnd(html, start, tagName) {
|
|
143
|
+
const tag = new RegExp(`</?${tagName}\\b`, "g");
|
|
144
|
+
tag.lastIndex = start;
|
|
145
|
+
let depth = 0;
|
|
146
|
+
let t;
|
|
147
|
+
while ((t = tag.exec(html)) !== null) {
|
|
148
|
+
depth += t[0].startsWith("</") ? -1 : 1;
|
|
149
|
+
if (depth === 0)
|
|
150
|
+
return html.indexOf(">", t.index) + 1;
|
|
151
|
+
}
|
|
152
|
+
return -1;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* A player-visible document's body: the GM's full rendering inside one
|
|
156
|
+
* secret section (stripped by Foundry below owner), then the player
|
|
157
|
+
* variant's in the open. The player gets the actual player render, so no
|
|
158
|
+
* difference between the two — base rows, transclusions, links — needs to
|
|
159
|
+
* be found and marked. The module's CSS hides the player copy for the GM.
|
|
160
|
+
*/
|
|
161
|
+
export function dualVariantBody(gmHtml, playerHtml) {
|
|
162
|
+
const id = createHash("sha1").update(gmHtml).digest("hex").slice(0, 16);
|
|
163
|
+
return `<section class="secret vaults-gm" id="secret-${id}">${gmHtml}</section>`
|
|
164
|
+
+ `<div class="vaults-player-view">${playerHtml}</div>`;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Drop every element carrying the `vaults-web-only` class from the Foundry
|
|
168
|
+
* body; the wiki keeps it. Handlers set it on their wrapper, and a page can
|
|
169
|
+
* put it on raw HTML of its own.
|
|
170
|
+
*/
|
|
171
|
+
export function stripWebOnly(html) {
|
|
172
|
+
// The class matched as a whole token: \b treats a hyphen as a boundary, so
|
|
173
|
+
// it alone would also match "vaults-web-only-not".
|
|
174
|
+
const open = /<([a-zA-Z][a-zA-Z0-9-]*)\b[^>]*\bclass="(?:[^"]* )?vaults-web-only(?: [^"]*)?"[^>]*>/g;
|
|
175
|
+
let out = "";
|
|
176
|
+
let at = 0;
|
|
177
|
+
let m;
|
|
178
|
+
while ((m = open.exec(html)) !== null) {
|
|
179
|
+
if (m.index < at)
|
|
180
|
+
continue; // nested inside something already dropped
|
|
181
|
+
const end = VOID_TAGS.has(m[1].toLowerCase()) || m[0].endsWith("/>")
|
|
182
|
+
? m.index + m[0].length
|
|
183
|
+
: elementEnd(html, m.index, m[1]);
|
|
184
|
+
if (end < 0)
|
|
185
|
+
continue; // unclosed: leave it, keep looking
|
|
186
|
+
out += html.slice(at, m.index);
|
|
187
|
+
at = end;
|
|
188
|
+
open.lastIndex = end;
|
|
189
|
+
}
|
|
190
|
+
return out + html.slice(at);
|
|
191
|
+
}
|
|
192
|
+
const VOID_TAGS = new Set(["img", "br", "hr", "input", "source", "track", "wbr", "embed", "area", "col", "link", "meta"]);
|
|
193
|
+
export function toFoundryHtml(html, index, variant) {
|
|
194
|
+
return rewriteAssets(rewriteLinks(stripWebOnly(html), index), variant);
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=foundry-html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"foundry-html.js","sourceRoot":"","sources":["../src/foundry-html.ts"],"names":[],"mappings":"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"}
|