@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.
- package/README.md +37 -0
- package/dist/__tests__/events.test.d.ts +2 -0
- package/dist/__tests__/events.test.d.ts.map +1 -0
- package/dist/__tests__/events.test.js +63 -0
- package/dist/__tests__/events.test.js.map +1 -0
- package/dist/__tests__/idGenerator.test.d.ts +5 -0
- package/dist/__tests__/idGenerator.test.d.ts.map +1 -0
- package/dist/__tests__/idGenerator.test.js +98 -0
- package/dist/__tests__/idGenerator.test.js.map +1 -0
- package/dist/__tests__/platform.test.d.ts +2 -0
- package/dist/__tests__/platform.test.d.ts.map +1 -0
- package/dist/__tests__/platform.test.js +37 -0
- package/dist/__tests__/platform.test.js.map +1 -0
- package/dist/__tests__/plugin.test.d.ts +2 -0
- package/dist/__tests__/plugin.test.d.ts.map +1 -0
- package/dist/__tests__/plugin.test.js +72 -0
- package/dist/__tests__/plugin.test.js.map +1 -0
- package/dist/converters/MarkdownConverter.d.ts +15 -0
- package/dist/converters/MarkdownConverter.d.ts.map +1 -0
- package/dist/converters/MarkdownConverter.js +519 -0
- package/dist/converters/MarkdownConverter.js.map +1 -0
- package/dist/document/index.d.ts +4 -0
- package/dist/document/index.d.ts.map +1 -0
- package/dist/document/index.js +8 -0
- package/dist/document/index.js.map +1 -0
- package/dist/events/EventEmitter.d.ts +20 -0
- package/dist/events/EventEmitter.d.ts.map +1 -0
- package/dist/events/EventEmitter.js +51 -0
- package/dist/events/EventEmitter.js.map +1 -0
- package/dist/events/index.d.ts +2 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +18 -0
- package/dist/events/index.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +118 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/__tests__/parser.test.d.ts +2 -0
- package/dist/parser/__tests__/parser.test.d.ts.map +1 -0
- package/dist/parser/__tests__/parser.test.js +72 -0
- package/dist/parser/__tests__/parser.test.js.map +1 -0
- package/dist/parser/__tests__/serializer.test.d.ts +2 -0
- package/dist/parser/__tests__/serializer.test.d.ts.map +1 -0
- package/dist/parser/__tests__/serializer.test.js +60 -0
- package/dist/parser/__tests__/serializer.test.js.map +1 -0
- package/dist/parser/__tests__/tokenizer.test.d.ts +2 -0
- package/dist/parser/__tests__/tokenizer.test.d.ts.map +1 -0
- package/dist/parser/__tests__/tokenizer.test.js +76 -0
- package/dist/parser/__tests__/tokenizer.test.js.map +1 -0
- package/dist/parser/__tests__/validator.test.d.ts +2 -0
- package/dist/parser/__tests__/validator.test.d.ts.map +1 -0
- package/dist/parser/__tests__/validator.test.js +281 -0
- package/dist/parser/__tests__/validator.test.js.map +1 -0
- package/dist/parser/serializer.d.ts +28 -0
- package/dist/parser/serializer.d.ts.map +1 -0
- package/dist/parser/serializer.js +157 -0
- package/dist/parser/serializer.js.map +1 -0
- package/dist/parser/tokenizer.new.d.ts +31 -0
- package/dist/parser/tokenizer.new.d.ts.map +1 -0
- package/dist/parser/tokenizer.new.js +181 -0
- package/dist/parser/tokenizer.new.js.map +1 -0
- package/dist/parser/v3/BlockParser.d.ts +11 -0
- package/dist/parser/v3/BlockParser.d.ts.map +1 -0
- package/dist/parser/v3/BlockParser.js +93 -0
- package/dist/parser/v3/BlockParser.js.map +1 -0
- package/dist/parser/v3/DocumentParser.d.ts +8 -0
- package/dist/parser/v3/DocumentParser.d.ts.map +1 -0
- package/dist/parser/v3/DocumentParser.js +109 -0
- package/dist/parser/v3/DocumentParser.js.map +1 -0
- package/dist/parser/v3/Parser.d.ts +11 -0
- package/dist/parser/v3/Parser.d.ts.map +1 -0
- package/dist/parser/v3/Parser.js +25 -0
- package/dist/parser/v3/Parser.js.map +1 -0
- package/dist/parser/validator.d.ts +24 -0
- package/dist/parser/validator.d.ts.map +1 -0
- package/dist/parser/validator.js +177 -0
- package/dist/parser/validator.js.map +1 -0
- package/dist/platform/NullPlatformAdapter.d.ts +18 -0
- package/dist/platform/NullPlatformAdapter.d.ts.map +1 -0
- package/dist/platform/NullPlatformAdapter.js +41 -0
- package/dist/platform/NullPlatformAdapter.js.map +1 -0
- package/dist/platform/PlatformAdapter.d.ts +22 -0
- package/dist/platform/PlatformAdapter.d.ts.map +1 -0
- package/dist/platform/PlatformAdapter.js +7 -0
- package/dist/platform/PlatformAdapter.js.map +1 -0
- package/dist/platform/index.d.ts +3 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/index.js +19 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/plugin/PluginSystem.d.ts +46 -0
- package/dist/plugin/PluginSystem.d.ts.map +1 -0
- package/dist/plugin/PluginSystem.js +58 -0
- package/dist/plugin/PluginSystem.js.map +1 -0
- package/dist/plugin/index.d.ts +2 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/index.js +18 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/types/ast.d.ts +118 -0
- package/dist/types/ast.d.ts.map +1 -0
- package/dist/types/ast.js +331 -0
- package/dist/types/ast.js.map +1 -0
- package/dist/types/enums.d.ts +67 -0
- package/dist/types/enums.d.ts.map +1 -0
- package/dist/types/enums.js +278 -0
- package/dist/types/enums.js.map +1 -0
- package/dist/utils/idGenerator.d.ts +34 -0
- package/dist/utils/idGenerator.d.ts.map +1 -0
- package/dist/utils/idGenerator.js +105 -0
- package/dist/utils/idGenerator.js.map +1 -0
- package/dist/version.d.ts +7 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +10 -0
- package/dist/version.js.map +1 -0
- 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":";;AAAA,4CAA8C;AAC9C,uCAAoC;AAEpC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAI,SAA6C,CAAA;IACjD,IAAI,MAAc,CAAA;IAElB,UAAU,CAAC,GAAG,EAAE;QACd,SAAS,GAAG,IAAA,2BAAe,GAAE,CAAA;QAC7B,MAAM,GAAG,IAAI,cAAM,EAAE,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,KAAK,GAAG;;;;;;;wBAOM,CAAA;QAEpB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAE/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,KAAK,GAAG;;;;;eAKH,CAAA;QAEX,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAE/C,+DAA+D;QAC/D,8DAA8D;QAC9D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACxC,oEAAoE;QACpE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,KAAK,GAAG;;;;iCAIe,CAAA;QAE7B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAE/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACxC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAA;QACpE,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAA;QAClC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,KAAK,GAAG;;;;;;;;;gCASc,CAAA;QAE5B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAE/C,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;mBAeD,CAAA;YAEb,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YAC/B,MAAM,MAAM,GAAU,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAEtD,oFAAoF;YACpF,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAA;YAC1E,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACtC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,KAAK,GAAG;;;;;;;;;sCASkB,CAAA;YAEhC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAE/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YACxC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAA;YACvE,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAA;YACjC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;YAC9C,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,KAAK,GAAG;;;;uBAIG,CAAA;YAEjB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAE/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YACxC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAA;YACvE,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAA;YACjC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QACpD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,KAAK,GAAG;;;;uBAIG,CAAA;YAEjB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAE/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YACxC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAA;YACvE,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAA;YACjC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;YAClD,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QACpD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,KAAK,GAAG;;;;;4BAKQ,CAAA;YAEtB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAE/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YACxC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAA;YACvE,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAA;YACjC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;YAC9C,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QACpD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,MAAM,GAAG;gBACb;;;;;;oBAMY;gBACZ;;;;;;;oBAOY;gBACZ;;;;;;oBAMY;aACb,CAAA;YAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;gBAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;gBAE/C,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAA;gBAC1E,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YACtC,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,MAAM,GAAG;gBACb;;;;;oBAKY;gBACZ;;;;;;kBAMU;gBACV;;;;;yBAKiB;aAClB,CAAA;YAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;gBAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;gBAE/C,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAA;gBAC1E,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YACtC,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,MAAM,GAAG;gBACb;;;;kBAIU;gBACV;;;;;wBAKgB;gBAChB;;;;uBAIe;aAChB,CAAA;YAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;gBAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;gBAE/C,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAA;gBAC1E,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YACtC,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,SAAS,GAAG;;;;gBAIR,CAAA;YAEV,MAAM,SAAS,GAAG;;;;;mCAKW,CAAA;YAE7B,MAAM,SAAS,GAAG;;;;uBAID,CAAA;YAEjB,oBAAoB;YACpB,IAAI,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YACjC,IAAI,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAC7C,IAAI,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAA;YACxE,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAEpC,uBAAuB;YACvB,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YAC7B,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YACzC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAA;YACpE,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAEpC,qBAAqB;YACrB,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YAC7B,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YACzC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAA;YACpE,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YACpC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;YAClD,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QACvD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -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"}
|