Skip to content

Instantly share code, notes, and snippets.

@Profpatsch
Last active August 8, 2022 16:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Profpatsch/092ff68fa267b9fa0ccbe13e98149b21 to your computer and use it in GitHub Desktop.
Save Profpatsch/092ff68fa267b9fa0ccbe13e98149b21 to your computer and use it in GitHub Desktop.
Spec für log
  • Überlegungen zur Logveröffentlichung Es könnte Sinn machen, das log öffentlich zu führen. Es ist absichtlich in einem leicht parsbaren, kontextfreien Format gehalten.

    Format des logs

    Eine Liste an Einträgen, in eckigen Klammern: [1970-01-01]. Danach kann eine Tagesbeschreibung kommen, und danach eine Liste von Items. Eine Tagesbeschreibung ist ein Block.

    Jedes Item ist ein Itemtitel und optional danach ein Itemblock. Ein Itemtitel beginnt mit und danach Absatz mit Zeilenformatierung. Als Zeilenumbruch ist hier nur die Kombination \n   valide, diese wird dem Zeilenformatierer als \n übergeben (Entfernen der Einrückung). Der Itemblock ist ein Block, der vier Spaces eingerückt ist.

    Ein Block ist ein valides Dokument in einer Markupsprache, in diesem log wird Markdown verwendet.
    Der Absatz mit Zeilenformatierung ist in betreffender Markupsprache der Strukturtyp mit den wenigsten besonderen Eigenschaften (in Markdown der normale Absatz).

    Zwischen, vor und nach Einträgen können je beliebig viele Leerzeilen kommen, ebenso zwischen, vor und nach Tagesbeschreibung und Items. Dies dient zur besseren informellen Formatierung.

    Im Sinne der Post-Post-Privacy wird die Synax des Itemtitels so erweitert, dass zu noch und möglich sind.

    Semantik des logs

    Die Liste an Einträgen ist nach aufsteigendem Datum sortiert und darf Datumslücken enthalten. Jeder Eintrag stellt einen Tagebucheintrag da, jedes Item eine logische Einheit des Tages (z.B. eine Aktivität, ein erledigtes Todo, einen Gedankenzug).

    Die Markierung des Itemtitels stellt die Privatheit des Eintrags im Sinne der Post-Post-Privacy dar. Hierbei steht für Öffentlich, für Privat und für Semiprivat (Einsehbar von Vertrauenspersonen).

    Grammatik des logs

    p-ebnf, parametrisierte Extended Backus-Naur Form (Regeln können mit weiteren Regeln parametrisiert werden); das ist trivial normalisierbar (oder sollte es zumindest sein). Foo A ist Applikation. "abc" ist Kurzschreibweise für "a", "b", "c". Character Classes wie in man perlrecharclass definiert werden unterstützt durch Einschluss in /, z.B. /\w/ (Wortcharakter), /[a[:upper:]]/ (alle a und Großbuchstaben). Tokens, die auf andere Parser verweisen, werden mit <> markiert.

    <Substitute> ist eine spezielle Form, die vier Argumente erhält: Die zu ersetzende Form S, den Ersatz E, eine Form X, in der ersetzt wird und eine Form Y, die nach der Ersetzung gilt. Dabei muss X vor der Ersetzung gelten, und Y nach der Ersetzung. (TODO: geht das auch simpler?) Das ist für eingerückte mehrzeilige Blöcke gedacht, die an einen anderen Parser übergeben werden.

    log := Editorkommentar
         , Leerzeilen
         , SpacedList Eintrag
         , Leerzeilen
    
    Eintrag := Datum
             , Leerzeilen
             , Tagesbeschreibung
             , Leerzeilen
             , SpacedList Item
    
    Datum             := "[", {/\d/}, "-", 2* /\d/, "-", 2* /\d/, "]", nl
    Tagesbeschreibung := Block, nl
    
    Item      := Itemtitel
               , Itemblock
    Itemtitel := ( "+ " | "- " | "* " )
               , AbsatzMitZeilenformatierung
    
    AbsatzMitZeilenformatierung
      := <Substitute> (indent 2) /\n/ (indentL 2) <Simpelster Strukturtyp>
       , nl
    Itemblock
      := <Substitute> (indent 4) /\n/ (indentL 4) Block
       , nl
    Block := <Blockparser (z.B. Markdown)>
    
    
    SpacedList a    := a, {Leerzeilen, SpacedList a}
    Editorkommentar := "-*-", {/./}, "-*-", nl
    Leerzeilen      := nl, {Leerzeilen}
    indentL n := {/./}, {(indent n), indentL n}
    indent n  := nl, n*" "
    nl        := /\n/
    
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment