astro-lilypond 0.10.0 → 0.11.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 CHANGED
@@ -2,12 +2,14 @@
2
2
 
3
3
  An [Astro](https://astro.build) integration for rendering [LilyPond](https://lilypond.org) music notation to images.
4
4
 
5
- - Render LilyPond via Markdown or with a `<LilyPond>` component
6
- - Works with both `unified()` and `satteri()` Markdown processors
7
- - Zero runtime JavaScript!
8
- - Supports all LilyPond syntax
9
-
10
- Docs: https://lilypond.ky.fyi
5
+ - Render musical scores via Markdown or with an Astro component.
6
+ - Works with remark, rehype and satteri Markdown processors out-of-the-box.
7
+ - Zero client-side JavaScript! Images are compiled at build time.
8
+ - Automatic `alt` text generated from the score’s title and composer. (Or supply your own.)
9
+ - Use the content loader to pass in a folder full of `.ly` files and get back an Astro content collection.
10
+ - Works with all LilyPond syntax.
11
+
12
+ Read the docs: https://lilypond.ky.fyi
11
13
 
12
14
  ## Quick Start
13
15
 
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import type { AstroIntegration } from "astro";
2
2
  import { type PluginOptions } from "./plugins/index.js";
3
3
  import { type LilypondDefaults } from "./render.js";
4
+ export declare const LY_EXTENSIONS: readonly [".ly", ".lilypond", ".ily"];
4
5
  export type { LilypondDefaults, PluginOptions as LilypondPluginOptions };
5
6
  export interface LilypondPage {
6
7
  src: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAG9C,OAAO,EACN,KAAK,aAAa,EAKlB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEN,KAAK,gBAAgB,EAGrB,MAAM,aAAa,CAAC;AAmBrB,YAAY,EAAE,gBAAgB,EAAE,aAAa,IAAI,qBAAqB,EAAE,CAAC;AAEzE,MAAM,WAAW,YAAY;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACrD;;;OAGG;IACH,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAEvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAE5B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAiED,MAAM,CAAC,OAAO,UAAU,QAAQ,CAC/B,OAAO,GAAE,eAAoB,GAC3B,gBAAgB,CA2IlB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAG9C,OAAO,EACN,KAAK,aAAa,EAKlB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEN,KAAK,gBAAgB,EAGrB,MAAM,aAAa,CAAC;AAmBrB,eAAO,MAAM,aAAa,YAAI,KAAK,EAAE,WAAW,EAAE,MAAM,CAAU,CAAC;AAEnE,YAAY,EAAE,gBAAgB,EAAE,aAAa,IAAI,qBAAqB,EAAE,CAAC;AAEzE,MAAM,WAAW,YAAY;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACrD;;;OAGG;IACH,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAEvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAE5B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAiED,MAAM,CAAC,OAAO,UAAU,QAAQ,CAC/B,OAAO,GAAE,eAAoB,GAC3B,gBAAgB,CA2IlB"}
package/dist/index.js CHANGED
@@ -5,10 +5,10 @@ import { promisify } from "node:util";
5
5
  import { pruneOrphanedAssets, pruneStaleAssets } from "./deleteAssets.js";
6
6
  import { rehypePlugin, remarkPlugin, satteriPlugin, } from "./plugins/index.js";
7
7
  import { defaultOptions, render, resolveCrop, } from "./render.js";
8
- import { altTextFor, assetsUrlBaseFor, contentHashFor, includePathsFor, parseLyHeader, parseLyImportQuery, prependVersion, resolveDefaults, sourceNameFor, titleFor, } from "./utils/index.js";
8
+ import { altTextFor, assetsUrlBaseFor, contentHashFor, includePathsFor, lyTypeDeclarationsFor, parseLyHeader, parseLyImportQuery, prependVersion, RECOGNIZED_QUERY_PARAMS, resolveDefaults, sourceNameFor, titleFor, } from "./utils/index.js";
9
9
  import { writeAssets } from "./writeAsset.js";
10
10
  const execFileAsync = promisify(execFile);
11
- const LY_EXTENSIONS = [".ly", ".lilypond", ".ily"];
11
+ export const LY_EXTENSIONS = [".ly", ".lilypond", ".ily"];
12
12
  function lyFilePlugin(options) {
13
13
  return {
14
14
  name: "vite-plugin-astro-lilypond-ly",
@@ -151,7 +151,7 @@ export default function lilypond(options = {}) {
151
151
  "astro:config:done": ({ injectTypes }) => {
152
152
  injectTypes({
153
153
  filename: "ly-types.d.ts",
154
- content: LY_EXTENSIONS.map((ext) => `declare module "*${ext}" {\n const content: import("astro-lilypond").LilypondContent;\n export default content;\n}`).join("\n"),
154
+ content: lyTypeDeclarationsFor(LY_EXTENSIONS, RECOGNIZED_QUERY_PARAMS),
155
155
  });
156
156
  },
157
157
  "astro:build:done": async ({ logger }) => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import type { Loader } from "astro/loaders";
2
+ import { z } from "astro/zod";
3
+ import { type LilypondContent } from "./index.js";
4
+ import type { PluginOptions } from "./plugins/index.js";
5
+ import { type KnownLyHeaderFields } from "./utils/index.js";
6
+ export interface GenerateIdOptions {
7
+ /** The path to the entry file, relative to `base`. */
8
+ entry: string;
9
+ /** The base directory URL entries are resolved from. */
10
+ base: URL;
11
+ /** The entry's parsed `\header` fields (see `parseLyHeaderFields`). */
12
+ header: Record<string, string>;
13
+ }
14
+ export interface LilypondLoaderOptions extends PluginOptions {
15
+ /**
16
+ * Glob pattern(s) matching score files, relative to `base`.
17
+ * @default "**\/*.{ly,ily,lilypond}"
18
+ */
19
+ pattern?: string | string[];
20
+ /**
21
+ * Base directory the pattern resolves from — relative to the project
22
+ * root, or an absolute file URL.
23
+ */
24
+ base: string | URL;
25
+ /**
26
+ * Generates an entry's collection id.
27
+ * @default the file's path relative to `base`, POSIX-separated, with its extension stripped.
28
+ */
29
+ generateId?: (options: GenerateIdOptions) => string;
30
+ /**
31
+ * Directory name, relative to Astro's `publicDir`, that rendered assets
32
+ * are written into. Exclusive to this collection — the loader prunes
33
+ * anything under it that isn't currently referenced by one of its own
34
+ * entries, so don't point two different collections (or the `lilypond()`
35
+ * integration's own `outputDir`) at the same directory.
36
+ * @default `"_lilypond/<collection name>"`
37
+ */
38
+ outputDir?: string;
39
+ }
40
+ export interface LilypondHeaderData extends KnownLyHeaderFields {
41
+ /** Header fields outside LilyPond's standard set (e.g. `mutopiacomposer`). */
42
+ extra: Record<string, string>;
43
+ }
44
+ export interface LilypondCollectionEntry extends LilypondContent, LilypondHeaderData {
45
+ }
46
+ export declare const lilypondEntrySchema: z.ZodObject<{
47
+ pages: z.ZodArray<z.ZodObject<{
48
+ src: z.ZodString;
49
+ width: z.ZodOptional<z.ZodNumber>;
50
+ height: z.ZodOptional<z.ZodNumber>;
51
+ }, z.core.$strip>>;
52
+ alt: z.ZodOptional<z.ZodString>;
53
+ dedication: z.ZodOptional<z.ZodString>;
54
+ title: z.ZodOptional<z.ZodString>;
55
+ subtitle: z.ZodOptional<z.ZodString>;
56
+ subsubtitle: z.ZodOptional<z.ZodString>;
57
+ instrument: z.ZodOptional<z.ZodString>;
58
+ poet: z.ZodOptional<z.ZodString>;
59
+ composer: z.ZodOptional<z.ZodString>;
60
+ meter: z.ZodOptional<z.ZodString>;
61
+ arranger: z.ZodOptional<z.ZodString>;
62
+ piece: z.ZodOptional<z.ZodString>;
63
+ opus: z.ZodOptional<z.ZodString>;
64
+ copyright: z.ZodOptional<z.ZodString>;
65
+ tagline: z.ZodOptional<z.ZodString>;
66
+ extra: z.ZodRecord<z.ZodString, z.ZodString>;
67
+ }, z.core.$strip>;
68
+ /**
69
+ * Content Loader to turn a directory of `.ly` files into a content collection.
70
+ */
71
+ export declare function lilypondLoader(options: LilypondLoaderOptions): Loader;
72
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,CAAC,EAAE,MAAM,WAAW,CAAC;AAE9B,OAAO,EAAE,KAAK,eAAe,EAAiB,MAAM,YAAY,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAKN,KAAK,mBAAmB,EAOxB,MAAM,kBAAkB,CAAC;AAK1B,MAAM,WAAW,iBAAiB;IACjC,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,IAAI,EAAE,GAAG,CAAC;IACV,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC3D;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAE5B;;;OAGG;IACH,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC;IAEnB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,MAAM,CAAC;IAEpD;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAmB,SAAQ,mBAAmB;IAC9D,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,uBAChB,SAAQ,eAAe,EACtB,kBAAkB;CAAG;AAEvB,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;iBAuB9B,CAAC;AA2BH;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAkLrE"}
package/dist/loader.js ADDED
@@ -0,0 +1,202 @@
1
+ import { glob, readFile } from "node:fs/promises";
2
+ import { basename, join, posix, relative, sep } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { z } from "astro/zod";
5
+ import { pruneOrphanedAssets } from "./deleteAssets.js";
6
+ import { LY_EXTENSIONS } from "./index.js";
7
+ import { defaultOptions, render, resolveCrop } from "./render.js";
8
+ import { altTextFor, assetsUrlBaseFor, contentHashFor, includePathsFor, parseLyHeaderFields, prependVersion, resolveDefaults, sourceNameFor, splitHeaderFields, titleFor, } from "./utils/index.js";
9
+ import { writeAssets } from "./writeAsset.js";
10
+ const DEFAULT_PATTERN = `**/*.{${LY_EXTENSIONS.map((ext) => ext.slice(1)).join(",")}}`;
11
+ export const lilypondEntrySchema = z.object({
12
+ pages: z.array(z.object({
13
+ src: z.string(),
14
+ width: z.number().optional(),
15
+ height: z.number().optional(),
16
+ })),
17
+ alt: z.string().optional(),
18
+ dedication: z.string().optional(),
19
+ title: z.string().optional(),
20
+ subtitle: z.string().optional(),
21
+ subsubtitle: z.string().optional(),
22
+ instrument: z.string().optional(),
23
+ poet: z.string().optional(),
24
+ composer: z.string().optional(),
25
+ meter: z.string().optional(),
26
+ arranger: z.string().optional(),
27
+ piece: z.string().optional(),
28
+ opus: z.string().optional(),
29
+ copyright: z.string().optional(),
30
+ tagline: z.string().optional(),
31
+ extra: z.record(z.string(), z.string()),
32
+ });
33
+ function stripLyExtension(entryPath) {
34
+ for (const ext of LY_EXTENSIONS) {
35
+ if (entryPath.endsWith(ext))
36
+ return entryPath.slice(0, -ext.length);
37
+ }
38
+ return entryPath;
39
+ }
40
+ function toPosixPath(path) {
41
+ return path.split(sep).join("/");
42
+ }
43
+ function defaultGenerateId({ entry }) {
44
+ return stripLyExtension(toPosixPath(entry));
45
+ }
46
+ function resolveBaseUrl(base, root) {
47
+ if (base instanceof URL)
48
+ return base;
49
+ const withTrailingSlash = base.endsWith("/") ? base : `${base}/`;
50
+ return new URL(withTrailingSlash, root);
51
+ }
52
+ function posixRelative(from, to) {
53
+ return toPosixPath(relative(from, to));
54
+ }
55
+ /**
56
+ * Content Loader to turn a directory of `.ly` files into a content collection.
57
+ */
58
+ export function lilypondLoader(options) {
59
+ const { pattern = DEFAULT_PATTERN, base, generateId = defaultGenerateId, format, defaults, timeout, outputDir, } = options;
60
+ const resolved = resolveDefaults(defaults);
61
+ const crop = resolveCrop(resolved.crop, "component");
62
+ const resolvedFormat = format ?? defaultOptions.format;
63
+ return {
64
+ name: "astro-lilypond-loader",
65
+ schema: lilypondEntrySchema,
66
+ async load(context) {
67
+ const { config, collection, store, logger, watcher, generateDigest, parseData, } = context;
68
+ const outputDirName = outputDir ?? posix.join("_lilypond", collection);
69
+ const assetsDir = join(fileURLToPath(config.publicDir), outputDirName);
70
+ const assetsUrlBase = assetsUrlBaseFor(config.base, outputDirName);
71
+ const rootDir = fileURLToPath(config.root);
72
+ const baseUrl = resolveBaseUrl(base, config.root);
73
+ const baseDir = fileURLToPath(baseUrl);
74
+ async function syncEntry(entry) {
75
+ const filePath = join(baseDir, entry);
76
+ let source;
77
+ try {
78
+ source = await readFile(filePath, "utf8");
79
+ }
80
+ catch (err) {
81
+ logger.error(`astro-lilypond: error reading ${entry}: ${err.message}`);
82
+ return undefined;
83
+ }
84
+ const headerFields = parseLyHeaderFields(source);
85
+ const id = generateId({ entry, base: baseUrl, header: headerFields });
86
+ // Not short-circuited on a matching digest: that only proves the
87
+ // source is unchanged, not that the asset file still exists on
88
+ // disk. `writeAssets()` does the real disk-backed cache check.
89
+ const digest = generateDigest(source);
90
+ const src = prependVersion(source, resolved.version);
91
+ const includePaths = includePathsFor(filePath);
92
+ const sourceName = sourceNameFor(filePath);
93
+ const title = titleFor(sourceName);
94
+ const hash = contentHashFor({
95
+ source: src,
96
+ format: resolvedFormat,
97
+ resolution: resolved.resolution,
98
+ crop,
99
+ });
100
+ const assets = await writeAssets({
101
+ hash,
102
+ title,
103
+ format: resolvedFormat,
104
+ outputDir: assetsDir,
105
+ urlBase: assetsUrlBase,
106
+ sizeScale: crop ? resolved.cropScale : 1,
107
+ getBuffers: () => render(src, {
108
+ format: resolvedFormat,
109
+ crop,
110
+ defaults,
111
+ timeout,
112
+ includePaths,
113
+ sourceName,
114
+ }),
115
+ });
116
+ const data = await parseData({
117
+ id,
118
+ data: {
119
+ pages: assets.map((asset) => ({
120
+ src: asset.url,
121
+ width: asset.width,
122
+ height: asset.height,
123
+ })),
124
+ alt: altTextFor({
125
+ title: headerFields.title,
126
+ composer: headerFields.composer,
127
+ }),
128
+ ...splitHeaderFields(headerFields),
129
+ },
130
+ filePath,
131
+ });
132
+ store.set({
133
+ id,
134
+ data,
135
+ filePath: posixRelative(rootDir, filePath),
136
+ digest,
137
+ });
138
+ return id;
139
+ }
140
+ async function runSync() {
141
+ const untouched = new Set(store.keys());
142
+ const idByPath = new Map();
143
+ for (const stored of store.values()) {
144
+ if (stored.filePath)
145
+ idByPath.set(stored.filePath, stored.id);
146
+ }
147
+ const entries = [];
148
+ for await (const entry of glob(pattern, { cwd: baseDir })) {
149
+ entries.push(entry);
150
+ }
151
+ if (entries.length === 0) {
152
+ logger.warn(`astro-lilypond: no files matched "${pattern}" in "${baseDir}"`);
153
+ }
154
+ const results = await Promise.all(entries.map(async (entry) => ({ entry, id: await syncEntry(entry) })));
155
+ for (const { entry, id } of results) {
156
+ if (id) {
157
+ untouched.delete(id);
158
+ continue;
159
+ }
160
+ // syncEntry() failed (e.g. a transient read error racing an
161
+ // editor's atomic save) — if this path previously synced
162
+ // successfully, keep its existing entry rather than evicting
163
+ // it; the next fs event will retry the read.
164
+ const previousId = idByPath.get(posixRelative(rootDir, join(baseDir, entry)));
165
+ if (previousId)
166
+ untouched.delete(previousId);
167
+ }
168
+ for (const id of untouched)
169
+ store.delete(id);
170
+ // Sweep the directory against every currently-stored entry's pages
171
+ // (not just the ones touched this pass), so a removed/renamed
172
+ // source's leftover files get cleaned up without needing separate
173
+ // per-entry bookkeeping.
174
+ const referenced = new Set();
175
+ for (const stored of store.values()) {
176
+ const pages = stored.data.pages;
177
+ for (const page of pages ?? [])
178
+ referenced.add(basename(page.src));
179
+ }
180
+ await pruneOrphanedAssets({ dir: assetsDir, referenced, logger });
181
+ }
182
+ await runSync();
183
+ if (!watcher)
184
+ return;
185
+ watcher.add(baseDir);
186
+ // Serializes re-syncs so overlapping fs events (e.g. an editor
187
+ // autosave firing "change" twice) can't race on the shared store.
188
+ let queue = Promise.resolve();
189
+ const onFsEvent = (changedPath) => {
190
+ if (!changedPath.startsWith(baseDir))
191
+ return;
192
+ queue = queue.then(() => runSync().catch((err) => {
193
+ logger.error(`astro-lilypond: reload failed: ${err.message}`);
194
+ }));
195
+ };
196
+ watcher.on("add", onFsEvent);
197
+ watcher.on("change", onFsEvent);
198
+ watcher.on("unlink", onFsEvent);
199
+ },
200
+ };
201
+ }
202
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
@@ -7,16 +7,19 @@ export type { ImageDimensions } from "./imageDimensions.js";
7
7
  export { imageDimensionsFor } from "./imageDimensions.js";
8
8
  export { includePathsFor } from "./includePathsFor.js";
9
9
  export { isLilypondLang } from "./isLilypondLang.js";
10
- export { parseLyImportQuery } from "./lyImportQuery.js";
10
+ export { parseLyImportQuery, RECOGNIZED_QUERY_PARAMS, } from "./lyImportQuery.js";
11
+ export { lyTypeDeclarationsFor } from "./lyTypeDeclarationsFor.js";
11
12
  export { contentTypeFor, isOwnAssetFileName } from "./ownAssetFileName.js";
12
13
  export { parseFenceMeta } from "./parseFenceMeta.js";
13
14
  export type { LyHeaderFields } from "./parseLyHeader.js";
14
- export { parseLyHeader } from "./parseLyHeader.js";
15
+ export { extractMarkupText, parseLyHeader, parseLyHeaderFields, } from "./parseLyHeader.js";
15
16
  export { prependVersion } from "./prependVersion.js";
16
17
  export type { RenderedPage } from "./renderedHtml.js";
17
18
  export { renderedHtml } from "./renderedHtml.js";
18
19
  export { resolveDefaults } from "./resolveDefaults.js";
19
20
  export { sourceNameFor } from "./sourceNameFor.js";
21
+ export type { KnownLyHeaderFields } from "./splitHeaderFields.js";
22
+ export { STANDARD_HEADER_FIELDS, splitHeaderFields, } from "./splitHeaderFields.js";
20
23
  export { titleFor } from "./titleFor.js";
21
24
  export { unescapeQuoted } from "./unescapeQuoted.js";
22
25
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EACN,kBAAkB,EAClB,uBAAuB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EACN,iBAAiB,EACjB,aAAa,EACb,mBAAmB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EACN,sBAAsB,EACtB,iBAAiB,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -6,14 +6,16 @@ export { escapeHtmlAttribute } from "./escapeHtmlAttribute.js";
6
6
  export { imageDimensionsFor } from "./imageDimensions.js";
7
7
  export { includePathsFor } from "./includePathsFor.js";
8
8
  export { isLilypondLang } from "./isLilypondLang.js";
9
- export { parseLyImportQuery } from "./lyImportQuery.js";
9
+ export { parseLyImportQuery, RECOGNIZED_QUERY_PARAMS, } from "./lyImportQuery.js";
10
+ export { lyTypeDeclarationsFor } from "./lyTypeDeclarationsFor.js";
10
11
  export { contentTypeFor, isOwnAssetFileName } from "./ownAssetFileName.js";
11
12
  export { parseFenceMeta } from "./parseFenceMeta.js";
12
- export { parseLyHeader } from "./parseLyHeader.js";
13
+ export { extractMarkupText, parseLyHeader, parseLyHeaderFields, } from "./parseLyHeader.js";
13
14
  export { prependVersion } from "./prependVersion.js";
14
15
  export { renderedHtml } from "./renderedHtml.js";
15
16
  export { resolveDefaults } from "./resolveDefaults.js";
16
17
  export { sourceNameFor } from "./sourceNameFor.js";
18
+ export { STANDARD_HEADER_FIELDS, splitHeaderFields, } from "./splitHeaderFields.js";
17
19
  export { titleFor } from "./titleFor.js";
18
20
  export { unescapeQuoted } from "./unescapeQuoted.js";
19
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EACN,kBAAkB,EAClB,uBAAuB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EACN,iBAAiB,EACjB,aAAa,EACb,mBAAmB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EACN,sBAAsB,EACtB,iBAAiB,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,3 +1,5 @@
1
+ /** Query params `lyFilePlugin` recognizes as its own on a `.ly`-family import. */
2
+ export declare const RECOGNIZED_QUERY_PARAMS: readonly ["crop", "nocrop"];
1
3
  export interface LyImportQuery {
2
4
  /** The import's module id with any query string stripped. */
3
5
  pathname: string;
@@ -1 +1 @@
1
- {"version":3,"file":"lyImportQuery.d.ts","sourceRoot":"","sources":["../../src/utils/lyImportQuery.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC7B,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,YAAY,EAAE,OAAO,GAAG,SAAS,CAAC;CAClC;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAkBxE"}
1
+ {"version":3,"file":"lyImportQuery.d.ts","sourceRoot":"","sources":["../../src/utils/lyImportQuery.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,eAAO,MAAM,uBAAuB,YAAI,MAAM,EAAE,QAAQ,CAAU,CAAC;AAInE,MAAM,WAAW,aAAa;IAC7B,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,YAAY,EAAE,OAAO,GAAG,SAAS,CAAC;CAClC;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAkBxE"}
@@ -1,5 +1,6 @@
1
1
  /** Query params `lyFilePlugin` recognizes as its own on a `.ly`-family import. */
2
- const RECOGNIZED_PARAMS = new Set(["crop", "nocrop"]);
2
+ export const RECOGNIZED_QUERY_PARAMS = ["crop", "nocrop"];
3
+ const RECOGNIZED_PARAMS = new Set(RECOGNIZED_QUERY_PARAMS);
3
4
  /**
4
5
  * Parses a Vite module id for a `.ly`/`.lilypond`/`.ily` import into its
5
6
  * pathname and this plugin's `?crop`/`?nocrop` override.
@@ -1 +1 @@
1
- {"version":3,"file":"lyImportQuery.js","sourceRoot":"","sources":["../../src/utils/lyImportQuery.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AActD;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAU;IAC5C,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,IAAI,eAAe,CACjC,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CACjD,CAAC;IAEF,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACnE,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;QACtC,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACrB,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"lyImportQuery.js","sourceRoot":"","sources":["../../src/utils/lyImportQuery.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAU,CAAC;AAEnE,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAS,uBAAuB,CAAC,CAAC;AAcnE;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAU;IAC5C,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,IAAI,eAAe,CACjC,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CACjD,CAAC;IAEF,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACnE,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;QACtC,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACrB,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Builds the ambient module declarations injected for `.ly`-family imports,
3
+ * so `import content from "./score.ly"` (and its `?crop`/`?nocrop` query
4
+ * variants) type-check as a default-exported `LilypondContent`.
5
+ */
6
+ export declare function lyTypeDeclarationsFor(extensions: readonly string[], queryParams: readonly string[]): string;
7
+ //# sourceMappingURL=lyTypeDeclarationsFor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lyTypeDeclarationsFor.d.ts","sourceRoot":"","sources":["../../src/utils/lyTypeDeclarationsFor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,qBAAqB,CACpC,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,WAAW,EAAE,SAAS,MAAM,EAAE,GAC5B,MAAM,CAWR"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Builds the ambient module declarations injected for `.ly`-family imports,
3
+ * so `import content from "./score.ly"` (and its `?crop`/`?nocrop` query
4
+ * variants) type-check as a default-exported `LilypondContent`.
5
+ */
6
+ export function lyTypeDeclarationsFor(extensions, queryParams) {
7
+ const suffixes = ["", ...queryParams.map((param) => `?${param}`)];
8
+ return extensions
9
+ .flatMap((ext) => suffixes.map((suffix) => `declare module "*${ext}${suffix}" {\n const content: import("astro-lilypond").LilypondContent;\n export default content;\n}`))
10
+ .join("\n");
11
+ }
12
+ //# sourceMappingURL=lyTypeDeclarationsFor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lyTypeDeclarationsFor.js","sourceRoot":"","sources":["../../src/utils/lyTypeDeclarationsFor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACpC,UAA6B,EAC7B,WAA8B;IAE9B,MAAM,QAAQ,GAAG,CAAC,EAAE,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;IAElE,OAAO,UAAU;SACf,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAChB,QAAQ,CAAC,GAAG,CACX,CAAC,MAAM,EAAE,EAAE,CACV,oBAAoB,GAAG,GAAG,MAAM,+FAA+F,CAChI,CACD;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC"}
@@ -2,6 +2,24 @@ export interface LyHeaderFields {
2
2
  title?: string;
3
3
  composer?: string;
4
4
  }
5
- /** Extracts `title`/`composer` from the first `\header` block; non-string values (e.g. `\markup`) are treated as absent. */
5
+ /**
6
+ * Extracts readable plain text from inside a `\markup { ... }` block: quoted-string
7
+ * contents and bare words are kept, `\command` tokens and `#...` Scheme literal
8
+ * arguments (font sizes, colors, alist overrides, etc.) are stripped, and nested
9
+ * `{ }` grouping is flattened — good enough for the formatting-wrapped text
10
+ * commonly seen in real `\header` fields (e.g. `\markup { \bold "Sonata" }`),
11
+ * not a full markup-language evaluator.
12
+ */
13
+ export declare function extractMarkupText(markupInner: string): string;
14
+ /**
15
+ * Extracts every string-valued header field found anywhere in `source`,
16
+ * across every top-level `\header` block (there can be more than one — e.g.
17
+ * book-level metadata plus a per-`\score` override). When the same field name
18
+ * appears in more than one block, the **last occurrence in the file wins** —
19
+ * approximating LilyPond's own inner-scope-overrides-outer-scope header chain
20
+ * for the common case of a book/top-level header followed by per-score ones.
21
+ */
22
+ export declare function parseLyHeaderFields(source: string): Record<string, string>;
23
+ /** Extracts `title`/`composer` from the file's header block(s) (see `parseLyHeaderFields`); non-string values (e.g. an unbraced `\markup`, `##f`) are treated as absent. */
6
24
  export declare function parseLyHeader(source: string): LyHeaderFields;
7
25
  //# sourceMappingURL=parseLyHeader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseLyHeader.d.ts","sourceRoot":"","sources":["../../src/utils/parseLyHeader.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AA2BD,4HAA4H;AAC5H,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAc5D"}
1
+ {"version":3,"file":"parseLyHeader.d.ts","sourceRoot":"","sources":["../../src/utils/parseLyHeader.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAiID;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAqC7D;AAqDD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAM1E;AAED,4KAA4K;AAC5K,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAM5D"}
@@ -1,14 +1,21 @@
1
1
  import { unescapeQuoted } from "./unescapeQuoted.js";
2
- const HEADER_FIELDS = ["title", "composer"];
3
- /** Returns the body of the first `\header { ... }` block, matching braces by depth (ignoring braces inside quoted strings) so nested `\markup` braces or a literal `{`/`}` in a value can't truncate it early. */
4
- function headerBodyOf(source) {
5
- const match = /\\header\s*\{/.exec(source);
6
- if (!match)
7
- return undefined;
8
- const start = match.index + match[0].length;
2
+ /** Finds the index of the `"` that closes the quoted string starting at `source[quoteIndex]`, honoring backslash escapes. Returns -1 if unterminated. */
3
+ function matchQuotedStringEnd(source, quoteIndex) {
4
+ for (let i = quoteIndex + 1; i < source.length; i++) {
5
+ if (source[i] === "\\") {
6
+ i++;
7
+ continue;
8
+ }
9
+ if (source[i] === '"')
10
+ return i;
11
+ }
12
+ return -1;
13
+ }
14
+ /** Finds the index of the `}` that closes the brace opened at `source[openBraceIndex]`, matching by depth (ignoring braces inside quoted strings). Returns -1 if unterminated. */
15
+ function matchBalancedBraces(source, openBraceIndex) {
9
16
  let depth = 1;
10
17
  let inString = false;
11
- for (let i = start; i < source.length; i++) {
18
+ for (let i = openBraceIndex + 1; i < source.length; i++) {
12
19
  const ch = source[i];
13
20
  if (inString) {
14
21
  if (ch === "\\")
@@ -24,25 +31,230 @@ function headerBodyOf(source) {
24
31
  else if (ch === "}") {
25
32
  depth--;
26
33
  if (depth === 0)
27
- return source.slice(start, i);
34
+ return i;
28
35
  }
29
36
  }
30
- return undefined;
37
+ return -1;
31
38
  }
32
- /** Extracts `title`/`composer` from the first `\header` block; non-string values (e.g. `\markup`) are treated as absent. */
33
- export function parseLyHeader(source) {
34
- const body = headerBodyOf(source);
35
- if (!body)
36
- return {};
39
+ /**
40
+ * Strips LilyPond `%` line comments and `%{ ... %}` block comments from
41
+ * `source`, replacing their text with spaces (so offsets are unaffected) —
42
+ * quote-aware, so a literal `%` inside a `"..."` string (e.g. `"50% done"`)
43
+ * is left alone. Run once, up front, so neither the `\header {` block scan
44
+ * nor the field scan inside a block can mistake commented-out text for real
45
+ * source.
46
+ */
47
+ function stripComments(source) {
48
+ let result = "";
49
+ let inString = false;
50
+ for (let i = 0; i < source.length; i++) {
51
+ const ch = source[i];
52
+ if (inString) {
53
+ result += ch;
54
+ if (ch === "\\") {
55
+ i++;
56
+ result += source[i] ?? "";
57
+ }
58
+ else if (ch === '"') {
59
+ inString = false;
60
+ }
61
+ continue;
62
+ }
63
+ if (ch === '"') {
64
+ inString = true;
65
+ result += ch;
66
+ continue;
67
+ }
68
+ if (ch === "%" && source[i + 1] === "{") {
69
+ const end = source.indexOf("%}", i + 2);
70
+ const stop = end === -1 ? source.length : end + 2;
71
+ result += " ".repeat(stop - i);
72
+ i = stop - 1;
73
+ continue;
74
+ }
75
+ if (ch === "%") {
76
+ const end = source.indexOf("\n", i);
77
+ const stop = end === -1 ? source.length : end;
78
+ result += " ".repeat(stop - i);
79
+ i = stop - 1;
80
+ continue;
81
+ }
82
+ result += ch;
83
+ }
84
+ return result;
85
+ }
86
+ /** Returns the body of every top-level `\header { ... }` block in `source` — there may be more than one (e.g. book-level metadata plus a per-`\score` override). */
87
+ function allHeaderBodies(source) {
88
+ const bodies = [];
89
+ const headerRe = /\\header\s*\{/g;
90
+ let match;
91
+ // biome-ignore lint: reassigned in the while condition
92
+ while ((match = headerRe.exec(source))) {
93
+ const openBraceIndex = match.index + match[0].length - 1;
94
+ const closeBraceIndex = matchBalancedBraces(source, openBraceIndex);
95
+ if (closeBraceIndex === -1)
96
+ continue;
97
+ bodies.push(source.slice(openBraceIndex + 1, closeBraceIndex));
98
+ headerRe.lastIndex = closeBraceIndex + 1;
99
+ }
100
+ return bodies;
101
+ }
102
+ /** Consumes one Scheme datum starting at `source[i]` (which must be `#`): a boolean/number/symbol atom, or a balanced, quote-aware parenthesized list (e.g. `#4`, `#f`, `#'symbol`, `#'(0 . 3)`, `#(format #f "...")`). Returns the index just past it. */
103
+ function skipSchemeDatum(source, i) {
104
+ i++; // past '#'
105
+ if (source[i] === "'")
106
+ i++; // optional quote prefix
107
+ if (source[i] === "(") {
108
+ let depth = 0;
109
+ let inString = false;
110
+ do {
111
+ const ch = source[i];
112
+ if (inString) {
113
+ if (ch === "\\")
114
+ i++;
115
+ else if (ch === '"')
116
+ inString = false;
117
+ }
118
+ else if (ch === '"') {
119
+ inString = true;
120
+ }
121
+ else if (ch === "(") {
122
+ depth++;
123
+ }
124
+ else if (ch === ")") {
125
+ depth--;
126
+ }
127
+ i++;
128
+ } while (i < source.length && depth > 0);
129
+ return i;
130
+ }
131
+ if (source[i] === '"') {
132
+ const end = matchQuotedStringEnd(source, i);
133
+ return end === -1 ? source.length : end + 1;
134
+ }
135
+ while (i < source.length && !/[\s{}()"#\\]/.test(source[i]))
136
+ i++;
137
+ return i;
138
+ }
139
+ /**
140
+ * Extracts readable plain text from inside a `\markup { ... }` block: quoted-string
141
+ * contents and bare words are kept, `\command` tokens and `#...` Scheme literal
142
+ * arguments (font sizes, colors, alist overrides, etc.) are stripped, and nested
143
+ * `{ }` grouping is flattened — good enough for the formatting-wrapped text
144
+ * commonly seen in real `\header` fields (e.g. `\markup { \bold "Sonata" }`),
145
+ * not a full markup-language evaluator.
146
+ */
147
+ export function extractMarkupText(markupInner) {
148
+ const tokens = [];
149
+ const n = markupInner.length;
150
+ let i = 0;
151
+ while (i < n) {
152
+ const ch = markupInner[i];
153
+ if (/\s/.test(ch)) {
154
+ i++;
155
+ continue;
156
+ }
157
+ if (ch === '"') {
158
+ const end = matchQuotedStringEnd(markupInner, i);
159
+ if (end === -1)
160
+ break;
161
+ tokens.push(unescapeQuoted(markupInner.slice(i + 1, end)));
162
+ i = end + 1;
163
+ continue;
164
+ }
165
+ if (ch === "{" || ch === "}") {
166
+ i++;
167
+ continue;
168
+ }
169
+ if (ch === "#") {
170
+ i = skipSchemeDatum(markupInner, i);
171
+ continue;
172
+ }
173
+ if (ch === "\\") {
174
+ let j = i + 1;
175
+ while (j < n && /[A-Za-z-]/.test(markupInner[j]))
176
+ j++;
177
+ i = j;
178
+ continue;
179
+ }
180
+ let j = i;
181
+ while (j < n && !/[\s{}"#\\]/.test(markupInner[j]))
182
+ j++;
183
+ tokens.push(markupInner.slice(i, j));
184
+ i = j;
185
+ }
186
+ return tokens.join(" ").replace(/\s+/g, " ").trim();
187
+ }
188
+ /**
189
+ * Parses the value starting at `body[start]` (right after a field's `=`).
190
+ * Supports a plain quoted string, or a `\markup { ... }` expression (braced
191
+ * form only — an unbraced `\markup \command "text"` value has no reliable end
192
+ * delimiter without a real LilyPond grammar, so it's left unsupported).
193
+ * Returns `null` for unsupported/empty values (e.g. `##f`, `\markup` without
194
+ * a brace), same as the field simply being absent.
195
+ */
196
+ function parseFieldValue(body, start) {
197
+ if (body[start] === '"') {
198
+ const end = matchQuotedStringEnd(body, start);
199
+ if (end === -1)
200
+ return null;
201
+ const value = unescapeQuoted(body.slice(start + 1, end)).trim();
202
+ return value ? { value, end: end + 1 } : null;
203
+ }
204
+ const MARKUP = "\\markup";
205
+ if (body.startsWith(MARKUP, start) &&
206
+ !/[A-Za-z-]/.test(body[start + MARKUP.length] ?? "")) {
207
+ let i = start + MARKUP.length;
208
+ while (/\s/.test(body[i]))
209
+ i++;
210
+ if (body[i] !== "{")
211
+ return null;
212
+ const end = matchBalancedBraces(body, i);
213
+ if (end === -1)
214
+ return null;
215
+ const value = extractMarkupText(body.slice(i + 1, end));
216
+ return value ? { value, end: end + 1 } : null;
217
+ }
218
+ return null;
219
+ }
220
+ /** Extracts every `key = "..."` or `key = \markup { ... }` assignment from one `\header` block's body. Repeated keys within the same block keep the first occurrence. */
221
+ function fieldsFromHeaderBody(body) {
37
222
  const fields = {};
38
- for (const field of HEADER_FIELDS) {
39
- const fieldMatch = new RegExp(`\\b${field}\\s*=\\s*"((?:[^"\\\\]|\\\\.)*)"`).exec(body);
40
- if (!fieldMatch)
223
+ const identifierRe = /(?<![\w-])([a-zA-Z][\w-]*)\s*=\s*/g;
224
+ let match;
225
+ // biome-ignore lint: reassigned in the while condition
226
+ while ((match = identifierRe.exec(body))) {
227
+ const key = match[1];
228
+ const valueStart = match.index + match[0].length;
229
+ const parsed = parseFieldValue(body, valueStart);
230
+ if (!parsed)
41
231
  continue;
42
- const value = unescapeQuoted(fieldMatch[1]).trim();
43
- if (value)
44
- fields[field] = value;
232
+ if (!(key in fields))
233
+ fields[key] = parsed.value;
234
+ identifierRe.lastIndex = parsed.end;
45
235
  }
46
236
  return fields;
47
237
  }
238
+ /**
239
+ * Extracts every string-valued header field found anywhere in `source`,
240
+ * across every top-level `\header` block (there can be more than one — e.g.
241
+ * book-level metadata plus a per-`\score` override). When the same field name
242
+ * appears in more than one block, the **last occurrence in the file wins** —
243
+ * approximating LilyPond's own inner-scope-overrides-outer-scope header chain
244
+ * for the common case of a book/top-level header followed by per-score ones.
245
+ */
246
+ export function parseLyHeaderFields(source) {
247
+ const withoutComments = stripComments(source);
248
+ return Object.assign({}, ...allHeaderBodies(withoutComments).map(fieldsFromHeaderBody));
249
+ }
250
+ /** Extracts `title`/`composer` from the file's header block(s) (see `parseLyHeaderFields`); non-string values (e.g. an unbraced `\markup`, `##f`) are treated as absent. */
251
+ export function parseLyHeader(source) {
252
+ const { title, composer } = parseLyHeaderFields(source);
253
+ const fields = {};
254
+ if (title)
255
+ fields.title = title;
256
+ if (composer)
257
+ fields.composer = composer;
258
+ return fields;
259
+ }
48
260
  //# sourceMappingURL=parseLyHeader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseLyHeader.js","sourceRoot":"","sources":["../../src/utils/parseLyHeader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,UAAU,CAAU,CAAC;AAOrD,kNAAkN;AAClN,SAAS,YAAY,CAAC,MAAc;IACnC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAE7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,QAAQ,EAAE,CAAC;YACd,IAAI,EAAE,KAAK,IAAI;gBAAE,CAAC,EAAE,CAAC;iBAChB,IAAI,EAAE,KAAK,GAAG;gBAAE,QAAQ,GAAG,KAAK,CAAC;YACtC,SAAS;QACV,CAAC;QACD,IAAI,EAAE,KAAK,GAAG;YAAE,QAAQ,GAAG,IAAI,CAAC;aAC3B,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;aACxB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACrB,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,4HAA4H;AAC5H,MAAM,UAAU,aAAa,CAAC,MAAc;IAC3C,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAErB,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,MAAM,CAC5B,MAAM,KAAK,kCAAkC,CAC7C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,IAAI,CAAC,UAAU;YAAE,SAAS;QAC1B,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACnD,IAAI,KAAK;YAAE,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IAClC,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"parseLyHeader.js","sourceRoot":"","sources":["../../src/utils/parseLyHeader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * LilyPond's standard `\header` field names
3
+ */
4
+ export declare const STANDARD_HEADER_FIELDS: readonly ["dedication", "title", "subtitle", "subsubtitle", "instrument", "poet", "composer", "meter", "arranger", "piece", "opus", "copyright", "tagline"];
5
+ export interface KnownLyHeaderFields {
6
+ dedication?: string;
7
+ title?: string;
8
+ subtitle?: string;
9
+ subsubtitle?: string;
10
+ instrument?: string;
11
+ poet?: string;
12
+ composer?: string;
13
+ meter?: string;
14
+ arranger?: string;
15
+ piece?: string;
16
+ opus?: string;
17
+ copyright?: string;
18
+ tagline?: string;
19
+ }
20
+ /** Splits parsed header fields into LilyPond's standard named fields and everything else (e.g. `mutopiacomposer`, `maintainerEmail`). */
21
+ export declare function splitHeaderFields(fields: Record<string, string>): KnownLyHeaderFields & {
22
+ extra: Record<string, string>;
23
+ };
24
+ //# sourceMappingURL=splitHeaderFields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splitHeaderFields.d.ts","sourceRoot":"","sources":["../../src/utils/splitHeaderFields.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,sBAAsB,YAClC,YAAY,EACZ,OAAO,EACP,UAAU,EACV,aAAa,EACb,YAAY,EACZ,MAAM,EACN,UAAU,EACV,OAAO,EACP,UAAU,EACV,OAAO,EACP,MAAM,EACN,WAAW,EACX,SAAS,CACA,CAAC;AAEX,MAAM,WAAW,mBAAmB;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,yIAAyI;AACzI,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,mBAAmB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAWzD"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * LilyPond's standard `\header` field names
3
+ */
4
+ export const STANDARD_HEADER_FIELDS = [
5
+ "dedication",
6
+ "title",
7
+ "subtitle",
8
+ "subsubtitle",
9
+ "instrument",
10
+ "poet",
11
+ "composer",
12
+ "meter",
13
+ "arranger",
14
+ "piece",
15
+ "opus",
16
+ "copyright",
17
+ "tagline",
18
+ ];
19
+ /** Splits parsed header fields into LilyPond's standard named fields and everything else (e.g. `mutopiacomposer`, `maintainerEmail`). */
20
+ export function splitHeaderFields(fields) {
21
+ const known = {};
22
+ const extra = {};
23
+ for (const [key, value] of Object.entries(fields)) {
24
+ if (STANDARD_HEADER_FIELDS.includes(key)) {
25
+ known[key] = value;
26
+ }
27
+ else {
28
+ extra[key] = value;
29
+ }
30
+ }
31
+ return { ...known, extra };
32
+ }
33
+ //# sourceMappingURL=splitHeaderFields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splitHeaderFields.js","sourceRoot":"","sources":["../../src/utils/splitHeaderFields.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACrC,YAAY;IACZ,OAAO;IACP,UAAU;IACV,aAAa;IACb,YAAY;IACZ,MAAM;IACN,UAAU;IACV,OAAO;IACP,UAAU;IACV,OAAO;IACP,MAAM;IACN,WAAW;IACX,SAAS;CACA,CAAC;AAkBX,yIAAyI;AACzI,MAAM,UAAU,iBAAiB,CAChC,MAA8B;IAE9B,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAK,sBAA4C,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACjE,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,CAAC;aAAM,CAAC;YACP,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,CAAC;IACF,CAAC;IACD,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "astro-lilypond",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "description": "An Astro integration for rendering Lilypond markup to music notation.",
5
5
  "homepage": "https://lilypond.ky.fyi",
6
6
  "author": "Ky Decker",
@@ -17,7 +17,11 @@
17
17
  "types": "./dist/index.d.ts",
18
18
  "import": "./dist/index.js"
19
19
  },
20
- "./component": "./components/LilyPond.astro"
20
+ "./component": "./components/LilyPond.astro",
21
+ "./loader": {
22
+ "types": "./dist/loader.d.ts",
23
+ "import": "./dist/loader.js"
24
+ }
21
25
  },
22
26
  "files": [
23
27
  "dist",
@@ -26,6 +30,7 @@
26
30
  "keywords": [
27
31
  "astro",
28
32
  "astro-integration",
33
+ "astro-loader",
29
34
  "engraving",
30
35
  "image",
31
36
  "images",