This commit is contained in:
Iliyan Angelov
2025-09-14 23:24:25 +03:00
commit c67067a2a4
71311 changed files with 6800714 additions and 0 deletions

View File

@@ -0,0 +1,127 @@
'use strict';
/*
* Build javascript passthrough modules for highlight.js languages
*/
const path = require('path');
const fs = require('fs');
const camel = require('to-camel-case');
const autogenMessage =
'//\n// This file has been auto-generated by the `npm run build-languages-hljs` task\n//\n\n';
function makeImportName(name) {
if (name === '1c') {
return 'oneC';
}
return camel(name);
}
function createAsyncLanguageLoaderLine(file) {
const fileWithoutJS = file.split('.js')[0];
const importName = makeImportName(fileWithoutJS);
return ` ${importName}: createLanguageAsyncLoader("${importName}", () => import(/* webpackChunkName: "react-syntax-highlighter_languages_highlight_${importName}" */ "highlight.js/lib/languages/${fileWithoutJS}")),`;
}
function createAsyncLanguageLoadersIndex(files) {
let lines = [
`import createLanguageAsyncLoader from "./create-language-async-loader"`,
`export default {`
];
lines = lines.concat(files.map(file => createAsyncLanguageLoaderLine(file)));
lines.push(`}`);
fs.writeFile(
path.join(__dirname, `../src/async-languages/hljs.js`),
lines.join('\n'),
err => {
if (err) {
throw err;
}
}
);
}
function createSupportedLanguagesArray(files) {
let lines = [autogenMessage, `export default [`];
lines = lines.concat(files.map(file => `\n '${file.split('.js')[0]}',`));
lines.push(`\n];\n`);
fs.writeFile(
path.join(__dirname, `../src/languages/hljs/supported-languages.js`),
lines.join(''),
err => {
if (err) {
throw err;
}
}
);
}
function createLanguagePassthroughModule(file) {
const fileWithoutJS = file.split('.js')[0];
const importName = makeImportName(fileWithoutJS);
const lines = [
`import ${importName} from "highlight.js/lib/languages/${fileWithoutJS}"`,
`export default ${importName}`,
''
];
fs.writeFile(
path.join(__dirname, `../src/languages/hljs/${file}`),
lines.join(';\n'),
err => {
if (err) {
throw err;
}
}
);
}
fs.readdir(
path.join(__dirname, '../node_modules/highlight.js/lib/languages'),
(err, files) => {
if (err) {
throw err;
}
files.forEach(createLanguagePassthroughModule);
createAsyncLanguageLoadersIndex(files);
createSupportedLanguagesArray(files);
const availableLanguageNames = files.map(file => file.split('.js')[0]);
const languagesLi = availableLanguageNames.map(
name =>
`\n* ${makeImportName(name)}${
makeImportName(name) !== name ? ` (${name})` : ''
}`
);
const languageMD = `## Available \`language\` imports ${languagesLi.join(
''
)}`;
fs.writeFile(
path.join(__dirname, '../AVAILABLE_LANGUAGES_HLJS.MD'),
languageMD,
err => {
if (err) {
throw err;
}
}
);
const defaultExports = availableLanguageNames.map(
name =>
`export { default as ${makeImportName(name)} } from './${name}';\n`
);
fs.writeFile(
path.join(__dirname, '../src/languages/hljs/index.js'),
defaultExports.join(''),
err => {
if (err) {
throw err;
}
}
);
}
);

View File

