@sciencestack-ai/tokens 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 (210) hide show
  1. package/README.md +102 -0
  2. package/dist/base/AbstractTokenNode.d.ts +100 -0
  3. package/dist/base/AbstractTokenNode.d.ts.map +1 -0
  4. package/dist/base/AbstractTokenNode.js +253 -0
  5. package/dist/base/AbstractTokenNode.js.map +1 -0
  6. package/dist/base/BaseTableFigureTokenNode.d.ts +26 -0
  7. package/dist/base/BaseTableFigureTokenNode.d.ts.map +1 -0
  8. package/dist/base/BaseTableFigureTokenNode.js +113 -0
  9. package/dist/base/BaseTableFigureTokenNode.js.map +1 -0
  10. package/dist/base/BaseTokenNode.d.ts +25 -0
  11. package/dist/base/BaseTokenNode.d.ts.map +1 -0
  12. package/dist/base/BaseTokenNode.js +137 -0
  13. package/dist/base/BaseTokenNode.js.map +1 -0
  14. package/dist/base/ITokenNodeFactory.d.ts +6 -0
  15. package/dist/base/ITokenNodeFactory.d.ts.map +1 -0
  16. package/dist/base/ITokenNodeFactory.js +2 -0
  17. package/dist/base/ITokenNodeFactory.js.map +1 -0
  18. package/dist/base/NodeRoles.d.ts +6 -0
  19. package/dist/base/NodeRoles.d.ts.map +1 -0
  20. package/dist/base/NodeRoles.js +7 -0
  21. package/dist/base/NodeRoles.js.map +1 -0
  22. package/dist/base/TokenNodeFactory.d.ts +9 -0
  23. package/dist/base/TokenNodeFactory.d.ts.map +1 -0
  24. package/dist/base/TokenNodeFactory.js +94 -0
  25. package/dist/base/TokenNodeFactory.js.map +1 -0
  26. package/dist/content/CaptionTokenNode.d.ts +23 -0
  27. package/dist/content/CaptionTokenNode.d.ts.map +1 -0
  28. package/dist/content/CaptionTokenNode.js +79 -0
  29. package/dist/content/CaptionTokenNode.js.map +1 -0
  30. package/dist/content/QuoteTokenNode.d.ts +12 -0
  31. package/dist/content/QuoteTokenNode.d.ts.map +1 -0
  32. package/dist/content/QuoteTokenNode.js +27 -0
  33. package/dist/content/QuoteTokenNode.js.map +1 -0
  34. package/dist/content/TextTokenNode.d.ts +26 -0
  35. package/dist/content/TextTokenNode.d.ts.map +1 -0
  36. package/dist/content/TextTokenNode.js +70 -0
  37. package/dist/content/TextTokenNode.js.map +1 -0
  38. package/dist/document/AbstractSectionTokenNode.d.ts +12 -0
  39. package/dist/document/AbstractSectionTokenNode.d.ts.map +1 -0
  40. package/dist/document/AbstractSectionTokenNode.js +22 -0
  41. package/dist/document/AbstractSectionTokenNode.js.map +1 -0
  42. package/dist/document/AppendixTokenNode.d.ts +12 -0
  43. package/dist/document/AppendixTokenNode.d.ts.map +1 -0
  44. package/dist/document/AppendixTokenNode.js +24 -0
  45. package/dist/document/AppendixTokenNode.js.map +1 -0
  46. package/dist/document/BaseEnvTokenNode.d.ts +20 -0
  47. package/dist/document/BaseEnvTokenNode.d.ts.map +1 -0
  48. package/dist/document/BaseEnvTokenNode.js +76 -0
  49. package/dist/document/BaseEnvTokenNode.js.map +1 -0
  50. package/dist/document/DocumentTokenNode.d.ts +11 -0
  51. package/dist/document/DocumentTokenNode.d.ts.map +1 -0
  52. package/dist/document/DocumentTokenNode.js +17 -0
  53. package/dist/document/DocumentTokenNode.js.map +1 -0
  54. package/dist/document/EnvironmentTokenNode.d.ts +12 -0
  55. package/dist/document/EnvironmentTokenNode.d.ts.map +1 -0
  56. package/dist/document/EnvironmentTokenNode.js +22 -0
  57. package/dist/document/EnvironmentTokenNode.js.map +1 -0
  58. package/dist/document/GroupTokenNode.d.ts +9 -0
  59. package/dist/document/GroupTokenNode.d.ts.map +1 -0
  60. package/dist/document/GroupTokenNode.js +16 -0
  61. package/dist/document/GroupTokenNode.js.map +1 -0
  62. package/dist/document/MathEnvTokenNode.d.ts +21 -0
  63. package/dist/document/MathEnvTokenNode.d.ts.map +1 -0
  64. package/dist/document/MathEnvTokenNode.js +91 -0
  65. package/dist/document/MathEnvTokenNode.js.map +1 -0
  66. package/dist/document/SectionTokenNode.d.ts +17 -0
  67. package/dist/document/SectionTokenNode.d.ts.map +1 -0
  68. package/dist/document/SectionTokenNode.js +66 -0
  69. package/dist/document/SectionTokenNode.js.map +1 -0
  70. package/dist/document/TitleTokenNode.d.ts +11 -0
  71. package/dist/document/TitleTokenNode.d.ts.map +1 -0
  72. package/dist/document/TitleTokenNode.js +19 -0
  73. package/dist/document/TitleTokenNode.js.map +1 -0
  74. package/dist/export_types.d.ts +46 -0
  75. package/dist/export_types.d.ts.map +1 -0
  76. package/dist/export_types.js +27 -0
  77. package/dist/export_types.js.map +1 -0
  78. package/dist/figures/DiagramTokenNode.d.ts +22 -0
  79. package/dist/figures/DiagramTokenNode.d.ts.map +1 -0
  80. package/dist/figures/DiagramTokenNode.js +62 -0
  81. package/dist/figures/DiagramTokenNode.js.map +1 -0
  82. package/dist/figures/FigureTokenNode.d.ts +11 -0
  83. package/dist/figures/FigureTokenNode.d.ts.map +1 -0
  84. package/dist/figures/FigureTokenNode.js +18 -0
  85. package/dist/figures/FigureTokenNode.js.map +1 -0
  86. package/dist/figures/IncludeGraphicsTokenNode.d.ts +20 -0
  87. package/dist/figures/IncludeGraphicsTokenNode.d.ts.map +1 -0
  88. package/dist/figures/IncludeGraphicsTokenNode.js +44 -0
  89. package/dist/figures/IncludeGraphicsTokenNode.js.map +1 -0
  90. package/dist/figures/IncludePdfTokenNode.d.ts +18 -0
  91. package/dist/figures/IncludePdfTokenNode.d.ts.map +1 -0
  92. package/dist/figures/IncludePdfTokenNode.js +38 -0
  93. package/dist/figures/IncludePdfTokenNode.js.map +1 -0
  94. package/dist/figures/SubFigureTokenNode.d.ts +11 -0
  95. package/dist/figures/SubFigureTokenNode.d.ts.map +1 -0
  96. package/dist/figures/SubFigureTokenNode.js +18 -0
  97. package/dist/figures/SubFigureTokenNode.js.map +1 -0
  98. package/dist/graph/graphTypes.d.ts +42 -0
  99. package/dist/graph/graphTypes.d.ts.map +1 -0
  100. package/dist/graph/graphTypes.js +75 -0
  101. package/dist/graph/graphTypes.js.map +1 -0
  102. package/dist/graph/index.d.ts +4 -0
  103. package/dist/graph/index.d.ts.map +1 -0
  104. package/dist/graph/index.js +3 -0
  105. package/dist/graph/index.js.map +1 -0
  106. package/dist/graph/mathColors.d.ts +11 -0
  107. package/dist/graph/mathColors.d.ts.map +1 -0
  108. package/dist/graph/mathColors.js +20 -0
  109. package/dist/graph/mathColors.js.map +1 -0
  110. package/dist/graph/mathDepGraph.d.ts +4 -0
  111. package/dist/graph/mathDepGraph.d.ts.map +1 -0
  112. package/dist/graph/mathDepGraph.js +320 -0
  113. package/dist/graph/mathDepGraph.js.map +1 -0
  114. package/dist/index.d.ts +42 -0
  115. package/dist/index.d.ts.map +1 -0
  116. package/dist/index.js +54 -0
  117. package/dist/index.js.map +1 -0
  118. package/dist/lists/ListItemTokenNode.d.ts +15 -0
  119. package/dist/lists/ListItemTokenNode.d.ts.map +1 -0
  120. package/dist/lists/ListItemTokenNode.js +91 -0
  121. package/dist/lists/ListItemTokenNode.js.map +1 -0
  122. package/dist/lists/ListTokenNode.d.ts +19 -0
  123. package/dist/lists/ListTokenNode.d.ts.map +1 -0
  124. package/dist/lists/ListTokenNode.js +52 -0
  125. package/dist/lists/ListTokenNode.js.map +1 -0
  126. package/dist/metadata/AuthorTokenNode.d.ts +12 -0
  127. package/dist/metadata/AuthorTokenNode.d.ts.map +1 -0
  128. package/dist/metadata/AuthorTokenNode.js +39 -0
  129. package/dist/metadata/AuthorTokenNode.js.map +1 -0
  130. package/dist/metadata/MetadataTokenNode.d.ts +16 -0
  131. package/dist/metadata/MetadataTokenNode.d.ts.map +1 -0
  132. package/dist/metadata/MetadataTokenNode.js +35 -0
  133. package/dist/metadata/MetadataTokenNode.js.map +1 -0
  134. package/dist/references/BibitemTokenNode.d.ts +34 -0
  135. package/dist/references/BibitemTokenNode.d.ts.map +1 -0
  136. package/dist/references/BibitemTokenNode.js +149 -0
  137. package/dist/references/BibitemTokenNode.js.map +1 -0
  138. package/dist/references/CitationTokenNode.d.ts +19 -0
  139. package/dist/references/CitationTokenNode.d.ts.map +1 -0
  140. package/dist/references/CitationTokenNode.js +56 -0
  141. package/dist/references/CitationTokenNode.js.map +1 -0
  142. package/dist/references/FootnoteTokenNode.d.ts +13 -0
  143. package/dist/references/FootnoteTokenNode.d.ts.map +1 -0
  144. package/dist/references/FootnoteTokenNode.js +24 -0
  145. package/dist/references/FootnoteTokenNode.js.map +1 -0
  146. package/dist/references/ReferenceTokenNode.d.ts +19 -0
  147. package/dist/references/ReferenceTokenNode.d.ts.map +1 -0
  148. package/dist/references/ReferenceTokenNode.js +87 -0
  149. package/dist/references/ReferenceTokenNode.js.map +1 -0
  150. package/dist/references/UrlTokenNode.d.ts +17 -0
  151. package/dist/references/UrlTokenNode.d.ts.map +1 -0
  152. package/dist/references/UrlTokenNode.js +33 -0
  153. package/dist/references/UrlTokenNode.js.map +1 -0
  154. package/dist/styles.d.ts +9 -0
  155. package/dist/styles.d.ts.map +1 -0
  156. package/dist/styles.js +122 -0
  157. package/dist/styles.js.map +1 -0
  158. package/dist/tables/SubTableTokenNode.d.ts +11 -0
  159. package/dist/tables/SubTableTokenNode.d.ts.map +1 -0
  160. package/dist/tables/SubTableTokenNode.js +18 -0
  161. package/dist/tables/SubTableTokenNode.js.map +1 -0
  162. package/dist/tables/TableTokenNode.d.ts +11 -0
  163. package/dist/tables/TableTokenNode.d.ts.map +1 -0
  164. package/dist/tables/TableTokenNode.js +18 -0
  165. package/dist/tables/TableTokenNode.js.map +1 -0
  166. package/dist/tables/TabularTokenNode.d.ts +63 -0
  167. package/dist/tables/TabularTokenNode.d.ts.map +1 -0
  168. package/dist/tables/TabularTokenNode.js +318 -0
  169. package/dist/tables/TabularTokenNode.js.map +1 -0
  170. package/dist/technical/AlgorithmTokenNode.d.ts +22 -0
  171. package/dist/technical/AlgorithmTokenNode.d.ts.map +1 -0
  172. package/dist/technical/AlgorithmTokenNode.js +54 -0
  173. package/dist/technical/AlgorithmTokenNode.js.map +1 -0
  174. package/dist/technical/CodeTokenNode.d.ts +16 -0
  175. package/dist/technical/CodeTokenNode.d.ts.map +1 -0
  176. package/dist/technical/CodeTokenNode.js +43 -0
  177. package/dist/technical/CodeTokenNode.js.map +1 -0
  178. package/dist/technical/CommandTokenNode.d.ts +14 -0
  179. package/dist/technical/CommandTokenNode.d.ts.map +1 -0
  180. package/dist/technical/CommandTokenNode.js +26 -0
  181. package/dist/technical/CommandTokenNode.js.map +1 -0
  182. package/dist/technical/EquationArrayTokenNode.d.ts +40 -0
  183. package/dist/technical/EquationArrayTokenNode.d.ts.map +1 -0
  184. package/dist/technical/EquationArrayTokenNode.js +220 -0
  185. package/dist/technical/EquationArrayTokenNode.js.map +1 -0
  186. package/dist/technical/EquationTokenNode.d.ts +19 -0
  187. package/dist/technical/EquationTokenNode.d.ts.map +1 -0
  188. package/dist/technical/EquationTokenNode.js +96 -0
  189. package/dist/technical/EquationTokenNode.js.map +1 -0
  190. package/dist/tokenProcessing.d.ts +4 -0
  191. package/dist/tokenProcessing.d.ts.map +1 -0
  192. package/dist/tokenProcessing.js +19 -0
  193. package/dist/tokenProcessing.js.map +1 -0
  194. package/dist/types.d.ts +287 -0
  195. package/dist/types.d.ts.map +1 -0
  196. package/dist/types.js +90 -0
  197. package/dist/types.js.map +1 -0
  198. package/dist/utils/arxiv.d.ts +57 -0
  199. package/dist/utils/arxiv.d.ts.map +1 -0
  200. package/dist/utils/arxiv.js +142 -0
  201. package/dist/utils/arxiv.js.map +1 -0
  202. package/dist/utils/citationConverters.d.ts +33 -0
  203. package/dist/utils/citationConverters.d.ts.map +1 -0
  204. package/dist/utils/citationConverters.js +151 -0
  205. package/dist/utils/citationConverters.js.map +1 -0
  206. package/dist/utils.d.ts +14 -0
  207. package/dist/utils.d.ts.map +1 -0
  208. package/dist/utils.js +117 -0
  209. package/dist/utils.js.map +1 -0
  210. package/package.json +44 -0
