@digimakers/core 0.1.4 → 0.2.1
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/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/parsing/docx-parser.d.ts.map +1 -1
- package/dist/parsing/docx-parser.js +29 -9
- package/dist/parsing/docx-parser.js.map +1 -1
- package/dist/parsing/footer-parser.d.ts +7 -0
- package/dist/parsing/footer-parser.d.ts.map +1 -0
- package/dist/parsing/footer-parser.js +49 -0
- package/dist/parsing/footer-parser.js.map +1 -0
- package/dist/parsing/normalise.d.ts +2 -0
- package/dist/parsing/normalise.d.ts.map +1 -0
- package/dist/parsing/normalise.js +12 -0
- package/dist/parsing/normalise.js.map +1 -0
- package/dist/pdf-generator.d.ts +16 -4
- package/dist/pdf-generator.d.ts.map +1 -1
- package/dist/pdf-generator.js +80 -70
- package/dist/pdf-generator.js.map +1 -1
- package/dist/sample-data.d.ts.map +1 -1
- package/dist/sample-data.js +8 -3
- package/dist/sample-data.js.map +1 -1
- package/dist/schemas/index.d.ts +1 -1
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/lesson.d.ts +33 -19
- package/dist/schemas/lesson.d.ts.map +1 -1
- package/dist/schemas/lesson.js +28 -7
- package/dist/schemas/lesson.js.map +1 -1
- package/package.json +2 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { StepWithImageSchema, StepsWithCodeBlockSchema, ChallengeSchema, NewProjectSchema, ParsedLessonSchema, GenerateOptionsSchema, type StepWithImage, type StepsWithCodeBlock, type Challenge, type NewProject, type ParsedLesson, type GenerateOptions, } from './schemas/index.js';
|
|
2
|
-
export { createPdfGenerator } from './pdf-generator.js';
|
|
3
|
-
export type { PdfGeneratorInstance } from './pdf-generator.js';
|
|
1
|
+
export { StepWithImageSchema, StepsWithCodeBlockSchema, ChallengeSchema, NewProjectSchema, ParsedLessonSchema, GenerateOptionsSchema, type StepWithImage, type StepsWithCodeBlock, type MultipleStepsWithCodeBlock, type Challenge, type NewProject, type ParsedLesson, type GenerateOptions, } from './schemas/index.js';
|
|
2
|
+
export { createPdfGenerator, convertWithConcurrency, POOL_SIZE } from './pdf-generator.js';
|
|
3
|
+
export type { PdfGeneratorInstance, FileToConvert, ConversionResult } from './pdf-generator.js';
|
|
4
4
|
export { startServer, stopServer } from './server.js';
|
|
5
5
|
export type { ServerInstance } from './server.js';
|
|
6
6
|
export { logger } from './logger.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,mBAAmB,EACnB,wBAAwB,EACxB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EAErB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,eAAe,GACrB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,mBAAmB,EACnB,wBAAwB,EACxB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EAErB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,0BAA0B,EAC/B,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,eAAe,GACrB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC3F,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGhG,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC9D,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@ export {
|
|
|
4
4
|
// Schemas
|
|
5
5
|
StepWithImageSchema, StepsWithCodeBlockSchema, ChallengeSchema, NewProjectSchema, ParsedLessonSchema, GenerateOptionsSchema, } from './schemas/index.js';
|
|
6
6
|
// PDF generation
|
|
7
|
-
export { createPdfGenerator } from './pdf-generator.js';
|
|
7
|
+
export { createPdfGenerator, convertWithConcurrency, POOL_SIZE } from './pdf-generator.js';
|
|
8
8
|
// Server
|
|
9
9
|
export { startServer, stopServer } from './server.js';
|
|
10
10
|
// Logger
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAElC,6CAA6C;AAC7C,OAAO;AACL,UAAU;AACV,mBAAmB,EACnB,wBAAwB,EACxB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAElC,6CAA6C;AAC7C,OAAO;AACL,UAAU;AACV,mBAAmB,EACnB,wBAAwB,EACxB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,GAStB,MAAM,oBAAoB,CAAC;AAE5B,iBAAiB;AACjB,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG3F,SAAS;AACT,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGtD,SAAS;AACT,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,UAAU;AACV,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG9D,4BAA4B;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docx-parser.d.ts","sourceRoot":"","sources":["../../src/parsing/docx-parser.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsB,YAAY,
|
|
1
|
+
{"version":3,"file":"docx-parser.d.ts","sourceRoot":"","sources":["../../src/parsing/docx-parser.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsB,YAAY,EAAiB,MAAM,qBAAqB,CAAC;AAKtF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AA4BD,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAkFtE"}
|
|
@@ -4,6 +4,7 @@ import { generateText, Output } from 'ai';
|
|
|
4
4
|
import { createGoogleGenerativeAI } from '@ai-sdk/google';
|
|
5
5
|
import { ParsedLessonSchema } from '../schemas/index.js';
|
|
6
6
|
import { logger } from '../logger.js';
|
|
7
|
+
import { extractLanguageFromFooter } from './footer-parser.js';
|
|
7
8
|
// Setup google generative ai
|
|
8
9
|
const google = createGoogleGenerativeAI({
|
|
9
10
|
apiKey: process.env.GEMINI_API_KEY,
|
|
@@ -26,23 +27,34 @@ async function extractImages(buffer) {
|
|
|
26
27
|
export async function parseDocx(filePath) {
|
|
27
28
|
logger.info(`Parsing: ${filePath}`);
|
|
28
29
|
const buffer = await fs.readFile(filePath);
|
|
29
|
-
// Extract text and
|
|
30
|
-
const [{ value: text }, allImages] = await Promise.all([
|
|
30
|
+
// Extract text, images, and footer language in parallel
|
|
31
|
+
const [{ value: text }, allImages, footerLanguage] = await Promise.all([
|
|
31
32
|
mammoth.extractRawText({ buffer }),
|
|
32
33
|
extractImages(buffer),
|
|
34
|
+
extractLanguageFromFooter(filePath),
|
|
33
35
|
]);
|
|
34
36
|
logger.info(text);
|
|
35
37
|
logger.info(allImages);
|
|
36
|
-
logger.
|
|
38
|
+
logger.info(`Extracted ${text.length} characters and ${allImages.length} images`);
|
|
39
|
+
if (footerLanguage) {
|
|
40
|
+
logger.info(`Programming language from footer: ${footerLanguage}`);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
logger.warn('Footer language not found');
|
|
44
|
+
}
|
|
37
45
|
// First image is project cover, rest are for code steps
|
|
38
46
|
const projectImage = allImages.length > 0 ? allImages[0] : null;
|
|
39
47
|
const stepImages = allImages.slice(1);
|
|
40
48
|
logger.info(`Found ${stepImages.length} step images, projectImage: ${projectImage ? 'yes' : 'no'}`);
|
|
49
|
+
// Create schema for LLM - omit programmingLanguage if found in footer
|
|
50
|
+
const llmSchema = footerLanguage
|
|
51
|
+
? ParsedLessonSchema.omit({ programmingLanguage: true })
|
|
52
|
+
: ParsedLessonSchema;
|
|
41
53
|
// Use LLM to extract structured data
|
|
42
54
|
const { output } = await generateText({
|
|
43
55
|
model: google('gemini-2.0-flash'),
|
|
44
56
|
output: Output.object({
|
|
45
|
-
schema:
|
|
57
|
+
schema: llmSchema,
|
|
46
58
|
}),
|
|
47
59
|
prompt: `Extract structured lesson data from this educational document.
|
|
48
60
|
|
|
@@ -57,14 +69,22 @@ ${text}`,
|
|
|
57
69
|
});
|
|
58
70
|
logger.info(output);
|
|
59
71
|
logger.info(`Successfully extracted lesson: ${output.topic} - ${output.project}`);
|
|
60
|
-
// Post-process: assign images to the extracted data
|
|
72
|
+
// Post-process: assign images and programming language to the extracted data
|
|
61
73
|
const data = output;
|
|
62
74
|
data.projectImage = projectImage;
|
|
75
|
+
// Set programming language from footer if found, otherwise use LLM's determination
|
|
76
|
+
if (footerLanguage) {
|
|
77
|
+
data.programmingLanguage = footerLanguage;
|
|
78
|
+
}
|
|
63
79
|
// Assign step images in order
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
80
|
+
const addSection = data.addYourCodeSection;
|
|
81
|
+
if (stepImages.length > 0 && Array.isArray(addSection)) {
|
|
82
|
+
const isStepWithImageArray = addSection.every((item) => typeof item === 'object' && item !== null && 'step' in item);
|
|
83
|
+
if (isStepWithImageArray) {
|
|
84
|
+
addSection.forEach((step, index) => {
|
|
85
|
+
step.image = stepImages[index] ?? null;
|
|
86
|
+
});
|
|
87
|
+
}
|
|
68
88
|
}
|
|
69
89
|
logger.info(data);
|
|
70
90
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docx-parser.js","sourceRoot":"","sources":["../../src/parsing/docx-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC1C,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"docx-parser.js","sourceRoot":"","sources":["../../src/parsing/docx-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract programming language from the footer of a .docx file
|
|
3
|
+
* Expected format: "Level: Scratch-1" or "Level: Python-2"
|
|
4
|
+
* Output: the mapped language for the programming language
|
|
5
|
+
*/
|
|
6
|
+
export declare function extractLanguageFromFooter(filePath: string): Promise<string | null>;
|
|
7
|
+
//# sourceMappingURL=footer-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"footer-parser.d.ts","sourceRoot":"","sources":["../../src/parsing/footer-parser.ts"],"names":[],"mappings":"AAmBA;;;;GAIG;AACH,wBAAsB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2BxF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { logger } from '../logger.js';
|
|
2
|
+
// @ts-expect-error
|
|
3
|
+
import WordExtractor from 'word-extractor';
|
|
4
|
+
const LANGUAGE_MAP = {
|
|
5
|
+
scratch: 'scratch',
|
|
6
|
+
'small-basic': 'small-basic',
|
|
7
|
+
'small basic': 'small-basic',
|
|
8
|
+
smallbasic: 'small-basic',
|
|
9
|
+
python: 'python',
|
|
10
|
+
java: 'java',
|
|
11
|
+
javascript: 'javascript or html or css',
|
|
12
|
+
html: 'javascript or html or css',
|
|
13
|
+
css: 'javascript or html or css',
|
|
14
|
+
c: 'c',
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Extract programming language from the footer of a .docx file
|
|
18
|
+
* Expected format: "Level: Scratch-1" or "Level: Python-2"
|
|
19
|
+
* Output: the mapped language for the programming language
|
|
20
|
+
*/
|
|
21
|
+
export async function extractLanguageFromFooter(filePath) {
|
|
22
|
+
try {
|
|
23
|
+
const extractor = new WordExtractor();
|
|
24
|
+
const doc = await extractor.extract(filePath);
|
|
25
|
+
const footerText = doc.getFooters().trim().toLowerCase();
|
|
26
|
+
if (!footerText || !footerText.includes('level')) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
logger.info(`FOOTER TEXT ======================= ${footerText}`);
|
|
30
|
+
const levelMatch = footerText.match(/level:\s*([A-Za-z\s-]+?)[-\d]/i);
|
|
31
|
+
if (levelMatch && levelMatch[1]) {
|
|
32
|
+
const rawLanguage = levelMatch[1].trim().toLowerCase();
|
|
33
|
+
const mappedLanguage = LANGUAGE_MAP[rawLanguage];
|
|
34
|
+
if (mappedLanguage) {
|
|
35
|
+
logger.info(`Found programming language in footer: ${mappedLanguage}`);
|
|
36
|
+
return mappedLanguage;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
logger.warn(`Language "${rawLanguage}" found in footer but not in language map`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
logger.error(`Error extracting footer from ${filePath}: ${error}`);
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=footer-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"footer-parser.js","sourceRoot":"","sources":["../../src/parsing/footer-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGtC,mBAAmB;AACnB,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAE3C,MAAM,YAAY,GAAwC;IACxD,OAAO,EAAE,SAAS;IAClB,aAAa,EAAE,aAAa;IAC5B,aAAa,EAAE,aAAa;IAC5B,UAAU,EAAE,aAAa;IACzB,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,2BAA2B;IACvC,IAAI,EAAE,2BAA2B;IACjC,GAAG,EAAE,2BAA2B;IAChC,CAAC,EAAE,GAAG;CACP,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,QAAgB;IAC9D,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,aAAa,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAW,GAAG,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACjE,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,uCAAuC,UAAU,EAAE,CAAC,CAAC;QAEjE,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACtE,IAAI,UAAU,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACvD,MAAM,cAAc,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;YACjD,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,CAAC,IAAI,CAAC,yCAAyC,cAAc,EAAE,CAAC,CAAC;gBACvE,OAAO,cAAc,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,aAAa,WAAW,2CAA2C,CAAC,CAAC;YACnF,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,gCAAgC,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalise.d.ts","sourceRoot":"","sources":["../../src/parsing/normalise.ts"],"names":[],"mappings":"AACA,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAQrE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Removes extra new lines and stuff in code blocks
|
|
2
|
+
export function normaliseCodeBlock(code) {
|
|
3
|
+
if (!code)
|
|
4
|
+
return code;
|
|
5
|
+
return code
|
|
6
|
+
.replace(/\r\n/g, '\n')
|
|
7
|
+
.split('\n')
|
|
8
|
+
.map((line) => line.replace(/\s+$/g, ''))
|
|
9
|
+
.join('\n')
|
|
10
|
+
.replace(/\n{2,}/g, '\n');
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=normalise.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalise.js","sourceRoot":"","sources":["../../src/parsing/normalise.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,MAAM,UAAU,kBAAkB,CAAC,IAAmB;IACpD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,IAAI;SACR,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;SACtB,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;SACxC,IAAI,CAAC,IAAI,CAAC;SACV,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC9B,CAAC"}
|
package/dist/pdf-generator.d.ts
CHANGED
|
@@ -3,11 +3,23 @@ import { ParsedLesson, GenerateOptions } from './schemas/index.js';
|
|
|
3
3
|
export interface PdfGeneratorInstance {
|
|
4
4
|
browser: Browser;
|
|
5
5
|
generatePdf: (data: ParsedLesson, options?: GenerateOptions) => Promise<string>;
|
|
6
|
-
generateBatch: (items: {
|
|
7
|
-
data: ParsedLesson;
|
|
8
|
-
options: GenerateOptions;
|
|
9
|
-
}[]) => Promise<string[]>;
|
|
10
6
|
close: () => Promise<void>;
|
|
11
7
|
}
|
|
8
|
+
export interface FileToConvert {
|
|
9
|
+
path: string;
|
|
10
|
+
name: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ConversionResult {
|
|
13
|
+
file: string;
|
|
14
|
+
success: boolean;
|
|
15
|
+
pdfPath?: string;
|
|
16
|
+
error?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare const POOL_SIZE = 4;
|
|
12
19
|
export declare function createPdfGenerator(serverUrl: string): Promise<PdfGeneratorInstance>;
|
|
20
|
+
/**
|
|
21
|
+
* Process files with bounded concurrency: parse -> generate PDF for each file.
|
|
22
|
+
* Continues on individual failures and returns results for all files.
|
|
23
|
+
*/
|
|
24
|
+
export declare function convertWithConcurrency(files: FileToConvert[], generator: PdfGeneratorInstance, outputDir: string, concurrency?: number): Promise<ConversionResult[]>;
|
|
13
25
|
//# sourceMappingURL=pdf-generator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdf-generator.d.ts","sourceRoot":"","sources":["../src/pdf-generator.ts"],"names":[],"mappings":"AAAA,OAAkB,EAAE,OAAO,EAAQ,MAAM,WAAW,CAAC;AAGrD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"pdf-generator.d.ts","sourceRoot":"","sources":["../src/pdf-generator.ts"],"names":[],"mappings":"AAAA,OAAkB,EAAE,OAAO,EAAQ,MAAM,WAAW,CAAC;AAGrD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAInE,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChF,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,SAAS,IAAI,CAAC;AAI3B,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAsFzF;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,aAAa,EAAE,EACtB,SAAS,EAAE,oBAAoB,EAC/B,SAAS,EAAE,MAAM,EACjB,WAAW,GAAE,MAAkB,GAC9B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAgD7B"}
|
package/dist/pdf-generator.js
CHANGED
|
@@ -2,7 +2,8 @@ import puppeteer from 'puppeteer';
|
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import fs from 'fs/promises';
|
|
4
4
|
import { logger } from './logger.js';
|
|
5
|
-
|
|
5
|
+
import { parseDocx } from './parsing/index.js';
|
|
6
|
+
export const POOL_SIZE = 4;
|
|
6
7
|
const RENDER_DELAY = 100;
|
|
7
8
|
const PAGE_WAIT_MS = 30_000;
|
|
8
9
|
export async function createPdfGenerator(serverUrl) {
|
|
@@ -11,100 +12,109 @@ export async function createPdfGenerator(serverUrl) {
|
|
|
11
12
|
headless: true,
|
|
12
13
|
args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage'],
|
|
13
14
|
});
|
|
14
|
-
const
|
|
15
|
+
const printUrl = serverUrl.endsWith('/') ? `${serverUrl}print` : `${serverUrl}/print`;
|
|
16
|
+
let renderTokenCounter = 0;
|
|
15
17
|
async function initPage() {
|
|
16
18
|
const page = await browser.newPage();
|
|
17
19
|
await page.setViewport({ width: 794, height: 1123, deviceScaleFactor: 2 });
|
|
18
|
-
const printUrl = serverUrl.endsWith('/') ? `${serverUrl}print` : `${serverUrl}/print`;
|
|
19
20
|
await page.goto(printUrl, { waitUntil: 'networkidle0' });
|
|
20
21
|
return page;
|
|
21
22
|
}
|
|
22
|
-
async function
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (!pooledPage) {
|
|
30
|
-
await new Promise((resolve) => {
|
|
31
|
-
const check = () => {
|
|
32
|
-
pooledPage = pool.find((p) => !p.busy);
|
|
33
|
-
if (pooledPage)
|
|
34
|
-
resolve();
|
|
35
|
-
else
|
|
36
|
-
setTimeout(check, 10);
|
|
37
|
-
};
|
|
38
|
-
check();
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
pooledPage.busy = true;
|
|
42
|
-
return pooledPage;
|
|
43
|
-
}
|
|
44
|
-
async function generateOnPage(page, data, options) {
|
|
45
|
-
const { outputDir = './output', filename = 'output' } = options;
|
|
46
|
-
await fs.mkdir(outputDir, { recursive: true });
|
|
47
|
-
// Clear previous data
|
|
48
|
-
await page.evaluate(() => {
|
|
49
|
-
window['PDF_DATA'] = null;
|
|
50
|
-
});
|
|
51
|
-
// Small delay to ensure Angular detects the null value
|
|
52
|
-
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
53
|
-
// Set new data
|
|
23
|
+
async function renderOnPage(page, data) {
|
|
24
|
+
const renderToken = ++renderTokenCounter;
|
|
25
|
+
// Set the render token
|
|
26
|
+
await page.evaluate((token) => {
|
|
27
|
+
window['RENDER_TOKEN'] = token;
|
|
28
|
+
}, renderToken);
|
|
29
|
+
// Set data - Angular will render and set RENDER_DONE_TOKEN when complete
|
|
54
30
|
await page.evaluate((lessonData) => {
|
|
55
31
|
window['PDF_DATA'] = lessonData;
|
|
56
32
|
}, data);
|
|
57
|
-
// Wait for
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
timeout: PAGE_WAIT_MS,
|
|
61
|
-
polling: 100,
|
|
62
|
-
});
|
|
63
|
-
// Wait for all images to be fully loaded
|
|
33
|
+
// Wait for render completion
|
|
34
|
+
await page.waitForFunction((token) => window['RENDER_DONE_TOKEN'] === token, { timeout: PAGE_WAIT_MS, polling: 100 }, renderToken);
|
|
35
|
+
// Wait for all images to load
|
|
64
36
|
await page.waitForFunction(() => {
|
|
65
37
|
const images = Array.from(document.querySelectorAll('img'));
|
|
66
38
|
return images.every((img) => img.complete && img.naturalHeight > 0);
|
|
67
39
|
}, { timeout: PAGE_WAIT_MS, polling: 100 });
|
|
68
|
-
// Small delay for
|
|
40
|
+
// Small delay for final paint
|
|
69
41
|
await new Promise((resolve) => setTimeout(resolve, RENDER_DELAY));
|
|
70
|
-
const pdfPath = path.join(outputDir, `${filename}.pdf`);
|
|
71
|
-
await page.pdf({
|
|
72
|
-
path: pdfPath,
|
|
73
|
-
printBackground: true,
|
|
74
|
-
width: '210mm', // A4 width
|
|
75
|
-
height: '297mm', // A4 height
|
|
76
|
-
});
|
|
77
|
-
return pdfPath;
|
|
78
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Generate a single PDF.
|
|
45
|
+
* Each call creates a fresh page and closes it when done.
|
|
46
|
+
* Paged.js cannot be safely reused, so one page = one PDF.
|
|
47
|
+
*/
|
|
79
48
|
async function generatePdf(data, options = {}) {
|
|
80
|
-
const
|
|
49
|
+
const { outputDir = './output', filename = 'output' } = options;
|
|
50
|
+
await fs.mkdir(outputDir, { recursive: true });
|
|
51
|
+
const page = await initPage();
|
|
81
52
|
try {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
53
|
+
await renderOnPage(page, data);
|
|
54
|
+
const pdfPath = path.join(outputDir, `${filename}.pdf`);
|
|
55
|
+
await page.pdf({
|
|
56
|
+
path: pdfPath,
|
|
57
|
+
printBackground: true,
|
|
58
|
+
width: '210mm',
|
|
59
|
+
height: '297mm',
|
|
60
|
+
});
|
|
61
|
+
logger.info(`[PDF] Saved: ${pdfPath}`);
|
|
62
|
+
return pdfPath;
|
|
85
63
|
}
|
|
86
64
|
finally {
|
|
87
|
-
|
|
65
|
+
await page.close();
|
|
88
66
|
}
|
|
89
67
|
}
|
|
90
|
-
async function generateBatch(items) {
|
|
91
|
-
logger.info(`[PDF] Processing ${items.length} files with ${POOL_SIZE} parallel workers...`);
|
|
92
|
-
const results = [];
|
|
93
|
-
const promises = items.map(async (item, index) => {
|
|
94
|
-
const result = await generatePdf(item.data, item.options);
|
|
95
|
-
results[index] = result;
|
|
96
|
-
});
|
|
97
|
-
await Promise.all(promises);
|
|
98
|
-
return results;
|
|
99
|
-
}
|
|
100
68
|
async function close() {
|
|
101
|
-
for (const pooledPage of pool) {
|
|
102
|
-
await pooledPage.page.close();
|
|
103
|
-
}
|
|
104
69
|
await browser.close();
|
|
105
70
|
logger.info('[PDF] Browser closed');
|
|
106
71
|
}
|
|
107
72
|
logger.info('[PDF] Browser launched');
|
|
108
|
-
return { browser, generatePdf,
|
|
73
|
+
return { browser, generatePdf, close };
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Process files with bounded concurrency: parse -> generate PDF for each file.
|
|
77
|
+
* Continues on individual failures and returns results for all files.
|
|
78
|
+
*/
|
|
79
|
+
export async function convertWithConcurrency(files, generator, outputDir, concurrency = POOL_SIZE) {
|
|
80
|
+
const results = [];
|
|
81
|
+
const queue = [...files];
|
|
82
|
+
let active = 0;
|
|
83
|
+
let index = 0;
|
|
84
|
+
return new Promise((resolve) => {
|
|
85
|
+
const processNext = () => {
|
|
86
|
+
if (queue.length === 0 && active === 0) {
|
|
87
|
+
resolve(results);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
while (active < concurrency && queue.length > 0) {
|
|
91
|
+
const file = queue.shift();
|
|
92
|
+
const currentIndex = index++;
|
|
93
|
+
active++;
|
|
94
|
+
(async () => {
|
|
95
|
+
const result = { file: file.name, success: false };
|
|
96
|
+
try {
|
|
97
|
+
logger.info(`[${currentIndex + 1}/${files.length}] Parsing: ${file.name}`);
|
|
98
|
+
const parsed = await parseDocx(file.path);
|
|
99
|
+
logger.info(`[${currentIndex + 1}/${files.length}] Generating PDF: ${file.name}`);
|
|
100
|
+
const pdfPath = await generator.generatePdf(parsed.data, {
|
|
101
|
+
outputDir,
|
|
102
|
+
filename: file.name,
|
|
103
|
+
});
|
|
104
|
+
result.success = true;
|
|
105
|
+
result.pdfPath = pdfPath;
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
result.error = err instanceof Error ? err.message : String(err);
|
|
109
|
+
logger.error(`[${currentIndex + 1}/${files.length}] Failed: ${file.name} - ${result.error}`);
|
|
110
|
+
}
|
|
111
|
+
results[currentIndex] = result;
|
|
112
|
+
active--;
|
|
113
|
+
processNext();
|
|
114
|
+
})();
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
processNext();
|
|
118
|
+
});
|
|
109
119
|
}
|
|
110
120
|
//# sourceMappingURL=pdf-generator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdf-generator.js","sourceRoot":"","sources":["../src/pdf-generator.ts"],"names":[],"mappings":"AAAA,OAAO,SAA4B,MAAM,WAAW,CAAC;AACrD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,aAAa,CAAC;AAE7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"pdf-generator.js","sourceRoot":"","sources":["../src/pdf-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sample-data.d.ts","sourceRoot":"","sources":["../src/sample-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,eAAO,MAAM,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"sample-data.d.ts","sourceRoot":"","sources":["../src/sample-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,eAAO,MAAM,gBAAgB,EAAE,YAyD9B,CAAC"}
|
package/dist/sample-data.js
CHANGED
|
@@ -3,6 +3,7 @@ export const sampleLessonData = {
|
|
|
3
3
|
project: 'Crossy Road',
|
|
4
4
|
description: 'Decision making is important when there will be situations with multiple options and an option needs to be selected based on the given conditions.',
|
|
5
5
|
projectExplainer: 'In this lesson, we will create a Crossy Road style game where a penguin needs to cross the road and get to the other side without being hit by cars.',
|
|
6
|
+
programmingLanguage: 'scratch',
|
|
6
7
|
projectImage: null,
|
|
7
8
|
getReadySection: ['Add Backdrop "street"', 'Add Sprites: Car and Penguin (set sizes to 40)'],
|
|
8
9
|
addYourCodeSection: [
|
|
@@ -37,9 +38,13 @@ export const sampleLessonData = {
|
|
|
37
38
|
'Check if the car bounces at the edges',
|
|
38
39
|
],
|
|
39
40
|
challengeSection: [
|
|
40
|
-
{ name: 'Bruise Penguin', task: 'Add sound effects when the penguin gets hit' },
|
|
41
|
-
{ name: 'Add more cars', task: 'Add more cars moving at different speeds' },
|
|
42
|
-
{
|
|
41
|
+
{ name: 'Bruise Penguin', task: 'Add sound effects when the penguin gets hit', hintCode: null },
|
|
42
|
+
{ name: 'Add more cars', task: 'Add more cars moving at different speeds', hintCode: null },
|
|
43
|
+
{
|
|
44
|
+
name: 'Multiple Levels',
|
|
45
|
+
task: 'Create multiple levels with increasing difficulty',
|
|
46
|
+
hintCode: null,
|
|
47
|
+
},
|
|
43
48
|
],
|
|
44
49
|
newProject: {
|
|
45
50
|
name: 'Energy Boost',
|
package/dist/sample-data.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sample-data.js","sourceRoot":"","sources":["../src/sample-data.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAiB;IAC5C,KAAK,EAAE,WAAW;IAClB,OAAO,EAAE,aAAa;IACtB,WAAW,EACT,oJAAoJ;IACtJ,gBAAgB,EACd,sJAAsJ;IACxJ,YAAY,EAAE,IAAI;IAClB,eAAe,EAAE,CAAC,uBAAuB,EAAE,gDAAgD,CAAC;IAC5F,kBAAkB,EAAE;QAClB;YACE,IAAI,EAAE,sHAAsH;YAC5H,KAAK,EAAE,IAAI;SACZ;QACD;YACE,IAAI,EAAE,2FAA2F;YACjG,KAAK,EAAE,IAAI;SACZ;QACD;YACE,IAAI,EAAE,yEAAyE;YAC/E,KAAK,EAAE,IAAI;SACZ;QACD;YACE,IAAI,EAAE,yEAAyE;YAC/E,KAAK,EAAE,IAAI;SACZ;QACD;YACE,IAAI,EAAE,yEAAyE;YAC/E,KAAK,EAAE,IAAI;SACZ;QACD;YACE,IAAI,EAAE,qGAAqG;YAC3G,KAAK,EAAE,IAAI;SACZ;KACF;IACD,eAAe,EAAE;QACf,yCAAyC;QACzC,kDAAkD;QAClD,uCAAuC;KACxC;IACD,gBAAgB,EAAE;QAChB,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,6CAA6C,EAAE;QAC/
|
|
1
|
+
{"version":3,"file":"sample-data.js","sourceRoot":"","sources":["../src/sample-data.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAiB;IAC5C,KAAK,EAAE,WAAW;IAClB,OAAO,EAAE,aAAa;IACtB,WAAW,EACT,oJAAoJ;IACtJ,gBAAgB,EACd,sJAAsJ;IACxJ,mBAAmB,EAAE,SAAS;IAC9B,YAAY,EAAE,IAAI;IAClB,eAAe,EAAE,CAAC,uBAAuB,EAAE,gDAAgD,CAAC;IAC5F,kBAAkB,EAAE;QAClB;YACE,IAAI,EAAE,sHAAsH;YAC5H,KAAK,EAAE,IAAI;SACZ;QACD;YACE,IAAI,EAAE,2FAA2F;YACjG,KAAK,EAAE,IAAI;SACZ;QACD;YACE,IAAI,EAAE,yEAAyE;YAC/E,KAAK,EAAE,IAAI;SACZ;QACD;YACE,IAAI,EAAE,yEAAyE;YAC/E,KAAK,EAAE,IAAI;SACZ;QACD;YACE,IAAI,EAAE,yEAAyE;YAC/E,KAAK,EAAE,IAAI;SACZ;QACD;YACE,IAAI,EAAE,qGAAqG;YAC3G,KAAK,EAAE,IAAI;SACZ;KACF;IACD,eAAe,EAAE;QACf,yCAAyC;QACzC,kDAAkD;QAClD,uCAAuC;KACxC;IACD,gBAAgB,EAAE;QAChB,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,6CAA6C,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC/F,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,0CAA0C,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC3F;YACE,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,mDAAmD;YACzD,QAAQ,EAAE,IAAI;SACf;KACF;IACD,UAAU,EAAE;QACV,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,oEAAoE;KAC3E;IACD,YAAY,EAAE,oBAAoB;IAClC,OAAO,EACL,0FAA0F;CAC7F,CAAC"}
|
package/dist/schemas/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { StepWithImageSchema, StepsWithCodeBlockSchema, ChallengeSchema, NewProjectSchema, ParsedLessonSchema, type StepWithImage, type StepsWithCodeBlock, type Challenge, type NewProject, type ParsedLesson, } from './lesson.js';
|
|
1
|
+
export { StepWithImageSchema, StepsWithCodeBlockSchema, ChallengeSchema, NewProjectSchema, ParsedLessonSchema, type StepWithImage, type StepsWithCodeBlock, type MultipleStepsWithCodeBlock, type Challenge, type NewProject, type ParsedLesson, } from './lesson.js';
|
|
2
2
|
export { GenerateOptionsSchema, type GenerateOptions } from './generation.js';
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,qBAAqB,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,0BAA0B,EAC/B,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,qBAAqB,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,GAOnB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,qBAAqB,EAAwB,MAAM,iBAAiB,CAAC"}
|
package/dist/schemas/lesson.d.ts
CHANGED
|
@@ -1,23 +1,29 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
export declare const languageEnum: z.ZodEnum<{
|
|
3
|
+
none: "none";
|
|
4
|
+
scratch: "scratch";
|
|
5
|
+
"small-basic": "small-basic";
|
|
6
|
+
"javascript or html or css": "javascript or html or css";
|
|
7
|
+
python: "python";
|
|
8
|
+
java: "java";
|
|
9
|
+
c: "c";
|
|
10
|
+
}>;
|
|
2
11
|
export declare const StepWithImageSchema: z.ZodObject<{
|
|
3
12
|
step: z.ZodString;
|
|
4
13
|
image: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
5
14
|
}, z.core.$strip>;
|
|
6
15
|
export declare const StepsWithCodeBlockSchema: z.ZodObject<{
|
|
7
|
-
codeBlock: z.ZodString;
|
|
8
|
-
codeBlockLanguage: z.ZodDefault<z.ZodEnum<{
|
|
9
|
-
none: "none";
|
|
10
|
-
"small-basic": "small-basic";
|
|
11
|
-
"javascript or html or css": "javascript or html or css";
|
|
12
|
-
python: "python";
|
|
13
|
-
java: "java";
|
|
14
|
-
c: "c";
|
|
15
|
-
}>>;
|
|
16
16
|
steps: z.ZodArray<z.ZodString>;
|
|
17
|
+
codeBlock: z.ZodPipe<z.ZodDefault<z.ZodNullable<z.ZodString>>, z.ZodTransform<string | null, string | null>>;
|
|
17
18
|
}, z.core.$strip>;
|
|
19
|
+
export declare const MultipleStepsWithCodeBlockSchema: z.ZodArray<z.ZodObject<{
|
|
20
|
+
steps: z.ZodArray<z.ZodString>;
|
|
21
|
+
codeBlock: z.ZodPipe<z.ZodDefault<z.ZodNullable<z.ZodString>>, z.ZodTransform<string | null, string | null>>;
|
|
22
|
+
}, z.core.$strip>>;
|
|
18
23
|
export declare const ChallengeSchema: z.ZodObject<{
|
|
19
24
|
name: z.ZodString;
|
|
20
25
|
task: z.ZodString;
|
|
26
|
+
hintCode: z.ZodPipe<z.ZodNullable<z.ZodString>, z.ZodTransform<string | null, string | null>>;
|
|
21
27
|
}, z.core.$strip>;
|
|
22
28
|
export declare const NewProjectSchema: z.ZodObject<{
|
|
23
29
|
name: z.ZodString;
|
|
@@ -28,27 +34,32 @@ export declare const ParsedLessonSchema: z.ZodObject<{
|
|
|
28
34
|
project: z.ZodString;
|
|
29
35
|
description: z.ZodString;
|
|
30
36
|
projectExplainer: z.ZodString;
|
|
37
|
+
programmingLanguage: z.ZodDefault<z.ZodEnum<{
|
|
38
|
+
none: "none";
|
|
39
|
+
scratch: "scratch";
|
|
40
|
+
"small-basic": "small-basic";
|
|
41
|
+
"javascript or html or css": "javascript or html or css";
|
|
42
|
+
python: "python";
|
|
43
|
+
java: "java";
|
|
44
|
+
c: "c";
|
|
45
|
+
}>>;
|
|
31
46
|
projectImage: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
32
47
|
getReadySection: z.ZodArray<z.ZodString>;
|
|
33
48
|
addYourCodeSection: z.ZodUnion<readonly [z.ZodArray<z.ZodObject<{
|
|
34
49
|
step: z.ZodString;
|
|
35
50
|
image: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
36
51
|
}, z.core.$strip>>, z.ZodObject<{
|
|
37
|
-
codeBlock: z.ZodString;
|
|
38
|
-
codeBlockLanguage: z.ZodDefault<z.ZodEnum<{
|
|
39
|
-
none: "none";
|
|
40
|
-
"small-basic": "small-basic";
|
|
41
|
-
"javascript or html or css": "javascript or html or css";
|
|
42
|
-
python: "python";
|
|
43
|
-
java: "java";
|
|
44
|
-
c: "c";
|
|
45
|
-
}>>;
|
|
46
52
|
steps: z.ZodArray<z.ZodString>;
|
|
47
|
-
|
|
53
|
+
codeBlock: z.ZodPipe<z.ZodDefault<z.ZodNullable<z.ZodString>>, z.ZodTransform<string | null, string | null>>;
|
|
54
|
+
}, z.core.$strip>, z.ZodArray<z.ZodObject<{
|
|
55
|
+
steps: z.ZodArray<z.ZodString>;
|
|
56
|
+
codeBlock: z.ZodPipe<z.ZodDefault<z.ZodNullable<z.ZodString>>, z.ZodTransform<string | null, string | null>>;
|
|
57
|
+
}, z.core.$strip>>]>;
|
|
48
58
|
tryItOutSection: z.ZodDefault<z.ZodNullable<z.ZodArray<z.ZodString>>>;
|
|
49
59
|
challengeSection: z.ZodArray<z.ZodObject<{
|
|
50
60
|
name: z.ZodString;
|
|
51
61
|
task: z.ZodString;
|
|
62
|
+
hintCode: z.ZodPipe<z.ZodNullable<z.ZodString>, z.ZodTransform<string | null, string | null>>;
|
|
52
63
|
}, z.core.$strip>>;
|
|
53
64
|
newProject: z.ZodObject<{
|
|
54
65
|
name: z.ZodString;
|
|
@@ -57,10 +68,13 @@ export declare const ParsedLessonSchema: z.ZodObject<{
|
|
|
57
68
|
testYourself: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
58
69
|
funFact: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
59
70
|
}, z.core.$strip>;
|
|
71
|
+
export type ProgrammingLanguage = z.infer<typeof languageEnum>;
|
|
60
72
|
export interface StepWithImage extends z.infer<typeof StepWithImageSchema> {
|
|
61
73
|
}
|
|
62
74
|
export interface StepsWithCodeBlock extends z.infer<typeof StepsWithCodeBlockSchema> {
|
|
63
75
|
}
|
|
76
|
+
export interface MultipleStepsWithCodeBlock extends z.infer<typeof MultipleStepsWithCodeBlockSchema> {
|
|
77
|
+
}
|
|
64
78
|
export interface Challenge extends z.infer<typeof ChallengeSchema> {
|
|
65
79
|
}
|
|
66
80
|
export interface NewProject extends z.infer<typeof NewProjectSchema> {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lesson.d.ts","sourceRoot":"","sources":["../../src/schemas/lesson.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"lesson.d.ts","sourceRoot":"","sources":["../../src/schemas/lesson.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,YAAY;;;;;;;;EAQvB,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;iBAG9B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;iBAUnC,CAAC;AAEH,eAAO,MAAM,gCAAgC;;;kBAAoC,CAAC;AAElF,eAAO,MAAM,eAAe;;;;iBAc1B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;iBAS3B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoD7B,CAAC;AAGH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAC/D,MAAM,WAAW,aAAc,SAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC;CAAG;AAC7E,MAAM,WAAW,kBAAmB,SAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC;CAAG;AACvF,MAAM,WAAW,0BAA2B,SAAQ,CAAC,CAAC,KAAK,CACzD,OAAO,gCAAgC,CACxC;CAAG;AACJ,MAAM,WAAW,SAAU,SAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC;CAAG;AACrE,MAAM,WAAW,UAAW,SAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC;CAAG;AACvE,MAAM,WAAW,YAAa,SAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC;CAAG"}
|
package/dist/schemas/lesson.js
CHANGED
|
@@ -1,25 +1,42 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { normaliseCodeBlock } from '../parsing/normalise.js';
|
|
3
|
+
export const languageEnum = z.enum([
|
|
4
|
+
'none',
|
|
5
|
+
'scratch',
|
|
6
|
+
'small-basic',
|
|
7
|
+
'javascript or html or css',
|
|
8
|
+
'python',
|
|
9
|
+
'java',
|
|
10
|
+
'c',
|
|
11
|
+
]);
|
|
2
12
|
export const StepWithImageSchema = z.object({
|
|
3
13
|
step: z.string().describe('The instruction text for this step'),
|
|
4
14
|
image: z.string().nullable().default(null).describe('Image reference if present, otherwise null'),
|
|
5
15
|
});
|
|
6
16
|
export const StepsWithCodeBlockSchema = z.object({
|
|
7
|
-
codeBlock: z.string().describe('The code block that students have to write to get started'),
|
|
8
|
-
codeBlockLanguage: z
|
|
9
|
-
.enum(['none', 'small-basic', 'javascript or html or css', 'python', 'java', 'c'])
|
|
10
|
-
.default('small-basic')
|
|
11
|
-
.describe('The programming language used in the code block. Detect from syntax, "none" if unsure'),
|
|
12
17
|
steps: z
|
|
13
18
|
.array(z.string())
|
|
14
|
-
.describe('The steps listed above the code block but below the "Add your code header
|
|
19
|
+
.describe('The steps listed above the code block but below the "Add your code" header text'),
|
|
20
|
+
codeBlock: z
|
|
21
|
+
.string()
|
|
22
|
+
.nullable()
|
|
23
|
+
.default(null)
|
|
24
|
+
.describe('The code block that students have to write to get started')
|
|
25
|
+
.transform((val) => normaliseCodeBlock(val)),
|
|
15
26
|
});
|
|
27
|
+
export const MultipleStepsWithCodeBlockSchema = z.array(StepsWithCodeBlockSchema);
|
|
16
28
|
export const ChallengeSchema = z.object({
|
|
17
29
|
name: z
|
|
18
30
|
.string()
|
|
19
31
|
.describe('The name of the specific challenge, excluding the "- New Project" text'),
|
|
20
32
|
task: z
|
|
21
33
|
.string()
|
|
22
|
-
.describe('The task for the challenge, explained as a requirement or feature to add'),
|
|
34
|
+
.describe('The task for the challenge, explained as a requirement or feature to add, there could be a hint, if it is definitely not code but plain english, include it'),
|
|
35
|
+
hintCode: z
|
|
36
|
+
.string()
|
|
37
|
+
.nullable()
|
|
38
|
+
.describe('Code that gives a hint on how to complete the challenge (only code allowed)')
|
|
39
|
+
.transform((val) => normaliseCodeBlock(val)),
|
|
23
40
|
});
|
|
24
41
|
export const NewProjectSchema = z.object({
|
|
25
42
|
name: z
|
|
@@ -40,6 +57,9 @@ export const ParsedLessonSchema = z.object({
|
|
|
40
57
|
.string()
|
|
41
58
|
.describe('A brief description explaining the programming concept being taught'),
|
|
42
59
|
projectExplainer: z.string().describe('Explanation of what will be built in this lesson'),
|
|
60
|
+
programmingLanguage: languageEnum
|
|
61
|
+
.default('none')
|
|
62
|
+
.describe('The programming language used in this lesson, figurable through code visible or wording'),
|
|
43
63
|
projectImage: z
|
|
44
64
|
.string()
|
|
45
65
|
.nullable()
|
|
@@ -53,6 +73,7 @@ export const ParsedLessonSchema = z.object({
|
|
|
53
73
|
.array(StepWithImageSchema)
|
|
54
74
|
.describe('Step-by-step coding instructions, each step may have an associated image'),
|
|
55
75
|
StepsWithCodeBlockSchema.describe('A block of code given with steps on what it does'),
|
|
76
|
+
MultipleStepsWithCodeBlockSchema.describe('Multiple steps with a code block directly following each, or some without a code block'),
|
|
56
77
|
]),
|
|
57
78
|
tryItOutSection: z
|
|
58
79
|
.array(z.string())
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lesson.js","sourceRoot":"","sources":["../../src/schemas/lesson.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"lesson.js","sourceRoot":"","sources":["../../src/schemas/lesson.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@digimakers/core",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Core library for Digimaker - docx to PDF conversion",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
"pino": "^10.2.0",
|
|
30
30
|
"pino-pretty": "^13.1.3",
|
|
31
31
|
"puppeteer": "24.35.0",
|
|
32
|
+
"word-extractor": "^1.0.4",
|
|
32
33
|
"zod": "4.3.5"
|
|
33
34
|
},
|
|
34
35
|
"devDependencies": {
|