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.....