Files
wordpress-export-to-markdown/src/writer.js
T
2019-12-17 14:03:58 -05:00

112 lines
2.8 KiB
JavaScript

const fs = require('fs');
const luxon = require('luxon');
const path = require('path');
const request = require('request');
const shared = require('./shared');
function writeFiles(posts, config) {
let delay = 0;
posts.forEach(post => {
const postDir = getPostDir(post, config);
createDir(postDir);
writeMarkdownFile(post, postDir, config);
if (config.saveimages && post.meta.imageUrls) {
post.meta.imageUrls.forEach(imageUrl => {
const imageDir = path.join(postDir, 'images');
createDir(imageDir);
writeImageFile(imageUrl, imageDir, delay);
delay += 25;
});
}
});
}
function writeMarkdownFile(post, postDir, config) {
const frontmatter = Object.entries(post.frontmatter)
.reduce((accumulator, pair) => {
return accumulator + pair[0] + ': "' + pair[1] + '"\n'
}, '');
const data = '---\n' + frontmatter + '---\n\n' + post.content + '\n';
const postPath = path.join(postDir, getPostFilename(post, config));
fs.writeFile(postPath, data, (err) => {
if (err) {
console.log('Unable to write file.')
console.log(err);
} else {
console.log('Wrote ' + postPath + '.');
}
});
}
function writeImageFile(imageUrl, imageDir, delay) {
let imagePath = path.join(imageDir, shared.getFilenameFromUrl(imageUrl));
let stream = fs.createWriteStream(imagePath);
stream.on('finish', () => {
console.log('Saved ' + imagePath + '.');
});
// stagger image requests so we don't piss off hosts
setTimeout(() => {
request
.get(imageUrl)
.on('response', response => {
if (response.statusCode !== 200) {
console.log('Response status code ' + response.statusCode + ' received for ' + imageUrl + '.');
}
})
.on('error', err => {
console.log('Unable to download image.');
console.log(err);
})
.pipe(stream);
}, delay);
}
function createDir(dir) {
try {
fs.accessSync(dir, fs.constants.F_OK);
} catch (ex) {
fs.mkdirSync(dir, { recursive: true });
}
}
function getPostDir(post, config) {
let dir = config.output;
let dt = luxon.DateTime.fromISO(post.frontmatter.date);
if (config.yearmonthfolders) {
dir = path.join(dir, dt.toFormat('yyyy'), dt.toFormat('LL'));
} else if (config.yearfolders) {
dir = path.join(dir, dt.toFormat('yyyy'));
}
if (config.postfolders) {
let folder = post.meta.slug;
if (config.prefixdate) {
folder = dt.toFormat('yyyy-LL-dd') + '-' + folder;
}
dir = path.join(dir, folder);
}
return dir;
}
function getPostFilename(post, config) {
if (config.postfolders) {
// the containing folder name will be unique, just use index.md here
return 'index.md';
} else {
let filename = post.meta.slug + '.md';
if (config.prefixdate) {
let dt = luxon.DateTime.fromISO(post.frontmatter.date);
filename = dt.toFormat('yyyy-LL-dd') + '-' + filename;
}
return filename;
}
}
exports.writeFiles = writeFiles;