You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
4.5 KiB
JavaScript
160 lines
4.5 KiB
JavaScript
12 months ago
|
'use strict';
|
||
|
|
||
|
let config;
|
||
|
try {
|
||
|
config = require('../.config.js');
|
||
|
} finally {
|
||
|
if (!config || !config.uri) {
|
||
|
console.error('No Config or config.URI given, please create a .config.js file with those values in the root of the repository');
|
||
|
process.exit(-1);
|
||
|
}
|
||
|
}
|
||
|
const cheerio = require('cheerio');
|
||
|
const docsFilemap = require('../docs/source');
|
||
|
const fs = require('fs');
|
||
|
const pug = require('pug');
|
||
|
const mongoose = require('../');
|
||
|
let { version } = require('../package.json');
|
||
|
|
||
|
const { marked: markdown } = require('marked');
|
||
|
const highlight = require('highlight.js');
|
||
|
markdown.setOptions({
|
||
|
highlight: function(code) {
|
||
|
return highlight.highlight(code, { language: 'JavaScript' }).value;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// 5.13.5 -> 5.x, 6.8.2 -> 6.x, etc.
|
||
|
version = version.slice(0, version.indexOf('.')) + '.x';
|
||
|
|
||
|
const contentSchema = new mongoose.Schema({
|
||
|
title: { type: String, required: true },
|
||
|
body: { type: String, required: true },
|
||
|
url: { type: String, required: true },
|
||
|
version: { type: String, required: true, default: version },
|
||
|
versionNumber: { type: Number, required: true, default: version.replace(/\.x$/, '') }
|
||
|
});
|
||
|
contentSchema.index({ title: 'text', body: 'text' });
|
||
|
const Content = mongoose.model('Content', contentSchema, 'Content');
|
||
|
|
||
|
const contents = [];
|
||
|
|
||
|
for (const [filename, file] of Object.entries(docsFilemap.fileMap)) {
|
||
|
if (file.api) {
|
||
|
for (const prop of file.props) {
|
||
|
const content = new Content({
|
||
|
title: `API: ${prop.name}`,
|
||
|
body: prop.description,
|
||
|
url: `${filename}#${prop.anchorId}`
|
||
|
});
|
||
|
const err = content.validateSync();
|
||
|
if (err != null) {
|
||
|
console.error(content);
|
||
|
throw err;
|
||
|
}
|
||
|
contents.push(content);
|
||
|
}
|
||
|
} else if (file.markdown) {
|
||
|
let text = fs.readFileSync(filename, 'utf8');
|
||
|
text = markdown.parse(text);
|
||
|
|
||
|
const content = new Content({
|
||
|
title: file.title,
|
||
|
body: text,
|
||
|
url: filename.replace('.md', '.html').replace(/^docs/, '')
|
||
|
});
|
||
|
|
||
|
content.validateSync();
|
||
|
|
||
|
const $ = cheerio.load(text);
|
||
|
|
||
|
contents.push(content);
|
||
|
|
||
|
// Break up individual h3's into separate content for more fine grained search
|
||
|
$('h3').each((index, el) => {
|
||
|
el = $(el);
|
||
|
const title = el.text();
|
||
|
const html = el.nextUntil('h3').html();
|
||
|
const content = new Content({
|
||
|
title: `${file.title}: ${title}`,
|
||
|
body: html,
|
||
|
url: `${filename.replace('.md', '.html').replace(/^docs/, '')}#${el.prop('id')}`
|
||
|
});
|
||
|
|
||
|
content.validateSync();
|
||
|
contents.push(content);
|
||
|
});
|
||
|
} else if (file.guide) {
|
||
|
let text = fs.readFileSync(filename, 'utf8');
|
||
|
text = text.substr(text.indexOf('block content') + 'block content\n'.length);
|
||
|
text = pug.render(`div\n${text}`, { filters: { markdown }, filename });
|
||
|
|
||
|
const content = new Content({
|
||
|
title: file.title,
|
||
|
body: text,
|
||
|
url: filename.replace('.pug', '.html').replace(/^docs/, '')
|
||
|
});
|
||
|
|
||
|
content.validateSync();
|
||
|
|
||
|
const $ = cheerio.load(text);
|
||
|
|
||
|
contents.push(content);
|
||
|
|
||
|
// Break up individual h3's into separate content for more fine grained search
|
||
|
$('h3').each((index, el) => {
|
||
|
el = $(el);
|
||
|
const title = el.text();
|
||
|
const html = el.nextUntil('h3').html();
|
||
|
const content = new Content({
|
||
|
title: `${file.title}: ${title}`,
|
||
|
body: html,
|
||
|
url: `${filename.replace('.pug', '.html').replace(/^docs/, '')}#${el.prop('id')}`
|
||
|
});
|
||
|
|
||
|
content.validateSync();
|
||
|
contents.push(content);
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
run().catch(async error => {
|
||
|
console.error(error.stack);
|
||
|
|
||
|
// ensure the script exists in case of error
|
||
|
await mongoose.disconnect();
|
||
|
});
|
||
|
|
||
|
async function run() {
|
||
|
await mongoose.connect(config.uri, { dbName: 'mongoose', serverSelectionTimeoutMS: 5000 });
|
||
|
|
||
|
// wait for the index to be created
|
||
|
await Content.init();
|
||
|
|
||
|
await Content.deleteMany({ version });
|
||
|
for (const content of contents) {
|
||
|
if (version === '7.x') {
|
||
|
let url = content.url.startsWith('/') ? content.url : `/${content.url}`;
|
||
|
if (!url.startsWith('/docs')) {
|
||
|
url = '/docs' + url;
|
||
|
}
|
||
|
content.url = url;
|
||
|
} else {
|
||
|
const url = content.url.startsWith('/') ? content.url : `/${content.url}`;
|
||
|
content.url = `/docs/${version}/docs${url}`;
|
||
|
}
|
||
|
await content.save();
|
||
|
}
|
||
|
|
||
|
const results = await Content.
|
||
|
find({ $text: { $search: 'validate' }, version }, { score: { $meta: 'textScore' } }).
|
||
|
sort({ score: { $meta: 'textScore' } }).
|
||
|
limit(10);
|
||
|
|
||
|
console.log(results.map(res => res.url));
|
||
|
|
||
|
console.log(`Added ${contents.length} Content`);
|
||
|
|
||
|
process.exit(0);
|
||
|
}
|