133d722a9Sopenharmony_ci#!/usr/bin/env node
233d722a9Sopenharmony_ci
333d722a9Sopenharmony_ciconst fs = require('fs');
433d722a9Sopenharmony_ciconst cheerio = require('cheerio');
533d722a9Sopenharmony_ciconst hljs = require('./build/highlight.js');
633d722a9Sopenharmony_ciconst Entities = require('html-entities').AllHtmlEntities;
733d722a9Sopenharmony_ciconst entities = new Entities();
833d722a9Sopenharmony_ci
933d722a9Sopenharmony_ciconst githublink = `\
1033d722a9Sopenharmony_ci<li class="part-title">\
1133d722a9Sopenharmony_ci<a href="https://github.com/dtolnay/cxx">\
1233d722a9Sopenharmony_ci<i class="fa fa-github"></i>\
1333d722a9Sopenharmony_cihttps://github.com/dtolnay/cxx\
1433d722a9Sopenharmony_ci</a>\
1533d722a9Sopenharmony_ci</li>`;
1633d722a9Sopenharmony_ci
1733d722a9Sopenharmony_ciconst opengraph = `\
1833d722a9Sopenharmony_ci<meta property="og:image" content="https://cxx.rs/cxx.png" />\
1933d722a9Sopenharmony_ci<meta property="og:site_name" content="CXX" />\
2033d722a9Sopenharmony_ci<meta property="og:title" content="CXX — safe interop between Rust and C++" />\
2133d722a9Sopenharmony_ci<meta name="twitter:image:src" content="https://cxx.rs/cxx.png" />\
2233d722a9Sopenharmony_ci<meta name="twitter:site" content="@davidtolnay" />\
2333d722a9Sopenharmony_ci<meta name="twitter:card" content="summary" />\
2433d722a9Sopenharmony_ci<meta name="twitter:title" content="CXX — safe interop between Rust and C++" />`;
2533d722a9Sopenharmony_ci
2633d722a9Sopenharmony_ciconst htmljs = `\
2733d722a9Sopenharmony_civar html = document.querySelector('html');
2833d722a9Sopenharmony_cihtml.classList.remove('no-js');
2933d722a9Sopenharmony_cihtml.classList.add('js');`;
3033d722a9Sopenharmony_ci
3133d722a9Sopenharmony_ciconst dirs = ['build'];
3233d722a9Sopenharmony_ciwhile (dirs.length) {
3333d722a9Sopenharmony_ci  const dir = dirs.pop();
3433d722a9Sopenharmony_ci  fs.readdirSync(dir).forEach((entry) => {
3533d722a9Sopenharmony_ci    path = dir + '/' + entry;
3633d722a9Sopenharmony_ci    const stat = fs.statSync(path);
3733d722a9Sopenharmony_ci    if (stat.isDirectory()) {
3833d722a9Sopenharmony_ci      dirs.push(path);
3933d722a9Sopenharmony_ci      return;
4033d722a9Sopenharmony_ci    }
4133d722a9Sopenharmony_ci
4233d722a9Sopenharmony_ci    if (!path.endsWith('.html')) {
4333d722a9Sopenharmony_ci      return;
4433d722a9Sopenharmony_ci    }
4533d722a9Sopenharmony_ci
4633d722a9Sopenharmony_ci    const index = fs.readFileSync(path, 'utf8');
4733d722a9Sopenharmony_ci    const $ = cheerio.load(index, { decodeEntities: false });
4833d722a9Sopenharmony_ci
4933d722a9Sopenharmony_ci    $('head').append(opengraph);
5033d722a9Sopenharmony_ci    $('script:nth-of-type(3)').text(htmljs);
5133d722a9Sopenharmony_ci    $('nav#sidebar ol.chapter').append(githublink);
5233d722a9Sopenharmony_ci    $('head link[href="tomorrow-night.css"]').attr('disabled', true);
5333d722a9Sopenharmony_ci    $('head link[href="ayu-highlight.css"]').attr('disabled', true);
5433d722a9Sopenharmony_ci    $('button#theme-toggle').attr('style', 'display:none');
5533d722a9Sopenharmony_ci    $('pre code').each(function () {
5633d722a9Sopenharmony_ci      const node = $(this);
5733d722a9Sopenharmony_ci      const langClass = node.attr('class').split(' ', 2)[0];
5833d722a9Sopenharmony_ci      if (!langClass.startsWith('language-')) {
5933d722a9Sopenharmony_ci        return;
6033d722a9Sopenharmony_ci      }
6133d722a9Sopenharmony_ci      const lang = langClass.replace('language-', '');
6233d722a9Sopenharmony_ci      const lines = node.html().split('\n');
6333d722a9Sopenharmony_ci      const boring = lines.map((line) =>
6433d722a9Sopenharmony_ci        line.includes('<span class="boring">')
6533d722a9Sopenharmony_ci      );
6633d722a9Sopenharmony_ci      const ellipsis = lines.map((line) => line.includes('// ...'));
6733d722a9Sopenharmony_ci      const target = entities.decode(node.text());
6833d722a9Sopenharmony_ci      const highlighted = hljs.highlight(lang, target).value;
6933d722a9Sopenharmony_ci      const result = highlighted
7033d722a9Sopenharmony_ci        .split('\n')
7133d722a9Sopenharmony_ci        .map(function (line, i) {
7233d722a9Sopenharmony_ci          if (boring[i]) {
7333d722a9Sopenharmony_ci            line = '<span class="boring">' + line;
7433d722a9Sopenharmony_ci          } else if (ellipsis[i]) {
7533d722a9Sopenharmony_ci            line = '<span class="ellipsis">' + line;
7633d722a9Sopenharmony_ci          }
7733d722a9Sopenharmony_ci          if (i > 0 && (boring[i - 1] || ellipsis[i - 1])) {
7833d722a9Sopenharmony_ci            line = '</span>' + line;
7933d722a9Sopenharmony_ci          }
8033d722a9Sopenharmony_ci          return line;
8133d722a9Sopenharmony_ci        })
8233d722a9Sopenharmony_ci        .join('\n');
8333d722a9Sopenharmony_ci      node.text(result);
8433d722a9Sopenharmony_ci      node.removeClass(langClass);
8533d722a9Sopenharmony_ci      if (!node.hasClass('focuscomment')) {
8633d722a9Sopenharmony_ci        node.addClass('hidelines');
8733d722a9Sopenharmony_ci        node.addClass('hide-boring');
8833d722a9Sopenharmony_ci      }
8933d722a9Sopenharmony_ci    });
9033d722a9Sopenharmony_ci    $('code').each(function () {
9133d722a9Sopenharmony_ci      $(this).addClass('hljs');
9233d722a9Sopenharmony_ci    });
9333d722a9Sopenharmony_ci
9433d722a9Sopenharmony_ci    const out = $.html();
9533d722a9Sopenharmony_ci    fs.writeFileSync(path, out);
9633d722a9Sopenharmony_ci  });
9733d722a9Sopenharmony_ci}
9833d722a9Sopenharmony_ci
9933d722a9Sopenharmony_cifs.copyFileSync('build/highlight.css', 'build/tomorrow-night.css');
10033d722a9Sopenharmony_cifs.copyFileSync('build/highlight.css', 'build/ayu-highlight.css');
10133d722a9Sopenharmony_ci
10233d722a9Sopenharmony_civar bookjs = fs.readFileSync('build/book.js', 'utf8');
10333d722a9Sopenharmony_cibookjs = bookjs.replace('set_theme(theme, false);', '');
10433d722a9Sopenharmony_cifs.writeFileSync('build/book.js', bookjs);
105