Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 34 additions & 11 deletions generate_index.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import html
import urllib.parse
import shutil
import typing
from collections import defaultdict
from typing import List, Tuple, Dict

Expand Down Expand Up @@ -77,15 +78,31 @@ def copy_vendor_files(self, output_dir: str) -> None:

def rewrite_html_content(self, content: str) -> str:
"""
Rewrite CDN asset URLs in HTML to local /vendor/ paths.

Replaces known external CDN links (React, Babel, Tailwind, PrismJS, FontAwesome, etc.) with corresponding /vendor/... paths and removes `integrity` and `crossorigin` attributes from `<link>` and `<script>` tags that reference those local vendor files.

Replace known CDN asset URLs in the HTML with local `/vendor/` paths and remove `integrity`/`crossorigin` attributes from tags that reference `/vendor/`.

Parameters:
content (str): HTML document content to rewrite.

Returns:
str: HTML content with matching CDN URLs substituted by local `/vendor/` URLs and `integrity`/`crossorigin` attributes removed from tags that reference `/vendor/`.
"""
"""
Remove `integrity` and `crossorigin` attributes from a matched `<link>` or `<script>` tag when it references a `/vendor/` path.

Parameters:
match (typing.Match[str]): A regex match whose matched text is the full HTML tag.

Returns:
str: The tag text with `integrity` and `crossorigin` attributes removed if the tag contains `/vendor/`, otherwise the original tag text.
"""
"""
Remove `integrity` and `crossorigin` attributes from a matched <link> or <script> tag when it references a `/vendor/` path.

Parameters:
match (typing.Match[str]): A regex match whose matched text is the full HTML tag.

Returns:
str: The HTML content with matching CDN URLs substituted by local vendor URLs and SRI/crossorigin attributes stripped for vendored assets.
str: The tag text with `integrity` and `crossorigin` attributes removed if the tag contains `/vendor/`, otherwise the original tag text.
"""
replacements = [
# React
Expand All @@ -100,25 +117,31 @@ def rewrite_html_content(self, content: str) -> str:
(r'https://cdn\.tailwindcss\.com(?:@[^/]+)?', '/vendor/tailwindcss/script.js'),
# PrismJS
(r'https://cdnjs\.cloudflare\.com/ajax/libs/prism/[^/]+/themes/prism\.min\.css', '/vendor/prismjs/themes/prism.css'),
(r'https://cdnjs\.cloudflare\.com/ajax/libs/prism/[^/]+/plugins/line-numbers/prism-line-numbers\.min\.css', '/vendor/prismjs/plugins/line-numbers/prism-line-numbers.css'),
(r'https://cdnjs\.cloudflare\.com/ajax/libs/prism/[^/]+/plugins/toolbar/prism-toolbar\.min\.css', '/vendor/prismjs/plugins/toolbar/prism-toolbar.css'),
(r'https://cdnjs\.cloudflare\.com/ajax/libs/prism/[^/]+/plugins/([a-zA-Z0-9_-]+)/prism-\1\.min\.css', r'/vendor/prismjs/plugins/\1/prism-\1.css'),
# FontAwesome
(r'https://cdnjs\.cloudflare\.com/ajax/libs/font-awesome/[^/]+/css/all\.min\.css', '/vendor/fontawesome/css/all.min.css'),
# jsDelivr generic patterns for Prism JS and CSS (often used interchangeably)
(r'https://cdn\.jsdelivr\.net/npm/prismjs(?:@[^/]+)?/prism\.min\.js', '/vendor/prismjs/prism.js'),
(r'https://cdn\.jsdelivr\.net/npm/prismjs(?:@[^/]+)?/components/prism-core\.min\.js', '/vendor/prismjs/prism.js'),
(r'https://cdn\.jsdelivr\.net/npm/prismjs(?:@[^/]+)?/components/prism-([a-zA-Z0-9_-]+)\.min\.js', r'/vendor/prismjs/components/prism-\1.js'),
(r'https://cdn\.jsdelivr\.net/npm/prismjs(?:@[^/]+)?/plugins/([a-zA-Z0-9_-]+)/prism-\1\.min\.js', r'/vendor/prismjs/plugins/\1/prism-\1.js'),
(r'https://cdn\.jsdelivr\.net/npm/prismjs(?:@[^/]+)?/plugins/([a-zA-Z0-9_-]+)/prism-\1\.min\.css', r'/vendor/prismjs/plugins/\1/prism-\1.css'),
(r'https://cdn\.jsdelivr\.net/npm/prismjs(?:@[^/]+)?/themes/prism(?:-[a-zA-Z0-9_-]+)?\.min\.css', '/vendor/prismjs/themes/prism.css'),
]