@@ -0,0 +1,130 @@
'use strict';
/*
* Build javascript passthrough modules for highlight.js languages
*/
const path = require('path');
const fs = require('fs');
const camel = require('to-camel-case');
const autogenMessage =
'//\n// This file has been auto-generated by the `npm run build-languages-prism` task\n//\n\n';
function makeImportName(name) {
if (name === '1c') {
return 'oneC';
}
if (name === 'false') {
return 'falselang';
}
return camel(name);
}
function createLanguagePassthroughModule(file) {
const importName = makeImportName(file.split('.js')[0]);
const lines = [
`import ${importName} from "refractor/lang/${file}";`,
`export default ${importName}`,
''
];
fs.writeFile(
path.join(__dirname, `../src/languages/prism/${file}`),
lines.join(';\n'),
err => {
if (err) {
process.exit(1);
}
}
);
}
function createAsyncLanguageLoaderLine(file) {
const fileWithoutJS = file.split('.js')[0];
const importName = makeImportName(fileWithoutJS);
return ` ${importName}: createLanguageAsyncLoader("${importName}", () => import(/* webpackChunkName: "react-syntax-highlighter_languages_refractor_${importName}" */ "refractor/lang/${file}")),`;
}
function createSupportedLanguagesArray(files) {
let lines = [autogenMessage, `export default [`];
lines = lines.concat(files.map(file => `\n '${file.split('.js')[0]}',`));
lines.push(`\n];\n`);
fs.writeFile(
path.join(__dirname, `../src/languages/prism/supported-languages.js`),
lines.join(''),
err => {
if (err) {
throw err;
}
}
);
}
function createAsyncLanguageLoadersIndex(files) {
let lines = [
`import createLanguageAsyncLoader from "./create-language-async-loader"`,
`export default {`
];
lines = lines.concat(files.map(file => createAsyncLanguageLoaderLine(file)));
lines.push(`}`);
fs.writeFile(
path.join(__dirname, `../src/async-languages/prism.js`),
lines.join('\n'),
err => {
if (err) {
throw err;
}
}
);
}
fs.readdir(
path.join(__dirname, '../node_modules/refractor/lang'),
(err, files) => {
console.log(files);
if (err) {
process.exit(1);
}
files.forEach(createLanguagePassthroughModule);
createAsyncLanguageLoadersIndex(files);
createSupportedLanguagesArray(files);
const availableLanguageNames = files.map(file => file.split('.js')[0]);
console.log(availableLanguageNames.join('\n'));
const languagesLi = availableLanguageNames.map(
name =>
`\n* ${makeImportName(name)}${
makeImportName(name) !== name ? ` (${name})` : ''
}`
);
const languageMD = `## Available \`language\` imports ${languagesLi.join(
''
)}`;
fs.writeFile(
path.join(__dirname, '../AVAILABLE_LANGUAGES_PRISM.MD'),
languageMD,
err => {
if (err) {
process.exit(1);
}
}
);
const defaultExports = availableLanguageNames.map(
name =>
`export { default as ${makeImportName(name)} } from './${name}';\n`
);
fs.writeFile(
path.join(__dirname, '../src/languages/prism/index.js'),
defaultExports.join(''),
err => {
if (err) {
process.exit(1);
}
}
);
}
);

View File

@@ -0,0 +1,131 @@
'use strict';
/*
* Quick and dirty script to build javascript stylesheets from highlight.js css
*/
const path = require('path');
const fs = require('fs');
const css = require('css');
const camel = require('to-camel-case');
const autogenMessage =
'//\n// This file has been auto-generated by the `npm run build-styles-hljs` task\n//\n\n';
fs.readdir(
path.join(__dirname, '../node_modules/highlight.js/styles'),
(err, files) => {
if (err) {
throw err;
}
files.forEach(file => {
if (file.includes('.css')) {
createJavascriptStyleSheet(file);
}
});
const onlyCSSFiles = files.filter(file => file.includes('.css'));
const availableStyleNames = onlyCSSFiles.map(file =>
file.split('.css')[0] === 'default'
? 'default-style'
: file.split('.css')[0]
);
const styles = availableStyleNames.map(name => `\n* ${camel(name)}`);
const defaultExports = availableStyleNames.map(
name => `export { default as ${camel(name)} } from './${name}';\n`
);
const styleMD = `## Available \`stylesheet\` props ${styles.join('')}`;
fs.writeFile(
path.join(__dirname, '../AVAILABLE_STYLES_HLJS.MD'),
styleMD,
err => {
if (err) {
throw err;
}
}
);
fs.writeFile(
path.join(__dirname, '../src/styles/hljs/index.js'),
defaultExports.join(''),
err => {
if (err) {
throw err;
}
}
);
const demoStylesArray = `${autogenMessage}export default [${availableStyleNames
.sort()
.map(style => `\n '${style}'`)}\n];`;
fs.writeFile(
path.join(__dirname, '../demo/styles/hljs.js'),
demoStylesArray,
err => {
if (err) {
throw err;
}
}
);
}
);
function createJavascriptStyleSheet(file) {
const ignoreStyleWithThis = '.hljs a';
const fileWithoutCSS =
file.split('.css')[0] === 'default'
? 'default-style'
: file.split('.css')[0];
fs.readFile(
path.join(__dirname, `../node_modules/highlight.js/styles/${file}`),
'utf-8',
(err, data) => {
if (err) {
throw err;
}
const javacriptStylesheet = css
.parse(data)
.stylesheet.rules.reduce((sheet, rule) => {
if (rule.type === 'rule') {
const style = rule.selectors.reduce((selectors, selector) => {
if (!selector.includes(ignoreStyleWithThis)) {
const selectorObject = rule.declarations.reduce(
(declarations, declaration) => {
if (
declaration.type === 'declaration' &&
declaration.property
) {
declarations[camel(declaration.property)] =
declaration.value;
}
return declarations;
},
{}
);
selectors[selector.substring(1)] = selectorObject;
}
return selectors;
}, {});
sheet = Object.keys(style).reduce((stylesheet, selector) => {
if (stylesheet[selector]) {
stylesheet[selector] = Object.assign(
{},
stylesheet[selector],
style[selector]
);
} else {
stylesheet[selector] = style[selector];
}
return stylesheet;
}, sheet);
}
return sheet;
}, {});
fs.writeFile(
path.join(__dirname, `../src/styles/hljs/${fileWithoutCSS}.js`),
`export default ${JSON.stringify(javacriptStylesheet, null, 4)}`,
err => {
if (err) {
throw err;
}
}
);
}
);
}

