Einzelnen Beitrag anzeigen

Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#1

JVRichEdit parsen - Hilfe?!

  Alt 3. Okt 2006, 18:09
Hi,

ich möchte in meinem Programm die JVRichEdit Komponente verwenden, da ich gerne Bitmaps in mein RichEdit einbauen möchte. Ich habe mit dem "Messenger-Beispiel" von den JV-Beispielen gearbeitet und die Bitmapanzeige geht auch schon soweit. Die Eingabe des Textes erfolgt auch über ein JVRichEdit. Dies sieht z.B. wiefolgt aus:
Zitat:
Hallo! Das ist ein Test
Was nun noch per Hand gemacht werden muss, ist der Parser. Ich muss den oben dargestellten String durchgehen und schauen, ob ein Smiley bzw. ein eigenes Schlüsselwort enthalten ist...und hier liegt das Problem:

Das Messenger Beispiel hat wohl schon vorgefertigte Smileys, aber irgendwie blicke ich nicht so wirklich durch den Code. Ich weiss nicht wie ich eigene Definitionen einbauen kann.

Hier erstmal der komplette Code, unten drunter eine genauere Erklärung, was ich nicht verstehe:

Code:
procedure TfrmNachricht.ParseString(const S: string);
var
  P, Q: PChar;
  State: Integer;

  procedure AddImage(const SmileIndex, SmileLength: Integer);
  begin
    AddTextToRichEdit(Q, P - Q - SmileLength + 1, JVRichEdit2.Font);
    AddImageToRichEdit(SmileIndex);

    State := 0;
    Q := P + 1;
  end;
begin
  P := PChar(S);
  Q := P;

  State := 0;

  // State = 1.. then looking at ":-A" with A = @x)( etc.
  //         10..                 "LOL"
  //         20..                 "O :-)"
  //         30..                 "(blush)"
  //         40..                 ":'-("
  //         50..                 "8-)"
  //         60..                 ";-)"
  //         70..                 "readonly"
  //         80..                 "read-only on" or "read-only off"
  //
  // State = 1 -> ":" read
  // State = 2 -> ":-" read
  // State = 11 -> "LO" read
  // State = 22 -> "O :" read
  // State = 23 -> "O :-" read
  //
  // etc.

  while P^ <> #0 do
  begin
    case P^ of
      '$':
        if State in [2, 23] then
          AddImage(9, 3) // :-$
        else
          State := 0;
      '&':
        if State in [2, 23] then
          AddImage(4, 3) // :-&
        else
          State := 0;
      '(':
        case State of
          1, 22: AddImage(5, 2); // :(
          2, 23: AddImage(5, 3); // :-(
          40: AddImage(2, 3); // :,(
          41: AddImage(2, 4); // :'-(
        else
          State := 30;
        end;
      ')':
        case State of
          1, 22: AddImage(11, 2); // :)
          2: AddImage(11, 3); // :-)
          23: AddImage(6, 5); // O :-)
          35: AddImage(3, 7); // (blush)
          51: AddImage(1, 3); // 8-)
          61: AddImage(15, 3); // ;-)
        else
          State := 0;
        end;
      '*':
        if State = 1 then
          AddImage(7, 2) // :*
        else
          State := 0;
      ',':
        if State in [1, 22] then
          State := 40
        else
          State := 0;
      '-':
        case State of
          1, 22, 40, 50, 60: Inc(State);
          73: State := 80;
        else
          State := 0;
        end;
      '8': State := 50;
      '"': State := -1; // to prevent "read.." etc will be triggered by the program
      ':':
        if State = 21 then
          State := 22
        else
          State := 1;
      ';': State := 60;
      '@':
        case State of
          1, 22: AddImage(0, 2); // :@
          2, 23: AddImage(0, 3) // :-@
        else
          State := 0;
        end;
      'D':
        case State of
          1, 22: AddImage(8, 2); // :D = LOL
          2, 23: AddImage(8, 3) // :-D = LOL
        else
          State := 0;
        end;
      'L':
        if State = 11 then
          AddImage(8, 3) // LOL
        else
          State := 10;
      'O':
        if State = 10 then
          State := 11
        else
          State := 20;
      '\', '/':
        if State in [2, 23] then
          AddImage(14, 3) // :-\
        else
          State := 0;
      'a':
        if State = 71 then
          State := 72
        else
          State := 0;
      'b':
        if State = 30 then
          State := 31
        else
          State := 0;
      'd':
        if State = 72 then
          State := 73
        else
          State := 0;
      'e':
        if State = 70 then
          State := 71
        else
          State := 0;
      'h':
        if State = 34 then
          State := 35
        else
          State := 0;
      'l':
        if State in [31, 75, 82] then
          Inc(State)
        else
          State := 0;
      'o':
        case State of
          2, 23: AddImage(12, 3); // :-o
          73, 80, 85: Inc(State);
        else
          State := 0;
        end;
      'p':
        if State in [2, 23] then
          AddImage(13, 3) // :-p
        else
          State := 0;
      'r':
        if State <> -1 then
          State := 70
        else
          State := 0;
      's':
        if State = 33 then
          State := 34
        else
          State := 0;
      'u':
        if State = 32 then
          State := 33
        else
          State := 0;
      'x', 'X':
        if State in [2, 23] then
          AddImage(10, 3) // :-x
        else
          State := 0;
      ' ':
        case State of
          20, 84: Inc(State);
          11: State := 21;
        else
          State := 0;
        end;
    end;
    Inc(P);
  end;

  if Q < P then
    AddTextToRichEdit(Q, P - Q, JVRichEdit2.Font);
end;
Nehmen wir mal den Anfang des Parsers - hier fängt das erste Problem an:

Code:
while P^ <> #0 do
  begin
    case P^ of
      '$':
        if State in [2, 23] then
          AddImage(9, 3) // :-$
        else
          State := 0;
while P^ <> #0 - ist wohl die Abfrage, ob der String leer ist oder nicht, richtig?
case P^ of normale Case-Bedingung, prüft auf die kommenden Zeichen
'$': Wenn das Zeichen $ im String vorkommt, dann...
if State in [2, 23] then Hier nun ein Problem: Warum State in [2, 23]? Was hat die 2 und die 23 damit zu tun?

Ich verstehe auch nicht die Kommentare in der Funktion oben. Gibt´s da keine extra Hilfe, in der die States erklärt werden? Außerdem wird doch der Integer-Wert State vor dem Aufruf des Zeigers 0 gesetzt...

Wie ihr seht: Fragen über Fragen...vielleicht versteht ja einer von euch den Code und könnte ihn mir etwas erklären?! Wäre super nett! Danke!
  Mit Zitat antworten Zitat