Skip to content

Commit

Permalink
feat(hexo): plugin for front matter defaults
Browse files Browse the repository at this point in the history
  • Loading branch information
ourai committed Apr 6, 2023
1 parent 8ce5dd6 commit fda6658
Show file tree
Hide file tree
Showing 5 changed files with 116 additions and 3 deletions.
11 changes: 10 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,8 @@
"bugs": {
"url": "https://github.com/ourai/lime/issues"
},
"homepage": "https://ourai.github.io/lime/"
"homepage": "https://ourai.github.io/lime/",
"devDependencies": {
"@ntks/toolbox": "0.0.6"
}
}
26 changes: 26 additions & 0 deletions src/hexo/_config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,32 @@ theme_config:
- text: 资助
url: /about/#donation

ksio:
defaults:
layout:
page:
values:
ksio_asset_css:
- stylesheets/ksio/vendors/share
ksio_asset_js:
- javascripts/ksio/vendors/share.min
- javascripts/ksio/components/page
- javascripts/ksio/components/toc
post:
extends: page
page:
- scope:
type: posts
values:
ksio_asset_css:
- stylesheets/ksio/pages/post
ksio_asset_js:
- javascripts/ksio/vendors/jquery.timeago
- javascripts/ksio/vendors/jquery.timeago.zh-CN
- javascripts/ksio/initializers/time
- javascripts/ksio/vendors/jquery.lazyload
- javascripts/ksio/initializers/lazyload

# Deployment
## Docs: https://hexo.io/docs/one-command-deployment
deploy:
Expand Down
6 changes: 5 additions & 1 deletion src/hexo/themes/lime/layout/_ksio/layouts/default.ejs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@
<head>
<%- 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') %>
</head>
<body class="Page" itemscope itemtype="http:https://schema.org/WebPage"><%- body %></body>
<body class="Page" itemscope itemtype="http:https://schema.org/WebPage">
<%- body %>
<% [].concat(page.ksio_asset_js || []).forEach(jsPath => { %><%- js(jsPath) %><% }) %>
</body>
</html>
71 changes: 71 additions & 0 deletions src/hexo/themes/lime/scripts/defaults.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
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 };
}
});

return mergeValues(resolveValuesFromLayout(resolved.layout || page.layout, layoutDefaults), resolved);
}

hexo.extend.filter.register('template_locals', function(locals) {
if (locals.config.ksio && locals.config.ksio.defaults ) {
locals.page = { ...locals.page, ...resolvePageConfig(locals.page, locals.config.ksio.defaults) };
}

return locals;
});

0 comments on commit fda6658

Please sign in to comment.