HyperLinksDecorator.pas
上传用户:yjb1804
上传日期:2021-01-30
资源大小:3105k
文件大小:5k
源码类别:

Email服务器

开发平台:

Delphi

  1. {$B-}
  2. unit HyperLinksDecorator;
  3. {
  4.  Functions to 'decorate' hyper-links
  5.    (search for URLs and e-mails and replace 
  6.     them with appropriate HTML-links).
  7.  Uses TRegExpr library.
  8.  (c) 2002 Andrey V. Sorokin, Saint Petersburg, Russia
  9.   mailto:anso@mail.ru
  10.   http://www.RegExpStudio.com
  11.  v. 0.101 2002.08.30 
  12.   -=- (-) Missed closing tag </a>
  13.  Note:
  14.   This functions have to be optimized - they construct result strings
  15.   with step by step concatenation that can take a lot of resources while
  16.   processing big input texts with many hyper links.
  17. }
  18. interface
  19. uses
  20.  RegExpr;
  21. type
  22. TDecorateURLsFlags = (
  23.  // describes, which parts of hyper-link must be included
  24.  // into VISIBLE part of the link:
  25.   durlProto, // Protocol (like 'ftp://' or 'http://')
  26.   durlAddr,  // TCP address or domain name (like 'RegExpStudio.com')
  27.   durlPort,  // Port number if specified (like ':8080')
  28.   durlPath,  // Path to document (like 'index.html')
  29.   durlBMark, // Book mark (like '#mark')
  30.   durlParam  // URL params (like '?ID=2&User=13')
  31.  );
  32. TDecorateURLsFlagSet = set of TDecorateURLsFlags;
  33. function DecorateURLs (
  34.  // can find hyper links like 'http://...' or 'ftp://..'
  35.  // as well as links without protocol, but start with 'www.'
  36.  const AText : string;
  37.  // Input text to find hyper-links
  38.   AFlags : TDecorateURLsFlagSet = [durlAddr, durlPath]
  39.  // Which part of hyper-links found must be included into visible
  40.  // part of URL, for example if [durlAddr] then hyper link
  41.  // 'www.RegExpStudio.com/contacts.html' will be decorated as
  42.  // '<a href="http://www.RegExpStudio.com/contacts.html">www.RegExpStudio.com</a>'
  43.   ) : string;
  44.  // Returns input text with decorated hyper links
  45. function DecorateEMails (
  46.  // Replaces all syntax correct e-mails
  47.  // with '<a href="mailto:ADDR">ADDR</a>'
  48.  // For example, replaces 'anso@mail.ru'
  49.  // with '<a href="mailto:anso@mail.ru">anso@mail.ru</a>'.
  50.  const AText : string
  51.  // Input text to find e-mails
  52.   ) : string;
  53.  // Returns input text with decorated e-mails
  54. implementation
  55. uses
  56.  SysUtils; // we are using AnsiCompareText
  57. function DecorateURLs (const AText : string;
  58.   AFlags : TDecorateURLsFlagSet = [durlAddr, durlPath]
  59.   ) : string; 
  60. const 
  61.   URLTemplate = 
  62.    '(?i)' 
  63.    + '(' 
  64.    + '(FTP|HTTP)://'             // Protocol 
  65.    + '|www.)'                   // trick to catch links without
  66.                                  // protocol - by detecting of starting 'www.'
  67.    + '([wd-]+(.[wd-]+)+)' // TCP addr or domain name
  68.    + '(:dd?d?d?d?)?'        // port number
  69.    + '(((/[%+wd-\.]*)+)*)'  // unix path
  70.    + '(?[^s=&]+=[^s=&]+(&[^s=&]+=[^s=&]+)*)?'
  71.                                  // request (GET) params
  72.    + '(#[wd-%+]+)?';          // bookmark
  73. var
  74.   PrevPos : integer;
  75.   s, Proto, Addr, HRef : string;
  76. begin
  77.   Result := ''; 
  78.   PrevPos := 1; 
  79.   with TRegExpr.Create do try 
  80.      Expression := URLTemplate; 
  81.      if Exec (AText) then 
  82.       REPEAT 
  83.         s := ''; 
  84.         if AnsiCompareText (Match [1], 'www.') = 0 then begin
  85.            Proto := 'http://';
  86.            Addr := Match [1] + Match [3];
  87.            HRef := Proto + Match [0];
  88.           end
  89.          else begin
  90.            Proto := Match [1];
  91.            Addr := Match [3];
  92.            HRef := Match [0];
  93.           end;
  94.         if durlProto in AFlags
  95.          then s := s + Proto;
  96.         if durlAddr in AFlags
  97.          then s := s + Addr;
  98.         if durlPort in AFlags
  99.          then s := s + Match [5];
  100.         if durlPath in AFlags
  101.          then s := s + Match [6];
  102.         if durlParam in AFlags
  103.          then s := s + Match [9];
  104.         if durlBMark in AFlags
  105.          then s := s + Match [11];
  106.         Result := Result + System.Copy (AText, PrevPos,
  107.          MatchPos [0] - PrevPos) + '<a href="' + HRef + '">' + s + '</a>'; //###0.101
  108.         PrevPos := MatchPos [0] + MatchLen [0];
  109.       UNTIL not ExecNext;
  110.      Result := Result + System.Copy (AText, PrevPos, MaxInt); // Tail
  111.     finally Free;
  112.    end;
  113. end; { of function DecorateURLs
  114. --------------------------------------------------------------}
  115. function DecorateEMails (const AText : string) : string;
  116.  const
  117.   MailTemplate =
  118.    '[_a-zA-Zd-.]+@[_a-zA-Zd-]+(.[_a-zA-Zd-]+)+';
  119.  var
  120.   PrevPos : integer;
  121.  begin
  122.   Result := '';
  123.   PrevPos := 1;
  124.   with TRegExpr.Create do try
  125.      Expression := MailTemplate;
  126.      if Exec (AText) then
  127.       REPEAT
  128.         Result := Result + System.Copy (AText, PrevPos,
  129.          MatchPos [0] - PrevPos) + '<a href="mailto:' + Match [0] + '">' + Match [0] + '</a>';
  130.         PrevPos := MatchPos [0] + MatchLen [0];
  131.       UNTIL not ExecNext;
  132.      Result := Result + System.Copy (AText, PrevPos, MaxInt); // Tail
  133.     finally Free;
  134.    end;
  135.  end; { of function DecorateEMails
  136. --------------------------------------------------------------}
  137. end.