View File

@@ -0,0 +1,153 @@
'use strict';
const path = require('path');
const fs = require('fs');
const css = require('css');
const camel = require('to-camel-case');
const autogenMessage =
'//\n// This file has been auto-generated by the `npm run build-styles-prism` task\n//\n\n';
let directories = [
'../node_modules/prismjs/themes',
'../node_modules/prism-themes/themes'
];
directories.map(directory => {
fs.readdir(path.join(__dirname, directory), (err, files) => {
files.forEach(file => {
if (file.includes('.css') && !file.includes('.min')) {
createJavascriptStyleSheet(file, directory);
}
});
updateDocs(files);
});
});
function getSimpleFilename(filename) {
let nameWithoutExtension = filename.split('.css')[0].split('prism-')[1];
if (filename === 'prism.css') nameWithoutExtension = 'prism';
if (filename === 'prism.min.css') nameWithoutExtension = 'prism.min';
return nameWithoutExtension;
}
let allFiles = [];
let callCount = 0;
function updateDocs(files) {
allFiles = allFiles.concat(files);
callCount += 1;
if (callCount != directories.length) {
return;
}
const onlyCSSFiles = allFiles.filter(file => file.includes('.css'));
const onlyNonMinifiedCSS = onlyCSSFiles.filter(
file => !file.includes('.min')
);
const availableStyleNames = onlyNonMinifiedCSS.map(file =>
getSimpleFilename(file)
);
const styles = availableStyleNames.map(name => `\n* ${camel(name)}`);
const defaultExports = availableStyleNames.map(
name => `export { default as ${camel(name)} } from './${name}';\n`
);
const styleMD = `## Available \`stylesheet\` props ${styles.join('')}`;
fs.writeFile(
path.join(__dirname, '../AVAILABLE_STYLES_PRISM.MD'),
styleMD,
() => {}
);
fs.writeFile(
path.join(__dirname, '../src/styles/prism/index.js'),
defaultExports.join(''),
() => {}
);
const demoStylesArray = `${autogenMessage}export default [${availableStyleNames
.sort()
.map(style => `\n '${style}'`)}\n];`;
fs.writeFile(
path.join(__dirname, '../demo/styles/prism.js'),
demoStylesArray,
err => {
if (err) {
throw err;
}
}
);
}
function createJavascriptStyleSheet(file, directory) {
let fileWithoutCSS = getSimpleFilename(file);
console.log(fileWithoutCSS);
fs.readFile(
path.join(__dirname, `${directory}/${file}`),
'utf-8',
(err, data) => {
const javacriptStylesheet = css
.parse(data)
.stylesheet.rules.reduce((sheet, rule) => {
if (rule.type === 'rule') {
const style = rule.selectors.reduce((selectors, selector) => {
const selectorObject = rule.declarations.reduce(
(declarations, declaration) => {
if (
declaration.type === 'declaration' &&
declaration.property
) {
const camelCaseDeclarationProp = camel(
declaration.property
);
const key =
camelCaseDeclarationProp.includes('moz') ||
camelCaseDeclarationProp.includes('webkit') ||
(camelCaseDeclarationProp[0] === 'o' &&
!camelCaseDeclarationProp.includes('overflow'))
? `${camelCaseDeclarationProp
.substring(0, 1)
.toUpperCase()}${camelCaseDeclarationProp.substring(
1
)}`
: camelCaseDeclarationProp;
declarations[key] = declaration.value;
}
return declarations;
},
{}
);
if (selector.substring(0, 6) === '.token') {
selector = selector.substring(7);
// Regex to fix Prism theme selectors
// - Remove further `.token` classes
// - Remove the space (descendant combinator)
// to allow for styling multiple classes
// Ref: https://github.com/react-syntax-highlighter/react-syntax-highlighter/pull/305
selector = selector.replace(/(?<=\w) (\.token)?(?=\.)/g, '');
}
selectors[selector] = selectorObject;
return selectors;
}, {});
sheet = Object.keys(style).reduce((stylesheet, selector) => {
if (stylesheet[selector]) {
stylesheet[selector] = Object.assign(
{},
stylesheet[selector],
style[selector]
);
} else {
stylesheet[selector] = style[selector];
}
return stylesheet;
}, sheet);
}
return sheet;
}, {});
fs.writeFile(
path.join(__dirname, `../src/styles/prism/${fileWithoutCSS}.js`),
`export default ${JSON.stringify(javacriptStylesheet, null, 4)}`,
() => {}
);
}
);
}