AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Markup-Parser

Ein Thema von hansklok · begonnen am 18. Apr 2016 · letzter Beitrag vom 26. Apr 2016
Antwort Antwort
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#1

Markup-Parser

  Alt 18. Apr 2016, 16:11
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

Geändert von hansklok (18. Apr 2016 um 17:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Markup-Parser

  Alt 18. Apr 2016, 17:03
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."
      }]
  }
]
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#3

AW: Markup-Parser

  Alt 18. Apr 2016, 17:10
Ja, ganz genau Sir Ruf 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."
      }]
  }

Geändert von hansklok (18. Apr 2016 um 17:32 Uhr)
  Mit Zitat antworten Zitat
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#4

AW: Markup-Parser

  Alt 19. Apr 2016, 19:36
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 [^\s]+
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Markup-Parser

  Alt 19. Apr 2016, 20:28
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#6

AW: Markup-Parser

  Alt 19. Apr 2016, 21:13
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?!
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.380 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Markup-Parser

  Alt 25. Apr 2016, 15:46
Wir benutzen CoCo https://de.wikipedia.org/wiki/Coco/R
  Mit Zitat antworten Zitat
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#8

AW: Markup-Parser

  Alt 26. Apr 2016, 12:47
Cool, danke und wie funktioniert der? Hast Du ein Beispiel?
  Mit Zitat antworten Zitat
madas

Registriert seit: 9. Aug 2007
207 Beiträge
 
#9

AW: Markup-Parser

  Alt 26. Apr 2016, 12:55
Cool, danke und wie funktioniert der? Hast Du ein Beispiel?
http://www.ssw.uni-linz.ac.at/Coco/Doc/UserManual.pdf

Lesen bildet.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:31 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