Skip to content

Commit

Permalink
refactor(script): make script for generating project docs reusable
Browse files Browse the repository at this point in the history
  • Loading branch information
ourai committed Apr 9, 2024
1 parent c3b4aa5 commit 59733a1
Show file tree
Hide file tree
Showing 9 changed files with 180 additions and 168 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@nop/website",
"version": "0.0.0",
"version": "0.0.1",
"description": "Official website",
"private": true,
"main": "index.js",
Expand Down
2 changes: 1 addition & 1 deletion scripts/clean.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const { resolve: resolvePath } = require('path');
const { getConfig, rm } = require('./helper');
const { getConfig, rm } = require('@knosys/sdk');

const rootPath = resolvePath(__dirname, '..');
const patterns = [
Expand Down
4 changes: 3 additions & 1 deletion scripts/copy.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
const { resolve: resolvePath } = require('path');
const { ensureDirExists, copyFileDeeply } = require('@knosys/sdk');
const { execute } = require('ksio');

const { getConfig, ensureDirExists, copyFileDeeply, execute, getNopThemeDirPath } = require('./helper');
const { getNopThemeDirPath } = require('./helper');

const rootPath = resolvePath(__dirname, '..');

Expand Down
150 changes: 6 additions & 144 deletions scripts/gen/index.js
Original file line number Diff line number Diff line change
@@ -1,149 +1,11 @@
const { resolve: resolvePath } = require('path');
const { existsSync } = require('fs');
const { isArray, isPlainObject, capitalize } = require('@ntks/toolbox');
const { readData } = require('@knosys/sdk');

const { resolveRootPath, getConfig, ensureDirExists, readData, saveData, normalizeFrontMatter, execute, resolveSiteSrcDir } = require('../helper');

function resolveSlug(uri) {
return `${uri.replace(/(?:\/)?(index)?\.md$/, '') || 'index'}`;
}

function resolveDefaultDocToc(docs, docData) {
return docs.map(({ title, uri, children }) => {
const resolved = {};

if (title) {
resolved.text = title;
}

const slug = resolveSlug(uri);

resolved.slug = slug;
docData[slug] = { title: title || '', slug };

if (children) {
resolved.items = resolveDefaultDocToc(children, docData);
}

return resolved;
});
}

function resolveCustomizedDocToc(srcPath, items, parentUri, docData) {
const resolved = [];

items.forEach(({ text, uri, children }) => {
const item = {};

if (text) {
item.text = text;
}

if (isArray(children)) {
item.items = resolveCustomizedDocToc(srcPath, children, uri, docData);
} else {
if (uri) {
let docFile;

if (uri.startsWith('./')) {
docFile = uri;
} else {
docFile = `./${parentUri ? [parentUri.replace(/^\\\./, ''), uri].join('/') : uri}`;
}

const docPath = resolvePath(srcPath, docFile);

if (!existsSync(docPath)) {
return;
}

if (!item.text) {
const content = readData(docPath);

if (content) {
const normalized = normalizeFrontMatter(content);

if (normalized.data && normalized.data.title) {
item.text = normalized.data.title;
}
}
}

item.slug = resolveSlug(docFile.slice(2));
docData[item.slug] = { title: item.text || '', slug: item.slug };
}
}

resolved.push(item);
});

return resolved;
}

function resolveDocToc(srcPath, docs, docData) {
const customizedTocPath = `${srcPath}/.meta/toc.yml`;

if (existsSync(customizedTocPath)) {
return resolveCustomizedDocToc(srcPath, readData(customizedTocPath), '', docData);
}

return resolveDefaultDocToc(docs.structure, docData);
}

function resolveRepoData(config, site) {
const rootPath = resolveRootPath();
const cookbook = readData(resolvePath(__dirname, './cookbook.yml'));
const siteDataDir = resolvePath(rootPath, `${resolveSiteSrcDir(site)}${config.generator === 'hexo' ? '/source' : ''}/_data`);

const projectRepos = {};

Object.entries(config.data).forEach(([srcKey, srcDir]) => {
if (!srcKey.startsWith('project-')) {
return;
}

const docData = {};
const toc = resolveDocToc(resolvePath(rootPath, srcDir), readData(`${siteDataDir}/knosys/${srcKey}/docs.yml`), docData);

const projectSlug = srcKey.replace(/^project\-/, '');

projectRepos[projectSlug] = {
name: `${projectSlug.split('-').map(w => capitalize(w)).join(' ')} 项目文档`,
base: `/projects/${projectSlug}`,
collection: 'docs',
toc,
};

saveData(`${siteDataDir}/knosys/${projectSlug}.yml`, { items: docData });
});

ensureDirExists(`${siteDataDir}/local`);
saveData(`${siteDataDir}/local/repos.yml`, { cookbook, ...projectRepos });
}
const { generateProjectDocs } = require('../helper');

module.exports = {
execute: (site = 'default', sourceKey) => {
const siteConfig = getConfig(`site.${site}`);
const { data } = siteConfig;

let keys = [];

if (data) {
if (isPlainObject(data)) {
if (sourceKey) {
if (data[sourceKey]) {
keys.push(sourceKey);
}
} else {
keys = Object.keys(data);
}
}
}

keys.forEach(key => execute('generate', site, key));

if (siteConfig.generator === 'hexo') {
setTimeout(() => resolveRepoData(siteConfig, site));
}
},
execute: (site = 'default', sourceKey) => generateProjectDocs(site, {
sourceKey,
repos: { cookbook: readData(resolvePath(__dirname, './cookbook.yml')) }
}),
};
18 changes: 0 additions & 18 deletions scripts/helper.js

This file was deleted.

10 changes: 10 additions & 0 deletions scripts/helper/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
const { resolve: resolvePath } = require('path');
const { resolveRootPath } = require('@knosys/sdk');

const utils = require('./nop-project');

function getNopThemeDirPath() {
return resolvePath(resolveRootPath(), utils.resolveSiteSrcDir('default'), 'themes/nop-project');
}

module.exports = { ...utils, getNopThemeDirPath };
151 changes: 151 additions & 0 deletions scripts/helper/nop-project.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
const { resolve: resolvePath } = require('path');
const { existsSync } = require('fs');
const { isArray, isPlainObject, capitalize } = require('@ntks/toolbox');
const { resolveRootPath, getConfig, ensureDirExists, readData, saveData, normalizeFrontMatter } = require('@knosys/sdk');
const { execute } = require('ksio');

function resolveSiteSrcDir(site) {
return getConfig(`site.${site}.source`) || `./.knosys/sites/${site}`;
}

function resolveSlug(uri) {
return `${uri.replace(/(?:\/)?(index)?\.md$/, '') || 'index'}`;
}

function resolveDefaultDocToc(docs, docData) {
return docs.map(({ title, uri, children }) => {
const resolved = {};

if (title) {
resolved.text = title;
}

const slug = resolveSlug(uri);

resolved.slug = slug;
docData[slug] = { title: title || '', slug };

if (children) {
resolved.items = resolveDefaultDocToc(children, docData);
}

return resolved;
});
}

function resolveCustomizedDocToc(srcPath, items, parentUri, docData) {
const resolved = [];

items.forEach(({ text, uri, children }) => {
const item = {};

if (text) {
item.text = text;
}

if (isArray(children)) {
item.items = resolveCustomizedDocToc(srcPath, children, uri, docData);
} else if (uri) {
let docFile;

if (uri.startsWith('./')) {
docFile = uri;
} else {
docFile = `./${parentUri ? [parentUri.replace(/^\\\./, ''), uri].join('/') : uri}`;
}

const docPath = resolvePath(srcPath, docFile);

if (!existsSync(docPath)) {
return;
}

if (!item.text) {
const content = readData(docPath);

if (content) {
const normalized = normalizeFrontMatter(content);

if (normalized.data && normalized.data.title) {
item.text = normalized.data.title;
}
}
}

item.slug = resolveSlug(docFile.slice(2));
docData[item.slug] = { title: item.text || '', slug: item.slug };
}

resolved.push(item);
});

return resolved;
}

function resolveDocToc(srcPath, docs, docData) {
const customizedTocPath = `${srcPath}/.meta/toc.yml`;

if (existsSync(customizedTocPath)) {
return resolveCustomizedDocToc(srcPath, readData(customizedTocPath), '', docData);
}

return resolveDefaultDocToc(docs.structure, docData);
}

function resolveRepoData(site, config, existsRepos = {}) {
const rootPath = resolveRootPath();
const siteDataDir = resolvePath(rootPath, `${resolveSiteSrcDir(site)}${config.generator === 'hexo' ? '/source' : ''}/_data`);

const projectRepos = {};

Object.entries(config.data).forEach(([srcKey, srcDir]) => {
if (!srcKey.startsWith('project-')) {
return;
}

const docData = {};
const toc = resolveDocToc(resolvePath(rootPath, srcDir), readData(`${siteDataDir}/knosys/${srcKey}/docs.yml`), docData);

const projectSlug = srcKey.replace(/^project\-/, '');

projectRepos[projectSlug] = {
name: `${projectSlug.split('-').map(w => capitalize(w)).join(' ')} 项目文档`,
base: `/projects/${projectSlug}`,
collection: 'docs',
toc,
};

saveData(`${siteDataDir}/knosys/${projectSlug}.yml`, { items: docData });
});

ensureDirExists(`${siteDataDir}/local`);
saveData(`${siteDataDir}/local/repos.yml`, { ...existsRepos, ...projectRepos });
}

function generateProjectDocs(site, opts = {}) {
const siteConfig = getConfig(`site.${site}`);
const { sourceKey, repos } = opts;
const { data } = siteConfig;

let keys = [];

if (data) {
if (isPlainObject(data)) {
if (sourceKey) {
if (data[sourceKey]) {
keys.push(sourceKey);
}
} else {
keys = Object.keys(data);
}
}
}

keys.forEach(key => execute('generate', site, key));

if (siteConfig.generator === 'hexo') {
setTimeout(() => resolveRepoData(site, siteConfig, repos));
}
}

module.exports = { resolveSiteSrcDir, generateProjectDocs };
7 changes: 5 additions & 2 deletions scripts/release.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
const { resolve: resolvePath } = require('path');
const { execSync } = require('child_process');
const { pick } = require('@ntks/toolbox');
const { ensureDirExists, copyFileDeeply, cp, saveData } = require('@knosys/sdk');
const { execute } = require('ksio');

const { ensureDirExists, copyFileDeeply, cp, saveData, execute, getNopThemeDirPath } = require('./helper');
const { getNopThemeDirPath } = require('./helper');

const rootPath = resolvePath(__dirname, '..');
const pkgName = '@nop-community/hexo-theme-site';
Expand All @@ -28,11 +30,12 @@ function copyThemeFiles() {
saveData(`${themeDistPath}/package.json`, JSON.stringify({
name: pkgName,
description: 'Theme for Nop project docs',
main: 'package.json',
main: 'index.js',
keywords: ['nop', 'nop-platform', 'nop-community', 'knosys', 'ksio', 'hexo', 'theme'],
...pkgFields,
}, null, 2));
copyMetaFiles();
cp(`${rootPath}/scripts/helper/nop-project.js`, `${themeDistPath}/index.js`);
}

module.exports = {
Expand Down
4 changes: 3 additions & 1 deletion scripts/serve.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
const { resolve: resolvePath } = require('path');
const { pick } = require('@ntks/toolbox');
const { resolveRootPath, getConfig, readData, saveData } = require('@knosys/sdk');
const { execute } = require('ksio');

const { resolveRootPath, getConfig, readData, saveData, execute, resolveSiteSrcDir } = require('./helper');
const { resolveSiteSrcDir } = require('./helper');

module.exports = {
execute: (site = 'default') => {
Expand Down

0 comments on commit 59733a1

Please sign in to comment.