Ein Python-Makro in bDS ist ein kleines Skript, das beim Rendern eines Beitrags automatisch eigenen HTML-Inhalt erzeugt. In diesem Beitrag bauen wir gemeinsam ein Makro, das eine farbige Tag-Wolke erzeugt — Schritt für Schritt, vom ersten „Hallo Welt" bis zur fertigen Visualisierung.
Was wir bauen
Eine Tag-Wolke, die alle Tags des Blogs anzeigt. Jeder Tag wird mit der Anzahl seiner Beiträge beschriftet. Die Farbe richtet sich nach der Häufigkeit: selten verwendete Tags erscheinen in Blau, häufig verwendete in Rot — dazwischen liegen Grün und Gelb.
Schritt 1: Ein neues Skript anlegen
In der Seitenleiste von bDS findest du den Bereich Skripte. Klicke dort auf Neues Skript.
Im Editor siehst du nun mehrere Felder:
- Titel — Gib deinem Skript einen Namen, z.B.
Tag-Wolke - Slug — Wird automatisch erzeugt, z.B.
tag_wolke. Unter diesem Namen rufst du das Makro später im Beitrag auf - Typ — Wähle hier macro aus
- Einstiegspunkt — Wähle main (wird automatisch erkannt, sobald du eine Funktion
mainim Code hast) - Aktiviert — Setze den Haken, damit das Makro beim Rendern auch ausgeführt wird
Schritt 2: Ein minimales Makro
Trage im Bereich Skriptinhalt folgenden Code ein:
async def main(context, post_data):
return {
'html': '<p>Hallo aus dem Makro!</p>'
}
Klicke auf Skript speichern. Du kannst mit Syntax prüfen testen, ob der Code fehlerfrei ist.
Um das Makro in einem Beitrag zu verwenden, schreibe einfach an die gewünschte Stelle:
Beim Rendern wird dieser Platzhalter durch den HTML-Text ersetzt — in diesem Fall einfach „Hallo aus dem Makro!".
Schritt 3: Tags und Beitragszahlen ermitteln
Jetzt erweitern wir das Skript. Über die eingebaute Schnittstelle bds_api kann das Makro auf alle Daten des Blogs zugreifen. Wir laden alle Tags und alle Beiträge und zählen, wie oft jeder Tag verwendet wird:
from bds_api import bds
async def main(context, post_data):
# Alle Tags laden
tags = await bds.tags.get_all()
# Alle Beiträge laden
result = await bds.posts.get_all()
posts = result['items']
# Zählen, wie oft jeder Tag vorkommt
zaehler = {}
for post in posts:
for tag in post.get('tags', []):
zaehler[tag] = zaehler.get(tag, 0) + 1
# Zur Kontrolle als Text ausgeben
zeilen = []
for tag in tags:
name = tag['name']
anzahl = zaehler.get(name, 0)
zeilen.append(f'{name}: {anzahl} Beitrag/Beiträge')
return {
'html': '<br>'.join(zeilen)
}
Nach dem Speichern zeigt das Makro beim Rendern eine einfache Liste: jeden Tag mit der Anzahl seiner Beiträge.
Schritt 4: Die Tag-Wolke als farbige Darstellung
Im letzten Schritt bauen wir die Ausgabe zu einer richtigen Tag-Wolke um. Die Tags werden unterschiedlich groß und farbig dargestellt — je nach Häufigkeit. Die Farbskala reicht von Blau (wenige Beiträge) über Grün und Gelb bis Rot (viele Beiträge).
from bds_api import bds
async def main(context, post_data):
tags = await bds.tags.get_all()
result = await bds.posts.get_all()
posts = result['items']
zaehler = {}
for post in posts:
for tag in post.get('tags', []):
zaehler[tag] = zaehler.get(tag, 0) + 1
# Bereich der Häufigkeiten ermitteln
werte = [zaehler.get(t['name'], 0) for t in tags]
if not werte or max(werte) == 0:
return {'html': '<p>Keine Tags mit Beiträgen gefunden.</p>'}
min_val = min(werte)
max_val = max(werte)
spanne = max_val - min_val if max_val != min_val else 1
# Farbe auf der Skala Blau → Grün → Gelb → Rot berechnen
def farbe_fuer(anteil):
if anteil < 0.33:
# Blau → Grün
t = anteil / 0.33
r = 0
g = int(128 + 127 * t)
b = int(200 * (1 - t))
elif anteil < 0.66:
# Grün → Gelb
t = (anteil - 0.33) / 0.33
r = int(255 * t)
g = 220
b = 0
else:
# Gelb → Rot
t = (anteil - 0.66) / 0.34
r = 220
g = int(200 * (1 - t))
b = 0
return f'rgb({r},{g},{b})'
# HTML zusammenbauen
elemente = []
for tag in tags:
name = tag['name']
anzahl = zaehler.get(name, 0)
anteil = (anzahl - min_val) / spanne
groesse = 0.8 + anteil * 1.6 # 0.8em bis 2.4em
farbe = farbe_fuer(anteil)
elemente.append(
f'<span style="font-size:{groesse:.1f}em;color:{farbe};'
f'padding:4px 8px;display:inline-block;cursor:default" '
f'title="{anzahl} Beitrag(e)">'
f'{name} <sup style="font-size:0.6em">({anzahl})</sup></span>'
)
html = (
'<div style="line-height:2.2;text-align:center;'
'padding:16px;border:1px solid #e0e0e0;border-radius:8px">'
+ ' '.join(elemente)
+ '</div>'
)
return {'html': html}
So funktioniert die Farbgebung
Die Farbe wird anhand des Anteils berechnet — also wie die Häufigkeit eines Tags im Vergleich zu allen anderen liegt:
| Anteil | Farbe |
|---|---|
| 0 % – 33 % | Blau → Grün |
| 33 % – 66 % | Grün → Gelb |
| 66 % – 100 % | Gelb → Rot |
Tags mit wenigen Beiträgen sind also eher kühl (blau), vielgenutzte Tags eher warm (rot). Zusätzlich wird die Schriftgröße angepasst: seltene Tags erscheinen kleiner, häufige größer.
Zusammenfassung
| Schritt | Was passiert |
|---|---|
| Neues Skript anlegen | Über Skripte → Neues Skript in der Seitenleiste |
| Typ wählen | Im Feld Typ auf macro stellen |
| Code schreiben | Im Bereich Skriptinhalt |
| Aktivieren | Haken bei Aktiviert setzen |
| Im Beitrag verwenden | [ [tag_wolke]] an die gewünschte Stelle schreiben (ohne Leerzeichen zwischen den öffnenden Klammern) |
Das Makro wird bei jeder Vorschau und bei jeder Veröffentlichung neu ausgeführt — die Tag-Wolke ist also immer aktuell.