Textdiagramme, Ausgabeblöcke und GDScript-Hervorhebung
Stilregel: Strukturdiagramme als diagramm-Block mit Kästen und Pfeilen, Ausgabe des Testlaufs unter jedem Beispiel; Prüfer prüft beides. Frontend: eigene GDScript-Grammatik, gdshader über GLSL, Diagrammblock ohne Umbruch. PDF: Diagramme als pre ohne Umbruch, gdshader über GLSL. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -119,6 +119,7 @@ p{margin:0 0 2.2mm;orphans:2;widows:2}
|
||||
code{font-family:"DejaVu Sans Mono",monospace;font-size:7.9pt;hyphens:none}
|
||||
.codehilite,pre{background:#f5f5f2!important;border:0.4pt solid #ccc;padding:2mm;margin:2mm 0 3mm;border-radius:1mm}
|
||||
pre{white-space:pre-wrap;word-wrap:break-word;font-size:7.3pt;line-height:1.3;margin:0;border:none;padding:0}
|
||||
pre.diagramm{white-space:pre;font-size:6.8pt;line-height:1.15;page-break-inside:avoid;width:max-content;max-width:100%;margin:2mm auto 3mm;padding:2mm;border:0.4pt solid #ccc;border-radius:1mm;background:#f5f5f2}
|
||||
table{border-collapse:collapse;font-size:8pt;margin:3mm 0;width:100%}
|
||||
td,th{border:0.4pt solid #888;padding:1.2mm;vertical-align:top;text-align:left}
|
||||
ul,ol{padding-left:5mm} li{margin-bottom:1.2mm}
|
||||
@@ -133,6 +134,15 @@ a{color:black}
|
||||
"""
|
||||
|
||||
|
||||
DIAGRAMM_RE = re.compile(r"^```diagramm[ \t]*\n(.*?)^```[ \t]*$", re.S | re.M)
|
||||
|
||||
|
||||
def _vorbereiten(text: str) -> str:
|
||||
"""Textdiagramme als unformatierte <pre> durchreichen; gdshader mit dem GLSL-Lexer hervorheben."""
|
||||
text = DIAGRAMM_RE.sub(lambda m: '<pre class="diagramm">' + html.escape(m.group(1).rstrip("\n")) + "</pre>", text)
|
||||
return re.sub(r"^```gdshader[ \t]*$", "```glsl", text, flags=re.M)
|
||||
|
||||
|
||||
def pdf(name: str) -> bool:
|
||||
exe = shutil.which("weasyprint")
|
||||
if not exe:
|
||||
@@ -160,7 +170,7 @@ def pdf(name: str) -> bool:
|
||||
aid = f"k{k['ord']}"
|
||||
t = f"Kapitel {k['ord']} – {k['titel']}"
|
||||
toc.append(f'<li class="tch"><a href="#{aid}">{html.escape(t)}</a></li>')
|
||||
h = md.convert(p.read_text()).replace("<h1>", f'<h1 id="{aid}" class="chap">', 1)
|
||||
h = md.convert(_vorbereiten(p.read_text())).replace("<h1>", f'<h1 id="{aid}" class="chap">', 1)
|
||||
h = h.replace("border: 1px solid #FF0000", "border: none")
|
||||
body.append(f'<section class="chapter">{h}</section>')
|
||||
md.reset()
|
||||
|
||||
@@ -25,13 +25,33 @@ for (const [n, l] of Object.entries({ python, php, javascript, typescript, json,
|
||||
hljs.registerAliases(['js'], { languageName: 'javascript' }); hljs.registerAliases(['ts'], { languageName: 'typescript' })
|
||||
hljs.registerAliases(['sh', 'shell', 'console', 'zsh'], { languageName: 'bash' }); hljs.registerAliases(['html', 'svg', 'tscn', 'tres'], { languageName: 'xml' })
|
||||
hljs.registerAliases(['yml'], { languageName: 'yaml' }); hljs.registerAliases(['toml', 'cfg', 'godot'], { languageName: 'ini' }); hljs.registerAliases(['cs'], { languageName: 'csharp' })
|
||||
hljs.registerAliases(['gdscript', 'gd'], { languageName: 'python' }) // nah genug für lesbare Farben
|
||||
// GDScript hat highlight.js nicht an Bord – kleine eigene Grammatik (Schlüsselwörter, @Annotationen, $Pfade, Strings, Kommentare).
|
||||
hljs.registerLanguage('gdscript', (h) => ({
|
||||
name: 'GDScript', aliases: ['gd'],
|
||||
keywords: {
|
||||
keyword: 'func var const static extends class_name class signal enum if elif else for while match when break continue pass return await yield in is as not and or super self void breakpoint assert preload',
|
||||
literal: 'true false null PI TAU INF NAN',
|
||||
built_in: 'int float bool String StringName NodePath Vector2 Vector2i Vector3 Vector3i Vector4 Color Rect2 Transform2D Transform3D Basis Quaternion Array Dictionary Callable Signal Variant PackedStringArray PackedInt32Array PackedFloat32Array PackedVector2Array PackedVector3Array PackedByteArray print printerr push_error push_warning randf randi randi_range randf_range lerp lerpf clamp clampf abs sign floor ceil round sqrt pow min max minf maxf deg_to_rad rad_to_deg range len str load get_node is_instance_valid',
|
||||
},
|
||||
contains: [
|
||||
h.HASH_COMMENT_MODE,
|
||||
{ className: 'string', variants: [{ begin: /"""/, end: /"""/ }, { begin: /"/, end: /"/, illegal: /\n/, contains: [h.BACKSLASH_ESCAPE] }, { begin: /'/, end: /'/, illegal: /\n/, contains: [h.BACKSLASH_ESCAPE] }, { begin: /\^"/, end: /"/ }, { begin: /&"/, end: /"/ }] },
|
||||
{ className: 'meta', begin: /@[A-Za-z_]\w*/ },
|
||||
{ className: 'symbol', begin: /\$[A-Za-z_][\w\/%]*|%[A-Za-z_]\w*/ },
|
||||
{ className: 'number', begin: /\b0x[0-9a-fA-F_]+|\b0b[01_]+|\b\d[\d_]*(\.\d[\d_]*)?([eE][+-]?\d+)?\b/ },
|
||||
{ className: 'title.function', begin: /(?<=\bfunc\s+)[A-Za-z_]\w*/ },
|
||||
{ className: 'title.class', begin: /(?<=\b(?:class_name|extends|class)\s+)[A-Za-z_]\w*/ },
|
||||
],
|
||||
}))
|
||||
hljs.registerAliases(['gdshader'], { languageName: 'glsl' })
|
||||
|
||||
const md = new MarkdownIt({
|
||||
html: true,
|
||||
linkify: false,
|
||||
typographer: false,
|
||||
highlight(code, lang) {
|
||||
// Textdiagramme (Kästen und Pfeile) bleiben unformatiert und werden nie umgebrochen.
|
||||
if (lang === 'diagramm') return `<pre class="diagramm"><code>${md.utils.escapeHtml(code)}</code></pre>`
|
||||
const l = lang && hljs.getLanguage(lang) ? lang : null
|
||||
const out = l ? hljs.highlight(code, { language: l }).value : md.utils.escapeHtml(code)
|
||||
return `<pre class="hljs"><code>${out}</code></pre>`
|
||||
|
||||
@@ -159,6 +159,7 @@ a.knopf { display: inline-block; text-decoration: none; line-height: normal; }
|
||||
.buch p, .buch li { overflow-wrap: anywhere; }
|
||||
.buch pre { background: var(--code-bg); color: var(--code-fg); padding: 12px 14px; border-radius: 8px; font-size: 0.86em; line-height: 1.5; white-space: pre-wrap; overflow-wrap: anywhere; hyphens: manual; }
|
||||
.buch pre code { background: none; padding: 0; }
|
||||
.buch pre.diagramm, .lm-screen pre.diagramm { white-space: pre; overflow-x: auto; font-size: 0.8em; line-height: 1.2; }
|
||||
.buch table { border-collapse: collapse; margin: 0 0 1em; font-size: 0.92em; display: block; max-width: 100%; overflow-x: auto; hyphens: manual; }
|
||||
.buch th, .buch td { border: 1px solid var(--lese-rand); padding: 4px 9px; text-align: left; }
|
||||
.buch .hinweis { background: var(--karte); border-radius: 6px; padding: 8px 12px; font-size: 0.85rem; color: var(--dim); font-family: system-ui, sans-serif; margin: 0 0 14px; }
|
||||
|
||||
@@ -8,7 +8,7 @@ Der Autor hat diese Punkte als nicht belegt oder unsicher gemeldet – prüfe si
|
||||
{{autor_bericht}}
|
||||
|
||||
Loop, bis nichts mehr zu korrigieren ist:
|
||||
1. Lies das Kapitel komplett. Extrahiere alle überprüfbaren Behauptungen: Bezeichner und Signaturen, Versionsangaben, Studien (Autoren, Jahr, Design, Stichprobe, Ergebnis, Effektgröße), Zahlen, Zitate, Verhaltensbeschreibungen („was passiert wann“), Zuschreibungen („X hat Y eingeführt“).
|
||||
1. Lies das Kapitel komplett. Extrahiere alle überprüfbaren Behauptungen: Bezeichner und Signaturen, Versionsangaben, Studien (Autoren, Jahr, Design, Stichprobe, Ergebnis, Effektgröße), Zahlen, Zitate, Verhaltensbeschreibungen („was passiert wann“), Zuschreibungen („X hat Y eingeführt“), Textdiagramme (jedes Element und jeder Pfeil gegen Quellcode/Doku) und Ausgabeblöcke (gegen den eigenen Testlauf).
|
||||
2. Verifiziere möglichst ALLE gegen die lokalen Quellen (QUELLEN.md). Priorisiere nach Fehlerwahrscheinlichkeit. Führe Codebeispiele aus bzw. teste beschriebenes Verhalten mit kleinen Skripten, wo STIL.md das vorsieht. Versionsangaben gegen Tags/Changelogs prüfen. Achte besonders auf: falsche Zuschreibungen, verdrehte Effektrichtungen, überzogene Kausalaussagen aus Korrelationsstudien, erfundene Stichprobengrößen, veraltete oder erfundene Bezeichner, Doku-Aussagen, die dem Quellcode widersprechen (dann gilt der Quellcode).
|
||||
3. Korrigiere Fehler direkt in der Datei mit Edit (minimal-invasiv, Stil beibehalten). Unbelegbares vorsichtiger formulieren oder streichen.
|
||||
4. Prüfe Form: Überschriften exakt wie GLIEDERUNG.md; keine Übungen/Merkkästen/Zusammenfassungen/Literaturlisten; Querverweise zeigen auf Kapitel, die das Thema laut Gliederung (und, falls die Datei schon existiert, laut Text) wirklich behandeln; keine größeren Doppelungen mit Themen, die in andere Kapitel gehören (dann kürzen und verweisen); Rechtschreibung, Umlaute, Markdown. Satzbau: Sätze über 30 Wörter in mehrere auflösen, Inhalt unverändert; Zielschnitt unter 20 Wörter je Satz. Umfang: Abschnitte über 120 % ihres Richtwerts aus der Gliederung (`(kurz)` ≈ 800, ohne Angabe ≈ 1.300, `(lang)` ≈ 2.000 Wörter) straffen – zuerst Wiederholungen und Quellenformeln ohne Informationswert, keine Fakten oder Beispiele streichen.
|
||||
|
||||
@@ -10,6 +10,8 @@ Ein deutschsprachiges Sachbuch, das **Verständnis** vermittelt: Wie ist die Sac
|
||||
- Konkrete Belege im Text: Studien mit Autor und Jahr („(Curran & Hill, 2019)“), Klassen und Befehle in `Code`-Formatierung, Versionsangaben („seit 4.3“) nur, wenn geprüft.
|
||||
- Querverweise „(→ Kapitel 8)“ bzw. „(→ Abschnitt 8.2)“ statt Wiederholung. Die Gliederung zeigt, was wo steht; Themen anderer Kapitel nur kurz streifen und verweisen.
|
||||
- Codebeispiele (falls das Thema Software ist): kurz (typisch 5–30 Zeilen), nur wo sie ein Konzept erklären, mit Sprachangabe im Codeblock, im Text erklärt.
|
||||
- Hat ein Codebeispiel eine Ausgabe, steht die tatsächliche Ausgabe des eigenen Testlaufs als ```text-Block direkt darunter, gekürzt auf das Wesentliche (höchstens etwa 10 Zeilen).
|
||||
- Strukturdiagramme: Baum-, Ablauf- und Zustandsstrukturen, die aus Quellcode oder Doku belegt sind, als Textdiagramm mit Kästen und Pfeilen in einem ```diagramm-Block (Zeichen ┌─┐│└┘├┤┬┴ und ▶ ▼, höchstens 60 Zeichen breit, höchstens eines je Abschnitt). Jedes Element im Diagramm kommt auch im Text vor. Keine Illustrationen, keine Szenen, nichts Erfundenes.
|
||||
|
||||
## Aufbau jeder Kapiteldatei (Markdown)
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user