Skip to content

Commit 9e568ed

Browse files
committed
Add latex post-process step for syntax highlighter in spec.
1 parent 578aac1 commit 9e568ed

File tree

4 files changed

+103
-20
lines changed

4 files changed

+103
-20
lines changed

docs/_spec/Gemfile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ source "https://rubygems.org"
22
ruby "3.3"
33

44
gem "jekyll", "4.3.3"
5-
gem "rouge"
65
gem "rexml"
76
gem "sass-embedded"
87
gem "csv"

docs/_spec/_config.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ thisScalaVersion: 2.13
44
versionCompareMessage: "an upcoming"
55
safe: true
66
lsi: false
7-
highlighter: false
87
markdown: kramdown
98
encoding: utf-8
9+
highlighter: none
1010
kramdown:
11-
input: GFM
11+
syntax_highlighter_opts:
12+
disable : true

docs/_spec/_layouts/default.yml

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,17 @@
66
<link rel="icon" type="image/png" href="public/favicon.ico">
77
<link rel="shortcut icon" type="image/png" href="public/favicon.ico">
88

9-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.css" integrity="sha384-9eLZqc9ds8eNjO3TmqPeYcDj8n+Qfa4nuSiGYa6DjLNcv9BtN69ZIulL9+8CqC9Y" crossorigin="anonymous">
10-
<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.js" integrity="sha384-K3vbOmF2BtaVai+Qk37uypf7VrgBubhQreNQe9aGsz9lB63dIFiQVlJbr92dw2Lx" crossorigin="anonymous"></script>
11-
<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/contrib/auto-render.min.js" integrity="sha384-kmZOZB5ObwgQnS/DuDg6TScgOiWWBiVt0plIRkZCmE6rDZGrEOQeHM5PcHi+nyqe" crossorigin="anonymous"></script>
12-
139
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
14-
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.2/styles/default.min.css">
10+
11+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.css"crossorigin="anonymous">
12+
<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.js" crossorigin="anonymous"></script>
13+
<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/contrib/auto-render.min.js" crossorigin="anonymous"></script>
14+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/stackoverflow-light.min.css">
15+
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
16+
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/scala.min.js"></script>
17+
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/ebnf.min.js"></script>
18+
19+
<!-- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.2/styles/default.min.css"> -->
1520
<!-- need to use include to see value of page.chapter variable -->
1621
<style type="text/css">
1722
{% include numbering.css %}
@@ -45,7 +50,7 @@
4550

4651
<script>window.jekyllEnv = '{{jekyll.environment}}';</script>
4752
<script src="public/scripts/toc.js"></script>
48-
<script src="public/scripts/highlight.pack.js"></script>
53+
<!-- <script src="public/scripts/highlight.pack.js"></script> -->
4954
<script src="public/scripts/main.js"></script>
5055
</body>
5156
</html>

docs/_spec/public/scripts/main.js

Lines changed: 89 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,23 +41,101 @@ if(window.jekyllEnv !== 'spec-pdf') {
4141
);
4242
}
4343

44-
// no language auto-detect so that EBNF isn't detected as scala
45-
hljs.configure({
46-
languages: []
44+
// See https://github.com/highlightjs/highlight.js/issues/2889 for additional context.
45+
function renderMath({el, result, text}) {
46+
47+
const re = RegExp('´', 'g');
48+
49+
const spans = [];
50+
51+
// get the spans of all math elements
52+
while(match = re.exec(text)) {
53+
const start = match.index;
54+
match = re.exec(text);
55+
if(match == null) {
56+
break;
57+
} else {
58+
const end = match.index + 1;
59+
spans.push({start, end});
60+
}
61+
}
62+
63+
// render spans using katex
64+
for(const span of spans) {
65+
const {start, end} = span;
66+
const str = text.substring(start + 1, end - 1);
67+
const parent = new DocumentFragment();
68+
katex.render(str, parent, { throwOnError: false });
69+
const children = parent.children;
70+
// TODO: Double check mutiple elements aren't possible
71+
if (children.length == 1) {
72+
span.span = children[0];
73+
}
74+
}
75+
76+
// Here we start the merging between the katex output and highlight output.
77+
if (spans.length != 0) {
78+
79+
// This is essentially our iterator
80+
var offset = 0;
81+
var span = spans.shift();
82+
var child = el.firstChild;
83+
84+
// highlight only supports one level of nesting.
85+
while (child) {
86+
if (child instanceof Text) {
87+
const str = child.wholeText;
88+
const start = offset;
89+
const end = start + str.length;
90+
91+
if (span.start >= start && span.end <= end) {
92+
const beforeText = str.substring(0, span.start - start);
93+
if (beforeText) {
94+
el.insertBefore(new Text(beforeText), child);
95+
}
96+
97+
const afterText = str.substring(span.end - start);
98+
child = el.replaceChild(span.span, child);
99+
100+
if (afterText) {
101+
const afterChild = new Text(afterText);
102+
if (child.nextSibling) {
103+
el.insertBefore(afterChild, child.nextSibling);
104+
} else {
105+
el.appendChild(afterChild);
106+
}
107+
}
108+
109+
offset = span.end;
110+
111+
} else {
112+
offset = end;
113+
}
114+
} else if (child.tagName) {
115+
const str = child.innerHTML;
116+
offset += str.length;
117+
}
118+
119+
child = child.nextSibling;
120+
}
121+
}
122+
}
123+
124+
hljs.addPlugin({
125+
'after:highlightElement': renderMath
47126
});
48127

49128
// KaTeX configuration
50129
document.addEventListener("DOMContentLoaded", function() {
51130
renderMathInElement(document.body, {
52-
delimiters: [
53-
{left: "´", right: "´", display: false}, // "display: false" -> inline
54-
{left: "$$", right: "$$", display: true}
55-
],
56-
ignoredTags: ['script', 'noscript', 'style', 'textarea'],
131+
delimiters: [
132+
{left: "´", right: "´", display: false}, // "display: false" -> inline
133+
{left: "$$", right: "$$", display: true}
134+
],
135+
// We ignore 'code' here, because highlight will deal with it.
136+
ignoredTags: ['script', 'noscript', 'style', 'code'],
57137
});
58-
// syntax highlighting after KaTeX is loaded,
59-
// so that math can be used in code blocks
60-
hljs.initHighlighting();
138+
hljs.highlightAll();
61139
$("pre nobr").addClass("fixws");
62140
// point when all necessary js is done, so PDF to be rendered
63141
window.status = "loaded";

0 commit comments

Comments
 (0)