Anleitung

Dokument mit lint prüfen

Finden Sie mit brevier lint überlaufenden Text, zu schmale Spalten, fehlende Zeichen, einsame Überschriften und Markup in Textfeldern, auch in der CI.

Auf dieser Seite

Community

brevier lint setzt eine Vorlage und prüft die Seiten, nicht den Quelltext. Es listet jedes Problem mit seiner Seite und der Zeile des erzeugten HTML, die es verursacht hat. Es schreibt kein PDF.

brevier lint rechnung.html --data rechnung.json --debug-dir out/
rechnung.html
  page 1    table     column "Stk" squeezed below its minimum width (10.0 < 15.0 mm)  → out/rechnung.debug.html:9
  → 1 problem. exit code 1
debug file: out/rechnung.debug.html (holds the document's data)

Exit-Code 0 heißt: keine Probleme. Exit-Code 1 heißt: mindestens ein Problem. Rufen Sie es in Ihrem Build auf, damit ein fehlerhaftes Dokument nicht zum Kunden gelangt. Alle Optionen stehen in der CLI-Referenz.

Was lint meldet

Art Bedeutung
overflow Text, der breiter ist als seine Tabellenspalte oder sein Kasten. Die Meldung nennt die Spaltenüberschrift, die ersten 20 Zeichen und beide Breiten in mm.
table Eine Tabellenspalte, die schmaler ist als ihre festgelegte Mindestbreite. Siehe unten.
glyph Ein Zeichen, das die Schrift nicht zeichnet, oder das eine Ersatzschrift statt der gewünschten Schrift zeichnet.
orphan Eine Überschrift allein am Seitenende. Eine Überschrift am Ende der letzten Seite wird nicht gemeldet.
split Eine Tabellenzeile, die über zwei Seiten getrennt ist. Die Meldung nennt die Zeilennummer und die Seiten.
hyphens Mehr als 3 Zeilen mit Silbentrennung hintereinander, oder eine vor einem Seitenumbruch.
data Ein Wert in Ihren Daten, der nicht zu seinem Feldtyp passt: Markup oder ein Zeilenumbruch in einem text-Feld. Siehe Die Daten prüfen.

Die Daten prüfen

Ein Problem kann in den Daten liegen und nicht im Layout. Ein text-Feld entfernt Zeilenumbrüche und druckt Markup als einfachen Text: Der Wert Zeile 1<br/>Zeile 2 druckt die Zeichen <br/> auf die Seite. lint findet das, bevor das PDF entsteht.

Die Prüfung läuft, wenn Sie --data angeben und ein Schema gefunden wird. Das Schema ist <name>.schema.json neben der Vorlage, oder das, das Sie mit --schema nennen. Ein Feld hat den Typ text, wenn sein Schema "x-brevier-type": "text" oder kein x-brevier-type hat. Ein Feld, das das Schema nicht aufführt, zählt als text.

rechnung.schema.json
{
  "type": "object",
  "properties": {
    "rechnung": {
      "type": "object",
      "properties": {
        "nummer": { "type": "string" },
        "bemerkung": { "type": "string", "x-brevier-type": "text" },
        "lieferhinweis": { "type": "string", "x-brevier-type": "multiline" }
      }
    }
  }
}

Nehmen Sie eine rechnung.json mit 5 Datensätzen. Drei Datensätze haben <br/> in bemerkung, und einer hat darin einen Zeilenumbruch. Alle 5 Datensätze haben einen Zeilenumbruch in lieferhinweis.

brevier lint rechnung.html --data rechnung.json
rechnung.html
  document  data      rechnung.bemerkung contains markup (3 of 5 records): suggest `multiline` or `rich`
  document  data      rechnung.bemerkung contains newlines (1 of 5 records): suggest `multiline`
  → 2 problems. exit code 1
debug file: rechnung.debug.html (holds the document's data)
  • lint meldet eine Zeile für jedes Feld und jedes Problem, mit der Zahl der Datensätze, die es haben. Der Pfad beginnt an der Wurzel des Datensatzes, also sind kunde.name und lieferant.name zwei Felder mit zwei Typen.
  • lieferhinweis wird nicht gemeldet: Ein multiline-Feld behält Zeilenumbrüche. Ein rich-Feld behält Markup.
  • Markup ist ein HTML-Tag wie <br/>, <b> oder </p>. Der Text Preis < 5 und > 3 ist kein Markup.
  • Die Meldungen enthalten nie die Werte Ihrer Daten.
  • Die data-Meldungen haben keine Seite und keine Zeile: Die Ursache liegt in den Daten, nicht im erzeugten HTML.

Die Lösung liegt im Schema oder in den Daten. Legen Sie für ein Feld, das Zeilenumbrüche oder Markup behalten soll, multiline oder rich fest, oder bereinigen Sie den Wert in Ihrer Anwendung. Siehe Feldtypen.

Lage Was lint tut
--data und ein Schema Prüft die Daten.
--data und kein Schema Überspringt die Datenprüfung und gibt No schema for rechnung.html: data checks skipped auf der Standardfehlerausgabe aus. Das ist kein Problem: Der Exit-Code ändert sich nicht.
--schema false Überspringt die Datenprüfung.
Eine Schemadatei, die fehlt oder kein gültiges JSON ist Bricht mit einem Fehler und Exit-Code 1 ab.

Die Ausgabe als JSON lesen

--format json gibt ein Array aus, mit einem Objekt für jedes Problem, und [], wenn es keines gibt. Jedes Objekt hat die Schlüssel page, kind, message, file und line. Nutzen Sie es, um ein anderes Werkzeug zu speisen.

brevier lint rechnung.html --data rechnung.json --format json
[
  {
    "page": null,
    "kind": "data",
    "message": "rechnung.bemerkung contains markup (3 of 5 records): suggest `multiline` or `rich`",
    "file": null,
    "line": null
  },
  {
    "page": null,
    "kind": "data",
    "message": "rechnung.bemerkung contains newlines (1 of 5 records): suggest `multiline`",
    "file": null,
    "line": null
  }
]

page, file und line sind null bei einem Problem, das keinen Platz im erzeugten HTML hat.

Mindestbreite einer Spalte festlegen

Eine Tabellenspalte hat von sich aus keine Mindestbreite. Darum meldet lint nie von selbst eine zu schmale Spalte. Sie legen die Mindestbreite am <col> der Spalte fest, mit dem Attribut data-min-width:

<table>
  <col style="width: 40mm">
  <col style="width: 25mm" data-min-width="20mm">
  <tr><th>Position</th><th>Menge</th></tr>
</table>

CSS min-width wirkt bei einer Spalte nicht. Darum liest Brevier dieses Attribut.

  • Der Wert ist eine Zahl mit mm: 20mm oder 22.5mm. Jeder andere Wert wird ignoriert.
  • Lint vergleicht die Breite der Spalte auf der Seite mit der Mindestbreite. Es meldet die Spalte, wenn sie um mehr als 0,3 mm schmaler ist.
  • Eine Spalte ohne das Attribut wird nie gemeldet.
  • Das Attribut ändert nichts am PDF. Nur brevier lint liest es.

Lint in CI ausführen

Führen Sie brevier lint in Ihrer Build-Pipeline aus, um Layoutfehler abzufangen, bevor PDFs für Kunden erzeugt werden.

Lizenzschlüssel und Netzwerk

Wie brevier pdf benötigt auch brevier lint einen Lizenzschlüssel in der Umgebungsvariable BREVIER_LICENCE_KEY. Hinterlegen Sie den Schlüssel in den Secrets Ihrer CI-Plattform.

Linting benötigt keinen Netzwerkzugriff. Es läuft vollständig offline.

Warnung zur Debug-HTML-Datei

brevier lint schreibt eine Debug-HTML-Datei (wie rechnung.debug.html oder unter --debug-dir), um Zeilennummern für gefundene Probleme anzuzeigen. Diese Datei enthält die gerenderten Daten des Dokuments.

Veröffentlichen oder speichern Sie die Debug-HTML-Datei nicht als öffentliches CI-Artefakt, da sie die Dokumentdaten enthält.

GitHub Actions

Dieser Workflow installiert Brevier mit pip und prüft eine Vorlage bei jedem Push und Pull Request. Hinterlegen Sie Ihren Lizenzschlüssel als Repository-Secret BREVIER_LICENCE_KEY.

.github/workflows/lint-templates.yml
name: lint templates
on: [push, pull_request]

jobs:
  lint:
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: "3.13"
      - name: Pango und brevier installieren
        run: |
          sudo apt-get update -qq
          sudo apt-get install -y libpango-1.0-0 libpangoft2-1.0-0
          pip install brevier
      - name: Vorlagen prüfen
        env:
          BREVIER_LICENCE_KEY: ${{ secrets.BREVIER_LICENCE_KEY }}
        run: brevier lint templates/rechnung.html --data templates/rechnung.json

Ein Befund ergibt Exit-Code 1. Der Job schlägt dann fehl, und der Pull Request zeigt es.