nx-json-parser 1.1.0 → 1.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/dist/parser.d.ts CHANGED
@@ -25,5 +25,7 @@ export declare class RemarkParser {
25
25
  */
26
26
  sectionsToObject(sections: MarkdownSection[]): Record<string, any>;
27
27
  private mergeAndPushSection;
28
+ private nodeToString;
29
+ private shouldMergeAsContent;
28
30
  }
29
31
  //# sourceMappingURL=parser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAc,aAAa,EAAE,MAAM,YAAY,CAAC;AAIxE,qBAAa,YAAY;IACrB,OAAO,CAAC,SAAS,CAEG;IAEpB,OAAO,CAAC,OAAO,CAA0B;gBAE7B,OAAO,GAAE,aAAkB;IAOvC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE;IAmF1C;;OAEG;IACH,OAAO,CAAC,cAAc;IA+BtB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAuE9B;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAoBpB;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAWlE,OAAO,CAAC,mBAAmB;CA0B9B"}
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAc,aAAa,EAAE,MAAM,YAAY,CAAC;AAIxE,qBAAa,YAAY;IACrB,OAAO,CAAC,SAAS,CAEG;IAEpB,OAAO,CAAC,OAAO,CAA0B;gBAE7B,OAAO,GAAE,aAAkB;IAOvC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE;IAuI1C;;OAEG;IACH,OAAO,CAAC,cAAc;IA+BtB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAuE9B;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAoBpB;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAWlE,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,oBAAoB;CAiC/B"}
package/dist/parser.js CHANGED
@@ -49,7 +49,7 @@ export class RemarkParser {
49
49
  };
50
50
  currentNodes = [];
51
51
  }
