Releases: zoharbabin/fen
Releases · zoharbabin/fen
Release list
v0.2.9
Fixed
- Task-list checkboxes rendered on their own line, above the item text. cmark-gfm emits GFM task-list checkboxes as
<li><input type="checkbox">with no wrapping element, buttasklist.jslooked for a.task-list-itemclass that never existed, so the checkbox-inline CSS rule never matched. The script now selectsli > input[type="checkbox"]directly, and all 7 bundled theme stylesheets get a matching rule to keep the checkbox and its text on the same line. [TOC]links pointed at anchors that didn't exist.MarkdownRenderercomputed a slug for each heading to build the table of contents, but never wrote a matchingidattribute onto the heading itself — so every generated link 404'd within the page. Headings now get deduplicated ids (GitHub-style-1,-2suffixes for repeated titles) that the TOC links actually target.
Changed
- Prism → highlight.js for code syntax highlighting. Prism's line-numbers plugin needed a separate script and CSS file per theme and lagged on language coverage; highlight.js covers more languages through one init script. The highlighting theme picker in Settings is now a proper
Pickerpopulated from the bundled themes, instead of a free-text field.
Testing
- Added WKWebView-driven end-to-end coverage (
GFMFeatureCoverageTests,PreviewThemeCoverageTests,BundleResolutionTests) asserting against real rendered DOM — heading ids/TOC links, checkbox layout, and highlight.js tokenization — across all 7 bundled themes, light and dark.
Full Changelog: v0.2.8...v0.2.9
v0.2.8
Fixed
- Relative-path images never loaded in the live preview.
DocumentGroup'sFileDocumentConfiguration.fileURLwas never bridged toMarkdownDocument.fileURL— and the property wasinternal, notpublic, so nothing outsideFenCorecould have set it even if it tried. The preview's base directory was alwaysnilas a result, so any Markdown image (or other asset) referenced by relative path silently failed to render for every real document. Fixed on both macOS and iOS by bridgingfile.fileURLon appear and on change, and exposingMarkdownDocument.fileURLpublicly. - Local SVGs rendered as a broken-image placeholder. The
fen-preview://scheme handler served every local asset withmimeType: nil, relying on WKWebView to sniff the content type from the byte stream. That works for PNG/JPEG/GIF/WebP, which have reliable magic-byte signatures, but SVG is plain XML text with none — so it never rendered. The handler now derives the MIME type from the file extension. - Help menu showed "Help isn't available for Fen." Replaced the non-functional default Help menu item with one that opens the README on GitHub.
Added
- A custom About window (Fen → About Fen) replacing the generic system panel — matches the landing page branding and includes links to the website, source, issue tracker, release notes, and license, plus MacDown/Mou attribution.
assets/image-formats-test.md— a test fixture exercising the preview fixes above across PNG, JPEG, GIF, SVG, and WebP, as local files, remote HTTPS URLs, reference-style links, and a linked thumbnail.
Full Changelog: v0.2.7...v0.2.8
v0.2.7
Fixed
- MathJax loaded from a CDN (
cdnjs.cloudflare.com) at render time — every other script and style in Fen ships vendored inside the app, but MathJax was the one exception, adding a delay on first render, breaking the math-rendering feature offline, and making an unnecessary network call from an app whose trust model is local-first. MathJax is now vendored the same way as Mermaid:Shared/Resources/Extensions/mathjax-tex-svg.jsbundles MathJax v3'stex-svgoutput (SVG glyphs, no separate web-font files), with attribution inLICENSE/mathjax.txt(Apache License 2.0). Fen now makes zero runtime network calls to render anything. - The inline-dollar math config (
$...$delimiters) is rewritten for MathJax v3's config API — the oldMathJax.Hub.Config/tex2jaxblock was v2-only and incompatible with the vendoredtex-svg.jsbundle.
Added
- A regression test (
MathJax is vendored locally, not loaded from a CDN) asserts the composed preview/export HTML never contains acdnjs.cloudflare.comreference, so this can't silently regress. - Mermaid diagrams in
docs/ARCHITECTURE.mdcovering the FenCore/macOS/iOS target structure, the editor-to-preview rendering pipeline,coreBundle's resource-resolution flow, thefen-preview://scheme handler's path-traversal guard, and the CI/release pipeline.
Changed
ARCHITECTURE.md,RELEASING.md, andROADMAP.mdmoved into a newdocs/directory; every cross-reference across the repo (README, CONTRIBUTING, issue templates, workflow comments) updated accordingly.- README rewritten: logo and badges at the top, a hero screenshot, and the MacDown-origin attribution moved to the very bottom under "Origin and thanks."
- Removed the "Start a discussion" link from the landing page (GitHub Discussions isn't enabled for this repo).
- This repository is no longer a GitHub fork of
mfbergmann/macdown-swift— detached via GitHub's fork-network settings.
Full Changelog: v0.2.6...v0.2.7
v0.2.6
Fixed
- Scroll sync could stay half-broken on documents that exactly fill the
viewport — the preview's scroll-fraction math divided by
scrollHeight - clientHeight, which is0when there's no overflow to
scroll yet. That producedNaN, which poisoned a duplicate-suppression
check downstream and could stop scroll sync from engaging until you
scrolled the preview manually once. Guarded withMath.max(1, ...)so it
never divides by zero.
Added
- Automated UI test coverage for scroll sync —
ScrollSyncUITests
drives the real app end-to-end (types a long document, scrolls one pane,
asserts the other pane's exposed scroll position updates) covering both
sync directions, so this class of regression gets caught before release. - The editor and preview panes now expose their live scroll position as an
accessibility value/label, which both the new UI tests and assistive
tech can read directly.
Full Changelog: v0.2.5...v0.2.6
v0.2.5
What's fixed
- Editor/preview scroll sync — the two panes scrolled completely
independently before; scrolling one now scrolls the other to match. - ⌘F now opens Find — Cmd+F previously did nothing. Find (⌘F), Find Next
(⌘G), Find Previous (⇧⌘G), and Find and Replace (⌥⌘F) now drive the
built-in AppKit find bar.
Also in this release
- SwiftLint/SwiftFormat cleanup across the codebase, with the two tools'
configs reconciled so they no longer disagree on trailing commas and
multiline-statement brace placement.
Full Changelog: v0.2.4...v0.2.5