program tidyhelp; { Crude interface to TidyLib's embedded documentation. } {$IFDEF FPC}{$H+}{$MODE OBJFPC}{$ENDIF} uses tidy_h, tidytree; function GetMaxOptLength(doc:pTidyDoc):LongInt; var L:Longint; id:TidyOptionID; begin Result:=0; for id :=low(TidyOptionId) to high(TidyOptionId) do begin L:=length(string(tidyOptGetName(tidyGetOption(doc, id)))); if ( L > Result ) then Result:=L; end; end; function rpad(const s:string; len:longint):string; begin Result:=s; while ( length(result) < len ) do Result:=Result+' '; end; procedure WrapText(const src:pChar; width:LongInt); var p1, p2:pChar; tmp:ansistring; const Breakers=[#9, #32, ',', '.']; begin WriteLn(StringOfChar('-', width)); tmp:=src; EntsToChars(tmp); tmp:=tmp+#0; p1:=@tmp[1]; repeat if ( length(p1) < width ) then begin WriteLn(' ', p1); BREAK; end; p2:=@p1[width]; while ( p2 > p1 ) and ( not ( p2^ in Breakers) ) do dec(p2); if ( p2^ in Breakers) then begin WriteLn(' ', copy(p1, 1, p2-p1)); if (p2^=#32) then inc(p2) end; p1:=p2; until False; WriteLn(StringOfChar('-', width)); end; var doc:pTidyDoc; opt:pTidyOption; cat:TidyConfigCategory=TidyMarkup; iter:pTidyIterator; i:LongInt; s:shortstring; L, W:LongInt; e:LongInt; name:ansistring; const WIDTH=50; begin WriteLn; doc:=tidyCreate; W:=GetMaxOptLength(doc); repeat WriteLn('Choose category:'); WriteLn(' 1. Markup 2. Diagnostics 3. Pretty-Printing'); WriteLn(' 4. Encoding 5. Miscellaneous 6. Quit'); Write('?>'); read(input, s); if ( s = '' ) then S:='0'; while ( length(s) <> 1 ) or ( not ( s[1] in ['1'..'6'] ) ) do begin WriteLn('Please enter a number from 1 to 6'); Write('?>'); ReadLn(input, s); if ( s = '' ) then S:='0' end; case S[1] of '1':cat:=TidyMarkup; '2':cat:=TidyDiagnostics; '3':cat:=TidyPrettyPrint; '4':cat:=TidyEncoding; '5':cat:=TidyMiscellaneous; '6': HALT; end; WriteLn('Choose option:'); iter:=tidyGetOptionList(doc); i:=0; repeat opt:=tidyGetNextOption(doc, @iter); if ( opt = nil ) then BREAK; if ( tidyOptGetCategory(opt) = cat ) then begin inc(i); Write(i:2, ': ', rpad(tidyOptGetName(opt), W)); if ( ( i mod 2 ) = 0 ) then WriteLn; end; until FALSE; if ( ( i mod 2 ) <> 0 ) then WriteLn; Write('?>'); ReadLn(s); ReadLn(s); // why do i need this twice ??? e:=0; val(s, L, e); while ( e <> 0 ) or ( L < 1 ) or ( L > i ) do begin WriteLn('Please enter a number between 1 and ', i); Write('?>'); ReadLn(s); val(s, L, e); end; iter:=tidyGetOptionList(doc); i:=0; repeat opt:=tidyGetNextOption(doc, @iter); if ( opt = nil ) then BREAK; if ( tidyOptGetCategory(opt) = cat ) then begin inc(i); if ( i = L ) then begin WriteLn; name:=tidyOptGetName(opt); WriteLn(StringOfChar('-', WIDTH)); WriteLn( StringOfChar( #32, ( WIDTH div 2 ) - ( length(name) div 2 )), name ); WrapText(tidyOptGetDoc(doc, opt), WIDTH); WriteLn; BREAK; end; end; until False; until False; tidyRelease(doc); end.