@publisle/template-sdk 0.0.0-stage → 0.1.1

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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 VoidReg
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,15 @@
1
- # Temporary Holding Version
1
+ # @publisle/template-sdk
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Publisle Research profile package.
4
+
5
+ Requires Node.js 24 or later. Framework adapters also require their declared peer dependencies.
6
+ This package is part of Publisle, independently versioned at `0.1.1` and published under the npm `beta` tag.
7
+ Frozen contract version integers are independent of npm package versions.
8
+
9
+ - [Core standard](https://github.com/VoidReg/publisle/blob/main/docs/standards/README.md)
10
+ - [Quickstart and package usage](https://github.com/VoidReg/publisle#readme)
11
+ - [Distribution and release checklist](https://github.com/VoidReg/publisle/blob/main/docs/guides/releases.md)
12
+ - [Research export guide](https://github.com/VoidReg/publisle/blob/main/docs/guides/journal-export.md)
13
+
14
+ Research tooling is optional and is excluded from Core-only installations. Read any
15
+ included `NOTICE.md` for third-party licensing obligations.
@@ -0,0 +1,115 @@
1
+ import type { Author, PublicationMetadata } from "@publisle/schema";
2
+ type WritingDirection = NonNullable<PublicationMetadata["direction"]>;
3
+ export interface ResearchLoss {
4
+ readonly code: string;
5
+ readonly message: string;
6
+ }
7
+ export interface CitationRef {
8
+ readonly id: string;
9
+ readonly locator?: string;
10
+ readonly label?: string;
11
+ readonly suppressAuthor?: boolean;
12
+ }
13
+ export interface CitationCluster {
14
+ readonly items: readonly CitationRef[];
15
+ readonly prefix?: string;
16
+ readonly suffix?: string;
17
+ }
18
+ export type ArticleInline = {
19
+ readonly type: "text";
20
+ readonly value: string;
21
+ readonly mark?: "emphasis" | "strong" | "code" | "strike";
22
+ readonly direction?: WritingDirection;
23
+ readonly reference?: {
24
+ readonly kind: "footnote" | "cross";
25
+ readonly target: string;
26
+ };
27
+ } | {
28
+ readonly type: "math";
29
+ readonly value: string;
30
+ } | {
31
+ readonly type: "link";
32
+ readonly url: string;
33
+ readonly value: string;
34
+ } | {
35
+ readonly type: "citation";
36
+ readonly cluster: CitationCluster;
37
+ } | {
38
+ readonly type: "break";
39
+ };
40
+ export interface CitationEntry {
41
+ readonly id: string;
42
+ readonly type?: string;
43
+ readonly title?: string;
44
+ readonly authors: readonly string[];
45
+ readonly issued?: string;
46
+ readonly containerTitle?: string;
47
+ readonly volume?: string;
48
+ readonly issue?: string;
49
+ readonly page?: string;
50
+ readonly publisher?: string;
51
+ readonly doi?: string;
52
+ readonly url?: string;
53
+ readonly raw?: string;
54
+ }
55
+ export type ArticleBlock = ({
56
+ readonly kind: "heading";
57
+ readonly level: number;
58
+ readonly inlines: readonly ArticleInline[];
59
+ readonly abstract: boolean;
60
+ } | {
61
+ readonly kind: "paragraph";
62
+ readonly inlines: readonly ArticleInline[];
63
+ readonly abstract: boolean;
64
+ } | {
65
+ readonly kind: "list";
66
+ readonly ordered: boolean;
67
+ readonly items: readonly (readonly ArticleInline[])[];
68
+ readonly abstract: boolean;
69
+ } | {
70
+ readonly kind: "quote";
71
+ readonly paragraphs: readonly (readonly ArticleInline[])[];
72
+ readonly abstract: boolean;
73
+ } | {
74
+ readonly kind: "code";
75
+ readonly value: string;
76
+ readonly abstract: boolean;
77
+ } | {
78
+ readonly kind: "math";
79
+ readonly value: string;
80
+ readonly display: boolean;
81
+ readonly abstract: boolean;
82
+ } | {
83
+ readonly kind: "table";
84
+ readonly caption?: readonly ArticleInline[];
85
+ readonly headerRows?: number;
86
+ readonly rows: readonly (readonly (readonly ArticleInline[])[])[];
87
+ readonly abstract: boolean;
88
+ } | {
89
+ readonly kind: "footnote";
90
+ readonly id: string;
91
+ readonly paragraphs: readonly (readonly ArticleInline[])[];
92
+ } | {
93
+ readonly kind: "figure";
94
+ readonly src: string;
95
+ readonly alt: string;
96
+ readonly caption: readonly ArticleInline[];
97
+ readonly abstract: boolean;
98
+ } | {
99
+ readonly kind: "bibliography";
100
+ }) & {
101
+ readonly label?: string;
102
+ };
103
+ export interface Article {
104
+ readonly title?: string;
105
+ readonly authors: readonly string[];
106
+ readonly authorDetails?: readonly Author[];
107
+ readonly subjects?: readonly string[];
108
+ readonly language?: string;
109
+ readonly direction?: WritingDirection;
110
+ readonly blocks: readonly ArticleBlock[];
111
+ readonly entries: readonly CitationEntry[];
112
+ readonly losses: readonly ResearchLoss[];
113
+ }
114
+ export {};
115
+ //# sourceMappingURL=article.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"article.d.ts","sourceRoot":"","sources":["../src/article.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEpE,KAAK,gBAAgB,GAAG,WAAW,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC;AAEtE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,aAAa,GACrB;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC1D,QAAQ,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE;QACnB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;QACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;KACzB,CAAC;CACH,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;CAAE,GAChE;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAE/B,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,YAAY,GAAG,CACvB;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,aAAa,EAAE,CAAC,EAAE,CAAC;IACtD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,SAAS,aAAa,EAAE,CAAC,EAAE,CAAC;IAC3D,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC5C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,SAAS,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAClE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,SAAS,aAAa,EAAE,CAAC,EAAE,CAAC;CAC5D,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAAE,CACpC,GAAG;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhC,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;CAC1C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=article.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"article.js","sourceRoot":"","sources":["../src/article.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { CitationEntry } from "./article.js";
2
+ /** Parse BibTeX entries. `raw` is the original entry text, unchanged. */
3
+ export declare function parseBibtex(source: string): CitationEntry[];
4
+ /** Write BibTeX. An entry that only has `raw` is copied exactly. */
5
+ export declare function toBibtex(entries: readonly CitationEntry[]): string;
6
+ export declare function toCslJson(entries: readonly CitationEntry[]): string;
7
+ //# sourceMappingURL=bibtex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bibtex.d.ts","sourceRoot":"","sources":["../src/bibtex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB;AAmHlD,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE,CA2E3D;AAqBD,oEAAoE;AACpE,wBAAgB,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,GAAG,MAAM,CAkClE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,GAAG,MAAM,CAkCnE"}
package/dist/bibtex.js ADDED
@@ -0,0 +1,265 @@
1
+ const TYPE_TO_BIBTEX = {
2
+ "article-journal": "article",
3
+ book: "book",
4
+ "paper-conference": "inproceedings",
5
+ chapter: "incollection",
6
+ report: "techreport",
7
+ thesis: "phdthesis",
8
+ webpage: "online",
9
+ };
10
+ const BIBTEX_TO_TYPE = {
11
+ article: "article-journal",
12
+ book: "book",
13
+ inproceedings: "paper-conference",
14
+ conference: "paper-conference",
15
+ incollection: "chapter",
16
+ techreport: "report",
17
+ phdthesis: "thesis",
18
+ online: "webpage",
19
+ misc: "document",
20
+ };
21
+ function balanced(source, start, open, close) {
22
+ let depth = 0;
23
+ for (let index = start; index < source.length; index += 1) {
24
+ const char = source[index];
25
+ if (char === open)
26
+ depth += 1;
27
+ else if (char === close) {
28
+ depth -= 1;
29
+ if (depth === 0)
30
+ return index;
31
+ }
32
+ }
33
+ throw new Error("BibTeX value is missing its closing delimiter.");
34
+ }
35
+ function skipSpace(source, index) {
36
+ let cursor = index;
37
+ while (cursor < source.length) {
38
+ const char = source[cursor];
39
+ if (char === "%") {
40
+ const line = source.indexOf("\n", cursor);
41
+ cursor = line === -1 ? source.length : line + 1;
42
+ continue;
43
+ }
44
+ if (char !== undefined && /\s/u.test(char)) {
45
+ cursor += 1;
46
+ continue;
47
+ }
48
+ break;
49
+ }
50
+ return cursor;
51
+ }
52
+ function readValue(source, index) {
53
+ const start = skipSpace(source, index);
54
+ const char = source[start];
55
+ if (char === "{") {
56
+ const end = balanced(source, start, "{", "}");
57
+ return { value: source.slice(start + 1, end), index: end + 1 };
58
+ }
59
+ if (char === '"') {
60
+ const end = source.indexOf('"', start + 1);
61
+ if (end === -1)
62
+ throw new Error("BibTeX quoted value is not closed.");
63
+ return { value: source.slice(start + 1, end), index: end + 1 };
64
+ }
65
+ let end = start;
66
+ while (end < source.length && source[end] !== "," && source[end] !== "}")
67
+ end += 1;
68
+ return { value: source.slice(start, end).trim(), index: end };
69
+ }
70
+ function splitAuthors(value) {
71
+ const people = [];
72
+ let current = "";
73
+ let depth = 0;
74
+ for (let index = 0; index < value.length; index += 1) {
75
+ const char = value[index];
76
+ if (char === "{")
77
+ depth += 1;
78
+ if (char === "}")
79
+ depth = Math.max(0, depth - 1);
80
+ if (depth === 0 &&
81
+ value.slice(index, index + 5).toLowerCase() === " and ") {
82
+ people.push(current.trim());
83
+ current = "";
84
+ index += 4;
85
+ continue;
86
+ }
87
+ current += char ?? "";
88
+ }
89
+ if (current.trim())
90
+ people.push(current.trim());
91
+ return people.map((person) => {
92
+ const comma = person.indexOf(",");
93
+ if (comma !== -1)
94
+ return `${person.slice(0, comma).trim()}, ${person.slice(comma + 1).trim()}`.replace(/, $/, "");
95
+ const parts = person.split(/\s+/u).filter((part) => part.length > 0);
96
+ if (parts.length < 2)
97
+ return person;
98
+ const family = parts[parts.length - 1] ?? person;
99
+ return `${family}, ${parts.slice(0, -1).join(" ")}`;
100
+ });
101
+ }
102
+ /** Parse BibTeX entries. `raw` is the original entry text, unchanged. */
103
+ export function parseBibtex(source) {
104
+ const entries = [];
105
+ let index = 0;
106
+ while (index < source.length) {
107
+ const at = source.indexOf("@", index);
108
+ if (at === -1)
109
+ break;
110
+ const typeMatch = /^@([A-Za-z]+)\{/u.exec(source.slice(at));
111
+ if (!typeMatch) {
112
+ index = at + 1;
113
+ continue;
114
+ }
115
+ const bibType = (typeMatch[1] ?? "").toLowerCase();
116
+ if (bibType === "comment" ||
117
+ bibType === "string" ||
118
+ bibType === "preamble") {
119
+ index = balanced(source, at + typeMatch[0].length - 1, "{", "}") + 1;
120
+ continue;
121
+ }
122
+ const keyStart = at + typeMatch[0].length;
123
+ const keyEnd = source.indexOf(",", keyStart);
124
+ if (keyEnd === -1)
125
+ throw new Error("BibTeX entry is missing its citation key.");
126
+ const id = source.slice(keyStart, keyEnd).trim();
127
+ if (!id)
128
+ throw new Error("BibTeX citation key is empty.");
129
+ const fields = new Map();
130
+ let cursor = keyEnd + 1;
131
+ const entryEnd = balanced(source, at + typeMatch[0].length - 1, "{", "}");
132
+ while (cursor < entryEnd) {
133
+ cursor = skipSpace(source, cursor);
134
+ if (cursor >= entryEnd)
135
+ break;
136
+ const nameEnd = source.slice(cursor).search(/[\s=]/u);
137
+ if (nameEnd <= 0)
138
+ throw new Error(`BibTeX field name is missing in ${id}.`);
139
+ const name = source.slice(cursor, cursor + nameEnd).toLowerCase();
140
+ cursor = skipSpace(source, cursor + nameEnd);
141
+ if (source[cursor] !== "=")
142
+ throw new Error(`BibTeX field ${name} is missing '='.`);
143
+ const read = readValue(source, cursor + 1);
144
+ fields.set(name, read.value.trim());
145
+ cursor = skipSpace(source, read.index);
146
+ if (source[cursor] === ",")
147
+ cursor += 1;
148
+ }
149
+ const authors = fields.has("author")
150
+ ? splitAuthors(fields.get("author") ?? "")
151
+ : [];
152
+ const title = fields.get("title");
153
+ const issued = fields.get("year");
154
+ const containerTitle = fields.get("journal") ?? fields.get("booktitle");
155
+ const volume = fields.get("volume");
156
+ const issue = fields.get("number");
157
+ const page = fields.get("pages");
158
+ const publisher = fields.get("publisher");
159
+ const doi = fields.get("doi");
160
+ const url = fields.get("url");
161
+ const raw = source.slice(at, entryEnd + 1);
162
+ entries.push({
163
+ id,
164
+ type: BIBTEX_TO_TYPE[bibType] ?? "document",
165
+ authors,
166
+ raw,
167
+ ...(title === undefined ? {} : { title }),
168
+ ...(issued === undefined ? {} : { issued }),
169
+ ...(containerTitle === undefined ? {} : { containerTitle }),
170
+ ...(volume === undefined ? {} : { volume }),
171
+ ...(issue === undefined ? {} : { issue }),
172
+ ...(page === undefined ? {} : { page }),
173
+ ...(publisher === undefined ? {} : { publisher }),
174
+ ...(doi === undefined ? {} : { doi }),
175
+ ...(url === undefined ? {} : { url }),
176
+ });
177
+ index = entryEnd + 1;
178
+ }
179
+ return entries;
180
+ }
181
+ function brace(value) {
182
+ return `{${value}}`;
183
+ }
184
+ function structured(entry) {
185
+ return (entry.title !== undefined ||
186
+ entry.authors.length > 0 ||
187
+ entry.issued !== undefined ||
188
+ entry.containerTitle !== undefined ||
189
+ entry.volume !== undefined ||
190
+ entry.issue !== undefined ||
191
+ entry.page !== undefined ||
192
+ entry.publisher !== undefined ||
193
+ entry.doi !== undefined ||
194
+ entry.url !== undefined);
195
+ }
196
+ /** Write BibTeX. An entry that only has `raw` is copied exactly. */
197
+ export function toBibtex(entries) {
198
+ return entries
199
+ .map((entry) => {
200
+ if (!structured(entry) && entry.raw !== undefined)
201
+ return entry.raw;
202
+ const type = TYPE_TO_BIBTEX[entry.type ?? ""] ?? "misc";
203
+ const fields = [
204
+ entry.authors.length > 0
205
+ ? ` author = ${brace(entry.authors.join(" and "))}`
206
+ : undefined,
207
+ entry.title === undefined
208
+ ? undefined
209
+ : ` title = ${brace(entry.title)}`,
210
+ entry.containerTitle === undefined
211
+ ? undefined
212
+ : ` ${type === "article" ? "journal" : "booktitle"} = ${brace(entry.containerTitle)}`,
213
+ entry.issued === undefined
214
+ ? undefined
215
+ : ` year = ${brace(entry.issued)}`,
216
+ entry.volume === undefined
217
+ ? undefined
218
+ : ` volume = ${brace(entry.volume)}`,
219
+ entry.issue === undefined
220
+ ? undefined
221
+ : ` number = ${brace(entry.issue)}`,
222
+ entry.page === undefined ? undefined : ` pages = ${brace(entry.page)}`,
223
+ entry.publisher === undefined
224
+ ? undefined
225
+ : ` publisher = ${brace(entry.publisher)}`,
226
+ entry.doi === undefined ? undefined : ` doi = ${brace(entry.doi)}`,
227
+ entry.url === undefined ? undefined : ` url = ${brace(entry.url)}`,
228
+ ].filter((field) => field !== undefined);
229
+ return `@${type}{${entry.id},\n${fields.join(",\n")}\n}`;
230
+ })
231
+ .join("\n\n");
232
+ }
233
+ export function toCslJson(entries) {
234
+ return JSON.stringify(entries.map((entry) => ({
235
+ id: entry.id,
236
+ type: entry.type ?? "document",
237
+ ...(entry.title === undefined ? {} : { title: entry.title }),
238
+ ...(entry.authors.length === 0
239
+ ? {}
240
+ : {
241
+ author: entry.authors.map((author) => {
242
+ const comma = author.indexOf(",");
243
+ if (comma === -1)
244
+ return { family: author };
245
+ const given = author.slice(comma + 1).trim();
246
+ return given.length === 0
247
+ ? { family: author.slice(0, comma).trim() }
248
+ : { family: author.slice(0, comma).trim(), given };
249
+ }),
250
+ }),
251
+ ...(entry.issued !== undefined && /^\d{4}/u.test(entry.issued)
252
+ ? { issued: { "date-parts": [[Number(entry.issued.slice(0, 4))]] } }
253
+ : {}),
254
+ ...(entry.containerTitle === undefined
255
+ ? {}
256
+ : { "container-title": entry.containerTitle }),
257
+ ...(entry.volume === undefined ? {} : { volume: entry.volume }),
258
+ ...(entry.issue === undefined ? {} : { issue: entry.issue }),
259
+ ...(entry.page === undefined ? {} : { page: entry.page }),
260
+ ...(entry.publisher === undefined ? {} : { publisher: entry.publisher }),
261
+ ...(entry.doi === undefined ? {} : { DOI: entry.doi }),
262
+ ...(entry.url === undefined ? {} : { URL: entry.url }),
263
+ })), null, 2);
264
+ }
265
+ //# sourceMappingURL=bibtex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bibtex.js","sourceRoot":"","sources":["../src/bibtex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function latexText(value: string): string;
2
+ export declare function latexKey(value: string): string;
3
+ //# sourceMappingURL=escape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../src/escape.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAiB/C;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO9C"}
package/dist/escape.js ADDED
@@ -0,0 +1,22 @@
1
+ export function latexText(value) {
2
+ const escapes = {
3
+ "\\": "\\textbackslash{}",
4
+ "&": "\\&",
5
+ "%": "\\%",
6
+ $: "\\$",
7
+ "#": "\\#",
8
+ _: "\\_",
9
+ "{": "\\{",
10
+ "}": "\\}",
11
+ "~": "\\textasciitilde{}",
12
+ "^": "\\textasciicircum{}",
13
+ };
14
+ return value.replace(/[\\&%$#_{}~^]/gu, (character) => escapes[character] ?? character);
15
+ }
16
+ export function latexKey(value) {
17
+ if (/^[A-Za-z][A-Za-z0-9:.-]*$/u.test(value) &&
18
+ !value.startsWith("publisle-key-"))
19
+ return value;
20
+ return `publisle-key-${Array.from(new TextEncoder().encode(value), (byte) => byte.toString(16).padStart(2, "0")).join("")}`;
21
+ }
22
+ //# sourceMappingURL=escape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escape.js","sourceRoot":"","sources":["../src/escape.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,MAAM,OAAO,GAAqC;QAChD,IAAI,EAAE,mBAAmB;QACzB,GAAG,EAAE,KAAK;QACV,GAAG,EAAE,KAAK;QACV,CAAC,EAAE,KAAK;QACR,GAAG,EAAE,KAAK;QACV,CAAC,EAAE,KAAK;QACR,GAAG,EAAE,KAAK;QACV,GAAG,EAAE,KAAK;QACV,GAAG,EAAE,oBAAoB;QACzB,GAAG,EAAE,qBAAqB;KAC3B,CAAC;IACF,OAAO,KAAK,CAAC,OAAO,CAClB,iBAAiB,EACjB,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,CAC/C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,IACE,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC;QACxC,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC;QAElC,OAAO,KAAK,CAAC;IACf,OAAO,gBAAgB,KAAK,CAAC,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AAC9H,CAAC"}
@@ -0,0 +1,54 @@
1
+ export type * from "./article.js";
2
+ export { parseBibtex, toBibtex, toCslJson } from "./bibtex.js";
3
+ export { latexText, latexKey } from "./escape.js";
4
+ export { renderLatexArticle } from "./render.js";
5
+ export type { LatexProfile } from "./render.js";
6
+ import type { Article, ResearchLoss } from "./article.js";
7
+ export type LatexEngine = "pdflatex" | "lualatex";
8
+ export interface SourcePackage {
9
+ /** Requested tagging, not a claim that the compiled PDF passed validation. */
10
+ readonly pdfStandard?: "ua-1" | "ua-2";
11
+ readonly template: string;
12
+ readonly templateVersion: string;
13
+ readonly format: "latex";
14
+ readonly engine: LatexEngine;
15
+ readonly requirements: readonly string[];
16
+ readonly fonts: Readonly<Record<string, string>>;
17
+ readonly files: Readonly<Record<string, string>>;
18
+ readonly resources?: Readonly<Record<string, Uint8Array>>;
19
+ readonly assets: readonly {
20
+ readonly source: string;
21
+ readonly destination: string;
22
+ }[];
23
+ readonly diagnostics: readonly ResearchLoss[];
24
+ }
25
+ export interface TemplateContext {
26
+ readonly pdfUa?: "ua-1" | "ua-2" | false;
27
+ readonly engine?: LatexEngine;
28
+ readonly style: string;
29
+ readonly fonts?: Readonly<Record<string, string>>;
30
+ readonly data?: Readonly<Record<string, unknown>>;
31
+ readonly citations: readonly string[];
32
+ readonly citationText?: (cluster: import("./article.js").CitationCluster) => string;
33
+ readonly citationForm: "numeric" | "author-date" | "note";
34
+ readonly bibliography: readonly {
35
+ readonly id: string;
36
+ readonly label: string;
37
+ readonly text: string;
38
+ }[];
39
+ }
40
+ /** Trusted host code. Rendering is pure; collecting assets and running tools belong to the host. */
41
+ export interface PublishingTemplate {
42
+ readonly id: string;
43
+ readonly version: string;
44
+ readonly format: "latex";
45
+ readonly engines: readonly LatexEngine[];
46
+ readonly languages: readonly string[];
47
+ readonly directions: readonly ("ltr" | "rtl")[];
48
+ readonly bibliographyMode: "csl" | "bibtex";
49
+ readonly requiredMetadata: readonly string[];
50
+ validate(article: Article, context: TemplateContext): readonly ResearchLoss[];
51
+ render(article: Article, context: TemplateContext): SourcePackage;
52
+ }
53
+ export type TemplateRegistry = Readonly<Record<string, PublishingTemplate>>;
54
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { parseBibtex, toBibtex, toCslJson } from "./bibtex.js";
2
+ export { latexText, latexKey } from "./escape.js";
3
+ export { renderLatexArticle } from "./render.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { Article } from "./article.js";
2
+ import type { LatexEngine, SourcePackage, TemplateContext } from "./index.js";
3
+ export interface LatexProfile {
4
+ /** Only enable after validating the class against the pinned compiler. */
5
+ readonly tagging?: boolean;
6
+ readonly id: string;
7
+ readonly version: string;
8
+ readonly className: string;
9
+ readonly classOptions?: string;
10
+ readonly bibliographyStyle?: string;
11
+ readonly direction?: "ltr" | "rtl";
12
+ readonly defaultEngine?: LatexEngine;
13
+ readonly preamble?: string;
14
+ readonly automaticBibliographyStyle?: boolean;
15
+ readonly numericCitationPackage?: boolean;
16
+ readonly pdfSymbols?: boolean;
17
+ readonly keywords?: (subjects: readonly string[], text: (value: string) => string) => string;
18
+ readonly citationCommand?: "cite" | "citep";
19
+ readonly author?: (article: Article, text: (value: string) => string) => string;
20
+ readonly frontmatter?: (abstract: string, article: Article, text: (value: string) => string) => string;
21
+ }
22
+ export declare function renderLatexArticle(article: Article, context: TemplateContext, profile: LatexProfile): SourcePackage;
23
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAgC,qBAAqB;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAmB;AAI9E,MAAM,WAAW,YAAY;IAC3B,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,WAAW,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,0BAA0B,CAAC,EAAE,OAAO,CAAC;IAC9C,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAClB,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,KAC5B,MAAM,CAAC;IACZ,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,CAChB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,KAC5B,MAAM,CAAC;IACZ,QAAQ,CAAC,WAAW,CAAC,EAAE,CACrB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,KAC5B,MAAM,CAAC;CACb;AACD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,YAAY,GACpB,aAAa,CAuVf"}