Einzelnen Beitrag anzeigen

davtix

Registriert seit: 29. Mai 2003
Ort: Berlin
87 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: HTML einlesen, Parsen und Einträge zählen

  Alt 21. Jun 2021, 16:31
Ziel, eine vorhandene Unit nach einem Quellcode durchsuchen (hier das gerade geschriebene Project selber ) und diesen in die Zwischenablage packen

ACHTUNG, nicht durchdacht, eher schnell hingetippselt. Funktioniert aber ...



auswahl in einem treeview ->
Code:

procedure TFormEinst.TreeView1DblClick(Sender: TObject);
type TproceArray    = Array of Array of string;
var node :TTreenode; myTreeView:TTreeView; pA: TproceArray; sT,eT :string;  indI, tempI :integer;
begin
  node := formeinst.TreeView1.Selected;
  myTreeView := formeinst.TreeView1;
  setlength(pA, 10,3);
  log(0, 'TV.Node: ' + node.Text );


  pA[0,0] :='copy_procedure_start';
  pA[0,1] :='procedure StarteProg( prog, P_DLL_DAT, para, user, U_DLL_DAT_PW : string; runAS, ADT, as_Thread, is_Thread :integer );';
  pA[0,2] :='end;// ENDE Procedure StarteProg //';

  pA[1,0]:= 'copy_function_GCP_array';
  pA[1,1]:= 'function GCP_array( RW , index : integer; wert1, wert2 :PChar ):string;';
  pA[1,2]:= 'end;  // function GCP_array ende';

  pA[2,0] := 'copy_TFormLOG_JvStringGrid1DrawCell';
  pA[2,1] := 'procedure TFormLOG.JvStringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);';
  pA[2,2] := 'end; //ende procedure TFormLOG.JvStringGrid1DrawCell';

  pA[3,0] := 'copy_procedure_EINSTELLUNG';
  pA[3,1] := 'procedure EINSTELLUNG( RW: integer; ObjName , wertS1, wertS2 :String; wertI, HalteOffen :integer );';
  pA[3,2] := 'end;   //procedure EINSTELLUNG end';

  pA[4,0] := 'copy_function_EINSTELLUNG_Records_IO';
  pA[4,1] := 'function EINSTELLUNG_Records_IO( func, s1, s2 :string):string;';
  pA[4,2] := 'end;//ende function EINSTELLUNG_Records_IO';

  pA[5,0] := 'copy_function_EINSTELLUNG_translate_WertS1';
  pA[5,1] := 'function EINSTELLUNG_translate_WertS1( s1 :string):string;';
  pA[5,2] := 'end;           //ende function EINSTELLUNG_translate_WertS1';

  pA[6,0] := 'copy_procedure_log';
  pA[6,1] := 'procedure log(svn: integer; msg :string );';
  pA[6,2] := 'end;//end procedure log';

// eintrag suchen

for indI := 0 to length( pA ) - 1 do
  begin
    if ( node.Text = pA[ indI,0] ) then
      begin
        tempI := indI;
        break;
      end;
  end;


  FormEinst.Memo2.Clear;
  Copy_Quellcodes( node.Text , pA[ tempI,1] , pA[ tempI , 2] );

end;

grundeinstellungen für parser setzen, treeview füllen usw. -->

Code:
Procedure Copy_Quellcodes( func, startTag, endTag :string );
var node :TTreenode; myTreeView:TTreeView;  indI:integer;
begin
log(1, 'Copy_Quellcodes-> func : ' + func + ' -> begin');
// PROBLEMCHEN ---> die Conditionen dürfen NICHT im zu durchsuchenden Dokument stehen <<<<<<<<<<<<<<
// date fup.pas laden - durchsuchen - inhalt is memo             or ( func = '00000000000000000')
  node := formeinst.TreeView1.Selected;
  myTreeView := formeinst.TreeView1;


if ( func = 'fill_treeview' ) then
  begin
    for indI := FormEinst.TreeView1.Items.Count - 1 downto 0 do
      begin
        node := formeinst.TreeView1.Items[ indI ];
        myTreeView.Items.Delete( node );
      end;

    node := myTreeView.Items.Add(nil, 'copy_procedure_start');
    node := myTreeView.Items.Add(nil, 'copy_function_GCP_array');
    node := myTreeView.Items.Add(nil, 'copy_procedure_EINSTELLUNG');
    myTreeView.Items.AddChild( node, 'copy_function_EINSTELLUNG_Records_IO');
    myTreeView.Items.AddChild( node, 'copy_function_EINSTELLUNG_translate_WertS1');
    node := myTreeView.Items.Add(nil, 'copy_procedure_log');

    node := myTreeView.Items.Add(nil, 'copy_TFormLOG_JvStringGrid1DrawCell');
  end;




if ( func = 'copy_procedure_start' ) or ( func = 'copy_function_GCP_array') or ( func = 'copy_procedure_EINSTELLUNG')
or ( func = 'copy_function_EINSTELLUNG_Records_IO') or ( func = 'copy_function_EINSTELLUNG_translate_WertS1') or ( func = 'copy_procedure_log') then
  begin
    // parser settings setzen
    Parser( 'set_PArrayZeilen', 1 );
    ParserArray[0,0] := 'E:\**********************\FuP.pas'; // pfad zur datei
    ParserArray[0,1] := 'FormEinst.Memo2'; // ausgabe element
    ParserArray[0,2] := '0'; // ergebnisvariante
    ParserArray[0,3] := '1'; // startTag und endTag mit einfügen 1/0

    //procedure_start suchstrings als
    ParserArray[1,0] := func;
    ParserArray[1,1] := startTag;
    ParserArray[1,2] := endTag ;

    Parser('parser_start',0);
  end;

