Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quantum-kittens
GitHub Repository: quantum-kittens/platypus
Path: blob/main/converter/converter.ts
3338 views
1
import { spawn } from 'child_process'
2
import * as path from 'path'
3
4
import * as fs from 'fs-extra'
5
6
import {
7
translationsLanguages,
8
workingContentPath,
9
workingTranslationsPath
10
} from './common'
11
12
const CWD = process.cwd()
13
const nbImagesDirName = 'images'
14
const nbResourcesDirName = 'resources'
15
const nbDir = path.join(CWD, 'notebooks')
16
const nbDirTranslations = path.join(CWD, 'translations')
17
18
const getNotebookPath = function (language: string = 'en') {
19
return language == 'en' ? nbDir : path.join(nbDirTranslations, language)
20
}
21
22
const getTOCPath = function (language: string = 'en') {
23
return path.join(getNotebookPath(language), 'toc.yaml')
24
}
25
26
const getWorkingPath = function (language: string = 'en') {
27
return language == 'en' ? workingContentPath : path.join(workingTranslationsPath, language)
28
}
29
30
const copyNotebookAssets = function (
31
srcDir: string, destDir: string, filterFunc: CallableFunction
32
) {
33
console.log(`textbook converter: Copying assets from ${srcDir}`)
34
35
fs.copySync(srcDir, destDir, {
36
filter: (src: string, dest: string) => {
37
const name = path.basename(src)
38
if (name.startsWith('.')) {
39
return false
40
} else if (fs.statSync(src).isDirectory()) {
41
return true
42
} else {
43
return filterFunc(src, dest)
44
}
45
}
46
})
47
}
48
49
const runConverter = function (
50
tocPath: string,
51
nbPath: string,
52
outPath: string
53
) {
54
console.log('textbook converter', arguments)
55
56
const converterPath = path.join(CWD, 'converter', 'textbook-converter')
57
58
// TODO: replace converter Python implementation with a Node.js implementation
59
return spawn('python3', [
60
'-u', '-m',
61
'textbook_converter', tocPath,
62
'-n', nbPath,
63
'-o', outPath
64
], {
65
cwd: converterPath
66
})
67
}
68
69
const clean = function () {
70
// Ensure that the directories containing the md files are empty
71
fs.emptyDirSync(workingContentPath)
72
fs.emptyDirSync(workingTranslationsPath)
73
}
74
75
const prepare = function (language: string) {
76
const notebooks = getNotebookPath(language)
77
const working = getWorkingPath(language)
78
79
const notebooksShared = path.join(notebooks, 'shared')
80
const workingShared = path.join(working, 'shared')
81
82
// copy over `shared/`
83
if (fs.existsSync(notebooksShared)) {
84
fs.copySync(notebooksShared, workingShared)
85
} else {
86
// default to English if doesn't exist
87
const shared = path.join(getNotebookPath('en'), 'shared')
88
fs.copySync(shared, workingShared)
89
}
90
91
// copy over notebook `images/`
92
copyNotebookAssets(notebooks, working, (src: string, dest: string) => {
93
return path.dirname(src).split(path.sep).indexOf(nbImagesDirName) > -1
94
})
95
96
// copy over notebook `resources/`
97
copyNotebookAssets(notebooks, working, (src: string, dest: string) => {
98
return path.dirname(src).split(path.sep).indexOf(nbResourcesDirName) > -1
99
})
100
}
101
102
const convert = function (language: string) {
103
// run Python converter package
104
const subprocess = runConverter(
105
getTOCPath(language),
106
getNotebookPath(language),
107
getWorkingPath(language)
108
)
109
110
subprocess.stdout.on('data', (data) => {
111
console.log(`textbook converter [${language}]: ${data}`)
112
});
113
subprocess.stderr.on('data', (data) => {
114
console.error(`textbook converter [${language}]: ${data}`)
115
});
116
subprocess.on('close', () => {
117
console.log(`textbook converter [${language}]: completed`)
118
})
119
}
120
121
const run = function () {
122
// run conversion for each available language
123
124
const notebooks = getNotebookPath()
125
const working = getWorkingPath()
126
const workingShared = path.join(working, 'shared')
127
128
// copy toc.yaml
129
copyNotebookAssets(notebooks, workingShared, (src: string, dest: string) => {
130
return src.includes('toc.yaml')
131
})
132
133
translationsLanguages.forEach(language => {
134
prepare(language)
135
convert(language)
136
})
137
}
138
139
clean()
140
run()
141
142