for pattern_str, new in replacements:
content = re.sub(pattern_str, new, content)

# Strip integrity and crossorigin attributes from tags referencing local /vendor/ files
def strip_sri(match):
def strip_sri(match: typing.Match[str]) -> str:
"""
Remove Subresource Integrity (`integrity`) and `crossorigin` attributes from an HTML <link> or <script> tag if the tag references a `/vendor/` path.
Remove `integrity` and `crossorigin` attributes from an HTML `<link>` or `<script>` tag that references a `/vendor/` path.

Parameters:
match (re.Match): A regex match object whose matched text is the full HTML tag.
match (typing.Match[str]): Regex match whose matched text is the full HTML tag to process.

Returns:
str: The original tag text with `integrity` and `crossorigin` attributes removed when the tag contains `/vendor/`; otherwise the original tag text unchanged.
str: The tag text with `integrity` and `crossorigin` attributes removed if the tag contains `/vendor/`, otherwise the original tag text.
"""
tag_text = match.group(0)
if '/vendor/' in tag_text:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,15 @@
<!-- Prism.js (CDN) -->
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/themes/prism.min.css"
href="/vendor/prismjs/themes/prism.css"
/>
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/plugins/line-numbers/prism-line-numbers.min.css"
href="/vendor/prismjs/plugins/line-numbers/prism-line-numbers.css"
/>
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/plugins/toolbar/prism-toolbar.min.css"
href="/vendor/prismjs/plugins/toolbar/prism-toolbar.css"
/>

<style>
Expand Down Expand Up @@ -802,13 +802,13 @@ <h2>5. 時間計算量の説明</h2>
</div>

<!-- Prism scripts -->
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/components/prism-core.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/plugins/autoloader/prism-autoloader.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/plugins/toolbar/prism-toolbar.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/plugins/line-numbers/prism-line-numbers.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/plugins/line-highlight/prism-line-highlight.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/components/prism-python.min.js"></script>
<script src="/vendor/prismjs/prism.js"></script>
<script src="/vendor/prismjs/plugins/autoloader/prism-autoloader.js"></script>
<script src="/vendor/prismjs/plugins/toolbar/prism-toolbar.js"></script>
<script src="/vendor/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.js"></script>
<script src="/vendor/prismjs/plugins/line-numbers/prism-line-numbers.js"></script>
<script src="/vendor/prismjs/plugins/line-highlight/prism-line-highlight.js"></script>
<script src="/vendor/prismjs/components/prism-python.js"></script>

<script>
// ==========================
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,15 +71,15 @@
<!-- Prism.js (CDN) -->
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/themes/prism.min.css"
href="/vendor/prismjs/themes/prism.css"
/>
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/plugins/line-numbers/prism-line-numbers.min.css"
href="/vendor/prismjs/plugins/line-numbers/prism-line-numbers.css"
/>
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/plugins/toolbar/prism-toolbar.min.css"
href="/vendor/prismjs/plugins/toolbar/prism-toolbar.css"
/>

<!-- Minor CSS tweaks for Prism gutters (to reduce blank space) -->
Expand Down Expand Up @@ -510,13 +510,13 @@ <h2 class="text-xl font-semibold">5. 時間計算量の説明</h2>
</div>

<!-- Prism scripts -->
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/components/prism-core.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/plugins/autoloader/prism-autoloader.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/plugins/toolbar/prism-toolbar.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/plugins/line-numbers/prism-line-numbers.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/plugins/line-highlight/prism-line-highlight.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/components/prism-python.min.js"></script>
<script src="/vendor/prismjs/prism.js"></script>
<script src="/vendor/prismjs/plugins/autoloader/prism-autoloader.js"></script>
<script src="/vendor/prismjs/plugins/toolbar/prism-toolbar.js"></script>
<script src="/vendor/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.js"></script>
<script src="/vendor/prismjs/plugins/line-numbers/prism-line-numbers.js"></script>
<script src="/vendor/prismjs/plugins/line-highlight/prism-line-highlight.js"></script>
<script src="/vendor/prismjs/components/prism-python.js"></script>

<!-- Interactions -->
<script>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
rel="stylesheet"
/>
<link
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/line-highlight/prism-line-highlight.min.css"
href="/vendor/prismjs/plugins/line-highlight/prism-line-highlight.css"
rel="stylesheet"
/>

Expand Down
2 changes: 1 addition & 1 deletion public/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -791,7 +791,7 @@ <h1 class="site-title">

<footer>
<span class="footer-icon">🧪</span>
Generated on 2026-02-26 04:55:44 UTC
Generated on 2026-02-26 06:30:58 UTC
</footer>

<script>
Expand Down