Guest User

Untitled

a guest
Apr 29th, 2013
42
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Memo1: TMemo;
  12.     Memo2: TMemo;
  13.     Button1: TButton;
  14.     procedure Button1Click(Sender: TObject);
  15.   private
  16.     { Private declarations }
  17.   public
  18.     { Public declarations }
  19.   end;
  20. type
  21. Items = record
  22.     Item : string;
  23.     M : integer;
  24.     K : Integer;
  25.     short : boolean;
  26.   end;
  27. rec = record
  28.     grid : string;
  29.     M : array [1..4] of string;
  30.     I : Array ['A'..'D'] of array [1..4] of Items;
  31.     Energy,Time,Current,Heat : integer;
  32.     Resource,Fuel,Add : Items;
  33.   end;
  34. var
  35.   Form1: TForm1;
  36.  
  37.   data : rec;
  38.  
  39. implementation
  40.  
  41. {$R *.dfm}
  42.  
  43.  
  44. procedure TForm1.Button1Click(Sender: TObject);
  45. var ts2 :TStrings;
  46. ts,ts3 : TStringList;
  47. i,j,m,p : integer;
  48. t : TArray<String>;
  49. s,s2,s3 : string;
  50. c : char;
  51. begin
  52.   ts := TStringList.Create;
  53.   ts2 := TStringList.Create;
  54.   ts3 := TStringList.Create;
  55.   ts.Text := Memo1.Text;
  56.   for i := 1 to 4 do
  57.     for c := 'A' to 'D' do
  58.     begin
  59.       data.I[c][i].short:=false;
  60.       data.I[c][i].Item:='';
  61.       data.I[c][i].M:=0;
  62.       data.I[c][i].K:=0;
  63.     end;
  64.  
  65.   try
  66.     // парсинг по |
  67.     data.grid := ts[0].Remove(0,Pos('{{',ts[0])+1);
  68.     for i := 1 to ts.Count-1 do
  69.     begin
  70.       t := ts[i].Split(['|']);
  71.       for j := 0 to High(t) do
  72.       begin
  73.         s := trim(t[j]);
  74.         if s <> '' then ts2.Add(s);
  75.       end;
  76.     end;
  77.     // парсинг по полям
  78.     for i := 0 to ts2.Count-1 do
  79.     begin
  80.       t := ts2[i].Split(['=']);
  81.  
  82.       if High(t) > 0 then
  83.       begin
  84.       t[1] := trim(t[1]);                      // Убрать комментарии
  85.       t[0] := StringReplace(t[0],'<!--','',[rfReplaceAll]);
  86.       t[0] := StringReplace(t[0],'//-->','',[rfReplaceAll]);
  87.       t[0] := StringReplace(t[0],'-->','',[rfReplaceAll]);
  88.       t[1] := StringReplace(t[1],'<!--','',[rfReplaceAll]);
  89.       t[1] := StringReplace(t[1],'//-->','',[rfReplaceAll]);
  90.       t[1] := StringReplace(t[1],'-->','',[rfReplaceAll]);
  91.      // Начало АДА парсера. Надо подумать, как алгоритмически переделать
  92.         if  t[0] = 'Мод' then data.M[1] := t[1] else
  93.         if  t[0] = 'Мод2' then data.M[2] := t[1] else
  94.         if  t[0] = 'Мод3' then data.M[3] := t[1] else
  95.         if  t[0] = 'A1'   then begin data.I['A'][1].M := 0; data.I['A'][1].Item := t[1]; end else
  96.         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
  97.         if  t[0] = 'M2A1' then begin data.I['A'][1].M := 2; data.I['A'][1].Item := t[1]; end else
  98.         if  t[0] = 'M3A1' then begin data.I['A'][1].M := 3; data.I['A'][1].Item := t[1]; end else
  99.         if  t[0] = 'A1К'  then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['A'][1].K) else
  100.         if  t[0] = 'A2'   then begin data.I['A'][2].M := 0; data.I['A'][2].Item := t[1]; end else
  101.         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
  102.         if  t[0] = 'M2A2' then begin data.I['A'][2].M := 2; data.I['A'][2].Item := t[1]; end else
  103.         if  t[0] = 'M3A2' then begin data.I['A'][2].M := 3; data.I['A'][2].Item := t[1]; end else
  104.         if  t[0] = 'A2К'  then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['A'][2].K) else
  105.         if  t[0] = 'A3'   then begin data.I['A'][3].M := 0; data.I['A'][3].Item := t[1]; end else
  106.         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
  107.         if  t[0] = 'M2A3' then begin data.I['A'][3].M := 2; data.I['A'][3].Item := t[1]; end else
  108.         if  t[0] = 'M3A3' then begin data.I['A'][3].M := 3; data.I['A'][3].Item := t[1]; end else
  109.         if  t[0] = 'A3К'  then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['A'][3].K) else
  110.         if  t[0] = 'B1'   then begin data.I['B'][1].M := 0; data.I['B'][1].Item := t[1]; end else
  111.         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
  112.         if  t[0] = 'M2B1' then begin data.I['B'][1].M := 2; data.I['B'][1].Item := t[1]; end else
  113.         if  t[0] = 'M3B1' then begin data.I['B'][1].M := 3; data.I['B'][1].Item := t[1]; end else
  114.         if  t[0] = 'B1К'  then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['B'][1].K) else
  115.         if  t[0] = 'B2'   then begin data.I['B'][2].M := 0; data.I['B'][2].Item := t[1]; end else
  116.         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
  117.         if  t[0] = 'M2B2' then begin data.I['B'][2].M := 2; data.I['B'][2].Item := t[1]; end else
  118.         if  t[0] = 'M3B2' then begin data.I['B'][2].M := 3; data.I['B'][2].Item := t[1]; end else
  119.         if  t[0] = 'B2К'  then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['B'][2].K) else
  120.         if  t[0] = 'B3'   then begin data.I['B'][3].M := 0; data.I['B'][3].Item := t[1]; end else
  121.         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
  122.         if  t[0] = 'M2B3' then begin data.I['B'][3].M := 2; data.I['B'][3].Item := t[1]; end else
  123.         if  t[0] = 'M3B3' then begin data.I['B'][3].M := 3; data.I['B'][3].Item := t[1]; end else
  124.         if  t[0] = 'B3К'  then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['B'][3].K) else
  125.         if  t[0] = 'C1'   then begin data.I['C'][1].M := 0; data.I['C'][1].Item := t[1]; end else
  126.         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
  127.         if  t[0] = 'M2C1' then begin data.I['C'][1].M := 2; data.I['C'][1].Item := t[1]; end else
  128.         if  t[0] = 'M3C1' then begin data.I['C'][1].M := 3; data.I['C'][1].Item := t[1]; end else
  129.         if  t[0] = 'C1К'  then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['C'][1].K) else
  130.         if  t[0] = 'C2'   then begin data.I['C'][2].M := 0; data.I['C'][2].Item := t[1]; end else
  131.         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
  132.         if  t[0] = 'M2C2' then begin data.I['C'][2].M := 2; data.I['C'][2].Item := t[1]; end else
  133.         if  t[0] = 'M3C2' then begin data.I['C'][2].M := 3; data.I['C'][2].Item := t[1]; end else
  134.         if  t[0] = 'C2К'  then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['C'][2].K) else
  135.         if  t[0] = 'C3'   then begin data.I['C'][3].M := 0; data.I['C'][3].Item := t[1]; end else
  136.         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
  137.         if  t[0] = 'M2C3' then begin data.I['C'][3].M := 2; data.I['C'][3].Item := t[1]; end else
  138.         if  t[0] = 'M3C3' then begin data.I['C'][3].M := 3; data.I['C'][3].Item := t[1]; end else
  139.         if  t[0] = 'C3К'  then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['C'][3].K) else
  140.         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
  141.         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
  142.         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
  143.         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
  144.         if  t[0] = 'ВК' then begin TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['D'][1].K); data.I['D'][1].short := true end else
  145.         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
  146.         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
  147.         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
  148.         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
  149.         if  t[0] = 'В1К' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['D'][1].K) else
  150.         if  t[0] = 'Выход2'   then begin data.I['D'][2].M := 0; data.I['D'][2].Item := t[1]; end else
  151.         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
  152.         if  t[0] = 'M2Выход2' then begin data.I['D'][2].M := 2; data.I['D'][2].Item := t[1]; end else
  153.         if  t[0] = 'M3Выход2' then begin data.I['D'][2].M := 3; data.I['D'][2].Item := t[1]; end else
  154.         if  t[0] = 'В2К'  then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['D'][2].K) else
  155.         if  t[0] = 'Выход3'   then begin data.I['D'][3].M := 0; data.I['D'][3].Item := t[1]; end else
  156.         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
  157.         if  t[0] = 'M2Выход3' then begin data.I['D'][3].M := 2; data.I['D'][3].Item := t[1]; end else
  158.         if  t[0] = 'M3Выход3' then begin data.I['D'][3].M := 3; data.I['D'][3].Item := t[1]; end else
  159.         if  t[0] = 'В3К'  then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['D'][3].K) else
  160.         if  t[0] = 'Выход4'   then begin data.I['D'][4].M := 0; data.I['D'][4].Item := t[1]; end else
  161.         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
  162.         if  t[0] = 'M2Выход4' then begin data.I['D'][4].M := 2; data.I['D'][4].Item := t[1]; end else
  163.         if  t[0] = 'M3Выход4' then begin data.I['D'][4].M := 3; data.I['D'][4].Item := t[1]; end else
  164.         if  t[0] = 'В4К'  then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.I['D'][4].K) else
  165.         if  t[0] = 'Энергия' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.Energy) else
  166.         if  t[0] = 'Время' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.Time) else
  167.         if  t[0] = 'Напряжение' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.Current) else
  168.         if  t[0] = 'Теплоёмкость' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.Heat) else
  169.         if  t[0] = 'Ресурс'  then begin data.Resource.M := 0; data.Resource.Item := t[1]; end else
  170.         if (t[0] = 'MРесурс') or (t[0] = 'M1Ресурс') then begin data.Resource.M := 1; data.Resource.Item := t[1]; end else
  171.         if  t[0] = 'M2Ресурс'  then begin data.Resource.M := 2; data.Resource.Item := t[1]; end else
  172.         if  t[0] = 'M3Ресурс'  then begin data.Resource.M := 3; data.Resource.Item := t[1]; end else
  173.         if  t[0] = 'РК' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.Resource.K) else
  174.         if  t[0] = 'Топливо'  then begin data.Fuel.M := 0; data.Fuel.Item := t[1]; end else
  175.         if (t[0] = 'MТопливо') or (t[0] = 'M1Топливо') then begin data.Fuel.M := 1; data.Fuel.Item := t[1]; end else
  176.         if  t[0] = 'M2Топливо'  then begin data.Fuel.M := 2; data.Fuel.Item := t[1]; end else
  177.         if  t[0] = 'M3Топливо'  then begin data.Fuel.M := 3; data.Fuel.Item := t[1]; end else
  178.         if  t[0] = 'ТК' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.Fuel.K) else
  179.         if  t[0] = 'Доп'  then begin data.Add.M := 0; data.Add.Item := t[1]; end else
  180.         if (t[0] = 'MДоп') or (t[0] = 'M1Доп') then begin data.Add.M := 1; data.Add.Item := t[1]; end else
  181.         if  t[0] = 'M2Доп'  then begin data.Add.M := 2; data.Add.Item := t[1]; end else
  182.         if  t[0] = 'M3Доп'  then begin data.Add.M := 3; data.Add.Item := t[1]; end else
  183.         if  t[0] = 'ДК' then TryStrToInt(StringReplace(t[1],' ','',[rfReplaceAll]),data.Add.K);
  184.  
  185.       end;
  186.     // вычленение из напарсенного одинаковых элементов
  187.     end;
  188.     ts.Sorted := true;
  189.     ts.Duplicates := dupIgnore;
  190.     ts.Clear;
  191.     ts3.BeginUpdate;
  192.     ts.BeginUpdate;
  193.     s := '';
  194.     for i := 1 to 4 do                          // запись исходных материалов
  195.       for c := 'A' to 'C' do
  196.         if data.I[C][i].Item <> '' then
  197.           if data.I[C][i].M = 0 then
  198.           ts.Add('[['+data.I[C][i].Item+']]')   // для оригинальных предметов
  199.         else
  200.           ts.Add('[['+data.M[data.I[C][i].M]+'/'+data.I[C][i].Item+'|'+data.I[C][i].Item+']]');
  201.     ts.EndUpdate;
  202.     for i := 0 to ts.Count-2 do
  203.       s := s + ts[i] + ', <br />';
  204.     s := '|' +s+ ts[ts.Count-1];
  205.     ts.Sorted := false;
  206.     ts3.Add(s);
  207.  
  208.     ts3.Add('|{{'+data.grid);    // переписываем исходную сетку
  209.     for i := 1 to 3 do
  210.       if data.M[i] <> '' then
  211.         if i = 1 then
  212.           ts3.Add(format('|Мод=%s',[data.M[i]]))
  213.         else
  214.           ts3.Add(format('|Мод%d=%s',[i,data.M[i]]));        // записываем мод М М2 М3
  215.     for c := 'A' to 'D' do
  216.       for i := 1 to 4 do
  217.  
  218.         if data.I[c][i].Item <> '' then
  219.         begin
  220.           if data.I[c][i].M > 0 then
  221.           begin
  222.             s:= 'M';
  223.             if data.I[c][i].M > 1 then
  224.               s:='M'+inttostr(data.I[c][i].M);
  225.           end else s:='';
  226.           if c = 'D' then s3 := 'В' else s3 := c;           // Костыль - для колчиства Выход сокращение ВК
  227.           if data.I[c][i].K > 1 then
  228.             if data.I[c][i].short then                      // или В1К - зависит от исходного шаблона
  229.             s2 := '|'+s3+'К='+inttostr(data.I[c][i].K)
  230.             else
  231.             s2 := '|'+s3+inttostr(i)+'К='+inttostr(data.I[c][i].K)
  232.           else
  233.             s2 := '';
  234.           if c = 'D' then  s3 := 'Выход' else s3 := c;    // поле D оно же Выход
  235.           if not data.I[c][i].short then s3 := s3 + inttostr(i);
  236.  
  237.           ts3.Add(format('|%s%s=%s %s',[s,s3,data.I[c][i].Item,s2]));
  238.         end;
  239.   if data.Energy > 0 then ts3.Add(format('|Энергия=%d',[data.Energy]));
  240.   if data.Time > 0 then ts3.Add(format('|Время=%d',[data.Time]));
  241.   if data.Current > 0 then ts3.Add(format('|Напряжение=%d',[data.Current]));
  242.   if data.Heat > 0 then ts3.Add(format('|Теплоёмкость=%d',[data.Heat]));
  243.   s := '';
  244.   ts3.Add('}}');
  245.   ts.Clear;
  246.   ts.Sorted := true;
  247.   ts.Duplicates := dupIgnore;
  248.   c := 'D';
  249.   ts.BeginUpdate;
  250.   for i := 1 to 4 do                                 // запись итоговых материалов
  251.     if data.I[C][i].Item <> '' then
  252.       if data.I[C][i].M = 0 then
  253.         ts.Add('[['+data.I[C][i].Item+']]')
  254.       else
  255.         ts.Add('[['+data.M[data.I[C][i].M]+'/'+data.I[C][i].Item+'|'+data.I[C][i].Item+']]');
  256.   ts.EndUpdate;
  257.   ts.Sorted := false;
  258.   for i := 0 to ts.Count-2 do
  259.       s := s + ts[i] + ', <br />';
  260.     s := '|' +s+ ts[ts.Count-1];
  261.   ts3.Add(s);
  262.  
  263.   ts3.Add('|-');                    //отчеркнуть строку таблицы
  264.   ts3.EndUpdate;
  265.   Memo2.Text := ts3.Text;
  266.   finally
  267.      ts.Free;
  268.     ts2.Free;
  269.     ts3.Free;
  270.   end;
  271. end;
  272.  
  273. end.
RAW Paste Data