From db707f650afc22adca00800259c734f39ecad687 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Mon, 13 Jul 2026 23:10:03 +0200 Subject: [PATCH] feat: FAKTEN + Bewertungskarte als HTML/CSS statt Grafiken MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - .bsn-fakten: 3-Spalten-Grid, mobile-first (1 Spalte auf Handy) - .bsn-rating-card: dunkelblauer Header, MECHANISMEN/PRO/KONTRA-Spalten, Footer mit Wertung - CSS in bsn-review.css β€” ins Joomla-Template einzubinden - Discord-Modul entfernt, Gallery mit einfachen Klammern - Alle Stile: mobile-first, globale CSS-Klassen --- article_server.py | 112 +++++++++++++---------------- bsn-review.css | 176 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 224 insertions(+), 64 deletions(-) create mode 100644 bsn-review.css diff --git a/article_server.py b/article_server.py index 72b403f..e936df6 100644 --- a/article_server.py +++ b/article_server.py @@ -2126,64 +2126,42 @@ document.getElementById('publishBtn').addEventListener('click',function(){{submi autor_name = author_info["name"] autor_banner = author_info["banner"] - # Infobox-Tabelle - fakten_rows = [] - if autoren: fakten_rows.append(f'Autor:innen{autoren}') - if illustratoren: fakten_rows.append(f'Illustrator:innen{illustratoren}') - if verlag: fakten_rows.append(f'Verlag{verlag}') - if personen: fakten_rows.append(f'Personenzahl{personen}') - if spielzeit: fakten_rows.append(f'Spielzeit{spielzeit}') - if jahr: fakten_rows.append(f'Erscheinungsjahr{jahr}') - if preis: fakten_rows.append(f'Preis{preis}') - if app: fakten_rows.append(f'App{app}') - if alter: fakten_rows.append(f'Alter{alter}') + # FAKTEN ZUM SPIEL β€” 3-Spalten-Grid (CSS: .bsn-fakten) + fakten_items = [] + if autoren: fakten_items.append(('Autor:innen', autoren)) + if illustratoren: fakten_items.append(('Illustrator:innen', illustratoren)) + if verlag: fakten_items.append(('Verlag/Vertrieb', verlag)) + if personen: fakten_items.append(('Personenzahl', personen)) + if spielzeit: fakten_items.append(('Spielzeit', spielzeit)) + if jahr: fakten_items.append(('Erscheinungsjahr', jahr)) + if preis: fakten_items.append(('ungefΓ€hrer Preis', preis)) + if app: fakten_items.append(('App', app)) + if alter: fakten_items.append(('empfohlenes Alter', alter)) fakten_html = "" - if fakten_rows: - fakten_html = '' + "".join(fakten_rows) + '
' + if fakten_items: + items = "".join(f'
{v}{k}
' for k, v in fakten_items) + fakten_html = f'

FAKTEN ZUM SPIEL

{items}
' - # Pro/Kontra - pro_html = "" - if pros: - pro_html = '

πŸ‘ PRO

' - kontra_html = "" - if kontras: - kontra_html = '

πŸ‘Ž KONTRA

' - - # Mechanismen - mech_html = "" - if mech: - mech_html = '

Mechanismen: ' + ", ".join(mech) + '

' - - # Bewertung - wertung_html = "" + # BEWERTUNGSKARTE β€” dunkelblauer Header + 3 Spalten + Footer (CSS: .bsn-rating-card) + mech_items = "".join(f'{m}' for m in mech) if mech else "" + pro_items = "".join(f'{p}' for p in pros) if pros else "" + kontra_items = "".join(f'{k}' for k in kontras) if kontras else "" + rating_html = "" if wertung: - wertung_html = f'
{wertung}/ 100
' + rating_html = f"""
+
{spielname}KomplexitΓ€t: {komplex or 'β€”'}Sprachen: {sprache}
+

MECHANISMEN

{mech_items or 'β€”'}
+

PRO

{pro_items or 'β€”'}
+

KONTRA

{kontra_items or 'β€”'}
+ +
""" - disc_html = "" - if disclosure_text: - disc_html = f'

{disclosure_text}
Dies hat keinen Einfluss auf unsere Bewertung!

' - - aff_html = "" - if fantasywelt_url: - aff_html += f'

Bei Fantasywelt kaufen

\n' - if so_url: - aff_html += f'

Bei Spiele-Offensive kaufen

\n' - if amazon_url: - aff_html += f'

Bei Amazon kaufen

\n' - if allgames4you_url: - aff_html += f'

Bei AllGames4You kaufen

\n' - - gal_path = f"01/{erster}/{ordner}" - tags_str = ", ".join(tags) if tags else f"{spielname}, Brettspiel, Review, Bewertung, {autor_name}" - title_full = f"{spielname} {zusatz}".strip() - - # Artikeltext aus Word in SpielerklÀrung + Fazit splitten + # Artikeltext aus Word splitten erklarung_html = "" fazit_html = "" if word_text: - # Suche "Fazit"-Überschrift als Trenner import re as re2 - split_marker = re2.search(r'(?i)^Fazit\s*$|^{2,}Fazit\s*$', word_text, re2.MULTILINE) + split_marker = re2.search(r'(?i)^Fazit\s*$', word_text, re2.MULTILINE) if split_marker: erkl = word_text[:split_marker.start()].strip() faz = word_text[split_marker.end():].strip() @@ -2194,7 +2172,6 @@ document.getElementById('publishBtn').addEventListener('click',function(){{submi else: erkl = word_text faz = "" - # In HTML umwandeln falls Plaintext if erkl and "<" not in erkl[:100]: erkl = f"

{erkl.replace(chr(10)+chr(10), '

')}

" if faz and "<" not in faz[:100]: @@ -2202,30 +2179,37 @@ document.getElementById('publishBtn').addEventListener('click',function(){{submi erklarung_html = erkl fazit_html = faz - # Verlag/Autor Fallback + disc_html = "" + if disclosure_text: + disc_html = f'

{disclosure_text}
Dies hat keinen Einfluss auf unsere Bewertung!

' + + aff_html = "" + if fantasywelt_url: + aff_html += f'

Bei Fantasywelt kaufen

\n' + if so_url: + aff_html += f'

Bei Spiele-Offensive kaufen

\n' + if amazon_url: + aff_html += f'

Bei Amazon kaufen

\n' + if allgames4you_url: + aff_html += f'

Bei AllGames4You kaufen

\n' + + gal_path = f"01/{erster}/{ordner}" + tags_str = ", ".join(tags) if tags else f"{spielname}, Brettspiel, Review, Bewertung, {autor_name}" + title_full = f"{spielname} {zusatz}".strip() display_autor = autoren or verlag or meta.get("verlag", "").strip() or "unbekannt" - body = f"""

{spielname} β€” {komplex or 'Brettspiel'} von {display_autor}

+ body = f"""

{spielname} β€” {komplex or 'Brettspiel'} von {display_autor}


-

 

-

Fakten zum Spiel

{fakten_html} {disc_html} -{mech_html} {erklarung_html}

Meine Meinung

{fazit_html} -{pro_html} -{kontra_html} -{wertung_html} -

 

-

{{{{module Discord-Hinweis Tests}}}}

+{rating_html}

 

{aff_html} -

 

Bilder vom Spiel

-

{{{{gallery}}}}{gal_path}{{{{/gallery}}}}

-

{{{{module Aktuelle Texte fur Content}}}}

""" +

{{gallery}}{gal_path}{{/gallery}}

""" datei = datetime.now().strftime("%Y-%m-%d") safe = spielname.lower().replace(" ", "-").replace(":", "").replace("/", "-") diff --git a/bsn-review.css b/bsn-review.css new file mode 100644 index 0000000..128a3c2 --- /dev/null +++ b/bsn-review.css @@ -0,0 +1,176 @@ +/* ═══════════════════════════════════════════════════════════════════════ + BSN FAKTEN ZUM SPIEL β€” 3-Spalten-Grid, mobile-first + ═══════════════════════════════════════════════════════════════════════ */ + +.bsn-fakten { + margin: 24px 0; + border: 1px solid #e0e0e0; + border-radius: 8px; + overflow: hidden; +} +.bsn-fakten h3 { + background: #fff; + margin: 0; + padding: 12px 16px; + font-size: 0.95em; + font-weight: 700; + letter-spacing: 0.05em; + border-bottom: 1px solid #000; +} +.bsn-fakten-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 0; + background: #fff; +} +.bsn-fakten-item { + padding: 14px 12px; + border-right: 1px solid #f0f0f0; + border-bottom: 1px solid #f0f0f0; + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 4px; +} +.bsn-fakten-item:nth-child(3n) { border-right: none; } +.bsn-fakten-val { + font-weight: 600; + font-size: 0.9em; + color: #1a1a1a; +} +.bsn-fakten-lbl { + font-size: 0.75em; + color: #999; +} + +@media (max-width: 600px) { + .bsn-fakten-grid { + grid-template-columns: repeat(2, 1fr); + } + .bsn-fakten-item:nth-child(3n) { border-right: 1px solid #f0f0f0; } + .bsn-fakten-item:nth-child(2n) { border-right: none; } +} +@media (max-width: 380px) { + .bsn-fakten-grid { grid-template-columns: 1fr; } + .bsn-fakten-item { border-right: none; } +} + + +/* ═══════════════════════════════════════════════════════════════════════ + BSN BEWERTUNGSKARTE β€” dunkelblauer Header, 3 Spalten, Footer + ═══════════════════════════════════════════════════════════════════════ */ + +.bsn-rating-card { + margin: 32px 0; + border-radius: 10px; + overflow: hidden; + box-shadow: 0 2px 12px rgba(0,0,0,0.08); + font-family: system-ui, -apple-system, sans-serif; +} +.bsn-rc-header { + background: #20228a; + color: #fff; + padding: 16px 20px; + display: flex; + flex-wrap: wrap; + align-items: baseline; + gap: 16px; +} +.bsn-rc-title { + font-size: 1.3em; + font-weight: 700; + letter-spacing: 0.02em; +} +.bsn-rc-meta { + font-size: 0.8em; + opacity: 0.85; +} +.bsn-rc-body { + background: #fff; + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 0; +} +.bsn-rc-col { + padding: 16px 14px; + border-right: 1px solid #eee; +} +.bsn-rc-col:last-child { border-right: none; } +.bsn-rc-col h4 { + font-size: 0.75em; + font-weight: 700; + letter-spacing: 0.06em; + color: #20228a; + margin: 0 0 10px; +} +.bsn-rc-mech, +.bsn-rc-pro, +.bsn-rc-kontra { + display: block; + font-size: 0.88em; + padding: 4px 0; + border-bottom: 1px dotted #ddd; + color: #333; +} +.bsn-rc-empty { + display: block; + font-size: 0.85em; + color: #bbb; + padding: 4px 0; +} +.bsn-rc-footer { + background: #20228a; + color: #fff; + padding: 14px 20px; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + gap: 8px; +} +.bsn-rc-author { + font-size: 0.85em; + font-style: italic; + opacity: 0.9; +} +.bsn-rc-score { + font-size: 1.2em; + font-weight: 700; + letter-spacing: 0.03em; +} + +@media (max-width: 600px) { + .bsn-rc-body { grid-template-columns: 1fr; } + .bsn-rc-col { border-right: none; border-bottom: 1px solid #eee; } + .bsn-rc-col:last-child { border-bottom: none; } + .bsn-rc-header { flex-direction: column; gap: 4px; } + .bsn-rc-footer { flex-direction: column; text-align: center; } +} + + +/* ═══════════════════════════════════════════════════════════════════════ + BSN Allgemeine Artikel-Elemente + ═══════════════════════════════════════════════════════════════════════ */ + +.bsn-dachzeile { + color: #20228a; + font-weight: 600; + border-bottom: 2px solid #20228a; + padding-bottom: 8px; + margin-bottom: 16px; +} +.bsn-disclosure { + text-align: center; + font-size: 0.9em; + color: #666; + margin: 12px 0; +} +.bsn-affiliate { + text-align: center; + margin: 8px 0; +} +.bsn-affiliate img { + max-width: 100%; + height: auto; + border-radius: 6px; +}