@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/LICENSE +21 -0
- package/README.md +14 -2
- package/dist/article.d.ts +115 -0
- package/dist/article.d.ts.map +1 -0
- package/dist/article.js +2 -0
- package/dist/article.js.map +1 -0
- package/dist/bibtex.d.ts +7 -0
- package/dist/bibtex.d.ts.map +1 -0
- package/dist/bibtex.js +265 -0
- package/dist/bibtex.js.map +1 -0
- package/dist/escape.d.ts +3 -0
- package/dist/escape.d.ts.map +1 -0
- package/dist/escape.js +22 -0
- package/dist/escape.js.map +1 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/render.d.ts +23 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +298 -0
- package/dist/render.js.map +1 -0
- package/package.json +34 -3
- package/src/article.ts +121 -0
- package/src/bibtex.ts +284 -0
- package/src/escape.ts +27 -0
- package/src/index.ts +55 -0
- package/src/render.ts +382 -0
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.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
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
|
+
}
|