Vorlagenbasierter Dateigenerator mit JSON-Dateneingabe

Ich suche ein Tool, vorzugsweise mit einer FLOSS-Lizenz, das etwa Folgendes kann:

thetool --template mytemplate.c.someformat --data mydata.json --schema myschema.json --out myoutput.c

Wo thetoolist das ausführbare Tool, nach dem ich suche, mytemplate.c.someformatsieht meine Vorlagendatei aus wie eine C-Datei, aber mit Vorlagenstil-Markup zum Ersetzen von Daten, mydata.jsonenthält Daten zum Ausfüllen der Vorlage, myschema.jsonist ein Schema, das Verbindungen zwischen Datenelementen erklärt (schön zu haben, aber nicht unbedingt erforderlich) und myoutput.cist die generierte C-Datei.

Gibt es so ein Tool? Die native JSON-Unterstützung ist hier ein Schlüssel, bei dem Fehlermeldungen problematische Bereiche in der JSON-Quelle hervorheben können. XML ist keine Option. Es muss keine explizite Unterstützung für C haben. Es muss in der Lage sein, Dateien im generischen ASCII/UTF-8-Format zu generieren.

Es muss sowohl unter Windows als auch unter GNU/Linux als Befehlszeilentool ausgeführt werden können. Auch gut, wenn es als Bibliothek von Python oder C gelinkt werden kann.

Beispiel

Die Syntax wurde nicht überprüft, da ich das Tool dafür benötige.

mytemplate.c.someformat

#include <stdio.h>

int main(void) {
  #{{ for person in persons }}
    #{{ if person.likes.length > 0 }}
      printf("#{{ person.name }} likes:\n");
      #{{ for liked in person.likes }}
        printf("  * #{{ likes.name }}\n");
      #{{ endfor }}
    #{{ else }}
      printf("#{{ person.name }} doesn't like anyone.");
    #{{ endif }}
    printf("\n");
  #{{ endfor }}

  return(0);
}

mydata.json

{
  "persons": {
    {
      "id": "10",
      "name": "Mr Mister",
      "likes": {
        "20",
        "22"
      }
    },
    {
      "id": "20",
      "name": "Ms Missy",
      "likes": {
        "10",
      }
    },
    {
      "id": "22",
      "name": "No Body",
      "likes":
      {}
    }
  },
  "schema": "personSchema"
}

myschema.json

{
  "personSchema": {
    {
      "id": {
        "type": "integer",
        "attrib": "unique"
      }
      "name": {
        "type": "string"
      }
      "likes":
      {
        "type": "integer",
        "connection": "personSchema.id"
      }
    }
  }
}

meineausgabe.c

#include <stdio.h>

int main(void) {
      printf("Mr Mister likes:\n");
        printf("  * Ms Missy\n");
        printf("  * No Body\n");
    printf("\n");
      printf("Ms Missy likes:\n");
        printf("  * Mr Mister\n");
    printf("\n");
      printf("No Body doesn't like anyone.");
    printf("\n");

    return(0);
}
Warum würden Sie das tun wollen? Wenn Sie viele nahezu identische Quelldateien generieren, schreit dies nach einem Refactoring Ihrer Quelle ;-) Ich rieche hier ein XY-Problem .
@JanDoggen: Welche Quelldateien sind nahezu identisch? Mein Beispiel ist natürlich minimiert. In der realen Welt habe ich Tausende von JSON-Einträgen.
funktioniert das für deinen Anwendungsfall? github.com/mickep76/tf

Antworten (1)

Es gibt viele Programmiersprachen, viele Template-Engines und viele JSON-Parser (und Ihre Anfrage scheint in einem Programmierkontext zu stehen), also kombinieren Sie einfach eine von beiden und Sie bekommen, was Sie wollen.

Schnurrbart ist beispielsweise ein einfaches Vorlagenformat mit Implementierungen in vielen verschiedenen Sprachen, einschließlich eines Python- Pystache- Moduls. (Es basiert selbst auf CTemplate , das als C++-Bibliothek geliefert wird.)

Super User ist kein Dienst zum Schreiben von Skripten, aber hier ist etwas für den Anfang .

Danke! Ich habe ein Beispiel im ursprünglichen Beitrag hinzugefügt. Schnurrbart scheint ein wenig zu einfach. Ich glaube, ich brauche flexiblere Ausdrücke. Ansonsten scheint es ein guter Anfang zu sein.