@shoalrun/cli 0.1.0-alpha.19 → 1.0.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/CHANGELOG.md +30 -0
- package/CODE-REFERENCES.md +137 -0
- package/README.md +19 -6
- package/adapters/python/requirements.txt +1 -0
- package/adapters/python/shoalrun_reference.py +234 -0
- package/agent-docs/.well-known/shoalrun/navigation/project-updates-50f26fe22670.txt +7 -3
- package/agent-docs/SNAPSHOT.json +5 -5
- package/agent-docs/about.md +3 -3
- package/agent-docs/api-docs/code-reference-settings.md +160 -0
- package/agent-docs/api-docs/code-reference-settings.sections/catalog-settings.md +50 -0
- package/agent-docs/api-docs/code-reference-settings.sections/complete-reference-page.md +46 -0
- package/agent-docs/api-docs/code-reference-settings.sections/converter-snapshot.md +58 -0
- package/agent-docs/api-docs/code-reference-settings.sections/descriptions-type-links-and-source-links.md +40 -0
- package/agent-docs/api-docs/code-reference-settings.sections/html-markdown-and-agents.md +38 -0
- package/agent-docs/api-docs/code-reference-settings.sections/metadata-and-selection.md +38 -0
- package/agent-docs/api-docs/code-reference-settings.sections/publication-sources.md +54 -0
- package/agent-docs/api-docs/code-reference-settings.sections/python-adapter-limits.md +38 -0
- package/agent-docs/api-docs/code-reference-settings.sections/related-reading.md +32 -0
- package/agent-docs/api-docs/code-reference-settings.sections/symbol-fields.md +56 -0
- package/agent-docs/api-docs/code-references.md +143 -0
- package/agent-docs/author/agent-overview.md +2 -2
- package/agent-docs/author/components/code-blocks.md +46 -1
- package/agent-docs/author/frontmatter-reference.md +1 -0
- package/agent-docs/author/frontmatter-reference.sections/categorize-connect-and-present-the-page.md +1 -0
- package/agent-docs/author/workspace.md +2 -2
- package/agent-docs/author/writing-style.md +9 -3
- package/agent-docs/author/writing-style.sections/adapt-this-example.md +1 -1
- package/agent-docs/author/writing-style.sections/choose-components-by-reader-need.md +2 -2
- package/agent-docs/author/writing-style.sections/evidence-and-uncertainty.md +1 -1
- package/agent-docs/author/writing-style.sections/example-audience-and-scope.md +1 -1
- package/agent-docs/author/writing-style.sections/feature-availability.md +1 -1
- package/agent-docs/author/writing-style.sections/ingredients-recipes-and-cookbooks.md +1 -1
- package/agent-docs/author/writing-style.sections/page-purpose-and-structure.md +2 -2
- package/agent-docs/author/writing-style.sections/procedures-and-examples.md +1 -1
- package/agent-docs/author/writing-style.sections/related-reading.md +1 -1
- package/agent-docs/author/writing-style.sections/release-notes.md +30 -0
- package/agent-docs/author/writing-style.sections/review-a-draft.md +1 -1
- package/agent-docs/author/writing-style.sections/reviewed-writing-examples.md +1 -1
- package/agent-docs/author/writing-style.sections/voice-and-explanations.md +1 -1
- package/agent-docs/changelog/2026-10-16-navigation-layouts.md +1 -1
- package/agent-docs/changelog/code-api-references.md +44 -0
- package/agent-docs/changelog/pdf-custom-languages.md +48 -0
- package/agent-docs/changelog.md +17 -1
- package/agent-docs/cli.md +11 -1
- package/agent-docs/cli.sections/audit-a-project-and-api-sources.md +1 -1
- package/agent-docs/cli.sections/author-pages.md +1 -1
- package/agent-docs/cli.sections/build-and-serve.md +1 -1
- package/agent-docs/cli.sections/inspect-config-and-operations.md +1 -1
- package/agent-docs/cli.sections/npm-scripts-in-this-repository.md +1 -1
- package/agent-docs/cli.sections/related-reading.md +1 -1
- package/agent-docs/cli.sections/search-and-chat.md +1 -1
- package/agent-docs/cli.sections/start-a-project.md +1 -1
- package/agent-docs/cli.sections/validate-code-reference-snapshots.md +41 -0
- package/agent-docs/cli.sections/working-tree-authoring-tools.md +1 -1
- package/agent-docs/config/apis.md +5 -1
- package/agent-docs/config/examples.md +3 -3
- package/agent-docs/config/examples.sections/feature-showcase.md +3 -3
- package/agent-docs/config/examples.sections/minimal-site.md +2 -2
- package/agent-docs/config/examples.sections/multilingual-help-center.md +2 -2
- package/agent-docs/config/examples.sections/parcel-api-documentation.md +2 -2
- package/agent-docs/config/examples.sections/related-reading.md +2 -2
- package/agent-docs/config/examples.sections/shared-company-preset.md +2 -2
- package/agent-docs/config/outputs.md +33 -12
- package/agent-docs/config/outputs.sections/exports.md +3 -3
- package/agent-docs/config/outputs.sections/metadata.md +3 -3
- package/agent-docs/config/outputs.sections/pdf-output.md +51 -0
- package/agent-docs/config/outputs.sections/related-reading.md +3 -3
- package/agent-docs/config.md +2 -2
- package/agent-docs/configuration.md +2 -2
- package/agent-docs/configuration.sections/build-several-sites-from-shared-content.md +1 -1
- package/agent-docs/configuration.sections/change-inherited-lists-deliberately.md +1 -1
- package/agent-docs/configuration.sections/extract-a-section-with-include.md +1 -1
- package/agent-docs/configuration.sections/inspect-and-validate-changes.md +1 -1
- package/agent-docs/configuration.sections/related-reading.md +1 -1
- package/agent-docs/configuration.sections/separate-config-inheritance-from-page-metadata.md +1 -1
- package/agent-docs/configuration.sections/share-defaults-through-extends.md +1 -1
- package/agent-docs/configuration.sections/start-with-one-working-file.md +2 -2
- package/agent-docs/configuration.sections/understand-the-three-stages.md +1 -1
- package/agent-docs/configuration.sections/understand-where-paths-point.md +1 -1
- package/agent-docs/contribute/agent-skills.md +3 -1
- package/agent-docs/documents.json +1009 -356
- package/agent-docs/features.md +6 -2
- package/agent-docs/index.md +2 -2
- package/agent-docs/provenance.json +6 -6
- package/agent-docs/publish/api-references.md +3 -1
- package/agent-docs/publish/api-references.sections/author-the-reference-page.md +3 -1
- package/agent-docs/publish/api-references.sections/build-and-verify-the-output.md +3 -1
- package/agent-docs/publish/api-references.sections/inspect-the-machine-readable-contract.md +3 -1
- package/agent-docs/publish/api-references.sections/next-steps.md +3 -1
- package/agent-docs/publish/api-references.sections/preview-a-small-api-reference.md +3 -1
- package/agent-docs/publish/api-references.sections/put-the-spec-in-your-project.md +3 -1
- package/agent-docs/publish/api-references.sections/register-the-operation.md +3 -1
- package/agent-docs/publish/api-references.sections/related-reading.md +3 -1
- package/agent-docs/publish/api-references.sections/review-imported-content-before-publishing.md +3 -1
- package/agent-docs/publish/api-references.sections/what-readers-get.md +3 -1
- package/agent-docs/publish/content-export.md +2 -0
- package/agent-docs/publish/content-export.sections/assets-downloads-and-notices.md +2 -0
- package/agent-docs/publish/content-export.sections/check-the-result.md +2 -0
- package/agent-docs/publish/content-export.sections/inspect-the-manifest.md +2 -0
- package/agent-docs/publish/content-export.sections/prerequisites.md +2 -0
- package/agent-docs/publish/content-export.sections/related-reading.md +2 -0
- package/agent-docs/publish/content-export.sections/review-exported-api-material.md +2 -0
- package/agent-docs/publish/content-export.sections/try-the-help-drawer-example.md +2 -0
- package/agent-docs/publish/content-export.sections/what-the-representations-retain.md +2 -0
- package/agent-docs/publish/pdf.md +184 -0
- package/agent-docs/publish/pdf.sections/apply-print-styling.md +65 -0
- package/agent-docs/publish/pdf.sections/check-the-result.md +33 -0
- package/agent-docs/publish/pdf.sections/export-a-page-or-publication.md +61 -0
- package/agent-docs/publish/pdf.sections/html-markdown-and-agents.md +31 -0
- package/agent-docs/publish/pdf.sections/offer-browser-page-printing.md +49 -0
- package/agent-docs/publish/pdf.sections/offer-direct-downloads-through-a-node-server.md +46 -0
- package/agent-docs/publish/pdf.sections/prerequisites.md +37 -0
- package/agent-docs/publish/pdf.sections/publish-an-optional-manual-download.md +39 -0
- package/agent-docs/publish.md +2 -0
- package/agent-docs/reference/agent-skills.md +7 -3
- package/agent-docs/search-index.json +1 -1
- package/agent-docs/start.md +4 -4
- package/agent-docs/start.sections/add-the-page-to-navigation.md +2 -2
- package/agent-docs/start.sections/build-and-check-both-outputs.md +2 -2
- package/agent-docs/start.sections/build-this-site.md +2 -2
- package/agent-docs/start.sections/check-writing-style.md +2 -2
- package/agent-docs/start.sections/create-a-page.md +2 -2
- package/agent-docs/start.sections/make-it-yours.md +2 -2
- package/agent-docs/start.sections/migrating-from-github-packages.md +2 -2
- package/agent-docs/start.sections/prerequisites.md +2 -2
- package/agent-docs/start.sections/related-reading.md +2 -2
- package/agent-docs/start.sections/start-your-own-project.md +4 -4
- package/agent-docs/status.md +9 -5
- package/agent-docs/styling/themes.md +7 -3
- package/agent-docs/what-is-shoalrun.md +2 -2
- package/assets/copy-markdown.js +1 -1
- package/assets/print-view.js +165 -0
- package/assets/print.js +63 -0
- package/dist/artifact-bundle.d.ts +2 -0
- package/dist/artifact-bundle.js +13 -3
- package/dist/authoring-snapshot.js +1 -1
- package/dist/browser-print-assets.d.ts +9 -0
- package/dist/browser-print-assets.js +45 -0
- package/dist/cli-discovery.d.ts +1 -1
- package/dist/cli-discovery.js +1 -0
- package/dist/cli.js +7 -0
- package/dist/code-reference-model.d.ts +85 -0
- package/dist/code-reference-model.js +73 -0
- package/dist/code-references.d.ts +23 -0
- package/dist/code-references.js +371 -0
- package/dist/compiler-config.d.ts +1 -0
- package/dist/compiler.d.ts +4 -2
- package/dist/compiler.js +33 -7
- package/dist/config.js +1 -1
- package/dist/content-export-command.d.ts +77 -1
- package/dist/content-export-command.js +5 -2
- package/dist/content-export-config.d.ts +4 -1
- package/dist/content-export-config.js +10 -5
- package/dist/content-export-render.d.ts +9 -3
- package/dist/content-export-render.js +11 -7
- package/dist/content-export.d.ts +126 -0
- package/dist/content-export.js +267 -124
- package/dist/content-source.d.ts +2 -0
- package/dist/content-workspace.d.ts +1 -0
- package/dist/content-workspace.js +2 -0
- package/dist/fonts.d.ts +9 -0
- package/dist/fonts.js +58 -3
- package/dist/frontmatter.js +5 -2
- package/dist/highlight-languages.d.ts +9 -0
- package/dist/highlight-languages.js +52 -0
- package/dist/highlight.d.ts +4 -1
- package/dist/highlight.js +20 -5
- package/dist/output-commit.d.ts +1 -1
- package/dist/output-commit.js +4 -2
- package/dist/page-materialization.js +3 -2
- package/dist/page-renderer.d.ts +1 -0
- package/dist/page-renderer.js +8 -1
- package/dist/pdf-button.d.ts +22 -0
- package/dist/pdf-button.js +55 -0
- package/dist/pdf-config.d.ts +28 -0
- package/dist/pdf-config.js +43 -0
- package/dist/pdf-http.d.ts +36 -0
- package/dist/pdf-http.js +132 -0
- package/dist/pdf-project.d.ts +6 -0
- package/dist/pdf-project.js +31 -0
- package/dist/pdf-renderer.d.ts +45 -0
- package/dist/pdf-renderer.js +208 -0
- package/dist/pdf-site.d.ts +37 -0
- package/dist/pdf-site.js +65 -0
- package/dist/pdf-stylesheet.d.ts +1 -0
- package/dist/pdf-stylesheet.js +57 -0
- package/dist/publication-render.d.ts +2 -1
- package/dist/publication-render.js +2 -2
- package/dist/representation-tree.js +5 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.js +35 -8
- package/dist/vercel.js +6 -0
- package/examples/code-references/content/start.md +53 -0
- package/examples/code-references/docs.config.yaml +262 -0
- package/examples/code-references/python/orchard/__init__.py +11 -0
- package/examples/code-references/python/orchard/client.py +212 -0
- package/examples/code-references/python/orchard/errors.py +31 -0
- package/examples/code-references/python/orchard/models.py +69 -0
- package/examples/code-references/python/orchard/pagination.py +39 -0
- package/examples/code-references/reference.json +1244 -0
- package/examples/custom-language/README.md +32 -0
- package/examples/custom-language/content/start.mdx +28 -0
- package/examples/custom-language/docs.config.yaml +18 -0
- package/examples/custom-language/grammars/custompy.tmLanguage.json +7 -0
- package/examples/pdf/README.md +27 -0
- package/examples/pdf/content/operations.mdx +26 -0
- package/examples/pdf/content/start.mdx +28 -0
- package/examples/pdf/docs.config.yaml +29 -0
- package/examples/pdf/print.css +9 -0
- package/package.json +11 -2
- package/schemas/code-reference.schema.json +306 -0
- package/skills/shoalrun-author/SKILL.md +6 -0
- package/skills/shoalrun-author/references/code-api-references.md +15 -0
- package/skills/shoalrun-author/references/pdf-export.md +15 -0
- package/skills/shoalrun-brand/SKILL.md +2 -0
- package/skills/shoalrun-pdf/SKILL.md +49 -0
- package/skills/shoalrun-pdf/assets/print.css +49 -0
- package/skills/shoalrun-pdf/references/print-design.md +75 -0
- package/styles/site.css +64 -3
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { type ReaderSelection } from './reader-filters.js';
|
|
2
2
|
import type { Variant } from './content.js';
|
|
3
|
-
|
|
3
|
+
import { type PdfConfig } from './pdf-config.js';
|
|
4
|
+
export type ExportFormat = 'markdown' | 'html' | 'pdf';
|
|
5
|
+
export type PortableExportFormat = Exclude<ExportFormat, 'pdf'>;
|
|
4
6
|
export type ExportResourceSelector = {
|
|
5
7
|
kind: 'page';
|
|
6
8
|
documentId: string;
|
|
@@ -26,6 +28,7 @@ export type ExportTarget = {
|
|
|
26
28
|
assetRoots: string[];
|
|
27
29
|
apiReview: Record<string, string>;
|
|
28
30
|
notices: string[];
|
|
31
|
+
pdf?: PdfConfig;
|
|
29
32
|
};
|
|
30
33
|
export declare function validateExportResources(value: unknown): ExportResourceSelector[];
|
|
31
34
|
export declare function exportPublicBase(value: unknown): string;
|
|
@@ -2,6 +2,7 @@ import { isConfigMapping } from './compiler-config.js';
|
|
|
2
2
|
import { validateContentFilter } from './content-filter.js';
|
|
3
3
|
import { validateReaderFilters } from './reader-filters.js';
|
|
4
4
|
import { validSectionId } from './section-identity.js';
|
|
5
|
+
import { validatePdfConfig } from './pdf-config.js';
|
|
5
6
|
const nonempty = (value) => typeof value === 'string' && value.trim() === value && value.length > 0;
|
|
6
7
|
const snippetId = (value) => nonempty(value) && /^[A-Za-z_][A-Za-z0-9_.-]*$/.test(value)
|
|
7
8
|
&& value.split('.').every(part => /^[A-Za-z_][A-Za-z0-9_-]*$/.test(part) && !['__proto__', 'prototype', 'constructor'].includes(part));
|
|
@@ -50,13 +51,17 @@ export function exportPublicBase(value) {
|
|
|
50
51
|
return value;
|
|
51
52
|
}
|
|
52
53
|
export function validateExportTarget(value, readerFilters) {
|
|
53
|
-
if (!isConfigMapping(value) || Object.keys(value).some(key => !['formats', 'documents', 'resources', 'publication', 'contentFilter', 'publicBase', 'assetRoots', 'apiReview', 'notices'].includes(key)))
|
|
54
|
-
throw new Error('Export target accepts formats, documents or resources, publication, contentFilter, publicBase, assetRoots, apiReview, and
|
|
54
|
+
if (!isConfigMapping(value) || Object.keys(value).some(key => !['formats', 'documents', 'resources', 'publication', 'contentFilter', 'publicBase', 'assetRoots', 'apiReview', 'notices', 'pdf'].includes(key)))
|
|
55
|
+
throw new Error('Export target accepts formats, documents or resources, publication, contentFilter, publicBase, assetRoots, apiReview, notices, and pdf');
|
|
55
56
|
if (value.documents !== undefined && value.resources !== undefined)
|
|
56
57
|
throw new Error('Export documents and resources are mutually exclusive');
|
|
57
58
|
const formats = value.formats ?? ['markdown', 'html'];
|
|
58
|
-
if (!Array.isArray(formats) || !formats.length || formats.some(format => !['markdown', 'html'].includes(format)) || new Set(formats).size !== formats.length)
|
|
59
|
-
throw new Error('Export formats must be a nonempty unique list of markdown
|
|
59
|
+
if (!Array.isArray(formats) || !formats.length || formats.some(format => !['markdown', 'html', 'pdf'].includes(format)) || new Set(formats).size !== formats.length)
|
|
60
|
+
throw new Error('Export formats must be a nonempty unique list of markdown, html, or pdf');
|
|
61
|
+
if (formats.includes('pdf') && formats.length !== 1)
|
|
62
|
+
throw new Error('PDF exports use their own bundle; select pdf alone, or export HTML/Markdown separately');
|
|
63
|
+
if (formats.includes('pdf') && value.resources !== undefined)
|
|
64
|
+
throw new Error('PDF exports select whole pages with documents; section and snippet resources are not supported');
|
|
60
65
|
const strings = (raw, field) => {
|
|
61
66
|
if (raw === undefined)
|
|
62
67
|
return undefined;
|
|
@@ -76,7 +81,7 @@ export function validateExportTarget(value, readerFilters) {
|
|
|
76
81
|
throw new Error('Export apiReview must map API IDs to lowercase SHA-256 digests');
|
|
77
82
|
return { formats: [...formats].sort(), ...(value.documents !== undefined ? { documents: strings(value.documents, 'documents') } : {}), ...(value.resources !== undefined ? { resources: validateExportResources(value.resources) } : {}), ...(publication ? { publication } : {}),
|
|
78
83
|
...(value.contentFilter !== undefined ? { contentFilter: validateContentFilter(value.contentFilter, validateReaderFilters(readerFilters)) } : {}),
|
|
79
|
-
publicBase: exportPublicBase(value.publicBase ?? '/'), assetRoots: strings(value.assetRoots, 'assetRoots') ?? [], apiReview: (value.apiReview ?? {}), notices: strings(value.notices, 'notices') ?? [] };
|
|
84
|
+
publicBase: exportPublicBase(value.publicBase ?? '/'), assetRoots: strings(value.assetRoots, 'assetRoots') ?? [], apiReview: (value.apiReview ?? {}), notices: strings(value.notices, 'notices') ?? [], ...(value.pdf !== undefined ? { pdf: validatePdfConfig(value.pdf) } : {}) };
|
|
80
85
|
}
|
|
81
86
|
export function validateExports(value, readerFilters) {
|
|
82
87
|
if (value === undefined)
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { PortableExportFormat } from './content-export-config.js';
|
|
2
|
+
import type { CodeHighlighter } from './highlight.js';
|
|
2
3
|
/** Lower interactions while representation-specific source blocks still exist. */
|
|
3
|
-
export declare function portableTree(tree: any, format:
|
|
4
|
-
|
|
4
|
+
export declare function portableTree(tree: any, format: PortableExportFormat, routes: Set<string>, basePath: string, options?: {
|
|
5
|
+
print?: boolean;
|
|
6
|
+
}): any;
|
|
7
|
+
export declare function passiveHtml(tree: any, prefix: string, checkAnchors?: boolean, options?: {
|
|
8
|
+
print?: boolean;
|
|
9
|
+
highlighter?: CodeHighlighter;
|
|
10
|
+
}): {
|
|
5
11
|
html: string;
|
|
6
12
|
anchors: Array<{
|
|
7
13
|
id: string;
|
|
@@ -4,7 +4,7 @@ import { renderHtmlWithHeadings } from './html-renderer.js';
|
|
|
4
4
|
import { heading, link, paragraph, root, text, renderMarkdown } from './content.js';
|
|
5
5
|
import { walkthroughMarkdown } from './walkthrough.js';
|
|
6
6
|
/** Lower interactions while representation-specific source blocks still exist. */
|
|
7
|
-
export function portableTree(tree, format, routes, basePath) {
|
|
7
|
+
export function portableTree(tree, format, routes, basePath, options = {}) {
|
|
8
8
|
// Provenance is internal export metadata. Keep it when component lowering
|
|
9
9
|
// synthesizes headings so a slice can retain its full-source identities.
|
|
10
10
|
const inherit = (node, key) => {
|
|
@@ -37,7 +37,7 @@ export function portableTree(tree, format, routes, basePath) {
|
|
|
37
37
|
return [heading(3, node.title), ...node.children.flatMap(walk)];
|
|
38
38
|
if (['docTooltip', 'docInfoHint'].includes(node.type))
|
|
39
39
|
return [node.inline ? text(`${node.label} (${node.definition})`) : paragraph(text(`${node.label}: ${node.definition}`))];
|
|
40
|
-
if (node.type === 'docMath')
|
|
40
|
+
if (node.type === 'docMath' && !options.print)
|
|
41
41
|
return [node.display ? { type: 'code', lang: 'latex', value: node.expression } : { type: 'inlineCode', value: node.expression }];
|
|
42
42
|
if (node.type === 'docDiagram')
|
|
43
43
|
return [paragraph({ type: 'image', url: node.url, alt: node.title }), paragraph(text(`${node.title}: ${node.summary}`)), ...(format === 'markdown' ? [{ type: 'code', lang: node.engine, value: node.source }] : [])];
|
|
@@ -78,7 +78,8 @@ export function portableTree(tree, format, routes, basePath) {
|
|
|
78
78
|
const data = node.data ? { ...node.data } : undefined;
|
|
79
79
|
if (data) {
|
|
80
80
|
delete data.hChildren;
|
|
81
|
-
|
|
81
|
+
if (!options.print)
|
|
82
|
+
delete data.mathMarkup;
|
|
82
83
|
}
|
|
83
84
|
return { ...node, ...(data ? { data } : {}), ...(node.children ? { children: node.children.filter((child) => child.type !== 'definition').map(clean) } : {}) };
|
|
84
85
|
};
|
|
@@ -86,8 +87,10 @@ export function portableTree(tree, format, routes, basePath) {
|
|
|
86
87
|
}
|
|
87
88
|
const tags = new Set('a abbr article b blockquote br caption code col colgroup dd del details div dl dt em figcaption figure h1 h2 h3 h4 h5 h6 hr i img input kbd li ol p pre progress s section small span strong sub summary sup table tbody td th thead time tr ul'.split(' '));
|
|
88
89
|
const attrs = new Set(['id', 'href', 'src', 'alt', 'title', 'colspan', 'rowspan', 'start', 'reversed', 'value', 'max', 'datetime', 'scope', 'align', 'type', 'checked', 'disabled', 'aria-label', 'aria-labelledby', 'aria-describedby', 'aria-hidden', 'role', 'tabindex', 'data-footnote-ref', 'data-footnote-backref', 'data-export-link']);
|
|
89
|
-
|
|
90
|
-
|
|
90
|
+
const mathTags = new Set('math semantics annotation mrow mi mn mo mtext mspace ms mfrac msqrt mroot mstyle merror mpadded mphantom mfenced menclose msub msup msubsup munder mover munderover mmultiscripts mprescripts none mtable mtr mtd mlabeledtr'.split(' '));
|
|
91
|
+
const mathAttrs = new Set('xmlns display mathvariant encoding stretchy fence separator accent accentunder form lspace rspace minsize maxsize symmetric largeop movablelimits scriptlevel displaystyle linethickness notation columnalign columnspacing rowalign rowspacing columnspan rowspan width height depth voffset'.split(' '));
|
|
92
|
+
export function passiveHtml(tree, prefix, checkAnchors = true, options = {}) {
|
|
93
|
+
const rendered = renderHtmlWithHeadings(tree, options.highlighter);
|
|
91
94
|
const fragment = parseFragment(rendered.html);
|
|
92
95
|
const anchors = [];
|
|
93
96
|
const ids = new Set();
|
|
@@ -95,7 +98,7 @@ export function passiveHtml(tree, prefix, checkAnchors = true) {
|
|
|
95
98
|
if (node.nodeName === '#text')
|
|
96
99
|
return;
|
|
97
100
|
if (node.tagName) {
|
|
98
|
-
if (!tags.has(node.tagName))
|
|
101
|
+
if (!tags.has(node.tagName) && !(options.print && mathTags.has(node.tagName)))
|
|
99
102
|
throw new Error(`Unsupported passive HTML element <${node.tagName}>`);
|
|
100
103
|
const original = node.attrs ?? [];
|
|
101
104
|
for (const attr of original) {
|
|
@@ -107,7 +110,8 @@ export function passiveHtml(tree, prefix, checkAnchors = true) {
|
|
|
107
110
|
throw new Error(`Unsafe exported URL: ${attr.value}`);
|
|
108
111
|
}
|
|
109
112
|
}
|
|
110
|
-
node.attrs = original.filter((attr) => attrs.has(attr.name))
|
|
113
|
+
node.attrs = original.filter((attr) => attrs.has(attr.name) || options.print && (attr.name === 'class' || mathTags.has(node.tagName) && mathAttrs.has(attr.name)
|
|
114
|
+
|| attr.name === 'style' && /^(?:(?:color|background-color):(?:#[a-f\d]{3,8}|var\(--code-(?:foreground|token-[a-z-]+)\));?)+$/i.test(attr.value)));
|
|
111
115
|
const id = node.attrs.find((attr) => attr.name === 'id');
|
|
112
116
|
if (id) {
|
|
113
117
|
if (ids.has(id.value))
|
package/dist/content-export.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { type ExportFormat } from './content-export-config.js';
|
|
2
2
|
import { type Variant } from './content.js';
|
|
3
|
+
import { type PdfRenderInput } from './pdf-renderer.js';
|
|
4
|
+
import type { ContentLink } from './content-delivery-contract.js';
|
|
3
5
|
export type ContentExportOptions = {
|
|
4
6
|
profile?: string;
|
|
5
7
|
target?: string;
|
|
@@ -10,9 +12,132 @@ export type ContentExportOptions = {
|
|
|
10
12
|
review?: boolean;
|
|
11
13
|
previousManifest?: string;
|
|
12
14
|
failOnRemoved?: boolean;
|
|
15
|
+
preparePdfOnly?: boolean;
|
|
16
|
+
pdfLinks?: 'internal' | 'canonical';
|
|
17
|
+
pdfStyleTarget?: string;
|
|
18
|
+
};
|
|
19
|
+
export type PdfExportPreparation = {
|
|
20
|
+
input: PdfRenderInput;
|
|
21
|
+
manifest: {
|
|
22
|
+
schemaVersion: number;
|
|
23
|
+
kind: string;
|
|
24
|
+
publication: Variant;
|
|
25
|
+
title: string;
|
|
26
|
+
documents: Array<{
|
|
27
|
+
id: string;
|
|
28
|
+
title: string;
|
|
29
|
+
contentDigest: string;
|
|
30
|
+
anchors: Representation['anchors'];
|
|
31
|
+
links: ExportLink[];
|
|
32
|
+
}>;
|
|
33
|
+
review: {
|
|
34
|
+
status: string;
|
|
35
|
+
apis: Array<{
|
|
36
|
+
apiId: string;
|
|
37
|
+
digest: string;
|
|
38
|
+
}>;
|
|
39
|
+
};
|
|
40
|
+
diagnostics: Array<{
|
|
41
|
+
code: string;
|
|
42
|
+
documentId?: string;
|
|
43
|
+
message: string;
|
|
44
|
+
}>;
|
|
45
|
+
};
|
|
46
|
+
inputs: string[];
|
|
47
|
+
};
|
|
48
|
+
/** Prepare passive, scoped print inputs without launching a browser or writing output. */
|
|
49
|
+
export declare function preparePdfExport(configFile: string, options?: Omit<ContentExportOptions, 'formats' | 'preparePdfOnly'>): Promise<PdfExportPreparation>;
|
|
50
|
+
type ExportLink = ContentLink;
|
|
51
|
+
type Representation = {
|
|
52
|
+
path: string;
|
|
53
|
+
mediaType: string;
|
|
54
|
+
bytes: number;
|
|
55
|
+
digest: string;
|
|
56
|
+
anchors: Array<{
|
|
57
|
+
id: string;
|
|
58
|
+
exportedId: string;
|
|
59
|
+
title?: string;
|
|
60
|
+
}>;
|
|
61
|
+
links: ExportLink[];
|
|
13
62
|
};
|
|
14
63
|
/** Export selected source content; never invoke the website shell/compiler. */
|
|
15
64
|
export declare function exportContent(configFile: string, destination: string, options?: ContentExportOptions): Promise<{
|
|
65
|
+
digest: string;
|
|
66
|
+
preparedPdf: PdfExportPreparation;
|
|
67
|
+
status: string;
|
|
68
|
+
output: string;
|
|
69
|
+
publication: Variant;
|
|
70
|
+
formats: ExportFormat[];
|
|
71
|
+
profileSelection: {
|
|
72
|
+
schemaVersion: number;
|
|
73
|
+
profileDigest: string;
|
|
74
|
+
features: string[];
|
|
75
|
+
provenance: Record<string, string[]>;
|
|
76
|
+
decisions: {
|
|
77
|
+
kind: "page" | "section";
|
|
78
|
+
id: string;
|
|
79
|
+
included: boolean;
|
|
80
|
+
requires?: import("./deployment-profile.js").FeatureRequirements;
|
|
81
|
+
}[];
|
|
82
|
+
} | undefined;
|
|
83
|
+
resources: number;
|
|
84
|
+
documents: number;
|
|
85
|
+
documentIds: string[];
|
|
86
|
+
comparison: {
|
|
87
|
+
status: "no-baseline";
|
|
88
|
+
added: never[];
|
|
89
|
+
removed: never[];
|
|
90
|
+
diagnostics: never[];
|
|
91
|
+
};
|
|
92
|
+
assets: number;
|
|
93
|
+
apiReview: {
|
|
94
|
+
apiId: string;
|
|
95
|
+
digest: string;
|
|
96
|
+
}[];
|
|
97
|
+
diagnostics: {
|
|
98
|
+
code: string;
|
|
99
|
+
documentId?: string;
|
|
100
|
+
message: string;
|
|
101
|
+
}[];
|
|
102
|
+
} | {
|
|
103
|
+
digest: string;
|
|
104
|
+
pdf: string;
|
|
105
|
+
status: string;
|
|
106
|
+
output: string;
|
|
107
|
+
publication: Variant;
|
|
108
|
+
formats: ExportFormat[];
|
|
109
|
+
profileSelection: {
|
|
110
|
+
schemaVersion: number;
|
|
111
|
+
profileDigest: string;
|
|
112
|
+
features: string[];
|
|
113
|
+
provenance: Record<string, string[]>;
|
|
114
|
+
decisions: {
|
|
115
|
+
kind: "page" | "section";
|
|
116
|
+
id: string;
|
|
117
|
+
included: boolean;
|
|
118
|
+
requires?: import("./deployment-profile.js").FeatureRequirements;
|
|
119
|
+
}[];
|
|
120
|
+
} | undefined;
|
|
121
|
+
resources: number;
|
|
122
|
+
documents: number;
|
|
123
|
+
documentIds: string[];
|
|
124
|
+
comparison: {
|
|
125
|
+
status: "no-baseline";
|
|
126
|
+
added: never[];
|
|
127
|
+
removed: never[];
|
|
128
|
+
diagnostics: never[];
|
|
129
|
+
};
|
|
130
|
+
assets: number;
|
|
131
|
+
apiReview: {
|
|
132
|
+
apiId: string;
|
|
133
|
+
digest: string;
|
|
134
|
+
}[];
|
|
135
|
+
diagnostics: {
|
|
136
|
+
code: string;
|
|
137
|
+
documentId?: string;
|
|
138
|
+
message: string;
|
|
139
|
+
}[];
|
|
140
|
+
} | {
|
|
16
141
|
status: string;
|
|
17
142
|
output: string;
|
|
18
143
|
publication: Variant;
|
|
@@ -45,3 +170,4 @@ export declare function exportContent(configFile: string, destination: string, o
|
|
|
45
170
|
message: string;
|
|
46
171
|
}[];
|
|
47
172
|
}>;
|
|
173
|
+
export {};
|