Skip to content

Commit 84e1804

Browse files
committed
Switch to KaTeX for math.
Unlike MathJaX, KaTeX is small enough to be included directly in the distribution; the JS is 110KB, the CSS is 20KB, and the full suite of fonts are about 850KB.
1 parent a3b23a1 commit 84e1804

File tree

5 files changed

+95
-31
lines changed

5 files changed

+95
-31
lines changed

src/librustdoc/html/layout.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ r##"<!DOCTYPE html>
5353
<title>{title}</title>
5454
5555
<link rel="stylesheet" type="text/css" href="{root_path}main.css">
56+
<link rel="stylesheet" type="text/css" href="{root_path}katex/katex.min.css">
5657
5758
{favicon}
5859
{in_header}
@@ -125,6 +126,7 @@ r##"<!DOCTYPE html>
125126
window.rootPath = "{root_path}";
126127
window.currentCrate = "{krate}";
127128
window.playgroundUrl = "{play_url}";
129+
window.useKaTeX = true;
128130
</script>
129131
<script src="{root_path}jquery.js"></script>
130132
<script src="{root_path}main.js"></script>
@@ -163,11 +165,13 @@ r##"<!DOCTYPE html>
163165
},
164166
));
165167

166-
// this must be done after everything is rendered, so that
168+
// This must be done after everything is rendered, so that
167169
// `math_seen` captures all possible $$'s on this page.
170+
//
171+
// We conditionally insert only the JS, since it's 5x larger than
172+
// the CSS.
168173
if layout.enable_math && markdown::math_seen.get().map_or(false, |x| *x) {
169-
try!(dst.write_str("\
170-
<script async src=\"https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML\"></script>"));
174+
try!(write!(dst, "<script src=\"{}katex/katex.min.js\"></script>", page.root_path));
171175
}
172176

173177
dst.write_str("</body>\n</html>")

