whtml.pas 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735
  1. {
  2. $Id$
  3. This file is part of the Free Pascal Integrated Development Environment
  4. Copyright (c) 1998 by Berczi Gabor
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. unit WHTML;
  12. {$I globdir.inc}
  13. interface
  14. uses Objects;
  15. type
  16. PTextFile = ^TTextFile;
  17. TTextFile = object(TObject)
  18. function GetLine(Idx: sw_integer; var S: string): boolean; virtual;
  19. end;
  20. PMemoryTextFile = ^TMemoryTextFile;
  21. TMemoryTextFile = object(TTextFile)
  22. constructor Init;
  23. procedure AddLine(const S: string); virtual;
  24. function GetLine(Idx: sw_integer; var S: string): boolean; virtual;
  25. destructor Done; virtual;
  26. private
  27. Lines : PUnsortedStrCollection;
  28. end;
  29. PDOSTextFile = ^TDOSTextFile;
  30. TDOSTextFile = object(TMemoryTextFile)
  31. constructor Init(AFileName: string);
  32. end;
  33. PSGMLParser = ^TSGMLParser;
  34. TSGMLParser = object(TObject)
  35. constructor Init;
  36. function Process(HTMLFile: PTextFile): boolean; virtual;
  37. function ProcessLine(LineText: string): boolean; virtual;
  38. destructor Done; virtual;
  39. public
  40. Line,LinePos: sw_integer;
  41. procedure DocSoftBreak; virtual;
  42. function DocAddTextChar(C: char): boolean; virtual;
  43. procedure DocAddText(S: string); virtual;
  44. procedure DocProcessTag(Tag: string); virtual;
  45. procedure DocProcessComment(Comment: string); virtual;
  46. function DocDecodeNamedEntity(Name: string; var Entity: string): boolean; virtual;
  47. private
  48. CurTag: string;
  49. InTag,InComment,InString: boolean;
  50. end;
  51. PHTMLParser = ^THTMLParser;
  52. THTMLParser = object(TSGMLParser)
  53. procedure DocSoftBreak; virtual;
  54. function DocAddTextChar(C: char): boolean; virtual;
  55. procedure DocProcessTag(Tag: string); virtual;
  56. function DocGetTagParam(Name: string; var Value: string): boolean; virtual;
  57. procedure DocProcessComment(Comment: string); virtual;
  58. function DocDecodeNamedEntity(Name: string; var E: string): boolean; virtual;
  59. public
  60. TagName,TagParams: string;
  61. procedure DocUnknownTag; virtual;
  62. procedure DocTYPE; virtual;
  63. procedure DocHTML(Entered: boolean); virtual;
  64. procedure DocHEAD(Entered: boolean); virtual;
  65. procedure DocMETA; virtual;
  66. procedure DocTITLE(Entered: boolean); virtual;
  67. procedure DocBODY(Entered: boolean); virtual;
  68. procedure DocAnchor(Entered: boolean); virtual;
  69. procedure DocHeading(Level: integer; Entered: boolean); virtual;
  70. procedure DocParagraph(Entered: boolean); virtual;
  71. procedure DocBreak; virtual;
  72. procedure DocImage; virtual;
  73. procedure DocBold(Entered: boolean); virtual;
  74. procedure DocCite(Entered: boolean); virtual;
  75. procedure DocCode(Entered: boolean); virtual;
  76. procedure DocEmphasized(Entered: boolean); virtual;
  77. procedure DocItalic(Entered: boolean); virtual;
  78. procedure DocKbd(Entered: boolean); virtual;
  79. procedure DocPreformatted(Entered: boolean); virtual;
  80. procedure DocSample(Entered: boolean); virtual;
  81. procedure DocStrong(Entered: boolean); virtual;
  82. procedure DocTeleType(Entered: boolean); virtual;
  83. procedure DocVariable(Entered: boolean); virtual;
  84. procedure DocList(Entered: boolean); virtual;
  85. procedure DocOrderedList(Entered: boolean); virtual;
  86. procedure DocListItem; virtual;
  87. procedure DocDefList(Entered: boolean); virtual;
  88. procedure DocDefTerm; virtual;
  89. procedure DocDefExp; virtual;
  90. procedure DocTable(Entered: boolean); virtual;
  91. procedure DocTableRow(Entered: boolean); virtual;
  92. procedure DocTableHeaderItem(Entered: boolean); virtual;
  93. procedure DocTableItem(Entered: boolean); virtual;
  94. procedure DocHorizontalRuler; virtual;
  95. end;
  96. implementation
  97. uses WUtils;
  98. function TTextFile.GetLine(Idx: sw_integer; var S: string): boolean;
  99. begin
  100. Abstract;
  101. GetLine:=false;
  102. end;
  103. constructor TMemoryTextFile.Init;
  104. begin
  105. inherited Init;
  106. New(Lines, Init(500,500));
  107. end;
  108. procedure TMemoryTextFile.AddLine(const S: string);
  109. begin
  110. Lines^.Insert(NewStr(S));
  111. end;
  112. function TMemoryTextFile.GetLine(Idx: sw_integer; var S: string): boolean;
  113. var OK: boolean;
  114. PS: PString;
  115. begin
  116. OK:=(Lines<>nil) and (Idx<Lines^.Count);
  117. if OK then
  118. begin
  119. PS:=Lines^.At(Idx);
  120. if PS=nil then S:='' else S:=PS^;
  121. end;
  122. GetLine:=OK;
  123. end;
  124. destructor TMemoryTextFile.Done;
  125. begin
  126. inherited Done;
  127. if Lines<>nil then Dispose(Lines, Done); Lines:=nil;
  128. end;
  129. constructor TDOSTextFile.Init(AFileName: string);
  130. (*{$ifdef TPUNIXLF}
  131. procedure readln(var t:text;var s:string);
  132. var
  133. c : char;
  134. i : longint;
  135. begin
  136. c:=#0;
  137. i:=0;
  138. while (not eof(t)) and (c<>#10) and (i<255) do
  139. begin
  140. read(t,c);
  141. if (i<255) and (c<>#10) then
  142. begin
  143. inc(i);
  144. s[i]:=c;
  145. end;
  146. end;
  147. if (i>0) and (s[i]=#13) then
  148. dec(i);
  149. s[0]:=chr(i);
  150. end;
  151. {$endif}*)
  152. var f: text;
  153. S: string;
  154. begin
  155. inherited Init;
  156. if AFileName='' then Fail;
  157. {$I-}
  158. Assign(f,AFileName);
  159. Reset(f);
  160. if IOResult<>0 then Fail;
  161. New(Lines, Init(500,2000));
  162. while (Eof(f)=false) and (IOResult=0) do
  163. begin
  164. readln(f,S); { this is the one in WUTILS.PAS }
  165. AddLine(S);
  166. end;
  167. Close(f);
  168. {$I+}
  169. end;
  170. constructor TSGMLParser.Init;
  171. begin
  172. inherited Init;
  173. end;
  174. function TSGMLParser.Process(HTMLFile: PTextFile): boolean;
  175. var S: string;
  176. OK,LineOK: boolean;
  177. begin
  178. if HTMLFile=nil then Exit;
  179. InTag:=false; InComment:=false; InString:=false; CurTag:='';
  180. Line:=0; OK:=true;
  181. repeat
  182. LineOK:=HTMLFile^.GetLine(Line,S);
  183. if LineOK then
  184. begin
  185. OK:=ProcessLine(S);
  186. Inc(Line);
  187. end;
  188. until (LineOK=false) or (OK=false);
  189. Process:=OK;
  190. end;
  191. function TSGMLParser.ProcessLine(LineText: string): boolean;
  192. var OK: boolean;
  193. C: char;
  194. NewInString: boolean;
  195. OldInComment: boolean;
  196. WasThereAnyText: boolean;
  197. Pos2: integer;
  198. Name,Entity: string;
  199. LiteralCode: boolean;
  200. LiteralStart,LiteralEnd,P: integer;
  201. const TabSize : integer = 8;
  202. Tab = #9;
  203. begin
  204. WasThereAnyText:=false;
  205. OK:=true; LinePos:=1;
  206. LiteralStart:=0; LiteralEnd:=0;
  207. repeat
  208. P:=Pos(TAB,LineText);
  209. if P>0 then
  210. LineText:=copy(LineText,1,P-1)+CharStr(' ',TabSize)+copy(LineText,P+1,255);
  211. until P=0;
  212. while (LinePos<=length(LineText)) and OK do
  213. begin
  214. LiteralCode:=false;
  215. NewInString:=InString; OldInComment:=InComment;
  216. C:=LineText[LinePos];
  217. LiteralCode:=(LiteralStart<=LinePos) and (LinePos<=LiteralEnd);
  218. if (LiteralCode=false) and (C='&') then
  219. begin
  220. LiteralStart:=0; LiteralEnd:=0;
  221. Name:=''; Pos2:=LinePos+1;
  222. while (Pos2<=length(LineText)) and (LineText[Pos2]<>';') do
  223. begin
  224. Name:=Name+LineText[Pos2];
  225. Inc(Pos2);
  226. end;
  227. Inc(Pos2);
  228. if DocDecodeNamedEntity(Name,Entity) then
  229. begin
  230. LineText:=copy(LineText,1,LinePos-1)+Entity+copy(LineText,Pos2,255);
  231. LiteralStart:=LinePos; LiteralEnd:=LiteralStart+length(Entity)-1;
  232. C:=LineText[LinePos];
  233. end;
  234. end;
  235. LiteralCode:=(LiteralStart<=LinePos) and (LinePos<=LiteralEnd);
  236. if (LiteralCode=false) and (C='"') and (InTag=true) and (InString=false) then
  237. NewInString:=true;
  238. if (LiteralCode=false) and (C='<') and (InTag=false) then
  239. InTag:=true;
  240. if InTag then CurTag:=CurTag+C else
  241. WasThereAnyText:=DocAddTextChar(C);
  242. if (LiteralCode=false) and InTag and (InString=false) and (CurTag='<!--') then
  243. InComment:=true;
  244. if (LiteralCode=false) and InTag and InComment and (InString=false) and (length(CurTag)>=3) and
  245. (copy(CurTag,length(CurTag)-2,3)='-->') then
  246. InComment:=false;
  247. if (LiteralCode=false) and (C='"') and (InTag=true) and (InString=true) then
  248. NewInString:=false;
  249. if (LiteralCode=false) and (C='>') and (InTag=true) then
  250. begin
  251. InTag:=false;
  252. if OldInComment then
  253. DocProcessComment(CurTag)
  254. else
  255. DocProcessTag(CurTag);
  256. CurTag:='';
  257. end;
  258. InString:=NewInString;
  259. Inc(LinePos);
  260. end;
  261. if WasThereAnyText then DocSoftBreak;
  262. ProcessLine:=true;
  263. end;
  264. procedure TSGMLParser.DocSoftBreak;
  265. begin
  266. Abstract;
  267. end;
  268. function TSGMLParser.DocAddTextChar(C: char): boolean;
  269. begin
  270. Abstract;
  271. DocAddTextChar:=false;
  272. end;
  273. procedure TSGMLParser.DocAddText(S: string);
  274. var I: sw_integer;
  275. begin
  276. for I:=1 to length(S) do
  277. DocAddTextChar(S[I]);
  278. end;
  279. function TSGMLParser.DocDecodeNamedEntity(Name: string; var Entity: string): boolean;
  280. begin
  281. DocDecodeNamedEntity:=false;
  282. end;
  283. procedure TSGMLParser.DocProcessTag(Tag: string);
  284. begin
  285. Abstract;
  286. end;
  287. procedure TSGMLParser.DocProcessComment(Comment: string);
  288. begin
  289. Abstract;
  290. end;
  291. destructor TSGMLParser.Done;
  292. begin
  293. inherited Done;
  294. end;
  295. procedure THTMLParser.DocSoftBreak;
  296. begin
  297. end;
  298. function THTMLParser.DocAddTextChar(C: char): boolean;
  299. begin
  300. { Abstract }
  301. DocAddTextChar:=false;
  302. end;
  303. function THTMLParser.DocDecodeNamedEntity(Name: string; var E: string): boolean;
  304. var Found: boolean;
  305. Code: integer;
  306. CC: integer;
  307. begin
  308. Found:=true; Code:=-1;
  309. Name:=LowCaseStr(Name);
  310. if copy(Name,1,1)='#' then
  311. begin
  312. Val(copy(Name,2,255),Code,CC);
  313. if CC<>0 then Code:=-1;
  314. end;
  315. if (Name='lt') then E:='<' else { less-than sign }
  316. if (Name='gt') then E:='>' else { greater-than sign }
  317. if (Name='amp') then E:='&' else { ampersand }
  318. if (Name='quot') then E:='"' else { double quote sign }
  319. if (Code=160) or (Name='nbsp') then E:=#255 else { no-break space }
  320. if (Code=161) or (Name='iexcl') then E:='­' else { inverted excalamation mark }
  321. if (Code=162) or (Name='cent') then E:='›' else { cent sign }
  322. if (Code=163) or (Name='pound') then E:='œ' else { pound sterling sign }
  323. if (Code=164) or (Name='curren') then E:='$' else { general currency sign }
  324. if (Code=165) or (Name='yen') then E:='�' else { yen sign }
  325. if (Code=166) or (Name='brvbar') then E:='|' else { broken vertical bar }
  326. (* if (Code=167) or (Name='sect') then E:=#255 else { section sign }*)
  327. (* if (Code=168) or (Name='uml') then E:=#255 else { umlaut (dieresis) }*)
  328. if (Code=169) or (Name='copy') then E:='(C)' else { copyright sign }
  329. (* if (Code=170) or (Name='ordf') then E:=#255 else { ordinal indicator, feminine }*)
  330. if (Code=171) or (Name='laquo') then E:='"' else { angle quotation mark -left }
  331. if (Code=172) or (Name='not') then E:='!' else { not sign }
  332. if (Code=173) or (Name='shy') then E:='-' else { soft hypen }
  333. if (Code=174) or (Name='reg') then E:='(R)' else { registered sign }
  334. (* if (Code=175) or (Name='macr') then E:='?' else { macron }*)
  335. if (Code=176) or (Name='deg') then E:='ø' else { degree sign }
  336. if (Code=177) or (Name='plusmn') then E:='ñ' else { plus-or-minus sign }
  337. if (Code=178) or (Name='sup2') then E:='ý' else { superscript 2 }
  338. if (Code=179) or (Name='sup3') then E:='^3' else { superscript 3 }
  339. if (Code=180) or (Name='acute') then E:='''' else { acute accent }
  340. if (Code=181) or (Name='micro') then E:='æ' else { micro sign }
  341. (* if (Code=182) or (Name='para') then E:='?' else { paragraph sign }*)
  342. if (Code=183) or (Name='middot') then E:='ù' else { middle dot }
  343. (* if (Code=184) or (Name='cedil') then E:='?' else { cedilla }*)
  344. if (Code=185) or (Name='sup1') then E:='^1' else { superscript 1 }
  345. (* if (Code=186) or (Name='ordm') then E:='?' else { ordinal indicator, masculine }*)
  346. if (Code=187) or (Name='raquo') then E:='"' else { angle quoatation mark -right }
  347. if (Code=188) or (Name='frac14') then E:='¬' else { fraction one-quarter }
  348. if (Code=189) or (Name='frac12') then E:='«' else { fraction one-half }
  349. if (Code=190) or (Name='frac34') then E:='3/4' else { fraction three-quarters }
  350. if (Code=191) or (Name='iquest') then E:='¨' else { inverted question mark }
  351. if (Code=192) or (Name='Agrave') then E:='A' else { capital A, grave accent }
  352. if (Code=193) or (Name='Aacute') then E:='A' else { capital A, acute accent }
  353. if (Code=194) or (Name='Acirc') then E:='A' else { capital A, circumflex accent }
  354. if (Code=195) or (Name='Atilde') then E:='A' else { capital A, tilde accent }
  355. if (Code=196) or (Name='Auml') then E:='Ž' else { capital A, dieresis or umlaut }
  356. if (Code=197) or (Name='Aring') then E:='�' else { capital A, ring }
  357. if (Code=198) or (Name='AElig') then E:='AE' else { capital AE diphthong }
  358. (* if (Code=199) or (Name='Ccedil') then E:='?' else { capital C, cedilla }*)
  359. if (Code=200) or (Name='Egrave') then E:='�' else { capital E, grave accent }
  360. if (Code=201) or (Name='Eacute') then E:='�' else { capital E, acute accent }
  361. if (Code=202) or (Name='Ecirc') then E:='E' else { capital E, circumflex accent }
  362. if (Code=203) or (Name='Euml') then E:='E' else { capital E, dieresis or umlaut }
  363. if (Code=204) or (Name='Igrave') then E:='I' else { capital I, grave accent }
  364. if (Code=205) or (Name='Iacute') then E:='I' else { capital I, acute accent }
  365. if (Code=206) or (Name='Icirc') then E:='I' else { capital I, circumflex accent }
  366. if (Code=207) or (Name='Iuml') then E:='I' else { capital I, dieresis or umlaut }
  367. (* if (Code=208) or (Name='ETH') then E:='?' else { capital Eth, Icelandic }*)
  368. if (Code=209) or (Name='Ntidle') then E:='¥' else { capital N, tilde }
  369. if (Code=210) or (Name='Ograve') then E:='O' else { capital O, grave accent }
  370. if (Code=211) or (Name='Oacute') then E:='O' else { capital O, acute accent }
  371. if (Code=212) or (Name='Ocirc') then E:='O' else { capital O, circumflex accent }
  372. if (Code=213) or (Name='Otilde') then E:='O' else { capital O, tilde }
  373. if (Code=214) or (Name='Ouml') then E:='™' else { capital O, dieresis or umlaut }
  374. if (Code=215) or (Name='times') then E:='*' else { multiply sign }
  375. if (Code=216) or (Name='Oslash') then E:='O' else { capital O, slash }
  376. if (Code=217) or (Name='Ugrave') then E:='U' else { capital U, grave accent }
  377. if (Code=218) or (Name='Uacute') then E:='U' else { capital U, acute accent }
  378. if (Code=219) or (Name='Ucirc') then E:='U' else { capital U, circumflex accent }
  379. if (Code=220) or (Name='Uuml') then E:='š' else { capital U, dieresis or umlaut }
  380. if (Code=221) or (Name='Yacute') then E:='Y' else { capital Y, acute accent }
  381. (* if (Code=222) or (Name='THORN') then E:='?' else { capital THORN, Icelandic }*)
  382. if (Code=223) or (Name='szlig') then E:='á' else { small sharp S, German }
  383. if (Code=224) or (Name='agrave') then E:='…' else { small a, grave accent }
  384. if (Code=225) or (Name='aacute') then E:=' ' else { small a, acute accent }
  385. if (Code=226) or (Name='acirc') then E:='ƒ' else { small a, circumflex accent }
  386. if (Code=227) or (Name='atilde') then E:='ƒ' else { small a, tilde }
  387. if (Code=228) or (Name='auml') then E:='„' else { small a, dieresis or umlaut }
  388. if (Code=229) or (Name='aring') then E:='†' else { small a, ring }
  389. if (Code=230) or (Name='aelig') then E:='ae' else { small ae, diphthong }
  390. (* if (Code=231) or (Name='ccedil') then E:='?' else { small c, cedilla }*)
  391. if (Code=232) or (Name='egrave') then E:='Š' else { small e, grave accent }
  392. if (Code=233) or (Name='eacute') then E:='‚' else { small e, acute accent }
  393. if (Code=234) or (Name='ecirc') then E:='ˆ' else { small e, circumflex accent }
  394. if (Code=235) or (Name='euml') then E:='‰' else { small e, dieresis or umlaut }
  395. if (Code=236) or (Name='igrave') then E:='�' else { small i, grave accent }
  396. if (Code=237) or (Name='iacute') then E:='¡' else { small i, acute accent }
  397. if (Code=238) or (Name='icirc') then E:='Œ' else { small i, circumflex accent }
  398. if (Code=239) or (Name='iuml') then E:='‹' else { small i, dieresis or umlaut }
  399. (* if (Code=240) or (Name='eth') then E:='?' else { small eth, Icelandic }*)
  400. if (Code=241) or (Name='ntilde') then E:='¤' else { small n, tilde }
  401. if (Code=242) or (Name='ograve') then E:='•' else { small o, grave accent }
  402. if (Code=243) or (Name='oacute') then E:='¢' else { small o, acute accent }
  403. if (Code=244) or (Name='ocirc') then E:='“' else { small o, circumflex accent }
  404. if (Code=245) or (Name='otilde') then E:='“' else { small o, tilde }
  405. if (Code=246) or (Name='ouml') then E:='”' else { small o, dieresis or umlaut }
  406. if (Code=247) or (Name='divide') then E:='/' else { divide sign }
  407. if (Code=248) or (Name='oslash') then E:='"' else { small o, slash }
  408. if (Code=249) or (Name='ugrave') then E:='—' else { small u, grave accent }
  409. if (Code=250) or (Name='uacute') then E:='£' else { small u, acute accent }
  410. if (Code=251) or (Name='ucirc') then E:='–' else { small u, circumflex accent }
  411. if (Code=252) or (Name='uuml') then E:='�' else { small u, dieresis or umlaut }
  412. if (Code=253) or (Name='yacute') then E:='y' else { small y, acute accent }
  413. (* if (Code=254) or (Name='thorn') then E:='?' else { small thorn, Icelandic }*)
  414. if (Code=255) or (Name='yuml') then E:='y' else { small y, dieresis or umlaut }
  415. Found:=false;
  416. DocDecodeNamedEntity:=Found;
  417. end;
  418. procedure THTMLParser.DocProcessTag(Tag: string);
  419. var UTagName,ETagName: string[30];
  420. P: byte;
  421. NotEndTag: boolean;
  422. begin
  423. if copy(Tag,1,1)='<' then Delete(Tag,1,1);
  424. if copy(Tag,length(Tag),1)='>' then Delete(Tag,length(Tag),1);
  425. Tag:=Trim(Tag);
  426. P:=Pos(' ',Tag); if P=0 then P:=length(Tag)+1;
  427. TagName:=copy(Tag,1,P-1); TagParams:=copy(Tag,P+1,255);
  428. UTagName:=UpcaseStr(TagName);
  429. NotEndTag:=copy(TagName,1,1)<>'/';
  430. if NotEndTag then ETagName:=UTagName else ETagName:=copy(UTagName,2,255);
  431. if (UTagName='!DOCTYPE') then DocTYPE else
  432. { Section tags }
  433. if (ETagName='HTML') then DocHTML(NotEndTag) else
  434. if (ETagName='HEAD') then DocHEAD(NotEndTag) else
  435. if (ETagName='TITLE') then DocTITLE(NotEndTag) else
  436. if (ETagName='BODY') then DocBODY(NotEndTag) else
  437. { Anchor tags }
  438. if (ETagName='A') then DocAnchor(NotEndTag) else
  439. { Direct formatting directives }
  440. if (ETagName='H1') then DocHeading(1,NotEndTag) else
  441. if (ETagName='H2') then DocHeading(2,NotEndTag) else
  442. if (ETagName='H3') then DocHeading(3,NotEndTag) else
  443. if (ETagName='H4') then DocHeading(4,NotEndTag) else
  444. if (ETagName='H5') then DocHeading(5,NotEndTag) else
  445. if (ETagName='H6') then DocHeading(6,NotEndTag) else
  446. if (ETagName='P') then DocParagraph(NotEndTag) else
  447. if (ETagName='BR') then DocBreak else
  448. if (ETagName='B') then DocBold(NotEndTag) else
  449. if (ETagName='CITE') then DocCite(NotEndTag) else
  450. if (ETagName='CODE') then DocCode(NotEndTag) else
  451. if (ETagName='EM') then DocEmphasized(NotEndTag) else
  452. if (ETagName='I') then DocItalic(NotEndTag) else
  453. if (ETagName='KBD') then DocKbd(NotEndTag) else
  454. if (ETagName='PRE') then DocPreformatted(NotEndTag) else
  455. if (ETagName='SAMP') then DocSample(NotEndTag) else
  456. if (ETagName='STRONG') then DocStrong(NotEndTag) else
  457. if (ETagName='TT') then DocTeleType(NotEndTag) else
  458. if (ETagName='VAR') then DocVariable(NotEndTag) else
  459. { Unordered & ordered lists }
  460. if (ETagName='UL') then DocList(NotEndTag) else
  461. if (ETagName='OL') then DocOrderedList(NotEndTag) else
  462. if (UTagName='LI') then DocListItem else
  463. { Definition list }
  464. if (ETagName='DL') then DocDefList(NotEndTag) else
  465. if (UTagName='DT') then DocDefTerm else
  466. if (UTagName='DD') then DocDefExp else
  467. { Table }
  468. if (ETagName='TABLE') then DocTable(NotEndTag) else
  469. if (UTagName='TR') then DocTableRow(NotEndTag) else
  470. if (UTagName='TH') then DocTableHeaderItem(NotEndTag) else
  471. if (UTagName='TD') then DocTableItem(NotEndTag) else
  472. { Misc. tags }
  473. if (UTagName='META') then DocMETA else
  474. if (UTagName='IMG') then DocImage else
  475. if (UTagName='HR') then DocHorizontalRuler else
  476. DocUnknownTag;
  477. end;
  478. function THTMLParser.DocGetTagParam(Name: string; var Value: string): boolean;
  479. var Found: boolean;
  480. S: string;
  481. ParamName,ParamValue: string;
  482. InStr: boolean;
  483. I: sw_integer;
  484. begin
  485. Found:=false; Name:=UpcaseStr(Name);
  486. S:=TagParams;
  487. repeat
  488. InStr:=false;
  489. ParamName:=''; ParamValue:='';
  490. S:=Trim(S); I:=1;
  491. while (I<=length(S)) and (S[I]<>'=') do
  492. begin
  493. ParamName:=ParamName+S[I];
  494. Inc(I);
  495. end;
  496. ParamName:=Trim(ParamName);
  497. if S[I]='=' then
  498. begin
  499. Inc(I); InStr:=false;
  500. while (I<=length(S)) and (S[I]=' ') do
  501. Inc(I);
  502. if (I<=length(S)) and (S[I]='"') then
  503. begin
  504. InStr:=true;
  505. Inc(I);
  506. end;
  507. while (I<=length(S)) and ((InStr=true) or (S[I]<>' ')) do
  508. begin
  509. if S[I]='"' then
  510. begin
  511. InStr:=not InStr;
  512. if InStr=false then Break;
  513. end
  514. else
  515. ParamValue:=ParamValue+S[I];
  516. Inc(I);
  517. end;
  518. end;
  519. Found:=(Name=UpcaseStr(ParamName));
  520. if Found then Value:=ParamValue;
  521. Delete(S,1,I);
  522. until Found or (S='');
  523. DocGetTagParam:=Found;
  524. end;
  525. procedure THTMLParser.DocProcessComment(Comment: string);
  526. begin
  527. end;
  528. procedure THTMLParser.DocUnknownTag;
  529. begin
  530. end;
  531. procedure THTMLParser.DocTYPE;
  532. begin
  533. end;
  534. procedure THTMLParser.DocHTML(Entered: boolean);
  535. begin
  536. end;
  537. procedure THTMLParser.DocHEAD(Entered: boolean);
  538. begin
  539. end;
  540. procedure THTMLParser.DocMETA;
  541. begin
  542. end;
  543. procedure THTMLParser.DocTITLE(Entered: boolean);
  544. begin
  545. end;
  546. procedure THTMLParser.DocBODY(Entered: boolean);
  547. begin
  548. end;
  549. procedure THTMLParser.DocAnchor(Entered: boolean);
  550. begin
  551. end;
  552. procedure THTMLParser.DocHeading(Level: integer; Entered: boolean);
  553. begin
  554. end;
  555. procedure THTMLParser.DocParagraph(Entered: boolean);
  556. begin
  557. end;
  558. procedure THTMLParser.DocBreak;
  559. begin
  560. end;
  561. procedure THTMLParser.DocImage;
  562. begin
  563. end;
  564. procedure THTMLParser.DocBold(Entered: boolean);
  565. begin
  566. end;
  567. procedure THTMLParser.DocCite(Entered: boolean);
  568. begin
  569. end;
  570. procedure THTMLParser.DocCode(Entered: boolean);
  571. begin
  572. end;
  573. procedure THTMLParser.DocEmphasized(Entered: boolean);
  574. begin
  575. end;
  576. procedure THTMLParser.DocItalic(Entered: boolean);
  577. begin
  578. end;
  579. procedure THTMLParser.DocKbd(Entered: boolean);
  580. begin
  581. end;
  582. procedure THTMLParser.DocPreformatted(Entered: boolean);
  583. begin
  584. end;
  585. procedure THTMLParser.DocSample(Entered: boolean);
  586. begin
  587. end;
  588. procedure THTMLParser.DocStrong(Entered: boolean);
  589. begin
  590. end;
  591. procedure THTMLParser.DocTeleType(Entered: boolean);
  592. begin
  593. end;
  594. procedure THTMLParser.DocVariable(Entered: boolean);
  595. begin
  596. end;
  597. procedure THTMLParser.DocList(Entered: boolean);
  598. begin
  599. end;
  600. procedure THTMLParser.DocOrderedList(Entered: boolean);
  601. begin
  602. end;
  603. procedure THTMLParser.DocListItem;
  604. begin
  605. end;
  606. procedure THTMLParser.DocDefList(Entered: boolean);
  607. begin
  608. end;
  609. procedure THTMLParser.DocDefTerm;
  610. begin
  611. end;
  612. procedure THTMLParser.DocDefExp;
  613. begin
  614. end;
  615. procedure THTMLParser.DocTable(Entered: boolean);
  616. begin
  617. end;
  618. procedure THTMLParser.DocTableRow(Entered: boolean);
  619. begin
  620. end;
  621. procedure THTMLParser.DocTableHeaderItem(Entered: boolean);
  622. begin
  623. end;
  624. procedure THTMLParser.DocTableItem(Entered: boolean);
  625. begin
  626. end;
  627. procedure THTMLParser.DocHorizontalRuler;
  628. begin
  629. end;
  630. END.
  631. {
  632. $Log$
  633. Revision 1.1 2000-07-13 09:48:37 michael
  634. + Initial import
  635. Revision 1.7 2000/06/22 09:07:15 pierre
  636. * Gabor changes: see fixes.txt
  637. Revision 1.6 2000/04/25 08:42:35 pierre
  638. * New Gabor changes : see fixes.txt
  639. Revision 1.5 2000/03/21 23:20:47 pierre
  640. suppress some warnings by Gabor
  641. Revision 1.4 1999/04/07 21:56:03 peter
  642. + object support for browser
  643. * html help fixes
  644. * more desktop saving things
  645. * NODEBUG directive to exclude debugger
  646. Revision 1.3 1999/03/01 15:51:42 peter
  647. + Log
  648. }