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.
- package/LICENSE +190 -21
- package/README.md +83 -2
- package/dist/cjs/parsers/base.js +189 -0
- package/dist/cjs/parsers/base.js.map +1 -0
- package/dist/cjs/parsers/demo.js +159 -0
- package/dist/cjs/parsers/demo.js.map +1 -0
- package/dist/cjs/parsers/extractor.js +191 -0
- package/dist/cjs/parsers/extractor.js.map +1 -0
- package/dist/cjs/parsers/index.js +43 -4
- package/dist/cjs/parsers/index.js.map +1 -1
- package/dist/cjs/parsers/json.js +157 -0
- package/dist/cjs/parsers/json.js.map +1 -0
- package/dist/cjs/parsers/markdown.js +168 -0
- package/dist/cjs/parsers/markdown.js.map +1 -0
- package/dist/cjs/parsers/samples.js +139 -0
- package/dist/cjs/parsers/samples.js.map +1 -0
- package/dist/cjs/storage/base.js +231 -0
- package/dist/cjs/storage/base.js.map +1 -0
- package/dist/cjs/storage/errors.js +128 -0
- package/dist/cjs/storage/errors.js.map +1 -0
- package/dist/cjs/storage/index.js +92 -5
- package/dist/cjs/storage/index.js.map +1 -1
- package/dist/cjs/storage/levelgraph.js +855 -0
- package/dist/cjs/storage/levelgraph.js.map +1 -0
- package/dist/cjs/storage/memory.js +447 -0
- package/dist/cjs/storage/memory.js.map +1 -0
- package/dist/cjs/storage/neo4j.js +866 -0
- package/dist/cjs/storage/neo4j.js.map +1 -0
- package/dist/cjs/storage/seeds.js +565 -0
- package/dist/cjs/storage/seeds.js.map +1 -0
- package/dist/cjs/types/parser.js +8 -0
- package/dist/cjs/types/parser.js.map +1 -0
- package/dist/esm/parsers/base.js +179 -0
- package/dist/esm/parsers/base.js.map +1 -0
- package/dist/esm/parsers/demo.js +154 -0
- package/dist/esm/parsers/demo.js.map +1 -0
- package/dist/esm/parsers/extractor.js +187 -0
- package/dist/esm/parsers/extractor.js.map +1 -0
- package/dist/esm/parsers/index.js +24 -5
- package/dist/esm/parsers/index.js.map +1 -1
- package/dist/esm/parsers/json.js +153 -0
- package/dist/esm/parsers/json.js.map +1 -0
- package/dist/esm/parsers/markdown.js +164 -0
- package/dist/esm/parsers/markdown.js.map +1 -0
- package/dist/esm/parsers/samples.js +136 -0
- package/dist/esm/parsers/samples.js.map +1 -0
- package/dist/esm/storage/base.js +221 -0
- package/dist/esm/storage/base.js.map +1 -0
- package/dist/esm/storage/errors.js +116 -0
- package/dist/esm/storage/errors.js.map +1 -0
- package/dist/esm/storage/index.js +71 -6
- package/dist/esm/storage/index.js.map +1 -1
- package/dist/esm/storage/levelgraph.js +818 -0
- package/dist/esm/storage/levelgraph.js.map +1 -0
- package/dist/esm/storage/memory.js +443 -0
- package/dist/esm/storage/memory.js.map +1 -0
- package/dist/esm/storage/neo4j.js +829 -0
- package/dist/esm/storage/neo4j.js.map +1 -0
- package/dist/esm/storage/seeds.js +561 -0
- package/dist/esm/storage/seeds.js.map +1 -0
- package/dist/esm/types/parser.js +7 -0
- package/dist/esm/types/parser.js.map +1 -0
- package/dist/types/parsers/base.d.ts +39 -0
- package/dist/types/parsers/base.d.ts.map +1 -0
- package/dist/types/parsers/demo.d.ts +87 -0
- package/dist/types/parsers/demo.d.ts.map +1 -0
- package/dist/types/parsers/extractor.d.ts +43 -0
- package/dist/types/parsers/extractor.d.ts.map +1 -0
- package/dist/types/parsers/index.d.ts +10 -0
- package/dist/types/parsers/index.d.ts.map +1 -1
- package/dist/types/parsers/json.d.ts +71 -0
- package/dist/types/parsers/json.d.ts.map +1 -0
- package/dist/types/parsers/markdown.d.ts +43 -0
- package/dist/types/parsers/markdown.d.ts.map +1 -0
- package/dist/types/parsers/samples.d.ts +27 -0
- package/dist/types/parsers/samples.d.ts.map +1 -0
- package/dist/types/storage/base.d.ts +39 -0
- package/dist/types/storage/base.d.ts.map +1 -0
- package/dist/types/storage/errors.d.ts +74 -0
- package/dist/types/storage/errors.d.ts.map +1 -0
- package/dist/types/storage/index.d.ts +50 -2
- package/dist/types/storage/index.d.ts.map +1 -1
- package/dist/types/storage/levelgraph.d.ts +92 -0
- package/dist/types/storage/levelgraph.d.ts.map +1 -0
- package/dist/types/storage/memory.d.ts +70 -0
- package/dist/types/storage/memory.d.ts.map +1 -0
- package/dist/types/storage/neo4j.d.ts +88 -0
- package/dist/types/storage/neo4j.d.ts.map +1 -0
- package/dist/types/storage/seeds.d.ts +27 -0
- package/dist/types/storage/seeds.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +1 -0
- package/dist/types/types/index.d.ts.map +1 -1
- package/dist/types/types/parser.d.ts +208 -0
- package/dist/types/types/parser.d.ts.map +1 -0
- package/package.json +4 -2
- 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
|
-
|
|
8
|
-
|
|
9
|
-
//
|
|
10
|
-
//
|
|
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
|
|
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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"}
|