@publisle/template-sdk 0.0.0-stage → 0.1.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/dist/render.js ADDED
@@ -0,0 +1,298 @@
1
+ import { toBibtex } from "./bibtex.js";
2
+ import { latexKey, latexText } from "./escape.js";
3
+ export function renderLatexArticle(article, context, profile) {
4
+ const engine = context.engine ?? profile.defaultEngine ?? "pdflatex";
5
+ const requested = context.pdfUa ??
6
+ (context.data && Object.hasOwn(context.data, "pdfUa")
7
+ ? context.data["pdfUa"]
8
+ : "ua-2");
9
+ if (requested !== false && requested !== "ua-1" && requested !== "ua-2")
10
+ throw new Error("pdfUa must be ua-1, ua-2 or false.");
11
+ const pdfStandard = profile.tagging && engine === "lualatex" && requested !== false
12
+ ? requested
13
+ : undefined;
14
+ const language = article.language ?? (profile.direction === "rtl" ? "ar" : "en");
15
+ if (pdfStandard && !/^[A-Za-z]{2,8}(?:-[A-Za-z0-9]{1,8})*$/u.test(language))
16
+ throw new Error("Tagged PDF requires a BCP 47 document language.");
17
+ const fonts = {
18
+ latin: context.fonts?.["latin"] ?? "TeX Gyre Termes",
19
+ arabic: context.fonts?.["arabic"] ?? "PakType Naskh Basic",
20
+ cjk: context.fonts?.["cjk"] ?? "FandolSong",
21
+ math: context.fonts?.["math"] ?? "TeX Gyre Termes Math",
22
+ };
23
+ for (const font of Object.values(fonts))
24
+ if (!/^[\p{L}\p{N} .-]+$/u.test(font))
25
+ throw new Error("Font names must contain letters, digits, spaces, dots or hyphens.");
26
+ const text = (value, direction) => {
27
+ if (engine === "pdflatex" && /[^\u0020-\u007e\t\n\r]/u.test(value))
28
+ throw new Error("Non-ASCII journal text requires --engine lualatex (no glyph substitution is performed).");
29
+ // Script runs select shaping fonts while the surrounding article stays LTR.
30
+ const escaped = value
31
+ .split(/([\p{Script=Arabic}\p{M}\u060c\u061b\u061f]+(?:[ \t]+[\p{Script=Arabic}\p{M}\u060c\u061b\u061f]+)*|[\p{Script=Han}\u3000-\u303f\uff00-\uffef]+)/u)
32
+ .map((run) => {
33
+ const safe = latexText(run);
34
+ if (engine === "lualatex" &&
35
+ /[\p{Script=Arabic}\u060c\u061b\u061f]/u.test(run))
36
+ return `\\foreignlanguage{arabic}{${safe}}`;
37
+ if (engine === "lualatex" &&
38
+ /[\p{Script=Han}\u3000-\u303f\uff00-\uffef]/u.test(run))
39
+ return `{\\cjkfont ${safe}}`;
40
+ const symbols = {
41
+ α: "\\alpha",
42
+ β: "\\beta",
43
+ γ: "\\gamma",
44
+ δ: "\\delta",
45
+ π: "\\pi",
46
+ "∑": "\\sum",
47
+ "∞": "\\infty",
48
+ "≤": "\\leq",
49
+ "≥": "\\geq",
50
+ "±": "\\pm",
51
+ "∈": "\\in",
52
+ "∫": "\\int",
53
+ "√": "\\surd",
54
+ };
55
+ return safe.replace(/[\p{Sm}αβγδπ]/gu, (symbol) => `\\(${symbols[symbol] ?? symbol}\\)`);
56
+ })
57
+ .join("");
58
+ return direction === "rtl" && engine === "lualatex"
59
+ ? `\\foreignlanguage{arabic}{${escaped}}`
60
+ : escaped;
61
+ };
62
+ const labels = new Set();
63
+ const footnotes = new Map();
64
+ const footnoteNumbers = new Map();
65
+ const assets = [];
66
+ for (const block of article.blocks) {
67
+ if (block.label) {
68
+ if (labels.has(block.label))
69
+ throw new Error(`Duplicate label: ${block.label}`);
70
+ labels.add(block.label);
71
+ }
72
+ if (block.kind === "footnote") {
73
+ if (footnotes.has(block.id))
74
+ throw new Error(`Duplicate footnote: ${block.id}`);
75
+ footnotes.set(block.id, block.paragraphs);
76
+ }
77
+ }
78
+ const activeNotes = new Set();
79
+ let citationIndex = 0;
80
+ let emittedNotes = 0;
81
+ const take = (inlines) => inlines
82
+ .map((inline) => {
83
+ if (inline.type === "break")
84
+ return " ";
85
+ if (inline.type === "math")
86
+ return `\\(${inline.value}\\)`;
87
+ if (inline.type === "citation") {
88
+ const formatted = context.citationText?.(inline.cluster) ??
89
+ context.citations[citationIndex++] ??
90
+ "";
91
+ if (!profile.bibliographyStyle) {
92
+ if (context.citationForm === "note" && activeNotes.size === 0) {
93
+ emittedNotes++;
94
+ return `\\footnote{${text(formatted)}}`;
95
+ }
96
+ return text(formatted);
97
+ }
98
+ const locators = inline.cluster.items.filter((item) => item.locator !== undefined);
99
+ if (locators.length > 1)
100
+ throw new Error("BibTeX citation clusters support one locator; split this cluster.");
101
+ if (inline.cluster.items.some((item) => item.suppressAuthor))
102
+ throw new Error("Author suppression is not supported by this numeric BibTeX profile.");
103
+ const locator = locators[0];
104
+ return `${text(inline.cluster.prefix ?? "")}\\${profile.citationCommand ?? "cite"}${locator ? `[${text(`${locator.label ?? "p."} ${locator.locator ?? ""}`)}]` : ""}{${inline.cluster.items.map((item) => latexKey(item.id)).join(",")}}${text(inline.cluster.suffix ?? "")}`;
105
+ }
106
+ if (inline.type === "link")
107
+ return `\\href{${latexText(inline.url)}}{${text(inline.value)}}`;
108
+ if (inline.reference?.kind === "cross") {
109
+ if (!labels.has(inline.reference.target))
110
+ throw new Error(`Unresolved cross-reference: ${inline.reference.target}`);
111
+ return inline.value === inline.reference.target
112
+ ? `\\ref{${latexKey(inline.reference.target)}}`
113
+ : `\\hyperref[${latexKey(inline.reference.target)}]{${text(inline.value)}}`;
114
+ }
115
+ if (inline.reference?.kind === "footnote") {
116
+ const id = inline.reference.target;
117
+ const paragraphs = footnotes.get(id);
118
+ if (!paragraphs)
119
+ throw new Error(`Unresolved footnote: ${id}`);
120
+ if (activeNotes.has(id))
121
+ throw new Error(`Recursive footnote: ${id}`);
122
+ const number = footnoteNumbers.get(id);
123
+ if (number !== undefined)
124
+ return `\\footnotemark[${String(number)}]`;
125
+ footnoteNumbers.set(id, ++emittedNotes);
126
+ activeNotes.add(id);
127
+ const value = paragraphs.map(take).join(" ");
128
+ activeNotes.delete(id);
129
+ return `\\footnote{${value}}`;
130
+ }
131
+ const value = text(inline.value, inline.direction);
132
+ const command = inline.mark === "strong"
133
+ ? "textbf"
134
+ : inline.mark === "emphasis"
135
+ ? "emph"
136
+ : inline.mark === "code"
137
+ ? "texttt"
138
+ : inline.mark === "strike"
139
+ ? "sout"
140
+ : undefined;
141
+ return command ? `\\${command}{${value}}` : value;
142
+ })
143
+ .join("");
144
+ const abstract = [];
145
+ const body = [];
146
+ for (const block of article.blocks) {
147
+ const target = "abstract" in block && block.abstract ? abstract : body;
148
+ const label = block.label ? `\\label{${latexKey(block.label)}}` : "";
149
+ if (block.kind === "heading") {
150
+ if (!block.abstract)
151
+ target.push(`\\${block.level <= 1 ? "section" : block.level === 2 ? "subsection" : "subsubsection"}{${take(block.inlines)}}${label}`);
152
+ }
153
+ else if (block.kind === "paragraph")
154
+ target.push(take(block.inlines));
155
+ else if (block.kind === "math")
156
+ target.push(block.display
157
+ ? `\\begin{equation}${block.value}${label}\\end{equation}`
158
+ : `\\(${block.value}\\)`);
159
+ else if (block.kind === "figure") {
160
+ if (pdfStandard && !block.alt.trim())
161
+ throw new Error("Tagged PDF figures require alternative text.");
162
+ if (/^(?:[a-z]+:|\/\/)/iu.test(block.src))
163
+ throw new Error(`Remote figure assets are unsupported: ${block.src}`);
164
+ const extension = /\.(pdf|png|jpe?g)$/iu
165
+ .exec(block.src)?.[1]
166
+ ?.toLowerCase();
167
+ if (!extension)
168
+ throw new Error(`Unsupported figure asset (use PDF, PNG or JPEG): ${block.src}`);
169
+ const destination = `assets/figure-${String(assets.length + 1)}.${extension}`;
170
+ assets.push({ source: block.src, destination });
171
+ target.push(`\\begin{figure}[!t]\n\\centering\n\\includegraphics[width=\\columnwidth${pdfStandard ? `,alt={${latexText(block.alt)}}` : ""}]{${destination}}\n\\caption{${take(block.caption)}}${label}\n\\end{figure}`);
172
+ }
173
+ else if (block.kind === "table") {
174
+ const width = block.rows[0]?.length ?? 0;
175
+ if (width === 0 || block.rows.some((row) => row.length !== width))
176
+ throw new Error("Journal tables must be nonempty and rectangular.");
177
+ if (pdfStandard &&
178
+ (!Number.isInteger(block.headerRows) ||
179
+ (block.headerRows ?? 0) < 1 ||
180
+ (block.headerRows ?? 0) > block.rows.length))
181
+ throw new Error("Tagged PDF tables require valid headerRows.");
182
+ const rows = block.rows
183
+ .map((row, index) => row
184
+ .map((cell) => index < (block.headerRows ?? 0)
185
+ ? `\\textbf{${take(cell)}}`
186
+ : take(cell))
187
+ .join(" & ") + " \\\\")
188
+ .join("\n");
189
+ target.push(`\\begin{table}[!t]\n\\caption{${take(block.caption ?? [])}}${label}\n\\centering\n${pdfStandard ? `\\tagpdfsetup{table/header-rows={${Array.from({ length: block.headerRows ?? 0 }, (_, index) => String(index + 1)).join(",")}}}\n` : ""}\\begin{tabularx}{\\columnwidth}{${"X".repeat(width)}}\n\\hline\n${rows}\n\\hline\n\\end{tabularx}\n\\end{table}`);
190
+ }
191
+ else if (block.kind === "list")
192
+ target.push(`\\begin{${block.ordered ? "enumerate" : "itemize"}}\n${block.items.map((item) => `\\item ${take(item)}`).join("\n")}\n\\end{${block.ordered ? "enumerate" : "itemize"}}`);
193
+ else if (block.kind === "quote")
194
+ target.push(`\\begin{quote}${block.paragraphs.map(take).join("\n\n")}\\end{quote}`);
195
+ else if (block.kind === "code") {
196
+ if (block.value.includes("\\end{verbatim}"))
197
+ throw new Error("Code contains a verbatim terminator.");
198
+ if (engine === "pdflatex" && /[^\u0020-\u007e\t\n\r]/u.test(block.value))
199
+ throw new Error("Unicode code requires LuaLaTeX.");
200
+ target.push(`\\begin{verbatim}\n${block.value}\n\\end{verbatim}`);
201
+ }
202
+ }
203
+ const unicodePreamble = engine === "lualatex"
204
+ ? `\\usepackage{fontspec}
205
+ \\setmainfont{${fonts.latin}}
206
+ \\usepackage{unicode-math}
207
+ \\setmathfont{${fonts.math}}
208
+ \\usepackage[bidi=basic]{babel}
209
+ ${profile.direction === "rtl" ? "\\babelprovide[import]{english}\n\\babelprovide[import,main]{arabic}" : "\\babelprovide[import,main]{english}\n\\babelprovide[import]{arabic}"}
210
+ \\babelfont[arabic]{rm}{${fonts.arabic}}
211
+ \\newfontfamily\\cjkfont{${fonts.cjk}}
212
+ `
213
+ : "\\usepackage[utf8]{inputenc}\n\\usepackage[T1]{fontenc}\n";
214
+ const authors = article.authors.map((name) => text(name)).join(", ");
215
+ const affiliations = (article.authorDetails ?? [])
216
+ .filter((author) => author.affiliation)
217
+ .map((author) => `\\thanks{${text(author.name)} is with ${text(author.affiliation ?? "")}.}`)
218
+ .join("");
219
+ // BibTeX values are data, not authored TeX. Escape them before writing fields.
220
+ const entries = article.entries.map((entry) => {
221
+ const mapped = {
222
+ id: latexKey(entry.id),
223
+ authors: entry.authors.map((author) => text(author)),
224
+ };
225
+ return {
226
+ ...mapped,
227
+ ...(entry.type === undefined ? {} : { type: entry.type }),
228
+ ...(entry.raw && !entry.title && !entry.authors.length && !entry.issued
229
+ ? { title: text(entry.raw) }
230
+ : {}),
231
+ ...Object.fromEntries(Object.entries(entry)
232
+ .filter(([key, value]) => key !== "id" &&
233
+ key !== "authors" &&
234
+ key !== "type" &&
235
+ key !== "raw" &&
236
+ typeof value === "string")
237
+ .map(([key, value]) => [key, text(String(value))])),
238
+ };
239
+ });
240
+ const manuscript = `${pdfStandard ? `\\DocumentMetadata{lang=${language},pdfstandard=${pdfStandard},${pdfStandard === "ua-1" ? "pdfversion=1.7," : ""}tagging=on,tagging-setup={math/setup={mathml-AF${pdfStandard === "ua-2" ? ",mathml-SE" : ""}}}}\n` : ""}\\documentclass${profile.classOptions ? `[${profile.classOptions}]` : ""}{${profile.className}}
241
+ ${unicodePreamble}\\usepackage{amsmath,${engine === "pdflatex" && profile.pdfSymbols === true ? "amssymb," : ""}graphicx,tabularx${profile.numericCitationPackage ? ",cite" : ""}}
242
+ \\usepackage[normalem]{ulem}
243
+ \\usepackage{hyperref}
244
+ \\hypersetup{hidelinks}
245
+ \\hypersetup{pdftitle={${latexText(article.title ?? "Untitled")}},pdfauthor={${latexText(article.authors.join(", "))}}}
246
+ ${profile.author ? profile.author(article, text) : `\\title{${text(article.title ?? "Untitled")}}\n\\author{${authors}${affiliations}}`}
247
+ ${profile.preamble ?? ""}
248
+ \\begin{document}
249
+ ${profile.frontmatter ? profile.frontmatter(abstract.join("\n\n"), article, text) : `\\maketitle\n\\begin{abstract}\n${abstract.join("\n\n")}\n\\end{abstract}`}
250
+ ${profile.keywords?.(article.subjects ?? [], text) ?? ""}
251
+ ${body.join("\n\n")}
252
+ ${profile.bibliographyStyle ? `${profile.automaticBibliographyStyle ? "" : `\\bibliographystyle{${profile.bibliographyStyle}}\n`}\\bibliography{references}` : `\\section*{${profile.direction === "rtl" ? text("المراجع") : "References"}}\n${context.bibliography.map((item) => text(item.text)).join("\n\n")}`}
253
+ \\end{document}
254
+ `;
255
+ return {
256
+ template: profile.id,
257
+ templateVersion: profile.version,
258
+ format: "latex",
259
+ engine,
260
+ ...(pdfStandard ? { pdfStandard } : {}),
261
+ requirements: [
262
+ "amsmath.sty",
263
+ "graphicx.sty",
264
+ "tabularx.sty",
265
+ "ulem.sty",
266
+ "hyperref.sty",
267
+ ...(pdfStandard ? ["tagpdf.sty", "luamml.sty"] : []),
268
+ ...(engine === "lualatex"
269
+ ? ["fontspec.sty", "unicode-math.sty", "lualatex-math.sty", "babel.sty"]
270
+ : []),
271
+ `${profile.className}.cls`,
272
+ ...(profile.bibliographyStyle
273
+ ? [`${profile.bibliographyStyle}.bst`]
274
+ : []),
275
+ ],
276
+ fonts: engine === "lualatex" ? fonts : {},
277
+ files: {
278
+ "manuscript.tex": manuscript,
279
+ "references.bib": toBibtex(entries),
280
+ "BUILD.md": `# Rebuild\n\nRequires latexmk, ${engine}, and ${profile.className}.${pdfStandard ? ` LaTeX format >= 2025-11-01 is required for ${pdfStandard} tagging. Compiling does not run PDF/UA validation.` : ""}\n\nRun: latexmk -${engine === "pdflatex" ? "pdf" : "lualatex"} -norc -interaction=nonstopmode -halt-on-error -no-shell-escape manuscript.tex\n`,
281
+ },
282
+ assets,
283
+ diagnostics: [
284
+ ...article.losses,
285
+ ...(pdfStandard
286
+ ? []
287
+ : [
288
+ {
289
+ code: "pdf-ua-unavailable",
290
+ message: requested === false
291
+ ? "PDF tagging was explicitly disabled; this output does not claim PDF/UA conformance."
292
+ : `PDF/UA tagging is unavailable for ${profile.id} with ${engine}; use a LuaLaTeX article template.`,
293
+ },
294
+ ]),
295
+ ],
296
+ };
297
+ }
298
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,37 @@
1
1
  {
2
2
  "name": "@publisle/template-sdk",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js",
11
+ "default": "./dist/index.js"
12
+ }
13
+ },
14
+ "dependencies": {
15
+ "@publisle/schema": "0.1.0"
16
+ },
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "src",
23
+ "README.md",
24
+ "NOTICE.md",
25
+ "LICENSE"
26
+ ],
27
+ "engines": {
28
+ "node": ">=24"
29
+ },
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/VoidReg/publisle.git",
33
+ "directory": "packages/template-sdk"
34
+ },
35
+ "homepage": "https://github.com/VoidReg/publisle#readme",
36
+ "types": "./dist/index.d.ts"
6
37
  }
