Skip to content

Commit a9bdb7e

Browse files
feat: move mermaid DOM transformation to build time
Optimizes performance by moving the transformation of Mermaid code blocks from client-side JavaScript to a build-time Jekyll plugin. - Adds `nokogiri` dependency for HTML parsing - Adds `_plugins/mermaid_processor.rb` to transform `<pre><code>` to `div.mermaid` - Removes client-side transformation loop from `_includes/mermaid.html`
1 parent 2b36d50 commit a9bdb7e

4 files changed

Lines changed: 64 additions & 9 deletions

File tree

Gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,4 @@ gem "wdm", "~> 0.1", :platforms => [:mingw, :x64_mingw, :mswin]
3232
# Lock `http_parser.rb` gem to `v0.6.x` on JRuby builds since newer versions of the gem
3333
# do not have a Java counterpart.
3434
gem "http_parser.rb", "~> 0.6.0", :platforms => [:jruby]
35+
gem "nokogiri"

Gemfile.lock

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,34 @@ GEM
9292
rb-inotify (~> 0.9, >= 0.9.10)
9393
logger (1.7.0)
9494
mercenary (0.4.0)
95+
mini_portile2 (2.8.9)
9596
minima (2.5.2)
9697
jekyll (>= 3.5, < 5.0)
9798
jekyll-feed (~> 0.9)
9899
jekyll-seo-tag (~> 2.1)
100+
nokogiri (1.19.0)
101+
mini_portile2 (~> 2.8.2)
102+
racc (~> 1.4)
103+
nokogiri (1.19.0-aarch64-linux-gnu)
104+
racc (~> 1.4)
105+
nokogiri (1.19.0-aarch64-linux-musl)
106+
racc (~> 1.4)
107+
nokogiri (1.19.0-arm-linux-gnu)
108+
racc (~> 1.4)
109+
nokogiri (1.19.0-arm-linux-musl)
110+
racc (~> 1.4)
111+
nokogiri (1.19.0-arm64-darwin)
112+
racc (~> 1.4)
113+
nokogiri (1.19.0-x86_64-darwin)
114+
racc (~> 1.4)
115+
nokogiri (1.19.0-x86_64-linux-gnu)
116+
racc (~> 1.4)
117+
nokogiri (1.19.0-x86_64-linux-musl)
118+
racc (~> 1.4)
99119
pathutil (0.16.2)
100120
forwardable-extended (~> 2.6)
101121
public_suffix (7.0.0)
122+
racc (1.8.1)
102123
rake (13.3.1)
103124
rb-fsevent (0.11.2)
104125
rb-inotify (0.11.1)
@@ -169,6 +190,7 @@ DEPENDENCIES
169190
jekyll-feed (~> 0.12)
170191
logger
171192
minima (~> 2.5)
193+
nokogiri
172194
tzinfo (>= 1, < 3)
173195
tzinfo-data
174196
wdm (~> 0.1)
@@ -217,9 +239,20 @@ CHECKSUMS
217239
listen (3.9.0) sha256=db9e4424e0e5834480385197c139cb6b0ae0ef28cc13310cfd1ca78377d59c67
218240
logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
219241
mercenary (0.4.0) sha256=b25a1e4a59adca88665e08e24acf0af30da5b5d859f7d8f38fba52c28f405138
242+
mini_portile2 (2.8.9) sha256=0cd7c7f824e010c072e33f68bc02d85a00aeb6fce05bb4819c03dfd3c140c289
220243
minima (2.5.2) sha256=9c434e3b7bc4a0f0ab488910438ed3757a0502ff1060d172f361907fc38aa45a
244+
nokogiri (1.19.0) sha256=e304d21865f62518e04f2bf59f93bd3a97ca7b07e7f03952946d8e1c05f45695
245+
nokogiri (1.19.0-aarch64-linux-gnu) sha256=11a97ecc3c0e7e5edcf395720b10860ef493b768f6aa80c539573530bc933767
246+
nokogiri (1.19.0-aarch64-linux-musl) sha256=eb70507f5e01bc23dad9b8dbec2b36ad0e61d227b42d292835020ff754fb7ba9
247+
nokogiri (1.19.0-arm-linux-gnu) sha256=572a259026b2c8b7c161fdb6469fa2d0edd2b61cd599db4bbda93289abefbfe5
248+
nokogiri (1.19.0-arm-linux-musl) sha256=23ed90922f1a38aed555d3de4d058e90850c731c5b756d191b3dc8055948e73c
249+
nokogiri (1.19.0-arm64-darwin) sha256=0811dfd936d5f6dd3f6d32ef790568bf29b2b7bead9ba68866847b33c9cf5810
250+
nokogiri (1.19.0-x86_64-darwin) sha256=1dad56220b603a8edb9750cd95798bffa2b8dd9dd9aa47f664009ee5b43e3067
251+
nokogiri (1.19.0-x86_64-linux-gnu) sha256=f482b95c713d60031d48c44ce14562f8d2ce31e3a9e8dd0ccb131e9e5a68b58c
252+
nokogiri (1.19.0-x86_64-linux-musl) sha256=1c4ca6b381622420073ce6043443af1d321e8ed93cc18b08e2666e5bd02ffae4
221253
pathutil (0.16.2) sha256=e43b74365631cab4f6d5e4228f812927efc9cb2c71e62976edcb252ee948d589
222254
public_suffix (7.0.0) sha256=f7090b5beb0e56f9f10d79eed4d5fbe551b3b425da65877e075dad47a6a1b095
255+
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
223256
rake (13.3.1) sha256=8c9e89d09f66a26a01264e7e3480ec0607f0c497a861ef16063604b1b08eb19c
224257
rb-fsevent (0.11.2) sha256=43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe
225258
rb-inotify (0.11.1) sha256=a0a700441239b0ff18eb65e3866236cd78613d6b9f78fea1f9ac47a85e47be6e

