blog/themes/next/scripts/events/lib/utils.js

91 lines
2.1 KiB
JavaScript

'use strict';
const fs = require('fs');
const path = require('path');
let css;
try {
css = require('@adobe/css-tools');
} catch {
css = require('css');
}
function resolve(name, file = '') {
let dir;
try {
dir = path.dirname(require.resolve(`${name}/package.json`));
} catch {
return '';
}
return `${dir}/${file}`;
}
function highlightTheme(name) {
const file = resolve('highlight.js', `styles/${name}.css`);
const content = fs.readFileSync(file, 'utf8');
let background = '';
let foreground = '';
css.parse(content).stylesheet.rules
.filter(rule => rule.type === 'rule' && rule.selectors.some(selector => selector.endsWith('.hljs')))
.flatMap(rule => rule.declarations)
.forEach(declaration => {
if (declaration.property === 'background' || declaration.property === 'background-color') background = declaration.value;
else if (declaration.property === 'color') foreground = declaration.value;
});
return {
file,
background,
foreground
};
}
function getVendors({ name, alias, version, file, minified, local, custom }) {
// Make it possible to set `cdnjs_name` and `cdnjs_file` in `custom_cdn_url`
const npm_name = name;
const cdnjs_name = alias || name;
const npm_file = file;
const cdnjs_file = minified.replace(/^(dist|lib|source\/js|)\/(browser\/|)/, '');
const value = {
npm_name,
cdnjs_name,
version,
npm_file,
minified,
cdnjs_file
};
return {
local,
jsdelivr: `https://cdn.jsdelivr.net/npm/${npm_name}@${version}/${minified}`,
unpkg : `https://unpkg.com/${npm_name}@${version}/${npm_file}`,
cdnjs : `https://cdnjs.cloudflare.com/ajax/libs/${cdnjs_name}/${version}/${cdnjs_file}`,
custom : (custom || '').replace(/\$\{(.+?)\}/g, (match, $1) => value[$1])
};
}
const points = {
views: [
'head',
'header',
'sidebar',
'postMeta',
'postBodyStart',
'postBodyEnd',
'footer',
'bodyEnd',
'comment'
],
styles: [
'variable',
'mixin',
'style'
]
};
// Required by theme-next-docs and @next-theme/plugins
module.exports = {
resolve,
highlightTheme,
getVendors,
points
};