Wie kann ich einfach eine CSS-ähnliche Datei (!) in meiner Qt-Anwendung analysieren?

8

Ich habe ein Dokument in einem * .css (Cascading Style Sheets) -ähnlichen Format, aber es hat seine eigenen Schlüsselwörter. Eigentlich ist es ein personalisiertes CSS (ich nenne es * .pss), mit eigenen Tags und Eigenschaften. hier habe ich einen Auszug:

%Vor%

Ich möchte es sehr leicht analysieren, gibt es schon etwas Ready-To-Use von Qt? Was wäre der einfachste Weg?

Da * .css eigene Schlüsselwörter hat, interessiere ich mich nicht für CSS-Parser.

Meine weitere Absicht nach dem Parsen dieses * .pss besteht darin, seine Eigenschaften in einem Modell Struktur.

    
Ralf Wickum 23.07.2015, 09:40
quelle

3 Antworten

1

Ich kenne zwei Möglichkeiten:

  1. boost :: spirit und hier findest du eine gute Einführung in das boost :: spirit Parser-Framework
  2. Ich würde empfehlen, einen eigenen rekursiven Descent-Parser zu schreiben

Aufgrund der Tatsache, dass Ihre personalisierte * .pss nicht so komplex ist wie ein CSS (einfache Belichtungsreihe usw.), würde ich 2 empfehlen.

    
Murat 27.08.2015, 06:56
quelle
8

Es gibt nichts öffentliches in Qt. Sie können natürlich den privaten CSS-Parser von Qt verwenden - Sie können ihn kopieren und an Ihre Bedürfnisse anpassen.

Siehe qtbase/src/gui/text/qcssparser_p.h , in qtbase/src/gui/text .

Die gute Nachricht ist, dass für das Beispiel, das Sie oben gezeigt haben, die Änderungen sehr geringfügig sein würden. Der CSS-Parser von Qt unterstützt bereits @import . Wir haben also nur ein zusätzliches bisschen Syntax, nämlich die verschachtelte Selektorsyntax . Ohne diese Syntax können Sie QCss::Parser unverändert verwenden. Der Parser wurde flexibel geschrieben, sodass Sie sich keine Gedanken um formale CSS-Schlüsselwörter machen müssen: Sie können immer noch auf alle Deklarationen zugreifen, unabhängig davon, ob sie aus formeller CSS-Sicht sinnvoll sind oder nicht.

Das Iterieren des Syntaxbaums ist so einfach wie möglich:

%Vor%

Die Ausgabe ist, was wir erwarten würden:

%Vor%

Wir müssen die Debug-Stream-Operatoren für QCss -Klassen selbst implementieren:

%Vor%

Beim Durchlaufen der Deklaration interpretiert QCss::parser bereits einige Standardwerte für uns, z. Farben, Ganzzahlen usw.

%Vor%

Abschließend das Boilerplate und das zu analysierende Stylesheet:

%Vor%

Die Unterstützung für verschachtelte Selektoren / Regeln kann durch Ändern der Parser-Quelle implementiert werden. Die Änderung, die erforderlich ist, um Parser::parseRuleset rekursiv zu machen, ist sehr gering. Ich überlasse das als Übung für den Leser:)

Alles in allem würde ich denken, dass die Wiederverwendung des vorhandenen Parsers viel einfacher ist als das eigene zu rollen, zumal Ihre Benutzer unweigerlich wünschen, dass Sie immer mehr CSS-Spezifikationen unterstützen.

    
Kuba Ober 23.07.2015 16:45
quelle
1

Nun, ich schätze, Sie wollen nicht im Geschäft sein, einen Objekt-Parser zu schreiben, Sie würden einfach JSON oder YAML oder dergleichen neu erfinden. Es ist also am besten, wenn Sie Ihre Formatierung einer bekannten Konfiguration oder Objektnotationsprache anpassen und sie dann mit einer Bibliothek für die von Ihnen verwendete Sprache analysieren. Mit geringfügigen Änderungen könnte das oben beschriebene Format HOCON werden, was eine sehr schöne Übermenge von JSON ist und die Syntax viel näher an dem ist, was Sie verwenden:

Ссылка

Sie könnten es dann mit einer HOCON-Parsing-Bibliothek parsen, und voilä, Sie hätten in-memory-Objekte, die Sie beliebig modellieren oder speichern können. Ich glaube, dass Qt C ++ basiert? Es gibt eine hocon-Bibliothek für C, ich weiß nichts über C ++, und ich schätze, Sie müssten ein Qt-Plug-in schreiben, um die HOCON-Analyse von einer anderen Sprache zu umbrechen.

Die andere Option besteht darin, einen CSS- & gt; -Objektparser wie diesen zu verwenden: Ссылка

Was Sie eventuell anpassen und an Ihre Bedürfnisse anpassen müssen. Wie auch immer, ich vermute, dass zur Integration in eine Qt-Anwendung ein Plug-in benötigt wird, das einen Aufruf an einen Befehlszeilenprozess oder ein anderes Codemodul abwickelt.

    
stolli 20.08.2015 20:19
quelle

Tags und Links