package/README.md ADDED
@@ -0,0 +1,102 @@
1
+ # @sciencestack/tokens
2
+
3
+ TypeScript types and node implementations for ScienceStack AST tokens.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @sciencestack/tokens
9
+ # or
10
+ pnpm add @sciencestack/tokens
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ```typescript
16
+ import {
17
+ TokenType,
18
+ DocumentToken,
19
+ TextToken,
20
+ EquationToken,
21
+ SectionToken,
22
+ // ... and many more
23
+ } from '@sciencestack/tokens';
24
+
25
+ // Use types for type safety
26
+ const textToken: TextToken = {
27
+ type: TokenType.TEXT,
28
+ content: 'Hello, world!',
29
+ id: 'text-1'
30
+ };
31
+ ```
32
+
33
+ ## What's Included
34
+
35
+ ### Core Types
36
+ - `TokenType` - Enum of all token types
37
+ - Token interfaces for all AST nodes (Document, Section, Text, Equation, etc.)
38
+ - Display types, list types, and other enums
39
+
40
+ ### Token Node Classes
41
+ - `DocumentTokenNode`, `TextTokenNode`, `EquationTokenNode`, etc.
42
+ - Full implementations for all token types
43
+
44
+ ### Utilities
45
+ - Style mappings (`STYLE_TO_TAILWIND`)
46
+ - Token manipulation utilities
47
+ - Type guards and helpers
48
+
49
+ ## Token Types
50
+
51
+ The package includes types for:
52
+
53
+ - **Document Structure**: Document, Title, Section, Abstract, Appendix
54
+ - **Text Content**: Text, Quote, Group
55
+ - **Math & Technical**: Equation, EquationArray, Code, Algorithm
56
+ - **Figures & Tables**: Figure, SubFigure, Table, Tabular, Caption
57
+ - **References**: Citation, Reference, Footnote, URL, Bibliography
58
+ - **Lists**: List, ListItem (enumerate, itemize, description)
59
+ - **Environments**: Environment, MathEnv
60
+ - **Graphics**: IncludeGraphics, IncludePDF, Diagram
61
+ - **Metadata**: Author, Affiliation, Keywords
62
+
63
+ ## For SDK Developers
64
+
65
+ This package is the foundation for the ScienceStack SDK. Use these types to:
66
+ - Build type-safe operations
67
+ - Validate AST structures
68
+ - Create custom token processors
69
+ - Integrate with ScienceStack services
70
+
71
+ ## Development
72
+
73
+ ### Testing
74
+
75
+ The package includes comprehensive test coverage (87 tests):
76
+
77
+ ```bash
78
+ # Run tests
79
+ pnpm test
80
+
81
+ # Run tests in watch mode
82
+ pnpm test:watch
83
+
84
+ # Generate coverage report
85
+ pnpm test:coverage
86
+ ```
87
+
88
+ See [TESTING.md](./TESTING.md) for detailed testing documentation.
89
+
90
+ ### Building
91
+
92
+ ```bash
93
+ # Build TypeScript
94
+ pnpm build
95
+
96
+ # Watch mode
97
+ pnpm dev
98
+ ```
99
+
100
+ ## License
101
+
102
+ MIT
@@ -0,0 +1,100 @@
1
+ import { IToken, TokenType } from '../types';
2
+ import { CopyContentOptions, LatexExportOptions, MarkdownExportOptions, JSONExportOptions } from '../export_types';
3
+ import { NodeRoles } from './NodeRoles';
4
+ export declare abstract class AbstractTokenNode {
5
+ private _id;
6
+ protected _parent: AbstractTokenNode | null;
7
+ protected _children: AbstractTokenNode[];
8
+ protected _token: IToken;
9
+ role: NodeRoles;
10
+ constructor(token: IToken, id?: string, role?: NodeRoles);
11
+ get isInline(): boolean;
12
+ get id(): string;
13
+ get token(): IToken;
14
+ get type(): TokenType;
15
+ get parent(): AbstractTokenNode | null;
16
+ get children(): AbstractTokenNode[];
17
+ get styles(): string[] | undefined;
18
+ get labels(): string[];
19
+ set parent(node: AbstractTokenNode | null);
20
+ addChild(child: AbstractTokenNode): void;
21
+ removeChild(child: AbstractTokenNode): void;
22
+ clearChildren(): void;
23
+ getRoot(): AbstractTokenNode;
24
+ getDepth(): number;
25
+ /**
26
+ * Finds the first parent node that matches the given predicate
27
+ * @param predicate A function that takes a TokenNode and returns a boolean
28
+ * @returns The first matching parent node or null if none found
29
+ */
30
+ findParentMatching(predicate: (node: AbstractTokenNode) => boolean): AbstractTokenNode | null;
31
+ hasChildren(): boolean;
32
+ getChildren(): AbstractTokenNode[];
33
+ abstract getData(nodeType?: NodeRoles): any;
34
+ isRoot(): boolean;
35
+ isLeaf(): boolean;
36
+ getFirstChild(): AbstractTokenNode | null;
37
+ getLastChild(): AbstractTokenNode | null;
38
+ /**
39
+ * Gets the first leaf node in this subtree (the leftmost node with no children)
40
+ * @returns The first leaf node or this node if it's a leaf
41
+ */
42
+ getFirstLeaf(): AbstractTokenNode;
43
+ /**
44
+ * Gets the last leaf node in this subtree (the rightmost node with no children)
45
+ * @returns The last leaf node or this node if it's a leaf
46
+ */
47
+ getLastLeaf(): AbstractTokenNode;
48
+ static GetCopyContent(nodes: AbstractTokenNode[], options?: CopyContentOptions): string;
49
+ static GetLatexContent(nodes: AbstractTokenNode[], options?: LatexExportOptions): string;
50
+ static GetMarkdownContent(nodes: AbstractTokenNode[], options?: MarkdownExportOptions): string;
51
+ static GetJSONContent(nodes: AbstractTokenNode[], options?: JSONExportOptions): any[];
52
+ /**
53
+ * Returns raw text content, optionally with character offsets for partial extraction.
54
+ * Used primarily for text selection and annotation systems.
55
+ */
56
+ abstract getCopyContent(options?: CopyContentOptions): string;
57
+ /**
58
+ * Returns LaTeX-formatted content with proper escaping and styling.
59
+ * Always returns full content (no partial extraction).
60
+ * Used for LaTeX export and copy operations.
61
+ */
62
+ abstract getLatexContent(options?: LatexExportOptions): string;
63
+ abstract getMarkdownContent(options?: MarkdownExportOptions): string;
64
+ /**
65
+ * Returns JSON-formatted content (token structure) for export.
66
+ * Always returns full content (no partial extraction).
67
+ * Used for JSON export operations.
68
+ */
69
+ getJSONContent(options?: JSONExportOptions): {
70
+ type: TokenType;
71
+ id?: string;
72
+ styles?: string[];
73
+ labels?: string[];
74
+ };
75
+ getTooltipContent(): string | null;
76
+ findById(id: string): AbstractTokenNode | null;
77
+ /**
78
+ * Finds the first node with the specified label
79
+ * @param label The label to search for
80
+ * @returns The first matching node or null if none found
81
+ */
82
+ findByLabel(label: string): AbstractTokenNode | null;
83
+ /**
84
+ * Gets the next sibling node if it exists
85
+ * @returns The next sibling node or null if none exists
86
+ */
87
+ getNextSibling(): AbstractTokenNode | null;
88
+ /**
89
+ * Gets the previous sibling node if it exists
90
+ * @returns The previous sibling node or null if none exists
91
+ */
92
+ getPreviousSibling(): AbstractTokenNode | null;
93
+ toPlainObject(): object;
94
+ getAnchorId(): string | null;
95
+ /**
96
+ * For \ref displays of the tokennode (if label exists)
97
+ */
98
+ getReferenceText(): string | null;
99
+ }
100
+ //# sourceMappingURL=AbstractTokenNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbstractTokenNode.d.ts","sourceRoot":"","sources":["../../src/base/AbstractTokenNode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,253 @@
1
+ import { IsInlineToken } from '../styles';
2
+ import { NodeRoles } from './NodeRoles';
3
+ import { nanoid } from 'nanoid';
4
+ export class AbstractTokenNode {
5
+ _id;
6
+ _parent = null;
7
+ _children = [];
8
+ _token;
9
+ role = NodeRoles.CONTENT;
10
+ constructor(token, id, role = NodeRoles.CONTENT) {
11
+ this._token = token;
12
+ this._id = id ?? token.id ?? nanoid();
13
+ this.role = role;
14
+ }
15
+ get isInline() {
16
+ return IsInlineToken(this.token);
17
+ }
18
+ // Getter for the node's id
19
+ get id() {
20
+ return this._id;
21
+ }
22
+ // Other getters
23
+ get token() {
24
+ return this._token;
25
+ }
26
+ get type() {
27
+ return this._token.type;
28
+ }
29
+ get parent() {
30
+ return this._parent;
31
+ }
32
+ get children() {
33
+ return this._children;
34
+ }
35
+ get styles() {
36
+ return this._token.styles;
37
+ }
38
+ get labels() {
39
+ return this._token.labels ?? [];
40
+ }
41
+ // Setter for parent
42
+ set parent(node) {
43
+ this._parent = node;
44
+ }
45
+ addChild(child) {
46
+ this._children.push(child);
47
+ child.parent = this;
48
+ }
49
+ removeChild(child) {
50
+ const index = this._children.indexOf(child);
51
+ if (index !== -1) {
52
+ this._children.splice(index, 1);
53
+ child.parent = null;
54
+ }
55
+ }
56
+ clearChildren() {
57
+ this._children.forEach((child) => (child.parent = null));
58
+ this._children = [];
59
+ }
60
+ // Tree traversal methods
61
+ getRoot() {
62
+ let current = this;
63
+ while (current.parent !== null) {
64
+ current = current.parent;
65
+ }
66
+ return current;
67
+ }
68
+ getDepth() {
69
+ let depth = 0;
70
+ let current = this;
71
+ while (current.parent !== null) {
72
+ depth++;
73
+ current = current.parent;
74
+ }
75
+ return depth;
76
+ }
77
+ /**
78
+ * Finds the first parent node that matches the given predicate
79
+ * @param predicate A function that takes a TokenNode and returns a boolean
80
+ * @returns The first matching parent node or null if none found
81
+ */
82
+ findParentMatching(predicate) {
83
+ let current = this.parent;
84
+ while (current !== null) {
85
+ if (predicate(current)) {
86
+ return current;
87
+ }
88
+ current = current.parent;
89
+ }
90
+ return null;
91
+ }
92
+ // Utility methods
93
+ hasChildren() {
94
+ return this._children.length > 0;
95
+ }
96
+ getChildren() {
97
+ return this._children.slice();
98
+ }
99
+ isRoot() {
100
+ return this._parent === null;
101
+ }
102
+ isLeaf() {
103
+ return this._children.length === 0;
104
+ }
105
+ getFirstChild() {
106
+ return this._children[0] ?? null;
107
+ }
108
+ getLastChild() {
109
+ return this._children[this._children.length - 1] ?? null;
110
+ }
111
+ /**
112
+ * Gets the first leaf node in this subtree (the leftmost node with no children)
113
+ * @returns The first leaf node or this node if it's a leaf
114
+ */
115
+ getFirstLeaf() {
116
+ let current = this;
117
+ while (current.hasChildren()) {
118
+ current = current.getFirstChild();
119
+ }
120
+ return current;
121
+ }
122
+ /**
123
+ * Gets the last leaf node in this subtree (the rightmost node with no children)
124
+ * @returns The last leaf node or this node if it's a leaf
125
+ */
126
+ getLastLeaf() {
127
+ let current = this;
128
+ while (current.hasChildren()) {
129
+ current = current.getLastChild();
130
+ }
131
+ return current;
132
+ }
133
+ static GetCopyContent(nodes, options) {
134
+ let content = '';
135
+ for (let node of nodes) {
136
+ if (!node.isInline)
137
+ content += '\n';
138
+ content += node.getCopyContent(options);
139
+ }
140
+ return content;
141
+ }
142
+ static GetLatexContent(nodes, options) {
143
+ let content = '';
144
+ for (let node of nodes) {
145
+ if (!node.isInline)
146
+ content += '\n';
147
+ content += node.getLatexContent(options);
148
+ }
149
+ return content;
150
+ }
151
+ static GetMarkdownContent(nodes, options) {
152
+ let content = '';
153
+ for (let node of nodes) {
154
+ if (!node.isInline)
155
+ content += '\n\n';
156
+ let markdownContent = node.getMarkdownContent(options);
157
+ content += markdownContent;
158
+ }
159
+ return content;
160
+ }
161
+ static GetJSONContent(nodes, options) {
162
+ const content = [];
163
+ for (let node of nodes) {
164
+ content.push(node.getJSONContent(options));
165
+ }
166
+ return content;
167
+ }
168
+ /**
169
+ * Returns JSON-formatted content (token structure) for export.
170
+ * Always returns full content (no partial extraction).
171
+ * Used for JSON export operations.
172
+ */
173
+ getJSONContent(options) {
174
+ return { ...this.token };
175
+ }
176
+ getTooltipContent() {
177
+ return null;
178
+ }
179
+ // Method to find a node by its ID
180
+ findById(id) {
181
+ if (this._id === id) {
182
+ return this;
183
+ }
184
+ for (const child of this._children) {
185
+ const result = child.findById(id);
186
+ if (result !== null) {
187
+ return result;
188
+ }
189
+ }
190
+ return null;
191
+ }
192
+ /**
193
+ * Finds the first node with the specified label
194
+ * @param label The label to search for
195
+ * @returns The first matching node or null if none found
196
+ */
197
+ findByLabel(label) {
198
+ if (this.labels.includes(label)) {
199
+ return this;
200
+ }
201
+ for (const child of this._children) {
202
+ const result = child.findByLabel(label);
203
+ if (result !== null) {
204
+ return result;
205
+ }
206
+ }
207
+ return null;
208
+ }
209
+ /**
210
+ * Gets the next sibling node if it exists
211
+ * @returns The next sibling node or null if none exists
212
+ */
213
+ getNextSibling() {
214
+ if (!this.parent)
215
+ return null;
216
+ const siblings = this.parent.getChildren();
217
+ const currentIndex = siblings.indexOf(this);
218
+ if (currentIndex === -1 || currentIndex === siblings.length - 1)
219
+ return null;
220
+ return siblings[currentIndex + 1];
221
+ }
222
+ /**
223
+ * Gets the previous sibling node if it exists
224
+ * @returns The previous sibling node or null if none exists
225
+ */
226
+ getPreviousSibling() {
227
+ if (!this.parent)
228
+ return null;
229
+ const siblings = this.parent.getChildren();
230
+ const currentIndex = siblings.indexOf(this);
231
+ if (currentIndex <= 0)
232
+ return null;
233
+ return siblings[currentIndex - 1];
234
+ }
235
+ toPlainObject() {
236
+ return {
237
+ id: this._id,
238
+ parent: this._parent ? this._parent.id : null,
239
+ children: this._children.map((child) => child.toPlainObject()),
240
+ token: this._token
241
+ };
242
+ }
243
+ getAnchorId() {
244
+ return null;
245
+ }
246
+ /**
247
+ * For \ref displays of the tokennode (if label exists)
248
+ */
249
+ getReferenceText() {
250
+ return null;
251
+ }
252
+ }
253
+ //# sourceMappingURL=AbstractTokenNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbstractTokenNode.js","sourceRoot":"","sources":["../../src/base/AbstractTokenNode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { BaseTokenNode } from './BaseTokenNode';
2
+ import { CaptionToken, TableToken, FigureToken, SubFigureToken, SubTableToken } from '../types';
3
+ import { ITokenNodeFactory } from './ITokenNodeFactory';
4
+ import { CaptionTokenNode } from '../content/CaptionTokenNode';
5
+ import { CopyContentOptions, LatexExportOptions, MarkdownExportOptions } from '../export_types';
6
+ type TableFigureTokens = TableToken | FigureToken | SubFigureToken | SubTableToken;
7
+ export declare abstract class BaseTableFigureTokenNode extends BaseTokenNode {
8
+ protected tokenFactory?: ITokenNodeFactory | undefined;
9
+ protected _captionToken: CaptionToken | undefined;
10
+ constructor(token: TableFigureTokens, id?: string, tokenFactory?: ITokenNodeFactory | undefined);
11
+ get token(): TableFigureTokens;
12
+ get numbering(): string | undefined;
13
+ protected abstract getLabelPrefix(): string;
14
+ abstract getEnvironmentName(): string;
15
+ getTooltipContent(): string | null;
16
+ getAnchorId(): string;
17
+ getCopyContent(options?: CopyContentOptions): string;
18
+ getLatexContent(options?: LatexExportOptions): string;
19
+ getMarkdownContent(options?: MarkdownExportOptions): string;
20
+ getAllCaptions(topLevelOnly?: boolean): CaptionTokenNode[];
21
+ getFirstCaption(): CaptionTokenNode | null;
22
+ getParentFigureOrTable(): BaseTableFigureTokenNode | null;
23
+ getReferenceText(): string | null;
24
+ }
25
+ export {};
26
+ //# sourceMappingURL=BaseTableFigureTokenNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseTableFigureTokenNode.d.ts","sourceRoot":"","sources":["../../src/base/BaseTableFigureTokenNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAGhG,KAAK,iBAAiB,GAAG,UAAU,GAAG,WAAW,GAAG,cAAc,GAAG,aAAa,CAAC;AACnF,8BAAsB,wBAAyB,SAAQ,aAAa;IAMhE,SAAS,CAAC,YAAY,CAAC,EAAE,iBAAiB;IAL5C,SAAS,CAAC,aAAa,EAAE,YAAY,GAAG,SAAS,CAAC;gBAGhD,KAAK,EAAE,iBAAiB,EACxB,EAAE,CAAC,EAAE,MAAM,EACD,YAAY,CAAC,EAAE,iBAAiB,YAAA;IAQ5C,IAAI,KAAK,IAAI,iBAAiB,CAE7B;IAED,IAAI,SAAS,uBAEZ;IAED,SAAS,CAAC,QAAQ,CAAC,cAAc,IAAI,MAAM;aAC3B,kBAAkB,IAAI,MAAM;IAM5C,iBAAiB;IAOjB,WAAW;IAgBX,cAAc,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,MAAM;IAKpD,eAAe,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,MAAM;IAMrD,kBAAkB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,MAAM;IAe3D,cAAc,CAAC,YAAY,UAAO;IA2BlC,eAAe,IAAI,gBAAgB,GAAG,IAAI;IAI1C,sBAAsB,IAAI,wBAAwB,GAAG,IAAI;IAWzD,gBAAgB,IAAI,MAAM,GAAG,IAAI;CAelC"}
@@ -0,0 +1,113 @@
1
+ import { BaseTokenNode } from './BaseTokenNode';
2
+ import { convertTokens2String } from '../utils';
3
+ import { CaptionTokenNode } from '../content/CaptionTokenNode';
4
+ export class BaseTableFigureTokenNode extends BaseTokenNode {
5
+ tokenFactory;
6
+ _captionToken;
7
+ constructor(token, id, tokenFactory) {
8
+ super(token, id, tokenFactory);
9
+ this.tokenFactory = tokenFactory;
10
+ // reset styles
11
+ this.token.styles = [];
12
+ }
13
+ get token() {
14
+ return this._token;
15
+ }
16
+ get numbering() {
17
+ return this.token.numbering;
18
+ }
19
+ // protected _extractLabels() {
20
+ // extractLabelsFromChilds(this.token, (label) => label.startsWith(this.getLabelPrefix()));
21
+ // }
22
+ getTooltipContent() {
23
+ if (this._captionToken) {
24
+ return convertTokens2String(this._captionToken.content);
25
+ }
26
+ return null;
27
+ }
28
+ getAnchorId() {
29
+ const anchorId = super.getAnchorId();
30
+ if (anchorId) {
31
+ return anchorId;
32
+ }
33
+ const prefix = this.getLabelPrefix();
34
+ if (this.numbering) {
35
+ return `${prefix}-${this.numbering}`;
36
+ }
37
+ if (this.labels.length > 0) {
38
+ return `${prefix}-${this.labels[0]}`;
39
+ }
40
+ return `${prefix}-${this.id}`;
41
+ }
42
+ getCopyContent(options) {
43
+ const content = super.getCopyContent(options);
44
+ return content;
45
+ }
46
+ getLatexContent(options) {
47
+ const content = super.getLatexContent(options).trim();
48
+ const envName = this.getEnvironmentName().toLowerCase();
49
+ return `\\begin{${envName}}\n${content}\n\\end{${envName}}\n`;
50
+ }
51
+ getMarkdownContent(options) {
52
+ const anchorId = this.getAnchorId();
53
+ const anchor = anchorId ? `<a id="${anchorId}"></a>\n\n` : '';
54
+ // Use environment name and numbering for the heading with underline
55
+ const envName = this.getEnvironmentName();
56
+ const headingText = this.numbering ? `${envName} ${this.numbering}` : envName;
57
+ const heading = `<u><b>${headingText}</b></u>`;
58
+ // Children render normally under this heading
59
+ const content = super.getMarkdownContent(options);
60
+ return `${anchor}${heading}\n\n${content}`;
61
+ }
62
+ getAllCaptions(topLevelOnly = true) {
63
+ // DFS in natural order to find the captions
64
+ const captions = [];
65
+ const traverse = (node) => {
66
+ if (node instanceof CaptionTokenNode) {
67
+ captions.push(node);
68
+ }
69
+ if (topLevelOnly && node instanceof BaseTableFigureTokenNode && node !== this) {
70
+ // Don't traverse into nested table/figure containers (subfigures, subtables, etc.)
71
+ // as they have their own captions that are not siblings of this container's captions
72
+ return;
73
+ }
74
+ for (const child of node.getChildren()) {
75
+ traverse(child);
76
+ }
77
+ };
78
+ for (const child of this.getChildren()) {
79
+ traverse(child);
80
+ }
81
+ return captions;
82
+ }
83
+ getFirstCaption() {
84
+ return this.getAllCaptions()?.[0] || null;
85
+ }
86
+ getParentFigureOrTable() {
87
+ let parent = this.parent;
88
+ while (parent) {
89
+ if (parent instanceof BaseTableFigureTokenNode) {
90
+ return parent;
91
+ }
92
+ parent = parent.parent;
93
+ }
94
+ return null;
95
+ }
96
+ getReferenceText() {
97
+ const caption = this.getFirstCaption();
98
+ if (caption) {
99
+ const refText = caption.getReferenceText();
100
+ if (refText)
101
+ return refText;
102
+ }
103
+ if (!this.numbering) {
104
+ // check parent and use its referencetext
105
+ const parent = this.getParentFigureOrTable();
106
+ if (parent) {
107
+ return parent.getReferenceText();
108
+ }
109
+ }
110
+ return `${this.getEnvironmentName()} ${this.numbering}`;
111
+ }
112
+ }
113
+ //# sourceMappingURL=BaseTableFigureTokenNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseTableFigureTokenNode.js","sourceRoot":"","sources":["../../src/base/BaseTableFigureTokenNode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { BaseToken } from '../types';
2
+ import { CopyContentOptions, LatexExportOptions, MarkdownExportOptions, JSONExportOptions } from '../export_types';
3
+ import { AbstractTokenNode } from './AbstractTokenNode';
4
+ import { ITokenNodeFactory } from './ITokenNodeFactory';
5
+ import { NodeRoles } from './NodeRoles';
6
+ export declare class BaseTokenNode extends AbstractTokenNode {
7
+ protected tokenFactory?: ITokenNodeFactory | undefined;
8
+ constructor(token: BaseToken, id?: string, tokenFactory?: ITokenNodeFactory | undefined);
9
+ get token(): BaseToken;
10
+ /**
11
+ * Initialize children from token.content.
12
+ * The created child nodes will have their IDs set when added to this parent.
13
+ */
14
+ protected _initializeChildren(): void;
15
+ protected _initializeBaseTokensAsChildren(tokens: BaseToken[], nodeRole: NodeRoles): AbstractTokenNode[];
16
+ getCopyContent(options?: CopyContentOptions): string;
17
+ getLatexContent(options?: LatexExportOptions): string;
18
+ getMarkdownContent(options?: MarkdownExportOptions): string;
19
+ getJSONContent(options?: JSONExportOptions): any;
20
+ getTooltipContent(): string | null;
21
+ getClosestParentWithLabel(): BaseTokenNode | null;
22
+ getData(nodeRole?: NodeRoles): string | AbstractTokenNode[] | null;
23
+ getAnchorId(): string | null;
24
+ }
25
+ //# sourceMappingURL=BaseTokenNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseTokenNode.d.ts","sourceRoot":"","sources":["../../src/base/BaseTokenNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACnH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,qBAAa,aAAc,SAAQ,iBAAiB;IAIhD,SAAS,CAAC,YAAY,CAAC,EAAE,iBAAiB;gBAF1C,KAAK,EAAE,SAAS,EAChB,EAAE,CAAC,EAAE,MAAM,EACD,YAAY,CAAC,EAAE,iBAAiB,YAAA;IAM5C,IAAI,KAAK,IAAI,SAAS,CAErB;IAED;;;OAGG;IACH,SAAS,CAAC,mBAAmB,IAAI,IAAI;IAOrC,SAAS,CAAC,+BAA+B,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,SAAS;IAiBlF,cAAc,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,MAAM;IAcpD,eAAe,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,MAAM;IAgBrD,kBAAkB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,MAAM;IAc3D,cAAc,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,GAAG;IAmChD,iBAAiB,IAAI,MAAM,GAAG,IAAI;IAOlC,yBAAyB,IAAI,aAAa,GAAG,IAAI;IASjD,OAAO,CAAC,QAAQ,CAAC,EAAE,SAAS;IAa5B,WAAW,IAAI,MAAM,GAAG,IAAI;CAG7B"}