astro-lilypond 0.5.1 → 0.6.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 +12 -7
- package/components/LilyPond.astro +11 -11
- package/dist/deleteAssets.d.ts +27 -0
- package/dist/deleteAssets.d.ts.map +1 -0
- package/dist/deleteAssets.js +52 -0
- package/dist/deleteAssets.js.map +1 -0
- package/dist/execLilyPond.d.ts +18 -0
- package/dist/execLilyPond.d.ts.map +1 -0
- package/dist/execLilyPond.js +58 -0
- package/dist/execLilyPond.js.map +1 -0
- package/dist/index.d.ts +25 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +71 -21
- package/dist/index.js.map +1 -1
- package/dist/plugins/index.d.ts +5 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +4 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/rehype.d.ts +6 -0
- package/dist/plugins/rehype.d.ts.map +1 -0
- package/dist/plugins/rehype.js +70 -0
- package/dist/plugins/rehype.js.map +1 -0
- package/dist/plugins/remark.d.ts +6 -0
- package/dist/plugins/remark.d.ts.map +1 -0
- package/dist/plugins/remark.js +50 -0
- package/dist/plugins/remark.js.map +1 -0
- package/dist/plugins/satteri.d.ts +5 -0
- package/dist/plugins/satteri.d.ts.map +1 -0
- package/dist/plugins/satteri.js +51 -0
- package/dist/plugins/satteri.js.map +1 -0
- package/dist/plugins/types.d.ts +22 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +2 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/readOutputFile.d.ts +10 -0
- package/dist/readOutputFile.d.ts.map +1 -0
- package/dist/readOutputFile.js +42 -0
- package/dist/readOutputFile.js.map +1 -0
- package/dist/render.d.ts +7 -2
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +17 -83
- package/dist/render.js.map +1 -1
- package/dist/utils/assetsUrlBaseFor.d.ts +7 -0
- package/dist/utils/assetsUrlBaseFor.d.ts.map +1 -0
- package/dist/utils/assetsUrlBaseFor.js +11 -0
- package/dist/utils/assetsUrlBaseFor.js.map +1 -0
- package/dist/utils/contentHashFor.d.ts +20 -0
- package/dist/utils/contentHashFor.d.ts.map +1 -0
- package/dist/utils/contentHashFor.js +21 -0
- package/dist/utils/contentHashFor.js.map +1 -0
- package/dist/utils/imgTag.d.ts +5 -0
- package/dist/utils/imgTag.d.ts.map +1 -0
- package/dist/utils/imgTag.js +7 -0
- package/dist/utils/imgTag.js.map +1 -0
- package/dist/utils/includePathsFor.d.ts +7 -0
- package/dist/utils/includePathsFor.d.ts.map +1 -0
- package/dist/utils/includePathsFor.js +14 -0
- package/dist/utils/includePathsFor.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/isLilypondLang.d.ts +3 -0
- package/dist/utils/isLilypondLang.d.ts.map +1 -0
- package/dist/utils/isLilypondLang.js +5 -0
- package/dist/utils/isLilypondLang.js.map +1 -0
- package/dist/utils/ownAssetFileName.d.ts +12 -0
- package/dist/utils/ownAssetFileName.d.ts.map +1 -0
- package/dist/utils/ownAssetFileName.js +25 -0
- package/dist/utils/ownAssetFileName.js.map +1 -0
- package/dist/utils/prependVersion.d.ts +6 -0
- package/dist/utils/prependVersion.d.ts.map +1 -0
- package/dist/utils/prependVersion.js +10 -0
- package/dist/utils/prependVersion.js.map +1 -0
- package/dist/utils/sourceNameFor.d.ts +7 -0
- package/dist/utils/sourceNameFor.d.ts.map +1 -0
- package/dist/utils/sourceNameFor.js +14 -0
- package/dist/utils/sourceNameFor.js.map +1 -0
- package/dist/utils/titleFor.d.ts +8 -0
- package/dist/utils/titleFor.d.ts.map +1 -0
- package/dist/utils/titleFor.js +19 -0
- package/dist/utils/titleFor.js.map +1 -0
- package/dist/writeAsset.d.ts +31 -0
- package/dist/writeAsset.d.ts.map +1 -0
- package/dist/writeAsset.js +29 -0
- package/dist/writeAsset.js.map +1 -0
- package/package.json +2 -2
- package/dist/rehype-plugin.d.ts +0 -6
- package/dist/rehype-plugin.d.ts.map +0 -1
- package/dist/rehype-plugin.js +0 -54
- package/dist/rehype-plugin.js.map +0 -1
- package/dist/remark-plugin.d.ts +0 -6
- package/dist/remark-plugin.d.ts.map +0 -1
- package/dist/remark-plugin.js +0 -35
- package/dist/remark-plugin.js.map +0 -1
- package/dist/satteri-plugin.d.ts +0 -5
- package/dist/satteri-plugin.d.ts.map +0 -1
- package/dist/satteri-plugin.js +0 -29
- package/dist/satteri-plugin.js.map +0 -1
- package/dist/util.d.ts +0 -31
- package/dist/util.d.ts.map +0 -1
- package/dist/util.js +0 -50
- package/dist/util.js.map +0 -1
package/README.md
CHANGED
|
@@ -4,25 +4,24 @@ An [Astro](https://astro.build) integration for rendering [LilyPond](https://lil
|
|
|
4
4
|
|
|
5
5
|
- Render LilyPond via Markdown or with a `<LilyPond>` component
|
|
6
6
|
- Works with both `unified()` and `satteri()` Markdown processors
|
|
7
|
+
- Zero runtime JavaScript!
|
|
7
8
|
- Supports all LilyPond syntax
|
|
8
9
|
|
|
9
10
|
Docs: https://lilypond.ky.fyi
|
|
10
11
|
|
|
11
12
|
## Quick Start
|
|
12
13
|
|
|
13
|
-
###
|
|
14
|
+
### 1. Install LilyPond
|
|
14
15
|
|
|
15
16
|
Install the LilyPond binary directly from [lilypond.org](https://lilypond.org/download.html) or with `brew install lilypond` (Mac) or `apt install lilypond` (Linux).
|
|
16
17
|
|
|
17
|
-
###
|
|
18
|
-
|
|
19
|
-
#### 1. Install `astro-lilypond`
|
|
18
|
+
### 2. Install `astro-lilypond`
|
|
20
19
|
|
|
21
20
|
```sh
|
|
22
21
|
pnpm add astro-lilypond
|
|
23
22
|
```
|
|
24
23
|
|
|
25
|
-
|
|
24
|
+
### 3. Add the integration to your Astro config
|
|
26
25
|
|
|
27
26
|
```js
|
|
28
27
|
// astro.config.mjs
|
|
@@ -34,9 +33,9 @@ export default defineConfig({
|
|
|
34
33
|
});
|
|
35
34
|
```
|
|
36
35
|
|
|
37
|
-
|
|
36
|
+
### 4. Write your music
|
|
38
37
|
|
|
39
|
-
Write LilyPond code within fenced code blocks with the `lilypond` or `
|
|
38
|
+
Write LilyPond code within fenced code blocks with the `lilypond`, `ly`, or `ily` language tag.
|
|
40
39
|
|
|
41
40
|
````md
|
|
42
41
|
```lilypond
|
|
@@ -45,3 +44,9 @@ Write LilyPond code within fenced code blocks with the `lilypond` or `ly` langua
|
|
|
45
44
|
````
|
|
46
45
|
|
|
47
46
|
Your score will be built to `.svg` or `.png` and display alongside the rest of your content.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
For more info, refer to the docs: https://lilypond.ky.fyi
|
|
51
|
+
|
|
52
|
+
Happy notating!
|
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
---
|
|
2
2
|
const HTML_ENTITIES: Record<string, string> = {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
"&": "&",
|
|
4
|
+
"<": "<",
|
|
5
|
+
">": ">",
|
|
6
|
+
'"': """,
|
|
7
|
+
"'": "'",
|
|
8
8
|
};
|
|
9
9
|
|
|
10
10
|
function escapeHtml(text: unknown): string {
|
|
11
|
-
|
|
11
|
+
return String(text).replace(/[&<>"']/g, (c) => HTML_ENTITIES[c] ?? c);
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
interface Props {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
content: string;
|
|
16
|
+
class?: string | undefined;
|
|
17
|
+
style?: string | undefined;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
const { content, class: className, style } = Astro.props;
|
|
21
21
|
|
|
22
22
|
let html = content;
|
|
23
23
|
if (className)
|
|
24
|
-
|
|
24
|
+
html = html.replace('class="lilypond"', `class="lilypond ${className}"`);
|
|
25
25
|
if (style)
|
|
26
|
-
|
|
26
|
+
html = html.replace(/<(svg|img)\b/, `<$1 style="${escapeHtml(style)}"`);
|
|
27
27
|
---
|
|
28
28
|
|
|
29
29
|
<Fragment set:html={html} />
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface PruneOrphanedAssetsOptions {
|
|
2
|
+
/** Absolute filesystem path to the assets output directory. */
|
|
3
|
+
dir: string;
|
|
4
|
+
/** Filenames (e.g. `"ab12…ef.svg"`) referenced during this build. */
|
|
5
|
+
referenced: ReadonlySet<string>;
|
|
6
|
+
logger?: {
|
|
7
|
+
info: (message: string) => void;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
/** Deletes our content-addressed files under `dir` that weren't referenced this build. */
|
|
11
|
+
export declare function pruneOrphanedAssets(options: PruneOrphanedAssetsOptions): Promise<void>;
|
|
12
|
+
export interface PruneStaleAssetsOptions {
|
|
13
|
+
/** Per-source history of output filenames, keyed by module id or file path. */
|
|
14
|
+
assetsBySource: Map<string, Set<string>>;
|
|
15
|
+
/** Stable identifier for the source these `fileNames` were rendered from. */
|
|
16
|
+
sourceKey: string;
|
|
17
|
+
/** Every output filename this source's current transform pass produced. */
|
|
18
|
+
fileNames: readonly string[];
|
|
19
|
+
/** Absolute filesystem path the files live in. */
|
|
20
|
+
outputDir: string;
|
|
21
|
+
logger?: {
|
|
22
|
+
info: (message: string) => void;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/** Deletes a source's own previously-rendered files that it no longer produces. */
|
|
26
|
+
export declare function pruneStaleAssets(options: PruneStaleAssetsOptions): Promise<void>;
|
|
27
|
+
//# sourceMappingURL=deleteAssets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deleteAssets.d.ts","sourceRoot":"","sources":["../src/deleteAssets.ts"],"names":[],"mappings":"AAuCA,MAAM,WAAW,0BAA0B;IAC1C,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC;IAEZ,qEAAqE;IACrE,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAEhC,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;CAC7C;AAED,0FAA0F;AAC1F,wBAAsB,mBAAmB,CACxC,OAAO,EAAE,0BAA0B,GACjC,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED,MAAM,WAAW,uBAAuB;IACvC,+EAA+E;IAC/E,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAEzC,6EAA6E;IAC7E,SAAS,EAAE,MAAM,CAAC;IAElB,2EAA2E;IAC3E,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAE7B,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAElB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;CAC7C;AAED,mFAAmF;AACnF,wBAAsB,gBAAgB,CACrC,OAAO,EAAE,uBAAuB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAkBf"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { readdir, unlink } from "node:fs/promises";
|
|
2
|
+
import { join, relative } from "node:path";
|
|
3
|
+
import { isOwnAssetFileName } from "./utils/index.js";
|
|
4
|
+
/** Deletes `fileNames` from `dir` and logs a one-line summary. Ignores files that are already gone. */
|
|
5
|
+
async function deleteAssets(options) {
|
|
6
|
+
const { dir, fileNames, reason, context, logger } = options;
|
|
7
|
+
if (fileNames.length === 0)
|
|
8
|
+
return;
|
|
9
|
+
await Promise.all(fileNames.map((name) => unlink(join(dir, name)).catch(() => { })));
|
|
10
|
+
logger?.info(`astro-lilypond: pruned ${fileNames.length} ${reason} asset${fileNames.length === 1 ? "" : "s"} from ${context}`);
|
|
11
|
+
}
|
|
12
|
+
/** Relativizes `path` to the current working directory for log messages. */
|
|
13
|
+
function relativeToCwd(path) {
|
|
14
|
+
return relative(process.cwd(), path) || ".";
|
|
15
|
+
}
|
|
16
|
+
/** Deletes our content-addressed files under `dir` that weren't referenced this build. */
|
|
17
|
+
export async function pruneOrphanedAssets(options) {
|
|
18
|
+
const { dir, referenced, logger } = options;
|
|
19
|
+
let entries;
|
|
20
|
+
try {
|
|
21
|
+
entries = await readdir(dir);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const orphaned = entries.filter((name) => isOwnAssetFileName(name) && !referenced.has(name));
|
|
27
|
+
await deleteAssets({
|
|
28
|
+
dir,
|
|
29
|
+
fileNames: orphaned,
|
|
30
|
+
reason: "orphaned",
|
|
31
|
+
context: relativeToCwd(dir),
|
|
32
|
+
logger,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/** Deletes a source's own previously-rendered files that it no longer produces. */
|
|
36
|
+
export async function pruneStaleAssets(options) {
|
|
37
|
+
const { assetsBySource, sourceKey, fileNames, outputDir, logger } = options;
|
|
38
|
+
const next = new Set(fileNames);
|
|
39
|
+
const previous = assetsBySource.get(sourceKey);
|
|
40
|
+
assetsBySource.set(sourceKey, next);
|
|
41
|
+
if (!previous)
|
|
42
|
+
return;
|
|
43
|
+
const stale = [...previous].filter((name) => !next.has(name));
|
|
44
|
+
await deleteAssets({
|
|
45
|
+
dir: outputDir,
|
|
46
|
+
fileNames: stale,
|
|
47
|
+
reason: "stale",
|
|
48
|
+
context: relativeToCwd(sourceKey),
|
|
49
|
+
logger,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=deleteAssets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deleteAssets.js","sourceRoot":"","sources":["../src/deleteAssets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAkBtD,uGAAuG;AACvG,KAAK,UAAU,YAAY,CAAC,OAA4B;IACvD,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC5D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEnC,MAAM,OAAO,CAAC,GAAG,CAChB,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAChE,CAAC;IAEF,MAAM,EAAE,IAAI,CACX,0BAA0B,SAAS,CAAC,MAAM,IAAI,MAAM,SAAS,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,OAAO,EAAE,CAChH,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,SAAS,aAAa,CAAC,IAAY;IAClC,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC;AAC7C,CAAC;AAYD,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,OAAmC;IAEnC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE5C,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACJ,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO;IACR,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAC9B,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAC3D,CAAC;IAEF,MAAM,YAAY,CAAC;QAClB,GAAG;QACH,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC;QAC3B,MAAM;KACN,CAAC,CAAC;AACJ,CAAC;AAkBD,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,OAAgC;IAEhC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE5E,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/C,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAEpC,IAAI,CAAC,QAAQ;QAAE,OAAO;IAEtB,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAE9D,MAAM,YAAY,CAAC;QAClB,GAAG,EAAE,SAAS;QACd,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE,OAAO;QACf,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC;QACjC,MAAM;KACN,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Format } from "./render.js";
|
|
2
|
+
export interface ExecLilypondOptions {
|
|
3
|
+
binaryPath: string;
|
|
4
|
+
format: Format;
|
|
5
|
+
resolution: number;
|
|
6
|
+
crop: boolean;
|
|
7
|
+
includePaths: string[];
|
|
8
|
+
timeout: number;
|
|
9
|
+
inputPath: string;
|
|
10
|
+
outputBase: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Invokes the `lilypond` binary against an already-written input file.
|
|
14
|
+
* Resolves once compilation succeeds (surfacing any stderr warnings to the
|
|
15
|
+
* build output); throws a normalized Error on a non-zero exit or timeout.
|
|
16
|
+
*/
|
|
17
|
+
export declare function execLilyPond(options: ExecLilypondOptions): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=execLilyPond.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execLilyPond.d.ts","sourceRoot":"","sources":["../src/execLilyPond.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAM1C,MAAM,WAAW,mBAAmB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CACjC,OAAO,EAAE,mBAAmB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAgEf"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
const MAX_BUFFER = 16 * 1024 * 1024; // 16 MiB
|
|
5
|
+
/**
|
|
6
|
+
* Invokes the `lilypond` binary against an already-written input file.
|
|
7
|
+
* Resolves once compilation succeeds (surfacing any stderr warnings to the
|
|
8
|
+
* build output); throws a normalized Error on a non-zero exit or timeout.
|
|
9
|
+
*/
|
|
10
|
+
export async function execLilyPond(options) {
|
|
11
|
+
const { binaryPath, format, resolution, crop, includePaths, timeout, inputPath, outputBase, } = options;
|
|
12
|
+
const args = [
|
|
13
|
+
// Render the correct format
|
|
14
|
+
`--format=${format}`,
|
|
15
|
+
// Define defaults — these can be overridden with the appropriate flags
|
|
16
|
+
// inside of individual .ly files
|
|
17
|
+
// Disable point-and-click behavior on SVGs when clicking noteheads
|
|
18
|
+
"--define-default=no-point-and-click",
|
|
19
|
+
// Use the `cairo` backend for graphics rendering; faster than the default `ps` backend
|
|
20
|
+
// https://lilypond.org/doc/v2.26/Documentation/usage/advanced-command_002dline-options-for-lilypond
|
|
21
|
+
"--define-default=backend=cairo",
|
|
22
|
+
// Resolution for generating PNGs (set in DPI)
|
|
23
|
+
`--define-default=resolution=${resolution}`,
|
|
24
|
+
// Set cropping
|
|
25
|
+
`--define-default=crop=${crop ? "#t" : "#f"}`,
|
|
26
|
+
// If the LilyPond file imports from others via \include, make sure those files are included
|
|
27
|
+
...includePaths.map((p) => `--include=${p}`),
|
|
28
|
+
"--output",
|
|
29
|
+
outputBase,
|
|
30
|
+
inputPath,
|
|
31
|
+
];
|
|
32
|
+
// LilyPond writes its progress log, (and any warnings/errors) to stderr,
|
|
33
|
+
// even on success. surface it in the build output so it's visible,
|
|
34
|
+
// but let the exit code (not stderr content) decide pass/fail.
|
|
35
|
+
let stderr;
|
|
36
|
+
try {
|
|
37
|
+
({ stderr } = await execFileAsync(binaryPath, args, {
|
|
38
|
+
signal: AbortSignal.timeout(timeout),
|
|
39
|
+
maxBuffer: MAX_BUFFER,
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
if (err &&
|
|
44
|
+
typeof err === "object" &&
|
|
45
|
+
err.name === "AbortError") {
|
|
46
|
+
throw new Error(`lilypond timed out after ${timeout}ms`);
|
|
47
|
+
}
|
|
48
|
+
const errStderr = err && typeof err === "object" && "stderr" in err
|
|
49
|
+
? String(err.stderr)
|
|
50
|
+
: undefined;
|
|
51
|
+
if (errStderr)
|
|
52
|
+
process.stderr.write(errStderr);
|
|
53
|
+
throw new Error(errStderr || (err instanceof Error ? err.message : String(err)));
|
|
54
|
+
}
|
|
55
|
+
if (stderr)
|
|
56
|
+
process.stderr.write(stderr);
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=execLilyPond.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execLilyPond.js","sourceRoot":"","sources":["../src/execLilyPond.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,UAAU,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,SAAS;AAa9C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,OAA4B;IAE5B,MAAM,EACL,UAAU,EACV,MAAM,EACN,UAAU,EACV,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,SAAS,EACT,UAAU,GACV,GAAG,OAAO,CAAC;IAEZ,MAAM,IAAI,GAAG;QACZ,4BAA4B;QAC5B,YAAY,MAAM,EAAE;QAEpB,uEAAuE;QACvE,iCAAiC;QAEjC,mEAAmE;QACnE,qCAAqC;QACrC,uFAAuF;QACvF,oGAAoG;QACpG,gCAAgC;QAChC,8CAA8C;QAC9C,+BAA+B,UAAU,EAAE;QAC3C,eAAe;QACf,yBAAyB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;QAE7C,4FAA4F;QAC5F,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;QAE5C,UAAU;QACV,UAAU;QACV,SAAS;KACT,CAAC;IAEF,yEAAyE;IACzE,mEAAmE;IACnE,+DAA+D;IAC/D,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACJ,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,IAAI,EAAE;YACnD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;YACpC,SAAS,EAAE,UAAU;SACrB,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IACC,GAAG;YACH,OAAO,GAAG,KAAK,QAAQ;YACtB,GAAyB,CAAC,IAAI,KAAK,YAAY,EAC/C,CAAC;YACF,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,IAAI,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,SAAS,GACd,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,QAAQ,IAAI,GAAG;YAChD,CAAC,CAAC,MAAM,CAAE,GAA2B,CAAC,MAAM,CAAC;YAC7C,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,SAAS;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,IAAI,KAAK,CACd,SAAS,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAC/D,CAAC;IACH,CAAC;IACD,IAAI,MAAM;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AstroIntegration } from "astro";
|
|
2
|
-
import type
|
|
3
|
-
export type { LilypondPluginOptions };
|
|
4
|
-
export interface LilypondOptions extends
|
|
2
|
+
import { type PluginOptions } from "./plugins/index.js";
|
|
3
|
+
export type { PluginOptions as LilypondPluginOptions };
|
|
4
|
+
export interface LilypondOptions extends PluginOptions {
|
|
5
5
|
/**
|
|
6
6
|
* LilyPond version string to prepend automatically to every block that
|
|
7
7
|
* doesn't already declare `\version`. Example: `"2.24.0"`.
|
|
@@ -10,20 +10,36 @@ export interface LilypondOptions extends LilypondPluginOptions {
|
|
|
10
10
|
*/
|
|
11
11
|
version?: string;
|
|
12
12
|
/**
|
|
13
|
-
* Output format
|
|
14
|
-
*
|
|
15
|
-
* - `"svg"` — inline SVG embedded directly in the HTML (default)
|
|
16
|
-
* - `"png"` — `<img>` element with a base64 data URI
|
|
13
|
+
* Output format to be written to a file under `outputDir`.
|
|
14
|
+
* @default "svg"
|
|
17
15
|
*/
|
|
18
16
|
format?: "svg" | "png";
|
|
19
17
|
/**
|
|
20
|
-
* Resolution in DPI
|
|
18
|
+
* Resolution in DPI. Only applies when "format" is "png".
|
|
19
|
+
* @default 144
|
|
21
20
|
*/
|
|
22
21
|
resolution?: number;
|
|
23
22
|
/**
|
|
24
|
-
* Crop the output tightly to the content bounding box.
|
|
23
|
+
* Crop the output tightly to the content bounding box.
|
|
24
|
+
* @default true
|
|
25
25
|
*/
|
|
26
26
|
crop?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Milliseconds to wait for a single `lilypond` invocation before
|
|
29
|
+
* aborting it.
|
|
30
|
+
* @default 60000
|
|
31
|
+
*/
|
|
32
|
+
timeout?: number;
|
|
33
|
+
/**
|
|
34
|
+
* Directory name, relative to Astro's `publicDir`, that rendered assets
|
|
35
|
+
* are written into by both `astro dev` and `astro build`. Filenames are
|
|
36
|
+
* content-addressed, so unchanged scores are reused instead of being
|
|
37
|
+
* re-rendered, and it's safe to commit this directory if you'd like
|
|
38
|
+
* faster rebuilds.
|
|
39
|
+
*
|
|
40
|
+
* @default "_lilypond"
|
|
41
|
+
*/
|
|
42
|
+
outputDir?: string;
|
|
27
43
|
}
|
|
28
44
|
export default function lilypond(options?: LilypondOptions): AstroIntegration;
|
|
29
45
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
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;AAiB5B,YAAY,EAAE,aAAa,IAAI,qBAAqB,EAAE,CAAC;AAEvD,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACrD;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAEvB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AA4CD,MAAM,CAAC,OAAO,UAAU,QAAQ,CAC/B,OAAO,GAAE,eAAoB,GAC3B,gBAAgB,CA2IlB"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { execFile } from "child_process";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { promisify } from "node:util";
|
|
5
|
+
import { pruneOrphanedAssets, pruneStaleAssets } from "./deleteAssets.js";
|
|
6
|
+
import { rehypePlugin, remarkPlugin, satteriPlugin, } from "./plugins/index.js";
|
|
6
7
|
import { defaultOptions, render } from "./render.js";
|
|
7
|
-
import { includePathsFor, prependVersion,
|
|
8
|
+
import { assetsUrlBaseFor, contentHashFor, imgTag, includePathsFor, prependVersion, sourceNameFor, titleFor, } from "./utils/index.js";
|
|
9
|
+
import { writeAsset } from "./writeAsset.js";
|
|
8
10
|
const execFileAsync = promisify(execFile);
|
|
9
11
|
const LY_EXTENSIONS = [".ly", ".lilypond", ".ily"];
|
|
10
12
|
function lyFilePlugin(options) {
|
|
@@ -12,22 +14,46 @@ function lyFilePlugin(options) {
|
|
|
12
14
|
name: "vite-plugin-astro-lilypond-ly",
|
|
13
15
|
enforce: "pre",
|
|
14
16
|
async transform(source, id) {
|
|
15
|
-
if (!LY_EXTENSIONS.some(ext => id.endsWith(ext)))
|
|
17
|
+
if (!LY_EXTENSIONS.some((ext) => id.endsWith(ext)))
|
|
16
18
|
return;
|
|
17
|
-
const src = options.version
|
|
19
|
+
const src = options.version
|
|
20
|
+
? prependVersion(source, options.version)
|
|
21
|
+
: source;
|
|
18
22
|
const format = options.format ?? defaultOptions.format;
|
|
19
|
-
const
|
|
23
|
+
const resolution = options.resolution ?? defaultOptions.resolution;
|
|
24
|
+
const crop = options.crop ?? defaultOptions.crop;
|
|
25
|
+
const includePaths = includePathsFor(id);
|
|
26
|
+
const sourceName = sourceNameFor(id);
|
|
27
|
+
const title = titleFor(sourceName);
|
|
28
|
+
const hash = contentHashFor({ source: src, format, resolution, crop });
|
|
29
|
+
const fileName = `${hash}.${title}.${format}`;
|
|
30
|
+
const url = await writeAsset({
|
|
31
|
+
hash,
|
|
32
|
+
title,
|
|
20
33
|
format,
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
34
|
+
outputDir: options.assetsDir,
|
|
35
|
+
urlBase: options.assetsUrlBase,
|
|
36
|
+
trackAsset: options.trackAsset,
|
|
37
|
+
getBuffer: () => render(src, {
|
|
38
|
+
format,
|
|
39
|
+
resolution: options.resolution,
|
|
40
|
+
crop: options.crop,
|
|
41
|
+
timeout: options.timeout,
|
|
42
|
+
includePaths,
|
|
43
|
+
sourceName,
|
|
44
|
+
}),
|
|
25
45
|
});
|
|
26
|
-
|
|
46
|
+
await options.pruneStaleAssets(id, [fileName]);
|
|
47
|
+
return {
|
|
48
|
+
code: `export default ${JSON.stringify(imgTag(url))}`,
|
|
49
|
+
};
|
|
27
50
|
},
|
|
28
51
|
};
|
|
29
52
|
}
|
|
30
53
|
export default function lilypond(options = {}) {
|
|
54
|
+
const referencedAssets = new Set();
|
|
55
|
+
const assetsBySource = new Map();
|
|
56
|
+
let assetsDir;
|
|
31
57
|
return {
|
|
32
58
|
name: "astro-lilypond",
|
|
33
59
|
hooks: {
|
|
@@ -37,8 +63,25 @@ export default function lilypond(options = {}) {
|
|
|
37
63
|
logger?.warn("astro-lilypond: `lilypond` binary not found — LilyPond blocks will render as errors. Install LilyPond and ensure it is on PATH.");
|
|
38
64
|
}
|
|
39
65
|
});
|
|
66
|
+
const outputDirName = options.outputDir ?? "_lilypond";
|
|
67
|
+
const assetsUrlBase = assetsUrlBaseFor(config.base, outputDirName);
|
|
68
|
+
const resolvedAssetsDir = join(fileURLToPath(config.publicDir), outputDirName);
|
|
69
|
+
assetsDir = resolvedAssetsDir;
|
|
70
|
+
const resolvedOptions = {
|
|
71
|
+
...options,
|
|
72
|
+
assetsDir,
|
|
73
|
+
assetsUrlBase,
|
|
74
|
+
trackAsset: (fileName) => referencedAssets.add(fileName),
|
|
75
|
+
pruneStaleAssets: (sourceKey, fileNames) => pruneStaleAssets({
|
|
76
|
+
assetsBySource,
|
|
77
|
+
sourceKey,
|
|
78
|
+
fileNames,
|
|
79
|
+
outputDir: resolvedAssetsDir,
|
|
80
|
+
logger,
|
|
81
|
+
}),
|
|
82
|
+
};
|
|
40
83
|
updateConfig({
|
|
41
|
-
vite: { plugins: [lyFilePlugin(
|
|
84
|
+
vite: { plugins: [lyFilePlugin(resolvedOptions)] },
|
|
42
85
|
});
|
|
43
86
|
const existingProcessor = config.markdown?.processor;
|
|
44
87
|
if (existingProcessor?.name === "satteri") {
|
|
@@ -54,7 +97,7 @@ export default function lilypond(options = {}) {
|
|
|
54
97
|
...existingOptions,
|
|
55
98
|
mdastPlugins: [
|
|
56
99
|
...(existingOptions.mdastPlugins ?? []),
|
|
57
|
-
|
|
100
|
+
satteriPlugin(resolvedOptions),
|
|
58
101
|
],
|
|
59
102
|
}),
|
|
60
103
|
},
|
|
@@ -75,11 +118,11 @@ export default function lilypond(options = {}) {
|
|
|
75
118
|
...existingOptions,
|
|
76
119
|
remarkPlugins: [
|
|
77
120
|
...(existingOptions.remarkPlugins ?? []),
|
|
78
|
-
[
|
|
121
|
+
[remarkPlugin, resolvedOptions],
|
|
79
122
|
],
|
|
80
123
|
rehypePlugins: [
|
|
81
124
|
...(existingOptions.rehypePlugins ?? []),
|
|
82
|
-
[
|
|
125
|
+
[rehypePlugin, resolvedOptions],
|
|
83
126
|
],
|
|
84
127
|
}),
|
|
85
128
|
},
|
|
@@ -95,9 +138,16 @@ export default function lilypond(options = {}) {
|
|
|
95
138
|
"astro:config:done": ({ injectTypes }) => {
|
|
96
139
|
injectTypes({
|
|
97
140
|
filename: "ly-types.d.ts",
|
|
98
|
-
content: LY_EXTENSIONS
|
|
99
|
-
|
|
100
|
-
|
|
141
|
+
content: LY_EXTENSIONS.map((ext) => `declare module "*${ext}" {\n const html: string;\n export default html;\n}`).join("\n"),
|
|
142
|
+
});
|
|
143
|
+
},
|
|
144
|
+
"astro:build:done": async ({ logger }) => {
|
|
145
|
+
if (!assetsDir)
|
|
146
|
+
return;
|
|
147
|
+
await pruneOrphanedAssets({
|
|
148
|
+
dir: assetsDir,
|
|
149
|
+
referenced: referencedAssets,
|
|
150
|
+
logger,
|
|
101
151
|
});
|
|
102
152
|
},
|
|
103
153
|
},
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ResolvedPluginOptions } from "./types.js";
|
|
2
|
+
export type RehypePluginOptions = ResolvedPluginOptions;
|
|
3
|
+
export declare function rehypePlugin(options: RehypePluginOptions): (tree: any, file?: {
|
|
4
|
+
path?: string;
|
|
5
|
+
}) => Promise<void>;
|
|
6
|
+
//# sourceMappingURL=rehype.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rehype.d.ts","sourceRoot":"","sources":["../../src/plugins/rehype.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAQxD,MAAM,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAIxD,wBAAgB,YAAY,CAC3B,OAAO,EAAE,mBAAmB,GAE1B,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAyExD"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { visit } from "unist-util-visit";
|
|
2
|
+
import { defaultOptions, render } from "../render.js";
|
|
3
|
+
import { contentHashFor, imgTag, includePathsFor, isLilypondLang, prependVersion, sourceNameFor, titleFor, } from "../utils/index.js";
|
|
4
|
+
import { writeAsset } from "../writeAsset.js";
|
|
5
|
+
// Typed loosely so it's assignable to both RehypePlugin and the unified
|
|
6
|
+
// Plugin generic regardless of which @types/hast version the host project pins.
|
|
7
|
+
export function rehypePlugin(options) {
|
|
8
|
+
return async (tree, file) => {
|
|
9
|
+
const promises = [];
|
|
10
|
+
const fileNames = [];
|
|
11
|
+
const includePaths = includePathsFor(file?.path);
|
|
12
|
+
const sourceName = sourceNameFor(file?.path);
|
|
13
|
+
const title = titleFor(sourceName);
|
|
14
|
+
visit(tree, "element", (node, index, parent) => {
|
|
15
|
+
if (node.tagName !== "pre" ||
|
|
16
|
+
node.children?.length !== 1 ||
|
|
17
|
+
node.children[0].type !== "element" ||
|
|
18
|
+
node.children[0].tagName !== "code" ||
|
|
19
|
+
index === undefined ||
|
|
20
|
+
!parent)
|
|
21
|
+
return;
|
|
22
|
+
const codeNode = node.children[0];
|
|
23
|
+
const cls = codeNode.properties?.className;
|
|
24
|
+
if (!Array.isArray(cls))
|
|
25
|
+
return;
|
|
26
|
+
const lang = cls
|
|
27
|
+
.find((c) => c.startsWith("language-"))
|
|
28
|
+
?.slice("language-".length);
|
|
29
|
+
if (!isLilypondLang(lang))
|
|
30
|
+
return;
|
|
31
|
+
const raw = codeNode.children
|
|
32
|
+
.filter((c) => c.type === "text")
|
|
33
|
+
.map((c) => c.value)
|
|
34
|
+
.join("");
|
|
35
|
+
const source = options.version
|
|
36
|
+
? prependVersion(raw, options.version)
|
|
37
|
+
: raw;
|
|
38
|
+
const format = options.format ?? defaultOptions.format;
|
|
39
|
+
const resolution = options.resolution ?? defaultOptions.resolution;
|
|
40
|
+
const crop = options.crop ?? defaultOptions.crop;
|
|
41
|
+
const hash = contentHashFor({ source, format, resolution, crop });
|
|
42
|
+
fileNames.push(`${hash}.${title}.${format}`);
|
|
43
|
+
const promise = writeAsset({
|
|
44
|
+
hash,
|
|
45
|
+
title,
|
|
46
|
+
format,
|
|
47
|
+
outputDir: options.assetsDir,
|
|
48
|
+
urlBase: options.assetsUrlBase,
|
|
49
|
+
trackAsset: options.trackAsset,
|
|
50
|
+
getBuffer: () => render(source, {
|
|
51
|
+
format,
|
|
52
|
+
resolution: options.resolution,
|
|
53
|
+
crop: options.crop,
|
|
54
|
+
timeout: options.timeout,
|
|
55
|
+
includePaths,
|
|
56
|
+
sourceName,
|
|
57
|
+
}),
|
|
58
|
+
}).then((url) => {
|
|
59
|
+
const rawNode = { type: "raw", value: imgTag(url) };
|
|
60
|
+
parent.children[index] = rawNode;
|
|
61
|
+
});
|
|
62
|
+
promises.push(promise);
|
|
63
|
+
});
|
|
64
|
+
await Promise.all(promises);
|
|
65
|
+
if (file?.path) {
|
|
66
|
+
await options.pruneStaleAssets(file.path, fileNames);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=rehype.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rehype.js","sourceRoot":"","sources":["../../src/plugins/rehype.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Root } from "mdast";
|
|
2
|
+
import type { Plugin } from "unified";
|
|
3
|
+
import type { ResolvedPluginOptions } from "./types.js";
|
|
4
|
+
export type RemarkPluginOptions = ResolvedPluginOptions;
|
|
5
|
+
export declare const remarkPlugin: Plugin<[RemarkPluginOptions], Root>;
|
|
6
|
+
//# sourceMappingURL=remark.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remark.d.ts","sourceRoot":"","sources":["../../src/plugins/remark.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,IAAI,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAatC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAExD,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,CAAC,mBAAmB,CAAC,EAAE,IAAI,CAkD5D,CAAC"}
|