Hex Artifact Content
Not logged in

Artifact dc40445bdd5200d3e11fff9ed31a04f7e9b93cae:


0000: 75 6e 69 74 20 55 5f 48 54 4d 4c 54 61 67 46 69  unit U_HTMLTagFi
0010: 6e 64 65 72 3b 0d 0a 0d 0a 69 6e 74 65 72 66 61  nder;....interfa
0020: 63 65 0d 0a 20 20 75 73 65 73 0d 0a 20 20 20 20  ce..  uses..    
0030: 4e 70 70 53 69 6d 70 6c 65 4f 62 6a 65 63 74 73  NppSimpleObjects
0040: 3b 0d 0a 0d 0a 20 20 70 72 6f 63 65 64 75 72 65  ;....  procedure
0050: 20 46 69 6e 64 4d 61 74 63 68 69 6e 67 54 61 67   FindMatchingTag
0060: 28 41 53 65 6c 65 63 74 3a 20 62 6f 6f 6c 65 61  (ASelect: boolea
0070: 6e 20 3d 20 46 61 6c 73 65 3b 20 41 43 6f 6e 74  n = False; ACont
0080: 65 6e 74 73 4f 6e 6c 79 3a 20 42 6f 6f 6c 65 61  entsOnly: Boolea
0090: 6e 20 3d 20 46 61 6c 73 65 29 3b 0d 0a 0d 0a 2f  n = False);..../
00a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
00b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
00c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
00d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
00e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
00f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0100: 2f 2f 2f 0d 0a 69 6d 70 6c 65 6d 65 6e 74 61 74  ///..implementat
0110: 69 6f 6e 0d 0a 0d 0a 75 73 65 73 0d 0a 20 20 53  ion....uses..  S
0120: 79 73 55 74 69 6c 73 2c 20 57 69 6e 64 6f 77 73  ysUtils, Windows
0130: 2c 20 43 6c 61 73 73 65 73 2c 0d 0a 2f 2f 20 20  , Classes,..//  
0140: 4c 5f 44 65 62 75 67 4c 6f 67 67 65 72 2c 0d 0a  L_DebugLogger,..
0150: 20 20 4e 70 70 50 6c 75 67 69 6e 43 6f 6e 73 74    NppPluginConst
0160: 61 6e 74 73 2c 20 4e 70 70 53 63 69 6e 74 69 6c  ants, NppScintil
0170: 6c 61 43 6f 6e 73 74 61 6e 74 73 3b 0d 0a 0d 0a  laConstants;....
0180: 74 79 70 65 0d 0a 20 20 54 44 69 72 65 63 74 69  type..  TDirecti
0190: 6f 6e 45 6e 75 6d 20 3d 20 28 64 69 72 42 61 63  onEnum = (dirBac
01a0: 6b 77 61 72 64 20 3d 20 2d 31 2c 20 64 69 72 4e  kward = -1, dirN
01b0: 6f 6e 65 20 3d 20 30 2c 20 64 69 72 46 6f 72 77  one = 0, dirForw
01c0: 61 72 64 20 3d 20 31 2c 20 64 69 72 55 6e 6b 6e  ard = 1, dirUnkn
01d0: 6f 77 6e 20 3d 20 32 29 3b 0d 0a 0d 0a 63 6f 6e  own = 2);....con
01e0: 73 74 0d 0a 20 20 73 63 50 54 69 74 6c 65 3a 20  st..  scPTitle: 
01f0: 50 43 68 61 72 20 3d 20 27 28 58 7c 48 54 29 4d  PChar = '(X|HT)M
0200: 4c 54 61 67 20 50 6c 75 67 69 6e 27 3b 0d 0a 20  LTag Plugin';.. 
0210: 20 6e 63 48 69 67 68 6c 69 67 68 74 54 69 6d 65   ncHighlightTime
0220: 6f 75 74 20 3d 20 31 30 30 30 3b 0d 0a 20 20 73  out = 1000;..  s
0230: 63 53 65 6c 66 43 6c 6f 73 69 6e 67 54 61 67 73  cSelfClosingTags
0240: 3a 20 61 72 72 61 79 5b 30 2e 2e 31 32 5d 20 6f  : array[0..12] o
0250: 66 20 73 74 72 69 6e 67 20 3d 20 28 27 41 52 45  f string = ('ARE
0260: 41 27 2c 20 27 42 41 53 45 27 2c 20 27 42 41 53  A', 'BASE', 'BAS
0270: 45 46 4f 4e 54 27 2c 20 27 42 52 27 2c 20 27 43  EFONT', 'BR', 'C
0280: 4f 4c 27 2c 20 27 46 52 41 4d 45 27 2c 0d 0a 20  OL', 'FRAME',.. 
0290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 27                 '
02c0: 48 52 27 2c 20 27 49 4d 47 27 2c 20 27 49 4e 50  HR', 'IMG', 'INP
02d0: 55 54 27 2c 20 27 49 53 49 4e 44 45 58 27 2c 20  UT', 'ISINDEX', 
02e0: 27 4c 49 4e 4b 27 2c 20 27 4d 45 54 41 27 2c 0d  'LINK', 'META',.
02f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0320: 20 27 50 41 52 41 4d 27 29 3b 0d 0a 0d 0a 0d 0a   'PARAM');......
0330: 7b 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  { --------------
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0390: 2d 2d 20 7d 0d 0a 66 75 6e 63 74 69 6f 6e 20 45  -- }..function E
03a0: 78 74 72 61 63 74 54 61 67 4e 61 6d 65 28 41 56  xtractTagName(AV
03b0: 69 65 77 3a 20 54 41 63 74 69 76 65 44 6f 63 75  iew: TActiveDocu
03c0: 6d 65 6e 74 3b 0d 0a 20 20 20 20 20 20 20 20 20  ment;..         
03d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
03e0: 75 74 20 41 54 61 67 4e 61 6d 65 3a 20 73 74 72  ut ATagName: str
03f0: 69 6e 67 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ing;..          
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 75                ou
0410: 74 20 41 4f 70 65 6e 69 6e 67 2c 20 41 43 6c 6f  t AOpening, AClo
0420: 73 69 6e 67 3a 20 62 6f 6f 6c 65 61 6e 3b 0d 0a  sing: boolean;..
0430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0440: 20 20 20 20 20 20 20 20 41 50 6f 73 69 74 69 6f          APositio
0450: 6e 3a 20 69 6e 74 65 67 65 72 20 3d 20 2d 31 29  n: integer = -1)
0460: 3a 20 54 54 65 78 74 52 61 6e 67 65 3b 0d 0a 76  : TTextRange;..v
0470: 61 72 0d 0a 20 20 7b 54 61 67 2c 20 7d 54 61 67  ar..  {Tag, }Tag
0480: 45 6e 64 3a 20 54 54 65 78 74 52 61 6e 67 65 3b  End: TTextRange;
0490: 0d 0a 20 20 69 3a 20 49 6e 74 65 67 65 72 3b 0d  ..  i: Integer;.
04a0: 0a 20 20 53 74 61 72 74 49 6e 64 65 78 3a 20 69  .  StartIndex: i
04b0: 6e 74 65 67 65 72 3b 0d 0a 20 20 45 6e 64 49 6e  nteger;..  EndIn
04c0: 64 65 78 3a 20 69 6e 74 65 67 65 72 3b 0d 0a 20  dex: integer;.. 
04d0: 20 7b 49 6e 6e 65 72 4c 65 76 65 6c 3a 20 69 6e   {InnerLevel: in
04e0: 74 65 67 65 72 3b 7d 0d 0a 20 20 43 6c 6f 73 75  teger;}..  Closu
04f0: 72 65 46 6f 75 6e 64 3a 20 62 6f 6f 6c 65 61 6e  reFound: boolean
0500: 3b 0d 0a 20 20 45 78 74 72 61 43 68 61 72 3a 20  ;..  ExtraChar: 
0510: 63 68 61 72 3b 0d 0a 62 65 67 69 6e 0d 0a 20 20  char;..begin..  
0520: 41 54 61 67 4e 61 6d 65 20 3a 3d 20 27 27 3b 0d  ATagName := '';.
0530: 0a 0d 0a 20 20 69 66 20 28 41 50 6f 73 69 74 69  ...  if (APositi
0540: 6f 6e 20 3c 20 30 29 20 74 68 65 6e 20 62 65 67  on < 0) then beg
0550: 69 6e 0d 0a 20 20 20 20 69 66 20 28 41 56 69 65  in..    if (AVie
0560: 77 2e 43 75 72 72 65 6e 74 50 6f 73 69 74 69 6f  w.CurrentPositio
0570: 6e 20 3c 3d 20 41 56 69 65 77 2e 53 65 6c 65 63  n <= AView.Selec
0580: 74 69 6f 6e 2e 41 6e 63 68 6f 72 29 20 74 68 65  tion.Anchor) the
0590: 6e 20 62 65 67 69 6e 0d 0a 20 20 20 20 20 20 41  n begin..      A
05a0: 50 6f 73 69 74 69 6f 6e 20 3a 3d 20 41 56 69 65  Position := AVie
05b0: 77 2e 43 75 72 72 65 6e 74 50 6f 73 69 74 69 6f  w.CurrentPositio
05c0: 6e 20 2b 20 31 3b 0d 0a 20 20 20 20 65 6e 64 20  n + 1;..    end 
05d0: 65 6c 73 65 20 62 65 67 69 6e 0d 0a 20 20 20 20  else begin..    
05e0: 20 20 41 50 6f 73 69 74 69 6f 6e 20 3a 3d 20 41    APosition := A
05f0: 56 69 65 77 2e 43 75 72 72 65 6e 74 50 6f 73 69  View.CurrentPosi
0600: 74 69 6f 6e 3b 0d 0a 20 20 20 20 65 6e 64 3b 0d  tion;..    end;.
0610: 0a 20 20 65 6e 64 3b 0d 0a 20 20 52 65 73 75 6c  .  end;..  Resul
0620: 74 20 3a 3d 20 41 56 69 65 77 2e 46 69 6e 64 28  t := AView.Find(
0630: 27 3c 27 2c 20 30 2c 20 41 50 6f 73 69 74 69 6f  '<', 0, APositio
0640: 6e 2c 20 30 29 3b 0d 0a 20 20 69 66 20 52 65 73  n, 0);..  if Res
0650: 75 6c 74 20 3d 20 6e 69 6c 20 74 68 65 6e 20 62  ult = nil then b
0660: 65 67 69 6e 0d 0a 2f 2f 20 20 20 20 44 65 62 75  egin..//    Debu
0670: 67 57 72 69 74 65 28 27 45 78 74 72 61 63 74 54  gWrite('ExtractT
0680: 61 67 4e 61 6d 65 27 2c 20 27 4e 6f 20 73 74 61  agName', 'No sta
0690: 72 74 20 74 61 67 20 66 6f 75 6e 64 20 62 65 66  rt tag found bef
06a0: 6f 72 65 20 67 69 76 65 6e 20 70 6f 73 69 74 69  ore given positi
06b0: 6f 6e 21 27 29 3b 0d 0a 20 20 20 20 52 65 73 75  on!');..    Resu
06c0: 6c 74 20 3a 3d 20 41 56 69 65 77 2e 46 69 6e 64  lt := AView.Find
06d0: 28 27 3c 27 2c 20 30 2c 20 41 50 6f 73 69 74 69  ('<', 0, APositi
06e0: 6f 6e 29 3b 0d 0a 20 20 20 20 69 66 20 52 65 73  on);..    if Res
06f0: 75 6c 74 20 3d 20 6e 69 6c 20 74 68 65 6e 20 62  ult = nil then b
0700: 65 67 69 6e 0d 0a 20 20 20 20 20 20 41 54 61 67  egin..      ATag
0710: 4e 61 6d 65 20 3a 3d 20 27 27 3b 0d 0a 20 20 20  Name := '';..   
0720: 20 20 20 45 78 69 74 3b 0d 0a 20 20 20 20 65 6e     Exit;..    en
0730: 64 3b 0d 0a 20 20 65 6e 64 3b 0d 0a 0d 0a 20 20  d;..  end;....  
0740: 2f 2f 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66  // Keep track of
0750: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 27 3c   intermediate '<
0760: 27 20 61 6e 64 20 27 3e 27 20 6c 65 76 65 6c 73  ' and '>' levels
0770: 2c 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20  , to accomodate 
0780: 3c 3f 50 48 50 3f 3e 20 61 6e 64 20 3c 25 41 53  <?PHP?> and <%AS
0790: 50 25 3e 20 74 61 67 73 0d 0a 20 20 7b 49 6e 6e  P%> tags..  {Inn
07a0: 65 72 4c 65 76 65 6c 20 3a 3d 20 30 3b 7d 0d 0a  erLevel := 0;}..
07b0: 0d 0a 20 20 2f 2f 20 54 4f 44 4f 3a 20 73 65 61  ..  // TODO: sea
07c0: 72 63 68 20 66 6f 72 20 27 3c 27 20 61 73 20 77  rch for '<' as w
07d0: 65 6c 6c 20 61 73 20 27 3e 27 3b 0d 0a 20 20 2f  ell as '>';..  /
07e0: 2f 20 2d 20 69 66 20 27 3c 27 20 69 73 20 62 65  / - if '<' is be
07f0: 66 6f 72 65 20 27 3e 27 2c 20 74 68 65 6e 20 49  fore '>', then I
0800: 6e 6e 65 72 4c 65 76 65 6c 20 3a 3d 20 49 6e 6e  nnerLevel := Inn
0810: 65 72 4c 65 76 65 6c 20 2b 20 31 3b 0d 0a 20 20  erLevel + 1;..  
0820: 2f 2f 20 2d 20 65 6c 73 65 20 28 69 66 20 27 3e  // - else (if '>
0830: 27 20 69 73 20 62 65 66 6f 72 65 20 27 3c 27 2c  ' is before '<',
0840: 20 74 68 65 6e 29 0d 0a 20 20 2f 2f 20 20 20 2d   then)..  //   -
0850: 20 69 66 20 49 6e 6e 65 72 4c 65 76 65 6c 20 3e   if InnerLevel >
0860: 20 30 20 74 68 65 6e 20 49 6e 6e 65 72 4c 65 76   0 then InnerLev
0870: 65 6c 20 3a 3d 20 49 6e 6e 65 72 4c 65 76 65 6c  el := InnerLevel
0880: 20 2d 20 31 3b 0d 0a 20 20 2f 2f 20 20 20 2d 20   - 1;..  //   - 
0890: 65 6c 73 65 20 54 61 67 45 6e 64 20 68 61 73 20  else TagEnd has 
08a0: 62 65 65 6e 20 66 6f 75 6e 64 0d 0a 0d 0a 20 20  been found....  
08b0: 2f 2f 44 65 62 75 67 57 72 69 74 65 28 27 45 78  //DebugWrite('Ex
08c0: 74 72 61 63 74 54 61 67 4e 61 6d 65 27 2c 20 46  tractTagName', F
08d0: 6f 72 6d 61 74 28 27 53 74 61 72 74 20 6f 66 20  ormat('Start of 
08e0: 74 61 67 3a 20 28 25 64 2d 25 64 29 3a 20 22 25  tag: (%d-%d): "%
08f0: 73 22 27 2c 20 5b 54 61 67 2e 53 74 61 72 74 2c  s"', [Tag.Start,
0900: 20 54 61 67 2e 26 45 6e 64 2c 20 54 61 67 2e 54   Tag.&End, Tag.T
0910: 65 78 74 5d 29 29 3b 0d 0a 20 20 54 61 67 45 6e  ext]));..  TagEn
0920: 64 20 3a 3d 20 41 56 69 65 77 2e 46 69 6e 64 28  d := AView.Find(
0930: 27 3e 27 2c 20 30 2c 20 52 65 73 75 6c 74 2e 45  '>', 0, Result.E
0940: 6e 64 50 6f 73 20 2b 20 31 29 3b 0d 0a 20 20 69  ndPos + 1);..  i
0950: 66 20 54 61 67 45 6e 64 20 3d 20 6e 69 6c 20 74  f TagEnd = nil t
0960: 68 65 6e 20 62 65 67 69 6e 0d 0a 20 20 20 20 41  hen begin..    A
0970: 54 61 67 4e 61 6d 65 20 3a 3d 20 27 27 3b 0d 0a  TagName := '';..
0980: 20 20 20 20 45 78 69 74 3b 0d 0a 20 20 65 6e 64      Exit;..  end
0990: 20 65 6c 73 65 20 62 65 67 69 6e 0d 0a 20 20 20   else begin..   
09a0: 20 2f 2f 44 65 62 75 67 57 72 69 74 65 28 27 45   //DebugWrite('E
09b0: 78 74 72 61 63 74 54 61 67 4e 61 6d 65 27 2c 20  xtractTagName', 
09c0: 46 6f 72 6d 61 74 28 27 45 6e 64 20 6f 66 20 74  Format('End of t
09d0: 61 67 3a 20 28 25 64 2d 25 64 29 3a 20 22 25 73  ag: (%d-%d): "%s
09e0: 22 27 2c 20 5b 54 61 67 45 6e 64 2e 53 74 61 72  "', [TagEnd.Star
09f0: 74 2c 20 54 61 67 45 6e 64 2e 26 45 6e 64 2c 20  t, TagEnd.&End, 
0a00: 54 61 67 45 6e 64 2e 54 65 78 74 5d 29 29 3b 0d  TagEnd.Text]));.
0a10: 0a 20 20 20 20 52 65 73 75 6c 74 2e 45 6e 64 50  .    Result.EndP
0a20: 6f 73 20 3a 3d 20 54 61 67 45 6e 64 2e 45 6e 64  os := TagEnd.End
0a30: 50 6f 73 3b 0d 0a 20 20 20 20 46 72 65 65 41 6e  Pos;..    FreeAn
0a40: 64 4e 69 6c 28 54 61 67 45 6e 64 29 3b 0d 0a 20  dNil(TagEnd);.. 
0a50: 20 65 6e 64 3b 0d 0a 0d 0a 20 20 2f 2f 20 44 65   end;....  // De
0a60: 74 65 72 6d 69 6e 65 20 74 68 65 20 74 61 67 20  termine the tag 
0a70: 6e 61 6d 65 2c 20 61 6e 64 20 77 68 65 74 68 65  name, and whethe
0a80: 72 20 69 74 27 73 20 61 6e 20 6f 70 65 6e 69 6e  r it's an openin
0a90: 67 20 61 6e 64 2f 6f 72 20 63 6c 6f 73 69 6e 67  g and/or closing
0aa0: 20 74 61 67 0d 0a 20 20 41 4f 70 65 6e 69 6e 67   tag..  AOpening
0ab0: 20 3a 3d 20 54 72 75 65 3b 0d 0a 20 20 41 43 6c   := True;..  ACl
0ac0: 6f 73 69 6e 67 20 3a 3d 20 46 61 6c 73 65 3b 0d  osing := False;.
0ad0: 0a 20 20 43 6c 6f 73 75 72 65 46 6f 75 6e 64 20  .  ClosureFound 
0ae0: 3a 3d 20 46 61 6c 73 65 3b 0d 0a 20 20 53 74 61  := False;..  Sta
0af0: 72 74 49 6e 64 65 78 20 3a 3d 20 30 3b 0d 0a 20  rtIndex := 0;.. 
0b00: 20 45 6e 64 49 6e 64 65 78 20 3a 3d 20 30 3b 0d   EndIndex := 0;.
0b10: 0a 20 20 41 54 61 67 4e 61 6d 65 20 3a 3d 20 52  .  ATagName := R
0b20: 65 73 75 6c 74 2e 54 65 78 74 3b 0d 0a 20 20 45  esult.Text;..  E
0b30: 78 74 72 61 43 68 61 72 20 3a 3d 20 23 30 3b 0d  xtraChar := #0;.
0b40: 0a 20 20 66 6f 72 20 69 20 3a 3d 20 32 20 74 6f  .  for i := 2 to
0b50: 20 4c 65 6e 67 74 68 28 41 54 61 67 4e 61 6d 65   Length(ATagName
0b60: 29 20 2d 20 31 20 64 6f 20 62 65 67 69 6e 0d 0a  ) - 1 do begin..
0b70: 20 20 20 20 69 66 20 53 74 61 72 74 49 6e 64 65      if StartInde
0b80: 78 20 3d 20 30 20 74 68 65 6e 20 62 65 67 69 6e  x = 0 then begin
0b90: 0d 0a 20 20 20 20 20 20 63 61 73 65 20 41 54 61  ..      case ATa
0ba0: 67 4e 61 6d 65 5b 69 5d 20 6f 66 0d 0a 20 20 20  gName[i] of..   
0bb0: 20 20 20 20 20 27 2f 27 3a 20 62 65 67 69 6e 0d       '/': begin.
0bc0: 0a 20 20 20 20 20 20 20 20 20 20 41 4f 70 65 6e  .          AOpen
0bd0: 69 6e 67 20 3a 3d 20 46 61 6c 73 65 3b 0d 0a 20  ing := False;.. 
0be0: 20 20 20 20 20 20 20 20 20 41 43 6c 6f 73 69 6e           AClosin
0bf0: 67 20 3a 3d 20 54 72 75 65 3b 0d 0a 20 20 20 20  g := True;..    
0c00: 20 20 20 20 65 6e 64 3b 0d 0a 20 20 20 20 20 20      end;..      
0c10: 20 20 27 30 27 2e 2e 27 39 27 2c 20 27 41 27 2e    '0'..'9', 'A'.
0c20: 2e 27 5a 27 2c 20 27 61 27 2e 2e 27 7a 27 2c 20  .'Z', 'a'..'z', 
0c30: 27 2d 27 2c 20 27 5f 27 2c 20 27 2e 27 2c 20 27  '-', '_', '.', '
0c40: 3a 27 3a 20 62 65 67 69 6e 0d 0a 20 20 20 20 20  :': begin..     
0c50: 20 20 20 20 20 53 74 61 72 74 49 6e 64 65 78 20       StartIndex 
0c60: 3a 3d 20 69 3b 0d 0a 20 20 20 20 20 20 20 20 65  := i;..        e
0c70: 6e 64 3b 0d 0a 20 20 20 20 20 20 65 6e 64 3b 0d  nd;..      end;.
0c80: 0a 20 20 20 20 65 6e 64 20 65 6c 73 65 20 69 66  .    end else if
0c90: 20 45 6e 64 49 6e 64 65 78 20 3d 20 30 20 74 68   EndIndex = 0 th
0ca0: 65 6e 20 62 65 67 69 6e 0d 0a 7b 24 49 46 44 45  en begin..{$IFDE
0cb0: 46 20 55 4e 49 43 4f 44 45 7d 0d 0a 20 20 20 20  F UNICODE}..    
0cc0: 20 20 69 66 20 6e 6f 74 20 43 68 61 72 49 6e 53    if not CharInS
0cd0: 65 74 28 41 54 61 67 4e 61 6d 65 5b 69 5d 2c 20  et(ATagName[i], 
0ce0: 5b 27 30 27 2e 2e 27 39 27 2c 20 27 41 27 2e 2e  ['0'..'9', 'A'..
0cf0: 27 5a 27 2c 20 27 61 27 2e 2e 27 7a 27 2c 20 27  'Z', 'a'..'z', '
0d00: 2d 27 2c 20 27 5f 27 2c 20 27 2e 27 2c 20 27 3a  -', '_', '.', ':
0d10: 27 2c 20 45 78 74 72 61 43 68 61 72 5d 29 20 74  ', ExtraChar]) t
0d20: 68 65 6e 20 62 65 67 69 6e 0d 0a 7b 24 45 4c 53  hen begin..{$ELS
0d30: 45 7d 0d 0a 20 20 20 20 20 20 69 66 20 6e 6f 74  E}..      if not
0d40: 20 28 41 54 61 67 4e 61 6d 65 5b 69 5d 20 69 6e   (ATagName[i] in
0d50: 20 5b 27 30 27 2e 2e 27 39 27 2c 20 27 41 27 2e   ['0'..'9', 'A'.
0d60: 2e 27 5a 27 2c 20 27 61 27 2e 2e 27 7a 27 2c 20  .'Z', 'a'..'z', 
0d70: 27 2d 27 2c 20 27 5f 27 2c 20 27 2e 27 2c 20 27  '-', '_', '.', '
0d80: 3a 27 2c 20 45 78 74 72 61 43 68 61 72 5d 29 20  :', ExtraChar]) 
0d90: 74 68 65 6e 20 62 65 67 69 6e 0d 0a 7b 24 45 4e  then begin..{$EN
0da0: 44 49 46 7d 0d 0a 20 20 20 20 20 20 20 20 45 6e  DIF}..        En
0db0: 64 49 6e 64 65 78 20 3a 3d 20 69 20 2d 20 31 3b  dIndex := i - 1;
0dc0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 41 43 6c  ..        if ACl
0dd0: 6f 73 69 6e 67 20 3d 20 54 72 75 65 20 74 68 65  osing = True the
0de0: 6e 20 62 65 67 69 6e 0d 0a 20 20 20 20 20 20 20  n begin..       
0df0: 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20     break;..     
0e00: 20 20 20 65 6e 64 3b 0d 0a 20 20 20 20 20 20 65     end;..      e
0e10: 6e 64 3b 0d 0a 20 20 20 20 65 6e 64 20 65 6c 73  nd;..    end els
0e20: 65 20 62 65 67 69 6e 0d 0a 20 20 20 20 20 20 69  e begin..      i
0e30: 66 20 41 54 61 67 4e 61 6d 65 5b 69 5d 20 3d 20  f ATagName[i] = 
0e40: 27 2f 27 20 74 68 65 6e 20 62 65 67 69 6e 0d 0a  '/' then begin..
0e50: 20 20 20 20 20 20 20 20 43 6c 6f 73 75 72 65 46          ClosureF
0e60: 6f 75 6e 64 20 3a 3d 20 54 72 75 65 3b 0d 0a 7b  ound := True;..{
0e70: 24 49 46 44 45 46 20 55 4e 49 43 4f 44 45 7d 0d  $IFDEF UNICODE}.
0e80: 0a 20 20 20 20 20 20 65 6e 64 20 65 6c 73 65 20  .      end else 
0e90: 69 66 20 43 6c 6f 73 75 72 65 46 6f 75 6e 64 20  if ClosureFound 
0ea0: 61 6e 64 20 6e 6f 74 20 43 68 61 72 49 6e 53 65  and not CharInSe
0eb0: 74 28 41 54 61 67 4e 61 6d 65 5b 69 5d 2c 20 5b  t(ATagName[i], [
0ec0: 27 20 27 2c 20 23 39 2c 20 23 31 33 2c 20 23 31  ' ', #9, #13, #1
0ed0: 30 5d 29 20 74 68 65 6e 20 62 65 67 69 6e 0d 0a  0]) then begin..
0ee0: 7b 24 45 4c 53 45 7d 0d 0a 20 20 20 20 20 20 65  {$ELSE}..      e
0ef0: 6e 64 20 65 6c 73 65 20 69 66 20 43 6c 6f 73 75  nd else if Closu
0f00: 72 65 46 6f 75 6e 64 20 61 6e 64 20 6e 6f 74 20  reFound and not 
0f10: 28 41 54 61 67 4e 61 6d 65 5b 69 5d 20 69 6e 20  (ATagName[i] in 
0f20: 5b 27 20 27 2c 20 23 39 2c 20 23 31 33 2c 20 23  [' ', #9, #13, #
0f30: 31 30 5d 29 20 74 68 65 6e 20 62 65 67 69 6e 0d  10]) then begin.
0f40: 0a 7b 24 45 4e 44 49 46 7d 0d 0a 20 20 20 20 20  .{$ENDIF}..     
0f50: 20 20 20 43 6c 6f 73 75 72 65 46 6f 75 6e 64 20     ClosureFound 
0f60: 3a 3d 20 46 61 6c 73 65 3b 0d 0a 20 20 20 20 20  := False;..     
0f70: 20 65 6e 64 3b 0d 0a 20 20 20 20 65 6e 64 3b 0d   end;..    end;.
0f80: 0a 20 20 20 20 2f 2f 44 65 62 75 67 57 72 69 74  .    //DebugWrit
0f90: 65 28 27 45 78 74 72 61 63 74 54 61 67 4e 61 6d  e('ExtractTagNam
0fa0: 65 27 2c 20 46 6f 72 6d 61 74 28 27 25 64 3d 25  e', Format('%d=%
0fb0: 73 3b 20 6f 70 65 6e 73 3d 25 64 2c 63 6c 6f 73  s; opens=%d,clos
0fc0: 65 73 3d 25 64 3b 20 73 74 61 72 74 3d 25 64 2c  es=%d; start=%d,
0fd0: 65 6e 64 3d 25 64 27 2c 20 5b 69 2c 20 41 54 61  end=%d', [i, ATa
0fe0: 67 4e 61 6d 65 5b 69 5d 2c 20 69 6e 74 65 67 65  gName[i], intege
0ff0: 72 28 41 4f 70 65 6e 69 6e 67 29 2c 20 69 6e 74  r(AOpening), int
1000: 65 67 65 72 28 41 43 6c 6f 73 69 6e 67 20 6f 72  eger(AClosing or
1010: 20 43 6c 6f 73 75 72 65 46 6f 75 6e 64 29 2c 20   ClosureFound), 
1020: 53 74 61 72 74 49 6e 64 65 78 2c 20 45 6e 64 49  StartIndex, EndI
1030: 6e 64 65 78 5d 29 29 3b 0d 0a 20 20 65 6e 64 3b  ndex]));..  end;
1040: 0d 0a 20 20 41 43 6c 6f 73 69 6e 67 20 3a 3d 20  ..  AClosing := 
1050: 41 43 6c 6f 73 69 6e 67 20 6f 72 20 43 6c 6f 73  AClosing or Clos
1060: 75 72 65 46 6f 75 6e 64 3b 0d 0a 20 20 69 66 20  ureFound;..  if 
1070: 45 6e 64 49 6e 64 65 78 20 3d 20 30 20 74 68 65  EndIndex = 0 the
1080: 6e 0d 0a 20 20 20 20 41 54 61 67 4e 61 6d 65 20  n..    ATagName 
1090: 3a 3d 20 43 6f 70 79 28 41 54 61 67 4e 61 6d 65  := Copy(ATagName
10a0: 2c 20 53 74 61 72 74 49 6e 64 65 78 2c 20 4c 65  , StartIndex, Le
10b0: 6e 67 74 68 28 41 54 61 67 4e 61 6d 65 29 20 2d  ngth(ATagName) -
10c0: 20 53 74 61 72 74 49 6e 64 65 78 29 0d 0a 20 20   StartIndex)..  
10d0: 65 6c 73 65 0d 0a 20 20 20 20 41 54 61 67 4e 61  else..    ATagNa
10e0: 6d 65 20 3a 3d 20 43 6f 70 79 28 41 54 61 67 4e  me := Copy(ATagN
10f0: 61 6d 65 2c 20 53 74 61 72 74 49 6e 64 65 78 2c  ame, StartIndex,
1100: 20 45 6e 64 49 6e 64 65 78 20 2d 20 53 74 61 72   EndIndex - Star
1110: 74 49 6e 64 65 78 20 2b 20 31 29 3b 0d 0a 65 6e  tIndex + 1);..en
1120: 64 3b 0d 0a 0d 0a 7b 20 2d 2d 2d 2d 2d 2d 2d 2d  d;....{ --------
1130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1180: 2d 2d 2d 2d 2d 2d 2d 2d 20 7d 0d 0a 70 72 6f 63  -------- }..proc
1190: 65 64 75 72 65 20 46 69 6e 64 4d 61 74 63 68 69  edure FindMatchi
11a0: 6e 67 54 61 67 28 41 53 65 6c 65 63 74 3a 20 62  ngTag(ASelect: b
11b0: 6f 6f 6c 65 61 6e 20 3d 20 46 61 6c 73 65 3b 20  oolean = False; 
11c0: 41 43 6f 6e 74 65 6e 74 73 4f 6e 6c 79 3a 20 42  AContentsOnly: B
11d0: 6f 6f 6c 65 61 6e 20 3d 20 46 61 6c 73 65 29 3b  oolean = False);
11e0: 0d 0a 76 61 72 0d 0a 20 20 6e 70 70 3a 20 54 41  ..var..  npp: TA
11f0: 70 70 6c 69 63 61 74 69 6f 6e 3b 0d 0a 20 20 64  pplication;..  d
1200: 6f 63 3a 20 54 41 63 74 69 76 65 44 6f 63 75 6d  oc: TActiveDocum
1210: 65 6e 74 3b 0d 0a 0d 0a 20 20 54 61 67 73 3a 20  ent;....  Tags: 
1220: 54 53 74 72 69 6e 67 4c 69 73 74 3b 0d 0a 20 20  TStringList;..  
1230: 54 61 67 2c 20 4e 65 78 74 54 61 67 2c 20 4d 61  Tag, NextTag, Ma
1240: 74 63 68 69 6e 67 54 61 67 2c 20 54 61 72 67 65  tchingTag, Targe
1250: 74 3a 20 54 54 65 78 74 52 61 6e 67 65 3b 0d 0a  t: TTextRange;..
1260: 20 20 54 61 67 4e 61 6d 65 3a 20 73 74 72 69 6e    TagName: strin
1270: 67 3b 0d 0a 20 20 54 61 67 4f 70 65 6e 73 2c 20  g;..  TagOpens, 
1280: 54 61 67 43 6c 6f 73 65 73 3a 20 62 6f 6f 6c 65  TagCloses: boole
1290: 61 6e 3b 0d 0a 0d 0a 20 20 44 69 72 65 63 74 69  an;....  Directi
12a0: 6f 6e 3a 20 54 44 69 72 65 63 74 69 6f 6e 45 6e  on: TDirectionEn
12b0: 75 6d 3b 0d 0a 20 20 49 73 58 4d 4c 3a 20 62 6f  um;..  IsXML: bo
12c0: 6f 6c 65 61 6e 3b 0d 0a 20 20 44 69 73 70 6f 73  olean;..  Dispos
12d0: 65 4f 66 54 61 67 3a 20 62 6f 6f 6c 65 61 6e 3b  eOfTag: boolean;
12e0: 0d 0a 20 20 69 3a 20 69 6e 74 65 67 65 72 3b 0d  ..  i: integer;.
12f0: 0a 20 20 46 6f 75 6e 64 3a 20 54 54 65 78 74 52  .  Found: TTextR
1300: 61 6e 67 65 3b 0d 0a 0d 0a 20 20 2f 2f 20 2d 2d  ange;....  // --
1310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 20 70  -----------..  p
1370: 72 6f 63 65 64 75 72 65 20 54 61 67 45 6e 63 6f  rocedure TagEnco
1380: 75 6e 74 65 72 65 64 28 50 72 6f 63 65 73 73 44  untered(ProcessD
1390: 69 72 65 63 74 69 6f 6e 3a 20 54 44 69 72 65 63  irection: TDirec
13a0: 74 69 6f 6e 45 6e 75 6d 3b 20 50 72 65 66 69 78  tionEnum; Prefix
13b0: 3a 20 43 68 61 72 29 3b 0d 0a 20 20 62 65 67 69  : Char);..  begi
13c0: 6e 0d 0a 20 20 20 20 54 61 67 4e 61 6d 65 20 3a  n..    TagName :
13d0: 3d 20 50 72 65 66 69 78 20 2b 20 54 61 67 4e 61  = Prefix + TagNa
13e0: 6d 65 3b 0d 0a 0d 0a 20 20 20 20 69 66 20 54 61  me;....    if Ta
13f0: 67 73 2e 43 6f 75 6e 74 20 3d 20 30 20 74 68 65  gs.Count = 0 the
1400: 6e 20 62 65 67 69 6e 0d 0a 20 20 20 20 20 20 54  n begin..      T
1410: 61 67 73 2e 41 64 64 4f 62 6a 65 63 74 28 54 61  ags.AddObject(Ta
1420: 67 4e 61 6d 65 2c 20 54 61 67 29 3b 0d 0a 20 20  gName, Tag);..  
1430: 20 20 20 20 44 69 73 70 6f 73 65 4f 66 54 61 67      DisposeOfTag
1440: 20 3a 3d 20 46 61 6c 73 65 3b 0d 0a 20 20 20 20   := False;..    
1450: 20 20 44 69 72 65 63 74 69 6f 6e 20 3a 3d 20 50    Direction := P
1460: 72 6f 63 65 73 73 44 69 72 65 63 74 69 6f 6e 3b  rocessDirection;
1470: 0d 0a 20 20 20 20 65 6e 64 20 65 6c 73 65 20 69  ..    end else i
1480: 66 20 28 49 73 58 4d 4c 20 61 6e 64 20 53 61 6d  f (IsXML and Sam
1490: 65 53 74 72 28 43 6f 70 79 28 54 61 67 4e 61 6d  eStr(Copy(TagNam
14a0: 65 2c 20 32 29 2c 20 43 6f 70 79 28 54 61 67 73  e, 2), Copy(Tags
14b0: 2e 53 74 72 69 6e 67 73 5b 30 5d 2c 20 32 29 29  .Strings[0], 2))
14c0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
14d0: 20 20 20 6f 72 20 28 28 6e 6f 74 20 49 73 58 4d     or ((not IsXM
14e0: 4c 29 20 61 6e 64 20 53 61 6d 65 54 65 78 74 28  L) and SameText(
14f0: 43 6f 70 79 28 54 61 67 4e 61 6d 65 2c 20 32 29  Copy(TagName, 2)
1500: 2c 20 43 6f 70 79 28 54 61 67 73 2e 53 74 72 69  , Copy(Tags.Stri
1510: 6e 67 73 5b 30 5d 2c 20 32 29 29 29 20 74 68 65  ngs[0], 2))) the
1520: 6e 20 62 65 67 69 6e 0d 0a 20 20 20 20 20 20 69  n begin..      i
1530: 66 20 44 69 72 65 63 74 69 6f 6e 20 3d 20 50 72  f Direction = Pr
1540: 6f 63 65 73 73 44 69 72 65 63 74 69 6f 6e 20 74  ocessDirection t
1550: 68 65 6e 20 62 65 67 69 6e 0d 0a 20 20 20 20 20  hen begin..     
1560: 20 20 20 54 61 67 73 2e 41 64 64 4f 62 6a 65 63     Tags.AddObjec
1570: 74 28 54 61 67 4e 61 6d 65 2c 20 54 61 67 29 3b  t(TagName, Tag);
1580: 0d 0a 20 20 20 20 20 20 20 20 44 69 73 70 6f 73  ..        Dispos
1590: 65 4f 66 54 61 67 20 3a 3d 20 46 61 6c 73 65 3b  eOfTag := False;
15a0: 0d 0a 20 20 20 20 20 20 65 6e 64 20 65 6c 73 65  ..      end else
15b0: 20 62 65 67 69 6e 0d 0a 20 20 20 20 20 20 20 20   begin..        
15c0: 69 66 20 54 61 67 73 2e 43 6f 75 6e 74 20 3e 20  if Tags.Count > 
15d0: 31 20 74 68 65 6e 20 62 65 67 69 6e 0d 0a 20 20  1 then begin..  
15e0: 20 20 20 20 20 20 20 20 54 61 67 73 2e 4f 62 6a          Tags.Obj
15f0: 65 63 74 73 5b 54 61 67 73 2e 43 6f 75 6e 74 20  ects[Tags.Count 
1600: 2d 20 31 5d 2e 46 72 65 65 3b 0d 0a 20 20 20 20  - 1].Free;..    
1610: 20 20 20 20 20 20 54 61 67 73 2e 44 65 6c 65 74        Tags.Delet
1620: 65 28 54 61 67 73 2e 43 6f 75 6e 74 20 2d 20 31  e(Tags.Count - 1
1630: 29 3b 0d 0a 20 20 20 20 20 20 20 20 65 6e 64 20  );..        end 
1640: 65 6c 73 65 20 62 65 67 69 6e 0d 0a 20 20 20 20  else begin..    
1650: 20 20 20 20 20 20 4d 61 74 63 68 69 6e 67 54 61        MatchingTa
1660: 67 20 3a 3d 20 54 61 67 3b 0d 0a 20 20 20 20 20  g := Tag;..     
1670: 20 20 20 20 20 54 61 67 73 2e 41 64 64 4f 62 6a       Tags.AddObj
1680: 65 63 74 28 54 61 67 4e 61 6d 65 2c 20 54 61 67  ect(TagName, Tag
1690: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 44 69  );..          Di
16a0: 73 70 6f 73 65 4f 66 54 61 67 20 3a 3d 20 46 61  sposeOfTag := Fa
16b0: 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 65 6e  lse;..        en
16c0: 64 3b 0d 0a 20 20 20 20 20 20 65 6e 64 3b 0d 0a  d;..      end;..
16d0: 20 20 20 20 65 6e 64 3b 0d 0a 20 20 65 6e 64 3b      end;..  end;
16e0: 0d 0a 20 20 2f 2f 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..  // ---------
16f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1740: 2d 2d 2d 2d 0d 0a 62 65 67 69 6e 0d 0a 20 20 6e  ----..begin..  n
1750: 70 70 20 3a 3d 20 47 65 74 41 70 70 6c 69 63 61  pp := GetApplica
1760: 74 69 6f 6e 28 29 3b 0d 0a 20 20 64 6f 63 20 3a  tion();..  doc :
1770: 3d 20 6e 70 70 2e 41 63 74 69 76 65 44 6f 63 75  = npp.ActiveDocu
1780: 6d 65 6e 74 3b 0d 0a 0d 0a 20 20 49 73 58 4d 4c  ment;....  IsXML
1790: 20 3a 3d 20 28 64 6f 63 2e 4c 61 6e 67 75 61 67   := (doc.Languag
17a0: 65 20 3d 20 4c 5f 58 4d 4c 29 3b 0d 0a 0d 0a 20  e = L_XML);.... 
17b0: 20 54 61 67 73 20 3a 3d 20 54 53 74 72 69 6e 67   Tags := TString
17c0: 4c 69 73 74 2e 43 72 65 61 74 65 3b 0d 0a 20 20  List.Create;..  
17d0: 4d 61 74 63 68 69 6e 67 54 61 67 20 3a 3d 20 6e  MatchingTag := n
17e0: 69 6c 3b 0d 0a 20 20 4e 65 78 74 54 61 67 20 3a  il;..  NextTag :
17f0: 3d 20 6e 69 6c 3b 0d 0a 20 20 44 69 72 65 63 74  = nil;..  Direct
1800: 69 6f 6e 20 3a 3d 20 64 69 72 55 6e 6b 6e 6f 77  ion := dirUnknow
1810: 6e 3b 0d 0a 20 20 74 72 79 0d 0a 20 20 20 20 74  n;..  try..    t
1820: 72 79 0d 0a 20 20 20 20 20 20 72 65 70 65 61 74  ry..      repeat
1830: 0d 0a 20 20 20 20 20 20 20 20 44 69 73 70 6f 73  ..        Dispos
1840: 65 4f 66 54 61 67 20 3a 3d 20 54 72 75 65 3b 0d  eOfTag := True;.
1850: 0a 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20  .        if not 
1860: 41 73 73 69 67 6e 65 64 28 4e 65 78 74 54 61 67  Assigned(NextTag
1870: 29 20 74 68 65 6e 20 62 65 67 69 6e 0d 0a 20 20  ) then begin..  
1880: 20 20 20 20 20 20 20 20 2f 2f 20 54 68 65 20 66          // The f
1890: 69 72 73 74 20 74 69 6d 65 2c 20 62 65 67 69 6e  irst time, begin
18a0: 20 61 74 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   at the document
18b0: 27 73 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74  's current posit
18c0: 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 54  ion..          T
18d0: 61 67 20 3a 3d 20 45 78 74 72 61 63 74 54 61 67  ag := ExtractTag
18e0: 4e 61 6d 65 28 64 6f 63 2c 20 54 61 67 4e 61 6d  Name(doc, TagNam
18f0: 65 2c 20 54 61 67 4f 70 65 6e 73 2c 20 54 61 67  e, TagOpens, Tag
1900: 43 6c 6f 73 65 73 29 3b 0d 0a 20 20 20 20 20 20  Closes);..      
1910: 20 20 65 6e 64 20 65 6c 73 65 20 62 65 67 69 6e    end else begin
1920: 0d 0a 20 20 20 20 20 20 20 20 20 20 54 61 67 20  ..          Tag 
1930: 3a 3d 20 45 78 74 72 61 63 74 54 61 67 4e 61 6d  := ExtractTagNam
1940: 65 28 64 6f 63 2c 20 54 61 67 4e 61 6d 65 2c 20  e(doc, TagName, 
1950: 54 61 67 4f 70 65 6e 73 2c 20 54 61 67 43 6c 6f  TagOpens, TagClo
1960: 73 65 73 2c 20 4e 65 78 74 54 61 67 2e 53 74 61  ses, NextTag.Sta
1970: 72 74 50 6f 73 20 2b 20 31 29 3b 0d 0a 20 20 20  rtPos + 1);..   
1980: 20 20 20 20 20 20 20 46 72 65 65 41 6e 64 4e 69         FreeAndNi
1990: 6c 28 4e 65 78 74 54 61 67 29 3b 0d 0a 20 20 20  l(NextTag);..   
19a0: 20 20 20 20 20 65 6e 64 3b 0d 0a 20 20 20 20 20       end;..     
19b0: 20 20 20 69 66 20 41 73 73 69 67 6e 65 64 28 54     if Assigned(T
19c0: 61 67 29 20 74 68 65 6e 20 62 65 67 69 6e 0d 0a  ag) then begin..
19d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 49  ..          // I
19e0: 66 20 77 65 27 72 65 20 69 6e 20 48 54 4d 4c 20  f we're in HTML 
19f0: 6d 6f 64 65 2c 20 63 68 65 63 6b 20 66 6f 72 20  mode, check for 
1a00: 61 6e 79 20 6f 66 20 74 68 65 20 48 54 4d 4c 20  any of the HTML 
1a10: 34 20 65 6d 70 74 79 20 74 61 67 73 20 2d 2d 20  4 empty tags -- 
1a20: 74 68 65 79 27 72 65 20 72 65 61 6c 6c 79 20 73  they're really s
1a30: 65 6c 66 2d 63 6c 6f 73 69 6e 67 0d 0a 20 20 20  elf-closing..   
1a40: 20 20 20 20 20 20 20 69 66 20 28 6e 6f 74 20 49         if (not I
1a50: 73 58 4d 4c 29 20 61 6e 64 20 54 61 67 4f 70 65  sXML) and TagOpe
1a60: 6e 73 20 61 6e 64 20 28 6e 6f 74 20 54 61 67 43  ns and (not TagC
1a70: 6c 6f 73 65 73 29 20 74 68 65 6e 20 62 65 67 69  loses) then begi
1a80: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  n..            f
1a90: 6f 72 20 69 20 3a 3d 20 4c 6f 77 28 73 63 53 65  or i := Low(scSe
1aa0: 6c 66 43 6c 6f 73 69 6e 67 54 61 67 73 29 20 74  lfClosingTags) t
1ab0: 6f 20 48 69 67 68 28 73 63 53 65 6c 66 43 6c 6f  o High(scSelfClo
1ac0: 73 69 6e 67 54 61 67 73 29 20 64 6f 20 62 65 67  singTags) do beg
1ad0: 69 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  in..            
1ae0: 20 20 69 66 20 53 61 6d 65 54 65 78 74 28 54 61    if SameText(Ta
1af0: 67 4e 61 6d 65 2c 20 73 63 53 65 6c 66 43 6c 6f  gName, scSelfClo
1b00: 73 69 6e 67 54 61 67 73 5b 69 5d 29 20 74 68 65  singTags[i]) the
1b10: 6e 20 62 65 67 69 6e 0d 0a 20 20 20 20 20 20 20  n begin..       
1b20: 20 20 20 20 20 20 20 20 20 54 61 67 43 6c 6f 73           TagClos
1b30: 65 73 20 3a 3d 20 54 72 75 65 3b 0d 0a 20 20 20  es := True;..   
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 42 72 65               Bre
1b50: 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ak;..           
1b60: 20 20 20 65 6e 64 3b 0d 0a 20 20 20 20 20 20 20     end;..       
1b70: 20 20 20 20 20 65 6e 64 3b 0d 0a 20 20 20 20 20       end;..     
1b80: 20 20 20 20 20 65 6e 64 3b 0d 0a 0d 0a 2f 2f 20       end;....// 
1b90: 20 20 20 20 20 20 20 20 20 44 65 62 75 67 57 72           DebugWr
1ba0: 69 74 65 28 27 46 69 6e 64 4d 61 74 63 68 69 6e  ite('FindMatchin
1bb0: 67 54 61 67 27 2c 20 46 6f 72 6d 61 74 28 27 46  gTag', Format('F
1bc0: 6f 75 6e 64 20 54 54 65 78 74 52 61 6e 67 65 28  ound TTextRange(
1bd0: 25 64 2c 20 25 64 2c 20 22 25 73 22 29 3a 20 6f  %d, %d, "%s"): o
1be0: 70 65 6e 73 3d 25 64 2c 20 63 6c 6f 73 65 73 3d  pens=%d, closes=
1bf0: 25 64 27 2c 20 5b 54 61 67 2e 53 74 61 72 74 50  %d', [Tag.StartP
1c00: 6f 73 2c 20 54 61 67 2e 45 6e 64 50 6f 73 2c 20  os, Tag.EndPos, 
1c10: 54 61 67 2e 54 65 78 74 2c 20 69 6e 74 65 67 65  Tag.Text, intege
1c20: 72 28 54 61 67 4f 70 65 6e 73 29 2c 20 69 6e 74  r(TagOpens), int
1c30: 65 67 65 72 28 54 61 67 43 6c 6f 73 65 73 29 5d  eger(TagCloses)]
1c40: 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ));....         
1c50: 20 69 66 20 54 61 67 4f 70 65 6e 73 20 61 6e 64   if TagOpens and
1c60: 20 54 61 67 43 6c 6f 73 65 73 20 74 68 65 6e 20   TagCloses then 
1c70: 62 65 67 69 6e 20 2f 2f 20 41 20 73 65 6c 66 2d  begin // A self-
1c80: 63 6c 6f 73 69 6e 67 20 74 61 67 0d 0a 20 20 20  closing tag..   
1c90: 20 20 20 20 20 20 20 20 20 54 61 67 4e 61 6d 65           TagName
1ca0: 20 3a 3d 20 27 2a 27 20 2b 20 54 61 67 4e 61 6d   := '*' + TagNam
1cb0: 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e;....          
1cc0: 20 20 69 66 20 54 61 67 73 2e 43 6f 75 6e 74 20    if Tags.Count 
1cd0: 3d 20 30 20 74 68 65 6e 20 62 65 67 69 6e 0d 0a  = 0 then begin..
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 61                Ma
1cf0: 74 63 68 69 6e 67 54 61 67 20 3a 3d 20 54 61 67  tchingTag := Tag
1d00: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
1d10: 20 54 61 67 73 2e 41 64 64 4f 62 6a 65 63 74 28   Tags.AddObject(
1d20: 54 61 67 4e 61 6d 65 2c 20 54 61 67 29 3b 0d 0a  TagName, Tag);..
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44 69                Di
1d40: 73 70 6f 73 65 4f 66 54 61 67 20 3a 3d 20 46 61  sposeOfTag := Fa
1d50: 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  lse;..          
1d60: 20 20 20 20 44 69 72 65 63 74 69 6f 6e 20 3a 3d      Direction :=
1d70: 20 64 69 72 4e 6f 6e 65 3b 0d 0a 20 20 20 20 20   dirNone;..     
1d80: 20 20 20 20 20 20 20 65 6e 64 3b 0d 0a 0d 0a 20         end;.... 
1d90: 20 20 20 20 20 20 20 20 20 65 6e 64 20 65 6c 73           end els
1da0: 65 20 69 66 20 54 61 67 4f 70 65 6e 73 20 74 68  e if TagOpens th
1db0: 65 6e 20 62 65 67 69 6e 20 2f 2f 20 41 6e 20 6f  en begin // An o
1dc0: 70 65 6e 69 6e 67 20 74 61 67 0d 0a 20 20 20 20  pening tag..    
1dd0: 20 20 20 20 20 20 20 20 54 61 67 45 6e 63 6f 75          TagEncou
1de0: 6e 74 65 72 65 64 28 64 69 72 46 6f 72 77 61 72  ntered(dirForwar
1df0: 64 2c 20 27 2b 27 29 3b 0d 0a 0d 0a 20 20 20 20  d, '+');....    
1e00: 20 20 20 20 20 20 65 6e 64 20 65 6c 73 65 20 69        end else i
1e10: 66 20 54 61 67 43 6c 6f 73 65 73 20 74 68 65 6e  f TagCloses then
1e20: 20 62 65 67 69 6e 20 2f 2f 20 41 20 63 6c 6f 73   begin // A clos
1e30: 69 6e 67 20 74 61 67 0d 0a 20 20 20 20 20 20 20  ing tag..       
1e40: 20 20 20 20 20 54 61 67 45 6e 63 6f 75 6e 74 65       TagEncounte
1e50: 72 65 64 28 64 69 72 42 61 63 6b 77 61 72 64 2c  red(dirBackward,
1e60: 20 27 2d 27 29 3b 0d 0a 0d 0a 20 20 20 20 20 20   '-');....      
1e70: 20 20 20 20 65 6e 64 20 65 6c 73 65 20 62 65 67      end else beg
1e80: 69 6e 20 2f 2f 20 41 20 74 61 67 20 74 68 61 74  in // A tag that
1e90: 20 64 6f 65 73 6e 27 74 20 6f 70 65 6e 20 61 6e   doesn't open an
1ea0: 64 20 64 6f 65 73 6e 27 74 20 63 6c 6f 73 65 3f  d doesn't close?
1eb0: 21 3f 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  !? This should n
1ec0: 65 76 65 72 20 68 61 70 70 65 6e 0d 0a 20 20 20  ever happen..   
1ed0: 20 20 20 20 20 20 20 20 20 54 61 67 4e 61 6d 65           TagName
1ee0: 20 3a 3d 20 54 61 67 4e 61 6d 65 20 2b 20 46 6f   := TagName + Fo
1ef0: 72 6d 61 74 28 27 5b 6f 70 65 6e 69 6e 67 3d 25  rmat('[opening=%
1f00: 64 2c 63 6c 6f 73 69 6e 67 3d 25 64 5d 27 2c 20  d,closing=%d]', 
1f10: 5b 69 6e 74 65 67 65 72 28 54 61 67 4f 70 65 6e  [integer(TagOpen
1f20: 73 29 2c 20 69 6e 74 65 67 65 72 28 54 61 67 43  s), integer(TagC
1f30: 6c 6f 73 65 73 29 5d 29 3b 0d 0a 2f 2f 20 20 20  loses)]);..//   
1f40: 20 20 20 20 20 20 20 20 20 44 65 62 75 67 57 72           DebugWr
1f50: 69 74 65 28 27 46 69 6e 64 4d 61 74 63 68 69 6e  ite('FindMatchin
1f60: 67 54 61 67 27 2c 20 46 6f 72 6d 61 74 28 27 25  gTag', Format('%
1f70: 73 20 28 25 64 2d 25 64 29 3a 20 22 25 73 22 27  s (%d-%d): "%s"'
1f80: 2c 20 5b 54 61 67 4e 61 6d 65 2c 20 54 61 67 2e  , [TagName, Tag.
1f90: 53 74 61 72 74 50 6f 73 2c 20 54 61 67 2e 45 6e  StartPos, Tag.En
1fa0: 64 50 6f 73 2c 20 54 61 67 2e 54 65 78 74 5d 29  dPos, Tag.Text])
1fb0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
1fc0: 41 73 73 65 72 74 28 46 61 6c 73 65 2c 20 27 54  Assert(False, 'T
1fd0: 68 69 73 20 74 61 67 20 64 6f 65 73 6e 27 27 74  his tag doesn''t
1fe0: 20 6f 70 65 6e 2c 20 61 6e 64 20 64 6f 65 73 6e   open, and doesn
1ff0: 27 27 74 20 63 6c 6f 73 65 20 65 69 74 68 65 72  ''t close either
2000: 21 3f 21 20 27 20 2b 20 54 61 67 4e 61 6d 65 29  !?! ' + TagName)
2010: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d  ;..            M
2020: 65 73 73 61 67 65 42 65 65 70 28 4d 42 5f 49 43  essageBeep(MB_IC
2030: 4f 4e 45 52 52 4f 52 29 3b 0d 0a 0d 0a 20 20 20  ONERROR);....   
2040: 20 20 20 20 20 20 20 65 6e 64 7b 69 66 20 54 61         end{if Ta
2050: 67 4f 70 65 6e 73 20 61 6e 64 2f 6f 72 20 54 61  gOpens and/or Ta
2060: 67 43 6c 6f 73 65 73 7d 3b 0d 0a 0d 0a 2f 2f 20  gCloses};....// 
2070: 20 20 20 20 20 20 20 20 20 44 65 62 75 67 57 72           DebugWr
2080: 69 74 65 28 27 46 69 6e 64 4d 61 74 63 68 69 6e  ite('FindMatchin
2090: 67 54 61 67 27 2c 20 46 6f 72 6d 61 74 28 27 50  gTag', Format('P
20a0: 72 6f 63 65 73 73 65 64 20 54 54 65 78 74 52 61  rocessed TTextRa
20b0: 6e 67 65 28 25 64 2c 20 25 64 2c 20 22 25 73 22  nge(%d, %d, "%s"
20c0: 29 27 2c 20 5b 54 61 67 2e 53 74 61 72 74 50 6f  )', [Tag.StartPo
20d0: 73 2c 20 54 61 67 2e 45 6e 64 50 6f 73 2c 20 54  s, Tag.EndPos, T
20e0: 61 67 2e 54 65 78 74 5d 29 29 3b 0d 0a 0d 0a 20  ag.Text]));.... 
20f0: 20 20 20 20 20 20 20 65 6e 64 7b 69 66 20 41 73         end{if As
2100: 73 69 67 6e 65 64 28 54 61 67 29 7d 3b 0d 0a 0d  signed(Tag)};...
2110: 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 46 69  ...        // Fi
2120: 6e 64 20 74 68 65 20 6e 65 78 74 20 74 61 67 20  nd the next tag 
2130: 69 6e 20 74 68 65 20 73 65 61 72 63 68 20 64 69  in the search di
2140: 72 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20  rection..       
2150: 20 63 61 73 65 20 44 69 72 65 63 74 69 6f 6e 20   case Direction 
2160: 6f 66 0d 0a 20 20 20 20 20 20 20 20 20 20 64 69  of..          di
2170: 72 46 6f 72 77 61 72 64 3a 20 62 65 67 69 6e 0d  rForward: begin.
2180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
2190: 6c 6f 6f 6b 20 66 6f 72 77 61 72 64 20 66 6f 72  look forward for
21a0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63   corresponding c
21b0: 6c 6f 73 69 6e 67 20 74 61 67 0d 0a 20 20 20 20  losing tag..    
21c0: 20 20 20 20 20 20 20 20 4e 65 78 74 54 61 67 20          NextTag 
21d0: 3a 3d 20 64 6f 63 2e 46 69 6e 64 28 27 3c 5b 5e  := doc.Find('<[^
21e0: 25 5c 3f 5d 27 2c 20 53 43 46 49 4e 44 5f 52 45  %\?]', SCFIND_RE
21f0: 47 45 58 50 20 6f 72 20 53 43 46 49 4e 44 5f 50  GEXP or SCFIND_P
2200: 4f 53 49 58 2c 20 54 61 67 2e 45 6e 64 50 6f 73  OSIX, Tag.EndPos
2210: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
2220: 69 66 20 41 73 73 69 67 6e 65 64 28 4e 65 78 74  if Assigned(Next
2230: 54 61 67 29 20 74 68 65 6e 0d 0a 20 20 20 20 20  Tag) then..     
2240: 20 20 20 20 20 20 20 20 20 4e 65 78 74 54 61 67           NextTag
2250: 2e 45 6e 64 50 6f 73 20 3a 3d 20 4e 65 78 74 54  .EndPos := NextT
2260: 61 67 2e 45 6e 64 50 6f 73 20 2d 20 31 3b 0d 0a  ag.EndPos - 1;..
2270: 20 20 20 20 20 20 20 20 20 20 65 6e 64 3b 0d 0a            end;..
2280: 20 20 20 20 20 20 20 20 20 20 64 69 72 42 61 63            dirBac
2290: 6b 77 61 72 64 3a 20 62 65 67 69 6e 0d 0a 20 20  kward: begin..  
22a0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 6c 6f 6f            // loo
22b0: 6b 20 62 61 63 6b 77 61 72 64 20 66 6f 72 20 63  k backward for c
22c0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6f 70 65  orresponding ope
22d0: 6e 69 6e 67 20 74 61 67 0d 0a 20 20 20 20 20 20  ning tag..      
22e0: 20 20 20 20 20 20 4e 65 78 74 54 61 67 20 3a 3d        NextTag :=
22f0: 20 64 6f 63 2e 46 69 6e 64 28 27 5b 5e 25 5c 3f   doc.Find('[^%\?
2300: 5d 3e 27 2c 20 53 43 46 49 4e 44 5f 52 45 47 45  ]>', SCFIND_REGE
2310: 58 50 20 6f 72 20 53 43 46 49 4e 44 5f 50 4f 53  XP or SCFIND_POS
2320: 49 58 2c 20 54 61 67 2e 53 74 61 72 74 50 6f 73  IX, Tag.StartPos
2330: 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  , 0);..         
2340: 20 20 20 69 66 20 41 73 73 69 67 6e 65 64 28 4e     if Assigned(N
2350: 65 78 74 54 61 67 29 20 74 68 65 6e 0d 0a 20 20  extTag) then..  
2360: 20 20 20 20 20 20 20 20 20 20 20 20 4e 65 78 74              Next
2370: 54 61 67 2e 53 74 61 72 74 50 6f 73 20 3a 3d 20  Tag.StartPos := 
2380: 4e 65 78 74 54 61 67 2e 53 74 61 72 74 50 6f 73  NextTag.StartPos
2390: 20 2b 20 31 3b 0d 0a 20 20 20 20 20 20 20 20 20   + 1;..         
23a0: 20 65 6e 64 3b 0d 0a 20 20 20 20 20 20 20 20 20   end;..         
23b0: 20 65 6c 73 65 20 62 65 67 69 6e 0d 0a 20 20 20   else begin..   
23c0: 20 20 20 20 20 20 20 20 20 2f 2f 64 69 72 55 6e           //dirUn
23d0: 6b 6e 6f 77 6e 3a 20 3b 0d 0a 20 20 20 20 20 20  known: ;..      
23e0: 20 20 20 20 20 20 2f 2f 64 69 72 4e 6f 6e 65 3a        //dirNone:
23f0: 20 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   ;..            
2400: 4e 65 78 74 54 61 67 20 3a 3d 20 6e 69 6c 3b 0d  NextTag := nil;.
2410: 0a 20 20 20 20 20 20 20 20 20 20 65 6e 64 3b 0d  .          end;.
2420: 0a 20 20 20 20 20 20 20 20 65 6e 64 3b 0d 0a 0d  .        end;...
2430: 0a 20 20 20 20 20 20 20 20 69 66 20 44 69 73 70  .        if Disp
2440: 6f 73 65 4f 66 54 61 67 20 74 68 65 6e 20 62 65  oseOfTag then be
2450: 67 69 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 46  gin..          F
2460: 72 65 65 41 6e 64 4e 69 6c 28 54 61 67 29 3b 0d  reeAndNil(Tag);.
2470: 0a 20 20 20 20 20 20 20 20 65 6e 64 3b 0d 0a 20  .        end;.. 
2480: 20 20 20 20 20 75 6e 74 69 6c 20 28 4e 65 78 74       until (Next
2490: 54 61 67 20 3d 20 6e 69 6c 29 20 6f 72 20 28 4d  Tag = nil) or (M
24a0: 61 74 63 68 69 6e 67 54 61 67 20 3c 3e 20 6e 69  atchingTag <> ni
24b0: 6c 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 54 61 67  l);....      Tag
24c0: 73 2e 4c 69 6e 65 42 72 65 61 6b 20 3a 3d 20 23  s.LineBreak := #
24d0: 39 3b 0d 0a 2f 2f 20 20 20 20 20 20 44 65 62 75  9;..//      Debu
24e0: 67 57 72 69 74 65 28 27 46 69 6e 64 4d 61 74 63  gWrite('FindMatc
24f0: 68 69 6e 67 54 61 67 3a 44 6f 6e 65 20 6c 6f 6f  hingTag:Done loo
2500: 6b 69 6e 67 27 2c 20 46 6f 72 6d 61 74 28 27 54  king', Format('T
2510: 61 67 73 2e 43 6f 75 6e 74 20 3d 20 25 64 20 28  ags.Count = %d (
2520: 25 73 29 27 2c 20 5b 54 61 67 73 2e 43 6f 75 6e  %s)', [Tags.Coun
2530: 74 2c 20 54 61 67 73 2e 54 65 78 74 5d 29 29 3b  t, Tags.Text]));
2540: 0d 0a 20 20 20 20 20 20 69 66 20 41 73 73 69 67  ..      if Assig
2550: 6e 65 64 28 4d 61 74 63 68 69 6e 67 54 61 67 29  ned(MatchingTag)
2560: 20 74 68 65 6e 20 62 65 67 69 6e 0d 0a 2f 2f 20   then begin..// 
2570: 20 20 20 20 20 20 20 44 65 62 75 67 57 72 69 74         DebugWrit
2580: 65 28 27 46 69 6e 64 4d 61 74 63 68 69 6e 67 54  e('FindMatchingT
2590: 61 67 3a 4d 61 72 6b 69 6e 67 27 2c 20 46 6f 72  ag:Marking', For
25a0: 6d 61 74 28 27 4d 61 74 63 68 69 6e 67 54 61 67  mat('MatchingTag
25b0: 20 3d 20 54 54 65 78 74 52 61 6e 67 65 28 25 64   = TTextRange(%d
25c0: 2c 20 25 64 2c 20 22 25 73 22 29 27 2c 20 5b 4d  , %d, "%s")', [M
25d0: 61 74 63 68 69 6e 67 54 61 67 2e 53 74 61 72 74  atchingTag.Start
25e0: 50 6f 73 2c 20 4d 61 74 63 68 69 6e 67 54 61 67  Pos, MatchingTag
25f0: 2e 45 6e 64 50 6f 73 2c 20 4d 61 74 63 68 69 6e  .EndPos, Matchin
2600: 67 54 61 67 2e 54 65 78 74 5d 29 29 3b 0d 0a 20  gTag.Text]));.. 
2610: 20 20 20 20 20 20 20 69 66 20 54 61 67 73 2e 43         if Tags.C
2620: 6f 75 6e 74 20 3d 20 32 20 74 68 65 6e 20 62 65  ount = 2 then be
2630: 67 69 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 54  gin..          T
2640: 61 67 20 3a 3d 20 54 54 65 78 74 52 61 6e 67 65  ag := TTextRange
2650: 28 54 61 67 73 2e 4f 62 6a 65 63 74 73 5b 30 5d  (Tags.Objects[0]
2660: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  );..          if
2670: 20 41 53 65 6c 65 63 74 20 74 68 65 6e 20 62 65   ASelect then be
2680: 67 69 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  gin..           
2690: 20 69 66 20 54 61 67 2e 53 74 61 72 74 50 6f 73   if Tag.StartPos
26a0: 20 3c 20 4d 61 74 63 68 69 6e 67 54 61 67 2e 53   < MatchingTag.S
26b0: 74 61 72 74 50 6f 73 20 74 68 65 6e 20 62 65 67  tartPos then beg
26c0: 69 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  in..            
26d0: 20 20 69 66 20 41 43 6f 6e 74 65 6e 74 73 4f 6e    if AContentsOn
26e0: 6c 79 20 74 68 65 6e 20 62 65 67 69 6e 0d 0a 20  ly then begin.. 
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
2700: 61 72 67 65 74 20 3a 3d 20 64 6f 63 2e 47 65 74  arget := doc.Get
2710: 52 61 6e 67 65 28 54 61 67 2e 45 6e 64 50 6f 73  Range(Tag.EndPos
2720: 2c 20 4d 61 74 63 68 69 6e 67 54 61 67 2e 53 74  , MatchingTag.St
2730: 61 72 74 50 6f 73 29 3b 0d 0a 20 20 20 20 20 20  artPos);..      
2740: 20 20 20 20 20 20 20 20 65 6e 64 20 65 6c 73 65          end else
2750: 20 62 65 67 69 6e 0d 0a 20 20 20 20 20 20 20 20   begin..        
2760: 20 20 20 20 20 20 20 20 54 61 72 67 65 74 20 3a          Target :
2770: 3d 20 64 6f 63 2e 47 65 74 52 61 6e 67 65 28 54  = doc.GetRange(T
2780: 61 67 2e 53 74 61 72 74 50 6f 73 2c 20 4d 61 74  ag.StartPos, Mat
2790: 63 68 69 6e 67 54 61 67 2e 45 6e 64 50 6f 73 29  chingTag.EndPos)
27a0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
27b0: 20 65 6e 64 3b 0d 0a 20 20 20 20 20 20 20 20 20   end;..         
27c0: 20 20 20 65 6e 64 20 65 6c 73 65 20 62 65 67 69     end else begi
27d0: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
27e0: 20 69 66 20 41 43 6f 6e 74 65 6e 74 73 4f 6e 6c   if AContentsOnl
27f0: 79 20 74 68 65 6e 20 62 65 67 69 6e 0d 0a 20 20  y then begin..  
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 61                Ta
2810: 72 67 65 74 20 3a 3d 20 64 6f 63 2e 47 65 74 52  rget := doc.GetR
2820: 61 6e 67 65 28 4d 61 74 63 68 69 6e 67 54 61 67  ange(MatchingTag
2830: 2e 45 6e 64 50 6f 73 2c 20 54 61 67 2e 53 74 61  .EndPos, Tag.Sta
2840: 72 74 50 6f 73 29 3b 0d 0a 20 20 20 20 20 20 20  rtPos);..       
2850: 20 20 20 20 20 20 20 65 6e 64 20 65 6c 73 65 20         end else 
2860: 62 65 67 69 6e 0d 0a 20 20 20 20 20 20 20 20 20  begin..         
2870: 20 20 20 20 20 20 20 54 61 72 67 65 74 20 3a 3d         Target :=
2880: 20 64 6f 63 2e 47 65 74 52 61 6e 67 65 28 4d 61   doc.GetRange(Ma
2890: 74 63 68 69 6e 67 54 61 67 2e 53 74 61 72 74 50  tchingTag.StartP
28a0: 6f 73 2c 20 54 61 67 2e 45 6e 64 50 6f 73 29 3b  os, Tag.EndPos);
28b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
28c0: 65 6e 64 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  end;..          
28d0: 20 20 65 6e 64 3b 0d 0a 20 20 20 20 20 20 20 20    end;..        
28e0: 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20      try..       
28f0: 20 20 20 20 20 20 20 69 66 20 41 43 6f 6e 74 65         if AConte
2900: 6e 74 73 4f 6e 6c 79 20 61 6e 64 20 54 72 75 65  ntsOnly and True
2910: 20 74 68 65 6e 20 62 65 67 69 6e 20 2f 2f 20 54   then begin // T
2920: 4f 44 4f 3a 20 6d 61 6b 65 20 6f 70 74 69 6f 6e  ODO: make option
2930: 61 6c 2c 20 72 65 61 64 20 73 65 74 74 69 6e 67  al, read setting
2940: 20 66 72 6f 6d 20 2e 69 6e 69 20 28 5b 4d 61 74   from .ini ([Mat
2950: 63 68 54 61 67 5d 20 53 6b 69 70 57 68 69 74 65  chTag] SkipWhite
2960: 73 70 61 63 65 3d 31 29 0d 0a 20 20 20 20 20 20  space=1)..      
2970: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4c 65 61            // Lea
2980: 76 65 20 6f 75 74 20 77 68 69 74 65 73 70 61 63  ve out whitespac
2990: 65 20 61 74 20 62 65 67 69 6e 0d 0a 20 20 20 20  e at begin..    
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 46 6f 75 6e              Foun
29b0: 64 20 3a 3d 20 64 6f 63 2e 46 69 6e 64 28 27 5b  d := doc.Find('[
29c0: 5e 20 5c 72 5c 6e 5c 74 5d 27 2c 20 53 43 46 49  ^ \r\n\t]', SCFI
29d0: 4e 44 5f 52 45 47 45 58 50 20 6f 72 20 53 43 46  ND_REGEXP or SCF
29e0: 49 4e 44 5f 50 4f 53 49 58 2c 20 54 61 72 67 65  IND_POSIX, Targe
29f0: 74 2e 53 74 61 72 74 50 6f 73 2c 20 54 61 72 67  t.StartPos, Targ
2a00: 65 74 2e 45 6e 64 50 6f 73 29 3b 0d 0a 20 20 20  et.EndPos);..   
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
2a20: 41 73 73 69 67 6e 65 64 28 46 6f 75 6e 64 29 20  Assigned(Found) 
2a30: 74 68 65 6e 20 62 65 67 69 6e 0d 0a 20 20 20 20  then begin..    
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
2a50: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y..             
2a60: 20 20 20 20 20 20 20 54 61 72 67 65 74 2e 53 74         Target.St
2a70: 61 72 74 50 6f 73 20 3a 3d 20 46 6f 75 6e 64 2e  artPos := Found.
2a80: 53 74 61 72 74 50 6f 73 3b 0d 0a 20 20 20 20 20  StartPos;..     
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6e               fin
2aa0: 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20  ally..          
2ab0: 20 20 20 20 20 20 20 20 20 20 46 6f 75 6e 64 2e            Found.
2ac0: 46 72 65 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  Free;..         
2ad0: 20 20 20 20 20 20 20 20 20 65 6e 64 3b 0d 0a 20           end;.. 
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
2af0: 6e 64 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  nd;..           
2b00: 20 20 20 20 20 2f 2f 20 41 6c 73 6f 20 6c 65 61       // Also lea
2b10: 76 65 20 6f 75 74 20 77 68 69 74 65 73 70 61 63  ve out whitespac
2b20: 65 20 61 74 20 65 6e 64 0d 0a 20 20 20 20 20 20  e at end..      
2b30: 20 20 20 20 20 20 20 20 20 20 46 6f 75 6e 64 20            Found 
2b40: 3a 3d 20 64 6f 63 2e 46 69 6e 64 28 27 5b 5e 20  := doc.Find('[^ 
2b50: 5c 72 5c 6e 5c 74 5d 27 2c 20 53 43 46 49 4e 44  \r\n\t]', SCFIND
2b60: 5f 52 45 47 45 58 50 20 6f 72 20 53 43 46 49 4e  _REGEXP or SCFIN
2b70: 44 5f 50 4f 53 49 58 2c 20 54 61 72 67 65 74 2e  D_POSIX, Target.
2b80: 45 6e 64 50 6f 73 2c 20 54 61 72 67 65 74 2e 53  EndPos, Target.S
2b90: 74 61 72 74 50 6f 73 29 3b 0d 0a 20 20 20 20 20  tartPos);..     
2ba0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 41 73             if As
2bb0: 73 69 67 6e 65 64 28 46 6f 75 6e 64 29 20 74 68  signed(Found) th
2bc0: 65 6e 20 62 65 67 69 6e 0d 0a 20 20 20 20 20 20  en begin..      
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 0d              try.
2be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bf0: 20 20 20 20 20 54 61 72 67 65 74 2e 45 6e 64 50       Target.EndP
2c00: 6f 73 20 3a 3d 20 46 6f 75 6e 64 2e 45 6e 64 50  os := Found.EndP
2c10: 6f 73 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  os;..           
2c20: 20 20 20 20 20 20 20 66 69 6e 61 6c 6c 79 0d 0a         finally..
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c40: 20 20 20 20 46 6f 75 6e 64 2e 46 72 65 65 3b 0d      Found.Free;.
2c50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c60: 20 20 20 65 6e 64 3b 0d 0a 20 20 20 20 20 20 20     end;..       
2c70: 20 20 20 20 20 20 20 20 20 65 6e 64 3b 0d 0a 20           end;.. 
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6e 64               end
2c90: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
2ca0: 20 54 61 72 67 65 74 2e 53 65 6c 65 63 74 3b 0d   Target.Select;.
2cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6e  .            fin
2cc0: 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20  ally..          
2cd0: 20 20 20 20 54 61 72 67 65 74 2e 46 72 65 65 3b      Target.Free;
2ce0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6e  ..            en
2cf0: 64 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6e  d;..          en
2d00: 64 20 65 6c 73 65 20 62 65 67 69 6e 0d 0a 2f 2f  d else begin..//
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 44 65 62 75              Debu
2d20: 67 57 72 69 74 65 28 27 46 69 6e 64 4d 61 74 63  gWrite('FindMatc
2d30: 68 69 6e 67 54 61 67 3a 4d 61 72 6b 69 6e 67 27  hingTag:Marking'
2d40: 2c 20 46 6f 72 6d 61 74 28 27 43 75 72 72 65 6e  , Format('Curren
2d50: 74 54 61 67 20 3d 20 54 54 65 78 74 52 61 6e 67  tTag = TTextRang
2d60: 65 28 25 64 2c 20 25 64 2c 20 22 25 73 22 29 27  e(%d, %d, "%s")'
2d70: 2c 20 5b 54 61 67 2e 53 74 61 72 74 50 6f 73 2c  , [Tag.StartPos,
2d80: 20 54 61 67 2e 45 6e 64 50 6f 73 2c 20 54 61 67   Tag.EndPos, Tag
2d90: 2e 54 65 78 74 5d 29 29 3b 0d 0a 20 20 20 20 20  .Text]));..     
2da0: 20 20 20 20 20 20 20 4d 61 74 63 68 69 6e 67 54         MatchingT
2db0: 61 67 2e 53 65 6c 65 63 74 3b 0d 0a 20 20 20 20  ag.Select;..    
2dc0: 20 20 20 20 20 20 20 20 7b 24 49 46 4e 44 45 46          {$IFNDEF
2dd0: 20 4e 50 50 5f 55 4e 49 43 4f 44 45 7d 20 2f 2f   NPP_UNICODE} //
2de0: 20 4e 50 50 20 55 6e 69 63 6f 64 65 20 68 61 73   NPP Unicode has
2df0: 20 61 6c 77 61 79 73 20 64 6f 6e 65 20 74 68 69   always done thi
2e00: 73 20 69 74 73 65 6c 66 0d 0a 20 20 20 20 20 20  s itself..      
2e10: 20 20 20 20 20 20 2f 2f 20 54 4f 44 4f 3a 20 6f        // TODO: o
2e20: 6e 6c 79 20 69 66 20 4e 50 50 20 68 61 73 20 76  nly if NPP has v
2e30: 65 72 73 69 6f 6e 20 3c 20 35 2e 30 0d 0a 20 20  ersion < 5.0..  
2e40: 20 20 20 20 20 20 20 20 20 20 54 61 67 2e 4d 61            Tag.Ma
2e50: 72 6b 28 53 54 59 4c 45 5f 42 52 41 43 45 4c 49  rk(STYLE_BRACELI
2e60: 47 48 54 2c 20 32 35 35 2c 20 6e 63 48 69 67 68  GHT, 255, ncHigh
2e70: 6c 69 67 68 74 54 69 6d 65 6f 75 74 29 3b 0d 0a  lightTimeout);..
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 4d 61 74 63              Matc
2e90: 68 69 6e 67 54 61 67 2e 4d 61 72 6b 28 53 54 59  hingTag.Mark(STY
2ea0: 4c 45 5f 42 52 41 43 45 4c 49 47 48 54 2c 20 32  LE_BRACELIGHT, 2
2eb0: 35 35 2c 20 6e 63 48 69 67 68 6c 69 67 68 74 54  55, ncHighlightT
2ec0: 69 6d 65 6f 75 74 29 3b 0d 0a 20 20 20 20 20 20  imeout);..      
2ed0: 20 20 20 20 20 20 7b 24 45 4e 44 49 46 7d 0d 0a        {$ENDIF}..
2ee0: 20 20 20 20 20 20 20 20 20 20 65 6e 64 3b 0d 0a            end;..
2ef0: 20 20 20 20 20 20 20 20 65 6e 64 20 65 6c 73 65          end else
2f00: 20 62 65 67 69 6e 0d 0a 20 20 20 20 20 20 20 20   begin..        
2f10: 20 20 69 66 20 41 53 65 6c 65 63 74 20 74 68 65    if ASelect the
2f20: 6e 20 62 65 67 69 6e 0d 0a 20 20 20 20 20 20 20  n begin..       
2f30: 20 20 20 20 20 4d 61 74 63 68 69 6e 67 54 61 67       MatchingTag
2f40: 2e 53 65 6c 65 63 74 3b 0d 0a 20 20 20 20 20 20  .Select;..      
2f50: 20 20 20 20 65 6e 64 20 65 6c 73 65 20 62 65 67      end else beg
2f60: 69 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  in..            
2f70: 4d 61 74 63 68 69 6e 67 54 61 67 2e 53 65 6c 65  MatchingTag.Sele
2f80: 63 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ct;..           
2f90: 20 7b 24 49 46 4e 44 45 46 20 4e 50 50 5f 55 4e   {$IFNDEF NPP_UN
2fa0: 49 43 4f 44 45 7d 20 2f 2f 20 4e 50 50 20 55 6e  ICODE} // NPP Un
2fb0: 69 63 6f 64 65 20 68 61 73 20 61 6c 77 61 79 73  icode has always
2fc0: 20 64 6f 6e 65 20 74 68 69 73 20 69 74 73 65 6c   done this itsel
2fd0: 66 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  f..            /
2fe0: 2f 20 54 4f 44 4f 3a 20 6f 6e 6c 79 20 69 66 20  / TODO: only if 
2ff0: 4e 50 50 20 68 61 73 20 76 65 72 73 69 6f 6e 20  NPP has version 
3000: 3c 20 35 2e 30 0d 0a 20 20 20 20 20 20 20 20 20  < 5.0..         
3010: 20 20 20 4d 61 74 63 68 69 6e 67 54 61 67 2e 4d     MatchingTag.M
3020: 61 72 6b 28 53 54 59 4c 45 5f 42 52 41 43 45 4c  ark(STYLE_BRACEL
3030: 49 47 48 54 2c 20 32 35 35 2c 20 6e 63 48 69 67  IGHT, 255, ncHig
3040: 68 6c 69 67 68 74 54 69 6d 65 6f 75 74 29 3b 0d  hlightTimeout);.
3050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 24 45  .            {$E
3060: 4e 44 49 46 7d 0d 0a 20 20 20 20 20 20 20 20 20  NDIF}..         
3070: 20 65 6e 64 3b 0d 0a 20 20 20 20 20 20 20 20 65   end;..        e
3080: 6e 64 3b 0d 0a 20 20 20 20 20 20 65 6e 64 20 65  nd;..      end e
3090: 6c 73 65 20 69 66 20 54 61 67 73 2e 43 6f 75 6e  lse if Tags.Coun
30a0: 74 20 3e 20 30 20 74 68 65 6e 20 62 65 67 69 6e  t > 0 then begin
30b0: 0d 0a 20 20 20 20 20 20 20 20 4d 65 73 73 61 67  ..        Messag
30c0: 65 42 65 65 70 28 4d 42 5f 49 43 4f 4e 57 41 52  eBeep(MB_ICONWAR
30d0: 4e 49 4e 47 29 3b 0d 0a 20 20 20 20 20 20 20 20  NING);..        
30e0: 54 61 67 20 3a 3d 20 54 54 65 78 74 52 61 6e 67  Tag := TTextRang
30f0: 65 28 54 61 67 73 2e 4f 62 6a 65 63 74 73 5b 30  e(Tags.Objects[0
3100: 5d 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  ]);..        if 
3110: 41 53 65 6c 65 63 74 20 74 68 65 6e 20 62 65 67  ASelect then beg
3120: 69 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 54 61  in..          Ta
3130: 67 2e 53 65 6c 65 63 74 3b 0d 0a 20 20 20 20 20  g.Select;..     
3140: 20 20 20 65 6e 64 3b 0d 0a 20 20 20 20 20 20 20     end;..       
3150: 20 54 61 67 2e 4d 61 72 6b 28 53 54 59 4c 45 5f   Tag.Mark(STYLE_
3160: 42 52 41 43 45 42 41 44 2c 20 32 35 35 2c 20 6e  BRACEBAD, 255, n
3170: 63 48 69 67 68 6c 69 67 68 74 54 69 6d 65 6f 75  cHighlightTimeou
3180: 74 29 3b 0d 0a 20 20 20 20 20 20 65 6e 64 20 65  t);..      end e
3190: 6c 73 65 20 62 65 67 69 6e 0d 0a 20 20 20 20 20  lse begin..     
31a0: 20 20 20 4d 65 73 73 61 67 65 42 65 65 70 28 4d     MessageBeep(M
31b0: 42 5f 49 43 4f 4e 57 41 52 4e 49 4e 47 29 3b 0d  B_ICONWARNING);.
31c0: 0a 20 20 20 20 20 20 65 6e 64 3b 0d 0a 0d 0a 20  .      end;.... 
31d0: 20 20 20 65 78 63 65 70 74 0d 0a 20 20 20 20 20     except..     
31e0: 20 6f 6e 20 45 3a 20 45 78 63 65 70 74 69 6f 6e   on E: Exception
31f0: 20 64 6f 20 62 65 67 69 6e 0d 0a 20 20 20 20 20   do begin..     
3200: 20 20 20 4d 65 73 73 61 67 65 42 65 65 70 28 4d     MessageBeep(M
3210: 42 5f 49 43 4f 4e 45 52 52 4f 52 29 3b 0d 0a 2f  B_ICONERROR);../
3220: 2f 20 20 20 20 20 20 20 20 44 65 62 75 67 57 72  /        DebugWr
3230: 69 74 65 28 27 46 69 6e 64 4d 61 74 63 68 69 6e  ite('FindMatchin
3240: 67 54 61 67 3a 45 78 63 65 70 74 69 6f 6e 27 2c  gTag:Exception',
3250: 20 46 6f 72 6d 61 74 28 27 25 73 3a 20 22 25 73   Format('%s: "%s
3260: 22 27 2c 20 5b 45 2e 43 6c 61 73 73 4e 61 6d 65  "', [E.ClassName
3270: 2c 20 45 2e 4d 65 73 73 61 67 65 5d 29 29 3b 0d  , E.Message]));.
3280: 0a 20 20 20 20 20 20 65 6e 64 3b 0d 0a 20 20 20  .      end;..   
3290: 20 65 6e 64 3b 0d 0a 20 20 66 69 6e 61 6c 6c 79   end;..  finally
32a0: 0d 0a 20 20 20 20 77 68 69 6c 65 20 54 61 67 73  ..    while Tags
32b0: 2e 43 6f 75 6e 74 20 3e 20 30 20 64 6f 20 62 65  .Count > 0 do be
32c0: 67 69 6e 0d 0a 20 20 20 20 20 20 54 61 67 20 3a  gin..      Tag :
32d0: 3d 20 54 54 65 78 74 52 61 6e 67 65 28 54 61 67  = TTextRange(Tag
32e0: 73 2e 4f 62 6a 65 63 74 73 5b 30 5d 29 3b 0d 0a  s.Objects[0]);..
32f0: 2f 2f 20 20 20 20 20 20 44 65 62 75 67 57 72 69  //      DebugWri
3300: 74 65 28 27 46 69 6e 64 4d 61 74 63 68 69 6e 67  te('FindMatching
3310: 54 61 67 3a 43 6c 65 61 6e 75 70 27 2c 20 46 6f  Tag:Cleanup', Fo
3320: 72 6d 61 74 28 27 54 61 67 73 5b 22 25 73 22 5d  rmat('Tags["%s"]
3330: 20 3d 20 54 54 65 78 74 52 61 6e 67 65 28 25 64   = TTextRange(%d
3340: 2c 20 25 64 2c 20 22 25 73 22 29 27 2c 20 5b 54  , %d, "%s")', [T
3350: 61 67 73 2e 53 74 72 69 6e 67 73 5b 30 5d 2c 20  ags.Strings[0], 
3360: 54 61 67 2e 53 74 61 72 74 50 6f 73 2c 20 54 61  Tag.StartPos, Ta
3370: 67 2e 45 6e 64 50 6f 73 2c 20 54 61 67 2e 54 65  g.EndPos, Tag.Te
3380: 78 74 5d 29 29 3b 0d 0a 20 20 20 20 20 20 54 61  xt]));..      Ta
3390: 67 73 2e 4f 62 6a 65 63 74 73 5b 30 5d 2e 46 72  gs.Objects[0].Fr
33a0: 65 65 3b 0d 0a 20 20 20 20 20 20 54 61 67 73 2e  ee;..      Tags.
33b0: 44 65 6c 65 74 65 28 30 29 3b 0d 0a 20 20 20 20  Delete(0);..    
33c0: 65 6e 64 3b 0d 0a 20 20 20 20 46 72 65 65 41 6e  end;..    FreeAn
33d0: 64 4e 69 6c 28 54 61 67 73 29 3b 0d 0a 20 20 65  dNil(Tags);..  e
33e0: 6e 64 3b 0d 0a 0d 0a 20 20 2f 2f 4d 65 73 73 61  nd;....  //Messa
33f0: 67 65 42 6f 78 28 6e 70 70 2e 57 69 6e 64 6f 77  geBox(npp.Window
3400: 48 61 6e 64 6c 65 2c 20 50 43 68 61 72 28 27 43  Handle, PChar('C
3410: 75 72 72 65 6e 74 20 74 61 67 3a 20 27 20 2b 20  urrent tag: ' + 
3420: 54 61 67 4e 61 6d 65 29 2c 20 73 63 50 54 69 74  TagName), scPTit
3430: 6c 65 2c 20 4d 42 5f 49 43 4f 4e 49 4e 46 4f 52  le, MB_ICONINFOR
3440: 4d 41 54 49 4f 4e 29 3b 0d 0a 65 6e 64 3b 0d 0a  MATION);..end;..
3450: 0d 0a 65 6e 64 2e 0d 0a 0d 0a                    ..end.....