52
- else if (node.type === 'list' && bulletMode === BulletMode.SECTIONS) {
52
+ else if (node.type === 'list' && !node.ordered && bulletMode === BulletMode.SECTIONS) {
53
53
  // Bullet-style sections mode: each root-level bullet is a section
54
54
  if (currentSection) {
55
55
  this.mergeAndPushSection(sections, currentSection, currentNodes, bulletMode);
@@ -58,17 +58,64 @@ export class RemarkParser {
58
58
  }
59
59
  // Process each list item as a section
60
60
  const newSections = [];
61
+ // If we have a current section pending content, and this list is just text items, maybe it belongs to currentSection?
62
+ // But detect-bullet-mode says SECTIONS. So we expect sections.
61
63
  for (const listItem of node.children) {
62
64
  newSections.push(...this.processBulletAsSection(listItem));
63
65
  }
64
66
  if (newSections.length > 0) {
67
+ // Refined Sibling Logic:
68
+ // If a section has empty content, and is followed by sections that look like simple items...
69
+ // But processBulletAsSection transforms every item into a section.
70
+ // We need to merge them if they are actually content.
71
+ // Post-processing merge:
72
+ const mergedSections = [];
73
+ let activeSection = null;
74
+ for (const sec of newSections) {
75
+ // Heuristic: Is this really a section or just an item?
76
+ // If detect-bullet-mode said SECTIONS, usually we trust it.
77
+ // But for mixed lists: "- Assumptions" (sec) "- Item 1" (sec?) "- Item 2" (sec?)
78
+ // Check if 'sec' looks like a property or a value.
79
+ // Ideally strictly, everything is a property.
80
+ // But in the test case "- Assumptions \n - Val 1 \n - Val 2",
81
+ // they are siblings.
82
+ if (activeSection && this.shouldMergeAsContent(activeSection, sec)) {
83
+ // Merge content
84
+ if (!activeSection.content) {
85
+ activeSection.content = [sec.heading]; // Use heading as value
86
+ }
87
+ else if (Array.isArray(activeSection.content)) {
88
+ activeSection.content.push(sec.heading);
89
+ }
90
+ else {
91
+ // Convert existing string content to array? Or mix?
92
+ activeSection.content = [activeSection.content, sec.heading];
93
+ }
94
+ // APPEND any content of sec as well?
95
+ if (sec.content) {
96
+ if (Array.isArray(sec.content)) {
97
+ activeSection.content.push(...sec.content);
98
+ }
99
+ else {
100
+ activeSection.content.push(sec.content);
101
+ }
102
+ }
103
+ }
104
+ else {
105
+ activeSection = sec;
106
+ mergedSections.push(sec);
107
+ }
108
+ }
65
109
  // Push all except the last one as complete sections
66
- for (let i = 0; i < newSections.length - 1; i++) {
67
- sections.push(newSections[i]);
110
+ if (mergedSections.length > 0) {
111
+ for (let i = 0; i < mergedSections.length - 1; i++) {
112
+ sections.push(mergedSections[i]);
113
+ }
114
+ // Keep the last one as currentSection to capture subsequent loose content
115
+ currentSection = mergedSections[mergedSections.length - 1];
68
116
  }
69
- // Keep the last one as currentSection to capture subsequent loose content
70
- currentSection = newSections[newSections.length - 1];
71
117
  }
118
+ // Original simple loop removed in favor of refined logic above
72
119
  }
73
120
  else {
74
121
  currentNodes.push(node);
@@ -170,9 +217,9 @@ export class RemarkParser {
170
217
  };
171
218
  }
172
219
  else {
173
- // Only paragraphs/text content
220
+ // Flatten all other children into text
174
221
  const nodeText = contentNodes
175
- .map((node) => toString(node))
222
+ .map((node) => this.nodeToString(node))
176
223
  .join('\n\n')
177
224
  .trim();
178
225
  content = sameNodeContent ? sameNodeContent + '\n\n' + nodeText : nodeText;
@@ -227,12 +274,7 @@ export class RemarkParser {
227
274
  return result;
228
275
  }
229
276
  mergeAndPushSection(sections, section, nodes, bulletMode) {
230
- // If the section is already in the list (because we pushed it in the loop but kept a reference),
231
- // we shouldn't push it again?
232
- // Wait, my logic implementation in loop:
233
- // "newSections.push(...); if (newSections.length > 0) { ... loop push n-1 ... currentSection = nth }"
234
- // So currentSection is NOT in sections yet.
235
- // It's safe to push.
277
+ // ... (existing implementation)
236
278
  const newContent = this.processContent(nodes, bulletMode);
237
279
  if (newContent) {
238
280
  if (!section.content) {
@@ -252,5 +294,42 @@ export class RemarkParser {
252
294
  }
253
295
  sections.push(section);
254
296
  }
297
+ nodeToString(node) {
298
+ if (node.type === 'table') {
299
+ return JSON.stringify(this.tableToArray(node));
300
+ }
301
+ if (node.type === 'list') {
302
+ return this.listToArray(node).map(item => `- ${item}`).join('\n');
303
+ }
304
+ return toString(node);
305
+ }
306
+ shouldMergeAsContent(parent, child) {
307
+ // Decide if 'child' should be merged into 'parent' content instead of being a new section.
308
+ // 1. If child has no content and is short?
309
+ // 2. If parent matches known strictly-list sections (Assumptions, Evidence, Unknowns)
310
+ // List of keys that usually contain lists of items as siblings in badly formatted markdown
311
+ const LIST_SECTIONS = [
312
+ 'assumptions',
313
+ 'unknowns',
314
+ 'evidence',
315
+ 'examples',
316
+ 'notes',
317
+ 'analysis',
318
+ 'findings',
319
+ 'recommendations',
320
+ 'considerations'
321
+ ];
322
+ const parentKey = toCamelCase(parent.heading);
323
+ const childKey = toCamelCase(child.heading);
324
+ // If the child is itself a known list section, do NOT merge it.
325
+ // It should be a new section.
326
+ if (LIST_SECTIONS.includes(childKey)) {
327
+ return false;
328
+ }
329
+ if (LIST_SECTIONS.includes(parentKey)) {
330
+ return true;
331
+ }
332
+ return false;
333
+ }
255
334
  }
256
335
  //# sourceMappingURL=parser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"detect-bullet-mode.d.ts","sourceRoot":"","sources":["../../src/plugins/detect-bullet-mode.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,GAAG,UAAU,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAUD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,GAAG,GAAG,gBAAgB,CA4I5D"}
1
+ {"version":3,"file":"detect-bullet-mode.d.ts","sourceRoot":"","sources":["../../src/plugins/detect-bullet-mode.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,OAAO,GAAG,UAAU,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACrB;AAWD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,GAAG,GAAG,gBAAgB,CA8I5D"}
@@ -8,7 +8,8 @@ const SECTION_KEYWORDS = [
8
8
  'assumptions', 'unknowns', 'evidence', 'notes', 'details',
9
9
  'description', 'background', 'analysis', 'findings', 'recommendations',
10
10
  'data', 'identity', 'network', 'security', 'monitoring', 'governance',
11
- 'availability', 'backup', 'patch', 'operational', 'provider'
11
+ 'availability', 'backup', 'patch', 'operational', 'provider',
12
+ 'short', 'full', 'long' // Added common answer prefixes
12
13
  ];
13
14
  export function detectBulletMode(tree) {
14
15
  const reasons = [];
@@ -78,8 +79,9 @@ export function detectBulletMode(tree) {
78
79
  reasons.push(`${bulletsWithNestedLists} bullets have nested lists - section indicator`);
79
80
  }
80
81
  if (bulletsWithKeywords > 0) {
81
- sectionScore += 2;
82
- reasons.push(`${bulletsWithKeywords} bullets contain section keywords`);
82
+ // Huge boost for keywords - these are almost certainly section headers
83
+ sectionScore += 10;
84
+ reasons.push(`${bulletsWithKeywords} bullets contain section keywords - STRONG section indicator`);
83
85
  }
84
86
  if (avgLength > 30) {
85
87
  sectionScore += 1;
@@ -90,9 +92,10 @@ export function detectBulletMode(tree) {
90
92
  reasons.push('Few bullets with rich content suggests sections');
91
93
  }
92
94
  // === SCORING FOR ARRAY MODE ===
93
- if (bulletsWithColons === 0 && bulletsWithContent === 0 && bulletsWithNestedLists === 0) {
95
+ if (bulletsWithColons === 0 && bulletsWithContent === 0 && bulletsWithNestedLists === 0 && bulletsWithKeywords === 0) {
96
+ // Only if NO keywords are found
94
97
  arrayScore += 4;
95
- reasons.push('No bullets have content, colons, or nesting - pure list indicator');
98
+ reasons.push('No bullets have content, colons, nesting, OR keywords - pure list indicator');
96
99
  }
97
100
  if (avgLength < 30) {
98
101
  arrayScore += 2;
@@ -1 +1 @@
1
- {"version":3,"file":"detect-bullet-mode.js","sourceRoot":"","sources":["../../src/plugins/detect-bullet-mode.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"detect-bullet-mode.js","sourceRoot":"","sources":["../../src/plugins/detect-bullet-mode.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nx-json-parser",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Transform strings to JSON based on Markdown structure using unified/remark",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
package/src/parser.ts CHANGED
@@ -59,7 +59,7 @@ export class RemarkParser {
59
59
  };
60
60
  currentNodes = [];
61
61
 
62
- } else if (node.type === 'list' && bulletMode === BulletMode.SECTIONS) {
62
+ } else if (node.type === 'list' && !node.ordered && bulletMode === BulletMode.SECTIONS) {
63
63
  // Bullet-style sections mode: each root-level bullet is a section
64
64
  if (currentSection) {
65
65
  this.mergeAndPushSection(sections, currentSection, currentNodes, bulletMode);
@@ -69,19 +69,71 @@ export class RemarkParser {
69
69
 
70
70
  // Process each list item as a section
71
71
  const newSections: MarkdownSection[] = [];
72
+
73
+ // If we have a current section pending content, and this list is just text items, maybe it belongs to currentSection?
74
+ // But detect-bullet-mode says SECTIONS. So we expect sections.
75
+
72
76
  for (const listItem of node.children) {
73
77
  newSections.push(...this.processBulletAsSection(listItem));
74
78
  }
75
79
 
76
80
  if (newSections.length > 0) {
81
+ // Refined Sibling Logic:
82
+ // If a section has empty content, and is followed by sections that look like simple items...
83
+ // But processBulletAsSection transforms every item into a section.
84
+ // We need to merge them if they are actually content.
85
+
86
+ // Post-processing merge:
87
+ const mergedSections: MarkdownSection[] = [];
88
+ let activeSection: MarkdownSection | null = null;
89
+
90
+ for (const sec of newSections) {
91
+ // Heuristic: Is this really a section or just an item?
92
+ // If detect-bullet-mode said SECTIONS, usually we trust it.
93
+ // But for mixed lists: "- Assumptions" (sec) "- Item 1" (sec?) "- Item 2" (sec?)
94
+
95
+ // Check if 'sec' looks like a property or a value.
96
+ // Ideally strictly, everything is a property.
97
+ // But in the test case "- Assumptions \n - Val 1 \n - Val 2",
98
+ // they are siblings.
99
+
100
+ if (activeSection && this.shouldMergeAsContent(activeSection, sec)) {
101
+ // Merge content
102
+ if (!activeSection.content) {
103
+ activeSection.content = [sec.heading]; // Use heading as value
104
+ } else if (Array.isArray(activeSection.content)) {
105
+ activeSection.content.push(sec.heading);
106
+ } else {
107
+ // Convert existing string content to array? Or mix?
108
+ activeSection.content = [activeSection.content, sec.heading];
109
+ }
110
+ // APPEND any content of sec as well?
111
+ if (sec.content) {
112
+ if (Array.isArray(sec.content)) {
113
+ (activeSection.content as any[]).push(...sec.content);
114
+ } else {
115
+ (activeSection.content as any[]).push(sec.content);
116
+ }
117
+ }
118
+ } else {
119
+ activeSection = sec;
120
+ mergedSections.push(sec);
121
+ }
122
+ }
123
+
77
124
  // Push all except the last one as complete sections
78
- for (let i = 0; i < newSections.length - 1; i++) {
79
- sections.push(newSections[i]!);
125
+ if (mergedSections.length > 0) {
126
+ for (let i = 0; i < mergedSections.length - 1; i++) {
127
+ sections.push(mergedSections[i]!);
128
+ }
129
+ // Keep the last one as currentSection to capture subsequent loose content
130
+ currentSection = mergedSections[mergedSections.length - 1]!;
80
131
  }
81
- // Keep the last one as currentSection to capture subsequent loose content
82
- currentSection = newSections[newSections.length - 1]!;
83
132
  }
84
133
 
134
+
135
+ // Original simple loop removed in favor of refined logic above
136
+
85
137
  } else {
86
138
  currentNodes.push(node);
87
139
  }
@@ -192,9 +244,9 @@ export class RemarkParser {
192
244
  items: nestedArray
193
245
  };
194
246
  } else {
195
- // Only paragraphs/text content
247
+ // Flatten all other children into text
196
248
  const nodeText = contentNodes
197
- .map((node: any) => toString(node))
249
+ .map((node: any) => this.nodeToString(node))
198
250
  .join('\n\n')
199
251
  .trim();
200
252
  content = sameNodeContent ? sameNodeContent + '\n\n' + nodeText : nodeText;
@@ -260,13 +312,7 @@ export class RemarkParser {
260
312
  }
261
313
 
262
314
  private mergeAndPushSection(sections: MarkdownSection[], section: MarkdownSection, nodes: any[], bulletMode: BulletMode) {
263
- // If the section is already in the list (because we pushed it in the loop but kept a reference),
264
- // we shouldn't push it again?
265
- // Wait, my logic implementation in loop:
266
- // "newSections.push(...); if (newSections.length > 0) { ... loop push n-1 ... currentSection = nth }"
267
- // So currentSection is NOT in sections yet.
268
- // It's safe to push.
269
-
315
+ // ... (existing implementation)
270
316
  const newContent = this.processContent(nodes, bulletMode);
271
317
 
272
318
  if (newContent) {
@@ -285,4 +331,47 @@ export class RemarkParser {
285
331
 
286
332
  sections.push(section);
287
333
  }
334
+
335
+ private nodeToString(node: any): string {
336
+ if (node.type === 'table') {
337
+ return JSON.stringify(this.tableToArray(node));
338
+ }
339
+ if (node.type === 'list') {
340
+ return this.listToArray(node).map(item => `- ${item}`).join('\n');
341
+ }
342
+ return toString(node);
343
+ }
344
+ private shouldMergeAsContent(parent: MarkdownSection, child: MarkdownSection): boolean {
345
+ // Decide if 'child' should be merged into 'parent' content instead of being a new section.
346
+
347
+ // 1. If child has no content and is short?
348
+ // 2. If parent matches known strictly-list sections (Assumptions, Evidence, Unknowns)
349
+
350
+ // List of keys that usually contain lists of items as siblings in badly formatted markdown
351
+ const LIST_SECTIONS = [
352
+ 'assumptions',
353
+ 'unknowns',
354
+ 'evidence',
355
+ 'examples',
356
+ 'notes',
357
+ 'analysis',
358
+ 'findings',
359
+ 'recommendations',
360
+ 'considerations'
361
+ ];
362
+ const parentKey = toCamelCase(parent.heading);
363
+ const childKey = toCamelCase(child.heading);
364
+
365
+ // If the child is itself a known list section, do NOT merge it.
366
+ // It should be a new section.
367
+ if (LIST_SECTIONS.includes(childKey)) {
368
+ return false;
369
+ }
370
+
371
+ if (LIST_SECTIONS.includes(parentKey)) {
372
+ return true;
373
+ }
374
+
375
+ return false;
376
+ }
288
377
  }
@@ -5,157 +5,160 @@ import { visit } from 'unist-util-visit';
5
5
  import { toString } from 'mdast-util-to-string';
6
6
 
7
7
  export interface BulletModeResult {
8
- mode: 'array' | 'sections';
9
- confidence: number;
10
- reasons: string[];
8
+ mode: 'array' | 'sections';
9
+ confidence: number;
10
+ reasons: string[];
11
11
  }
12
12
 
13
13
  const SECTION_KEYWORDS = [
14
- 'answer', 'summary', 'introduction', 'conclusion', 'overview',
15
- 'assumptions', 'unknowns', 'evidence', 'notes', 'details',
16
- 'description', 'background', 'analysis', 'findings', 'recommendations',
17
- 'data', 'identity', 'network', 'security', 'monitoring', 'governance',
18
- 'availability', 'backup', 'patch', 'operational', 'provider'
14
+ 'answer', 'summary', 'introduction', 'conclusion', 'overview',
15
+ 'assumptions', 'unknowns', 'evidence', 'notes', 'details',
16
+ 'description', 'background', 'analysis', 'findings', 'recommendations',
17
+ 'data', 'identity', 'network', 'security', 'monitoring', 'governance',
18
+ 'availability', 'backup', 'patch', 'operational', 'provider',
19
+ 'short', 'full', 'long' // Added common answer prefixes
19
20
  ];
20
21
 
21
22
  export function detectBulletMode(tree: any): BulletModeResult {
22
- const reasons: string[] = [];
23
- let sectionScore = 0;
24
- let arrayScore = 0;
25
-
26
- let bulletCount = 0;
27
- let bulletsWithContent = 0;
28
- let bulletsWithColons = 0;
29
- let bulletsWithNestedLists = 0;
30
- let bulletsWithKeywords = 0;
31
- let totalBulletLength = 0;
32
- let rootLevelBullets = 0;
33
-
34
- // Analyze the tree structure
35
- visit(tree, 'list', (listNode: any, index?: number, parent?: any) => {
36
- // Only analyze root-level lists or lists directly under root
37
- const isRootLevel = parent?.type === 'root';
38
-
39
- if (!isRootLevel) return;
40
-
41
- rootLevelBullets += listNode.children.length;
42
-
43
- for (const listItem of listNode.children) {
44
- bulletCount++;
45
-
46
- // Get the text of this list item (first paragraph/text only)
47
- const firstChild = listItem.children[0];
48
- const itemText = firstChild ? toString(firstChild) : '';
49
- totalBulletLength += itemText.length;
50
-
51
- // 1. Check for colons (title pattern: "Short answer:" or "Data protection:")
52
- if (itemText.includes(':')) {
53
- bulletsWithColons++;
54
- }
55
-
56
- // 2. Check for content after the bullet (paragraphs, nested items)
57
- if (listItem.children.length > 1) {
58
- bulletsWithContent++;
59
- }
60
-
61
- // 3. Check for nested lists
62
- const hasNestedList = listItem.children.some((child: any) => child.type === 'list');
63
- if (hasNestedList) {
64
- bulletsWithNestedLists++;
65
- }
66
-
67
- // 4. Check for section keywords
68
- const lowerText = itemText.toLowerCase();
69
- if (SECTION_KEYWORDS.some(kw => lowerText.includes(kw))) {
70
- bulletsWithKeywords++;
71
- }
23
+ const reasons: string[] = [];
24
+ let sectionScore = 0;
25
+ let arrayScore = 0;
26
+
27
+ let bulletCount = 0;
28
+ let bulletsWithContent = 0;
29
+ let bulletsWithColons = 0;
30
+ let bulletsWithNestedLists = 0;
31
+ let bulletsWithKeywords = 0;
32
+ let totalBulletLength = 0;
33
+ let rootLevelBullets = 0;
34
+
35
+ // Analyze the tree structure
36
+ visit(tree, 'list', (listNode: any, index?: number, parent?: any) => {
37
+ // Only analyze root-level lists or lists directly under root
38
+ const isRootLevel = parent?.type === 'root';
39
+
40
+ if (!isRootLevel) return;
41
+
42
+ rootLevelBullets += listNode.children.length;
43
+
44
+ for (const listItem of listNode.children) {
45
+ bulletCount++;
46
+
47
+ // Get the text of this list item (first paragraph/text only)
48
+ const firstChild = listItem.children[0];
49
+ const itemText = firstChild ? toString(firstChild) : '';
50
+ totalBulletLength += itemText.length;
51
+
52
+ // 1. Check for colons (title pattern: "Short answer:" or "Data protection:")
53
+ if (itemText.includes(':')) {
54
+ bulletsWithColons++;
55
+ }
56
+
57
+ // 2. Check for content after the bullet (paragraphs, nested items)
58
+ if (listItem.children.length > 1) {
59
+ bulletsWithContent++;
60
+ }
61
+
62
+ // 3. Check for nested lists
63
+ const hasNestedList = listItem.children.some((child: any) => child.type === 'list');
64
+ if (hasNestedList) {
65
+ bulletsWithNestedLists++;
66
+ }
67
+
68
+ // 4. Check for section keywords
69
+ const lowerText = itemText.toLowerCase();
70
+ if (SECTION_KEYWORDS.some(kw => lowerText.includes(kw))) {
71
+ bulletsWithKeywords++;
72
+ }
73
+ }
74
+ });
75
+
76
+ if (bulletCount === 0) {
77
+ return {
78
+ mode: 'array',
79
+ confidence: 0,
80
+ reasons: ['No bullets found']
81
+ };
72
82
  }
73
- });
74
83
 
75
- if (bulletCount === 0) {
84
+ const avgLength = totalBulletLength / bulletCount;
85
+
86
+ // === SCORING FOR SECTIONS MODE ===
87
+
88
+ if (bulletsWithColons > 0) {
89
+ const percent = (bulletsWithColons / bulletCount * 100).toFixed(0);
90
+ sectionScore += 3;
91
+ reasons.push(`${bulletsWithColons}/${bulletCount} bullets have colons (${percent}%) - strong section indicator`);
92
+ }
93
+
94
+ if (bulletsWithContent > 0) {
95
+ const percent = (bulletsWithContent / bulletCount * 100).toFixed(0);
96
+ sectionScore += 3;
97
+ reasons.push(`${bulletsWithContent}/${bulletCount} bullets have content below (${percent}%) - strong section indicator`);
98
+ }
99
+
100
+ if (bulletsWithNestedLists > 0) {
101
+ sectionScore += 2;
102
+ reasons.push(`${bulletsWithNestedLists} bullets have nested lists - section indicator`);
103
+ }
104
+
105
+ if (bulletsWithKeywords > 0) {
106
+ // Huge boost for keywords - these are almost certainly section headers
107
+ sectionScore += 10;
108
+ reasons.push(`${bulletsWithKeywords} bullets contain section keywords - STRONG section indicator`);
109
+ }
110
+
111
+ if (avgLength > 30) {
112
+ sectionScore += 1;
113
+ reasons.push(`Long bullet text (avg ${avgLength.toFixed(0)} chars) - suggests titles`);
114
+ }
115
+
116
+ if (bulletCount <= 5 && (bulletsWithContent > 0 || bulletsWithColons > 0)) {
117
+ sectionScore += 1;
118
+ reasons.push('Few bullets with rich content suggests sections');
119
+ }
120
+
121
+ // === SCORING FOR ARRAY MODE ===
122
+
123
+ if (bulletsWithColons === 0 && bulletsWithContent === 0 && bulletsWithNestedLists === 0 && bulletsWithKeywords === 0) {
124
+ // Only if NO keywords are found
125
+ arrayScore += 4;
126
+ reasons.push('No bullets have content, colons, nesting, OR keywords - pure list indicator');
127
+ }
128
+
129
+ if (avgLength < 30) {
130
+ arrayScore += 2;
131
+ reasons.push(`Short bullet text (avg ${avgLength.toFixed(0)} chars) - suggests list items`);
132
+ }
133
+
134
+ if (bulletCount >= 3 && bulletsWithContent === 0) {
135
+ arrayScore += 2;
136
+ reasons.push(`${bulletCount} simple bullets without content - array pattern`);
137
+ }
138
+
139
+ if (bulletsWithKeywords === 0) {
140
+ arrayScore += 1;
141
+ reasons.push('No section keywords found');
142
+ }
143
+
144
+ // Edge case: all bullets are very short and no special features
145
+ if (avgLength < 20 && bulletsWithContent === 0 && bulletsWithColons === 0) {
146
+ arrayScore += 2;
147
+ reasons.push('Very short bullets with no features - definitely array');
148
+ }
149
+
150
+ // === DECISION ===
151
+
152
+ const totalScore = sectionScore + arrayScore;
153
+ const mode = sectionScore > arrayScore ? 'sections' : 'array';
154
+ const confidence = totalScore > 0 ? Math.abs(sectionScore - arrayScore) / totalScore : 0;
155
+
156
+ // Format reasons (top 5)
157
+ const topReasons = reasons.slice(0, 5);
158
+
76
159
  return {
77
- mode: 'array',
78
- confidence: 0,
79
- reasons: ['No bullets found']
160
+ mode,
161
+ confidence,
162
+ reasons: topReasons
80
163
  };
81
- }
82
-
83
- const avgLength = totalBulletLength / bulletCount;
84
-
85
- // === SCORING FOR SECTIONS MODE ===
86
-
87
- if (bulletsWithColons > 0) {
88
- const percent = (bulletsWithColons / bulletCount * 100).toFixed(0);
89
- sectionScore += 3;
90
- reasons.push(`${bulletsWithColons}/${bulletCount} bullets have colons (${percent}%) - strong section indicator`);
91
- }
92
-
93
- if (bulletsWithContent > 0) {
94
- const percent = (bulletsWithContent / bulletCount * 100).toFixed(0);
95
- sectionScore += 3;
96
- reasons.push(`${bulletsWithContent}/${bulletCount} bullets have content below (${percent}%) - strong section indicator`);
97
- }
98
-
99
- if (bulletsWithNestedLists > 0) {
100
- sectionScore += 2;
101
- reasons.push(`${bulletsWithNestedLists} bullets have nested lists - section indicator`);
102
- }
103
-
104
- if (bulletsWithKeywords > 0) {
105
- sectionScore += 2;
106
- reasons.push(`${bulletsWithKeywords} bullets contain section keywords`);
107
- }
108
-
109
- if (avgLength > 30) {
110
- sectionScore += 1;
111
- reasons.push(`Long bullet text (avg ${avgLength.toFixed(0)} chars) - suggests titles`);
112
- }
113
-
114
- if (bulletCount <= 5 && (bulletsWithContent > 0 || bulletsWithColons > 0)) {
115
- sectionScore += 1;
116
- reasons.push('Few bullets with rich content suggests sections');
117
- }
118
-
119
- // === SCORING FOR ARRAY MODE ===
120
-
121
- if (bulletsWithColons === 0 && bulletsWithContent === 0 && bulletsWithNestedLists === 0) {
122
- arrayScore += 4;
123
- reasons.push('No bullets have content, colons, or nesting - pure list indicator');
124
- }
125
-
126
- if (avgLength < 30) {
127
- arrayScore += 2;
128
- reasons.push(`Short bullet text (avg ${avgLength.toFixed(0)} chars) - suggests list items`);
129
- }
130
-
131
- if (bulletCount >= 3 && bulletsWithContent === 0) {
132
- arrayScore += 2;
133
- reasons.push(`${bulletCount} simple bullets without content - array pattern`);
134
- }
135
-
136
- if (bulletsWithKeywords === 0) {
137
- arrayScore += 1;
138
- reasons.push('No section keywords found');
139
- }
140
-
141
- // Edge case: all bullets are very short and no special features
142
- if (avgLength < 20 && bulletsWithContent === 0 && bulletsWithColons === 0) {
143
- arrayScore += 2;
144
- reasons.push('Very short bullets with no features - definitely array');
145
- }
146
-
147
- // === DECISION ===
148
-
149
- const totalScore = sectionScore + arrayScore;
150
- const mode = sectionScore > arrayScore ? 'sections' : 'array';
151
- const confidence = totalScore > 0 ? Math.abs(sectionScore - arrayScore) / totalScore : 0;
152
-
153
- // Format reasons (top 5)
154
- const topReasons = reasons.slice(0, 5);
155
-
156
- return {
157
- mode,
158
- confidence,
159
- reasons: topReasons
160
- };
161
164
  }
@@ -1,7 +1,7 @@
1
1
  import { markdownToJson } from '../src/index.js';
2
2
 
3
3
  describe('nx-json-parser - Complex Input', () => {
4
- const str = `- Short answer
4
+ const str = `- Short answer
5
5
  Key considerations include data protection (encryption at rest and in transit), strong access control and IAM, secure network design, configuration and patch management, monitoring and logging, backups and disaster recovery, compliance and governance, and a clear shared responsibility model with incident response planning.
6
6
 
7
7
  - Full answer
@@ -87,17 +87,17 @@ Deploying a database in the cloud shifts part of the security burden to the clou
87
87
  11. Data residency considerations: Data localization requirements can influence data storage and transfer controls.
88
88
  12. Vendor/service model considerations: Clear understanding of the provider’s and customer’s security responsibilities and controls is essential for effective security posture.`;
89
89
 
90
- it('should parse the large security overview correctly', () => {
91
- const result = markdownToJson(str);
90
+ it('should parse the large security overview correctly', () => {
91
+ const result = markdownToJson(str);
92
92
 
93
- expect(result.shortAnswer).toBeDefined();
94
- expect(result.fullAnswer).toBeDefined();
95
- expect(result.dataProtection).toBeDefined();
96
- expect(result.accessControlAndIdentityManagement).toBeDefined();
97
- expect(result.assumptions).toBeInstanceOf(Array);
98
- expect(result.evidence).toBeInstanceOf(Array);
93
+ expect(result.shortAnswer).toBeDefined();
94
+ expect(result.fullAnswer).toBeDefined();
95
+ expect(result.dataProtection).toBeDefined();
96
+ expect(result.accessControlAndIdentityManagement).toBeDefined();
97
+ expect(result.assumptions).toBeInstanceOf(Array);
98
+ expect(result.evidence).toBeInstanceOf(Array);
99
99
 
100
- expect((result.evidence as string[]).length).toBe(12);
101
- expect(result.shortAnswer).toContain('Key considerations include data protection');
102
- });
100
+ expect((result.evidence as string[]).length).toBe(12);
101
+ expect(result.shortAnswer).toContain('Key considerations include data protection');
102
+ });
103
103
  });