Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit Unit1;
- interface
- uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
- type
- TForm1 = class(TForm)
- Memo1: TMemo;
- Memo2: TMemo;
- Button1: TButton;
- procedure Button1Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- type
- Items = record
- Item : string;
- M : integer;
- K : Integer;
- short : boolean;
- end;
- rec = record
- grid : string;
- M : array [1..4] of string;
- I : Array ['A'..'D'] of array [1..4] of Items;
- Energy,Time,Current,Heat : integer;
- Resource,Fuel,Add : Items;
- end;
- var
- Form1: TForm1;
- data : rec;
- implementation
- {$R *.dfm}
- procedure TForm1.Button1Click(Sender: TObject);
- var ts2 :TStrings;
- ts,ts3 : TStringList;
- i,j,m,p : integer;
- t : TArray<String>;
- s,s2,s3 : string;
- c : char;
- begin
- ts := TStringList.Create;
- ts2 := TStringList.Create;
- ts3 := TStringList.Create;
- ts.Text := Memo1.Text;
- for i := 1 to 4 do
- for c := 'A' to 'D' do
- begin
- data.I[c][i].short:=false;
- data.I[c][i].Item:='';
- data.I[c][i].M:=0;
- data.I[c][i].K:=0;
- end;
- try
- // парсинг по |
- data.grid := ts[0].Remove(0,Pos('{{',ts[0])+1);
- for i := 1 to ts.Count-1 do
- begin
- t := ts[i].Split(['|']);
- for j := 0 to High(t) do
- begin
- s := trim(t[j]);
- if s <> '' then ts2.Add(s);
- end;
- end;
- // парсинг по полям
- for i := 0 to ts2.Count-1 do
- begin
- t := ts2[i].Split(['=']);
- if High(t) > 0 then
- begin
- t[1] := trim(t[1]); // Убрать комментарии
- t[0] := StringReplace(t[0],'<!--','',[rfReplaceAll]);
- t[0] := StringReplace(t[0],'//-->','',[rfReplaceAll]);
- t[0] := StringReplace(t[0],'-->','',[rfReplaceAll]);
- t[1] := StringReplace(t[1],'<!--','',[rfReplaceAll]);
- t[1] := StringReplace(t[1],'//-->','',[rfReplaceAll]);
- t[1] := StringReplace(t[1],'-->','',[rfReplaceAll]);
- // Начало АДА парсера. Надо подумать, как алгоритмически переделать
- if t[0] = 'Мод' then data.M[1] := t[1] else
- if t[0] = 'Мод2' then data.M[2] := t[1] else
- if t[0] = 'Мод3' then data.M[3] := t[1] else
- if t[0] = 'A1' then begin data.I['A'][1].M := 0; data.I['A'][1].Item := t[1]; end else
- if (t[0] = 'MA1') or (t[0] = 'M1A1') then begin data.I['A'][1].M := 1; data.I['A'][1].Item := t[1]; end else
- if t[0] = 'M2A1' then begin data.I['A'][1].M := 2; data.I['A'][1].Item := t[1]; end else
- if t[0] = 'M3A1' then begin data.I['A'][1].M := 3; data.I['A'][1].Item := t[1]; end else
- if t[0] = 'A1К' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['A'][1].K) else
- if t[0] = 'A2' then begin data.I['A'][2].M := 0; data.I['A'][2].Item := t[1]; end else
- if (t[0] = 'MA2') or (t[0] = 'M1A2') then begin data.I['A'][2].M := 1; data.I['A'][2].Item := t[1]; end else
- if t[0] = 'M2A2' then begin data.I['A'][2].M := 2; data.I['A'][2].Item := t[1]; end else
- if t[0] = 'M3A2' then begin data.I['A'][2].M := 3; data.I['A'][2].Item := t[1]; end else
- if t[0] = 'A2К' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['A'][2].K) else
- if t[0] = 'A3' then begin data.I['A'][3].M := 0; data.I['A'][3].Item := t[1]; end else
- if (t[0] = 'MA3') or (t[0] = 'M1A3') then begin data.I['A'][3].M := 1; data.I['A'][3].Item := t[1]; end else
- if t[0] = 'M2A3' then begin data.I['A'][3].M := 2; data.I['A'][3].Item := t[1]; end else
- if t[0] = 'M3A3' then begin data.I['A'][3].M := 3; data.I['A'][3].Item := t[1]; end else
- if t[0] = 'A3К' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['A'][3].K) else
- if t[0] = 'B1' then begin data.I['B'][1].M := 0; data.I['B'][1].Item := t[1]; end else
- if (t[0] = 'MB1') or (t[0] = 'M1B1') then begin data.I['B'][1].M := 1; data.I['B'][1].Item := t[1]; end else
- if t[0] = 'M2B1' then begin data.I['B'][1].M := 2; data.I['B'][1].Item := t[1]; end else
- if t[0] = 'M3B1' then begin data.I['B'][1].M := 3; data.I['B'][1].Item := t[1]; end else
- if t[0] = 'B1К' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['B'][1].K) else
- if t[0] = 'B2' then begin data.I['B'][2].M := 0; data.I['B'][2].Item := t[1]; end else
- if (t[0] = 'MB2') or (t[0] = 'M1B2') then begin data.I['B'][2].M := 1; data.I['B'][2].Item := t[1]; end else
- if t[0] = 'M2B2' then begin data.I['B'][2].M := 2; data.I['B'][2].Item := t[1]; end else
- if t[0] = 'M3B2' then begin data.I['B'][2].M := 3; data.I['B'][2].Item := t[1]; end else
- if t[0] = 'B2К' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['B'][2].K) else
- if t[0] = 'B3' then begin data.I['B'][3].M := 0; data.I['B'][3].Item := t[1]; end else
- if (t[0] = 'MB3') or (t[0] = 'M1B3') then begin data.I['B'][3].M := 1; data.I['B'][3].Item := t[1]; end else
- if t[0] = 'M2B3' then begin data.I['B'][3].M := 2; data.I['B'][3].Item := t[1]; end else
- if t[0] = 'M3B3' then begin data.I['B'][3].M := 3; data.I['B'][3].Item := t[1]; end else
- if t[0] = 'B3К' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['B'][3].K) else
- if t[0] = 'C1' then begin data.I['C'][1].M := 0; data.I['C'][1].Item := t[1]; end else
- if (t[0] = 'MC1') or (t[0] = 'M1C1') then begin data.I['C'][1].M := 1; data.I['C'][1].Item := t[1]; end else
- if t[0] = 'M2C1' then begin data.I['C'][1].M := 2; data.I['C'][1].Item := t[1]; end else
- if t[0] = 'M3C1' then begin data.I['C'][1].M := 3; data.I['C'][1].Item := t[1]; end else
- if t[0] = 'C1К' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['C'][1].K) else
- if t[0] = 'C2' then begin data.I['C'][2].M := 0; data.I['C'][2].Item := t[1]; end else
- if (t[0] = 'MC2') or (t[0] = 'M1C2') then begin data.I['C'][2].M := 1; data.I['C'][2].Item := t[1]; end else
- if t[0] = 'M2C2' then begin data.I['C'][2].M := 2; data.I['C'][2].Item := t[1]; end else
- if t[0] = 'M3C2' then begin data.I['C'][2].M := 3; data.I['C'][2].Item := t[1]; end else
- if t[0] = 'C2К' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['C'][2].K) else
- if t[0] = 'C3' then begin data.I['C'][3].M := 0; data.I['C'][3].Item := t[1]; end else
- if (t[0] = 'MC3') or (t[0] = 'M1C3') then begin data.I['C'][3].M := 1; data.I['C'][3].Item := t[1]; end else
- if t[0] = 'M2C3' then begin data.I['C'][3].M := 2; data.I['C'][3].Item := t[1]; end else
- if t[0] = 'M3C3' then begin data.I['C'][3].M := 3; data.I['C'][3].Item := t[1]; end else
- if t[0] = 'C3К' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['C'][3].K) else
- if t[0] = 'Выход' then begin data.I['D'][1].M := 0; data.I['D'][1].Item := t[1]; data.I['D'][1].short := true;end else
- if (t[0] = 'MВыход') or (t[0] = 'M1Выход') then begin data.I['D'][1].M := 1; data.I['D'][1].Item := t[1]; data.I['D'][1].short := true;end else
- if t[0] = 'M2Выход' then begin data.I['D'][1].M := 2; data.I['D'][1].Item := t[1]; data.I['D'][1].short := true;end else
- if t[0] = 'M3Выход' then begin data.I['D'][1].M := 3; data.I['D'][1].Item := t[1]; data.I['D'][1].short := true;end else
- if t[0] = 'ВК' then begin TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['D'][1].K); data.I['D'][1].short := true end else
- if t[0] = 'Выход1' then begin data.I['D'][1].M := 0; data.I['D'][1].Item := t[1]; data.I['D'][1].short := false;end else
- if (t[0] = 'MВыход1') or (t[0] = 'M1Выход1') then begin data.I['D'][1].M := 1; data.I['D'][1].Item := t[1]; data.I['D'][1].short := false;end else
- if t[0] = 'M2Выход1' then begin data.I['D'][1].M := 2; data.I['D'][1].Item := t[1]; data.I['D'][1].short := false;end else
- if t[0] = 'M3Выход1' then begin data.I['D'][1].M := 3; data.I['D'][1].Item := t[1]; data.I['D'][1].short := false;end else
- if t[0] = 'В1К' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['D'][1].K) else
- if t[0] = 'Выход2' then begin data.I['D'][2].M := 0; data.I['D'][2].Item := t[1]; end else
- if (t[0] = 'MВыход2') or (t[0] = 'M1Выход2') then begin data.I['D'][2].M := 1; data.I['D'][2].Item := t[1]; end else
- if t[0] = 'M2Выход2' then begin data.I['D'][2].M := 2; data.I['D'][2].Item := t[1]; end else
- if t[0] = 'M3Выход2' then begin data.I['D'][2].M := 3; data.I['D'][2].Item := t[1]; end else
- if t[0] = 'В2К' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['D'][2].K) else
- if t[0] = 'Выход3' then begin data.I['D'][3].M := 0; data.I['D'][3].Item := t[1]; end else
- if (t[0] = 'MВыход3') or (t[0] = 'M1Выход3') then begin data.I['D'][3].M := 1; data.I['D'][3].Item := t[1]; end else
- if t[0] = 'M2Выход3' then begin data.I['D'][3].M := 2; data.I['D'][3].Item := t[1]; end else
- if t[0] = 'M3Выход3' then begin data.I['D'][3].M := 3; data.I['D'][3].Item := t[1]; end else
- if t[0] = 'В3К' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['D'][3].K) else
- if t[0] = 'Выход4' then begin data.I['D'][4].M := 0; data.I['D'][4].Item := t[1]; end else
- if (t[0] = 'MВыход4') or (t[0] = 'M1Выход4') then begin data.I['D'][4].M := 1; data.I['D'][4].Item := t[1]; end else
- if t[0] = 'M2Выход4' then begin data.I['D'][4].M := 2; data.I['D'][4].Item := t[1]; end else
- if t[0] = 'M3Выход4' then begin data.I['D'][4].M := 3; data.I['D'][4].Item := t[1]; end else
- if t[0] = 'В4К' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['D'][4].K) else
- if t[0] = 'Энергия' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.Energy) else
- if t[0] = 'Время' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.Time) else
- if t[0] = 'Напряжение' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.Current) else
- if t[0] = 'Теплоёмкость' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.Heat) else
- if t[0] = 'Ресурс' then begin data.Resource.M := 0; data.Resource.Item := t[1]; end else
- if (t[0] = 'MРесурс') or (t[0] = 'M1Ресурс') then begin data.Resource.M := 1; data.Resource.Item := t[1]; end else
- if t[0] = 'M2Ресурс' then begin data.Resource.M := 2; data.Resource.Item := t[1]; end else
- if t[0] = 'M3Ресурс' then begin data.Resource.M := 3; data.Resource.Item := t[1]; end else
- if t[0] = 'РК' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.Resource.K) else
- if t[0] = 'Топливо' then begin data.Fuel.M := 0; data.Fuel.Item := t[1]; end else
- if (t[0] = 'MТопливо') or (t[0] = 'M1Топливо') then begin data.Fuel.M := 1; data.Fuel.Item := t[1]; end else
- if t[0] = 'M2Топливо' then begin data.Fuel.M := 2; data.Fuel.Item := t[1]; end else
- if t[0] = 'M3Топливо' then begin data.Fuel.M := 3; data.Fuel.Item := t[1]; end else
- if t[0] = 'ТК' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.Fuel.K) else
- if t[0] = 'Доп' then begin data.Add.M := 0; data.Add.Item := t[1]; end else
- if (t[0] = 'MДоп') or (t[0] = 'M1Доп') then begin data.Add.M := 1; data.Add.Item := t[1]; end else
- if t[0] = 'M2Доп' then begin data.Add.M := 2; data.Add.Item := t[1]; end else
- if t[0] = 'M3Доп' then begin data.Add.M := 3; data.Add.Item := t[1]; end else
- if t[0] = 'ДК' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.Add.K);
- end;
- // вычленение из напарсенного одинаковых элементов
- end;
- ts.Sorted := true;
- ts.Duplicates := dupIgnore;
- ts.Clear;
- ts3.BeginUpdate;
- ts.BeginUpdate;
- s := '';
- for i := 1 to 4 do // запись исходных материалов
- for c := 'A' to 'C' do
- if data.I[C][i].Item <> '' then
- if data.I[C][i].M = 0 then
- ts.Add('[['+data.I[C][i].Item+']]') // для оригинальных предметов
- else
- ts.Add('[['+data.M[data.I[C][i].M]+'/'+data.I[C][i].Item+'|'+data.I[C][i].Item+']]');
- ts.EndUpdate;
- for i := 0 to ts.Count-2 do
- s := s + ts[i] + ', <br />';
- s := '|' +s+ ts[ts.Count-1];
- ts.Sorted := false;
- ts3.Add(s);
- ts3.Add('|{{'+data.grid); // переписываем исходную сетку
- for i := 1 to 3 do
- if data.M[i] <> '' then
- if i = 1 then
- ts3.Add(format('|Мод=%s',[data.M[i]]))
- else
- ts3.Add(format('|Мод%d=%s',[i,data.M[i]])); // записываем мод М М2 М3
- for c := 'A' to 'D' do
- for i := 1 to 4 do
- if data.I[c][i].Item <> '' then
- begin
- if data.I[c][i].M > 0 then
- begin
- s:= 'M';
- if data.I[c][i].M > 1 then
- s:='M'+inttostr(data.I[c][i].M);
- end else s:='';
- if c = 'D' then s3 := 'В' else s3 := c; // Костыль - для колчиства Выход сокращение ВК
- if data.I[c][i].K > 1 then
- if data.I[c][i].short then // или В1К - зависит от исходного шаблона
- s2 := '|'+s3+'К='+inttostr(data.I[c][i].K)
- else
- s2 := '|'+s3+inttostr(i)+'К='+inttostr(data.I[c][i].K)
- else
- s2 := '';
- if c = 'D' then s3 := 'Выход' else s3 := c; // поле D оно же Выход
- if not data.I[c][i].short then s3 := s3 + inttostr(i);
- ts3.Add(format('|%s%s=%s %s',[s,s3,data.I[c][i].Item,s2]));
- end;
- if data.Energy > 0 then ts3.Add(format('|Энергия=%d',[data.Energy]));
- if data.Time > 0 then ts3.Add(format('|Время=%d',[data.Time]));
- if data.Current > 0 then ts3.Add(format('|Напряжение=%d',[data.Current]));
- if data.Heat > 0 then ts3.Add(format('|Теплоёмкость=%d',[data.Heat]));
- s := '';
- ts3.Add('}}');
- ts.Clear;
- ts.Sorted := true;
- ts.Duplicates := dupIgnore;
- c := 'D';
- ts.BeginUpdate;
- for i := 1 to 4 do // запись итоговых материалов
- if data.I[C][i].Item <> '' then
- if data.I[C][i].M = 0 then
- ts.Add('[['+data.I[C][i].Item+']]')
- else
- ts.Add('[['+data.M[data.I[C][i].M]+'/'+data.I[C][i].Item+'|'+data.I[C][i].Item+']]');
- ts.EndUpdate;
- ts.Sorted := false;
- for i := 0 to ts.Count-2 do
- s := s + ts[i] + ', <br />';
- s := '|' +s+ ts[ts.Count-1];
- ts3.Add(s);
- ts3.Add('|-'); //отчеркнуть строку таблицы
- ts3.EndUpdate;
- Memo2.Text := ts3.Text;
- finally
- ts.Free;
- ts2.Free;
- ts3.Free;
- end;
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement