text: '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;
            }
          }
        );
      }
    );
  }
  