@publisle/research 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.
Files changed (147) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE.md +31 -0
  3. package/README.md +14 -2
  4. package/compiler/Dockerfile +18 -0
  5. package/compiler/README.md +80 -0
  6. package/compiler/cacert.pem +2950 -0
  7. package/compiler/install-texlive.sh +38 -0
  8. package/compiler/release.json +13 -0
  9. package/dist/article.d.ts +10 -0
  10. package/dist/article.d.ts.map +1 -0
  11. package/dist/article.js +425 -0
  12. package/dist/article.js.map +1 -0
  13. package/dist/bibtex.d.ts +2 -0
  14. package/dist/bibtex.d.ts.map +1 -0
  15. package/dist/bibtex.js +2 -0
  16. package/dist/bibtex.js.map +1 -0
  17. package/dist/citeproc.d.ts +28 -0
  18. package/dist/csl.d.ts +35 -0
  19. package/dist/csl.d.ts.map +1 -0
  20. package/dist/csl.js +315 -0
  21. package/dist/csl.js.map +1 -0
  22. package/dist/index.d.ts +13 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +12 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/jats.d.ts +14 -0
  27. package/dist/jats.d.ts.map +1 -0
  28. package/dist/jats.js +197 -0
  29. package/dist/jats.js.map +1 -0
  30. package/dist/latex.d.ts +5 -0
  31. package/dist/latex.d.ts.map +1 -0
  32. package/dist/latex.js +19 -0
  33. package/dist/latex.js.map +1 -0
  34. package/dist/locales.d.ts +2 -0
  35. package/dist/locales.d.ts.map +1 -0
  36. package/dist/locales.js +67 -0
  37. package/dist/locales.js.map +1 -0
  38. package/dist/node.d.ts +66 -0
  39. package/dist/node.d.ts.map +1 -0
  40. package/dist/node.js +542 -0
  41. package/dist/node.js.map +1 -0
  42. package/dist/package.d.ts +19 -0
  43. package/dist/package.d.ts.map +1 -0
  44. package/dist/package.js +48 -0
  45. package/dist/package.js.map +1 -0
  46. package/dist/pdf.d.ts +10 -0
  47. package/dist/pdf.d.ts.map +1 -0
  48. package/dist/pdf.js +207 -0
  49. package/dist/pdf.js.map +1 -0
  50. package/dist/portable-citations.d.ts +27 -0
  51. package/dist/portable-citations.d.ts.map +1 -0
  52. package/dist/portable-citations.js +185 -0
  53. package/dist/portable-citations.js.map +1 -0
  54. package/dist/profiles.d.ts +10 -0
  55. package/dist/profiles.d.ts.map +1 -0
  56. package/dist/profiles.js +166 -0
  57. package/dist/profiles.js.map +1 -0
  58. package/dist/remote.d.ts +24 -0
  59. package/dist/remote.d.ts.map +1 -0
  60. package/dist/remote.js +139 -0
  61. package/dist/remote.js.map +1 -0
  62. package/dist/resolve.d.ts +10 -0
  63. package/dist/resolve.d.ts.map +1 -0
  64. package/dist/resolve.js +62 -0
  65. package/dist/resolve.js.map +1 -0
  66. package/package.json +53 -3
  67. package/src/article.ts +478 -0
  68. package/src/bibtex.ts +1 -0
  69. package/src/citeproc.d.ts +28 -0
  70. package/src/csl.ts +367 -0
  71. package/src/index.ts +29 -0
  72. package/src/jats.ts +242 -0
  73. package/src/latex.ts +21 -0
  74. package/src/locales.ts +126 -0
  75. package/src/node.ts +752 -0
  76. package/src/package.ts +83 -0
  77. package/src/pdf.ts +225 -0
  78. package/src/portable-citations.ts +250 -0
  79. package/src/profiles.ts +188 -0
  80. package/src/remote.ts +163 -0
  81. package/src/resolve.ts +91 -0
  82. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/BITS-embedded-index2.ent +308 -0
  83. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/BITS-question-answer2.ent +531 -0
  84. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-XHTMLtablesetup1-3.ent +629 -0
  85. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-ali-namespace1-3.ent +293 -0
  86. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-archivearticle1-3.dtd +1085 -0
  87. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-archivecustom-classes1-3.ent +409 -0
  88. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-archivecustom-mixes1-3.ent +601 -0
  89. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-archivecustom-models1-3.ent +1613 -0
  90. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-archivecustom-modules1-3.ent +404 -0
  91. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-articlemeta1-3.ent +2552 -0
  92. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-backmatter1-3.ent +540 -0
  93. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-chars1-3.ent +664 -0
  94. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-common-atts1-3.ent +360 -0
  95. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-common1-3.ent +4659 -0
  96. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-default-classes1-3.ent +1595 -0
  97. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-default-mixes1-3.ent +630 -0
  98. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-display1-3.ent +1299 -0
  99. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-format1-3.ent +997 -0
  100. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-funding1-3.ent +1100 -0
  101. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-journalmeta1-3.ent +593 -0
  102. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-link1-3.ent +604 -0
  103. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-list1-3.ent +663 -0
  104. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-math1-3.ent +563 -0
  105. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-mathmlsetup1-3.ent +491 -0
  106. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-modules1-3.ent +769 -0
  107. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-nlmcitation1-3.ent +428 -0
  108. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-notat1-3.ent +412 -0
  109. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-para1-3.ent +648 -0
  110. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-phrase1-3.ent +664 -0
  111. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-references1-3.ent +1428 -0
  112. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-related-object1-3.ent +435 -0
  113. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-section1-3.ent +463 -0
  114. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/JATS-xmlspecchars1-3.ent +528 -0
  115. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/catalog-jats-v1-3-no-base.xml +999 -0
  116. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/catalog-jats-v1-3-with-base.xml +986 -0
  117. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/iso8879/isobox.ent +61 -0
  118. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/iso8879/isocyr1.ent +88 -0
  119. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/iso8879/isocyr2.ent +47 -0
  120. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/iso8879/isodia.ent +35 -0
  121. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/iso8879/isolat1.ent +83 -0
  122. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/iso8879/isolat2.ent +142 -0
  123. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/iso8879/isonum.ent +97 -0
  124. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/iso8879/isopub.ent +105 -0
  125. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/iso9573-13/isoamsa.ent +167 -0
  126. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/iso9573-13/isoamsb.ent +143 -0
  127. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/iso9573-13/isoamsc.ent +43 -0
  128. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/iso9573-13/isoamsn.ent +114 -0
  129. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/iso9573-13/isoamso.ent +73 -0
  130. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/iso9573-13/isoamsr.ent +204 -0
  131. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/iso9573-13/isogrk3.ent +64 -0
  132. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/iso9573-13/isomfrk.ent +75 -0
  133. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/iso9573-13/isomopf.ent +49 -0
  134. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/iso9573-13/isomscr.ent +75 -0
  135. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/iso9573-13/isotech.ent +182 -0
  136. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/mathml/mmlalias.ent +564 -0
  137. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/mathml/mmlextra.ent +122 -0
  138. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/mathml2-qname-1.mod +286 -0
  139. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/mathml2.dtd +2206 -0
  140. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/xhtml-inlstyle-1.mod +34 -0
  141. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/xhtml-table-1.mod +333 -0
  142. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/xmlchars/isogrk1.ent +70 -0
  143. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/xmlchars/isogrk2.ent +41 -0
  144. package/vendor/jats/JATS-Archiving-1-3-MathML2-DTD/xmlchars/isogrk4.ent +66 -0
  145. package/vendor/jats/PROVENANCE.json +6 -0
  146. package/vendor/locales/PROVENANCE.json +5 -0
  147. package/vendor/locales/README.md +23 -0
