-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.ts
100 lines (75 loc) · 2.58 KB
/
main.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import puppeteer from 'puppeteer'
import fs from 'fs'
import path from 'path'
import PDFDocument from 'pdfkit'
interface CodeQuestion {
question: string;
code: string;
}
const runCodes = async (page: puppeteer.Page) => {
return new Promise(async(resolve, reject) => {
try {
console.log('🙂 Getting screenshots...')
const readCodesList = fs.readFileSync(path.resolve(__dirname, 'utils/codes.json'))
const codesList = JSON.parse(readCodesList.toString()) as [CodeQuestion];
// first, load the prints
for(let i = 0; i < codesList.length; i++){
await insertAndRun(page, codesList[i].code, i)
await page.reload()
};
await createPDF(codesList)
resolve(true)
} catch (e) {
reject(e);
}
})
}
const createPDF = async (codesList: [CodeQuestion]) => {
return new Promise(async (resolve, reject) => {
console.log('⏰ Creating PDF...')
const doc = new PDFDocument({ layout: 'portrait'});
doc.pipe(fs.createWriteStream('docs/output.pdf'))
doc.font('fonts/arial.ttf').fontSize(12)
for(let i = 0; i < codesList.length; i++){
doc.text(codesList[i].question)
doc.moveDown()
doc.image(`screenshots/${i}.jpg`, {
fit: [250, 300],
align: 'center',
})
doc.moveDown()
doc.moveDown()
};
doc.end()
resolve(true);
})
}
const insertAndRun = async (page: puppeteer.Page, text: string, index: number) => {
return new Promise(async(resolve, reject) => {
try {
await page.focus('#codeInputPane > textarea')
await page.keyboard.type(text)
await page.click('#executeBtn')
setTimeout(async () => {
const lastLineButton = await page.$('#jmpLastInstr');
if(lastLineButton){
await lastLineButton.click()
await page.screenshot({ path: `screenshots/${index}.jpg`})
resolve(true)
}
}, 1000)
} catch (error) {
console.log(error)
reject(error)
}
})
}
(async () => {
console.log('🚀 Launching process...')
const browser = await puppeteer.launch()
const page = await browser.newPage()
await page.goto('http://www.pythontutor.com/visualize.html')
await runCodes(page)
await browser.close()
console.log('✅ All is done!')
})()