From 045d69bd064db95ad51216a2f5b539bd2205cc3b Mon Sep 17 00:00:00 2001 From: Ourai Lin Date: Fri, 12 Apr 2024 13:14:49 +0800 Subject: [PATCH] feat(theme): make docs editable on remote Git hosting platform --- .gitignore | 6 +- .knosys/scripts/helper/nop-project.js | 36 ++++- .knosys/sites/default/_config.yml | 4 +- .../default/source/_data/local/repos.yml | 9 ++ .../default/themes/nop-project/_config.yml | 1 + .../nop-project/layout/_nop/layouts/doc.ejs | 19 ++- .../nop-project/source/images/nop/logo.png | Bin 0 -> 16444 bytes package-lock.json | 124 ++---------------- package.json | 9 +- 9 files changed, 79 insertions(+), 129 deletions(-) create mode 100644 .knosys/sites/default/themes/nop-project/source/images/nop/logo.png diff --git a/.gitignore b/.gitignore index 936c7d3..e995fb4 100644 --- a/.gitignore +++ b/.gitignore @@ -22,7 +22,11 @@ node_modules/ /.knosys/sites/default/themes/*/layout/* !/.knosys/sites/default/themes/*/layout/_nop/ /.knosys/sites/default/themes/*/scripts/ -/.knosys/sites/default/themes/*/source/ +/.knosys/sites/default/themes/*/source/fonts/* +/.knosys/sites/default/themes/*/source/images/* +!/.knosys/sites/default/themes/*/source/images/nop/ +/.knosys/sites/default/themes/*/source/javascripts/* +/.knosys/sites/default/themes/*/source/stylesheets/* !/.knosys/sites/default/themes/*/_config.yml /.knosys/sites/default/public/ /.knosys/sites/default/.deploy*/ diff --git a/.knosys/scripts/helper/nop-project.js b/.knosys/scripts/helper/nop-project.js index 8180f82..e8150f1 100644 --- a/.knosys/scripts/helper/nop-project.js +++ b/.knosys/scripts/helper/nop-project.js @@ -1,7 +1,7 @@ const { resolve: resolvePath } = require('path'); const { existsSync } = require('fs'); -const { isArray, isPlainObject, capitalize } = require('@ntks/toolbox'); -const { resolveRootPath, getConfig, isDirectory, ensureDirExists, readData, saveData, normalizeFrontMatter } = require('@knosys/sdk'); +const { isString, isArray, isPlainObject, capitalize } = require('@ntks/toolbox'); +const { resolveRootPath, getConfig, isDirectory, ensureDirExists, readData, readMeta, saveData, normalizeFrontMatter } = require('@knosys/sdk'); const { execute } = require('ksio'); function resolveSiteSrcDir(site) { @@ -88,10 +88,28 @@ function resolveCustomizedDocToc(srcPath, items, parentUri, docData) { return resolved; } +function resolveRepoSource(sourceUrl) { + return { + host: new URL(sourceUrl).hostname, + url: sourceUrl, + }; +} + function resolveRepoData(site, config, existsRepos = {}) { const rootPath = resolveRootPath(); - const siteDataDir = resolvePath(rootPath, `${resolveSiteSrcDir(site)}${config.generator === 'hexo' ? '/source' : ''}/_data`); + let distDataDir; + let distDocDir; + + if (config.generator === 'hexo') { + distDataDir = '/source'; + distDocDir = 'knosys'; + } else { + distDataDir = ''; + distDocDir = '_knosys'; + } + + const siteDataDir = resolvePath(rootPath, `${resolveSiteSrcDir(site)}${distDataDir}/_data`); const projectRepos = {}; Object.entries(config.data).forEach(([srcKey, srcDir]) => { @@ -113,11 +131,23 @@ function resolveRepoData(site, config, existsRepos = {}) { } const projectSlug = srcKey.replace(/^project\-/, ''); + const source = { local: `${distDocDir}/${srcKey}` }; + + const { editable } = readMeta(srcPath); + + if (editable) { + if (isString(editable)) { + source.remote = { default: resolveRepoSource(editable) }; + } else if (isPlainObject(editable)) { + source.remote = Object.entries(editable).reduce((prev, [locale, sourceUrl]) => ({ ...prev, [locale]: resolveRepoSource(sourceUrl) }), {}); + } + } projectRepos[projectSlug] = { name: `${projectSlug.split('-').map(w => capitalize(w)).join(' ')} 项目文档`, base: `/projects/${projectSlug}`, collection: 'docs', + source, toc, customized, }; diff --git a/.knosys/sites/default/_config.yml b/.knosys/sites/default/_config.yml index 1048f18..f9ab28f 100644 --- a/.knosys/sites/default/_config.yml +++ b/.knosys/sites/default/_config.yml @@ -72,7 +72,7 @@ tag_map: # Metadata elements ## https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta -meta_generator: true +meta_generator: false # Date / Time format ## Hexo uses Moment.js to parse and display date @@ -99,8 +99,6 @@ ignore: ## Themes: https://hexo.io/themes/ theme: nop-project theme_config: - brand: - # icon: "logo" header: navs: - text: 学习 diff --git a/.knosys/sites/default/source/_data/local/repos.yml b/.knosys/sites/default/source/_data/local/repos.yml index 1642232..9db880c 100644 --- a/.knosys/sites/default/source/_data/local/repos.yml +++ b/.knosys/sites/default/source/_data/local/repos.yml @@ -8,6 +8,15 @@ nop-entropy: name: Nop Entropy 项目文档 base: /projects/nop-entropy collection: docs + source: + local: knosys/project-nop-entropy + remote: + default: + host: github.com + url: 'https://github.com/entropy-cloud/nop-entropy/edit/master/docs/:path' + zh: + host: gitee.com + url: 'https://gitee.com/canonical-entropy/nop-entropy/edit/master/docs/:path' toc: - text: 介绍 slug: why-nop diff --git a/.knosys/sites/default/themes/nop-project/_config.yml b/.knosys/sites/default/themes/nop-project/_config.yml index 31ffb78..071d4ee 100644 --- a/.knosys/sites/default/themes/nop-project/_config.yml +++ b/.knosys/sites/default/themes/nop-project/_config.yml @@ -2,6 +2,7 @@ meta: url: https://nop-platform.gitee.io brand: text: Nop + icon: "images/nop/logo.png" color: "#0871ab" copyright: owner: diff --git a/.knosys/sites/default/themes/nop-project/layout/_nop/layouts/doc.ejs b/.knosys/sites/default/themes/nop-project/layout/_nop/layouts/doc.ejs index b2fe328..1f66d3c 100644 --- a/.knosys/sites/default/themes/nop-project/layout/_nop/layouts/doc.ejs +++ b/.knosys/sites/default/themes/nop-project/layout/_nop/layouts/doc.ejs @@ -13,7 +13,24 @@ <%- partial('_ksio/slots/header') %>
<%- partial('_ksio/slots/content') %>
- + <%- partial(theme.footer && theme.footer.partial || '_ksio/partials/footer') %> diff --git a/.knosys/sites/default/themes/nop-project/source/images/nop/logo.png b/.knosys/sites/default/themes/nop-project/source/images/nop/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4d8296ec9e48acaf54568c07e5788be3979b41d7 GIT binary patch literal 16444 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 WrKIkj0QP$T0000