mirror of
https://github.com/10h30/wordpress-export-to-markdown.git
synced 2026-06-05 15:09:59 +09:00
112 lines
2.8 KiB
JavaScript
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;
|