diff --git a/package.json b/package.json index 6dc66fb..8cbcaa0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@nop/website", - "version": "0.0.0", + "version": "0.0.1", "description": "Official website", "private": true, "main": "index.js", diff --git a/scripts/clean.js b/scripts/clean.js index f5c3a52..7bc50b3 100644 --- a/scripts/clean.js +++ b/scripts/clean.js @@ -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 = [ diff --git a/scripts/copy.js b/scripts/copy.js index 8fd272b..93e5f43 100644 --- a/scripts/copy.js +++ b/scripts/copy.js @@ -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, '..'); diff --git a/scripts/gen/index.js b/scripts/gen/index.js index d142b86..6263c67 100644 --- a/scripts/gen/index.js +++ b/scripts/gen/index.js @@ -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')) } + }), }; diff --git a/scripts/helper.js b/scripts/helper.js deleted file mode 100644 index 14b91cc..0000000 --- a/scripts/helper.js +++ /dev/null @@ -1,18 +0,0 @@ -const { resolve: resolvePath } = require('path'); - -const rootPath = resolvePath(__dirname, '..'); -const ksdk = { ...require('@knosys/sdk'), ...require('ksio') }; - -function resolveSiteSrcDir(site) { - return ksdk.getConfig(`site.${site}.source`) || `./.knosys/sites/${site}`; -} - -function getNopThemeDirPath() { - return resolvePath(rootPath, resolveSiteSrcDir('default'), 'themes/nop-project'); -} - -module.exports = { - ...ksdk, - resolveSiteSrcDir, - getNopThemeDirPath, -}; diff --git a/scripts/helper/index.js b/scripts/helper/index.js new file mode 100644 index 0000000..9e189ce --- /dev/null +++ b/scripts/helper/index.js @@ -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 }; diff --git a/scripts/helper/nop-project.js b/scripts/helper/nop-project.js new file mode 100644 index 0000000..8c2891c --- /dev/null +++ b/scripts/helper/nop-project.js @@ -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 }; diff --git a/scripts/release.js b/scripts/release.js index 8e903ed..e934a79 100644 --- a/scripts/release.js +++ b/scripts/release.js @@ -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'; @@ -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 = { diff --git a/scripts/serve.js b/scripts/serve.js index 6665ebe..955cc36 100644 --- a/scripts/serve.js +++ b/scripts/serve.js @@ -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') => {