@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 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';
@@ -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;AACxD,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,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"}
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,GAQtB,MAAM,oBAAoB,CAAC;AAE5B,iBAAiB;AACjB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGxD,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
+ {"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,EAAE,MAAM,qBAAqB,CAAC;AAGvE,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,CA4DtE"}
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 images in parallel
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.debug(`Extracted ${text.length} characters and ${allImages.length} images`);
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: ParsedLessonSchema,
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
- if (stepImages.length > 0 && Array.isArray(data.addYourCodeSection)) {
65
- data.addYourCodeSection.forEach((step, index) => {
66
- step.image = stepImages[index] ?? null;
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":"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"}
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,EAA+B,MAAM,qBAAqB,CAAC;AACtF,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAQ/D,6BAA6B;AAC7B,MAAM,MAAM,GAAG,wBAAwB,CAAC;IACtC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;CACnC,CAAC,CAAC;AAEH,+CAA+C;AAC/C,KAAK,UAAU,aAAa,CAAC,MAAc;IACzC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,MAAM,OAAO,CAAC,aAAa,CACzB,EAAE,MAAM,EAAE,EACV;QACE,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACtD,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,QAAQ,KAAK,CAAC,WAAW,WAAW,MAAM,EAAE,CAAC;YAC7D,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;QAC1B,CAAC,CAAC;KACH,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,6CAA6C;AAC7C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB;IAC9C,MAAM,CAAC,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC;IAEpC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAE3C,wDAAwD;IACxD,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACrE,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAClC,aAAa,CAAC,MAAM,CAAC;QACrB,yBAAyB,CAAC,QAAQ,CAAC;KACpC,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvB,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,MAAM,mBAAmB,SAAS,CAAC,MAAM,SAAS,CAAC,CAAC;IAClF,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,qCAAqC,cAAc,EAAE,CAAC,CAAC;IACrE,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC3C,CAAC;IAED,wDAAwD;IACxD,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEtC,MAAM,CAAC,IAAI,CACT,SAAS,UAAU,CAAC,MAAM,+BAA+B,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CACvF,CAAC;IAEF,sEAAsE;IACtE,MAAM,SAAS,GAAG,cAAc;QAC9B,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC;QACxD,CAAC,CAAC,kBAAkB,CAAC;IAEvB,qCAAqC;IACrC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC;QACpC,KAAK,EAAE,MAAM,CAAC,kBAAkB,CAAC;QACjC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,SAAS;SAClB,CAAC;QACF,MAAM,EAAE;;;;;;;;;EASV,IAAI,EAAE;KACL,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,CAAC,IAAI,CAAC,kCAAkC,MAAO,CAAC,KAAK,MAAM,MAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAEpF,6EAA6E;IAC7E,MAAM,IAAI,GAAG,MAAsB,CAAC;IACpC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IAEjC,mFAAmF;IACnF,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC,mBAAmB,GAAG,cAAqC,CAAC;IACnE,CAAC;IAED,8BAA8B;IAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC;IAC3C,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACvD,MAAM,oBAAoB,GAAG,UAAU,CAAC,KAAK,CAC3C,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI,CACtE,CAAC;QAEF,IAAI,oBAAoB,EAAE,CAAC;YACxB,UAA8B,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBACtD,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;YACzC,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAElB,OAAO;QACL,IAAI;QACJ,UAAU,EAAE,QAAQ;KACrB,CAAC;AACJ,CAAC"}
@@ -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,2 @@
1
+ export declare function normaliseCodeBlock(code: string | null): string | null;
2
+ //# sourceMappingURL=normalise.d.ts.map
@@ -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"}
@@ -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;AAGnE,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,aAAa,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,EAAE,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChG,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAWD,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAkIzF"}
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"}
@@ -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
- const POOL_SIZE = 4;
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 pool = [];
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 getAvailablePage() {
23
- let pooledPage = pool.find((p) => !p.busy);
24
- if (!pooledPage && pool.length < POOL_SIZE) {
25
- const page = await initPage();
26
- pooledPage = { page, busy: false };
27
- pool.push(pooledPage);
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 Paged.js to fully complete pagination
58
- // The LessonPreviewComponent sets window.PAGED_READY = true when done
59
- await page.waitForFunction(() => window['PAGED_READY'] === true, {
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 any final paint operations
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 pooledPage = await getAvailablePage();
49
+ const { outputDir = './output', filename = 'output' } = options;
50
+ await fs.mkdir(outputDir, { recursive: true });
51
+ const page = await initPage();
81
52
  try {
82
- const result = await generateOnPage(pooledPage.page, data, options);
83
- logger.info(`[PDF] Saved: ${result}`);
84
- return result;
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
- pooledPage.busy = false;
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, generateBatch, close };
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":"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"}
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,YAoD9B,CAAC"}
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"}
@@ -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
- { name: 'Multiple Levels', task: 'Create multiple levels with increasing difficulty' },
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',
@@ -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/E,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,0CAA0C,EAAE;QAC3E,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,mDAAmD,EAAE;KACvF;IACD,UAAU,EAAE;QACV,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,oEAAoE;KAC3E;IACD,YAAY,EAAE,oBAAoB;IAClC,OAAO,EACL,0FAA0F;CAC7F,CAAC"}
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"}
@@ -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,GAMnB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,qBAAqB,EAAwB,MAAM,iBAAiB,CAAC"}
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"}
@@ -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
- }, z.core.$strip>]>;
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;AAExB,eAAO,MAAM,mBAAmB;;;iBAG9B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;;;iBAanC,CAAC;AAEH,eAAO,MAAM,eAAe;;;iBAO1B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;iBAS3B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4C7B,CAAC;AAGH,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,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"}
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"}
@@ -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", says "Main Program"'),
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":"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"}
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.4",
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": {