richmemo: adding custom RTF parser, using MVC's rtfparspre211 unit
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1226 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
parent
656ed83de3
commit
a5f834253f
@ -136,6 +136,10 @@ function GetFontParams(color: TColor; styles: TFontStyles): TFontParams; overloa
|
|||||||
function GetFontParams(const Name: String; color: TColor; styles: TFontStyles): TFontParams; overload;
|
function GetFontParams(const Name: String; color: TColor; styles: TFontStyles): TFontParams; overload;
|
||||||
function GetFontParams(const Name: String; Size: Integer; color: TColor; styles: TFontStyles): TFontParams; overload;
|
function GetFontParams(const Name: String; Size: Integer; color: TColor; styles: TFontStyles): TFontParams; overload;
|
||||||
|
|
||||||
|
var
|
||||||
|
RTFLoadStream : function (AMemo: TCustomRichMemo; Source: TStream): Boolean = nil;
|
||||||
|
RTFSaveStream : function (AMemo: TCustomRichMemo; Dest: TStream): Boolean = nil;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
function GetFontParams(styles: TFontStyles): TFontParams; overload;
|
function GetFontParams(styles: TFontStyles): TFontParams; overload;
|
||||||
@ -307,17 +311,25 @@ end;
|
|||||||
|
|
||||||
function TCustomRichMemo.LoadRichText(Source: TStream): Boolean;
|
function TCustomRichMemo.LoadRichText(Source: TStream): Boolean;
|
||||||
begin
|
begin
|
||||||
if Assigned(Source) and HandleAllocated then
|
if Assigned(Source) and HandleAllocated then begin
|
||||||
Result := TWSCustomRichMemoClass(WidgetSetClass).LoadRichText(Self, Source)
|
Result := TWSCustomRichMemoClass(WidgetSetClass).LoadRichText(Self, Source);
|
||||||
else
|
if not Result and Assigned(RTFLoadStream) then begin
|
||||||
|
Self.Lines.BeginUpdate;
|
||||||
|
Self.Lines.Clear;
|
||||||
|
Result:=RTFLoadStream(Self, Source);
|
||||||
|
Self.Lines.EndUpdate;
|
||||||
|
end;
|
||||||
|
end else
|
||||||
Result := false;
|
Result := false;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCustomRichMemo.SaveRichText(Dest: TStream): Boolean;
|
function TCustomRichMemo.SaveRichText(Dest: TStream): Boolean;
|
||||||
begin
|
begin
|
||||||
if Assigned(Dest) and HandleAllocated then
|
if Assigned(Dest) and HandleAllocated then begin
|
||||||
Result := TWSCustomRichMemoClass(WidgetSetClass).SaveRichText(Self, Dest)
|
Result := TWSCustomRichMemoClass(WidgetSetClass).SaveRichText(Self, Dest);
|
||||||
else
|
if not Result and Assigned(RTFSaveStream) then
|
||||||
|
Result:=RTFSaveStream(Self, Dest);
|
||||||
|
end else
|
||||||
Result := false;
|
Result := false;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -18,16 +18,20 @@ function RegisterCustomRichMemo: Boolean;
|
|||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
{$define NoRichMemo}
|
||||||
|
{$ifdef LCLWin32}{$undef NoRichMemo}{$endif}
|
||||||
|
{$ifdef LCLCarbon}{$undef NoRichMemo}{$endif}
|
||||||
|
{$ifdef LCLGtk2}{$undef NoRichMemo}{$endif}
|
||||||
|
|
||||||
function RegisterCustomRichMemo: Boolean; alias : 'WSRegisterCustomRichMemo';
|
function RegisterCustomRichMemo: Boolean; alias : 'WSRegisterCustomRichMemo';
|
||||||
var
|
var
|
||||||
cls : TWSLCLComponentClass;
|
cls : TWSLCLComponentClass;
|
||||||
begin
|
begin
|
||||||
Result := True;
|
Result := True;
|
||||||
{$ifdef LCLWin32}RegisterWSComponent(TCustomRichMemo, TWin32WSCustomRichMemo);
|
{$ifdef LCLWin32}RegisterWSComponent(TCustomRichMemo, TWin32WSCustomRichMemo);{$endif}
|
||||||
{$elif LCLCarbon}RegisterWSComponent(TCustomRichMemo, TCarbonWSCustomRichMemo);
|
{$ifdef LCLCarbon}RegisterWSComponent(TCustomRichMemo, TCarbonWSCustomRichMemo);{$endif}
|
||||||
{$elif LCLGtk2}RegisterWSComponent(TCustomRichMemo, TGtk2WSCustomRichMemo);
|
{$ifdef LCLGtk2}RegisterWSComponent(TCustomRichMemo, TGtk2WSCustomRichMemo);{$endif}
|
||||||
{$else}RegisterWSComponent(TCustomRichMemo, TWSCustomRichMemo);
|
{$ifdef NoRichMemo}RegisterWSComponent(TCustomRichMemo, TWSCustomRichMemo);{$endif}
|
||||||
{$endif}
|
|
||||||
cls:=FindWSComponentClass(TCustomRichMemo);
|
cls:=FindWSComponentClass(TCustomRichMemo);
|
||||||
if not Assigned(cls) then RegisterWSComponent(TCustomRichMemo, TWSCustomRichMemo);
|
if not Assigned(cls) then RegisterWSComponent(TCustomRichMemo, TWSCustomRichMemo);
|
||||||
end;
|
end;
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
"/>
|
"/>
|
||||||
<License Value="LGPL"/>
|
<License Value="LGPL"/>
|
||||||
<Version Major="1"/>
|
<Version Major="1"/>
|
||||||
<Files Count="9">
|
<Files Count="12">
|
||||||
<Item1>
|
<Item1>
|
||||||
<Filename Value="wsrichmemo.pas"/>
|
<Filename Value="wsrichmemo.pas"/>
|
||||||
<AddToUsesPkgSection Value="False"/>
|
<AddToUsesPkgSection Value="False"/>
|
||||||
@ -66,6 +66,20 @@
|
|||||||
<AddToUsesPkgSection Value="False"/>
|
<AddToUsesPkgSection Value="False"/>
|
||||||
<UnitName Value="gtk2richmemo"/>
|
<UnitName Value="gtk2richmemo"/>
|
||||||
</Item9>
|
</Item9>
|
||||||
|
<Item10>
|
||||||
|
<Filename Value="rtfparspre211.pp"/>
|
||||||
|
<AddToUsesPkgSection Value="False"/>
|
||||||
|
<UnitName Value="RTFParsPre211"/>
|
||||||
|
</Item10>
|
||||||
|
<Item11>
|
||||||
|
<Filename Value="richmemortf.pas"/>
|
||||||
|
<AddToUsesPkgSection Value="False"/>
|
||||||
|
<UnitName Value="RichMemoRTF"/>
|
||||||
|
</Item11>
|
||||||
|
<Item12>
|
||||||
|
<Filename Value="rtfdata.inc"/>
|
||||||
|
<Type Value="Include"/>
|
||||||
|
</Item12>
|
||||||
</Files>
|
</Files>
|
||||||
<Type Value="RunAndDesignTime"/>
|
<Type Value="RunAndDesignTime"/>
|
||||||
<RequiredPkgs Count="2">
|
<RequiredPkgs Count="2">
|
||||||
|
94
components/richmemo/richmemortf.pas
Normal file
94
components/richmemo/richmemortf.pas
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
unit RichMemoRTF;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils, LCLProc, LCLIntf,
|
||||||
|
RichMemo, RTFParsPre211;
|
||||||
|
|
||||||
|
//todo: formatting support!
|
||||||
|
|
||||||
|
function MVCParserLoadStream(ARich: TCustomRichMemo; Source: TStream): Boolean;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
type
|
||||||
|
{ TRTFMemoParser }
|
||||||
|
|
||||||
|
TRTFMemoParser = class(TRTFParser)
|
||||||
|
protected
|
||||||
|
procedure classText;
|
||||||
|
procedure classControl;
|
||||||
|
|
||||||
|
procedure doSpecialChar;
|
||||||
|
public
|
||||||
|
txt : String;
|
||||||
|
Memo : TCustomRichMemo;
|
||||||
|
constructor Create(AMemo: TCustomRichMemo; AStream: TStream);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{ TRTFMemoParserr }
|
||||||
|
procedure TRTFMemoParser.classText;
|
||||||
|
begin
|
||||||
|
//writeln('txt: ', rtfMajor, ' ',rtfMinor,' ', rtfParam);
|
||||||
|
case rtfMinor of
|
||||||
|
rtfOptDest:;
|
||||||
|
else
|
||||||
|
txt:=txt+Self.GetRtfText;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TRTFMemoParser.classControl;
|
||||||
|
begin
|
||||||
|
//writeln('ctrl: ', rtfClass,' ', rtfMajor, ' ', Self.GetRtfText, ' ',rtfMinor,' ', rtfParam);
|
||||||
|
case rtfMajor of
|
||||||
|
rtfSpecialChar: doSpecialChar;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TRTFMemoParser.doSpecialChar;
|
||||||
|
const
|
||||||
|
CharPara = #10;
|
||||||
|
CharTab = #9;
|
||||||
|
CharLine = #13;
|
||||||
|
begin
|
||||||
|
case rtfMinor of
|
||||||
|
rtfLine: txt:=txt+CharLine;
|
||||||
|
rtfPar: txt:=txt+CharPara;
|
||||||
|
rtfTab: txt:=txt+CharTab;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TRTFMemoParser.Create(AMemo:TCustomRichMemo;AStream:TStream);
|
||||||
|
begin
|
||||||
|
inherited Create(AStream);
|
||||||
|
Memo:=AMemo;
|
||||||
|
ClassCallBacks[rtfText]:=@classText;
|
||||||
|
ClassCallBacks[rtfControl]:=@classControl;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function MVCParserLoadStream(ARich: TCustomRichMemo; Source: TStream): Boolean;
|
||||||
|
var
|
||||||
|
p : TRTFMemoParser;
|
||||||
|
begin
|
||||||
|
Result:=Assigned(ARich) and Assigned(Source);
|
||||||
|
if not Result then Exit;
|
||||||
|
|
||||||
|
p:=TRTFMemoParser.Create(ARich, Source);
|
||||||
|
try
|
||||||
|
p.StartReading;
|
||||||
|
ARich.SelStart:=0;
|
||||||
|
ARich.SelLength:=0;
|
||||||
|
ARich.Text:=p.txt;
|
||||||
|
finally
|
||||||
|
p.Free;
|
||||||
|
end;
|
||||||
|
Result:=True;
|
||||||
|
end;
|
||||||
|
|
||||||
|
initialization
|
||||||
|
RTFLoadStream:=@MVCParserLoadStream;
|
||||||
|
|
||||||
|
|
||||||
|
end.
|
768
components/richmemo/rtfdata.inc
Normal file
768
components/richmemo/rtfdata.inc
Normal file
@ -0,0 +1,768 @@
|
|||||||
|
{
|
||||||
|
This file is part of the Free Pascal run time library.
|
||||||
|
Copyright (c) 1999-2000 by Michael Van Canneyt, member of the
|
||||||
|
Free Pascal development team
|
||||||
|
|
||||||
|
All major and minor RTF class definitions.
|
||||||
|
|
||||||
|
See the file COPYING.FPC, included in this distribution,
|
||||||
|
for details about the copyright.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
**********************************************************************}
|
||||||
|
|
||||||
|
{ ---------------------------------------------------------------------
|
||||||
|
Twentieths of a point (twips) per inch (Many RTF measurements
|
||||||
|
are in twips per inch (tpi) units). Assumes 72 points/inch.
|
||||||
|
---------------------------------------------------------------------}
|
||||||
|
|
||||||
|
const
|
||||||
|
rtfTpi = 1440;
|
||||||
|
rtfBufSiz = 255; { buffer size}
|
||||||
|
|
||||||
|
{ ---------------------------------------------------------------------
|
||||||
|
Tokens are associated with up to three classification numbers:
|
||||||
|
|
||||||
|
Class number: Broadest (least detailed) breakdown. For programs
|
||||||
|
that only care about gross token distinctions.
|
||||||
|
Major/minor numbers: Within their class, tokens have a major
|
||||||
|
number, and may also have a minor number to further
|
||||||
|
distinquish tokens with the same major number.
|
||||||
|
|
||||||
|
*** Class, major and minor token numbers are all >= 0 ***
|
||||||
|
|
||||||
|
Tokens that can't be classified are put in the "unknown" class.
|
||||||
|
For such, the major and minor numbers are meaningless, although
|
||||||
|
rtfTextBuf may be of interest then.
|
||||||
|
|
||||||
|
Text tokens are a single character, and the major number indicates
|
||||||
|
the character value (note: can be non-ascii, i.e., greater than 127).
|
||||||
|
There is no minor number.
|
||||||
|
|
||||||
|
Control symbols may have a parameter value, which will be found in
|
||||||
|
rtfParam. If no parameter was given, rtfParam = rtfNoParam.
|
||||||
|
|
||||||
|
RTFGetToken() return value is the class number, but it sets all the
|
||||||
|
global token vars.
|
||||||
|
|
||||||
|
rtfEOF is a fake token used by the reader; the writer never sees
|
||||||
|
it (except in the token reader hook, if it installs one).
|
||||||
|
|
||||||
|
Information pertaining to last token read by RTFToken. The
|
||||||
|
text is exactly as it occurs in the input file, e.g.,
|
||||||
|
will be found in rtfTextBuf as, even though it means .
|
||||||
|
|
||||||
|
These variables are also set when styles are reprocessed.
|
||||||
|
----------------------------------------------------------------------}
|
||||||
|
rtfNoParam = (-1000000);
|
||||||
|
|
||||||
|
{ Token classes (zero-based and sequential) }
|
||||||
|
rtfUnknown = 0;
|
||||||
|
rtfGroup = 1;
|
||||||
|
rtfText = 2;
|
||||||
|
rtfControl = 3;
|
||||||
|
rtfEOF = 4;
|
||||||
|
rtfMaxClass = 5 { highest class + 1 };
|
||||||
|
|
||||||
|
{ Group class major numbers }
|
||||||
|
rtfBeginGroup = 0;
|
||||||
|
rtfEndGroup = 1;
|
||||||
|
|
||||||
|
{ Control class major and minor numbers.}
|
||||||
|
rtfVersion = 0;
|
||||||
|
rtfDefFont = 1;
|
||||||
|
rtfCharSet = 2;
|
||||||
|
rtfAnsiCharSet = 0;
|
||||||
|
rtfMacCharSet = 1;
|
||||||
|
rtfPcCharSet = 2;
|
||||||
|
rtfPcaCharSet = 3;
|
||||||
|
|
||||||
|
{ Destination minor numbers should be zero-based, sequential }
|
||||||
|
rtfDestination = 3;
|
||||||
|
rtfPict = 0;
|
||||||
|
rtfNeXTGraphic = 1;
|
||||||
|
rtfFootnote = 2;
|
||||||
|
rtfHeader = 3;
|
||||||
|
rtfHeaderLeft = 4;
|
||||||
|
rtfHeaderRight = 5;
|
||||||
|
rtfHeaderFirst = 6;
|
||||||
|
rtfFooter = 7;
|
||||||
|
rtfFooterLeft = 8;
|
||||||
|
rtfFooterRight = 9;
|
||||||
|
rtfFooterFirst = 10;
|
||||||
|
rtfFNSep = 11;
|
||||||
|
rtfFNContSep = 12;
|
||||||
|
rtfFNContNotice = 13;
|
||||||
|
rtfInfo = 14;
|
||||||
|
rtfStyleSheet = 15;
|
||||||
|
rtfFontTbl = 16;
|
||||||
|
rtfColorTbl = 17;
|
||||||
|
rtfField = 18;
|
||||||
|
rtfFieldInst = 19;
|
||||||
|
rtfFieldResult = 20;
|
||||||
|
rtfIndex = 21;
|
||||||
|
rtfIndexBold = 22;
|
||||||
|
rtfIndexItalic = 23;
|
||||||
|
rtfIndexText = 24;
|
||||||
|
rtfIndexRange = 25;
|
||||||
|
rtfTOC = 26;
|
||||||
|
rtfBookmarkStart = 27;
|
||||||
|
rtfBookmarkEnd = 28;
|
||||||
|
rtfITitle = 29;
|
||||||
|
rtfISubject = 30;
|
||||||
|
rtfIAuthor = 31;
|
||||||
|
rtfIOperator = 32;
|
||||||
|
rtfIKeywords = 33;
|
||||||
|
rtfIComment = 34;
|
||||||
|
rtfIVersion = 35;
|
||||||
|
rtfIDoccomm = 36;
|
||||||
|
rtfMaxDestination = 37 { highest dest + 1 };
|
||||||
|
|
||||||
|
rtfFontFamily = 4;
|
||||||
|
rtfFFNil = 0;
|
||||||
|
rtfFFRoman = 1;
|
||||||
|
rtfFFSwiss = 2;
|
||||||
|
rtfFFModern = 3;
|
||||||
|
rtfFFScript = 4;
|
||||||
|
rtfFFDecor = 5;
|
||||||
|
rtfFFTech = 6;
|
||||||
|
|
||||||
|
rtfColorName = 5;
|
||||||
|
rtfRed = 0;
|
||||||
|
rtfGreen = 1;
|
||||||
|
rtfBlue = 2;
|
||||||
|
|
||||||
|
rtfSpecialChar = 6;
|
||||||
|
rtfCurHeadPage = 0;
|
||||||
|
rtfCurFNote = 1;
|
||||||
|
rtfCurHeadPict = 2 { valid? };
|
||||||
|
rtfCurHeadDate = 3;
|
||||||
|
rtfCurHeadTime = 4;
|
||||||
|
rtfFormula = 5;
|
||||||
|
rtfNoBrkSpace = 6;
|
||||||
|
rtfNoReqHyphen = 7;
|
||||||
|
rtfNoBrkHyphen = 8;
|
||||||
|
rtfPage = 9;
|
||||||
|
rtfLine = 10;
|
||||||
|
rtfPar = 11;
|
||||||
|
rtfSect = 12;
|
||||||
|
rtfTab = 13;
|
||||||
|
rtfCell = 14;
|
||||||
|
rtfRow = 15;
|
||||||
|
rtfCurAnnot = 16;
|
||||||
|
rtfAnnotation = 17;
|
||||||
|
rtfAnnotID = 18;
|
||||||
|
rtfCurAnnotRef = 19;
|
||||||
|
rtfFNoteSep = 20;
|
||||||
|
rtfFNoteCont = 21;
|
||||||
|
rtfColumn = 22;
|
||||||
|
rtfOptDest = 23;
|
||||||
|
rtfIIntVersion = 24;
|
||||||
|
rtfICreateTime = 25;
|
||||||
|
rtfIRevisionTime = 26;
|
||||||
|
rtfIPrintTime = 27;
|
||||||
|
rtfIBackupTime = 28;
|
||||||
|
rtfIEditTime = 29;
|
||||||
|
rtfIYear = 30;
|
||||||
|
rtfIMonth = 31;
|
||||||
|
rtfIDay = 32;
|
||||||
|
rtfIHour = 33;
|
||||||
|
rtfIMinute = 34;
|
||||||
|
rtfINPages = 35;
|
||||||
|
rtfINWords = 36;
|
||||||
|
rtfINChars = 37;
|
||||||
|
rtfIIntID = 38;
|
||||||
|
|
||||||
|
rtfStyleAttr = 7;
|
||||||
|
rtfBasedOn = 0;
|
||||||
|
rtfNext = 1;
|
||||||
|
|
||||||
|
rtfDocAttr = 8;
|
||||||
|
rtfPaperWidth = 0;
|
||||||
|
rtfPaperHeight = 1;
|
||||||
|
rtfLeftMargin = 2;
|
||||||
|
rtfRightMargin = 3;
|
||||||
|
rtfTopMargin = 4;
|
||||||
|
rtfBottomMargin = 5;
|
||||||
|
rtfFacingPage = 6;
|
||||||
|
rtfGutterWid = 7;
|
||||||
|
rtfDefTab = 8;
|
||||||
|
rtfWidowCtrl = 9;
|
||||||
|
rtfHyphHotZone = 10;
|
||||||
|
rtfFNoteEndSect = 11;
|
||||||
|
rtfFNoteEndDoc = 12;
|
||||||
|
rtfFNoteText = 13;
|
||||||
|
rtfFNoteBottom = 14;
|
||||||
|
rtfFNoteStart = 15;
|
||||||
|
rtfFNoteRestart = 16;
|
||||||
|
rtfPageStart = 17;
|
||||||
|
rtfLineStart = 18;
|
||||||
|
rtfLandscape = 19;
|
||||||
|
rtfFracWidth = 20;
|
||||||
|
rtfNextFile = 21;
|
||||||
|
rtfTemplate = 22;
|
||||||
|
rtfMakeBackup = 23;
|
||||||
|
rtfRTFDefault = 24;
|
||||||
|
rtfRevisions = 25;
|
||||||
|
rtfMirrorMargin = 26;
|
||||||
|
rtfRevDisplay = 27;
|
||||||
|
rtfRevBar = 28;
|
||||||
|
|
||||||
|
rtfSectAttr = 9;
|
||||||
|
rtfSectDef = 0;
|
||||||
|
rtfNoBreak = 1;
|
||||||
|
rtfColBreak = 2;
|
||||||
|
rtfPageBreak = 3;
|
||||||
|
rtfEvenBreak = 4;
|
||||||
|
rtfOddBreak = 5;
|
||||||
|
rtfPageStarts = 6;
|
||||||
|
rtfPageCont = 7;
|
||||||
|
rtfPageRestart = 8;
|
||||||
|
rtfPageDecimal = 9;
|
||||||
|
rtfPageURoman = 10;
|
||||||
|
rtfPageLRoman = 11;
|
||||||
|
rtfPageULetter = 12;
|
||||||
|
rtfPageLLetter = 13;
|
||||||
|
rtfPageNumLeft = 14;
|
||||||
|
rtfPageNumTop = 15;
|
||||||
|
rtfHeaderY = 16;
|
||||||
|
rtfFooterY = 17;
|
||||||
|
rtfLineModulus = 18;
|
||||||
|
rtfLineDist = 19;
|
||||||
|
rtfLineStarts = 20;
|
||||||
|
rtfLineRestart = 21;
|
||||||
|
rtfLineRestartPg = 22;
|
||||||
|
rtfLineCont = 23;
|
||||||
|
rtfTopVAlign = 24;
|
||||||
|
rtfBottomVAlign = 25;
|
||||||
|
rtfCenterVAlign = 26;
|
||||||
|
rtfJustVAlign = 27;
|
||||||
|
rtfColumns = 28;
|
||||||
|
rtfColumnSpace = 29;
|
||||||
|
rtfColumnLine = 30;
|
||||||
|
rtfENoteHere = 31;
|
||||||
|
rtfTitleSpecial = 32;
|
||||||
|
|
||||||
|
rtfTblAttr = 10;
|
||||||
|
rtfCellBordBottom = 0;
|
||||||
|
rtfCellBordTop = 1;
|
||||||
|
rtfCellBordLeft = 2;
|
||||||
|
rtfCellBordRight = 3;
|
||||||
|
rtfRowDef = 4;
|
||||||
|
rtfRowLeft = 5;
|
||||||
|
rtfRowRight = 6;
|
||||||
|
rtfRowCenter = 7;
|
||||||
|
rtfRowGapH = 8;
|
||||||
|
rtfRowHt = 9;
|
||||||
|
rtfRowLeftEdge = 10;
|
||||||
|
rtfCellPos = 11;
|
||||||
|
rtfMergeRngFirst = 12;
|
||||||
|
rtfMergePrevious = 13;
|
||||||
|
|
||||||
|
rtfParAttr = 11;
|
||||||
|
rtfParDef = 0;
|
||||||
|
rtfStyleNum = 1;
|
||||||
|
rtfQuadLeft = 2;
|
||||||
|
rtfQuadRight = 3;
|
||||||
|
rtfQuadJust = 4;
|
||||||
|
rtfQuadCenter = 5;
|
||||||
|
rtfFirstIndent = 6;
|
||||||
|
rtfLeftIndent = 7;
|
||||||
|
rtfRightIndent = 8;
|
||||||
|
rtfSpaceBefore = 9;
|
||||||
|
rtfSpaceAfter = 10;
|
||||||
|
rtfSpaceBetween = 11;
|
||||||
|
rtfInTable = 12;
|
||||||
|
rtfKeep = 13;
|
||||||
|
rtfKeepNext = 14;
|
||||||
|
rtfSideBySide = 15;
|
||||||
|
rtfPBBefore = 16;
|
||||||
|
rtfNoLineNum = 17;
|
||||||
|
rtfTabPos = 18;
|
||||||
|
rtfTabRight = 19;
|
||||||
|
rtfTabCenter = 20;
|
||||||
|
rtfTabDecimal = 21;
|
||||||
|
rtfTabBar = 22;
|
||||||
|
rtfBorderTop = 23;
|
||||||
|
rtfBorderBottom = 24;
|
||||||
|
rtfBorderLeft = 25;
|
||||||
|
rtfBorderRight = 26;
|
||||||
|
rtfBorderBox = 27;
|
||||||
|
rtfBorderBar = 28;
|
||||||
|
rtfBorderBetween = 29;
|
||||||
|
rtfBorderSingle = 30;
|
||||||
|
rtfBorderThick = 31;
|
||||||
|
rtfBorderShadow = 32;
|
||||||
|
rtfBorderDouble = 33;
|
||||||
|
rtfBorderDot = 34;
|
||||||
|
rtfBorderHair = 35;
|
||||||
|
rtfBorderSpace = 36;
|
||||||
|
rtfLeaderDot = 37;
|
||||||
|
rtfLeaderHyphen = 38;
|
||||||
|
rtfLeaderUnder = 39;
|
||||||
|
rtfLeaderThick = 40;
|
||||||
|
|
||||||
|
rtfCharAttr = 12;
|
||||||
|
rtfPlain = 0;
|
||||||
|
rtfBold = 1;
|
||||||
|
rtfItalic = 2;
|
||||||
|
rtfStrikeThru = 3;
|
||||||
|
rtfOutline = 4;
|
||||||
|
rtfShadow = 5;
|
||||||
|
rtfSmallCaps = 6;
|
||||||
|
rtfAllCaps = 7;
|
||||||
|
rtfInvisible = 8;
|
||||||
|
rtfFontNum = 9;
|
||||||
|
rtfFontSize = 10;
|
||||||
|
rtfExpand = 11;
|
||||||
|
rtfUnderline = 12;
|
||||||
|
rtfWUnderline = 13;
|
||||||
|
rtfDUnderline = 14;
|
||||||
|
rtfDbUnderline = 15;
|
||||||
|
rtfNoUnderline = 16;
|
||||||
|
rtfSuperScript = 17;
|
||||||
|
rtfSubScript = 18;
|
||||||
|
rtfRevised = 19;
|
||||||
|
rtfForeColor = 20;
|
||||||
|
rtfBackColor = 21;
|
||||||
|
rtfGray = 22;
|
||||||
|
|
||||||
|
rtfPictAttr = 13;
|
||||||
|
rtfMacQD = 0;
|
||||||
|
rtfWinMetafile = 1;
|
||||||
|
rtfWinBitmap = 2;
|
||||||
|
rtfPicWid = 3;
|
||||||
|
rtfPicHt = 4;
|
||||||
|
rtfPicGoalWid = 5;
|
||||||
|
rtfPicGoalHt = 6;
|
||||||
|
rtfPicScaleX = 7;
|
||||||
|
rtfPicScaleY = 8;
|
||||||
|
rtfPicScaled = 9;
|
||||||
|
rtfPicCropTop = 10;
|
||||||
|
rtfPicCropBottom = 11;
|
||||||
|
rtfPicCropLeft = 12;
|
||||||
|
rtfPicCropRight = 13;
|
||||||
|
rtfPixelBits = 14;
|
||||||
|
rtfBitmapPlanes = 15;
|
||||||
|
rtfBitmapWid = 16;
|
||||||
|
rtfPicBinary = 17;
|
||||||
|
|
||||||
|
rtfNeXTGrAttr = 14;
|
||||||
|
rtfNeXTGWidth = 0;
|
||||||
|
rtfNeXTGHeight = 1;
|
||||||
|
|
||||||
|
rtfFieldAttr = 15;
|
||||||
|
rtfFieldDirty = 0;
|
||||||
|
rtfFieldEdited = 1;
|
||||||
|
rtfFieldLocked = 2;
|
||||||
|
rtfFieldPrivate = 3;
|
||||||
|
|
||||||
|
rtfTOCAttr = 16;
|
||||||
|
rtfTOCType = 0;
|
||||||
|
rtfTOCLevel = 1;
|
||||||
|
|
||||||
|
rtfPosAttr = 17;
|
||||||
|
rtfPosX = 0;
|
||||||
|
rtfPosXCenter = 1;
|
||||||
|
rtfPosXInside = 2;
|
||||||
|
rtfPosXLeft = 3;
|
||||||
|
rtfPosXOutSide = 4;
|
||||||
|
rtfPosXRight = 5;
|
||||||
|
rtfPosY = 6;
|
||||||
|
rtfPosYInline = 7;
|
||||||
|
rtfPosYTop = 8;
|
||||||
|
rtfPosYCenter = 9;
|
||||||
|
rtfPosYBottom = 10;
|
||||||
|
rtfAbsWid = 11;
|
||||||
|
rtfTextDist = 12;
|
||||||
|
rtfRPosMargV = 13;
|
||||||
|
rtfRPosPageV = 14;
|
||||||
|
rtfRPosMargH = 15;
|
||||||
|
rtfRPosPageH = 16;
|
||||||
|
rtfRPosColH = 17;
|
||||||
|
|
||||||
|
rtfBasedOnNone = 222; { "no based-on style" }
|
||||||
|
|
||||||
|
|
||||||
|
type
|
||||||
|
|
||||||
|
{ ---------------------------------------------------------------------
|
||||||
|
Callback Types
|
||||||
|
---------------------------------------------------------------------}
|
||||||
|
|
||||||
|
TRTFFunc = Procedure of object;
|
||||||
|
TRTFFuncPtr = procedure of object;
|
||||||
|
|
||||||
|
{ ---------------------------------------------------------------------
|
||||||
|
RTF font, color and style structures. Used for font table,
|
||||||
|
color table, and stylesheet processing.
|
||||||
|
---------------------------------------------------------------------}
|
||||||
|
|
||||||
|
PRTFFONT = ^TRTFFONT;
|
||||||
|
TRTFFont = Record
|
||||||
|
rtfFName : string; { font name }
|
||||||
|
rtfFNum : integer; { font number }
|
||||||
|
rtfFFamily : integer; { font family }
|
||||||
|
rtfNextFont : PRTFFONT; { next font in list }
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{ ----------------------------------------------------------------------
|
||||||
|
Color values are -1 if the default color for the the color
|
||||||
|
number should be used. The default color is writer-dependent.
|
||||||
|
----------------------------------------------------------------------}
|
||||||
|
|
||||||
|
PRTFColor = ^TRTFColor;
|
||||||
|
TRTFColor = Record
|
||||||
|
rtfCNum : integer; { color number }
|
||||||
|
rtfCRed : INteger; { red value }
|
||||||
|
rtfCGreen : INteger; { green value }
|
||||||
|
rtfCBlue : integer; { blue value }
|
||||||
|
rtfNextColor : PRTFColor; { next color in list }
|
||||||
|
end;
|
||||||
|
|
||||||
|
PRTFStyleElt = ^TRTFStyleElt;
|
||||||
|
TRTFStyleElt = record
|
||||||
|
rtfSEClass, { token class }
|
||||||
|
rtfSEMajor, { token major number }
|
||||||
|
rtfSEMinor, { token minor number }
|
||||||
|
rtfSEParam : Integer; { control symbol parameter }
|
||||||
|
rtfSEText : String; { text of symbol }
|
||||||
|
rtfNextSE : PRTFStyleElt; { next element in style }
|
||||||
|
end;
|
||||||
|
|
||||||
|
PRTFSTyle = ^TRTFStyle;
|
||||||
|
TRTFStyle = record
|
||||||
|
rtfSName : string; { style name }
|
||||||
|
rtfSNum, { style number }
|
||||||
|
rtfSBasedOn, { style this one's based on }
|
||||||
|
rtfSNextPar : integer; { style next paragraph style }
|
||||||
|
rtfSSEList : PRTFStyleElt; { list of style words }
|
||||||
|
rtfExpanding : Integer; { non-zero = being expanded }
|
||||||
|
rtfNextStyle : PRTFStyle; { next style in style list }
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ ---------------------------------------------------------------------
|
||||||
|
Control symbol lookup routines
|
||||||
|
---------------------------------------------------------------------}
|
||||||
|
|
||||||
|
type
|
||||||
|
TRTFKey = record
|
||||||
|
rtfKMajor : Integer; { major number }
|
||||||
|
rtfKMinor : Integer; { minor number }
|
||||||
|
rtfKStr : string[20]; { symbol name }
|
||||||
|
rtfKHash : Integer; { symbol name hash value }
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ ---------------------------------------------------------------------
|
||||||
|
A minor number of -1 means the token has no minor number
|
||||||
|
(all valid minor numbers are >= 0).
|
||||||
|
---------------------------------------------------------------------}
|
||||||
|
|
||||||
|
const
|
||||||
|
rtfKey : Array [0..281] of TRTFKey =
|
||||||
|
(
|
||||||
|
( rtfKMajor: RTFSPECIALCHAR; rtfKMinor : rtfCURHEADPICT; rtfKStr : 'chpict'; rtfKhash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfCurHeadDate; rtfKstr : 'chdate'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfCurHeadTime; rtfKstr : 'chtime'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfCurHeadPage; rtfKstr : 'chpgn'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfCurFNote; rtfKstr : 'chftn'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfCurAnnotRef; rtfKstr : 'chatn'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfFNoteSep; rtfKstr : 'chftnsep'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfFNoteCont; rtfKstr : 'chftnsepc'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfFormula; rtfKstr : '|'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfNoBrkSpace; rtfKstr : '~'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfNoReqHyphen; rtfKstr : '-'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfNoBrkHyphen; rtfKstr : '_'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfCell; rtfKstr : 'cell'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfRow; rtfKstr : 'row'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfPar; rtfKstr : 'par'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfPar; rtfKstr : #10; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfPar; rtfKstr : #13; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfSect; rtfKstr : 'sect'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfPage; rtfKstr : 'page'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfColumn; rtfKstr : 'column'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfLine; rtfKstr : 'line'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfTab; rtfKstr : 'tab'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfOptDest; rtfKstr : '*'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfIIntVersion; rtfKstr : 'vern'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfICreateTime; rtfKstr : 'creatim'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfIRevisionTime; rtfKstr : 'revtim'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfIPrintTime; rtfKstr : 'printim'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfIBackupTime; rtfKstr : 'buptim'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfIEditTime; rtfKstr : 'edmins'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfIYear; rtfKstr : 'yr'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfIMonth; rtfKstr : 'mo'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfIDay; rtfKstr : 'dy'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfIHour; rtfKstr : 'hr'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfIMinute; rtfKstr : 'min'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfINPages; rtfKstr : 'nofpages'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfINWords; rtfKstr : 'nofwords'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfINChars; rtfKstr : 'nofchars'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSpecialChar; rtfKMinor: rtfIIntID; rtfKstr : 'id'; rtfkHash : 0),
|
||||||
|
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfPlain; rtfKstr : 'plain'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfBold; rtfKstr : 'b'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfItalic; rtfKstr : 'i'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfStrikeThru; rtfKstr : 'strike'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfOutline; rtfKstr : 'outl'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfShadow; rtfKstr : 'shad'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfSmallCaps; rtfKstr : 'scaps'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfAllCaps; rtfKstr : 'caps'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfInvisible; rtfKstr : 'v'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfFontNum; rtfKstr : 'f'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfFontSize; rtfKstr : 'fs'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfExpand; rtfKstr : 'expnd'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfUnderline; rtfKstr : 'ul'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfWUnderline; rtfKstr : 'ulw'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfDUnderline; rtfKstr : 'uld'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfDbUnderline; rtfKstr : 'uldb'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfNoUnderline; rtfKstr : 'ulnone'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfSuperScript; rtfKstr : 'up'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfSubScript; rtfKstr : 'dn'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfRevised; rtfKstr : 'revised'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfForeColor; rtfKstr : 'cf'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfBackColor; rtfKstr : 'cb'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharAttr; rtfKMinor: rtfGray; rtfKstr : 'gray'; rtfkHash : 0),
|
||||||
|
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfParDef; rtfKstr : 'pard'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfStyleNum; rtfKstr : 's'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfQuadLeft; rtfKstr : 'ql'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfQuadRight; rtfKstr : 'qr'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfQuadJust; rtfKstr : 'qj'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfQuadCenter; rtfKstr : 'qc'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfFirstIndent; rtfKstr : 'fi'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfLeftIndent; rtfKstr : 'li'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfRightIndent; rtfKstr : 'ri'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfSpaceBefore; rtfKstr : 'sb'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfSpaceAfter; rtfKstr : 'sa'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfSpaceBetween; rtfKstr : 'sl'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfInTable; rtfKstr : 'intbl'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfKeep; rtfKstr : 'keep'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfKeepNext; rtfKstr : 'keepn'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfSideBySide; rtfKstr : 'sbys'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfPBBefore; rtfKstr : 'pagebb'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfNoLineNum; rtfKstr : 'noline'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfTabPos; rtfKstr : 'tx'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfTabRight; rtfKstr : 'tqr'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfTabCenter; rtfKstr : 'tqc'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfTabDecimal; rtfKstr : 'tqdec'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfTabBar; rtfKstr : 'tb'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfBorderTop; rtfKstr : 'brdrt'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfBorderBottom; rtfKstr : 'brdrb'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfBorderLeft; rtfKstr : 'brdrl'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfBorderRight; rtfKstr : 'brdrr'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfBorderBar; rtfKstr : 'bar'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfBorderBox; rtfKstr : 'box'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfBorderBetween; rtfKstr : 'brdrbtw'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfBorderSingle; rtfKstr : 'brdrs'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfBorderThick; rtfKstr : 'brdrth'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfBorderShadow; rtfKstr : 'brdrsh'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfBorderDouble; rtfKstr : 'brdrdb'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfBorderDot; rtfKstr : 'brdrdot'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfBorderHair; rtfKstr : 'brdrhair'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfLeaderDot; rtfKstr : 'tldot'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfLeaderHyphen; rtfKstr : 'tlhyph'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfLeaderUnder; rtfKstr : 'tlul'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfLeaderThick; rtfKstr : 'tlth'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfParAttr; rtfKMinor: rtfBorderSpace; rtfKstr : 'brsp'; rtfkHash : 0),
|
||||||
|
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfSectDef; rtfKstr : 'sectd'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfNoBreak; rtfKstr : 'sbknone'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfColBreak; rtfKstr : 'sbkcol'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfPageBreak; rtfKstr : 'sbkpage'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfEvenBreak; rtfKstr : 'sbkeven'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfOddBreak; rtfKstr : 'sbkodd'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfPageCont; rtfKstr : 'pgncont'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfPageStarts; rtfKstr : 'pgnstarts'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfPageRestart; rtfKstr : 'pgnrestart'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfPageDecimal; rtfKstr : 'pgndec'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfPageURoman; rtfKstr : 'pgnucrm'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfPageLRoman; rtfKstr : 'pgnlcrm'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfPageULetter; rtfKstr : 'pgnucltr'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfPageLLetter; rtfKstr : 'pgnlcltr'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfPageNumLeft; rtfKstr : 'pgnx'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfPageNumTop; rtfKstr : 'pgny'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfHeaderY; rtfKstr : 'headery'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfFooterY; rtfKstr : 'footery'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfLineModulus; rtfKstr : 'linemod'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfLineDist; rtfKstr : 'linex'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfLineStarts; rtfKstr : 'linestarts'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfLineRestart; rtfKstr : 'linerestart'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfLineRestartPg; rtfKstr : 'lineppage'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfLineCont; rtfKstr : 'linecont'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfTopVAlign; rtfKstr : 'vertalt'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfBottomVAlign; rtfKstr : 'vertal'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfCenterVAlign; rtfKstr : 'vertalc'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfJustVAlign; rtfKstr : 'vertalj'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfColumns; rtfKstr : 'cols'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfColumnSpace; rtfKstr : 'colsx'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfColumnLine; rtfKstr : 'linebetcol'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfENoteHere; rtfKstr : 'endnhere'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfSectAttr; rtfKMinor: rtfTitleSpecial; rtfKstr : 'titlepg'; rtfkHash : 0),
|
||||||
|
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfPaperWidth; rtfKstr : 'paperw'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfPaperHeight; rtfKstr : 'paperh'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfLeftMargin; rtfKstr : 'margl'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfRightMargin; rtfKstr : 'margr'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfTopMargin; rtfKstr : 'margt'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfBottomMargin; rtfKstr : 'margb'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfFacingPage; rtfKstr : 'facingp'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfGutterWid; rtfKstr : 'gutter'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfDefTab; rtfKstr : 'deftab'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfWidowCtrl; rtfKstr : 'widowctrl'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfHyphHotZone; rtfKstr : 'hyphhotz'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfFNoteEndSect; rtfKstr : 'endnotes'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfFNoteEndDoc; rtfKstr : 'enddoc'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfFNoteBottom; rtfKstr : 'ftnbj'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfFNoteText; rtfKstr : 'ftntj'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfFNoteStart; rtfKstr : 'ftnstart'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfFNoteRestart; rtfKstr : 'ftnrestart'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfPageStart; rtfKstr : 'pgnstart'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfLineStart; rtfKstr : 'linestart'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfLandscape; rtfKstr : 'landscape'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfFracWidth; rtfKstr : 'fracwidth'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfNextFile; rtfKstr : 'nextfile'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfTemplate; rtfKstr : 'template'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfMakeBackup; rtfKstr : 'makeback'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfRTFDefault; rtfKstr : 'defformat'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfRevisions; rtfKstr : 'revisions'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfMirrorMargin; rtfKstr : 'margmirror'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfRevDisplay; rtfKstr : 'revprop'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDocAttr; rtfKMinor: rtfRevBar; rtfKstr : 'revbar'; rtfkHash : 0),
|
||||||
|
|
||||||
|
( rtfKMajor: rtfStyleAttr; rtfKMinor: rtfBasedOn; rtfKstr : 'sbasedon'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfStyleAttr; rtfKMinor: rtfNext; rtfKstr : 'snext'; rtfkHash : 0),
|
||||||
|
|
||||||
|
( rtfKMajor: rtfPictAttr; rtfKMinor: rtfMacQD; rtfKstr : 'macpict'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPictAttr; rtfKMinor: rtfWinMetafile; rtfKstr : 'wmetafile'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPictAttr; rtfKMinor: rtfWinBitmap; rtfKstr : 'wbitmap'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPictAttr; rtfKMinor: rtfPicWid; rtfKstr : 'picw'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPictAttr; rtfKMinor: rtfPicHt; rtfKstr : 'pich'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPictAttr; rtfKMinor: rtfPicGoalWid; rtfKstr : 'picwgoal'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPictAttr; rtfKMinor: rtfPicGoalWid; rtfKstr : 'picwGoal'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPictAttr; rtfKMinor: rtfPicGoalHt; rtfKstr : 'pichgoal'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPictAttr; rtfKMinor: rtfPicGoalHt; rtfKstr : 'pichGoal'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPictAttr; rtfKMinor: rtfPicScaleX; rtfKstr : 'picscalex'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPictAttr; rtfKMinor: rtfPicScaleY; rtfKstr : 'picscaley'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPictAttr; rtfKMinor: rtfPicScaled; rtfKstr : 'picscaled'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPictAttr; rtfKMinor: rtfPicCropTop; rtfKstr : 'piccropt'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPictAttr; rtfKMinor: rtfPicCropBottom; rtfKstr : 'piccropb'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPictAttr; rtfKMinor: rtfPicCropLeft; rtfKstr : 'piccropl'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPictAttr; rtfKMinor: rtfPicCropRight; rtfKstr : 'piccropr'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPictAttr; rtfKMinor: rtfPixelBits; rtfKstr : 'wbmbitspixel'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPictAttr; rtfKMinor: rtfBitmapPlanes; rtfKstr : 'wbmplanes'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPictAttr; rtfKMinor: rtfBitmapWid; rtfKstr : 'wbmwidthbytes'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPictAttr; rtfKMinor: rtfPicBinary; rtfKstr : 'bin'; rtfkHash : 0),
|
||||||
|
|
||||||
|
( rtfKMajor: rtfNeXTGrAttr; rtfKMinor: rtfNeXTGWidth; rtfKstr : 'width'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfNeXTGrAttr; rtfKMinor: rtfNeXTGHeight; rtfKstr : 'height'; rtfkHash : 0),
|
||||||
|
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfPict; rtfKstr : 'pict'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfNeXTGraphic; rtfKstr : 'NeXTGraphic'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfFootnote; rtfKstr : 'footnote'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfHeader; rtfKstr : 'header'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfHeaderLeft; rtfKstr : 'headerl'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfHeaderRight; rtfKstr : 'headerr'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfHeaderFirst; rtfKstr : 'headerf'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfFooter; rtfKstr : 'footer'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfFooterLeft; rtfKstr : 'footerl'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfFooterRight; rtfKstr : 'footerr'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfFooterFirst; rtfKstr : 'footerf'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfFNSep; rtfKstr : 'ftnsep'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfFNContSep; rtfKstr : 'ftnsepc'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfFNContNotice; rtfKstr : 'ftncn'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfInfo; rtfKstr : 'info'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfStyleSheet; rtfKstr : 'stylesheet'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfFontTbl; rtfKstr : 'fonttbl'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfColorTbl; rtfKstr : 'colortbl'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfAnnotation; rtfKstr : 'annotation'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfAnnotID; rtfKstr : 'atnid'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfField; rtfKstr : 'field'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfFieldInst; rtfKstr : 'fldinst'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfFieldResult; rtfKstr : 'fldrslt'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfIndex; rtfKstr : 'xe'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfIndexBold; rtfKstr : 'bxe'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfIndexItalic; rtfKstr : 'ixe'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfIndexText; rtfKstr : 'txe'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfIndexRange; rtfKstr : 'rxe'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfTOC; rtfKstr : 'tc'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfBookmarkStart; rtfKstr : 'bkmkstart'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfBookmarkEnd; rtfKstr : 'bkmkend'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfITitle; rtfKstr : 'title'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfISubject; rtfKstr : 'subject'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfIAuthor; rtfKstr : 'author'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfIOperator; rtfKstr : 'operator'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfIKeywords; rtfKstr : 'keywords'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfIComment; rtfKstr : 'comment'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfIVersion; rtfKstr : 'version'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDestination; rtfKMinor: rtfIDoccomm; rtfKstr : 'doccomm'; rtfkHash : 0),
|
||||||
|
|
||||||
|
( rtfKMajor: rtfTOCAttr; rtfKMinor: rtfTOCType; rtfKstr : 'tcf'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfTOCAttr; rtfKMinor: rtfTOCLevel; rtfKstr : 'tcl'; rtfkHash : 0),
|
||||||
|
|
||||||
|
( rtfKMajor: rtfFontFamily; rtfKMinor: rtfFFNil; rtfKstr : 'fnil'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfFontFamily; rtfKMinor: rtfFFRoman; rtfKstr : 'froman'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfFontFamily; rtfKMinor: rtfFFSwiss; rtfKstr : 'fswiss'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfFontFamily; rtfKMinor: rtfFFModern; rtfKstr : 'fmodern'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfFontFamily; rtfKMinor: rtfFFScript; rtfKstr : 'fscript'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfFontFamily; rtfKMinor: rtfFFDecor; rtfKstr : 'fdecor'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfFontFamily; rtfKMinor: rtfFFTech; rtfKstr : 'ftech'; rtfkHash : 0),
|
||||||
|
|
||||||
|
( rtfKMajor: rtfColorName; rtfKMinor: rtfRed; rtfKstr : 'red'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfColorName; rtfKMinor: rtfGreen; rtfKstr : 'green'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfColorName; rtfKMinor: rtfBlue; rtfKstr : 'blue'; rtfkHash : 0),
|
||||||
|
|
||||||
|
( rtfKMajor: rtfCharSet; rtfKMinor: rtfMacCharSet; rtfKstr : 'mac'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharSet; rtfKMinor: rtfAnsiCharSet; rtfKstr : 'ansi'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharSet; rtfKMinor: rtfPcCharSet; rtfKstr : 'pc'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfCharSet; rtfKMinor: rtfPcaCharSet; rtfKstr : 'pca'; rtfkHash : 0),
|
||||||
|
|
||||||
|
( rtfKMajor: rtfTblAttr; rtfKMinor: rtfCellBordBottom; rtfKstr : 'clbrdrb'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfTblAttr; rtfKMinor: rtfCellBordTop; rtfKstr : 'clbrdrt'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfTblAttr; rtfKMinor: rtfCellBordLeft; rtfKstr : 'clbrdrl'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfTblAttr; rtfKMinor: rtfCellBordRight; rtfKstr : 'clbrdrr'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfTblAttr; rtfKMinor: rtfRowDef; rtfKstr : 'trowd'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfTblAttr; rtfKMinor: rtfRowLeft; rtfKstr : 'trql'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfTblAttr; rtfKMinor: rtfRowRight; rtfKstr : 'trqr'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfTblAttr; rtfKMinor: rtfRowCenter; rtfKstr : 'trqc'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfTblAttr; rtfKMinor: rtfRowGapH; rtfKstr : 'trgaph'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfTblAttr; rtfKMinor: rtfRowHt; rtfKstr : 'trrh'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfTblAttr; rtfKMinor: rtfRowLeftEdge; rtfKstr : 'trleft'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfTblAttr; rtfKMinor: rtfCellPos; rtfKstr : 'cellx'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfTblAttr; rtfKMinor: rtfMergeRngFirst; rtfKstr : 'clmgf'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfTblAttr; rtfKMinor: rtfMergePrevious; rtfKstr : 'clmrg'; rtfkHash : 0),
|
||||||
|
|
||||||
|
( rtfKMajor: rtfFieldAttr; rtfKMinor: rtfFieldDirty; rtfKstr : 'flddirty'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfFieldAttr; rtfKMinor: rtfFieldEdited; rtfKstr : 'fldedit'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfFieldAttr; rtfKMinor: rtfFieldLocked; rtfKstr : 'fldlock'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfFieldAttr; rtfKMinor: rtfFieldPrivate; rtfKstr : 'fldpriv'; rtfkHash : 0),
|
||||||
|
|
||||||
|
( rtfKMajor: rtfPosAttr; rtfKMinor: rtfPosX; rtfKstr : 'posx'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPosAttr; rtfKMinor: rtfPosXCenter; rtfKstr : 'posxc'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPosAttr; rtfKMinor: rtfPosXInside; rtfKstr : 'posxi'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPosAttr; rtfKMinor: rtfPosXLeft; rtfKstr : 'posxl'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPosAttr; rtfKMinor: rtfPosXOutSide; rtfKstr : 'posxo'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPosAttr; rtfKMinor: rtfPosXRight; rtfKstr : 'posxr'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPosAttr; rtfKMinor: rtfPosY; rtfKstr : 'posy'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPosAttr; rtfKMinor: rtfPosYInline; rtfKstr : 'posyil'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPosAttr; rtfKMinor: rtfPosYTop; rtfKstr : 'posyt'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPosAttr; rtfKMinor: rtfPosYCenter; rtfKstr : 'posyc'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPosAttr; rtfKMinor: rtfPosYBottom; rtfKstr : 'posyb'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPosAttr; rtfKMinor: rtfAbsWid; rtfKstr : 'absw'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPosAttr; rtfKMinor: rtfTextDist; rtfKstr : 'dxfrtext'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPosAttr; rtfKMinor: rtfRPosMargV; rtfKstr : 'pvmrg'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPosAttr; rtfKMinor: rtfRPosPageV; rtfKstr : 'pvpg'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPosAttr; rtfKMinor: rtfRPosMargH; rtfKstr : 'phmrg'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPosAttr; rtfKMinor: rtfRPosPageH; rtfKstr : 'phpg'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfPosAttr; rtfKMinor: rtfRPosColH; rtfKstr : 'phcol'; rtfkHash : 0),
|
||||||
|
|
||||||
|
( rtfKMajor: rtfVersion; rtfKMinor: -1; rtfKstr : 'rtf'; rtfkHash : 0),
|
||||||
|
( rtfKMajor: rtfDefFont; rtfKMinor: -1; rtfKstr : 'deff'; rtfkHash : 0),
|
||||||
|
|
||||||
|
( rtfKMajor: 0; rtfKMinor: -1; rtfKstr : ''; rtfkHash : 0)
|
||||||
|
);
|
||||||
|
|
971
components/richmemo/rtfparspre211.pp
Normal file
971
components/richmemo/rtfparspre211.pp
Normal file
@ -0,0 +1,971 @@
|
|||||||
|
Unit RTFParsPre211;
|
||||||
|
{
|
||||||
|
This file is part of the Free Pascal run time library.
|
||||||
|
Copyright (c) 1999-2000 by Michael Van Canneyt, Member of the
|
||||||
|
Free Pascal development team
|
||||||
|
|
||||||
|
This unit implements a RTF Parser.
|
||||||
|
|
||||||
|
See the file COPYING.FPC, included in this distribution,
|
||||||
|
for details about the copyright.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
**********************************************************************}
|
||||||
|
|
||||||
|
// modified: by Dmitry Boyarintsev 20-may-2010, fixing identation and code-style
|
||||||
|
|
||||||
|
{$mode objfpc}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils;
|
||||||
|
|
||||||
|
{$i rtfdata.inc}
|
||||||
|
|
||||||
|
type
|
||||||
|
TRTFErrorHandler = Procedure (s : string) of object;
|
||||||
|
|
||||||
|
{ TRTFParser }
|
||||||
|
|
||||||
|
TRTFParser = class(TObject)
|
||||||
|
private
|
||||||
|
FOnRTFError : TRTFerrorHandler;
|
||||||
|
FfontList : PRTFFont;
|
||||||
|
FcolorList : PRTFColor;
|
||||||
|
FstyleList : PRTFStyle;
|
||||||
|
FrtfClass : Integer;
|
||||||
|
FrtfMajor : Integer;
|
||||||
|
FrtfMinor : Integer;
|
||||||
|
FrtfParam : Integer;
|
||||||
|
rtfTextBuf : string [rtfBufSiz];
|
||||||
|
rtfTextLen : Integer;
|
||||||
|
pushedChar : Integer; { pushback char if read too far }
|
||||||
|
pushedClass : Integer; { pushed token info for RTFUngetToken() }
|
||||||
|
pushedMajor : Integer;
|
||||||
|
pushedMinor : Integer;
|
||||||
|
pushedParam : Integer;
|
||||||
|
pushedTextBuf : String[rtfBufSiz];
|
||||||
|
FStream : TStream;
|
||||||
|
ccb : array [0..rtfMaxClass] of TRTFFuncPtr; { class callbacks }
|
||||||
|
dcb : array [0..rtfMaxDestination] of TRTFFuncPtr; { destination callbacks }
|
||||||
|
readHook : TRTFFUNCPTR;
|
||||||
|
FTokenClass: Integer;
|
||||||
|
procedure Error (msg : String);
|
||||||
|
procedure LookupInit ;
|
||||||
|
procedure ReadFontTbl ;
|
||||||
|
procedure ReadColorTbl;
|
||||||
|
procedure ReadStyleSheet ;
|
||||||
|
procedure ReadInfoGroup ;
|
||||||
|
procedure ReadPictGroup ;
|
||||||
|
function CheckCM (Aclass, major: Integer) : Boolean;
|
||||||
|
function CheckCMM (Aclass, major, minor : Integer) : Boolean;
|
||||||
|
function CheckMM (major, minor : Integer) : Boolean;
|
||||||
|
procedure Real_RTFGetToken;
|
||||||
|
function GetChar : Integer;
|
||||||
|
procedure Lookup (S : String);
|
||||||
|
function GetFont (num : Integer) : PRTFFont;
|
||||||
|
function GetColor (num : Integer) : PRTFColor;
|
||||||
|
function GetStyle (num : Integer) : PRTFStyle;
|
||||||
|
procedure setClassCallback (Aclass : Integer; Acallback : TRTFFuncPtr);
|
||||||
|
function GetClassCallback (Aclass : Integer) : TRTFFuncPtr;
|
||||||
|
procedure SetDestinationCallback (ADestination : Integer; Acallback : TRTFFuncPtr);
|
||||||
|
function GetDestinationCallback (Adestination : Integer) : TRTFFuncPtr ;
|
||||||
|
procedure SetStream (Astream : TStream);
|
||||||
|
public
|
||||||
|
constructor Create (AStream : TStream);
|
||||||
|
destructor Destroy; override;
|
||||||
|
procedure GetReadHook (Var q : TRTFFuncPtr);
|
||||||
|
function GetToken : Integer;
|
||||||
|
function PeekToken : Integer;
|
||||||
|
procedure ResetParser;
|
||||||
|
procedure RouteToken;
|
||||||
|
procedure SkipGroup;
|
||||||
|
procedure StartReading;
|
||||||
|
procedure SetReadHook (Hook : TRTFFuncPtr);
|
||||||
|
procedure UngetToken;
|
||||||
|
procedure SetToken (Aclass, major, minor, param : Integer; text : string);
|
||||||
|
procedure ExpandStyle (n : Integer);
|
||||||
|
function GetRtfText: string;
|
||||||
|
{ Properties }
|
||||||
|
property Colors [Index : Integer]: PRTFColor Read GetColor;
|
||||||
|
property ClassCallBacks [AClass : Integer]: TRTFFuncptr
|
||||||
|
read GetClassCallBack write SetClassCallback;
|
||||||
|
property DestinationCallBacks [Adestination : Integer]: TRTFFuncptr
|
||||||
|
read GetdestinationCallBack write SetdestinationCallback;
|
||||||
|
property Fonts [Index : Integer]: PRTFFont Read GetFont;
|
||||||
|
property OnRTFError : TRTFerrorHandler Read FOnRTFError Write FOnRTFError;
|
||||||
|
property rtfClass : Integer Read FrtfClass;
|
||||||
|
property rtfMajor : Integer Read FrtfMajor;
|
||||||
|
property rtfMinor : Integer Read FrtfMinor;
|
||||||
|
property rtfParam : Integer Read FrtfParam;
|
||||||
|
property Stream : TStream Read FStream Write SetStream;
|
||||||
|
property Styles [index : Integer] : PRTFStyle Read GetStyle;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
|
||||||
|
const
|
||||||
|
EOF = -255;
|
||||||
|
|
||||||
|
{ ---------------------------------------------------------------------
|
||||||
|
Utility functions
|
||||||
|
---------------------------------------------------------------------}
|
||||||
|
|
||||||
|
function Hash (s : String) : Integer;
|
||||||
|
var
|
||||||
|
val,i : integer;
|
||||||
|
begin
|
||||||
|
val:=0;
|
||||||
|
for i:=1 to length(s) do
|
||||||
|
val:=val+ord(s[i]);
|
||||||
|
Hash:=val;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function isalpha (s : integer) : Boolean;
|
||||||
|
begin
|
||||||
|
Result:= ( (s>=ord('A')) and (s<=ord('Z')))
|
||||||
|
or (((s>=ord('a')) and ((s<=ord('z')) )));
|
||||||
|
end;
|
||||||
|
|
||||||
|
function isdigit (s : integer) : Boolean;
|
||||||
|
begin
|
||||||
|
Result:= ( (s>=ord('0')) and (s<=ord('9')) )
|
||||||
|
end;
|
||||||
|
|
||||||
|
function HexVal (c : Integer) : Integer;
|
||||||
|
begin
|
||||||
|
if (c>=ord('A')) and (C<=ord('Z')) then inc (c,32);
|
||||||
|
if c<ord ('A') then
|
||||||
|
result:=(c - ord('0')) { '0'..'9' }
|
||||||
|
else
|
||||||
|
result:= (c - ord('a') + 10); { 'a'..'f' }
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ ---------------------------------------------------------------------
|
||||||
|
Initialize the reader. This may be called multiple times,
|
||||||
|
to read multiple files. The only thing not reset is the input
|
||||||
|
stream; that must be done with RTFSetStream().
|
||||||
|
---------------------------------------------------------------------}
|
||||||
|
|
||||||
|
constructor TRTFParser.Create (AStream : TStream);
|
||||||
|
Begin
|
||||||
|
inherited create;
|
||||||
|
{ initialize lookup table }
|
||||||
|
LookupInit;
|
||||||
|
Fstream := Astream;
|
||||||
|
FfontList :=nil;
|
||||||
|
FcolorList:=nil;
|
||||||
|
FstyleList :=nil;
|
||||||
|
onrtferror:=nil;
|
||||||
|
ResetParser;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure TRTFParser.ResetParser;
|
||||||
|
var
|
||||||
|
cp : PRTFColor;
|
||||||
|
fp : PRTFFont;
|
||||||
|
sp : PRTFStyle;
|
||||||
|
ep,eltlist : PRTFStyleElt;
|
||||||
|
i : integer;
|
||||||
|
begin
|
||||||
|
for i:=0 to rtfMaxClass-1 do
|
||||||
|
setClassCallback(i, nil);
|
||||||
|
for i:=0 to rtfMaxDestination-1 do
|
||||||
|
SetDestinationCallback(i, nil);
|
||||||
|
|
||||||
|
{ install built-in destination readers }
|
||||||
|
SetDestinationCallback (rtfFontTbl, @ReadFontTbl);
|
||||||
|
SetDestinationCallback (rtfColorTbl, @ReadColorTbl);
|
||||||
|
SetDestinationCallback (rtfStyleSheet, @ReadStyleSheet);
|
||||||
|
SetDestinationCallback (rtfInfo, @ReadInfoGroup);
|
||||||
|
SetDestinationCallback (rtfPict, @ReadPictGroup);
|
||||||
|
|
||||||
|
SetReadHook (Nil);
|
||||||
|
|
||||||
|
{ dump old lists if necessary }
|
||||||
|
|
||||||
|
while FfontList<>nil do begin
|
||||||
|
fp := FfontList^.rtfNextFont;
|
||||||
|
dispose (FfontList);
|
||||||
|
FfontList := fp;
|
||||||
|
end;
|
||||||
|
|
||||||
|
while FcolorList<>nil do begin
|
||||||
|
cp := FcolorList^.rtfNextColor;
|
||||||
|
dispose (FcolorList);
|
||||||
|
FcolorList := cp;
|
||||||
|
end;
|
||||||
|
|
||||||
|
while FstyleList<>nil do begin
|
||||||
|
sp := FstyleList^.rtfNextStyle;
|
||||||
|
eltList := FstyleList^.rtfSSEList;
|
||||||
|
while eltList<>nil do begin
|
||||||
|
ep:=eltList^.rtfNextSE;
|
||||||
|
dispose(eltList);
|
||||||
|
eltList:= ep;
|
||||||
|
end;
|
||||||
|
Dispose (FstyleList);
|
||||||
|
FstyleList := sp;
|
||||||
|
end;
|
||||||
|
FrtfClass := -1;
|
||||||
|
pushedClass := -1;
|
||||||
|
pushedChar := EOF;
|
||||||
|
|
||||||
|
{ Reset the stream if it is assigned }
|
||||||
|
if assigned (FStream) then
|
||||||
|
FStream.seek(0,soFromBeginning);
|
||||||
|
End;
|
||||||
|
|
||||||
|
|
||||||
|
Destructor TRTFParser.Destroy;
|
||||||
|
var
|
||||||
|
cp : PRTFColor;
|
||||||
|
fp : PRTFFont;
|
||||||
|
sp : PRTFStyle;
|
||||||
|
ep,eltlist : PRTFStyleElt;
|
||||||
|
begin
|
||||||
|
{ Dump the lists. }
|
||||||
|
while FfontList<>nil do begin
|
||||||
|
fp := FfontList^.rtfNextFont;
|
||||||
|
dispose (FfontList);
|
||||||
|
FfontList := fp;
|
||||||
|
end;
|
||||||
|
|
||||||
|
while FcolorList<>nil do begin
|
||||||
|
cp := FcolorList^.rtfNextColor;
|
||||||
|
dispose (FcolorList);
|
||||||
|
FcolorList := cp;
|
||||||
|
end;
|
||||||
|
|
||||||
|
while FstyleList<>nil do begin
|
||||||
|
sp := FstyleList^.rtfNextStyle;
|
||||||
|
eltList := FstyleList^.rtfSSEList;
|
||||||
|
while eltList<>nil do begin
|
||||||
|
ep:=eltList^.rtfNextSE;
|
||||||
|
dispose(eltList);
|
||||||
|
eltList:= ep;
|
||||||
|
end;
|
||||||
|
Dispose (FstyleList);
|
||||||
|
FstyleList := sp;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ Dump rest }
|
||||||
|
inherited destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{ ---------------------------------------------------------------------
|
||||||
|
Callback table manipulation routines
|
||||||
|
---------------------------------------------------------------------}
|
||||||
|
|
||||||
|
Procedure TRTFParser.SetClassCallback (Aclass : Integer; Acallback : TRTFFuncPtr);
|
||||||
|
begin
|
||||||
|
if (aclass>=0) and (Aclass<rtfMaxClass) then
|
||||||
|
ccb[Aclass]:= Acallback;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TRTFParser.GetClassCallback (Aclass : Integer) : TRTFFuncPtr;
|
||||||
|
Begin
|
||||||
|
if (Aclass>=0) and (Aclass<rtfMaxClass) then
|
||||||
|
GetClassCallback :=ccb[Aclass]
|
||||||
|
else
|
||||||
|
GetClassCallback:=nil;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ ---------------------------------------------------------------------
|
||||||
|
Install or return a writer callback for a destination type
|
||||||
|
---------------------------------------------------------------------}
|
||||||
|
|
||||||
|
Procedure TRTFParser.SetDestinationCallback (ADestination : Integer; Acallback : TRTFFuncPtr);
|
||||||
|
Begin
|
||||||
|
if (Adestination>=0) and (Adestination<rtfMaxDestination) then
|
||||||
|
dcb[ADestination] := Acallback;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TRTFParser.GetDestinationCallback (Adestination : Integer) : TRTFFuncPtr ;
|
||||||
|
begin
|
||||||
|
if (Adestination>=0) and (ADestination<rtfMaxDestination) then
|
||||||
|
Result:=dcb[Adestination]
|
||||||
|
else
|
||||||
|
Result:=nil;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ ---------------------------------------------------------------------
|
||||||
|
Token reading routines
|
||||||
|
---------------------------------------------------------------------}
|
||||||
|
|
||||||
|
{ Read the input stream, invoking the writer's callbacks where appropriate. }
|
||||||
|
|
||||||
|
Procedure TRTFParser.StartReading;
|
||||||
|
begin
|
||||||
|
{ Reset stream. }
|
||||||
|
FStream.Seek (0,soFromBeginning);
|
||||||
|
{ Start reading. }
|
||||||
|
while (GetToken<>rtfEOF) do
|
||||||
|
RouteToken;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{ Route a token. If it's a destination for which a reader is
|
||||||
|
installed, process the destination internally, otherwise
|
||||||
|
pass the token to the writer's class callback. }
|
||||||
|
procedure TRTFParser.RouteToken;
|
||||||
|
var
|
||||||
|
p : TRTFFuncPtr;
|
||||||
|
begin
|
||||||
|
if (rtfClass < 0) or (rtfClass>=rtfMaxClass) then
|
||||||
|
Error ('No such class : '+rtfTextBuf)
|
||||||
|
else begin
|
||||||
|
if (CheckCM (rtfControl, rtfDestination)) then begin
|
||||||
|
{ invoke destination-specific callback if there is one }
|
||||||
|
p:=GetDestinationCallback (rtfMinor);
|
||||||
|
if assigned(p) then begin
|
||||||
|
p();
|
||||||
|
exit
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
{ invoke class callback if there is one }
|
||||||
|
p:= GetClassCallback (rtfClass);
|
||||||
|
if assigned(p) then p();
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{ Skip to the end of the current group. When this returns,
|
||||||
|
writers that maintain a state stack may want to call their
|
||||||
|
state unstacker; global vars will still be set to the group's
|
||||||
|
closing brace. }
|
||||||
|
Procedure TRTFParser.SkipGroup;
|
||||||
|
Var
|
||||||
|
level : Integer;
|
||||||
|
Begin
|
||||||
|
level:= 1;
|
||||||
|
while (GetToken<>rtfEOF) do
|
||||||
|
if (rtfClass=rtfGroup) then begin
|
||||||
|
if (rtfMajor=rtfBeginGroup) then
|
||||||
|
inc(level)
|
||||||
|
else if (rtfMajor=rtfEndGroup) then begin
|
||||||
|
dec(level);
|
||||||
|
if (level < 1) then Exit; { end of initial group }
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
End;
|
||||||
|
|
||||||
|
{ Read one token. Call the read hook if there is one. The
|
||||||
|
token class is the return value. Returns rtfEOF when there
|
||||||
|
are no more tokens. }
|
||||||
|
function TRTFParser.GetToken : Integer;
|
||||||
|
var
|
||||||
|
p : TRTFFuncPTR;
|
||||||
|
begin
|
||||||
|
GetReadHook (p);
|
||||||
|
while true do begin
|
||||||
|
Real_RTFGetToken;
|
||||||
|
if (assigned(p)) then p(); { give read hook a look at token }
|
||||||
|
{ Silently discard newlines and carriage returns. }
|
||||||
|
if not ((rtfClass=rtfText) and ((rtfMajor=13) or (rtfmajor=10))) then
|
||||||
|
Break;
|
||||||
|
end;
|
||||||
|
Result:=rtfClass;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ ---------------------------------------------------------------------
|
||||||
|
Install or return a token reader hook.
|
||||||
|
---------------------------------------------------------------------}
|
||||||
|
procedure TRTFParser.SetReadHook(Hook : TRTFFuncPtr);
|
||||||
|
begin
|
||||||
|
readHook := Hook;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TRTFParser.GetReadHook(Var q : TRTFFuncPtr);
|
||||||
|
begin
|
||||||
|
Q:=readHook;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TRTFParser.UngetToken;
|
||||||
|
begin
|
||||||
|
if (pushedClass >= 0) then { there's already an ungotten token }
|
||||||
|
Error ('cannot unget two tokens');
|
||||||
|
if (rtfClass < 0) then
|
||||||
|
Error ('no token to unget');
|
||||||
|
pushedClass := rtfClass;
|
||||||
|
pushedMajor := rtfMajor;
|
||||||
|
pushedMinor := rtfMinor;
|
||||||
|
pushedParam := rtfParam;
|
||||||
|
rtfTextBuf := pushedTextBuf;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TRTFParser.PeekToken : Integer;
|
||||||
|
begin
|
||||||
|
Real_RTFGetToken;
|
||||||
|
UngetToken;
|
||||||
|
Result:=rtfClass;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure TRTFParser.Real_RTFGetToken;
|
||||||
|
var
|
||||||
|
sign,c,c2 : Integer;
|
||||||
|
begin
|
||||||
|
{ check for pushed token from RTFUngetToken() }
|
||||||
|
if (pushedClass >= 0) then begin
|
||||||
|
FrtfClass := pushedClass;
|
||||||
|
FrtfMajor := pushedMajor;
|
||||||
|
FrtfMinor := pushedMinor;
|
||||||
|
FrtfParam := pushedParam;
|
||||||
|
rtfTextBuf := pushedTextBuf;
|
||||||
|
rtfTextLen := length (rtfTextBuf);
|
||||||
|
pushedClass := -1;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ initialize token vars }
|
||||||
|
FrtfClass := rtfUnknown;
|
||||||
|
FrtfParam := rtfNoParam;
|
||||||
|
rtfTextBuf := '';
|
||||||
|
rtfTextLen := 0;
|
||||||
|
FTokenClass := rtfUnknown;
|
||||||
|
|
||||||
|
{ get first character, which may be a pushback from previous token }
|
||||||
|
|
||||||
|
if (pushedChar <> EOF) then begin
|
||||||
|
c := pushedChar;
|
||||||
|
rtfTextBuf:=rtfTextBuf+chr(c);
|
||||||
|
inc(rtftextlen);
|
||||||
|
pushedChar := EOF;
|
||||||
|
end else begin
|
||||||
|
c:=GetChar;
|
||||||
|
if C=EOF then begin
|
||||||
|
FrtfClass := rtfEOF;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if c=ord('{') then begin
|
||||||
|
FrtfClass := rtfGroup;
|
||||||
|
FrtfMajor := rtfBeginGroup;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if c=ord('}') then begin
|
||||||
|
FrtfClass := RTFGROUP;
|
||||||
|
FrtfMajor := rtfEndGroup;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if c<>ord('\') then begin
|
||||||
|
{ Two possibilities here:
|
||||||
|
1) ASCII 9, effectively like \tab control symbol
|
||||||
|
2) literal text char }
|
||||||
|
if c=ord(#8) then begin { ASCII 9 }
|
||||||
|
FrtfClass := rtfControl;
|
||||||
|
FrtfMajor := rtfSpecialChar;
|
||||||
|
FrtfMinor := rtfTab;
|
||||||
|
end else begin
|
||||||
|
FrtfClass := rtfText;
|
||||||
|
FrtfMajor := c;
|
||||||
|
end;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
c:=getchar;
|
||||||
|
if (c=EOF) then { early eof, whoops (class is rtfUnknown) }
|
||||||
|
Exit;
|
||||||
|
|
||||||
|
if ( not isalpha (c)) then begin
|
||||||
|
{ Three possibilities here:
|
||||||
|
1) hex encoded text char, e.g., \'d5, \'d3
|
||||||
|
2) special escaped text char, e.g., \, \;
|
||||||
|
3) control symbol, e.g., \_, \-, \|, \<10> }
|
||||||
|
if c=ord('''') then begin{ hex char }
|
||||||
|
c:=getchar;
|
||||||
|
if (c<>EOF) then begin
|
||||||
|
c2:=getchar;
|
||||||
|
if (c2<>EOF) then begin
|
||||||
|
{ should do isxdigit check! }
|
||||||
|
FrtfClass := rtfText;
|
||||||
|
FrtfMajor := HexVal (c) * 16 + HexVal (c2);
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
{ early eof, whoops (class is rtfUnknown) }
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
if pos (chr(c),':{};\')<>0 then begin{ escaped char }
|
||||||
|
FrtfClass := rtfText;
|
||||||
|
FrtfMajor := c;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ control symbol }
|
||||||
|
Lookup (rtfTextBuf); { sets class, major, minor }
|
||||||
|
FTokenClass:=rtfControl;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ control word }
|
||||||
|
while (isalpha (c)) do begin
|
||||||
|
c:=GetChar;
|
||||||
|
if (c=EOF) then Break;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ At this point, the control word is all collected, so the
|
||||||
|
major/minor numbers are determined before the parameter
|
||||||
|
(if any) is scanned. There will be one too many characters
|
||||||
|
in the buffer, though, so fix up before and restore after
|
||||||
|
looking up. }
|
||||||
|
if (c<>EOF) then Delete(rtfTextBuf,length(rtfTextbuf),1);
|
||||||
|
Lookup (rtfTextBuf); { sets class, major, minor }
|
||||||
|
FTokenClass:=rtfControl;
|
||||||
|
if (c <>EOF) then
|
||||||
|
rtfTextBuf:=rtfTextBuf+chr(c);
|
||||||
|
|
||||||
|
{ Should be looking at first digit of parameter if there
|
||||||
|
is one, unless it's negative. In that case, next char
|
||||||
|
is '-', so need to gobble next char, and remember sign. }
|
||||||
|
sign := 1;
|
||||||
|
if c = ord('-') then begin
|
||||||
|
sign := -1;
|
||||||
|
c := GetChar;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if (c<>EOF) then
|
||||||
|
if isdigit (c) then begin
|
||||||
|
FrtfParam := 0;
|
||||||
|
while (isdigit (c)) do begin { gobble parameter }
|
||||||
|
FrtfParam := FrtfParam * 10 + c - ord('0');
|
||||||
|
c:=GetChar;
|
||||||
|
if (c=EOF) then Break;
|
||||||
|
end;
|
||||||
|
FrtfParam:= sign*FrtfParam;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ If control symbol delimiter was a blank, gobble it.
|
||||||
|
Otherwise the character is first char of next token, so
|
||||||
|
push it back for next call. In either case, delete the
|
||||||
|
delimiter from the token buffer. }
|
||||||
|
if (c<>EOF) then begin
|
||||||
|
if c<>ord (' ') then pushedChar := c;
|
||||||
|
Delete (rtfTextBuf,rtfTextLen,1);
|
||||||
|
Dec (rtfTextLen);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TRTFParser.GetChar : Integer;
|
||||||
|
var
|
||||||
|
c : byte;
|
||||||
|
begin
|
||||||
|
if FStream.read(c,1)<>0 then begin
|
||||||
|
if (c and 128)=128 then c:=ord('?');
|
||||||
|
Result:=c;
|
||||||
|
rtfTextBuf:=rtfTextBuf+chr(c);
|
||||||
|
inc(rtfTextLen);
|
||||||
|
end else
|
||||||
|
Result:=EOF;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ Synthesize a token by setting the global variables to the
|
||||||
|
values supplied. Typically this is followed with a call
|
||||||
|
to RTFRouteToken().
|
||||||
|
If param is non-negative, it becomes part of the token text. }
|
||||||
|
Procedure TRTFParser.SetToken (Aclass, major, minor, param : Integer; text : string);
|
||||||
|
Begin
|
||||||
|
FrtfClass := Aclass;
|
||||||
|
FrtfMajor := major;
|
||||||
|
FrtfMinor := minor;
|
||||||
|
FrtfParam := param;
|
||||||
|
if (param=rtfNoParam) then
|
||||||
|
rtfTextBuf:=text
|
||||||
|
else
|
||||||
|
rtfTextBuf:=text+IntTostr(param);
|
||||||
|
rtfTextLen:=length(rtfTextBuf);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ ---------------------------------------------------------------------
|
||||||
|
Special destination readers. They gobble the destination so the
|
||||||
|
writer doesn't have to deal with them. That's wrong for any
|
||||||
|
translator that wants to process any of these itself. In that
|
||||||
|
case, these readers should be overridden by installing a different
|
||||||
|
destination callback.
|
||||||
|
|
||||||
|
NOTE: The last token read by each of these reader will be the
|
||||||
|
destination's terminating '', which will then be the current token.
|
||||||
|
That 'End;' token is passed to RTFRouteToken() - the writer has already
|
||||||
|
seen the 'Begin' that began the destination group, and may have pushed a
|
||||||
|
state; it also needs to know at the end of the group that a state
|
||||||
|
should be popped.
|
||||||
|
|
||||||
|
It's important that rtfdata.inc and the control token lookup table list
|
||||||
|
as many symbols as possible, because these readers unfortunately
|
||||||
|
make strict assumptions about the input they expect, and a token
|
||||||
|
of class rtfUnknown will throw them off easily.
|
||||||
|
----------------------------------------------------------------------}
|
||||||
|
|
||||||
|
|
||||||
|
{ Read Begin \fonttbl ... End; destination. Old font tables don't have
|
||||||
|
braces around each table entry; try to adjust for that.}
|
||||||
|
procedure TRTFParser.ReadFontTbl;
|
||||||
|
var
|
||||||
|
fp : PRTFFont;
|
||||||
|
bp : string[rtfbufsiz];
|
||||||
|
old : Integer;
|
||||||
|
begin
|
||||||
|
old := -1;
|
||||||
|
|
||||||
|
while true do begin
|
||||||
|
GetToken;
|
||||||
|
if CheckCM (rtfGroup, rtfEndGroup) then break;
|
||||||
|
if (old < 0) then begin { first entry - determine tbl type }
|
||||||
|
if CheckCMM (rtfControl, rtfCharAttr, rtfFontNum) then
|
||||||
|
old:=1 { no brace }
|
||||||
|
else if CheckCM (rtfGroup, rtfBeginGroup) then
|
||||||
|
old:= 0 { brace }
|
||||||
|
else { can't tell! }
|
||||||
|
Error ('FTErr - Cannot determine format')
|
||||||
|
end;
|
||||||
|
if (old=0) then begin { need to find "Begin" here }
|
||||||
|
if not CheckCM (rtfGroup, rtfBeginGroup) then
|
||||||
|
Error ('FTErr - missing {');
|
||||||
|
GetToken; { yes, skip to next token }
|
||||||
|
end;
|
||||||
|
|
||||||
|
new(fp);
|
||||||
|
if (fp=nil) then
|
||||||
|
Error ('FTErr - cannot allocate font entry');
|
||||||
|
fp^.rtfNextFont:= FfontList;
|
||||||
|
FfontList:=fp;
|
||||||
|
if not CheckCMM (rtfControl, rtfCharAttr, rtfFontNum) then
|
||||||
|
Error ('FTErr - missing font number');
|
||||||
|
fp^.rtfFNum := rtfParam;
|
||||||
|
|
||||||
|
{ Read optionalcommands. Recognize only fontfamily}
|
||||||
|
GetToken;
|
||||||
|
if not CheckCM (rtfControl, rtfFontFamily) then
|
||||||
|
error ('FTErr - missing font family ');
|
||||||
|
fp^.rtfFFamily := rtfMinor;
|
||||||
|
|
||||||
|
{ Read optional commands/groups. Recognize none at this point..}
|
||||||
|
GetToken;
|
||||||
|
while (rtfclass=rtfcontrol) or ((rtfclass=rtfgroup) or (rtfclass=rtfunknown)) do begin
|
||||||
|
if rtfclass=rtfgroup then SkipGroup;
|
||||||
|
GetToken
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ Read font name }
|
||||||
|
bp:='';
|
||||||
|
while (rtfclass=rtfText) do begin
|
||||||
|
if rtfMajor=ord(';') then Break;
|
||||||
|
bp:=bp+chr(rtfMajor);
|
||||||
|
GetToken
|
||||||
|
end;
|
||||||
|
|
||||||
|
if bp='' then Error ('FTErr - missing font name');
|
||||||
|
fp^.rtffname:=bp;
|
||||||
|
|
||||||
|
{ Read alternate font}
|
||||||
|
if (old=0) then begin { need to see "End;" here }
|
||||||
|
GetToken;
|
||||||
|
if not CheckCM (rtfGroup, rtfEndGroup) then
|
||||||
|
Error ('FTErr - missing }');
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
RouteToken; { feed "End;" back to router }
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{ The color table entries have color values of -1 if
|
||||||
|
the default color should be used for the entry (only
|
||||||
|
a semi-colon is given in the definition, no color values).
|
||||||
|
There will be a problem if a partial entry (1 or 2 but
|
||||||
|
not 3 color values) is given. The possibility is ignored
|
||||||
|
here. }
|
||||||
|
Procedure TRTFParser.ReadColorTbl;
|
||||||
|
var
|
||||||
|
cp : PRTFColor;
|
||||||
|
cnum : Integer;
|
||||||
|
Begin
|
||||||
|
cnum:=0;
|
||||||
|
while true do begin
|
||||||
|
GetToken;
|
||||||
|
if CheckCM (rtfGroup, rtfEndGroup) then Break;
|
||||||
|
new(cp);
|
||||||
|
if (cp=nil) then
|
||||||
|
Error ('CTErr - cannot allocate color entry');
|
||||||
|
cp^.rtfCNum :=cnum;
|
||||||
|
cp^.rtfCRed :=-1;
|
||||||
|
cp^.rtfCGreen:=-1;
|
||||||
|
cp^.rtfCBlue :=-1;
|
||||||
|
cp^.rtfNextColor := FColorList;
|
||||||
|
inc(cnum);
|
||||||
|
FcolorList:=cp;
|
||||||
|
while true do begin
|
||||||
|
if not CheckCM (rtfControl, rtfColorName) then Break;
|
||||||
|
case rtfMinor of
|
||||||
|
rtfRed: cp^.rtfCRed :=rtfParam;
|
||||||
|
rtfGreen: cp^.rtfCGreen :=rtfParam;
|
||||||
|
rtfBlue: cp^.rtfCBlue :=rtfParam;
|
||||||
|
end;
|
||||||
|
GetToken;
|
||||||
|
end;
|
||||||
|
if not CheckCM (rtfText, ord(';')) then
|
||||||
|
Error ('CTErr - malformed entry');
|
||||||
|
end;
|
||||||
|
RouteToken; { feed "End;" back to router }
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{ The "Normal" style definition doesn't contain any style number
|
||||||
|
(why?), all others do. Normal style is given style 0. }
|
||||||
|
|
||||||
|
Procedure TRTFParser.ReadStyleSheet;
|
||||||
|
var
|
||||||
|
sp : PRTFStyle;
|
||||||
|
sep,sepLast : PRTFStyleElt;
|
||||||
|
bp : string[rtfBufSiz];
|
||||||
|
begin
|
||||||
|
while true do begin
|
||||||
|
GetToken;
|
||||||
|
if CheckCM (rtfGroup, rtfEndGroup) then Break;
|
||||||
|
new (sp);
|
||||||
|
if sp=nil then Error ('SSErr - cannot allocate stylesheet entry');
|
||||||
|
sp^.rtfSNum := -1;
|
||||||
|
sp^.rtfSBasedOn := rtfBasedOnNone;
|
||||||
|
sp^.rtfSNextPar := -1;
|
||||||
|
sp^.rtfSSEList := nil;
|
||||||
|
sepLast:=nil;
|
||||||
|
sp^.rtfNextStyle := FstyleList;
|
||||||
|
sp^.rtfExpanding := 0;
|
||||||
|
FstyleList := sp;
|
||||||
|
if not CheckCM (rtfGroup, rtfBeginGroup) then Error ('SSErr - missing {');
|
||||||
|
while (GetToken=rtfControl) or (FTokenClass=rtfControl) do begin
|
||||||
|
if rtfClass=rtfUnknown then Continue;
|
||||||
|
if (CheckMM (rtfParAttr, rtfStyleNum)) then begin
|
||||||
|
sp^.rtfSNum:=rtfParam;
|
||||||
|
continue;
|
||||||
|
end;
|
||||||
|
if (CheckMM (rtfStyleAttr, rtfBasedOn)) then begin
|
||||||
|
sp^.rtfSBasedOn:=rtfParam;
|
||||||
|
continue;
|
||||||
|
end;
|
||||||
|
if (CheckMM (rtfStyleAttr, rtfNext)) then begin
|
||||||
|
sp^.rtfSNextPar:=rtfParam;
|
||||||
|
Continue;
|
||||||
|
end;
|
||||||
|
new(sep);
|
||||||
|
if sep=nil then
|
||||||
|
Error ('SSErr - cannot allocate style element');
|
||||||
|
sep^.rtfSEClass:=rtfClass;
|
||||||
|
sep^.rtfSEMajor:=rtfMajor;
|
||||||
|
sep^.rtfSEMinor:=rtfMinor;
|
||||||
|
sep^.rtfSEParam:=rtfParam;
|
||||||
|
sep^.rtfSEText:=rtfTextBuf;
|
||||||
|
if sepLast=nil then
|
||||||
|
sp^.rtfSSEList:=sep { first element }
|
||||||
|
else { add to end }
|
||||||
|
sepLast^.rtfNextSE:=sep;
|
||||||
|
sep^.rtfNextSE:=nil;
|
||||||
|
sepLast:=sep;
|
||||||
|
end;
|
||||||
|
if sp^.rtfSNextPar=-1 then { \snext not given }
|
||||||
|
sp^.rtfSNextPar:=sp^.rtfSNum; { next is itself }
|
||||||
|
if rtfClass<>rtfText then
|
||||||
|
Error ('SSErr - missing style name');
|
||||||
|
Bp:='';
|
||||||
|
while rtfClass=rtfText do begin
|
||||||
|
if rtfMajor=ord(';') then begin
|
||||||
|
GetToken;
|
||||||
|
Break;
|
||||||
|
end;
|
||||||
|
bp:=bp+chr(rtfMajor);
|
||||||
|
GetToken;
|
||||||
|
end;
|
||||||
|
if (sp^.rtfSNum < 0) then begin { no style number was specified, (only legal for Normal style) }
|
||||||
|
if bp<>'Normal' then
|
||||||
|
Error ('SSErr - missing style number');
|
||||||
|
sp^.rtfSNum:=0;
|
||||||
|
end;
|
||||||
|
sp^.rtfSName:=bp;
|
||||||
|
if not CheckCM (rtfGroup, rtfEndGroup) then
|
||||||
|
Error ('SSErr - missing }');
|
||||||
|
end;
|
||||||
|
RouteToken; { feed "End;" back to router }
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TRTFParser.ReadInfoGroup;
|
||||||
|
Begin
|
||||||
|
SkipGroup;
|
||||||
|
RouteToken; { feed "End;" back to router }
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure TRTFParser.ReadPictGroup;
|
||||||
|
Begin
|
||||||
|
SkipGroup;
|
||||||
|
RouteToken; { feed "End;" back to router }
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{ ----------------------------------------------------------------------
|
||||||
|
Routines to return pieces of stylesheet, or font or color tables
|
||||||
|
----------------------------------------------------------------------}
|
||||||
|
function TRTFParser.GetStyle (num : Integer) : PRTFStyle;
|
||||||
|
var
|
||||||
|
s : PRTFSTyle;
|
||||||
|
begin
|
||||||
|
s:=Fstylelist;
|
||||||
|
if num<>1 then
|
||||||
|
while s<>nil do begin
|
||||||
|
if (s^.rtfSNum=num) then break;
|
||||||
|
s:=s^.rtfNextStyle;
|
||||||
|
end;
|
||||||
|
Result:=s; { NULL if not found }
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TRTFParser.GetFont (num : Integer) : PRTFFont;
|
||||||
|
var
|
||||||
|
f :PRTFFont;
|
||||||
|
begin
|
||||||
|
f:=FfontList;
|
||||||
|
if num<>-1 then
|
||||||
|
while f<>nil do begin
|
||||||
|
if f^.rtfFNum=num then break;
|
||||||
|
f:=f^.rtfNextFont;
|
||||||
|
end;
|
||||||
|
Result:=f; { NULL if not found }
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TRTFParser.GetColor (num : Integer) : PRTFColor;
|
||||||
|
var
|
||||||
|
c : PRTFColor;
|
||||||
|
begin
|
||||||
|
c:=Fcolorlist;
|
||||||
|
if (num<>-1) then
|
||||||
|
while c<>nil do begin
|
||||||
|
if c^.rtfCNum=num then break;
|
||||||
|
c:=c^.rtfNextColor;
|
||||||
|
end;
|
||||||
|
Result:=c; { NULL if not found }
|
||||||
|
End;
|
||||||
|
|
||||||
|
{ ---------------------------------------------------------------------
|
||||||
|
Expand style n, if there is such a style.
|
||||||
|
---------------------------------------------------------------------}
|
||||||
|
|
||||||
|
procedure TRTFParser.ExpandStyle (n : Integer);
|
||||||
|
var
|
||||||
|
s : PRTFStyle;
|
||||||
|
se : PRTFStyleElt;
|
||||||
|
begin
|
||||||
|
if n=-1 then Exit;
|
||||||
|
s:=GetStyle (n);
|
||||||
|
if s=nil then Exit;
|
||||||
|
|
||||||
|
if (s^.rtfExpanding<>0) then
|
||||||
|
Error ('Style expansion loop, style '+inttostr(n));
|
||||||
|
s^.rtfExpanding:=1; { set expansion flag for loop detection }
|
||||||
|
{
|
||||||
|
Expand "based-on" style. This is done by synthesizing
|
||||||
|
the token that the writer needs to see in order to trigger
|
||||||
|
another style expansion, and feeding to token back through
|
||||||
|
the router so the writer sees it.
|
||||||
|
}
|
||||||
|
SetToken (rtfControl, rtfParAttr, rtfStyleNum, s^.rtfSBasedOn, '\s');
|
||||||
|
RouteToken;
|
||||||
|
|
||||||
|
{
|
||||||
|
Now route the tokens unique to this style. RTFSetToken()
|
||||||
|
isn't used because it would add the param value to the end
|
||||||
|
of the token text, which already has it in.
|
||||||
|
}
|
||||||
|
se:=s^.rtfSSEList;
|
||||||
|
while se<>nil do begin
|
||||||
|
FrtfClass:=se^.rtfSEClass;
|
||||||
|
FrtfMajor:=se^.rtfSEMajor;
|
||||||
|
FrtfMinor:=se^.rtfSEMinor;
|
||||||
|
FrtfParam:=se^.rtfSEParam;
|
||||||
|
rtfTextBuf:=se^.rtfSEText;
|
||||||
|
rtfTextLen:=length (rtfTextBuf);
|
||||||
|
RouteToken;
|
||||||
|
se:=se^.rtfNextSE
|
||||||
|
end;
|
||||||
|
s^.rtfExpanding:=0; { done - clear expansion flag }
|
||||||
|
End;
|
||||||
|
|
||||||
|
function TRTFParser.GetRtfText: string;
|
||||||
|
begin
|
||||||
|
SetString(Result, @rtfTextBuf[1], rtfTextLen);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ ---------------------------------------------------------------------
|
||||||
|
Initialize lookup table hash values.
|
||||||
|
Only need to do this the first time it's called.
|
||||||
|
---------------------------------------------------------------------}
|
||||||
|
|
||||||
|
Procedure TRTFParser.LookupInit;
|
||||||
|
var
|
||||||
|
count : Integer;
|
||||||
|
begin
|
||||||
|
count:=0;
|
||||||
|
while rtfkey[count].rtfKStr<>'' do begin
|
||||||
|
rtfkey[count].rtfKHash:=Hash (rtfkey[count].rtfKStr);
|
||||||
|
inc(count)
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ ---------------------------------------------------------------------
|
||||||
|
Determine major and minor number of control token. If it's
|
||||||
|
not found, the class turns into rtfUnknown.
|
||||||
|
---------------------------------------------------------------------}
|
||||||
|
procedure TRTFParser.Lookup (S : String);
|
||||||
|
var
|
||||||
|
thehash,rp : Integer;
|
||||||
|
begin
|
||||||
|
delete(s,1,1); { skip over the leading \ character }
|
||||||
|
thehash:=Hash (s);
|
||||||
|
rp:=0;
|
||||||
|
while rtfkey[rp].rtfKstr<>'' do begin
|
||||||
|
if (thehash=rtfkey[rp].rtfKHash) and (s=rtfkey[rp].rtfKStr) then begin
|
||||||
|
FrtfClass:=rtfControl;
|
||||||
|
FrtfMajor:=rtfkey[rp].rtfKMajor;
|
||||||
|
FrtfMinor:=rtfkey[rp].rtfKMinor;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
inc(rp);
|
||||||
|
end;
|
||||||
|
FrtfClass:=rtfUnknown;
|
||||||
|
End;
|
||||||
|
|
||||||
|
procedure TRTFParser.Error (msg : String);
|
||||||
|
{ Call errorhandler }
|
||||||
|
begin
|
||||||
|
if assigned(onrtferror) then onrtferror(msg);
|
||||||
|
end;
|
||||||
|
{ ---------------------------------------------------------------------
|
||||||
|
Token comparison routines
|
||||||
|
---------------------------------------------------------------------}
|
||||||
|
|
||||||
|
function TRTFParser.CheckCM (Aclass, major: Integer) : Boolean;
|
||||||
|
begin
|
||||||
|
Result:=(rtfClass=Aclass) and (rtfMajor=major);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TRTFParser.CheckCMM (Aclass, major, minor : Integer) : Boolean;
|
||||||
|
begin
|
||||||
|
Result:=(rtfClass=Aclass) and ((rtfMajor=major) and (rtfMinor=minor));
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TRTFParser.CheckMM (major, minor : Integer) : Boolean;
|
||||||
|
begin
|
||||||
|
Result:=(rtfMajor=major) and (rtfMinor=minor);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TRTFParser.SetStream (Astream : TStream);
|
||||||
|
begin
|
||||||
|
FStream:=Astream;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
Loading…
Reference in New Issue
Block a user