58 lines
1.6 KiB
JavaScript
58 lines
1.6 KiB
JavaScript
const path = require('path');
|
|
const fs = require('fs-extra');
|
|
const { Observable } = require('rxjs');
|
|
const { map, filter } = require('rxjs/operators');
|
|
const readdirp = require('readdirp-walk');
|
|
const matter = require('gray-matter');
|
|
|
|
const { chunkDocument, stripHTML, stripURLs } = require('../../utils');
|
|
|
|
const { LOCALE: lang = 'english' } = process.env;
|
|
|
|
const selectedGuideDir = `../../../guide/${lang}`;
|
|
const guideRoot = path.resolve(__dirname, selectedGuideDir);
|
|
|
|
function fileStream(root) {
|
|
return Observable.create(observer =>
|
|
readdirp({ root, fileFilter: '*.md' })
|
|
.on('data', file => (file.stat.isFile() ? observer.next(file) : null))
|
|
.on('error', e => observer.error(e))
|
|
.on('end', () => observer.complete())
|
|
);
|
|
}
|
|
|
|
function parseFile(file) {
|
|
const fileContents = fs.readFileSync(file.fullPath);
|
|
return { ...file, ...matter(fileContents) };
|
|
}
|
|
|
|
function buildArticle(file) {
|
|
const {
|
|
path,
|
|
content,
|
|
data: { title }
|
|
} = file;
|
|
const url = path.replace(/\/index.md$/, '');
|
|
const article = {
|
|
content: stripURLs(stripHTML(content)),
|
|
category: url.split('/').filter(Boolean)[0],
|
|
title,
|
|
url: `/${url}`,
|
|
id: url.replace('/', '-')
|
|
};
|
|
return chunkDocument(article, ['title', 'url', 'id', 'category'], 'content');
|
|
}
|
|
|
|
function filterStubs(articleChunks) {
|
|
return !articleChunks.some(chunk =>
|
|
chunk.content.includes('This is a stub. Help our community expand it')
|
|
);
|
|
}
|
|
|
|
exports.getGuideArticleData = () =>
|
|
fileStream(guideRoot).pipe(
|
|
map(file => parseFile(file)),
|
|
map(file => buildArticle(file)),
|
|
filter(article => filterStubs(article))
|
|
);
|