@jotx-labs/core 2.2.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 (114) hide show
  1. package/README.md +37 -0
  2. package/dist/__tests__/events.test.d.ts +2 -0
  3. package/dist/__tests__/events.test.d.ts.map +1 -0
  4. package/dist/__tests__/events.test.js +63 -0
  5. package/dist/__tests__/events.test.js.map +1 -0
  6. package/dist/__tests__/idGenerator.test.d.ts +5 -0
  7. package/dist/__tests__/idGenerator.test.d.ts.map +1 -0
  8. package/dist/__tests__/idGenerator.test.js +98 -0
  9. package/dist/__tests__/idGenerator.test.js.map +1 -0
  10. package/dist/__tests__/platform.test.d.ts +2 -0
  11. package/dist/__tests__/platform.test.d.ts.map +1 -0
  12. package/dist/__tests__/platform.test.js +37 -0
  13. package/dist/__tests__/platform.test.js.map +1 -0
  14. package/dist/__tests__/plugin.test.d.ts +2 -0
  15. package/dist/__tests__/plugin.test.d.ts.map +1 -0
  16. package/dist/__tests__/plugin.test.js +72 -0
  17. package/dist/__tests__/plugin.test.js.map +1 -0
  18. package/dist/converters/MarkdownConverter.d.ts +15 -0
  19. package/dist/converters/MarkdownConverter.d.ts.map +1 -0
  20. package/dist/converters/MarkdownConverter.js +519 -0
  21. package/dist/converters/MarkdownConverter.js.map +1 -0
  22. package/dist/document/index.d.ts +4 -0
  23. package/dist/document/index.d.ts.map +1 -0
  24. package/dist/document/index.js +8 -0
  25. package/dist/document/index.js.map +1 -0
  26. package/dist/events/EventEmitter.d.ts +20 -0
  27. package/dist/events/EventEmitter.d.ts.map +1 -0
  28. package/dist/events/EventEmitter.js +51 -0
  29. package/dist/events/EventEmitter.js.map +1 -0
  30. package/dist/events/index.d.ts +2 -0
  31. package/dist/events/index.d.ts.map +1 -0
  32. package/dist/events/index.js +18 -0
  33. package/dist/events/index.js.map +1 -0
  34. package/dist/index.d.ts +47 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +118 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/parser/__tests__/parser.test.d.ts +2 -0
  39. package/dist/parser/__tests__/parser.test.d.ts.map +1 -0
  40. package/dist/parser/__tests__/parser.test.js +72 -0
  41. package/dist/parser/__tests__/parser.test.js.map +1 -0
  42. package/dist/parser/__tests__/serializer.test.d.ts +2 -0
  43. package/dist/parser/__tests__/serializer.test.d.ts.map +1 -0
  44. package/dist/parser/__tests__/serializer.test.js +60 -0
  45. package/dist/parser/__tests__/serializer.test.js.map +1 -0
  46. package/dist/parser/__tests__/tokenizer.test.d.ts +2 -0
  47. package/dist/parser/__tests__/tokenizer.test.d.ts.map +1 -0
  48. package/dist/parser/__tests__/tokenizer.test.js +76 -0
  49. package/dist/parser/__tests__/tokenizer.test.js.map +1 -0
  50. package/dist/parser/__tests__/validator.test.d.ts +2 -0
  51. package/dist/parser/__tests__/validator.test.d.ts.map +1 -0
  52. package/dist/parser/__tests__/validator.test.js +281 -0
  53. package/dist/parser/__tests__/validator.test.js.map +1 -0
  54. package/dist/parser/serializer.d.ts +28 -0
  55. package/dist/parser/serializer.d.ts.map +1 -0
  56. package/dist/parser/serializer.js +157 -0
  57. package/dist/parser/serializer.js.map +1 -0
  58. package/dist/parser/tokenizer.new.d.ts +31 -0
  59. package/dist/parser/tokenizer.new.d.ts.map +1 -0
  60. package/dist/parser/tokenizer.new.js +181 -0
  61. package/dist/parser/tokenizer.new.js.map +1 -0
  62. package/dist/parser/v3/BlockParser.d.ts +11 -0
  63. package/dist/parser/v3/BlockParser.d.ts.map +1 -0
  64. package/dist/parser/v3/BlockParser.js +93 -0
  65. package/dist/parser/v3/BlockParser.js.map +1 -0
  66. package/dist/parser/v3/DocumentParser.d.ts +8 -0
  67. package/dist/parser/v3/DocumentParser.d.ts.map +1 -0
  68. package/dist/parser/v3/DocumentParser.js +109 -0
  69. package/dist/parser/v3/DocumentParser.js.map +1 -0
  70. package/dist/parser/v3/Parser.d.ts +11 -0
  71. package/dist/parser/v3/Parser.d.ts.map +1 -0
  72. package/dist/parser/v3/Parser.js +25 -0
  73. package/dist/parser/v3/Parser.js.map +1 -0
  74. package/dist/parser/validator.d.ts +24 -0
  75. package/dist/parser/validator.d.ts.map +1 -0
  76. package/dist/parser/validator.js +177 -0
  77. package/dist/parser/validator.js.map +1 -0
  78. package/dist/platform/NullPlatformAdapter.d.ts +18 -0
  79. package/dist/platform/NullPlatformAdapter.d.ts.map +1 -0
  80. package/dist/platform/NullPlatformAdapter.js +41 -0
  81. package/dist/platform/NullPlatformAdapter.js.map +1 -0
  82. package/dist/platform/PlatformAdapter.d.ts +22 -0
  83. package/dist/platform/PlatformAdapter.d.ts.map +1 -0
  84. package/dist/platform/PlatformAdapter.js +7 -0
  85. package/dist/platform/PlatformAdapter.js.map +1 -0
  86. package/dist/platform/index.d.ts +3 -0
  87. package/dist/platform/index.d.ts.map +1 -0
  88. package/dist/platform/index.js +19 -0
  89. package/dist/platform/index.js.map +1 -0
  90. package/dist/plugin/PluginSystem.d.ts +46 -0
  91. package/dist/plugin/PluginSystem.d.ts.map +1 -0
  92. package/dist/plugin/PluginSystem.js +58 -0
  93. package/dist/plugin/PluginSystem.js.map +1 -0
  94. package/dist/plugin/index.d.ts +2 -0
  95. package/dist/plugin/index.d.ts.map +1 -0
  96. package/dist/plugin/index.js +18 -0
  97. package/dist/plugin/index.js.map +1 -0
  98. package/dist/types/ast.d.ts +118 -0
  99. package/dist/types/ast.d.ts.map +1 -0
  100. package/dist/types/ast.js +331 -0
  101. package/dist/types/ast.js.map +1 -0
  102. package/dist/types/enums.d.ts +67 -0
  103. package/dist/types/enums.d.ts.map +1 -0
  104. package/dist/types/enums.js +278 -0
  105. package/dist/types/enums.js.map +1 -0
  106. package/dist/utils/idGenerator.d.ts +34 -0
  107. package/dist/utils/idGenerator.d.ts.map +1 -0
  108. package/dist/utils/idGenerator.js +105 -0
  109. package/dist/utils/idGenerator.js.map +1 -0
  110. package/dist/version.d.ts +7 -0
  111. package/dist/version.d.ts.map +1 -0
  112. package/dist/version.js +10 -0
  113. package/dist/version.js.map +1 -0
  114. package/package.json +41 -0
