learngraph 0.1.1 → 0.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 (96) hide show
  1. package/LICENSE +190 -21
  2. package/README.md +83 -2
  3. package/dist/cjs/parsers/base.js +189 -0
  4. package/dist/cjs/parsers/base.js.map +1 -0
  5. package/dist/cjs/parsers/demo.js +159 -0
  6. package/dist/cjs/parsers/demo.js.map +1 -0
  7. package/dist/cjs/parsers/extractor.js +191 -0
  8. package/dist/cjs/parsers/extractor.js.map +1 -0
  9. package/dist/cjs/parsers/index.js +43 -4
  10. package/dist/cjs/parsers/index.js.map +1 -1
  11. package/dist/cjs/parsers/json.js +157 -0
  12. package/dist/cjs/parsers/json.js.map +1 -0
  13. package/dist/cjs/parsers/markdown.js +168 -0
  14. package/dist/cjs/parsers/markdown.js.map +1 -0
  15. package/dist/cjs/parsers/samples.js +139 -0
  16. package/dist/cjs/parsers/samples.js.map +1 -0
  17. package/dist/cjs/storage/base.js +231 -0
  18. package/dist/cjs/storage/base.js.map +1 -0
  19. package/dist/cjs/storage/errors.js +128 -0
  20. package/dist/cjs/storage/errors.js.map +1 -0
  21. package/dist/cjs/storage/index.js +92 -5
  22. package/dist/cjs/storage/index.js.map +1 -1
  23. package/dist/cjs/storage/levelgraph.js +855 -0
  24. package/dist/cjs/storage/levelgraph.js.map +1 -0
  25. package/dist/cjs/storage/memory.js +447 -0
  26. package/dist/cjs/storage/memory.js.map +1 -0
  27. package/dist/cjs/storage/neo4j.js +866 -0
  28. package/dist/cjs/storage/neo4j.js.map +1 -0
  29. package/dist/cjs/storage/seeds.js +565 -0
  30. package/dist/cjs/storage/seeds.js.map +1 -0
  31. package/dist/cjs/types/parser.js +8 -0
  32. package/dist/cjs/types/parser.js.map +1 -0
  33. package/dist/esm/parsers/base.js +179 -0
  34. package/dist/esm/parsers/base.js.map +1 -0
  35. package/dist/esm/parsers/demo.js +154 -0
  36. package/dist/esm/parsers/demo.js.map +1 -0
  37. package/dist/esm/parsers/extractor.js +187 -0
  38. package/dist/esm/parsers/extractor.js.map +1 -0
  39. package/dist/esm/parsers/index.js +24 -5
  40. package/dist/esm/parsers/index.js.map +1 -1
  41. package/dist/esm/parsers/json.js +153 -0
  42. package/dist/esm/parsers/json.js.map +1 -0
  43. package/dist/esm/parsers/markdown.js +164 -0
  44. package/dist/esm/parsers/markdown.js.map +1 -0
  45. package/dist/esm/parsers/samples.js +136 -0
  46. package/dist/esm/parsers/samples.js.map +1 -0
  47. package/dist/esm/storage/base.js +221 -0
  48. package/dist/esm/storage/base.js.map +1 -0
  49. package/dist/esm/storage/errors.js +116 -0
  50. package/dist/esm/storage/errors.js.map +1 -0
  51. package/dist/esm/storage/index.js +71 -6
  52. package/dist/esm/storage/index.js.map +1 -1
  53. package/dist/esm/storage/levelgraph.js +818 -0
  54. package/dist/esm/storage/levelgraph.js.map +1 -0
  55. package/dist/esm/storage/memory.js +443 -0
  56. package/dist/esm/storage/memory.js.map +1 -0
  57. package/dist/esm/storage/neo4j.js +829 -0
  58. package/dist/esm/storage/neo4j.js.map +1 -0
  59. package/dist/esm/storage/seeds.js +561 -0
  60. package/dist/esm/storage/seeds.js.map +1 -0
  61. package/dist/esm/types/parser.js +7 -0
  62. package/dist/esm/types/parser.js.map +1 -0
  63. package/dist/types/parsers/base.d.ts +39 -0
  64. package/dist/types/parsers/base.d.ts.map +1 -0
  65. package/dist/types/parsers/demo.d.ts +87 -0
  66. package/dist/types/parsers/demo.d.ts.map +1 -0
  67. package/dist/types/parsers/extractor.d.ts +43 -0
  68. package/dist/types/parsers/extractor.d.ts.map +1 -0
  69. package/dist/types/parsers/index.d.ts +10 -0
  70. package/dist/types/parsers/index.d.ts.map +1 -1
  71. package/dist/types/parsers/json.d.ts +71 -0
  72. package/dist/types/parsers/json.d.ts.map +1 -0
  73. package/dist/types/parsers/markdown.d.ts +43 -0
  74. package/dist/types/parsers/markdown.d.ts.map +1 -0
  75. package/dist/types/parsers/samples.d.ts +27 -0
  76. package/dist/types/parsers/samples.d.ts.map +1 -0
  77. package/dist/types/storage/base.d.ts +39 -0
  78. package/dist/types/storage/base.d.ts.map +1 -0
  79. package/dist/types/storage/errors.d.ts +74 -0
  80. package/dist/types/storage/errors.d.ts.map +1 -0
  81. package/dist/types/storage/index.d.ts +50 -2
  82. package/dist/types/storage/index.d.ts.map +1 -1
  83. package/dist/types/storage/levelgraph.d.ts +92 -0
  84. package/dist/types/storage/levelgraph.d.ts.map +1 -0
  85. package/dist/types/storage/memory.d.ts +70 -0
  86. package/dist/types/storage/memory.d.ts.map +1 -0
  87. package/dist/types/storage/neo4j.d.ts +88 -0
  88. package/dist/types/storage/neo4j.d.ts.map +1 -0
  89. package/dist/types/storage/seeds.d.ts +27 -0
  90. package/dist/types/storage/seeds.d.ts.map +1 -0
  91. package/dist/types/types/index.d.ts +1 -0
  92. package/dist/types/types/index.d.ts.map +1 -1
  93. package/dist/types/types/parser.d.ts +208 -0
  94. package/dist/types/types/parser.d.ts.map +1 -0
  95. package/package.json +4 -2
  96. package/scripts/postinstall.js +68 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.js","sourceRoot":"","sources":["../../../src/parsers/demo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ /**
3
+ * Skill extractor - converts parsed syllabi into graph-ready skills
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.BasicExtractor = exports.DEFAULT_EXTRACTION_OPTIONS = void 0;
9
+ const base_js_1 = require("./base.js");
10
+ /**
11
+ * Default extraction options
12
+ */
13
+ exports.DEFAULT_EXTRACTION_OPTIONS = {
14
+ detectBloom: true,
15
+ extractTime: true,
16
+ suggestNames: true,
17
+ includeRaw: false,
18
+ sectionHeaders: [],
19
+ objectiveMarkers: [],
20
+ defaultDifficulty: 0.5,
21
+ defaultMasteryThreshold: 0.8,
22
+ defaultEstimatedMinutes: 30,
23
+ tags: [],
24
+ domain: '',
25
+ gradeLevel: '',
26
+ };
27
+ /**
28
+ * Map Bloom's level to difficulty estimate
29
+ */
30
+ function bloomToDifficulty(level) {
31
+ switch (level) {
32
+ case 'remember':
33
+ return 0.2;
34
+ case 'understand':
35
+ return 0.35;
36
+ case 'apply':
37
+ return 0.5;
38
+ case 'analyze':
39
+ return 0.65;
40
+ case 'evaluate':
41
+ return 0.8;
42
+ case 'create':
43
+ return 0.9;
44
+ default:
45
+ return 0.5;
46
+ }
47
+ }
48
+ /**
49
+ * Basic skill extractor
50
+ *
51
+ * Converts parsed syllabus content into skills ready for graph storage.
52
+ *
53
+ * @example
54
+ * ```typescript
55
+ * import { MarkdownParser, BasicExtractor } from 'learngraph/parsers';
56
+ *
57
+ * const parser = new MarkdownParser();
58
+ * const extractor = new BasicExtractor();
59
+ *
60
+ * const parseResult = await parser.parse(syllabusMarkdown);
61
+ * const extraction = await extractor.extract(parseResult, {
62
+ * tags: ['physics', 'intro'],
63
+ * domain: 'Physics',
64
+ * gradeLevel: 'Undergraduate'
65
+ * });
66
+ *
67
+ * // Now create skills in storage
68
+ * for (const { skill } of extraction.skills) {
69
+ * await storage.createSkill(skill);
70
+ * }
71
+ * ```
72
+ */
73
+ class BasicExtractor {
74
+ async extract(parseResult, options) {
75
+ const opts = { ...exports.DEFAULT_EXTRACTION_OPTIONS, ...options };
76
+ const skills = [];
77
+ const warnings = [];
78
+ const skillNames = new Set();
79
+ // Helper to create skill from objective
80
+ const createSkillFromObjective = (objective, topic, moduleTitle) => {
81
+ const name = objective.suggestedName || (0, base_js_1.objectiveToSkillName)(objective.text);
82
+ // Skip duplicates
83
+ if (skillNames.has(name.toLowerCase())) {
84
+ return null;
85
+ }
86
+ skillNames.add(name.toLowerCase());
87
+ const difficulty = objective.bloomLevel
88
+ ? bloomToDifficulty(objective.bloomLevel)
89
+ : opts.defaultDifficulty;
90
+ const skill = {
91
+ name,
92
+ description: objective.text,
93
+ bloomLevel: objective.bloomLevel || 'understand',
94
+ difficulty,
95
+ isThresholdConcept: objective.bloomLevel === 'analyze' || objective.bloomLevel === 'evaluate',
96
+ masteryThreshold: opts.defaultMasteryThreshold,
97
+ estimatedMinutes: topic?.estimatedMinutes || opts.defaultEstimatedMinutes,
98
+ tags: [
99
+ ...opts.tags,
100
+ ...(moduleTitle ? [moduleTitle.toLowerCase().replace(/[^a-z0-9]+/g, '-')] : []),
101
+ ],
102
+ metadata: {
103
+ source: parseResult.metadata.source,
104
+ section: objective.section,
105
+ week: objective.week,
106
+ },
107
+ };
108
+ // Add optional fields
109
+ if (opts.domain) {
110
+ skill.domain = opts.domain;
111
+ }
112
+ if (opts.gradeLevel) {
113
+ skill.gradeLevel = opts.gradeLevel;
114
+ }
115
+ return {
116
+ skill,
117
+ source: objective,
118
+ confidence: objective.bloomConfidence || 0.7,
119
+ };
120
+ };
121
+ // Extract from standalone objectives
122
+ for (const objective of parseResult.objectives) {
123
+ const extracted = createSkillFromObjective(objective);
124
+ if (extracted)
125
+ skills.push(extracted);
126
+ }
127
+ // Extract from standalone topics
128
+ for (const topic of parseResult.topics) {
129
+ for (const objective of topic.objectives) {
130
+ const extracted = createSkillFromObjective(objective, topic);
131
+ if (extracted)
132
+ skills.push(extracted);
133
+ }
134
+ }
135
+ // Extract from modules
136
+ for (const mod of parseResult.modules) {
137
+ // Module-level objectives
138
+ for (const objective of mod.objectives) {
139
+ const extracted = createSkillFromObjective(objective, undefined, mod.title);
140
+ if (extracted)
141
+ skills.push(extracted);
142
+ }
143
+ // Topic objectives within modules
144
+ for (const topic of mod.topics) {
145
+ for (const objective of topic.objectives) {
146
+ const extracted = createSkillFromObjective(objective, topic, mod.title);
147
+ if (extracted)
148
+ skills.push(extracted);
149
+ }
150
+ }
151
+ }
152
+ // Suggest prerequisite edges based on order and Bloom's levels
153
+ const suggestedEdges = this.suggestEdges(skills);
154
+ return {
155
+ skills,
156
+ suggestedEdges,
157
+ warnings,
158
+ };
159
+ }
160
+ /**
161
+ * Suggest prerequisite relationships based on skill order and Bloom's levels
162
+ */
163
+ suggestEdges(skills) {
164
+ const edges = [];
165
+ for (let i = 1; i < skills.length; i++) {
166
+ const current = skills[i];
167
+ const previous = skills[i - 1];
168
+ if (!current || !previous)
169
+ continue;
170
+ // Skills in the same module/section are likely related
171
+ const sameSection = current.skill.metadata?.section === previous.skill.metadata?.section;
172
+ const sameWeek = current.skill.metadata?.week === previous.skill.metadata?.week;
173
+ if (sameSection || sameWeek) {
174
+ // Higher Bloom's level likely depends on lower
175
+ const currentDiff = current.skill.difficulty;
176
+ const prevDiff = previous.skill.difficulty;
177
+ if (currentDiff > prevDiff) {
178
+ edges.push({
179
+ sourceName: previous.skill.name,
180
+ targetName: current.skill.name,
181
+ strength: 0.7,
182
+ reasoning: 'Sequential in syllabus, increasing complexity',
183
+ });
184
+ }
185
+ }
186
+ }
187
+ return edges;
188
+ }
189
+ }
190
+ exports.BasicExtractor = BasicExtractor;
191
+ //# sourceMappingURL=extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../../src/parsers/extractor.ts"],"names":[],"mappings":"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"}
@@ -2,10 +2,49 @@
2
2
  /**
3
3
  * Content parsers for educational materials
4
4
  *
5
+ * Parse syllabi, course outlines, and learning objectives into
6
+ * structured skill graphs.
7
+ *
5
8
  * @packageDocumentation
6
9
  */
