unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, StrUtils;
type
TEntry =
record
Name:
String;
Description:
String;
Author:
String;
Date:
String;
end;
type
TFrmMain =
class(TForm)
Button1: TButton;
Memo1: TMemo;
ListBox1: TListBox;
Memo2: TMemo;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
procedure ListBox1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure LoadLuaFile(AFile:
String);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FrmMain: TFrmMain;
FEntrys:
Array of TEntry;
implementation
{$R *.dfm}
// Ersetzt einzelne Zeichen durch andere
function Replace(ASrc, ALookFor, AReplaceWith :
string ):
string;
var
nPos: Integer;
nLenLookFor: integer;
begin
nPos := Pos(ALookFor, ASrc);
nLenLookFor := Length(ALookFor);
while (nPos > 0)
do
begin
Delete(ASrc, nPos, nLenLookFor);
Insert(AReplaceWith, ASrc, nPos);
nPos := Pos(ALookFor, ASrc);
end;
Result := ASrc;
end;
// Löscht ungewollte Zeilenumrüche
function RemoveBreaks(AString:
String):
String;
var
Str: TStringlist;
I: Integer;
begin
Str := TStringlist.Create;
try
Str.Text := AString;
for I := 0
to Str.Count - 1
do
begin
Result := Result + Str.Strings[I];
end;
finally
Str.Free;
end;
end;
procedure TFrmMain.FormDestroy(Sender: TObject);
begin
SetLength(FEntrys, 0);
end;
procedure TFrmMain.ListBox1Click(Sender: TObject);
begin
if Length(FEntrys) > 0
then
begin
// Array hat Inhalt, laden...
Memo2.Text := FEntrys[ListBox1.ItemIndex].Description;
Edit1.Text := FEntrys[ListBox1.ItemIndex].
Name;
Edit2.Text := FEntrys[ListBox1.ItemIndex].Date;
Edit3.Text := FEntrys[ListBox1.ItemIndex].Author;
end;
end;
procedure TFrmMain.LoadLuaFile(AFile:
String);
var
lTags:
String;
lTagBegin: Integer;
lTagEnd: Integer;
lInnerTagBegin: Integer;
lInnerTagEnd: Integer;
I: Integer;
lSearchIndex: Integer;
lInnerTag:
String;
begin
// Als erstes wir nur der Inhalt des [Notes] Tags gefiltert.. (+1 weg. { )
lTagBegin := Pos('
{', AFile) + 1;
lTagEnd := 0;
for I := Length(AFile)
downto 1
do
begin
// Das letzte } suchen und position speichern
if AFile[I] = '
}'
then
begin
// Speichern ( -1 wegen dem } )
lTagEnd := I - 1;
// Schleife beenden.
Break;
end;
end;
// Jetzt haben wir alles in [Notes]
// Und weiter, die einzelnen Tags durchgehen
lTags := RemoveBreaks(copy(AFile, lTagBegin, lTagEnd - lTagBegin));
lSearchIndex := 1;
while PosEx('
[', lTags, lSearchIndex) <> 0
do
begin
// Der ganze Eintrag
lTagBegin := PosEx('
[', lTags, lSearchIndex);
lTagEnd := PosEx('
}', lTags, lTagBegin);
if lTagEnd = 0
then
begin
// Wenn PosEx nichts gefunden hat, ist der Text zuende, also richtiges
// Value setzen
lTagEnd := Length(lTags);
end;
lInnerTag := Copy(lTags, lTagBegin, lTagEnd - lTagBegin);
// Der gesamte SubEintrag befindet sich nun in lInnerTag
// Nun werden die einzelnen SubTags geparst
SetLength(FEntrys, Succ(Length(FEntrys)));
// Zuerst der Name
lInnerTagBegin := Pos('
[', lInnerTag) + 2;
lInnerTagEnd := PosEx('
]', lInnerTag, lInnerTagBegin) - 1;
FEntrys[High(FEntrys)].
Name := Copy(lInnerTag, lInnerTagBegin,
lInnerTagEnd - lInnerTagBegin);
// Beschreibung...
// + 19 = ["description"] = "
lInnerTagBegin := Pos('
["description"] = "', lInnerTag) + 19;
lInnerTagEnd := PosEx('
",', lInnerTag, lInnerTagBegin);
FEntrys[High(FEntrys)].Description := Copy(lInnerTag, lInnerTagBegin,
lInnerTagEnd - lInnerTagBegin);
// Noch die /n durch Zeilenumbrüche ersetzen
FEntrys[High(FEntrys)].Description := Replace(Copy(lInnerTag, lInnerTagBegin,
lInnerTagEnd - lInnerTagBegin), '
/n', sLineBreak);
// Datum kA welches Format das ist, also Plaintext
lInnerTagBegin := Pos('
["date"] = "', lInnerTag) + 12;
lInnerTagEnd := PosEx('
",', lInnerTag, lInnerTagBegin);
FEntrys[High(FEntrys)].Date := Copy(lInnerTag, lInnerTagBegin,
lInnerTagEnd - lInnerTagBegin);
// Author
lInnerTagBegin := Pos('
["author"] = "', lInnerTag) + 14;
lInnerTagEnd := PosEx('
",', lInnerTag, lInnerTagBegin);
FEntrys[High(FEntrys)].Author := Copy(lInnerTag, lInnerTagBegin,
lInnerTagEnd - lInnerTagBegin);
// Das wars. Alle essentiellen Daten befinden sich im array,
// jetzt kann dieses verarbeitet werden...
// Den SuchIndex anpassen
lSearchIndex := lTagEnd;
end;
end;
procedure TFrmMain.Button1Click(Sender: TObject);
var
I: Integer;
begin
LoadLuaFile(Memo1.Text);
// Die Daten befinden sich nun im Array, dieses laden wir in eine Listbox
for I := 0
to Length(FEntrys) - 1
do
begin
// Jeweils die Namen in die Listbox
ListBox1.Items.Add(FEntrys[I].
Name);
end;
end;
end.