source: node_modules/react-syntax-highlighter/scripts/build-stylesheets-highlightjs.js

main
Last change on this file was d24f17c, checked in by Aleksandar Panovski <apano77@…>, 15 months ago

Initial commit

  • Property mode set to 100644
File size: 3.8 KB
Line 
1'use strict';
2/*
3 * Quick and dirty script to build javascript stylesheets from highlight.js css
4 */
5const path = require('path');
6const fs = require('fs');
7const css = require('css');
8const camel = require('to-camel-case');
9const autogenMessage =
10 '//\n// This file has been auto-generated by the `npm run build-styles-hljs` task\n//\n\n';
11
12fs.readdir(
13 path.join(__dirname, '../node_modules/highlight.js/styles'),
14 (err, files) => {
15 if (err) {
16 throw err;
17 }
18
19 files.forEach(file => {
20 if (file.includes('.css')) {
21 createJavascriptStyleSheet(file);
22 }
23 });
24 const onlyCSSFiles = files.filter(file => file.includes('.css'));
25 const availableStyleNames = onlyCSSFiles.map(file =>
26 file.split('.css')[0] === 'default'
27 ? 'default-style'
28 : file.split('.css')[0]
29 );
30 const styles = availableStyleNames.map(name => `\n* ${camel(name)}`);
31 const defaultExports = availableStyleNames.map(
32 name => `export { default as ${camel(name)} } from './${name}';\n`
33 );
34 const styleMD = `## Available \`stylesheet\` props ${styles.join('')}`;
35 fs.writeFile(
36 path.join(__dirname, '../AVAILABLE_STYLES_HLJS.MD'),
37 styleMD,
38 err => {
39 if (err) {
40 throw err;
41 }
42 }
43 );
44 fs.writeFile(
45 path.join(__dirname, '../src/styles/hljs/index.js'),
46 defaultExports.join(''),
47 err => {
48 if (err) {
49 throw err;
50 }
51 }
52 );
53
54 const demoStylesArray = `${autogenMessage}export default [${availableStyleNames
55 .sort()
56 .map(style => `\n '${style}'`)}\n];`;
57 fs.writeFile(
58 path.join(__dirname, '../demo/styles/hljs.js'),
59 demoStylesArray,
60 err => {
61 if (err) {
62 throw err;
63 }
64 }
65 );
66 }
67);
68
69function createJavascriptStyleSheet(file) {
70 const ignoreStyleWithThis = '.hljs a';
71 const fileWithoutCSS =
72 file.split('.css')[0] === 'default'
73 ? 'default-style'
74 : file.split('.css')[0];
75 fs.readFile(
76 path.join(__dirname, `../node_modules/highlight.js/styles/${file}`),
77 'utf-8',
78 (err, data) => {
79 if (err) {
80 throw err;
81 }
82 const javacriptStylesheet = css
83 .parse(data)
84 .stylesheet.rules.reduce((sheet, rule) => {
85 if (rule.type === 'rule') {
86 const style = rule.selectors.reduce((selectors, selector) => {
87 if (!selector.includes(ignoreStyleWithThis)) {
88 const selectorObject = rule.declarations.reduce(
89 (declarations, declaration) => {
90 if (
91 declaration.type === 'declaration' &&
92 declaration.property
93 ) {
94 declarations[camel(declaration.property)] =
95 declaration.value;
96 }
97 return declarations;
98 },
99 {}
100 );
101 selectors[selector.substring(1)] = selectorObject;
102 }
103 return selectors;
104 }, {});
105 sheet = Object.keys(style).reduce((stylesheet, selector) => {
106 if (stylesheet[selector]) {
107 stylesheet[selector] = Object.assign(
108 {},
109 stylesheet[selector],
110 style[selector]
111 );
112 } else {
113 stylesheet[selector] = style[selector];
114 }
115 return stylesheet;
116 }, sheet);
117 }
118 return sheet;
119 }, {});
120 fs.writeFile(
121 path.join(__dirname, `../src/styles/hljs/${fileWithoutCSS}.js`),
122 `export default ${JSON.stringify(javacriptStylesheet, null, 4)}`,
123 err => {
124 if (err) {
125 throw err;
126 }
127 }
128 );
129 }
130 );
131}
Note: See TracBrowser for help on using the repository browser.