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