@@ -0,0 +1,166 @@
1
+ import {} from "@publisle/schema";
2
+ import { accessibilityProfile } from "@publisle/profiles";
3
+ function contentBlocks(document, context) {
4
+ return context
5
+ ? context.traversal
6
+ .filter((visit) => visit.kind === "node" &&
7
+ [
8
+ "heading",
9
+ "paragraph",
10
+ "figure",
11
+ "table",
12
+ "list",
13
+ "quote",
14
+ "code",
15
+ "math",
16
+ "diagram",
17
+ "callout",
18
+ "embed",
19
+ "divider",
20
+ "footnote",
21
+ "raw-html",
22
+ ].includes(visit.type ?? ""))
23
+ .map((visit) => ({
24
+ id: visit.blockId,
25
+ type: `publisle:${visit.type ?? ""}`,
26
+ data: visit.value,
27
+ }))
28
+ : document.blocks;
29
+ }
30
+ function record(value) {
31
+ return value !== null && typeof value === "object" && !Array.isArray(value)
32
+ ? value
33
+ : {};
34
+ }
35
+ function plainText(value) {
36
+ if (!Array.isArray(value))
37
+ return "";
38
+ return value
39
+ .map((entry) => {
40
+ const node = record(entry);
41
+ return node["type"] === "text" && typeof node["value"] === "string"
42
+ ? node["value"]
43
+ : plainText(node["children"]);
44
+ })
45
+ .join("");
46
+ }
47
+ export function researchPaperProfile(options = {}) {
48
+ return {
49
+ name: "research-paper",
50
+ version: JSON.stringify(["2", options.abstractLabel ?? null]),
51
+ inspect(document, context) {
52
+ const diagnostics = [];
53
+ if (!document.metadata?.title?.trim())
54
+ diagnostics.push({
55
+ level: "warning",
56
+ code: "missing-title",
57
+ message: "A research paper should provide a title.",
58
+ });
59
+ if (!document.metadata?.authors?.length)
60
+ diagnostics.push({
61
+ level: "warning",
62
+ code: "missing-authors",
63
+ message: "A research paper should provide at least one author.",
64
+ });
65
+ for (const author of document.metadata?.authors ?? []) {
66
+ if (!author.affiliation?.trim())
67
+ diagnostics.push({
68
+ level: "warning",
69
+ code: "missing-affiliation",
70
+ message: `Author ${author.name} should provide an affiliation.`,
71
+ });
72
+ }
73
+ let hasAbstract = false;
74
+ const blocks = contentBlocks(document, context);
75
+ for (const [index, block] of blocks.entries()) {
76
+ const data = record(block.data);
77
+ if (block.type === "publisle:heading") {
78
+ const abstractHeading = data["role"] === "abstract" ||
79
+ (options.abstractLabel === undefined
80
+ ? data["label"] === "abstract" ||
81
+ plainText(data["content"]).trim().toLowerCase() === "abstract"
82
+ : data["label"] === options.abstractLabel ||
83
+ data["role"] === "abstract");
84
+ const next = blocks[index + 1];
85
+ if (abstractHeading &&
86
+ next?.type === "publisle:paragraph" &&
87
+ plainText(record(next.data)["content"]).trim())
88
+ hasAbstract = true;
89
+ }
90
+ }
91
+ diagnostics.push(...accessibilityProfile().inspect(document, context));
92
+ if (!hasAbstract)
93
+ diagnostics.push({
94
+ level: "warning",
95
+ code: "missing-abstract",
96
+ message: "A research paper should provide an abstract heading followed by a nonempty paragraph.",
97
+ });
98
+ return diagnostics;
99
+ },
100
+ };
101
+ }
102
+ function walkCitations(value, found) {
103
+ if (Array.isArray(value)) {
104
+ for (const entry of value)
105
+ walkCitations(entry, found);
106
+ return;
107
+ }
108
+ if (value === null || typeof value !== "object")
109
+ return;
110
+ const node = value;
111
+ if (node["type"] === "citationReference" && Array.isArray(node["items"])) {
112
+ for (const item of node["items"]) {
113
+ const id = record(item)["id"];
114
+ if (typeof id === "string")
115
+ found.push({ id });
116
+ }
117
+ }
118
+ for (const entry of Object.values(node))
119
+ walkCitations(entry, found);
120
+ }
121
+ /** Optional citation targets and section roles. Metadata stays informational. */
122
+ export function scholarlyProfile() {
123
+ return {
124
+ name: "scholarly",
125
+ version: "1",
126
+ inspect(document) {
127
+ const diagnostics = [];
128
+ const entries = new Set();
129
+ for (const block of document.blocks) {
130
+ if (block.type !== "publisle:bibliography")
131
+ continue;
132
+ const listed = record(block.data)["entries"];
133
+ if (!Array.isArray(listed))
134
+ continue;
135
+ for (const entry of listed) {
136
+ const id = record(entry)["id"];
137
+ if (typeof id !== "string")
138
+ continue;
139
+ if (entries.has(id))
140
+ diagnostics.push({
141
+ level: "warning",
142
+ code: "duplicate-bibliography-entry",
143
+ message: `Bibliography id ${id} is repeated.`,
144
+ blockId: block.id,
145
+ });
146
+ entries.add(id);
147
+ }
148
+ }
149
+ for (const block of document.blocks) {
150
+ const citations = [];
151
+ walkCitations(block.data, citations);
152
+ for (const citation of citations) {
153
+ if (!entries.has(citation.id))
154
+ diagnostics.push({
155
+ level: "warning",
156
+ code: "unresolved-citation",
157
+ message: `Citation ${citation.id} has no bibliography entry. The reference stays in the source.`,
158
+ blockId: block.id,
159
+ });
160
+ }
161
+ }
162
+ return diagnostics;
163
+ },
164
+ };
165
+ }
166
+ //# sourceMappingURL=profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../src/profiles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { CitationEntry } from "./article.js";
2
+ export interface BibliographyFetchOptions {
3
+ readonly cacheDirectory: string;
4
+ readonly refresh?: boolean;
5
+ readonly fetch?: typeof globalThis.fetch;
6
+ }
7
+ export interface BibliographyImport {
8
+ readonly entries: readonly CitationEntry[];
9
+ readonly items: readonly Readonly<Record<string, unknown>>[];
10
+ readonly provenance: {
11
+ readonly url: string;
12
+ readonly fetchedAt: string;
13
+ readonly sha256: string;
14
+ };
15
+ }
16
+ /** Preserve complete CSL records for citeproc, alongside the portable bibliography projection. */
17
+ export declare function importCslJson(source: string): {
18
+ entries: CitationEntry[];
19
+ items: Record<string, unknown>[];
20
+ };
21
+ /** Opt-in metadata acquisition. Exporters never call this API. Cached results work offline. */
22
+ export declare function fetchBibliography(url: string, options: BibliographyFetchOptions): Promise<BibliographyImport>;
23
+ export declare function lookupDoi(doi: string, options: BibliographyFetchOptions): Promise<BibliographyImport>;
24
+ //# sourceMappingURL=remote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB;AAElD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CAC1C;AACD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;IAC7D,QAAQ,CAAC,UAAU,EAAE;QACnB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AACD,kGAAkG;AAClG,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG;IAC7C,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CAClC,CA8CA;AACD,+FAA+F;AAC/F,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAsE7B;AACD,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAa7B"}
package/dist/remote.js ADDED
@@ -0,0 +1,139 @@
1
+ import { createHash } from "node:crypto";
2
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { parseBibtex } from "./bibtex.js";
5
+ /** Preserve complete CSL records for citeproc, alongside the portable bibliography projection. */
6
+ export function importCslJson(source) {
7
+ const parsed = JSON.parse(source);
8
+ const listed = Array.isArray(parsed) ? parsed : [parsed];
9
+ const items = listed.map((item) => {
10
+ if (!item || typeof item !== "object" || Array.isArray(item))
11
+ throw new Error("CSL bibliography items must be objects.");
12
+ return item;
13
+ });
14
+ const entries = items.map((item) => {
15
+ const id = item["id"] ?? item["DOI"];
16
+ if (typeof id !== "string" && typeof id !== "number")
17
+ throw new Error("CSL item requires an id or DOI.");
18
+ item["id"] = String(id);
19
+ const authors = Array.isArray(item["author"])
20
+ ? item["author"].map((name) => {
21
+ const person = name;
22
+ return typeof person["literal"] === "string"
23
+ ? person["literal"]
24
+ : [person["family"], person["given"]]
25
+ .filter((value) => typeof value === "string")
26
+ .join(", ");
27
+ })
28
+ : [];
29
+ const fields = {};
30
+ for (const [target, key] of Object.entries({
31
+ type: "type",
32
+ title: "title",
33
+ containerTitle: "container-title",
34
+ volume: "volume",
35
+ issue: "issue",
36
+ page: "page",
37
+ publisher: "publisher",
38
+ doi: "DOI",
39
+ url: "URL",
40
+ }))
41
+ if (typeof item[key] === "string")
42
+ fields[target] = item[key];
43
+ const issued = item["issued"];
44
+ const year = issued?.["date-parts"]?.[0]?.[0];
45
+ return {
46
+ id: String(id),
47
+ authors,
48
+ ...fields,
49
+ ...(year === undefined ? {} : { issued: String(year) }),
50
+ };
51
+ });
52
+ return { entries, items };
53
+ }
54
+ /** Opt-in metadata acquisition. Exporters never call this API. Cached results work offline. */
55
+ export async function fetchBibliography(url, options) {
56
+ if (new URL(url).protocol !== "https:")
57
+ throw new Error("Remote bibliographies require HTTPS.");
58
+ const key = createHash("sha256").update(url).digest("hex");
59
+ const path = join(options.cacheDirectory, `${key}.json`);
60
+ if (!options.refresh) {
61
+ try {
62
+ return JSON.parse(await readFile(path, "utf8"));
63
+ }
64
+ catch (error) {
65
+ if (!(typeof error === "object" &&
66
+ error !== null &&
67
+ "code" in error &&
68
+ error.code === "ENOENT"))
69
+ throw error;
70
+ }
71
+ }
72
+ const request = options.fetch ?? globalThis.fetch;
73
+ let destination = url;
74
+ let response;
75
+ for (let hop = 0; hop < 6; hop++) {
76
+ response = await request(destination, {
77
+ redirect: "manual",
78
+ headers: {
79
+ Accept: "application/vnd.citationstyles.csl+json, application/x-bibtex;q=0.9",
80
+ },
81
+ signal: AbortSignal.timeout(15_000),
82
+ });
83
+ if (response.status < 300 || response.status >= 400)
84
+ break;
85
+ const location = response.headers.get("location");
86
+ if (!location)
87
+ throw new Error("Bibliography redirect lacks a destination.");
88
+ destination = new URL(location, destination).href;
89
+ if (new URL(destination).protocol !== "https:")
90
+ throw new Error("Bibliography redirect requires HTTPS.");
91
+ }
92
+ if (!response?.ok)
93
+ throw new Error(`Bibliography fetch failed: ${String(response?.status)}`);
94
+ const reader = response.body?.getReader();
95
+ if (!reader)
96
+ throw new Error("Bibliography response has no body.");
97
+ const chunks = [];
98
+ let size = 0;
99
+ for (;;) {
100
+ const { done, value } = await reader.read();
101
+ if (done)
102
+ break;
103
+ size += value.length;
104
+ if (size > 2 * 1024 * 1024) {
105
+ await reader.cancel();
106
+ throw new Error("Bibliography exceeds 2 MiB.");
107
+ }
108
+ chunks.push(value);
109
+ }
110
+ const bytes = Buffer.concat(chunks);
111
+ const source = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
112
+ const data = source.trimStart().startsWith("@")
113
+ ? { entries: parseBibtex(source), items: [] }
114
+ : importCslJson(source);
115
+ const result = {
116
+ ...data,
117
+ provenance: {
118
+ url,
119
+ fetchedAt: new Date().toISOString(),
120
+ sha256: createHash("sha256").update(bytes).digest("hex"),
121
+ },
122
+ };
123
+ await mkdir(options.cacheDirectory, { recursive: true });
124
+ await writeFile(path, JSON.stringify(result) + "\n");
125
+ return result;
126
+ }
127
+ export async function lookupDoi(doi, options) {
128
+ const normalized = doi
129
+ .replace(/^https:\/\/doi\.org\//iu, "")
130
+ .replace(/^doi:\s*/iu, "")
131
+ .trim();
132
+ if (!/^10\.\d{4,9}\/\S+$/u.test(normalized))
133
+ throw new Error("Invalid DOI.");
134
+ return fetchBibliography(`https://doi.org/${normalized
135
+ .split("/")
136
+ .map((part) => encodeURIComponent(part))
137
+ .join("/")}`, options);
138
+ }
139
+ //# sourceMappingURL=remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Block, BlockType, Document } from "@publisle/schema";
2
+ import { type Article, type ResearchLoss } from "./article.js";
3
+ import { type CitationForm, type FormattedResearch, type CslOptions } from "./csl.js";
4
+ export interface ResolvedDocument extends FormattedResearch {
5
+ readonly article: Article;
6
+ readonly losses: readonly ResearchLoss[];
7
+ }
8
+ export declare function resolveDocument(document: Document<Block<BlockType, unknown>>, style?: string, options?: CslOptions): ResolvedDocument;
9
+ export type { CitationForm };
10
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAIL,KAAK,OAAO,EACZ,KAAK,YAAY,EAClB,qBAAqB;AACtB,OAAO,EAKL,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EAChB,iBAAiB;AAElB,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;CAC1C;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,EAC7C,KAAK,SAAY,EACjB,OAAO,GAAE,UAAe,GACvB,gBAAgB,CAsBlB;AAED,YAAY,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { citationClusters, projectArticle, } from "./article.js";
2
+ import { builtinCsl, formatCitations, citationForm, parseCslStyle, } from "./csl.js";
3
+ export function resolveDocument(document, style = "numeric", options = {}) {
4
+ const article = projectArticle(document);
5
+ const parsed = style === "numeric" || style === "author-date"
6
+ ? builtinCsl(style)
7
+ : parseCslStyle(style);
8
+ const formatted = formatCitations(article.entries, citationClusters(article), parsed, {
9
+ ...options,
10
+ ...(options.noteIndices === undefined && citationForm(parsed) === "note"
11
+ ? { noteIndices: citationNoteIndices(article) }
12
+ : {}),
13
+ });
14
+ return {
15
+ ...formatted,
16
+ article,
17
+ losses: [...article.losses, ...formatted.losses],
18
+ };
19
+ }
20
+ function citationNoteIndices(article) {
21
+ const result = [];
22
+ let number = 0;
23
+ const notes = new Map(article.blocks
24
+ .filter((block) => block.kind === "footnote")
25
+ .map((block) => [block.id, block.paragraphs]));
26
+ const visited = new Set();
27
+ const visit = (inlines, note) => {
28
+ for (const inline of inlines) {
29
+ if (inline.type === "citation")
30
+ result.push(note ?? ++number);
31
+ else if (inline.type === "text" &&
32
+ inline.reference?.kind === "footnote" &&
33
+ !visited.has(inline.reference.target)) {
34
+ visited.add(inline.reference.target);
35
+ const next = ++number;
36
+ for (const paragraph of notes.get(inline.reference.target) ?? [])
37
+ visit(paragraph, next);
38
+ }
39
+ }
40
+ };
41
+ for (const block of article.blocks) {
42
+ if (block.kind === "heading" || block.kind === "paragraph")
43
+ visit(block.inlines);
44
+ else if (block.kind === "quote")
45
+ for (const paragraph of block.paragraphs)
46
+ visit(paragraph);
47
+ else if (block.kind === "list")
48
+ for (const item of block.items)
49
+ visit(item);
50
+ else if (block.kind === "figure")
51
+ visit(block.caption);
52
+ else if (block.kind === "table") {
53
+ if (block.caption)
54
+ visit(block.caption);
55
+ for (const row of block.rows)
56
+ for (const cell of row)
57
+ visit(cell);
58
+ }
59
+ }
60
+ return result;
61
+ }
62
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,56 @@
1
1
  {
2
2
  "name": "@publisle/research",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "description": "Citation resolution and BibTeX, CSL, LaTeX, JATS, and PDF export. Tooling only; readers must not import it.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "sideEffects": false,
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ },
14
+ "./node": {
15
+ "types": "./dist/node.d.ts",
16
+ "import": "./dist/node.js",
17
+ "default": "./dist/node.js"
18
+ },
19
+ "./legacy-pdf": {
20
+ "types": "./dist/pdf.d.ts",
21
+ "import": "./dist/pdf.js",
22
+ "default": "./dist/pdf.js"
23
+ }
24
+ },
25
+ "dependencies": {
26
+ "citeproc": "2.4.63",
27
+ "fflate": "0.8.3",
28
+ "@publisle/contracts": "0.1.0",
29
+ "@publisle/profiles": "0.1.0",
30
+ "@publisle/schema": "0.1.0",
31
+ "@publisle/template-sdk": "0.1.0",
32
+ "@publisle/template-article": "0.1.0"
33
+ },
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "files": [
38
+ "dist",
39
+ "src",
40
+ "README.md",
41
+ "NOTICE.md",
42
+ "LICENSE",
43
+ "compiler",
44
+ "vendor"
45
+ ],
46
+ "engines": {
47
+ "node": ">=24"
48
+ },
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "git+https://github.com/VoidReg/publisle.git",
52
+ "directory": "packages/research"
53
+ },
54
+ "homepage": "https://github.com/VoidReg/publisle#readme",
55
+ "types": "./dist/index.d.ts"
6
56
  }