From 3dbc0ff5c5fdcfa6a0a57eafb049035c139f1370 Mon Sep 17 00:00:00 2001 From: Kai Moritz Date: Sat, 4 Jul 2026 18:12:45 +0000 Subject: [PATCH] =?utf8?q?feat:=20Syntax-Highlighting=20f=C3=BCr=20Maven-P?= =?utf8?q?rojektseiten=20via=20Shiki?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit ProjectPage.astro verarbeitet nun
-Blöcke zur Build-Zeit durch Shiki
(one-dark-pro), statt sie als rohe HTML-Fragmente zu injizieren:

- Blöcke mit class="language-*" (Markdown-Doxia-Output): direkt an Shiki
- Blöcke ohne Sprachhinweis (APT-Output): highlight.js erkennt die Sprache
  automatisch (highlightAuto, Schwellenwert 8); bei zu geringer Konfidenz
  Fallback auf text

CSS-Selektoren in typo.scss und print.scss auf pre.astro-code, pre.shiki
erweitert, damit Padding, Border-Radius und Zeilennummern auch für direkte
codeToHtml()-Aufrufe greifen (die astro-code-Klasse setzt nur Astros Markdown-
Integration, nicht codeToHtml()).

Co-Authored-By: Claude Sonnet 4.6 
---
 CLAUDE.md                        | 20 ++++-----
 package-lock.json                | 12 +++++-
 package.json                     |  3 +-
 public/css/print.css             |  3 +-
 public/css/print.css.map         |  2 +-
 public/css/screen.css            |  9 ++--
 public/css/screen.css.map        |  2 +-
 src/components/ProjectPage.astro | 71 +++++++++++++++++++++++++++++++-
 src/styles/base/typo.scss        |  3 +-
 src/styles/print.scss            |  3 +-
 10 files changed, 106 insertions(+), 22 deletions(-)

diff --git a/CLAUDE.md b/CLAUDE.md
index 47260e98..88e62686 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -256,20 +256,18 @@ SCSS-Änderungen erfordern `npm run build:css` oder einen Dev-Server-Neustart; H
 
 ### Syntax-Hervorhebung (Code-Listings)
 
-Astro verwendet standardmäßig **Shiki** für die Syntax-Hervorhebung in Markdown-Dateien (Blog-Posts). Das Theme ist explizit in `astro.config.mjs` konfiguriert (`github-dark`). Shiki rendert die Hervorhebung als **Inline-Styles** direkt ins HTML — es wird keine separate CSS-Datei und kein clientseitiges JavaScript benötigt.
+**Shiki** rendert Syntax-Hervorhebung als **Inline-Styles** direkt ins HTML — keine separate CSS-Datei, kein clientseitiges JavaScript. Das Theme (`one-dark-pro`) ist in `astro.config.mjs` konfiguriert.
 
-Das erzeugte HTML-Muster sieht so aus:
-```html
-
-  …
-
-``` +**Blog-Posts (Markdown):** Astro verarbeitet Fenced Code Blocks automatisch durch Shiki. Erzeugt `
`.
 
-**Container-Styling** (`pre.astro-code`) wird in `src/styles/base/typo.scss` (Screen) und `src/styles/print.scss` (Druck) definiert:
-- Screen: Padding und Border-Radius (klassisches Layout-Scope)
-- Druck: Überschreibt Shikis Inline-Hintergrundfarbe auf transparent (via `!important`), damit kein dunkler Hintergrund gedruckt wird
+**Projektseiten (Maven-generiert):** `ProjectPage.astro` verarbeitet den HTML-Body zur Build-Zeit manuell durch Shiki:
+- Blöcke mit Sprachhinweis (`
`, aus Markdown-Quellen): direkt an Shiki übergeben.
+- Blöcke ohne Sprachhinweis (`
`, aus APT-Quellen): `highlight.js` (`highlightAuto`, Schwellenwert ≥ 8) erkennt die Sprache; bei zu geringer Konfidenz fällt der Block auf `text` zurück.
+- Erzeugt `
`.
 
-**Geltungsbereich:** Nur Blog-Posts (Markdown). Die Maven-generierten Projektseiten (`src/content/projects/`) haben einfache `
`-Blöcke ohne Syntax-Hervorhebung — das ist Maven-seitig gesteuert und außerhalb des Astro-Workflows.
+**Container-Styling** (`pre.astro-code, pre.shiki`) wird in `src/styles/base/typo.scss` (Screen) und `src/styles/print.scss` (Druck) definiert:
+- Screen: Padding, Border-Radius, CSS-Counter-basierte Zeilennummern (via `.line::before`)
+- Druck: Überschreibt Shikis Inline-Hintergrundfarbe auf transparent (via `!important`)
 
 **Nicht verwenden:** Das früher verwendete `prettify.js` (Google Code Prettify) wurde entfernt — es wurde nie tatsächlich geladen und ist kein Bestandteil mehr dieses Setups.
 