src/librustdoc/html/markdown.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -304,17 +304,17 @@ pub fn render(w: &mut fmt::Formatter, s: &str, print_toc: bool) -> fmt::Result {
304304
opaque.math_seen = true;
305305

306306
let (open, close) = if display_mode == 1 {
307-
("\\[", "\\]")
307+
("<p class=\"latex-math math-display\">", "</p>")
308308
} else {
309-
("\\(", "\\)")
309+
("<span class=\"latex-math math-text\">", "</span>")
310310
};
311311

312-
open.with_c_str(|open| {
313-
close.with_c_str(|close| {
312+
open.with_c_str(|o| {
313+
close.with_c_str(|c| {
314314
unsafe {
315-
hoedown_buffer_put(ob, open as *const libc::c_void, 2);
315+
hoedown_buffer_put(ob, o as *const libc::c_void, open.len() as libc::size_t);
316316
hoedown_escape_html(ob, (*text).data, (*text).size, 0);
317-
hoedown_buffer_put(ob, close as *const libc::c_void, 2);
317+
hoedown_buffer_put(ob, c as *const libc::c_void, close.len() as libc::size_t);
318318
}
319319
})
320320
});

src/librustdoc/html/render.rs

Lines changed: 66 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,8 @@ pub fn run(mut krate: clean::Crate, external_html: &ExternalHtml, dst: Path) ->
291291
}
292292
clean::Word(ref x)
293293
if "enable_math" == x.as_slice() => {
294+
// Possible extension: allow specifying
295+
// alternate engines etc.
294296
cx.layout.enable_math = true;
295297
markdown::enable_math.replace(Some(true));
296298
}
@@ -487,27 +489,70 @@ fn write_shared(cx: &Context,
487489

488490
// Add all the static files. These may already exist, but we just
489491
// overwrite them anyway to make sure that they're fresh and up-to-date.
490-
try!(write(cx.dst.join("jquery.js"),
491-
include_bin!("static/jquery-2.1.0.min.js")));
492-
try!(write(cx.dst.join("main.js"), include_bin!("static/main.js")));
493-
try!(write(cx.dst.join("playpen.js"), include_bin!("static/playpen.js")));
494-
try!(write(cx.dst.join("main.css"), include_bin!("static/main.css")));
495-
try!(write(cx.dst.join("normalize.css"),
496-
include_bin!("static/normalize.css")));
497-
try!(write(cx.dst.join("FiraSans-Regular.woff"),
498-
include_bin!("static/FiraSans-Regular.woff")));
499-
try!(write(cx.dst.join("FiraSans-Medium.woff"),
500-
include_bin!("static/FiraSans-Medium.woff")));
501-
try!(write(cx.dst.join("Heuristica-Italic.woff"),
502-
include_bin!("static/Heuristica-Italic.woff")));
503-
try!(write(cx.dst.join("SourceSerifPro-Regular.woff"),
504-
include_bin!("static/SourceSerifPro-Regular.woff")));
505-
try!(write(cx.dst.join("SourceSerifPro-Bold.woff"),
506-
include_bin!("static/SourceSerifPro-Bold.woff")));
507-
try!(write(cx.dst.join("SourceCodePro-Regular.woff"),
508-
include_bin!("static/SourceCodePro-Regular.woff")));
509-
try!(write(cx.dst.join("SourceCodePro-Semibold.woff"),
510-
include_bin!("static/SourceCodePro-Semibold.woff")));
492+
macro_rules! write_files {
493+
( $($input: tt => $output: tt,)* ) => {{
494+
$(
495+
try!(write(cx.dst.join($output),
496+
include_bin!($input)));
497+
)*
498+
}}
499+
}
500+
501+
try!(fs::mkdir_recursive(&cx.dst.join("katex/fonts"), io::UserRWX));
502+
503+
write_files! {
504+
"static/jquery-2.1.0.min.js" => "jquery.js",
505+
"static/main.js" => "main.js",
506+
"static/playpen.js" => "playpen.js",
507+
508+
"static/main.css" => "main.css",
509+
"static/normalize.css" => "normalize.css",
510+
511+
"static/FiraSans-Regular.woff" => "FiraSans-Regular.woff",
512+
"static/FiraSans-Medium.woff" => "FiraSans-Medium.woff",
513+
"static/Heuristica-Italic.woff" => "Heuristica-Italic.woff",
514+
"static/SourceSerifPro-Regular.woff" => "SourceSerifPro-Regular.woff",
515+
"static/SourceSerifPro-Bold.woff" => "SourceSerifPro-Bold.woff",
516+
"static/SourceCodePro-Regular.woff" => "SourceCodePro-Regular.woff",
517+
"static/SourceCodePro-Semibold.woff" => "SourceCodePro-Semibold.woff",
518+
519+
"static/katex/katex.min.css" => "katex/katex.min.css",
520+
"static/katex/katex.min.js" => "katex/katex.min.js",
521+
"static/katex/fonts/KaTeX_AMS-Regular.eot" => "katex/fonts/KaTeX_AMS-Regular.eot",
522+
"static/katex/fonts/KaTeX_AMS-Regular.ttf" => "katex/fonts/KaTeX_AMS-Regular.ttf",
523+
"static/katex/fonts/KaTeX_AMS-Regular.woff" => "katex/fonts/KaTeX_AMS-Regular.woff",
524+
"static/katex/fonts/KaTeX_Main-Bold.eot" => "katex/fonts/KaTeX_Main-Bold.eot",
525+
"static/katex/fonts/KaTeX_Main-Bold.ttf" => "katex/fonts/KaTeX_Main-Bold.ttf",
526+
"static/katex/fonts/KaTeX_Main-Bold.woff" => "katex/fonts/KaTeX_Main-Bold.woff",
527+
"static/katex/fonts/KaTeX_Main-Italic.eot" => "katex/fonts/KaTeX_Main-Italic.eot",
528+
"static/katex/fonts/KaTeX_Main-Italic.ttf" => "katex/fonts/KaTeX_Main-Italic.ttf",
529+
"static/katex/fonts/KaTeX_Main-Italic.woff" => "katex/fonts/KaTeX_Main-Italic.woff",
530+
"static/katex/fonts/KaTeX_Main-Regular.eot" => "katex/fonts/KaTeX_Main-Regular.eot",
531+
"static/katex/fonts/KaTeX_Main-Regular.ttf" => "katex/fonts/KaTeX_Main-Regular.ttf",
532+
"static/katex/fonts/KaTeX_Main-Regular.woff" => "katex/fonts/KaTeX_Main-Regular.woff",
533+
"static/katex/fonts/KaTeX_Math-BoldItalic.eot" => "katex/fonts/KaTeX_Math-BoldItalic.eot",
534+
"static/katex/fonts/KaTeX_Math-BoldItalic.ttf" => "katex/fonts/KaTeX_Math-BoldItalic.ttf",
535+
"static/katex/fonts/KaTeX_Math-BoldItalic.woff" => "katex/fonts/KaTeX_Math-BoldItalic.woff",
536+
"static/katex/fonts/KaTeX_Math-Italic.eot" => "katex/fonts/KaTeX_Math-Italic.eot",
537+
"static/katex/fonts/KaTeX_Math-Italic.ttf" => "katex/fonts/KaTeX_Math-Italic.ttf",
538+
"static/katex/fonts/KaTeX_Math-Italic.woff" => "katex/fonts/KaTeX_Math-Italic.woff",
539+
"static/katex/fonts/KaTeX_Math-Regular.eot" => "katex/fonts/KaTeX_Math-Regular.eot",
540+
"static/katex/fonts/KaTeX_Math-Regular.ttf" => "katex/fonts/KaTeX_Math-Regular.ttf",
541+
"static/katex/fonts/KaTeX_Math-Regular.woff" => "katex/fonts/KaTeX_Math-Regular.woff",
542+
"static/katex/fonts/KaTeX_Size1-Regular.eot" => "katex/fonts/KaTeX_Size1-Regular.eot",
543+
"static/katex/fonts/KaTeX_Size1-Regular.ttf" => "katex/fonts/KaTeX_Size1-Regular.ttf",
544+
"static/katex/fonts/KaTeX_Size1-Regular.woff" => "katex/fonts/KaTeX_Size1-Regular.woff",
545+
"static/katex/fonts/KaTeX_Size2-Regular.eot" => "katex/fonts/KaTeX_Size2-Regular.eot",
546+
"static/katex/fonts/KaTeX_Size2-Regular.ttf" => "katex/fonts/KaTeX_Size2-Regular.ttf",
547+
"static/katex/fonts/KaTeX_Size2-Regular.woff" => "katex/fonts/KaTeX_Size2-Regular.woff",
548+
"static/katex/fonts/KaTeX_Size3-Regular.eot" => "katex/fonts/KaTeX_Size3-Regular.eot",
549+
"static/katex/fonts/KaTeX_Size3-Regular.ttf" => "katex/fonts/KaTeX_Size3-Regular.ttf",
550+
"static/katex/fonts/KaTeX_Size3-Regular.woff" => "katex/fonts/KaTeX_Size3-Regular.woff",
551+
"static/katex/fonts/KaTeX_Size4-Regular.eot" => "katex/fonts/KaTeX_Size4-Regular.eot",
552+
"static/katex/fonts/KaTeX_Size4-Regular.ttf" => "katex/fonts/KaTeX_Size4-Regular.ttf",
553+
"static/katex/fonts/KaTeX_Size4-Regular.woff" => "katex/fonts/KaTeX_Size4-Regular.woff",
554+
}
555+
511556

512557
fn collect(path: &Path, krate: &str,
513558
key: &str) -> io::IoResult<Vec<String>> {

src/librustdoc/html/static/main.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,10 @@ nav.sub {
304304

305305
.content .impl-methods .docblock { margin-left: 40px; }
306306

307+
.math-display {
308+
text-align: center;
309+
}
310+
307311
nav {
308312
border-bottom: 1px solid #e0e0e0;
309313
padding-bottom: 10px;

src/librustdoc/html/static/main.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
// except according to those terms.
1010

1111
/*jslint browser: true, es5: true */
12-
/*globals $: true, rootPath: true */
12+
/*globals $: true, rootPath: true, useKaTeX: true, katex: true */
1313

1414
(function() {
1515
"use strict";
@@ -775,4 +775,15 @@
775775
$("#main > .docblock").before(wrapper);
776776
});
777777

778+
$(function() {
779+
if (!useKaTeX) { return }
780+
$(".latex-math").each(function() {
781+
if (!katex) {
782+
console.error("KaTeX not loaded on page requiring it")
783+
}
784+
var style = this.tagName == "P" ? "display" : "text";
785+
786+
katex.render("\\" + style + "style " + this.textContent, this);
787+
})
788+
})
778789
}());

0 commit comments

Comments
 (0)