_includes/mermaid.html

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,6 @@
11
<script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
22
<script>
33
document.addEventListener("DOMContentLoaded", function () {
4-
// 将 Jekyll 生成的 <pre><code class="language-mermaid"> 转换为 <div class="mermaid">
5-
document.querySelectorAll('code.language-mermaid').forEach(function (codeElement) {
6-
var preElement = codeElement.parentElement;
7-
var mermaidDiv = document.createElement('div');
8-
mermaidDiv.className = 'mermaid';
9-
mermaidDiv.textContent = codeElement.textContent;
10-
preElement.replaceWith(mermaidDiv);
11-
});
12-
134
// 初始化 Mermaid
145
mermaid.initialize({
156
startOnLoad: true,

_plugins/mermaid_processor.rb

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
require 'nokogiri'
2+
3+
Jekyll::Hooks.register [:posts, :pages], :post_render do |doc|
4+
# Only process HTML documents
5+
if doc.output_ext == '.html'
6+
content = doc.output
7+
# Using Nokogiri to parse the HTML
8+
fragment = Nokogiri::HTML::DocumentFragment.parse(content)
9+
10+
# Find all <pre><code class="language-mermaid"> elements
11+
mermaid_blocks = fragment.css('pre > code.language-mermaid')
12+
13+
if mermaid_blocks.any?
14+
mermaid_blocks.each do |code_element|
15+
pre_element = code_element.parent
16+
17+
# Create the new div
18+
mermaid_div = Nokogiri::XML::Node.new('div', fragment)
19+
mermaid_div['class'] = 'mermaid'
20+
mermaid_div.content = code_element.content
21+
22+
# Replace the pre element with the new div
23+
pre_element.replace(mermaid_div)
24+
end
25+
26+
# Update the document output
27+
doc.output = fragment.to_html
28+
end
29+
end
30+
end

0 commit comments

Comments
 (0)