diff --git a/package-lock.json b/package-lock.json
index 001519a1..1aeb0565 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,8 @@
       "version": "0.0.1",
       "dependencies": {
         "@astrojs/rss": "^4.0.18",
-        "astro": "^6.4.4"
+        "astro": "^6.4.4",
+        "highlight.js": "^11.11.1"
       },
       "devDependencies": {
         "@types/js-yaml": "^4.0.9",
@@ -2977,6 +2978,15 @@
         "url": "https://opencollective.com/unified"
       }
     },
+    "node_modules/highlight.js": {
+      "version": "11.11.1",
+      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz",
+      "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=12.0.0"
+      }
+    },
     "node_modules/html-escaper": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz",
diff --git a/package.json b/package.json
index 47e7e9a9..c892ee2b 100644
--- a/package.json
+++ b/package.json
@@ -16,7 +16,8 @@
   },
   "dependencies": {
     "@astrojs/rss": "^4.0.18",
-    "astro": "^6.4.4"
+    "astro": "^6.4.4",
+    "highlight.js": "^11.11.1"
   },
   "devDependencies": {
     "@types/js-yaml": "^4.0.9",
diff --git a/public/css/print.css b/public/css/print.css
index 43b740ce..d70984c0 100644
--- a/public/css/print.css
+++ b/public/css/print.css
@@ -99,7 +99,8 @@ body {
   top: 0.4em;
 }
 
-pre.astro-code {
+pre.astro-code,
+pre.shiki {
   background-color: transparent !important;
   color: #000 !important;
   border: 1px solid #000;
diff --git a/public/css/print.css.map b/public/css/print.css.map
index f3ae7443..4999e7ff 100644
--- a/public/css/print.css.map
+++ b/public/css/print.css.map
@@ -1 +1 @@
-{"version":3,"sourceRoot":"","sources":["../../src/styles/variables.scss","../../src/styles/print.scss","../../src/styles/print/typo.scss","../../src/styles/print/layout.scss","../../src/styles/print/head.scss"],"names":[],"mappings":";AAAA;AAmBA;AAWA;AC5BA;ED+BE;EC5BA,ODKY;ECJZ;;;AAEF;EAEE;;;AAEF;AAAA;EAGE,ODLY;ECMZ;;;AAEF;EAEE;;;AAEF;EAEE;;;ACxBF;EAEE,OFQY;EEPZ;;;ACHF;EAEE;;;AAEF;EAEE;;;AAEF;EAEE;;;AAEF;EAEE;;;AAEF;EHiBE;EGdA,OHTY;EGUZ;;;AAEF;EAEE;;;AAEF;AAAA;EAGE,OHnBY;EGoBZ;;;AAEF;EAEE;;;AAEF;EAEE;;;AAEF;EAEE;;;AAEF;EAEE;;;AAEF;EHfE;EGkBA;EACA;;;ACpDF;EAEE;;;AAEF;EAEE;;;AAEF;EAEE;EACA;EACA;;;AHkBF;EAEE;EACA;EACA;EACA","file":"print.css"}
\ No newline at end of file
+{"version":3,"sourceRoot":"","sources":["../../src/styles/variables.scss","../../src/styles/print.scss","../../src/styles/print/typo.scss","../../src/styles/print/layout.scss","../../src/styles/print/head.scss"],"names":[],"mappings":";AAAA;AAmBA;AAWA;AC5BA;ED+BE;EC5BA,ODKY;ECJZ;;;AAEF;EAEE;;;AAEF;AAAA;EAGE,ODLY;ECMZ;;;AAEF;EAEE;;;AAEF;EAEE;;;ACxBF;EAEE,OFQY;EEPZ;;;ACHF;EAEE;;;AAEF;EAEE;;;AAEF;EAEE;;;AAEF;EAEE;;;AAEF;EHiBE;EGdA,OHTY;EGUZ;;;AAEF;EAEE;;;AAEF;AAAA;EAGE,OHnBY;EGoBZ;;;AAEF;EAEE;;;AAEF;EAEE;;;AAEF;EAEE;;;AAEF;EAEE;;;AAEF;EHfE;EGkBA;EACA;;;ACpDF;EAEE;;;AAEF;EAEE;;;AAEF;EAEE;EACA;EACA;;;AHkBF;AAAA;EAGE;EACA;EACA;EACA","file":"print.css"}
\ No newline at end of file
diff --git a/public/css/screen.css b/public/css/screen.css
index 64bfe17c..8ceead13 100644
--- a/public/css/screen.css
+++ b/public/css/screen.css
@@ -255,14 +255,17 @@
   padding: 0.1em 0.3em;
   border-radius: 0.2em;
 }
-:root[data-layout=classic] pre.astro-code {
+:root[data-layout=classic] pre.astro-code,
+:root[data-layout=classic] pre.shiki {
   padding: 0.5em 1em;
   border-radius: 0.25em;
 }
-:root[data-layout=classic] pre.astro-code code {
+:root[data-layout=classic] pre.astro-code code,
+:root[data-layout=classic] pre.shiki code {
   counter-reset: line;
 }
-:root[data-layout=classic] pre.astro-code code .line::before {
+:root[data-layout=classic] pre.astro-code code .line::before,
+:root[data-layout=classic] pre.shiki code .line::before {
   counter-increment: line;
   content: counter(line);
   display: inline-block;
diff --git a/public/css/screen.css.map b/public/css/screen.css.map
index 4c71a64d..b0e3650b 100644
--- a/public/css/screen.css.map
+++ b/public/css/screen.css.map
@@ -1 +1 @@
-{"version":3,"sourceRoot":"","sources":["../../src/styles/variables.scss","../../src/styles/base/fonts.scss","../../src/styles/screen.scss","../../src/styles/base/browserreset.scss","../../src/styles/base/util.scss","../../src/styles/base/typo.scss","../../src/styles/base/head.scss","../../src/styles/base/navigation.scss","../../src/styles/base/content.scss","../../src/styles/base/marginal.scss","../../src/styles/base/footer.scss","../../src/styles/base/formulare.scss","../../src/styles/base/taxonomy.scss","../../src/styles/base/404.scss","../../src/styles/screen/head.scss","../../src/styles/screen/menu.scss","../../src/styles/screen/footer-sticky.scss","../../src/styles/screen/wip.scss","../../src/styles/screen/packs.scss","../../src/styles/screen/layout.scss","../../src/styles/screen/footer.scss","../../src/styles/tablet/layout.scss","../../src/styles/tablet/typo.scss","../../src/styles/tablet/menu.scss","../../src/styles/tablet/marginal.scss","../../src/styles/tablet/footer.scss","../../src/styles/screen/faux-column.scss","../../src/styles/screen/marginal.scss","../../src/styles/screen/content.scss","../../src/styles/screen/onecolumn.scss","../../src/styles/tablet/head.scss","../../src/styles/tablet/404.scss","../../src/styles/phone/typo.scss","../../src/styles/phone/layout.scss","../../src/styles/phone/head.scss","../../src/styles/phone/menu.scss","../../src/styles/phone/footer.scss","../../src/styles/phone/packs.scss","../../src/styles/phone/404.scss","../../src/styles/tiny/layout.scss","../../src/styles/tiny/404.scss"],"names":[],"mappings":"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","file":"screen.css"}
\ No newline at end of file
+{"version":3,"sourceRoot":"","sources":["../../src/styles/variables.scss","../../src/styles/base/fonts.scss","../../src/styles/screen.scss","../../src/styles/base/browserreset.scss","../../src/styles/base/util.scss","../../src/styles/base/typo.scss","../../src/styles/base/head.scss","../../src/styles/base/navigation.scss","../../src/styles/base/content.scss","../../src/styles/base/marginal.scss","../../src/styles/base/footer.scss","../../src/styles/base/formulare.scss","../../src/styles/base/taxonomy.scss","../../src/styles/base/404.scss","../../src/styles/screen/head.scss","../../src/styles/screen/menu.scss","../../src/styles/screen/footer-sticky.scss","../../src/styles/screen/wip.scss","../../src/styles/screen/packs.scss","../../src/styles/screen/layout.scss","../../src/styles/screen/footer.scss","../../src/styles/tablet/layout.scss","../../src/styles/tablet/typo.scss","../../src/styles/tablet/menu.scss","../../src/styles/tablet/marginal.scss","../../src/styles/tablet/footer.scss","../../src/styles/screen/faux-column.scss","../../src/styles/screen/marginal.scss","../../src/styles/screen/content.scss","../../src/styles/screen/onecolumn.scss","../../src/styles/tablet/head.scss","../../src/styles/tablet/404.scss","../../src/styles/phone/typo.scss","../../src/styles/phone/layout.scss","../../src/styles/phone/head.scss","../../src/styles/phone/menu.scss","../../src/styles/phone/footer.scss","../../src/styles/phone/packs.scss","../../src/styles/phone/404.scss","../../src/styles/tiny/layout.scss","../../src/styles/tiny/404.scss"],"names":[],"mappings":"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","file":"screen.css"}
\ No newline at end of file
diff --git a/src/components/ProjectPage.astro b/src/components/ProjectPage.astro
index 031c48cd..1f698b00 100644
--- a/src/components/ProjectPage.astro
+++ b/src/components/ProjectPage.astro
@@ -1,5 +1,7 @@
 ---
 import { getEntry } from 'astro:content';
+import { codeToHtml } from 'shiki';
+import hljs from 'highlight.js';
 import BaseLayout from '../layouts/BaseLayout.astro';
 import Breadcrumb from '../components/Breadcrumb.astro';
 import BlogNav from '../components/BlogNav.astro';
@@ -9,6 +11,71 @@ interface Props {
   entryId: string;
 }
 
+const THEME = 'one-dark-pro';
+const MIN_RELEVANCE = 8;
+
+function decodeEntities(s: string): string {
+  return s
+    .replace(/&/g, '&')
+    .replace(/</g, '<')
+    .replace(/>/g, '>')
+    .replace(/"/g, '"')
+    .replace(/'/g, "'")
+    .replace(/'/g, "'");
+}
+
+async function replaceAsync(
+  str: string,
+  regex: RegExp,
+  fn: (match: string, ...groups: string[]) => Promise
+): Promise {
+  const promises: Promise[] = [];
+  str.replace(regex, (match, ...groups) => { promises.push(fn(match, ...groups)); return ''; });
+  const results = await Promise.all(promises);
+  let i = 0;
+  return str.replace(regex, () => results[i++]);
+}
+
+async function toShiki(code: string, lang: string): Promise {
+  try {
+    return await codeToHtml(code, { lang, theme: THEME });
+  } catch {
+    return codeToHtml(code, { lang: 'text', theme: THEME });
+  }
+}
+
+async function highlightBody(html: string): Promise {
+  // Pass 1: labeled Markdown blocks — 
...
+ html = await replaceAsync( + html, + /
([\s\S]*?)<\/code><\/pre>/g,
+    async (match, lang, rawCode) => {
+      const code = decodeEntities(rawCode);
+      try {
+        return await toShiki(code, lang);
+      } catch {
+        return match;
+      }
+    }
+  );
+
+  // Pass 2: unlabeled APT blocks — 
...
(no attributes) + html = await replaceAsync( + html, + /
([\s\S]*?)<\/pre>/g,
+    async (_, rawCode) => {
+      const code = decodeEntities(rawCode);
+      const detected = hljs.highlightAuto(code);
+      const lang = (detected.language && detected.relevance >= MIN_RELEVANCE)
+        ? detected.language
+        : 'text';
+      return toShiki(code, lang);
+    }
+  );
+
+  return html;
+}
+
 const { entryId } = Astro.props;
 const entry = await getEntry('projects', entryId);
 if (!entry) throw new Error(`Project entry not found: ${entryId}`);
@@ -35,6 +102,8 @@ const crumbs = navPath && navPath.length > 0
       { title: 'Projects', url: '/projects/' },
       { title },
     ];
+
+const body = await highlightBody(entry.body);
 ---
 
 
@@ -43,7 +112,7 @@ const crumbs = navPath && navPath.length > 0
   
 
   
-    
+
diff --git a/src/styles/base/typo.scss b/src/styles/base/typo.scss index 5d9a8f49..602cd6d7 100644 --- a/src/styles/base/typo.scss +++ b/src/styles/base/typo.scss @@ -110,7 +110,8 @@ pre code padding: .1em .3em; border-radius: .2em; } -pre.astro-code +pre.astro-code, +pre.shiki { padding: .5em 1em; border-radius: .25em; diff --git a/src/styles/print.scss b/src/styles/print.scss index 65ea7ff2..04d7d514 100644 --- a/src/styles/print.scss +++ b/src/styles/print.scss @@ -28,7 +28,8 @@ @import 'print/layout.scss'; @import 'print/head.scss'; -pre.astro-code +pre.astro-code, +pre.shiki { background-color: transparent !important; color: $schrift !important; -- 2.39.5