91 lines
2.1 KiB
JavaScript
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
|
|
};
|