| #!/usr/bin/env node |
| |
| const fs = require('fs'); |
| const cheerio = require('cheerio'); |
| const entities = require('html-entities'); |
| const hljs = require('./build/highlight.js'); |
| |
| const githublink = `\ |
| <li class="part-title">\ |
| <a href="https://github.com/dtolnay/cxx">\ |
| <i class="fa fa-github"></i>\ |
| https://github.com/dtolnay/cxx\ |
| </a>\ |
| </li>`; |
| |
| const opengraph = `\ |
| <meta property="og:image" content="https://cxx.rs/cxx.png" />\ |
| <meta property="og:site_name" content="CXX" />\ |
| <meta property="og:title" content="CXX — safe interop between Rust and C++" />\ |
| <meta name="twitter:image:src" content="https://cxx.rs/cxx.png" />\ |
| <meta name="twitter:site" content="@davidtolnay" />\ |
| <meta name="twitter:card" content="summary" />\ |
| <meta name="twitter:title" content="CXX — safe interop between Rust and C++" />`; |
| |
| const htmljs = `\ |
| var html = document.querySelector('html'); |
| html.classList.remove('no-js'); |
| html.classList.add('js');`; |
| |
| const dirs = ['build']; |
| while (dirs.length) { |
| const dir = dirs.pop(); |
| fs.readdirSync(dir).forEach((entry) => { |
| path = dir + '/' + entry; |
| const stat = fs.statSync(path); |
| if (stat.isDirectory()) { |
| dirs.push(path); |
| return; |
| } |
| |
| if (!path.endsWith('.html')) { |
| return; |
| } |
| |
| const index = fs.readFileSync(path, 'utf8'); |
| const $ = cheerio.load(index, { decodeEntities: false }); |
| |
| $('head').append(opengraph); |
| $('script:nth-of-type(3)').text(htmljs); |
| $('nav#sidebar ol.chapter').append(githublink); |
| $('head link[href="tomorrow-night.css"]').attr('disabled', true); |
| $('head link[href="ayu-highlight.css"]').attr('disabled', true); |
| $('button#theme-toggle').attr('style', 'display:none'); |
| $('pre code').each(function () { |
| const node = $(this); |
| const langClass = node.attr('class').split(' ', 2)[0]; |
| if (!langClass.startsWith('language-')) { |
| return; |
| } |
| const lang = langClass.replace('language-', ''); |
| const lines = node.html().split('\n'); |
| const boring = lines.map((line) => |
| line.includes('<span class="boring">') |
| ); |
| const ellipsis = lines.map((line) => line.includes('// ...')); |
| const target = entities.decode(node.text()); |
| const highlighted = hljs.highlight(lang, target).value; |
| const result = highlighted |
| .split('\n') |
| .map(function (line, i) { |
| if (boring[i]) { |
| line = '<span class="boring">' + line; |
| } else if (ellipsis[i]) { |
| line = '<span class="ellipsis">' + line; |
| } |
| if (i > 0 && (boring[i - 1] || ellipsis[i - 1])) { |
| line = '</span>' + line; |
| } |
| return line; |
| }) |
| .join('\n'); |
| node.text(result); |
| node.removeClass(langClass); |
| if (!node.hasClass('focuscomment')) { |
| node.addClass('hidelines'); |
| node.addClass('hide-boring'); |
| } |
| }); |
| $('code').each(function () { |
| $(this).addClass('hljs'); |
| }); |
| |
| const out = $.html(); |
| fs.writeFileSync(path, out); |
| }); |
| } |
| |
| fs.copyFileSync('build/highlight.css', 'build/tomorrow-night.css'); |
| fs.copyFileSync('build/highlight.css', 'build/ayu-highlight.css'); |
| |
| var bookjs = fs.readFileSync('build/book.js', 'utf8'); |
| bookjs = bookjs |
| .replace('set_theme(theme, false);', '') |
| .replace('document.querySelectorAll("code.hljs")', 'document.querySelectorAll("code.hidelines")'); |
| fs.writeFileSync('build/book.js', bookjs); |