learngraph 0.1.0 → 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 +187 -5
- package/dist/cjs/index.js +1 -1
- 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/index.js +1 -1
- 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/index.d.ts +1 -1
- 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 +33 -6
- package/scripts/postinstall.js +68 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Demo utilities for quick testing and exploration
|
|
4
|
+
*
|
|
5
|
+
* @packageDocumentation
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.tryWithSample = tryWithSample;
|
|
9
|
+
exports.tryWithSyllabus = tryWithSyllabus;
|
|
10
|
+
exports.printDemoResults = printDemoResults;
|
|
11
|
+
const markdown_js_1 = require("./markdown.js");
|
|
12
|
+
const extractor_js_1 = require("./extractor.js");
|
|
13
|
+
const memory_js_1 = require("../storage/memory.js");
|
|
14
|
+
const samples_js_1 = require("./samples.js");
|
|
15
|
+
/**
|
|
16
|
+
* Try LearnGraph with a sample syllabus
|
|
17
|
+
*
|
|
18
|
+
* This is the easiest way to see LearnGraph in action.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* import { tryWithSample } from 'learngraph/parsers';
|
|
23
|
+
*
|
|
24
|
+
* // Try with physics syllabus
|
|
25
|
+
* const result = await tryWithSample('physics');
|
|
26
|
+
* console.log(`Created ${result.skills.length} skills!`);
|
|
27
|
+
* console.log('Skills:', result.skills.map(s => s.name));
|
|
28
|
+
*
|
|
29
|
+
* // Try with kindergarten math
|
|
30
|
+
* const kResult = await tryWithSample('kindergarten');
|
|
31
|
+
* console.log(`Kindergarten: ${kResult.skills.length} skills`);
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
async function tryWithSample(sample = 'physics') {
|
|
35
|
+
const syllabus = samples_js_1.SAMPLE_SYLLABI[sample];
|
|
36
|
+
return tryWithSyllabus(syllabus);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Try LearnGraph with your own syllabus
|
|
40
|
+
*
|
|
41
|
+
* Paste your syllabus as markdown and see the magic happen!
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* import { tryWithSyllabus } from 'learngraph/parsers';
|
|
46
|
+
*
|
|
47
|
+
* const mySyllabus = `
|
|
48
|
+
* # My Course
|
|
49
|
+
*
|
|
50
|
+
* ## Week 1: Introduction
|
|
51
|
+
*
|
|
52
|
+
* ### Learning Objectives
|
|
53
|
+
* - Understand the course structure
|
|
54
|
+
* - Identify key topics
|
|
55
|
+
* - Apply basic concepts
|
|
56
|
+
* `;
|
|
57
|
+
*
|
|
58
|
+
* const result = await tryWithSyllabus(mySyllabus);
|
|
59
|
+
* console.log('Found', result.parseResult.stats.objectiveCount, 'objectives');
|
|
60
|
+
* console.log('Created', result.skills.length, 'skills');
|
|
61
|
+
*
|
|
62
|
+
* // See the skills
|
|
63
|
+
* for (const skill of result.skills) {
|
|
64
|
+
* console.log(`- ${skill.name} (${skill.bloomLevel}, difficulty: ${skill.difficulty})`);
|
|
65
|
+
* }
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
async function tryWithSyllabus(syllabus, options) {
|
|
69
|
+
// Parse the syllabus
|
|
70
|
+
const parser = new markdown_js_1.MarkdownParser();
|
|
71
|
+
const parseResult = await parser.parse(syllabus);
|
|
72
|
+
// Extract skills
|
|
73
|
+
const extractor = new extractor_js_1.BasicExtractor();
|
|
74
|
+
const extraction = await extractor.extract(parseResult, options);
|
|
75
|
+
// Create storage and populate
|
|
76
|
+
const storage = new memory_js_1.MemoryStorage();
|
|
77
|
+
await storage.connect({ backend: 'memory' });
|
|
78
|
+
// Create skills
|
|
79
|
+
const skills = [];
|
|
80
|
+
const skillMap = new Map();
|
|
81
|
+
for (const { skill: input } of extraction.skills) {
|
|
82
|
+
const skill = await storage.createSkill(input);
|
|
83
|
+
skills.push(skill);
|
|
84
|
+
skillMap.set(skill.name, skill);
|
|
85
|
+
}
|
|
86
|
+
// Create edges
|
|
87
|
+
const edges = [];
|
|
88
|
+
for (const suggested of extraction.suggestedEdges) {
|
|
89
|
+
const source = skillMap.get(suggested.sourceName);
|
|
90
|
+
const target = skillMap.get(suggested.targetName);
|
|
91
|
+
if (source && target) {
|
|
92
|
+
const edgeInput = {
|
|
93
|
+
sourceId: source.id,
|
|
94
|
+
targetId: target.id,
|
|
95
|
+
strength: suggested.strength,
|
|
96
|
+
type: suggested.strength >= 0.8 ? 'hard' : 'soft',
|
|
97
|
+
metadata: {},
|
|
98
|
+
};
|
|
99
|
+
if (suggested.reasoning) {
|
|
100
|
+
edgeInput.reasoning = suggested.reasoning;
|
|
101
|
+
}
|
|
102
|
+
const edge = await storage.createPrerequisite(edgeInput);
|
|
103
|
+
edges.push(edge);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Get stats
|
|
107
|
+
const stats = await storage.getStats();
|
|
108
|
+
await storage.disconnect();
|
|
109
|
+
return {
|
|
110
|
+
parseResult,
|
|
111
|
+
extraction,
|
|
112
|
+
skills,
|
|
113
|
+
edges,
|
|
114
|
+
stats,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Quick console output of demo results
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* ```typescript
|
|
122
|
+
* import { tryWithSample, printDemoResults } from 'learngraph/parsers';
|
|
123
|
+
*
|
|
124
|
+
* const result = await tryWithSample('physics');
|
|
125
|
+
* printDemoResults(result);
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
function printDemoResults(result) {
|
|
129
|
+
console.log('\n' + '='.repeat(60));
|
|
130
|
+
console.log('LearnGraph Demo Results');
|
|
131
|
+
console.log('='.repeat(60));
|
|
132
|
+
console.log(`\nCourse: ${result.parseResult.metadata.title || 'Untitled'}`);
|
|
133
|
+
console.log(`Format: ${result.parseResult.metadata.format}`);
|
|
134
|
+
console.log('\n--- Parse Statistics ---');
|
|
135
|
+
console.log(`Modules: ${result.parseResult.stats.moduleCount}`);
|
|
136
|
+
console.log(`Topics: ${result.parseResult.stats.topicCount}`);
|
|
137
|
+
console.log(`Objectives: ${result.parseResult.stats.objectiveCount}`);
|
|
138
|
+
console.log(`Bloom's Detected: ${result.parseResult.stats.bloomDetectedCount}`);
|
|
139
|
+
console.log('\n--- Skills Created ---');
|
|
140
|
+
for (const skill of result.skills) {
|
|
141
|
+
console.log(` - ${skill.name} [${skill.bloomLevel}] (difficulty: ${skill.difficulty.toFixed(2)})`);
|
|
142
|
+
}
|
|
143
|
+
console.log('\n--- Prerequisites ---');
|
|
144
|
+
for (const edge of result.edges) {
|
|
145
|
+
const source = result.skills.find((s) => s.id === edge.sourceId);
|
|
146
|
+
const target = result.skills.find((s) => s.id === edge.targetId);
|
|
147
|
+
if (source && target) {
|
|
148
|
+
console.log(` ${source.name} → ${target.name} (${edge.type})`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
console.log('\n--- Graph Statistics ---');
|
|
152
|
+
console.log(`Total Skills: ${result.stats.nodeCount}`);
|
|
153
|
+
console.log(`Total Edges: ${result.stats.edgeCount}`);
|
|
154
|
+
console.log(`Root Skills: ${result.stats.rootNodeCount}`);
|
|
155
|
+
console.log(`Max Depth: ${result.stats.maxDepth}`);
|
|
156
|
+
console.log(`Bloom Distribution:`, result.stats.bloomDistribution);
|
|
157
|
+
console.log('\n' + '='.repeat(60) + '\n');
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=demo.js.map
|
|
@@ -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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"}
|