From fad6d4a26132d429d23f758a60b5a56401f4d631 Mon Sep 17 00:00:00 2001 From: Ourai Lin Date: Fri, 12 Apr 2024 18:19:20 +0800 Subject: [PATCH] feat(hexo): make favicon customizable and match files via paths in front matter defaults --- .knosys/scripts/build.js | 3 +- package-lock.json | 13 +- package.json | 22 ++-- src/hexo/package-lock.json | 113 +----------------- src/hexo/package.json | 8 +- .../themes/lime/layout/_ksio/layouts/base.ejs | 19 +++ .../lime/layout/_ksio/layouts/default.ejs | 20 +--- .../lime/layout/_ksio/partials/meta/brand.ejs | 3 +- src/hexo/themes/lime/layout/layout.ejs | 2 +- src/hexo/themes/lime/scripts/defaults.js | 77 ------------ .../_includes/ksio/partials/meta/brand.html | 2 +- 11 files changed, 50 insertions(+), 232 deletions(-) create mode 100644 src/hexo/themes/lime/layout/_ksio/layouts/base.ejs delete mode 100644 src/hexo/themes/lime/scripts/defaults.js diff --git a/.knosys/scripts/build.js b/.knosys/scripts/build.js index 8f919d6..9829f3e 100644 --- a/.knosys/scripts/build.js +++ b/.knosys/scripts/build.js @@ -52,14 +52,13 @@ function copyHexoFiles() { copyThemeAssets(`${hexoDistRoot}/source`, true); - const { devDependencies, ...pkgFields } = pick(require(`${prjRoot}/package.json`), ['version', 'description', 'repository', 'author', 'license', 'bugs', 'homepage', 'devDependencies']); + const pkgFields = pick(require(`${prjRoot}/package.json`), ['version', 'description', 'repository', 'author', 'license', 'bugs', 'homepage', 'dependencies']); saveData(`${hexoDistRoot}/package.json`, JSON.stringify({ name: 'hexo-theme-lime', main: 'package.json', keywords: ['hexo', 'theme', 'lime', 'knosys', 'ksio'], ...pkgFields, - dependencies: { '@ntks/toolbox': devDependencies['@ntks/toolbox'] }, }, null, 2)); copyMetaFiles('hexo'); } diff --git a/package-lock.json b/package-lock.json index 386ad9c..e322e7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@ourai/lime", - "version": "0.0.0-alpha.1", + "version": "0.0.0-alpha.2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -20,8 +20,7 @@ "@ntks/toolbox": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/@ntks/toolbox/-/toolbox-0.0.6.tgz", - "integrity": "sha512-EpoW12XUVabG5WhpLSFA8KNG87VTXf2O/HK5OF5/rr9Y53X3EvcKb8c2uSzjaVewd5BGUFiDuezz5KbhkDhPGQ==", - "dev": true + "integrity": "sha512-EpoW12XUVabG5WhpLSFA8KNG87VTXf2O/HK5OF5/rr9Y53X3EvcKb8c2uSzjaVewd5BGUFiDuezz5KbhkDhPGQ==" }, "argparse": { "version": "1.0.10", @@ -122,6 +121,14 @@ "function-bind": "^1.1.2" } }, + "hexo-front-matter-defaults": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/hexo-front-matter-defaults/-/hexo-front-matter-defaults-0.0.0.tgz", + "integrity": "sha512-3r4QavZiCPOYbw8N4IPMaKoOUT6NSNJPVWGlqe6CVVKE4hdIii5ImBao0MAXH1IfPZys0UpNwS3k++zgLgL45Q==", + "requires": { + "@ntks/toolbox": "0.0.6" + } + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", diff --git a/package.json b/package.json index 3cad6c2..3cf383d 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,9 @@ { "name": "@ourai/lime", - "version": "0.0.0-alpha.1", + "version": "0.0.0-alpha.2", "description": "Simple, readable, responsive theme for blogs, personal websites and API docs", "private": true, "main": "index.js", - "scripts": { - "copy": "node .knosys/scripts copy", - "build": "node .knosys/scripts build", - "clean": "rm -rf src/jekyll/.asset-cache", - "start": "node .knosys/scripts serve", - "predeploy": "npm run clean", - "deploy": "node .knosys/scripts deploy" - }, "repository": { "type": "git", "url": "git+https://github.com/ourai/lime.git" @@ -22,8 +14,18 @@ "url": "https://github.com/ourai/lime/issues" }, "homepage": "https://ourai.github.io/lime/", + "dependencies": { + "hexo-front-matter-defaults": "0.0.0" + }, "devDependencies": { - "@ntks/toolbox": "0.0.6", "ksio": "0.0.2" + }, + "scripts": { + "copy": "node .knosys/scripts copy", + "build": "node .knosys/scripts build", + "clean": "rm -rf src/jekyll/.asset-cache", + "start": "node .knosys/scripts serve", + "predeploy": "npm run clean", + "deploy": "node .knosys/scripts deploy" } } diff --git a/src/hexo/package-lock.json b/src/hexo/package-lock.json index 381f186..a00e996 100644 --- a/src/hexo/package-lock.json +++ b/src/hexo/package-lock.json @@ -189,11 +189,6 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -497,16 +492,6 @@ "which": "^2.0.1" } }, - "css": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", - "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", - "requires": { - "inherits": "^2.0.4", - "source-map": "^0.6.1", - "source-map-resolve": "^0.6.0" - } - }, "cssom": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", @@ -576,11 +561,6 @@ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==" - }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -1147,38 +1127,6 @@ "hexo-util": "^2.0.0" } }, - "hexo-generator-archive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hexo-generator-archive/-/hexo-generator-archive-2.0.0.tgz", - "integrity": "sha512-KikJk7dGFbtNHOgqtLFGf5T/S8n1paGp+Gy0KfVDz+HKYhGbXOouyiZkmc3O9KrYt6ja14rmkMhq7KKGtvfehw==", - "requires": { - "hexo-pagination": "3.0.0" - } - }, - "hexo-generator-category": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hexo-generator-category/-/hexo-generator-category-2.0.0.tgz", - "integrity": "sha512-9OduRBf3WeRDa4BR0kAfRjOVHur7v3fm0NKAwbjUiqULigAdNZVZPO3cHKW2MlBbl/lI5PuWdhQ9zZ99CCCAgQ==", - "requires": { - "hexo-pagination": "3.0.0" - } - }, - "hexo-generator-index": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hexo-generator-index/-/hexo-generator-index-3.0.0.tgz", - "integrity": "sha512-83AuNN4cWdLVi//3ugR8E3kR6rrOwhXZt+hOCm1IjtIGj353/GlrtpMHpqZHU5kqipzj4miy9dweVdukXglVWw==", - "requires": { - "hexo-pagination": "3.0.0" - } - }, - "hexo-generator-tag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hexo-generator-tag/-/hexo-generator-tag-2.0.0.tgz", - "integrity": "sha512-1px/hF3veEohWDN8jjzchQhaiz+uOStUvvMaBJC9vWOlALh30UFcapL8IrvAwwJZjFRVA+WqGgDRqoQ8+yaaFw==", - "requires": { - "hexo-pagination": "3.0.0" - } - }, "hexo-i18n": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexo-i18n/-/hexo-i18n-1.0.0.tgz", @@ -1195,11 +1143,6 @@ "picocolors": "^1.0.0" } }, - "hexo-pagination": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hexo-pagination/-/hexo-pagination-3.0.0.tgz", - "integrity": "sha512-8oo1iozloZo7TojPVYg4IxL3SJKCBdSJ908fTlIxIK7TWJIKdYnQlW31+12DBJ0NhVZA/lZisPObGF08wT8fKw==" - }, "hexo-renderer-coffeescript": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/hexo-renderer-coffeescript/-/hexo-renderer-coffeescript-0.2.0.tgz", @@ -1236,15 +1179,6 @@ "node-sass": "^4.5.3" } }, - "hexo-renderer-stylus": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hexo-renderer-stylus/-/hexo-renderer-stylus-2.1.0.tgz", - "integrity": "sha512-Nef4YCr7JX8jaRaByhzXMSsWnDed+RgJj6aU/ARnYu3Bn5xz/qRz52VJG7KqD0Xuysxa9TIBdVUgNzBrSFn3DQ==", - "requires": { - "nib": "^1.2.0", - "stylus": "^0.57.0" - } - }, "hexo-server": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hexo-server/-/hexo-server-3.0.0.tgz", @@ -1260,11 +1194,6 @@ "serve-static": "^1.14.1" } }, - "hexo-theme-landscape": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/hexo-theme-landscape/-/hexo-theme-landscape-0.0.3.tgz", - "integrity": "sha512-b0Di+TUVs4ESrNX4ULEh9uQmADpO6kr10rIJ2OGZM8suNQNFKdxn+vJUjnLfKkCPJAfVmS7/S83KCNYe4tpoNw==" - }, "hexo-util": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/hexo-util/-/hexo-util-2.7.0.tgz", @@ -1821,11 +1750,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, - "nib": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/nib/-/nib-1.2.0.tgz", - "integrity": "sha512-7HgrnMl/3yOmWykueO8/D0q+0iWwe7Z+CK2Eaq/xQV8w1hK80WN1oReRQkfkrztbAAnp/nTHkUSl5EcVkor6JQ==" - }, "no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -2420,11 +2344,6 @@ "yargs": "^13.3.2" } }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, "saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -2559,16 +2478,8 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-resolve": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", - "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0" - } + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true }, "spdx-correct": { "version": "3.2.0", @@ -2718,26 +2629,6 @@ "min-indent": "^1.0.0" } }, - "stylus": { - "version": "0.57.0", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.57.0.tgz", - "integrity": "sha512-yOI6G8WYfr0q8v8rRvE91wbxFU+rJPo760Va4MF6K0I6BZjO4r+xSynkvyPBP9tV1CIEUeRsiidjIs2rzb1CnQ==", - "requires": { - "css": "^3.0.0", - "debug": "^4.3.2", - "glob": "^7.1.6", - "safer-buffer": "^2.1.2", - "sax": "~1.2.4", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" - } - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", diff --git a/src/hexo/package.json b/src/hexo/package.json index e4efebb..69a4182 100644 --- a/src/hexo/package.json +++ b/src/hexo/package.json @@ -13,16 +13,10 @@ }, "dependencies": { "hexo": "^6.3.0", - "hexo-generator-archive": "^2.0.0", - "hexo-generator-category": "^2.0.0", - "hexo-generator-index": "^3.0.0", - "hexo-generator-tag": "^2.0.0", "hexo-renderer-coffeescript": "^0.2.0", "hexo-renderer-ejs": "^2.0.0", "hexo-renderer-marked": "^6.0.0", "hexo-renderer-sass": "^0.4.0", - "hexo-renderer-stylus": "^2.1.0", - "hexo-server": "^3.0.0", - "hexo-theme-landscape": "^0.0.3" + "hexo-server": "^3.0.0" } } diff --git a/src/hexo/themes/lime/layout/_ksio/layouts/base.ejs b/src/hexo/themes/lime/layout/_ksio/layouts/base.ejs new file mode 100644 index 0000000..db8217c --- /dev/null +++ b/src/hexo/themes/lime/layout/_ksio/layouts/base.ejs @@ -0,0 +1,19 @@ + + + + <%- partial('_ksio/partials/head') %> + <%- css('stylesheets/global') %> + <% [].concat(page.ksio_asset_css || []).forEach(cssPath => { %><%- css(cssPath) %><% }) %> + <%- js('javascripts/ksio/vendors/jquery-1.11.3.min') %> + <%- js('javascripts/ksio/vendors/bootstrap.min') %> + + <% const bodyClass = ['Page'] %> + <% if (page.ksio_slot_banner || page.banner) { %> + <% bodyClass.push('has-headerImage') %> + <% } %> + + <%- body %> + + <% [].concat(page.ksio_asset_js || []).forEach(jsPath => { %><%- js(jsPath) %><% }) %> + + diff --git a/src/hexo/themes/lime/layout/_ksio/layouts/default.ejs b/src/hexo/themes/lime/layout/_ksio/layouts/default.ejs index db8217c..dc4b38d 100644 --- a/src/hexo/themes/lime/layout/_ksio/layouts/default.ejs +++ b/src/hexo/themes/lime/layout/_ksio/layouts/default.ejs @@ -1,19 +1 @@ - - - - <%- partial('_ksio/partials/head') %> - <%- css('stylesheets/global') %> - <% [].concat(page.ksio_asset_css || []).forEach(cssPath => { %><%- css(cssPath) %><% }) %> - <%- js('javascripts/ksio/vendors/jquery-1.11.3.min') %> - <%- js('javascripts/ksio/vendors/bootstrap.min') %> - - <% const bodyClass = ['Page'] %> - <% if (page.ksio_slot_banner || page.banner) { %> - <% bodyClass.push('has-headerImage') %> - <% } %> - - <%- body %> - - <% [].concat(page.ksio_asset_js || []).forEach(jsPath => { %><%- js(jsPath) %><% }) %> - - +<%- partial('_ksio/slots/content') %> diff --git a/src/hexo/themes/lime/layout/_ksio/partials/meta/brand.ejs b/src/hexo/themes/lime/layout/_ksio/partials/meta/brand.ejs index 6d5f5ed..b121a79 100644 --- a/src/hexo/themes/lime/layout/_ksio/partials/meta/brand.ejs +++ b/src/hexo/themes/lime/layout/_ksio/partials/meta/brand.ejs @@ -1 +1,2 @@ -<%- favicon_tag('images/ksio/favicon.ico') %> +<% if (theme.brand && theme.brand.color) { %><% } %> +<%- favicon_tag(theme.brand && theme.brand.icon || 'images/ksio/favicon.ico') %> diff --git a/src/hexo/themes/lime/layout/layout.ejs b/src/hexo/themes/lime/layout/layout.ejs index 2db445c..f60e171 100644 --- a/src/hexo/themes/lime/layout/layout.ejs +++ b/src/hexo/themes/lime/layout/layout.ejs @@ -1 +1 @@ -<%- partial('_ksio/layouts/default') %> +<%- partial('_ksio/layouts/base') %> diff --git a/src/hexo/themes/lime/scripts/defaults.js b/src/hexo/themes/lime/scripts/defaults.js deleted file mode 100644 index 0f49d6d..0000000 --- a/src/hexo/themes/lime/scripts/defaults.js +++ /dev/null @@ -1,77 +0,0 @@ -const { isPlainObject } = require('@ntks/toolbox'); - -function resolveValuesFromLayout(layout, defaults) { - if (!layout || !defaults[layout]) { - return {}; - } - - const specificDefaults = defaults[layout]; - const extendedFrom = specificDefaults.extends && specificDefaults.extends !== layout ? resolveValuesFromLayout(specificDefaults.extends, defaults) : {}; - - return { ...extendedFrom, ...specificDefaults.values }; -} - -function mergeValues(layoutValues, pageValues) { - if (Object.keys(layoutValues).length === 0 || Object.keys(pageValues).length === 0) { - return { ...layoutValues, ...pageValues }; - } - - const merged = { ...layoutValues }; - - Object.entries(pageValues).forEach(([k, v]) => { - merged[k] = Array.isArray(v) && Array.isArray(merged[k]) ? [...merged[k], ...v] : v; - }); - - return merged; -} - -/** - * the structure of `defaults` is just like what in Jekyll - * @see https://jekyllrb.com/docs/configuration/front-matter-defaults/ - */ -function resolvePageConfig(page, defaults) { - let layoutDefaults; - let pageDefaults; - - if (Array.isArray(defaults)) { - layoutDefaults = {}; - pageDefaults = defaults; - } else if (isPlainObject(defaults)) { - layoutDefaults = defaults.layout || {}; - pageDefaults = defaults.page || []; - } - - if (!pageDefaults || pageDefaults.length === 0 || !page.source) { - return {}; - } - - let pageType = page.source.split('/').shift(); - - if (pageType === '_posts') { - pageType = 'posts'; - } - - let resolved = {}; - - pageDefaults.forEach(settings => { - if (!settings.scope || !settings.scope.type || settings.scope.type === pageType) { - resolved = { ...resolved, ...settings.values }; - } - }); - - ['ksio_asset_css', 'ksio_asset_js'].forEach(k => { - if (Array.isArray(page[k]) && page[k].length > 0) { - resolved[k] = page[k]; - } - }); - - return mergeValues(resolveValuesFromLayout(resolved.layout || page.layout, layoutDefaults), resolved); -} - -hexo.extend.filter.register('template_locals', locals => { - if (locals.config.ksio && locals.config.ksio.defaults ) { - locals.page = { ...locals.page, ...resolvePageConfig(locals.page, locals.config.ksio.defaults) }; - } - - return locals; -}); diff --git a/src/jekyll/_includes/ksio/partials/meta/brand.html b/src/jekyll/_includes/ksio/partials/meta/brand.html index f9c46e4..35b3eed 100644 --- a/src/jekyll/_includes/ksio/partials/meta/brand.html +++ b/src/jekyll/_includes/ksio/partials/meta/brand.html @@ -1,2 +1,2 @@ -{% if site.ksio.brand.color %}{% endif %} +{% if site.ksio.brand.color %}{% endif %}