if ( func = 'copy_TFormLOG_JvStringGrid1DrawCell' ) then
  begin
    // parser settings setzen
    Parser( 'set_PArrayZeilen', 1 );
    ParserArray[0,0] := 'E:\**********************\UnitLog.pas'; // pfad zur datei
    ParserArray[0,1] := 'FormEinst.Memo2'; // ausgabe element
    ParserArray[0,2] := '0'; // ergebnisvariante
    ParserArray[0,3] := '1'; // startTag und endTag mit einfügen 1/0

    //procedure_start suchstrings als
    ParserArray[1,0] := 'copy_procedure_start';
    ParserArray[1,1] := startTag;
    ParserArray[1,2] := endTag ;

    Parser('parser_start',0);
  end;

log(1,'Copy_Quellcodes-> func : ' + func + ' -> end');
end;
parser parameter setzen -->

Code:

function Parser( func: string; PArrayZeilen: integer ):string;
var indI : integer;
begin
// zeile 0 sind die einstellungen für den Parser
// 0 = pfad zur datei, 1 = ausgabeelement bsp:memo1 , 2 ausgabevariante, 3 = startTag und endTag mit einfügen 1/0
// array dynamischer inhalt 0 = Key, 1 = starttag, 2 = endtag;

if ( func = 'set_PArrayZeilen' ) and ( PArrayZeilen <> 0 ) then
  begin
    setlength( ParserArray , PArrayZeilen + 1, 5 );
    log(0,'Parser->set_PArrayZeilen: ' + inttostr( length(ParserArray) ));
  end;


if ( func = 'parser_start' ) and ( length( ParserArray ) > 1 ) then
  begin
    // zum lesen kann der parser direkt von datei lesen
    form1.JvHTMLParser1.FileName := ParserArray[0,0];     // pfad zur datei

    //parser suchstrings
    form1.JvHtmlParser1.ClearConditions;



    for indI := 1 to length(ParserArray) - 1 do
      begin
        form1.JvHtmlParser1.AddCondition( ParserArray[indi,0] , ParserArray[indi,1] , ParserArray[indi,2] , strtoint(ParserArray[0,2]) );
        log(0,'Parser->AddCondition->startT->' + ParserArray[indi,1] );
        log(0,'Parser->AddCondition->endT->' + ParserArray[indi,2] );
      end;

    //parser starten
    form1.JvHtmlParser1.AnalyseFile;  log(0,'Parser1.AnalyseFile');
  end;
end;

ergebnisse -->
Code:

procedure TForm1.JvHTMLParser1KeyFound(Sender: TObject; Key, Results,
  OriginalLine: string);
var indI :integer; compo : Tcomponent;
begin
  //ausgabe element suchen wenn vorhanden
  if ( ParserArray[0,1] <> '' ) then      // 1 = ausgabeelement bsp:memo1
    begin
      compo := nil;
      compo := FindComponentEx( ParserArray[0,1] );
      if ( compo <> nil ) then
        begin
          log(0,'Form1.JvHTMLParser1KeyFound->compo found');
        end else
        begin
          log(9,'Form1.JvHTMLParser1KeyFound->ERROR');
          EXIT;
        end;
    end;

  // arrayzeilen ermitteln

  for indI := 1 to length(ParserArray) - 1 do
    begin
      log(0,'Form1.JvHTMLParser1KeyFound->durchgang: ' + inttostr( indi ) +' key:' + ParserArray[indi,0] );

      if ( compo.ClassType = TMemo ) and ( key = ParserArray[indi,0] ) then
        begin
          log(0,'Form1.JvHTMLParser1KeyFound->key found');
          //startTag und endTag mit einfügen 1/0
          if ( ParserArray[0,3] = '1' ) then TMemo( compo ).lines.add( ParserArray[indi,1] );

          TMemo( compo ).lines.add( results );

          //startTag und endTag mit einfügen 1/0
          if ( ParserArray[0,3] = '1' ) then TMemo( compo ).lines.add( ParserArray[indi,2] );

          {zur ersten Zeile:}
          TMemo( compo ).Perform(EM_LineScroll, 0 , - TMemo( compo ).Lines.Count-1);

        end;



    end;
end;

schreiben wenn fertig -->

Code:
procedure TForm1.JvHTMLParser1KeyFoundEx(Sender: TObject; Key, Results,
  OriginalLine: string; TagInfo: TTagInfo; Attributes: TStrings);
  var compo : Tcomponent;
begin
// im array schreiben fertig
  log(0,'Form1.JvHTMLParser1KeyFoundEx->Parser Done');
  if ( ParserArray[0,1] <> '' ) then      // 1 = ausgabeelement bsp:memo1
    begin
      compo := nil;
      compo := FindComponentEx( ParserArray[0,1] );
      if ( compo <> nil ) then
        begin
          log(0,'Form1.JvHTMLParser1KeyFoundEx->compo found');

          clipboard.AsText := TMemo( compo ).Text;
        end else
        begin
          log(9,'Form1.JvHTMLParser1KeyFoundEx->ERROR');
          EXIT;
        end;
    end;
end;
  Mit Zitat antworten Zitat