7
- // Parsers will be implemented in Phase 3
8
- // export { SyllabusParser } from './syllabus.js';
9
- // export { ChapterParser } from './chapter.js';
10
- // export { ObjectiveParser } from './objective.js';
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.printDemoResults = exports.tryWithSyllabus = exports.tryWithSample = exports.SAMPLE_SYLLABI = exports.PROGRAMMING_101_SYLLABUS = exports.KINDERGARTEN_MATH_SYLLABUS = exports.PHYSICS_101_SYLLABUS = exports.createObjective = exports.objectiveToSkillName = exports.cleanText = exports.isObjectiveLine = exports.extractTime = exports.DEFAULT_PARSE_OPTIONS = exports.DEFAULT_EXTRACTION_OPTIONS = exports.BasicExtractor = exports.JSONParser = exports.MarkdownParser = void 0;
12
+ // ─────────────────────────────────────────────────────────────────────────────
13
+ // Parsers
14
+ // ─────────────────────────────────────────────────────────────────────────────
15
+ var markdown_js_1 = require("./markdown.js");
16
+ Object.defineProperty(exports, "MarkdownParser", { enumerable: true, get: function () { return markdown_js_1.MarkdownParser; } });
17
+ var json_js_1 = require("./json.js");
18
+ Object.defineProperty(exports, "JSONParser", { enumerable: true, get: function () { return json_js_1.JSONParser; } });
19
+ // ─────────────────────────────────────────────────────────────────────────────
20
+ // Skill Extraction
21
+ // ─────────────────────────────────────────────────────────────────────────────
22
+ var extractor_js_1 = require("./extractor.js");
23
+ Object.defineProperty(exports, "BasicExtractor", { enumerable: true, get: function () { return extractor_js_1.BasicExtractor; } });
24
+ Object.defineProperty(exports, "DEFAULT_EXTRACTION_OPTIONS", { enumerable: true, get: function () { return extractor_js_1.DEFAULT_EXTRACTION_OPTIONS; } });
25
+ // ─────────────────────────────────────────────────────────────────────────────
26
+ // Utilities
27
+ // ─────────────────────────────────────────────────────────────────────────────
28
+ var base_js_1 = require("./base.js");
29
+ Object.defineProperty(exports, "DEFAULT_PARSE_OPTIONS", { enumerable: true, get: function () { return base_js_1.DEFAULT_PARSE_OPTIONS; } });
30
+ Object.defineProperty(exports, "extractTime", { enumerable: true, get: function () { return base_js_1.extractTime; } });
31
+ Object.defineProperty(exports, "isObjectiveLine", { enumerable: true, get: function () { return base_js_1.isObjectiveLine; } });
32
+ Object.defineProperty(exports, "cleanText", { enumerable: true, get: function () { return base_js_1.cleanText; } });
33
+ Object.defineProperty(exports, "objectiveToSkillName", { enumerable: true, get: function () { return base_js_1.objectiveToSkillName; } });
34
+ Object.defineProperty(exports, "createObjective", { enumerable: true, get: function () { return base_js_1.createObjective; } });
35
+ // ─────────────────────────────────────────────────────────────────────────────
36
+ // Sample Syllabi
37
+ // ─────────────────────────────────────────────────────────────────────────────
38
+ var samples_js_1 = require("./samples.js");
39
+ Object.defineProperty(exports, "PHYSICS_101_SYLLABUS", { enumerable: true, get: function () { return samples_js_1.PHYSICS_101_SYLLABUS; } });
40
+ Object.defineProperty(exports, "KINDERGARTEN_MATH_SYLLABUS", { enumerable: true, get: function () { return samples_js_1.KINDERGARTEN_MATH_SYLLABUS; } });
41
+ Object.defineProperty(exports, "PROGRAMMING_101_SYLLABUS", { enumerable: true, get: function () { return samples_js_1.PROGRAMMING_101_SYLLABUS; } });
42
+ Object.defineProperty(exports, "SAMPLE_SYLLABI", { enumerable: true, get: function () { return samples_js_1.SAMPLE_SYLLABI; } });
43
+ // ─────────────────────────────────────────────────────────────────────────────
44
+ // Demo Functions
45
+ // ─────────────────────────────────────────────────────────────────────────────
46
+ var demo_js_1 = require("./demo.js");
47
+ Object.defineProperty(exports, "tryWithSample", { enumerable: true, get: function () { return demo_js_1.tryWithSample; } });
48
+ Object.defineProperty(exports, "tryWithSyllabus", { enumerable: true, get: function () { return demo_js_1.tryWithSyllabus; } });
49
+ Object.defineProperty(exports, "printDemoResults", { enumerable: true, get: function () { return demo_js_1.printDemoResults; } });
11
50
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/parsers/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,yCAAyC;AACzC,kDAAkD;AAClD,gDAAgD;AAChD,oDAAoD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/parsers/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAsBH,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAChF,6CAA+C;AAAtC,6GAAA,cAAc,OAAA;AACvB,qCAA0D;AAAjD,qGAAA,UAAU,OAAA;AAEnB,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAChF,+CAA4E;AAAnE,8GAAA,cAAc,OAAA;AAAE,0HAAA,0BAA0B,OAAA;AAEnD,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAChF,qCAOmB;AANjB,gHAAA,qBAAqB,OAAA;AACrB,sGAAA,WAAW,OAAA;AACX,0GAAA,eAAe,OAAA;AACf,oGAAA,SAAS,OAAA;AACT,+GAAA,oBAAoB,OAAA;AACpB,0GAAA,eAAe,OAAA;AAGjB,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAChF,2CAMsB;AALpB,kHAAA,oBAAoB,OAAA;AACpB,wHAAA,0BAA0B,OAAA;AAC1B,sHAAA,wBAAwB,OAAA;AACxB,4GAAA,cAAc,OAAA;AAIhB,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAChF,qCAKmB;AAJjB,wGAAA,aAAa,OAAA;AACb,0GAAA,eAAe,OAAA;AACf,2GAAA,gBAAgB,OAAA"}
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ /**
3
+ * JSON/YAML syllabus parser
4
+ *
5
+ * Parses structured JSON or YAML syllabi into the standard format.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.JSONParser = void 0;
11
+ const base_js_1 = require("./base.js");
12
+ /**
13
+ * JSON/YAML parser for structured syllabi
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * import { JSONParser } from 'learngraph/parsers';
18
+ *
19
+ * const parser = new JSONParser();
20
+ * const result = await parser.parse(JSON.stringify({
21
+ * title: "Kindergarten Math",
22
+ * modules: [
23
+ * {
24
+ * title: "Counting",
25
+ * week: 1,
26
+ * objectives: [
27
+ * "Count objects from 1 to 10",
28
+ * "Recognize number symbols 1-10",
29
+ * "Compare groups using more, less, same"
30
+ * ]
31
+ * }
32
+ * ]
33
+ * }));
34
+ * ```
35
+ */
36
+ class JSONParser {
37
+ format = 'json';
38
+ async parse(content, _options) {
39
+ const startTime = Date.now();
40
+ const result = (0, base_js_1.createEmptyResult)('json', 'json');
41
+ let data;
42
+ try {
43
+ data = JSON.parse(content);
44
+ }
45
+ catch {
46
+ // Try YAML-like simple format (key: value)
47
+ data = this.parseSimpleFormat(content);
48
+ }
49
+ // Extract metadata
50
+ if (data.title)
51
+ result.metadata.title = data.title;
52
+ if (data.course)
53
+ result.metadata.course = data.course;
54
+ if (data.institution)
55
+ result.metadata.institution = data.institution;
56
+ if (data.gradeLevel)
57
+ result.metadata.gradeLevel = data.gradeLevel;
58
+ // Parse modules
59
+ if (data.modules) {
60
+ for (let i = 0; i < data.modules.length; i++) {
61
+ const mod = data.modules[i];
62
+ if (!mod)
63
+ continue;
64
+ const module = {
65
+ id: mod.id || `module-${i + 1}`,
66
+ title: mod.title,
67
+ topics: [],
68
+ objectives: [],
69
+ };
70
+ // Conditionally set optional properties
71
+ if (mod.description !== undefined) {
72
+ module.description = mod.description;
73
+ }
74
+ if (mod.week !== undefined) {
75
+ module.week = mod.week;
76
+ }
77
+ if (mod.estimatedMinutes !== undefined) {
78
+ module.estimatedMinutes = mod.estimatedMinutes;
79
+ }
80
+ // Parse module topics
81
+ if (mod.topics) {
82
+ for (const t of mod.topics) {
83
+ const topic = {
84
+ name: t.name,
85
+ objectives: (t.objectives || []).map((obj) => (0, base_js_1.createObjective)(obj, module.title, module.week)),
86
+ };
87
+ if (t.description !== undefined) {
88
+ topic.description = t.description;
89
+ }
90
+ if (t.estimatedMinutes !== undefined) {
91
+ topic.estimatedMinutes = t.estimatedMinutes;
92
+ }
93
+ module.topics.push(topic);
94
+ }
95
+ }
96
+ // Parse module-level objectives
97
+ if (mod.objectives) {
98
+ module.objectives = mod.objectives.map((obj) => (0, base_js_1.createObjective)(obj, module.title, module.week));
99
+ }
100
+ result.modules.push(module);
101
+ }
102
+ }
103
+ // Parse standalone topics
104
+ if (data.topics) {
105
+ for (const t of data.topics) {
106
+ const topic = {
107
+ name: t.name,
108
+ objectives: (t.objectives || []).map((obj) => (0, base_js_1.createObjective)(obj)),
109
+ };
110
+ if (t.description !== undefined) {
111
+ topic.description = t.description;
112
+ }
113
+ if (t.estimatedMinutes !== undefined) {
114
+ topic.estimatedMinutes = t.estimatedMinutes;
115
+ }
116
+ result.topics.push(topic);
117
+ }
118
+ }
119
+ // Parse standalone objectives
120
+ if (data.objectives) {
121
+ result.objectives = data.objectives.map((obj) => (0, base_js_1.createObjective)(obj));
122
+ }
123
+ result.stats = (0, base_js_1.calculateStats)(result, startTime);
124
+ return result;
125
+ }
126
+ /**
127
+ * Parse simple key-value format (basic YAML-like)
128
+ */
129
+ parseSimpleFormat(content) {
130
+ const lines = content.split('\n');
131
+ const result = { objectives: [] };
132
+ for (const line of lines) {
133
+ const trimmed = line.trim();
134
+ if (!trimmed || trimmed.startsWith('#'))
135
+ continue;
136
+ // Check for key: value
137
+ const colonIndex = trimmed.indexOf(':');
138
+ if (colonIndex > 0) {
139
+ const key = trimmed.substring(0, colonIndex).trim().toLowerCase();
140
+ const value = trimmed.substring(colonIndex + 1).trim();
141
+ if (key === 'title')
142
+ result.title = value;
143
+ else if (key === 'course')
144
+ result.course = value;
145
+ else if (key === 'institution')
146
+ result.institution = value;
147
+ }
148
+ else if (trimmed.startsWith('-') || trimmed.startsWith('*')) {
149
+ // List item = objective
150
+ result.objectives.push(trimmed.substring(1).trim());
151
+ }
152
+ }
153
+ return result;
154
+ }
155
+ }
156
+ exports.JSONParser = JSONParser;
157
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/parsers/json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ /**
3
+ * Markdown syllabus parser
4
+ *
5
+ * Parses markdown-formatted syllabi into structured content.
6
+ * Works with common syllabus formats from universities and K-12.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.MarkdownParser = void 0;
12
+ const base_js_1 = require("./base.js");
13
+ /**
14
+ * Markdown parser for syllabi and course outlines
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * import { MarkdownParser } from 'learngraph/parsers';
19
+ *
20
+ * const parser = new MarkdownParser();
21
+ * const result = await parser.parse(`
22
+ * # Introduction to Physics
23
+ *
24
+ * ## Week 1: Motion
25
+ *
26
+ * ### Learning Objectives
27
+ * - Describe the relationship between position, velocity, and acceleration
28
+ * - Calculate velocity from displacement and time
29
+ * - Apply kinematic equations to solve motion problems
30
+ *
31
+ * ## Week 2: Forces
32
+ *
33
+ * ### Learning Objectives
34
+ * - Identify forces acting on objects
35
+ * - Apply Newton's laws to predict motion
36
+ * `);
37
+ *
38
+ * console.log(result.modules); // 2 modules (Week 1, Week 2)
39
+ * console.log(result.stats.objectiveCount); // 5 objectives
40
+ * ```
41
+ */
42
+ class MarkdownParser {
43
+ format = 'markdown';
44
+ async parse(content, options) {
45
+ const startTime = Date.now();
46
+ const opts = { ...base_js_1.DEFAULT_PARSE_OPTIONS, ...options };
47
+ const result = (0, base_js_1.createEmptyResult)('markdown', 'markdown');
48
+ const warnings = [];
49
+ const lines = content.split('\n');
50
+ let currentModule = null;
51
+ let currentTopic = null;
52
+ // Extract title from first H1
53
+ const titleMatch = content.match(/^#\s+(.+)$/m);
54
+ if (titleMatch && titleMatch[1]) {
55
+ result.metadata.title = titleMatch[1].trim();
56
+ }
57
+ for (let i = 0; i < lines.length; i++) {
58
+ const line = lines[i] ?? '';
59
+ const trimmed = line.trim();
60
+ if (!trimmed) {
61
+ continue;
62
+ }
63
+ // H1: Course title (already extracted)
64
+ if (trimmed.startsWith('# ')) {
65
+ continue;
66
+ }
67
+ // H2: Module/Week/Chapter
68
+ if (trimmed.startsWith('## ')) {
69
+ // Save previous module
70
+ if (currentModule) {
71
+ if (currentTopic) {
72
+ currentModule.topics.push(currentTopic);
73
+ currentTopic = null;
74
+ }
75
+ result.modules.push(currentModule);
76
+ }
77
+ const title = trimmed.substring(3).trim();
78
+ const weekMatch = title.match(/week\s*(\d+)/i);
79
+ const mod = {
80
+ id: `module-${result.modules.length + 1}`,
81
+ title,
82
+ topics: [],
83
+ objectives: [],
84
+ };
85
+ if (weekMatch && weekMatch[1]) {
86
+ mod.week = parseInt(weekMatch[1], 10);
87
+ }
88
+ const estTime = (0, base_js_1.extractTime)(title);
89
+ if (estTime !== undefined) {
90
+ mod.estimatedMinutes = estTime;
91
+ }
92
+ currentModule = mod;
93
+ continue;
94
+ }
95
+ // H3: Topic or "Learning Objectives" section
96
+ if (trimmed.startsWith('### ')) {
97
+ const title = trimmed.substring(4).trim();
98
+ const lower = title.toLowerCase();
99
+ // Check if this is an objectives section header - skip it as a topic
100
+ if (lower.includes('objective') ||
101
+ lower.includes('outcome') ||
102
+ lower.includes('goal')) {
103
+ continue;
104
+ }
105
+ // Save previous topic
106
+ if (currentTopic && currentModule) {
107
+ currentModule.topics.push(currentTopic);
108
+ }
109
+ const topic = {
110
+ name: title,
111
+ objectives: [],
112
+ };
113
+ const topicTime = (0, base_js_1.extractTime)(title);
114
+ if (topicTime !== undefined) {
115
+ topic.estimatedMinutes = topicTime;
116
+ }
117
+ currentTopic = topic;
118
+ continue;
119
+ }
120
+ // H4: Sub-topic or nested objectives - skip
121
+ if (trimmed.startsWith('#### ')) {
122
+ continue;
123
+ }
124
+ // List items: potential objectives
125
+ if (trimmed.startsWith('- ') ||
126
+ trimmed.startsWith('* ') ||
127
+ trimmed.match(/^\d+\.\s/)) {
128
+ const text = (0, base_js_1.cleanText)(trimmed);
129
+ // Skip if too short
130
+ if (text.length < 10) {
131
+ continue;
132
+ }
133
+ const objective = (0, base_js_1.createObjective)(text, currentModule?.title, currentModule?.week);
134
+ // Add to appropriate container
135
+ if (currentTopic) {
136
+ currentTopic.objectives.push(objective);
137
+ }
138
+ else if (currentModule) {
139
+ currentModule.objectives.push(objective);
140
+ }
141
+ else {
142
+ result.objectives.push(objective);
143
+ }
144
+ // Warn if Bloom's not detected
145
+ if (opts.detectBloom && !objective.bloomLevel) {
146
+ warnings.push({
147
+ type: 'ambiguous_bloom',
148
+ message: `Could not detect Bloom's level: "${text.substring(0, 50)}..."`,
149
+ location: `Line ${i + 1}`,
150
+ });
151
+ }
152
+ continue;
153
+ }
154
+ }
155
+ // Save final module/topic
156
+ if (currentTopic && currentModule) {
157
+ currentModule.topics.push(currentTopic);
158
+ }
159
+ if (currentModule) {
160
+ result.modules.push(currentModule);
161
+ }
162
+ result.warnings = warnings;
163
+ result.stats = (0, base_js_1.calculateStats)(result, startTime);
164
+ return result;
165
+ }
166
+ }
167
+ exports.MarkdownParser = MarkdownParser;
168
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/parsers/markdown.ts"],"names":[],"mappings":"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"}