Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Markup-Parser (https://www.delphipraxis.net/188903-markup-parser.html)

hansklok 18. Apr 2016 16:11


Markup-Parser
 
Hallo,

ich habe zwei Klassen: TParagraph und TCharacter. Beide besitzen jeweils eine Property Name: String und Content: String

Nun habe ich ein Memo mit z.B. dem folgenden Inhalt:

Code:
Das ist mein erster Absatz.

{ps:Normal}Und hier beginnt mein zweiter Absatz, der das Absatzformat "Normal" hat und der {cs:Fett}formatierten, {cs:rot}farbigen{/cs}{/cs} Text darstellen kann.

Ach ja und das hier ist der dritte Absatz.
Ich suche nun einen Weg, den Inhalt von TMemo zu parsen.
  1. Absätze beginnen jeweils nach zwei Zeilenumbrüchen (ausgenommen der allererste, der beginnt ganz oben)
  2. Absätze können (optional) einen Style enthalten, der durch {ps:NAME} am Beginn des Absatzes gekennzeichnet werden kann
  3. Innerhalb des Absatzes kann (optional) nun einzelnen Wörtern ebenfalls ein Style zugeteilt werden - {cs:NAME}Inhalt{/cs}. Hier ist aber eine Verschachtelung möglich.

Wie könnte man so etwas umsetzen, bzw. gibt es bereits fertige Implementierungen? Achse, ich möchte kein!!! RichEdit verwenden, fall der Vorschlag kommen sollte ;)

Der Parser enthält dann ein Array, welches die Paragraphen enthält und ein Paragraph speichert dan jeweils die Texte (Runs mit Inhalt und optionalem Style) ebenfalls in einem Array.

Danke und LG

Sir Rufo 18. Apr 2016 17:03

AW: Markup-Parser
 
Also du willst quasi so etwas daraus bekommen:
Code:
[
  {
    "style": null,
    "elements":[
      {
        "color": null,
        "style": [],
        "content": "Das ist mein erster Absatz"
      }]
  },
  {
    "style": "Normal",
    "elements":[
      {
        "color": null,
        "style": [],
        "content": "Und hier beginnt mein zweiter Absatz, der das Absatzformat "Normal" hat und der "
      },
      {
        "color": null,
        "style": ["Fett"],
        "content": "formatierten, "
      },
      {
        "color": "rot",
        "style": ["Fett"],
        "content": "farbigen"
      },
      {
        "color": null,
        "style": [],
        "content": " Text darstellen kann."
      }]
  },
  {
    "style": null,
    "elements":[
      {
        "color": null,
        "style": [],
        "content": "Ach ja und das hier ist der dritte Absatz."
      }]
  }
]

hansklok 18. Apr 2016 17:10

AW: Markup-Parser
 
Ja, ganz genau Sir Ruf :wink: JSON wäre beispielsweise ja gar nicht so übel (siehe Dein Beispiel). Wobei anzumerken ist, dass ich den Color-Tag nicht benötige, da meine Reports nur auf globalen Styles aufbauen. Somit wird die Textfarbe auch als Character-Style gespeichert. Wie "Fett", ist also auch "Rot" ein Character-Style. Der zweite Absatz enthält jedoch verschachtelte Markup, daher müsste das eher so ausschauen:

Code:
{
    "style": "Normal",
    "elements":[
      {
        "style": null,
        "content": "Und hier beginnt mein zweiter Absatz, der das Absatzformat Normal hat und der "
      },
      {
        "style": "Fett",
        "elements":[
          {
            "content": "formatierten, "
          },
          {
            "style": "Rot",
            "content": "farbigen"
          }]
      },
      {
        "style": null,
        "content": " Text darstellen kann."
      }]
  }

hansklok 19. Apr 2016 19:36

AW: Markup-Parser
 
Hmm, offenbar scheint das noch nie jemand in ähnlicher Form gebraucht zu haben?!

Noch ein paar Gedanken dazu:
  • Zuerst würde ich das ganze jeweils in Absätze splitten (Zeilenumbruch)
  • Und dann die einzelnen Paragraphen in Tokens aufteilen, mittels RegEx
    Delphi-Quellcode:
    [^\s]+

Sir Rufo 19. Apr 2016 20:28

AW: Markup-Parser
 
Du kannst dir etwas zusammenfrickeln (mit RegEx) oder einen echten Parser schreiben.

So ein Parser geht Zeichen für Zeichen durch und entscheidet anhand des aktuellen Status, was passieren soll. Wäre auf jeden Fall meine Wahl der Mittel.

hansklok 19. Apr 2016 21:13

AW: Markup-Parser
 
Das hab ich mir schon gedacht, dass der Parser die beste Variante ist. Ich habe nur null Plan, wie das umzusetzen ist, weil, sobald der Parser z.B. beim ersten { angelangt ist und weitere Verschachtelungen folgen, wird es doch mega kompliziert?!

freimatz 25. Apr 2016 15:46

AW: Markup-Parser
 
Wir benutzen CoCo https://de.wikipedia.org/wiki/Coco/R 8-)

hansklok 26. Apr 2016 12:47

AW: Markup-Parser
 
Cool, danke und wie funktioniert der? Hast Du ein Beispiel?

madas 26. Apr 2016 12:55

AW: Markup-Parser
 
Zitat:

Zitat von hansklok (Beitrag 1336671)
Cool, danke und wie funktioniert der? Hast Du ein Beispiel?

http://www.ssw.uni-linz.ac.at/Coco/Doc/UserManual.pdf

Lesen bildet. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz