// MpuExtractLinksFromTextFileCls - Klasse zum extrahieren von Links aus Textdateien
// Michael Puff [http://www.michael-puff.de]
// 2011-02-22

unit MpuExtractLinksFromTextFileCls;

interface

uses
  Contnrs, Classes, SysUtils, StrUtils, Dialogs;


type
  TLinkObj = class(TObject)
  public
    RawLink: AnsiString;
    HREF: AnsiString;
    Caption: AnsiString;
  end;


type
  TOnRawLinkFound = procedure(Sender: TObject; Link: AnsiString) of object;
  TOnCaptionFound = procedure(Sender: TObject; Caption: AnsiString) of object;
  TOnHREFFound = procedure(Sender: TObject; HREF: AnsiString) of object;
  TExtractLinksFromTextFile = class(TObject)
  private
    FFilename: AnsiString;
    FLinkList: TObjectList;
    FOnRawLinkFound: TOnRawLinkFound;
    FOnCaptionFound: TOnCaptionFound;
    FOnHREFFound: TOnHREFFound;
    procedure GetRawLinks;
    procedure GetHREF;
    procedure GetCaption;
  public
    property Filename: AnsiString read FFilename write FFilename;
    property LinkList: TObjectList read FLinkList;
    property OnRawLinkFound: TOnRawLinkFound read FOnRawLinkFound write FOnRawLinkFound;
    property OnCaptionFound: TOnCaptionFound read FOnCaptionFound write FOnCaptionFound;
    property OnHREFFound: TOnHREFFound read FOnHREFFound write FOnHREFFound;
    constructor Create;
    destructor Destroy; override;
    procedure ExtractLinks;
  end;

implementation

{ TExtractLinksFromTextFile }

constructor TExtractLinksFromTextFile.Create;
begin
  FLinkList := TObjectList.Create;
end;

destructor TExtractLinksFromTextFile.Destroy;
begin
  FLinkList.Free;
end;

procedure TExtractLinksFromTextFile.ExtractLinks;
begin
  try
    GetRawLinks;
    GetHREF;
    GetCaption;
  except
    raise
  end;
end;

procedure TExtractLinksFromTextFile.GetCaption;
var
  i: Integer;
  RawLink: AnsiString;
  StartPos: Integer;
  EndPos: Integer;
  Caption: AnsiString;
begin
  for i := 0 to FLinkList.Count - 1 do
  begin
    RawLink := TLinkObj(FLinkList.Items[i]).RawLink;
    StartPos := Pos(AnsiLowerCase('">'), AnsiLowerCase(RawLink));
    EndPos := PosEx(AnsiLowerCase('</A>'), AnsiLowerCase(RawLink), StartPos + 1);
    Caption := copy(RawLink, StartPos + 2, EndPos - StartPos - 2);
    TLinkObj(FLinkList.Items[i]).Caption := Caption;
    if Assigned(OnCaptionFound) then
      OnCaptionFound(Self, Caption);
  end;
end;

procedure TExtractLinksFromTextFile.GetHREF;
var
  i: Integer;
  RawLink: AnsiString;
  StartPos: Integer;
  EndPos: Integer;
  HREF: AnsiString;
begin
  for i := 0 to FLinkList.Count - 1 do
  begin
    RawLink := TLinkObj(FLinkList.Items[i]).RawLink;
    StartPos := Pos('"', RawLink);
    EndPos := PosEx('"', RawLink, StartPos + 1);
    HREF := copy(RawLink, StartPos + 1, EndPos - StartPos - 1);
    TLinkObj(FLinkList.Items[i]).HREF := HREF;
    if Assigned(OnHREFFound) then
      OnHREFFound(Self, HREF);
  end;
end;

procedure TExtractLinksFromTextFile.GetRawLinks;
var
  sl: TStringList;
  i: Integer;
  StartPos: Integer;
  EndPos: Integer;
  RawLink: AnsiString;
  LinkObj: TLinkObj;
begin
  sl := TStringList.Create;
  try
    try
      sl.LoadFromFile(FFilename);
      for i := 0 to sl.Count - 1 do
      begin
        StartPos := Pos(AnsiLowerCase('<A HREF'), AnsiLowerCase(sl[i]));
        EndPos := PosEx(AnsiLowerCase('A>'), AnsiLowercase(sl[i]), StartPos);
        if (StartPos > 0) and (EndPos > StartPos) then
        begin
          RawLink := copy(sl[i], StartPos, EndPos - StartPos + 2);
          LinkObj := TLinkObj.Create;
          LinkObj.RawLink := RawLink;
          FLinkList.Add(LinkObj);
          if Assigned(OnRawLinkFound) then
            OnRawLinkFound(Self, RawLink);
        end;
      end;
    except
      raise;
    end;
  finally
    sl.Free;
  end;
end;

end.


