-
Notifications
You must be signed in to change notification settings - Fork 377
/
index.js
97 lines (84 loc) 路 2.95 KB
/
index.js
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
var themeServer = process.env.THEME_SERVER || 'https://themes.jsonresume.org/theme/';
var registryServer = process.env.REGISTRY_SERVER || 'https://registry.jsonresume.org';
var request = require('superagent');
var http = require('http');
var fs = require('fs');
var path = require('path');
var read = require('read');
var spinner = require("char-spinner");
var chalk = require('chalk');
var puppeteer = require('puppeteer');
var renderHtml = require("../render-html");
var SUPPORTED_FILE_FORMATS = ["html", "pdf"];
module.exports = function exportResume(resumeJson, fileName, program, callback) {
var theme = program.theme;
if (!fileName) {
console.error("Please enter a export destination.");
process.exit(1);
}
var fileNameAndFormat = getFileNameAndFormat(fileName, program.format);
fileName = fileNameAndFormat.fileName;
var fileFormatToUse = fileNameAndFormat.fileFormatToUse;
var format = "." + fileFormatToUse;
if (format === '.html') {
createHtml(resumeJson, fileName, theme, format, function() {
callback(null, fileName, format);
});
}
else if (format === '.pdf') {
createPdf(resumeJson, fileName, theme, format, function() {
callback(null, fileName, format);
});
}
else {
console.error(`JSON Resume does not support the ${format} format`);
process.exit(1);
}
}
function extractFileFormat(fileName) {
var dotPos = fileName.lastIndexOf('.');
if (dotPos === -1) {
return null;
}
return fileName.substring(dotPos + 1).toLowerCase();
}
async function createHtml(resumeJson, fileName, theme, format, callback) {
try {
const html = await renderHtml(resumeJson, theme);
var stream = fs.createWriteStream(
path.resolve(process.cwd(), fileName + format)
);
stream.write(html, function() {
stream.close(callback);
});
} catch (err) {
// Theme not installed
console.log('You have to install this theme globally to use it e.g. `npm install -g ' + theme + '`')
process.exit();
}
}
function createPdf(resumeJson, fileName, theme, format, callback) {
(async () => {
const html = await renderHtml(resumeJson, theme);
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.emulateMedia('screen');
await page.goto(`data:text/html,${html}`, { waitUntil: 'networkidle0' });
await page.pdf({path: fileName + format, format: 'Letter', printBackground: true});
await browser.close();
})();
}
function getFileNameAndFormat(fileName, format) {
var fileFormatFound = extractFileFormat(fileName);
var fileFormatToUse = format;
if (format && fileFormatFound && format === fileFormatFound) {
fileName = fileName.substring(0, fileName.lastIndexOf('.'));
} else if (fileFormatFound) {
fileFormatToUse = fileFormatFound;
fileName = fileName.substring(0, fileName.lastIndexOf('.'));
}
return {
fileName: fileName,
fileFormatToUse: fileFormatToUse
};
}