@@ -0,0 +1,281 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const validator_1 = require("../validator");
4
+ const index_1 = require("../../index");
5
+ describe('Validator', () => {
6
+ let validator;
7
+ let parser;
8
+ beforeEach(() => {
9
+ validator = (0, validator_1.createValidator)();
10
+ parser = new index_1.Parser();
11
+ });
12
+ it('should detect duplicate block IDs', () => {
13
+ const input = `hdef page TestNote
14
+ title "Test"
15
+
16
+ def heading1 block_1
17
+ """Title 1"""
18
+
19
+ def paragraph block_1
20
+ """Duplicate ID!"""`;
21
+ const ast = parser.parse(input);
22
+ const result = validator.validate(ast.document);
23
+ expect(result.length).toBeGreaterThan(0);
24
+ expect(result).toHaveLength(1);
25
+ expect(result[0].type).toBe('duplicate_id');
26
+ expect(result[0].message).toContain('block_1');
27
+ });
28
+ it('should validate enum values', () => {
29
+ const input = `hdef page TestNote
30
+ title "Test"
31
+
32
+ def code block_1
33
+ language invalid_language
34
+ """code"""`;
35
+ const ast = parser.parse(input);
36
+ const result = validator.validate(ast.document);
37
+ // Note: Parser treats unknown values as identifiers, not enums
38
+ // So this test validates that required properties are checked
39
+ expect(result.length).toBeGreaterThan(0);
40
+ // Should have at least one error (missing language or invalid enum)
41
+ expect(result.length).toBeGreaterThan(0);
42
+ });
43
+ it('should validate required properties', () => {
44
+ const input = `hdef page TestNote
45
+ title "Test"
46
+
47
+ def code block_1
48
+ """code without language!"""`;
49
+ const ast = parser.parse(input);
50
+ const result = validator.validate(ast.document);
51
+ expect(result.length).toBeGreaterThan(0);
52
+ const missingError = result.find(e => e.type === 'missing_required');
53
+ expect(missingError).toBeDefined();
54
+ expect(missingError?.message).toContain('language');
55
+ });
56
+ it('should pass validation for valid document', () => {
57
+ const input = `hdef page TestNote
58
+ title "Valid Note"
59
+ icon "📝"
60
+
61
+ def heading1 block_1
62
+ """Title"""
63
+
64
+ def code block_2
65
+ language typescript
66
+ """console.log('valid');"""`;
67
+ const ast = parser.parse(input);
68
+ const result = validator.validate(ast.document);
69
+ expect(result).toHaveLength(0);
70
+ expect(result).toHaveLength(0);
71
+ });
72
+ describe('Schema Validation', () => {
73
+ it('should allow all blocks in .page documents', () => {
74
+ const input = `hdef page TestNote
75
+ title "Test"
76
+
77
+ def heading1 block_1
78
+ """Title"""
79
+
80
+ def code block_2
81
+ language typescript
82
+ """code"""
83
+
84
+ def math block_3
85
+ format latex
86
+ """E = mc^2"""
87
+
88
+ def image block_4
89
+ src "test.png"`;
90
+ const ast = parser.parse(input);
91
+ const result = validator.validate(ast.document);
92
+ // Should not have schema errors (may have other errors like missing required props)
93
+ const schemaErrors = result.filter(e => e.type === 'invalid_block_schema');
94
+ expect(schemaErrors).toHaveLength(0);
95
+ });
96
+ it('should reject code blocks in .meet documents', () => {
97
+ const input = `hdef meeting TestMeeting
98
+ title "Test Meeting"
99
+ date "2025-12-13"
100
+
101
+ def heading2 block_1
102
+ """Agenda"""
103
+
104
+ def code block_2
105
+ language typescript
106
+ """// Not allowed in meetings!"""`;
107
+ const ast = parser.parse(input);
108
+ const result = validator.validate(ast.document);
109
+ expect(result.length).toBeGreaterThan(0);
110
+ const schemaError = result.find(e => e.type === 'invalid_block_schema');
111
+ expect(schemaError).toBeDefined();
112
+ expect(schemaError?.message).toContain('code');
113
+ expect(schemaError?.message).toContain('meeting');
114
+ });
115
+ it('should reject heading1 blocks in .meet documents', () => {
116
+ const input = `hdef meeting TestMeeting
117
+ title "Test Meeting"
118
+
119
+ def heading1 block_1
120
+ """Not Allowed!"""`;
121
+ const ast = parser.parse(input);
122
+ const result = validator.validate(ast.document);
123
+ expect(result.length).toBeGreaterThan(0);
124
+ const schemaError = result.find(e => e.type === 'invalid_block_schema');
125
+ expect(schemaError).toBeDefined();
126
+ expect(schemaError?.message).toContain('heading1');
127
+ });
128
+ it('should reject heading1 blocks in .todo documents', () => {
129
+ const input = `hdef tasklist TestTodo
130
+ title "Test Tasks"
131
+
132
+ def heading1 block_1
133
+ """Not Allowed!"""`;
134
+ const ast = parser.parse(input);
135
+ const result = validator.validate(ast.document);
136
+ expect(result.length).toBeGreaterThan(0);
137
+ const schemaError = result.find(e => e.type === 'invalid_block_schema');
138
+ expect(schemaError).toBeDefined();
139
+ expect(schemaError?.message).toContain('heading1');
140
+ expect(schemaError?.message).toContain('tasklist');
141
+ });
142
+ it('should reject code blocks in .todo documents', () => {
143
+ const input = `hdef tasklist TestTodo
144
+ title "Test Tasks"
145
+
146
+ def code block_1
147
+ language typescript
148
+ """// Not for tasks!"""`;
149
+ const ast = parser.parse(input);
150
+ const result = validator.validate(ast.document);
151
+ expect(result.length).toBeGreaterThan(0);
152
+ const schemaError = result.find(e => e.type === 'invalid_block_schema');
153
+ expect(schemaError).toBeDefined();
154
+ expect(schemaError?.message).toContain('code');
155
+ expect(schemaError?.message).toContain('tasklist');
156
+ });
157
+ it('should allow checklist in all document types', () => {
158
+ const inputs = [
159
+ `hdef page TestPage
160
+ title "Test"
161
+
162
+ def checklist block_1
163
+ item task_1
164
+ text """Task 1"""
165
+ checked false`,
166
+ `hdef meeting TestMeeting
167
+ title "Test"
168
+ date "2025-12-13"
169
+
170
+ def checklist block_1
171
+ item task_1
172
+ text """Action item"""
173
+ checked false`,
174
+ `hdef tasklist TestTodo
175
+ title "Test"
176
+
177
+ def checklist block_1
178
+ item task_1
179
+ text """Task"""
180
+ checked false`
181
+ ];
182
+ for (const input of inputs) {
183
+ const ast = parser.parse(input);
184
+ const result = validator.validate(ast.document);
185
+ const schemaErrors = result.filter(e => e.type === 'invalid_block_schema');
186
+ expect(schemaErrors).toHaveLength(0);
187
+ }
188
+ });
189
+ it('should allow attach blocks in all document types', () => {
190
+ const inputs = [
191
+ `hdef page TestPage
192
+ title "Test"
193
+
194
+ def attach block_1
195
+ path "file.pdf"
196
+ name "Document"`,
197
+ `hdef meeting TestMeeting
198
+ title "Test"
199
+ date "2025-12-13"
200
+
201
+ def attach block_1
202
+ path "slides.pdf"
203
+ name "Slides"`,
204
+ `hdef tasklist TestTodo
205
+ title "Test"
206
+
207
+ def attach block_1
208
+ path "spec.pdf"
209
+ name "Specification"`
210
+ ];
211
+ for (const input of inputs) {
212
+ const ast = parser.parse(input);
213
+ const result = validator.validate(ast.document);
214
+ const schemaErrors = result.filter(e => e.type === 'invalid_block_schema');
215
+ expect(schemaErrors).toHaveLength(0);
216
+ }
217
+ });
218
+ it('should allow paragraph in all document types', () => {
219
+ const inputs = [
220
+ `hdef page TestPage
221
+ title "Test"
222
+
223
+ def paragraph block_1
224
+ """Content"""`,
225
+ `hdef meeting TestMeeting
226
+ title "Test"
227
+ date "2025-12-13"
228
+
229
+ def paragraph block_1
230
+ """Meeting notes"""`,
231
+ `hdef tasklist TestTodo
232
+ title "Test"
233
+
234
+ def paragraph block_1
235
+ """Task context"""`
236
+ ];
237
+ for (const input of inputs) {
238
+ const ast = parser.parse(input);
239
+ const result = validator.validate(ast.document);
240
+ const schemaErrors = result.filter(e => e.type === 'invalid_block_schema');
241
+ expect(schemaErrors).toHaveLength(0);
242
+ }
243
+ });
244
+ it('should allow quote in .page and .meet but not .todo', () => {
245
+ const pageInput = `hdef page TestPage
246
+ title "Test"
247
+
248
+ def quote block_1
249
+ """Quote"""`;
250
+ const meetInput = `hdef meeting TestMeeting
251
+ title "Test"
252
+ date "2025-12-13"
253
+
254
+ def quote block_1
255
+ """Alice: 'Important point'"""`;
256
+ const todoInput = `hdef tasklist TestTodo
257
+ title "Test"
258
+
259
+ def quote block_1
260
+ """Not allowed!"""`;
261
+ // Page should allow
262
+ let ast = parser.parse(pageInput);
263
+ let result = validator.validate(ast.document);
264
+ let schemaErrors = result.filter(e => e.type === 'invalid_block_schema');
265
+ expect(schemaErrors).toHaveLength(0);
266
+ // Meeting should allow
267
+ ast = parser.parse(meetInput);
268
+ result = validator.validate(ast.document);
269
+ schemaErrors = result.filter(e => e.type === 'invalid_block_schema');
270
+ expect(schemaErrors).toHaveLength(0);
271
+ // Todo should reject
272
+ ast = parser.parse(todoInput);
273
+ result = validator.validate(ast.document);
274
+ schemaErrors = result.filter(e => e.type === 'invalid_block_schema');
275
+ expect(schemaErrors).toHaveLength(1);
276
+ expect(schemaErrors[0].message).toContain('quote');
277
+ expect(schemaErrors[0].message).toContain('tasklist');
278
+ });
279
+ });
280
+ });
281
+ //# sourceMappingURL=validator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.test.js","sourceRoot":"","sources":["../../../src/parser/__tests__/validator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * jotx 2.0 Serializer - Converts AST back to text
3
+ * Outputs clean consistent syntax with explicit property names
4
+ */
5
+ import { AST } from '../types/ast';
6
+ export declare class Serializer {
7
+ /**
8
+ * Serialize AST to jotx text
9
+ */
10
+ serialize(ast: AST): string;
11
+ /**
12
+ * Serialize document header: hdef <type> <id>
13
+ */
14
+ private serializeDocumentHeader;
15
+ /**
16
+ * Serialize document metadata
17
+ */
18
+ private serializeMetadata;
19
+ /**
20
+ * Convert camelCase to flatcase
21
+ */
22
+ private toFlatcase;
23
+ /**
24
+ * Serialize a block
25
+ */
26
+ private serializeBlock;
27
+ }
28
+ //# sourceMappingURL=serializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../../src/parser/serializer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,GAAG,EAA2B,MAAM,cAAc,CAAA;AAE3D,qBAAa,UAAU;IACrB;;OAEG;IACH,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM;IAuB3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAI/B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA8BzB;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,OAAO,CAAC,cAAc;CAiFvB"}
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ /**
3
+ * jotx 2.0 Serializer - Converts AST back to text
4
+ * Outputs clean consistent syntax with explicit property names
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.Serializer = void 0;
8
+ const registry_1 = require("@jotx/registry");
9
+ class Serializer {
10
+ /**
11
+ * Serialize AST to jotx text
12
+ */
13
+ serialize(ast) {
14
+ const lines = [];
15
+ // Serialize document header
16
+ lines.push(this.serializeDocumentHeader(ast.document));
17
+ lines.push('');
18
+ // Serialize metadata
19
+ const metadataLines = this.serializeMetadata(ast.document);
20
+ if (metadataLines.length > 0) {
21
+ lines.push(...metadataLines);
22
+ lines.push('');
23
+ }
24
+ // Serialize blocks
25
+ for (const block of ast.document.blocks) {
26
+ lines.push(...this.serializeBlock(block, 1));
27
+ lines.push('');
28
+ }
29
+ return lines.join('\n').trim() + '\n';
30
+ }
31
+ /**
32
+ * Serialize document header: hdef <type> <id>
33
+ */
34
+ serializeDocumentHeader(doc) {
35
+ return `hdef ${doc.type} ${doc.id}`;
36
+ }
37
+ /**
38
+ * Serialize document metadata
39
+ */
40
+ serializeMetadata(doc) {
41
+ const lines = [];
42
+ const metadata = doc.metadata;
43
+ // Serialize each metadata field
44
+ for (const [key, value] of Object.entries(metadata)) {
45
+ if (value === undefined || value === null)
46
+ continue;
47
+ if (key === 'type') {
48
+ // Force unquoted for known enum types in header
49
+ lines.push(` ${key} ${value}`);
50
+ }
51
+ else if (Array.isArray(value)) {
52
+ // Arrays: tags "tag1", "tag2"
53
+ const items = value.map(v => `"${v}"`).join(', ');
54
+ lines.push(` ${key} ${items}`);
55
+ }
56
+ else if (typeof value === 'string') {
57
+ // Strings: key "value"
58
+ lines.push(` ${key} "${value}"`);
59
+ }
60
+ else if (typeof value === 'number') {
61
+ // Numbers: key 123
62
+ lines.push(` ${key} ${value}`);
63
+ }
64
+ else {
65
+ // Other: convert to string
66
+ lines.push(` ${key} "${String(value)}"`);
67
+ }
68
+ }
69
+ return lines;
70
+ }
71
+ /**
72
+ * Convert camelCase to flatcase
73
+ */
74
+ toFlatcase(str) {
75
+ return str.replace(/[A-Z]/g, letter => letter.toLowerCase());
76
+ }
77
+ /**
78
+ * Serialize a block
79
+ */
80
+ serializeBlock(block, indentLevel) {
81
+ const lines = [];
82
+ const indent = ' '.repeat(indentLevel);
83
+ // Get block definition from registry
84
+ const def = registry_1.registry.get(block.type);
85
+ // Use keyword from registry (e.g., 'heading' not 'heading')
86
+ // If no definition found, use the type as-is (lowercased)
87
+ const keyword = def?.syntax.keyword || block.type.toLowerCase();
88
+ // Block definition: def <keyword> <id>
89
+ lines.push(`${indent}def ${keyword} ${block.id}`);
90
+ // Serialize properties
91
+ const propIndent = ' '.repeat(indentLevel + 1);
92
+ for (let [key, value] of Object.entries(block.properties)) {
93
+ if (value === undefined || value === null)
94
+ continue;
95
+ // Convert to flatcase (camelCase -> flatcase)
96
+ const outKey = this.toFlatcase(key);
97
+ let isEnum = false;
98
+ if (def && def.schema.properties[key]?.type === 'enum') {
99
+ isEnum = true;
100
+ }
101
+ if (typeof value === 'string' && !isEnum) {
102
+ // Check if multiline
103
+ if (value.includes('\n')) {
104
+ // Check for nested triple quotes and determine strict delimiter
105
+ // Default """
106
+ let delimiter = '"""';
107
+ // Find longest sequence of quotes
108
+ const quoteMatches = value.match(/"{3,}/g);
109
+ if (quoteMatches) {
110
+ const maxLength = Math.max(...quoteMatches.map(m => m.length));
111
+ delimiter = '"'.repeat(maxLength + 1);
112
+ }
113
+ lines.push(`${propIndent}${outKey} ${delimiter}${value}${delimiter}`);
114
+ }
115
+ else {
116
+ // Single-quoted string
117
+ lines.push(`${propIndent}${outKey} "${value}"`);
118
+ }
119
+ }
120
+ else if (typeof value === 'number') {
121
+ // Number (no quotes)
122
+ lines.push(`${propIndent}${outKey} ${value}`);
123
+ }
124
+ else if (typeof value === 'boolean') {
125
+ // Boolean (no quotes)
126
+ lines.push(`${propIndent}${outKey} ${value}`);
127
+ }
128
+ else {
129
+ // Enum values or other (no quotes)
130
+ lines.push(`${propIndent}${outKey} ${value}`);
131
+ }
132
+ }
133
+ // Serialize children (nested blocks, items, rows, etc)
134
+ if (block.children && block.children.length > 0) {
135
+ for (const child of block.children) {
136
+ // Recursively call serializeBlock for EVERYTHING.
137
+ // We don't need special handlers for item/row anymore if we map them correctly above.
138
+ // BUT check legacy mappings in standard serializer...
139
+ // The standard parser outputs Blocks. Simplified syntax outputs Blocks.
140
+ // So we can just be recursive.
141
+ if (child.type === 'item') {
142
+ // legacy item node? convert to listitem/taskitem or simpler
143
+ // If implicit item, handle specially?
144
+ // Assuming strict parser used, 'item' shouldn't exist as raw type properly unless from legacy.
145
+ // Let's use serializeBlock but map 'item' -> 'listitem' if needed
146
+ lines.push(...this.serializeBlock(child, indentLevel + 1));
147
+ }
148
+ else {
149
+ lines.push(...this.serializeBlock(child, indentLevel + 1));
150
+ }
151
+ }
152
+ }
153
+ return lines;
154
+ }
155
+ }
156
+ exports.Serializer = Serializer;
157
+ //# sourceMappingURL=serializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializer.js","sourceRoot":"","sources":["../../src/parser/serializer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Tokenizer (Lexer) for jotx 3.0
3
+ * Converts raw string into strict tokens for the parser
4
+ */
5
+ export declare enum TokenType {
6
+ HEADER_DEF = "HEADER_DEF",// hdef <type> <id>
7
+ BLOCK_START = "BLOCK_START",// def heading1 id
8
+ INDENT = "INDENT",// " " (2 spaces)
9
+ DEDENT = "DEDENT",// Return to previous indent
10
+ PROPERTY = "PROPERTY",// key "value"
11
+ TEXT_START = "TEXT_START",// text """
12
+ TEXT_CONTENT = "TEXT_CONTENT",// ... content ...
13
+ TEXT_END = "TEXT_END",// """
14
+ COMMENT = "COMMENT",// # comment
15
+ NEWLINE = "NEWLINE"
16
+ }
17
+ export interface Token {
18
+ type: TokenType;
19
+ value?: string;
20
+ params?: string[];
21
+ line: number;
22
+ }
23
+ export declare class Tokenizer {
24
+ private tokens;
25
+ private indentStack;
26
+ private currentLine;
27
+ private inMultilineText;
28
+ private currentMultilineDelimiter;
29
+ tokenize(input: string): Token[];
30
+ }
31
+ //# sourceMappingURL=tokenizer.new.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.new.d.ts","sourceRoot":"","sources":["../../src/parser/tokenizer.new.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,oBAAY,SAAS;IACnB,UAAU,eAAe,CAAI,mBAAmB;IAChD,WAAW,gBAAgB,CAAE,kBAAkB;IAC/C,MAAM,WAAW,CAAY,kBAAkB;IAC/C,MAAM,WAAW,CAAY,4BAA4B;IACzD,QAAQ,aAAa,CAAQ,cAAc;IAC3C,UAAU,eAAe,CAAI,WAAW;IACxC,YAAY,iBAAiB,CAAE,kBAAkB;IACjD,QAAQ,aAAa,CAAQ,MAAM;IACnC,OAAO,YAAY,CAAU,YAAY;IACzC,OAAO,YAAY;CACpB;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,WAAW,CAAa;IAGhC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,yBAAyB,CAAiB;IAElD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE;CAwKjC"}