From 472e2a1f9905c033575fd4bc9481d403b8caaf32 Mon Sep 17 00:00:00 2001
From: Daria-E <127450561+Daria-E@users.noreply.github.com>
Date: Sat, 15 Aug 2026 23:20:36 +0300
Subject: [PATCH 1/3] Typeset preview math in MathJax's TeX faces
The HTML-CSS output jax prefers fonts installed on the machine over
MathJax's own, and its default availableFonts list names STIX. macOS
ships STIX 1.x as system-reserved faces that WebKit resolves by name, so
the preview selects them and typesets digits and operators in
STIXGeneral-Regular, a Times-metric face indistinguishable from body
text while identifiers still read as math italic. Browsers that do not
enumerate those faces, such as Firefox, load MathJax's TeX fonts and
render the same document correctly.
An empty availableFonts list declines local fonts. preferredFont is
nulled alongside it because MathJax tests the preferred font even when
it is absent from availableFonts, so the list alone still takes the
local path on a machine carrying MathJax's own TeX fonts.
MathJax resolves its configuration, jax and fonts against the script
element's own src, so script-src and font-src both derive their source
expression from that URL rather than repeating the origin. Without the
font-src entry the faces are blocked, and the output jax stalls for its
web-font timeout before falling back to bitmap image fonts.
---
MacDown/Code/Document/MPRenderer.m | 51 ++++++++++++++----
MacDown/Resources/MathJax/init.js | 19 ++++++-
MacDownTests/MPMathJaxRenderingTests.m | 73 ++++++++++++++++++++++++++
3 files changed, 131 insertions(+), 12 deletions(-)
diff --git a/MacDown/Code/Document/MPRenderer.m b/MacDown/Code/Document/MPRenderer.m
index de877e18..12df5dcc 100644
--- a/MacDown/Code/Document/MPRenderer.m
+++ b/MacDown/Code/Document/MPRenderer.m
@@ -486,6 +486,28 @@ NS_INLINE void MPFreeHTMLRenderer(hoedown_renderer *htmlRenderer)
return escaped;
}
+/**
+ * Origin of kMPMathJaxCDN as a CSP source expression, e.g.
+ * "https://cdnjs.cloudflare.com".
+ *
+ * MathJax resolves its configuration, jax and fonts against the script
+ * element's own src, so every one of them comes from this origin. Deriving the
+ * source expression from the URL keeps the policy from drifting away from the
+ * URL actually loaded when the CDN changes.
+ */
+NS_INLINE NSString *MPMathJaxCDNOrigin(void)
+{
+ NSURLComponents *cdn = [NSURLComponents componentsWithString:kMPMathJaxCDN];
+ NSCAssert(cdn.scheme.length && cdn.host.length,
+ @"kMPMathJaxCDN must carry a scheme and host");
+ if (cdn.port)
+ {
+ return [NSString stringWithFormat:@"%@://%@:%@",
+ cdn.scheme, cdn.host, cdn.port];
+ }
+ return [NSString stringWithFormat:@"%@://%@", cdn.scheme, cdn.host];
+}
+
NS_INLINE NSString *MPPreviewContentSecurityPolicy(void)
{
// MathJax 2.x relies on eval/new Function during startup, and bundled
@@ -496,17 +518,24 @@ NS_INLINE void MPFreeHTMLRenderer(hoedown_renderer *htmlRenderer)
// that source — the
container still lays out, but the bits never
// load. MPImageRenderingTests pins this contract; update it deliberately
// if you tighten the policy.
- return @"default-src 'none'; "
- @"base-uri 'none'; "
- @"form-action 'none'; "
- @"object-src 'none'; "
- @"frame-src 'none'; "
- @"img-src data: file: http: https:; "
- @"media-src data: file: http: https:; "
- @"style-src 'self' 'unsafe-inline' file:; "
- @"font-src data: file:; "
- @"connect-src http: https:; "
- @"script-src 'self' file: https://cdnjs.cloudflare.com 'unsafe-eval'";
+ //
+ // font-src carries the MathJax origin for the same reason script-src does:
+ // the TeX faces are fetched from it, and blocking them makes the HTML-CSS
+ // output jax stall for its web-font timeout and then fall back to bitmap
+ // image fonts.
+ NSString *mathJax = MPMathJaxCDNOrigin();
+ return [NSString stringWithFormat:
+ @"default-src 'none'; "
+ @"base-uri 'none'; "
+ @"form-action 'none'; "
+ @"object-src 'none'; "
+ @"frame-src 'none'; "
+ @"img-src data: file: http: https:; "
+ @"media-src data: file: http: https:; "
+ @"style-src 'self' 'unsafe-inline' file:; "
+ @"font-src data: file: %@; "
+ @"connect-src http: https:; "
+ @"script-src 'self' file: %@ 'unsafe-eval'", mathJax, mathJax];
}
NS_INLINE NSString *MPPreviewHeadTags(NSString *checkboxBridgeToken)
diff --git a/MacDown/Resources/MathJax/init.js b/MacDown/Resources/MathJax/init.js
index 6b66412a..14f32e2e 100644
--- a/MacDown/Resources/MathJax/init.js
+++ b/MacDown/Resources/MathJax/init.js
@@ -2,7 +2,24 @@
MathJax.Hub.Config({
'showProcessingMessages': false,
- 'messageStyle': 'none'
+ 'messageStyle': 'none',
+
+ // The HTML-CSS output jax prefers fonts installed on the machine over
+ // MathJax's own, and its default availableFonts list names STIX. macOS
+ // ships STIX 1.x as system-reserved faces that WebKit resolves by name, so
+ // the preview picks them up and typesets digits and operators in
+ // STIXGeneral-Regular — a Times-metric face indistinguishable from body
+ // text. Browsers that do not enumerate those faces, such as Firefox, load
+ // MathJax's TeX fonts instead and render the same document correctly.
+ //
+ // Emptying the list makes the preview do the same. preferredFont is nulled
+ // alongside it because MathJax tests the preferred font even when it is
+ // absent from availableFonts, so the list alone would still take the local
+ // path on a machine carrying MathJax's own TeX fonts.
+ 'HTML-CSS': {
+ 'availableFonts': [],
+ 'preferredFont': null
+ }
});
if (typeof MathJaxListener !== 'undefined') {
diff --git a/MacDownTests/MPMathJaxRenderingTests.m b/MacDownTests/MPMathJaxRenderingTests.m
index fada7230..529a7772 100644
--- a/MacDownTests/MPMathJaxRenderingTests.m
+++ b/MacDownTests/MPMathJaxRenderingTests.m
@@ -261,4 +261,77 @@ - (void)testMathWithSpecialCharacters
XCTAssertTrue([html length] > 0, @"HTML should not be empty");
}
+
+#pragma mark - Font Selection Tests
+
+/**
+ * The HTML-CSS output jax prefers fonts installed on the machine over
+ * MathJax's own, and macOS ships STIX faces that WebKit resolves by name.
+ * Declining them keeps the preview on MathJax's TeX faces; otherwise it
+ * typesets digits and operators in STIXGeneral-Regular, a Times-metric face
+ * indistinguishable from body text.
+ *
+ * Both settings are matched by value, and matched inside the 'HTML-CSS'
+ * block. Prose naming either setting appears in the same embedded script and
+ * must not satisfy the assertion, and a setting hoisted out of the block
+ * reaches no output jax at all: MathJax merges configuration per jax id, so
+ * availableFonts at the top level of MathJax.Hub.Config is silently ignored
+ * and the STIX regression returns.
+ */
+- (void)testPreviewDeclinesLocallyInstalledMathFonts
+{
+ self.dataSource.markdown = @"Inline \\( x = 2y + 15 \\)";
+ [self.renderer parseMarkdown:self.dataSource.markdown];
+ [self.renderer render];
+
+ NSString *html = self.delegate.lastHTML;
+ XCTAssertNotNil(html, @"Preview render should produce HTML");
+
+ // [^}] spans newlines, so this stays within the 'HTML-CSS' object.
+ NSString *inBlock = @"['\"]?HTML-CSS['\"]?\\s*:\\s*\\{[^}]*";
+ NSUInteger (^matchCount)(NSString *) = ^(NSString *setting) {
+ NSRegularExpression *re =
+ [NSRegularExpression regularExpressionWithPattern:
+ [inBlock stringByAppendingString:setting]
+ options:0 error:NULL];
+ return [re numberOfMatchesInString:html options:0
+ range:NSMakeRange(0, html.length)];
+ };
+
+ XCTAssertEqual(matchCount(@"['\"]?availableFonts['\"]?\\s*:\\s*\\[\\s*\\]"),
+ (NSUInteger)1,
+ @"HTML-CSS config should set availableFonts to an empty "
+ @"list, so locally installed STIX faces do not win over "
+ @"MathJax's TeX faces");
+ XCTAssertEqual(matchCount(@"['\"]?preferredFont['\"]?\\s*:\\s*null"),
+ (NSUInteger)1,
+ @"HTML-CSS config should null preferredFont: MathJax tests "
+ @"the preferred font even when it is absent from "
+ @"availableFonts, so an empty list alone still takes the "
+ @"local path on a machine with the TeX fonts installed");
+}
+
+/**
+ * MathJax serves its TeX faces from the same CDN that serves its scripts.
+ * With font-src blocking that origin the output jax stalls for its web-font
+ * timeout and then falls back to bitmap image fonts.
+ *
+ * The origin is spelled out rather than derived from kMPMathJaxCDN, which is
+ * file-static and unreachable from here. Since the policy derives both
+ * directives from that constant, pointing it at another host fails this
+ * assertion rather than silently passing while the policy moves.
+ */
+- (void)testPreviewCSPAllowsMathJaxFontsFromCDN
+{
+ self.dataSource.markdown = @"Inline \\( x = 2y + 15 \\)";
+ [self.renderer parseMarkdown:self.dataSource.markdown];
+ [self.renderer render];
+
+ NSString *html = self.delegate.lastHTML;
+ XCTAssertNotNil(html, @"Preview render should produce HTML");
+ XCTAssertTrue(
+ [html containsString:@"font-src data: file: https://cdnjs.cloudflare.com;"],
+ @"CSP font-src should allow the CDN serving MathJax's TeX faces");
+}
+
@end
From f9c4b46630d3a9c339f2a2c4bdfb6b6e99ac76d8 Mon Sep 17 00:00:00 2001
From: Daria-E <127450561+Daria-E@users.noreply.github.com>
Date: Wed, 19 Aug 2026 07:14:34 +0300
Subject: [PATCH 2/3] Serve MathJax's TeX fonts from the app bundle
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The HTML-CSS output jax renders in vector web fonts, but with the fonts
fetched from the CDN at render time the preview falls back to bitmap image
fonts — pixelated on zoom — whenever that fetch times out. The 22 TeX woff
faces now ship in Resources/MathJax/fonts/HTML-CSS/TeX/woff/, and the
preview's resource-load delegate serves any bundled MathJax resource from
file: (the loader was already served this way; the fonts join it). Fonts
load synchronously, so the web-font timeout that triggers the image
fallback never fires. Resources that are not bundled — config, jax.js,
fontdata.js — still load from the CDN.
kMPMathJaxCDN gains external linkage so the delegate can scope the redirect
to the loader's origin.
MPMathJaxLocalFontsTests pins the redirect (woff to the bundle without a
query, un-bundled resources passing through, the loader keeping its config
query) and the presence of the full TeX woff set.
---
MacDown 3000.xcodeproj/project.pbxproj | 4 +
MacDown/Code/Document/MPDocument.m | 36 ++++-
MacDown/Code/Document/MPRenderer.h | 5 +
MacDown/Code/Document/MPRenderer.m | 2 +-
.../TeX/woff/MathJax_AMS-Regular.woff | Bin 0 -> 40816 bytes
.../TeX/woff/MathJax_Caligraphic-Bold.woff | Bin 0 -> 9908 bytes
.../TeX/woff/MathJax_Caligraphic-Regular.woff | Bin 0 -> 9624 bytes
.../TeX/woff/MathJax_Fraktur-Bold.woff | Bin 0 -> 22336 bytes
.../TeX/woff/MathJax_Fraktur-Regular.woff | Bin 0 -> 21492 bytes
.../HTML-CSS/TeX/woff/MathJax_Main-Bold.woff | Bin 0 -> 34456 bytes
.../TeX/woff/MathJax_Main-Italic.woff | Bin 0 -> 20812 bytes
.../TeX/woff/MathJax_Main-Regular.woff | Bin 0 -> 34164 bytes
.../TeX/woff/MathJax_Math-BoldItalic.woff | Bin 0 -> 19780 bytes
.../TeX/woff/MathJax_Math-Italic.woff | Bin 0 -> 19356 bytes
.../TeX/woff/MathJax_Math-Regular.woff | Bin 0 -> 19296 bytes
.../TeX/woff/MathJax_SansSerif-Bold.woff | Bin 0 -> 15928 bytes
.../TeX/woff/MathJax_SansSerif-Italic.woff | Bin 0 -> 14628 bytes
.../TeX/woff/MathJax_SansSerif-Regular.woff | Bin 0 -> 12668 bytes
.../TeX/woff/MathJax_Script-Regular.woff | Bin 0 -> 11864 bytes
.../TeX/woff/MathJax_Size1-Regular.woff | Bin 0 -> 5792 bytes
.../TeX/woff/MathJax_Size2-Regular.woff | Bin 0 -> 5476 bytes
.../TeX/woff/MathJax_Size3-Regular.woff | Bin 0 -> 3256 bytes
.../TeX/woff/MathJax_Size4-Regular.woff | Bin 0 -> 5160 bytes
.../TeX/woff/MathJax_Typewriter-Regular.woff | Bin 0 -> 17620 bytes
.../TeX/woff/MathJax_Vector-Bold.woff | Bin 0 -> 1116 bytes
.../TeX/woff/MathJax_Vector-Regular.woff | Bin 0 -> 1136 bytes
MacDownTests/MPMathJaxLocalFontsTests.m | 150 ++++++++++++++++++
plans/mathjax-local-fonts.md | 150 ++++++++++++++++++
28 files changed, 344 insertions(+), 3 deletions(-)
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_AMS-Regular.woff
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Caligraphic-Bold.woff
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Caligraphic-Regular.woff
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Fraktur-Bold.woff
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Fraktur-Regular.woff
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Main-Bold.woff
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Main-Italic.woff
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Main-Regular.woff
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Math-BoldItalic.woff
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Math-Italic.woff
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Math-Regular.woff
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_SansSerif-Bold.woff
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_SansSerif-Italic.woff
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_SansSerif-Regular.woff
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Script-Regular.woff
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Size1-Regular.woff
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Size2-Regular.woff
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Size3-Regular.woff
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Size4-Regular.woff
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Typewriter-Regular.woff
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Vector-Bold.woff
create mode 100644 MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Vector-Regular.woff
create mode 100644 MacDownTests/MPMathJaxLocalFontsTests.m
create mode 100644 plans/mathjax-local-fonts.md
diff --git a/MacDown 3000.xcodeproj/project.pbxproj b/MacDown 3000.xcodeproj/project.pbxproj
index 13a9e68b..81eec666 100644
--- a/MacDown 3000.xcodeproj/project.pbxproj
+++ b/MacDown 3000.xcodeproj/project.pbxproj
@@ -155,6 +155,7 @@
ISSUE313TOOLBARBUILDFILE /* MPToolbarControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = ISSUE313TOOLBARFILEREF /* MPToolbarControllerTests.m */; };
ISSUE318STYLERELBUILDFILE /* MPDocumentStyleUpdateTests.m in Sources */ = {isa = PBXBuildFile; fileRef = ISSUE318STYLERELFILEREF /* MPDocumentStyleUpdateTests.m */; };
ISSUE325MJSCRLBUILDFILE /* MPMathJaxScrollTests.m in Sources */ = {isa = PBXBuildFile; fileRef = ISSUE325MJSCRLFILEREF /* MPMathJaxScrollTests.m */; };
+ MJLOCALFONTSBUILDFILE /* MPMathJaxLocalFontsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = MJLOCALFONTSFILEREF /* MPMathJaxLocalFontsTests.m */; };
ISSUE331MRMDRNDRBUILDFILE /* MPMermaidRenderingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = ISSUE331MRMDRNDRFILEREF /* MPMermaidRenderingTests.m */; };
ISSUE332GVIZRNDRBUILDFILE /* MPGraphvizRenderingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = ISSUE332GVIZRNDRFILEREF /* MPGraphvizRenderingTests.m */; };
ISSUE341IMGRENDERBUILDFILE /* MPImageRenderingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = ISSUE341IMGRENDERFILEREF /* MPImageRenderingTests.m */; };
@@ -732,6 +733,7 @@
ISSUE313TOOLBARFILEREF /* MPToolbarControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPToolbarControllerTests.m; sourceTree = ""; };
ISSUE318STYLERELFILEREF /* MPDocumentStyleUpdateTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDocumentStyleUpdateTests.m; sourceTree = ""; };
ISSUE325MJSCRLFILEREF /* MPMathJaxScrollTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPMathJaxScrollTests.m; sourceTree = ""; };
+ MJLOCALFONTSFILEREF /* MPMathJaxLocalFontsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPMathJaxLocalFontsTests.m; sourceTree = ""; };
ISSUE331MRMDRNDRFILEREF /* MPMermaidRenderingTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPMermaidRenderingTests.m; sourceTree = ""; };
ISSUE332GVIZRNDRFILEREF /* MPGraphvizRenderingTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPGraphvizRenderingTests.m; sourceTree = ""; };
ISSUE341IMGRENDERFILEREF /* MPImageRenderingTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPImageRenderingTests.m; sourceTree = ""; };
@@ -1175,6 +1177,7 @@
8552820CEE8D00E83AEE3897 /* MPHTMLResourceURLsTests.m */,
ISSUE341IMGRENDERFILEREF /* MPImageRenderingTests.m */,
ISSUE325MJSCRLFILEREF /* MPMathJaxScrollTests.m */,
+ MJLOCALFONTSFILEREF /* MPMathJaxLocalFontsTests.m */,
1FCDCA371944F97800B1F966 /* Supporting Files */,
B3BD139B59E787FBB9F38228 /* MPEditorViewSubstitutionTests.m */,
66A67CD2B90882C7F91B6251 /* MPEditorViewPasteboardTests.m */,
@@ -1929,6 +1932,7 @@
ISSUE278TABLEBUILDFILE /* MPInsertTableTests.m in Sources */,
ISSUE543EXTCHGBUILDFILE /* MPExternalChangeReloadTests.m in Sources */,
ISSUE325MJSCRLBUILDFILE /* MPMathJaxScrollTests.m in Sources */,
+ MJLOCALFONTSBUILDFILE /* MPMathJaxLocalFontsTests.m in Sources */,
5AD88BF0766B938F9D61A831 /* MPEditorViewSubstitutionTests.m in Sources */,
C185BB0F201C78DF6D946E1F /* MPEditorViewPasteboardTests.m in Sources */,
ISSUE313TOOLBARBUILDFILE /* MPToolbarControllerTests.m in Sources */,
diff --git a/MacDown/Code/Document/MPDocument.m b/MacDown/Code/Document/MPDocument.m
index f5d6adc9..0d55a0bd 100644
--- a/MacDown/Code/Document/MPDocument.m
+++ b/MacDown/Code/Document/MPDocument.m
@@ -1792,14 +1792,46 @@ - (BOOL)textViewShouldMoveToLeftEndOfLine:(NSTextView *)textView
- (NSURLRequest *)webView:(WebView *)sender resource:(id)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse fromDataSource:(WebDataSource *)dataSource
{
-
+ // The MathJax loader is served from the bundle, carrying its "?config=…"
+ // query so MathJax still loads the right combined config.
if ([[request.URL lastPathComponent] isEqualToString:@"MathJax.js"])
{
NSURLComponents *origComps = [NSURLComponents componentsWithURL:[request URL] resolvingAgainstBaseURL:YES];
NSURLComponents *updatedComps = [NSURLComponents componentsWithURL:[[NSBundle mainBundle] URLForResource:@"MathJax" withExtension:@"js" subdirectory:@"MathJax"] resolvingAgainstBaseURL:NO];
[updatedComps setQueryItems:[origComps queryItems]];
- request = [NSURLRequest requestWithURL:[updatedComps URL]];
+ return [NSURLRequest requestWithURL:[updatedComps URL]];
+ }
+
+ // The TeX HTML-CSS web fonts also ship in the bundle. Serve them locally too:
+ // without the fonts local, the HTML-CSS output jax waits on a render-time
+ // web-font fetch and, when it times out, falls back to bitmap image fonts
+ // that pixelate on zoom. Any MathJax CDN resource whose path maps to a file
+ // present in the bundle is redirected; the rest (config, jax.js, fontdata.js)
+ // fall through to the CDN unchanged, so this only ever short-circuits a load
+ // to a file that exists. The "?V=…" query is dropped — a file: URL with a
+ // query may not resolve, which would fail the load back into the fallback.
+ NSURL *cdn = [NSURL URLWithString:kMPMathJaxCDN];
+ NSURL *url = request.URL;
+ if (cdn.host.length && [url.host isEqualToString:cdn.host])
+ {
+ // Directory on the CDN that holds MathJax.js, e.g.
+ // "/ajax/libs/mathjax/2.7.3/". The trailing slash keeps a sibling
+ // version directory (…/2.7.30/) from matching this one's prefix.
+ NSString *prefix = [[cdn.path stringByDeletingLastPathComponent]
+ stringByAppendingString:@"/"];
+ if ([url.path hasPrefix:prefix])
+ {
+ NSString *subpath = [url.path substringFromIndex:prefix.length];
+ NSURL *mathJaxDir =
+ [[NSBundle mainBundle].resourceURL URLByAppendingPathComponent:@"MathJax"];
+ NSURL *local = [mathJaxDir URLByAppendingPathComponent:subpath];
+ if (subpath.length &&
+ [[NSFileManager defaultManager] fileExistsAtPath:local.path])
+ {
+ request = [NSURLRequest requestWithURL:local];
+ }
+ }
}
return request;
diff --git a/MacDown/Code/Document/MPRenderer.h b/MacDown/Code/Document/MPRenderer.h
index ab1bb39c..a56c6faa 100644
--- a/MacDown/Code/Document/MPRenderer.h
+++ b/MacDown/Code/Document/MPRenderer.h
@@ -10,6 +10,11 @@
@protocol MPRendererDataSource;
@protocol MPRendererDelegate;
+// The MathJax loader URL the preview requests. The bundle serves this and the
+// TeX fonts locally (see -[MPDocument webView:resource:willSendRequest:…]), so
+// MPDocument matches requests against this origin.
+extern NSString * const kMPMathJaxCDN;
+
typedef NS_ENUM(NSUInteger, MPCodeBlockAccessoryType)
{
diff --git a/MacDown/Code/Document/MPRenderer.m b/MacDown/Code/Document/MPRenderer.m
index 12df5dcc..98c93fde 100644
--- a/MacDown/Code/Document/MPRenderer.m
+++ b/MacDown/Code/Document/MPRenderer.m
@@ -23,7 +23,7 @@
// of https://github.com/mathjax/MathJax/issues/548. If the fix has been merged
// in to MathJax, then the WebResourceLoadDelegate can be removed from MPDocument
// and MathJax.js can be removed from this project.
-static NSString * const kMPMathJaxCDN =
+NSString * const kMPMathJaxCDN =
@"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/MathJax.js"
@"?config=TeX-AMS-MML_HTMLorMML";
static NSString * const kMPPrismScriptDirectory = @"Prism/components";
diff --git a/MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_AMS-Regular.woff b/MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_AMS-Regular.woff
new file mode 100644
index 0000000000000000000000000000000000000000..11516fbfdf396cd3dc893fef6c048c3e8c360c28
GIT binary patch
literal 40816
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
literal 0
HcmV?d00001
diff --git a/MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Caligraphic-Bold.woff b/MacDown/Resources/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Caligraphic-Bold.woff
new file mode 100644
index 0000000000000000000000000000000000000000..cf9462dde0d4c43d73e540e513762160ca83793e
GIT binary patch
literal 9908
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