package/src/article.ts ADDED
@@ -0,0 +1,121 @@
1
+ import type { Author, PublicationMetadata } from "@publisle/schema";
2
+
3
+ type WritingDirection = NonNullable<PublicationMetadata["direction"]>;
4
+
5
+ export interface ResearchLoss {
6
+ readonly code: string;
7
+ readonly message: string;
8
+ }
9
+
10
+ export interface CitationRef {
11
+ readonly id: string;
12
+ readonly locator?: string;
13
+ readonly label?: string;
14
+ readonly suppressAuthor?: boolean;
15
+ }
16
+
17
+ export interface CitationCluster {
18
+ readonly items: readonly CitationRef[];
19
+ readonly prefix?: string;
20
+ readonly suffix?: string;
21
+ }
22
+
23
+ export type ArticleInline =
24
+ | {
25
+ readonly type: "text";
26
+ readonly value: string;
27
+ readonly mark?: "emphasis" | "strong" | "code" | "strike";
28
+ readonly direction?: WritingDirection;
29
+ readonly reference?: {
30
+ readonly kind: "footnote" | "cross";
31
+ readonly target: string;
32
+ };
33
+ }
34
+ | { readonly type: "math"; readonly value: string }
35
+ | { readonly type: "link"; readonly url: string; readonly value: string }
36
+ | { readonly type: "citation"; readonly cluster: CitationCluster }
37
+ | { readonly type: "break" };
38
+
39
+ export interface CitationEntry {
40
+ readonly id: string;
41
+ readonly type?: string;
42
+ readonly title?: string;
43
+ readonly authors: readonly string[];
44
+ readonly issued?: string;
45
+ readonly containerTitle?: string;
46
+ readonly volume?: string;
47
+ readonly issue?: string;
48
+ readonly page?: string;
49
+ readonly publisher?: string;
50
+ readonly doi?: string;
51
+ readonly url?: string;
52
+ readonly raw?: string;
53
+ }
54
+
55
+ export type ArticleBlock = (
56
+ | {
57
+ readonly kind: "heading";
58
+ readonly level: number;
59
+ readonly inlines: readonly ArticleInline[];
60
+ readonly abstract: boolean;
61
+ }
62
+ | {
63
+ readonly kind: "paragraph";
64
+ readonly inlines: readonly ArticleInline[];
65
+ readonly abstract: boolean;
66
+ }
67
+ | {
68
+ readonly kind: "list";
69
+ readonly ordered: boolean;
70
+ readonly items: readonly (readonly ArticleInline[])[];
71
+ readonly abstract: boolean;
72
+ }
73
+ | {
74
+ readonly kind: "quote";
75
+ readonly paragraphs: readonly (readonly ArticleInline[])[];
76
+ readonly abstract: boolean;
77
+ }
78
+ | {
79
+ readonly kind: "code";
80
+ readonly value: string;
81
+ readonly abstract: boolean;
82
+ }
83
+ | {
84
+ readonly kind: "math";
85
+ readonly value: string;
86
+ readonly display: boolean;
87
+ readonly abstract: boolean;
88
+ }
89
+ | {
90
+ readonly kind: "table";
91
+ readonly caption?: readonly ArticleInline[];
92
+ readonly headerRows?: number;
93
+ readonly rows: readonly (readonly (readonly ArticleInline[])[])[];
94
+ readonly abstract: boolean;
95
+ }
96
+ | {
97
+ readonly kind: "footnote";
98
+ readonly id: string;
99
+ readonly paragraphs: readonly (readonly ArticleInline[])[];
100
+ }
101
+ | {
102
+ readonly kind: "figure";
103
+ readonly src: string;
104
+ readonly alt: string;
105
+ readonly caption: readonly ArticleInline[];
106
+ readonly abstract: boolean;
107
+ }
108
+ | { readonly kind: "bibliography" }
109
+ ) & { readonly label?: string };
110
+
111
+ export interface Article {
112
+ readonly title?: string;
113
+ readonly authors: readonly string[];
114
+ readonly authorDetails?: readonly Author[];
115
+ readonly subjects?: readonly string[];
116
+ readonly language?: string;
117
+ readonly direction?: WritingDirection;
118
+ readonly blocks: readonly ArticleBlock[];
119
+ readonly entries: readonly CitationEntry[];
120
+ readonly losses: readonly ResearchLoss[];
121
+ }