📄 rvmarker.pas
字号:
rvrtfDuplicateUnicode in TCustomRVData(RVData).RTFOptions, False);
end
else
{$ENDIF}
{$ENDIF}
begin
RVFWrite(Stream, RVMakeRTFStr(DisplayString, False))
end;
if Reset and LevelInfo.HasNumbering then begin
ListOverrideOffsetsList1[ListNo] := ListOverrideOffsetsList1[ListNo]+1;
ListOverrideNo := ListOverrideOffsetsList1[ListNo];
end
else
ListOverrideNo := ListOverrideOffsetsList2[ListNo];
RVFWrite(Stream, Format('\tab}\ls%d\ilvl%d', [ListOverrideNo, Self.Level]));
end;
end;
end;
{$ENDIF}
{------------------------------------------------------------------------------}
procedure TRVMarkerItemInfo.HTMLOpenOrCloseTags(Stream: TStream;
OldLevelNo, NewLevelNo: Integer; RVStyle: TRVStyle; UseCSS: Boolean);
var i: Integer;
LevelInfo: TRVListLevel;
begin
for i := OldLevelNo downto NewLevelNo+1 do begin
LevelInfo := GetLevelInfoEx(RVStyle,i);
LevelInfo.HTMLCloseTag(Stream, UseCSS);
end;
for i := OldLevelNo+1 to NewLevelNo do begin
LevelInfo := GetLevelInfoEx(RVStyle,i);
LevelInfo.HTMLOpenTag(Stream, UseCSS);
end;
if OldLevelNo<>NewLevelNo then
RVFWriteLine(Stream,'');
end;
{------------------------------------------------------------------------------}
procedure TRVMarkerItemInfo.SaveHTMLSpecial(Stream: TStream;
Prev: TRVMarkerItemInfo; RVStyle: TRVStyle; UseCSS: Boolean);
begin
if Prev<>nil then
if Prev.ListNo<>ListNo then begin
Prev.HTMLOpenOrCloseTags(Stream, Prev.Level, -1, RVStyle, UseCSS);
HTMLOpenOrCloseTags(Stream, -1, Level, RVStyle, UseCSS)
end
else
Prev.HTMLOpenOrCloseTags(Stream, Prev.Level, Level, RVStyle, UseCSS)
else
HTMLOpenOrCloseTags(Stream, -1, Level, RVStyle, UseCSS);
end;
{------------------------------------------------------------------------------}
procedure TRVMarkerItemInfo.SaveToHTML(Stream: TStream; RVData: TPersistent;
ItemNo: Integer;
const Text, Path: String;
const imgSavePrefix: String;
var imgSaveNo: Integer;
CurrentFileColor: TColor;
SaveOptions: TRVSaveOptions;
UseCSS: Boolean;
Bullets: TRVList);
var LevelInfo: TRVListLevel;
DoDefault : Boolean;
Location: String;
ImageIndex, W,H: Integer;
begin
if not (rvsoMarkersAsText in SaveOptions) then
exit;
LevelInfo := GetLevelInfo(TCustomRVData(RVData).GetRVStyle);
if LevelInfo=nil then
exit;
case LevelInfo.ListType of
rvlstBullet, rvlstDecimal, rvlstLowerAlpha, rvlstUpperAlpha, rvlstLowerRoman,
rvlstUpperRoman {$IFNDEF RVDONOTUSEUNICODE}, rvlstUnicodeBullet{$ENDIF}:
begin
if not UseCSS then
RVFWrite(Stream, RV_HTMLOpenFontTag2(LevelInfo.Font, TCustomRVData(RVData).GetRVStyle.TextStyles[0]))
else begin
RVFWrite(Stream, Format('<SPAN style="{%s', [RV_GetHTMLFontCSS(LevelInfo.Font)]));
if LevelInfo.MarkerIndent>=LevelInfo.LeftIndent then
RVFWrite(Stream, Format(' width: %dpx;', // workaround for IE buggy rendering: not saving width for hanging indents
[LevelInfo.LeftIndent+LevelInfo.FirstIndent-LevelInfo.MarkerIndent]));
RVFWrite(Stream, '}">');
end;
{$IFNDEF RVDONOTUSEUNICODE}
if LevelInfo.ListType=rvlstUnicodeBullet then begin
{$IFDEF RICHVIEWCBDEF3}
RVU_GetHTMLEncodedUnicode(RVU_GetRawUnicode(LevelInfo.FormatStringW), False, False)
{$ENDIF}
end
else
{$ENDIF}
RVFWrite(Stream, DisplayString);
if not UseCSS then
RVFWriteLine(Stream,RV_HTMLCloseFontTag2(LevelInfo.Font, TCustomRVData(RVData).GetRVStyle.TextStyles[0]))
else
RVFWriteLine(Stream,'</SPAN>');
end;
rvlstImageList,rvlstImageListCounter:
begin
TCustomRVData(RVData).HTMLSaveImage(TCustomRVData(RVData), ItemNo, Path, CurrentFileColor, Location, DoDefault);
if DoDefault then begin
ImageIndex := LevelInfo.ImageIndex;
if LevelInfo.ListType=rvlstImageListCounter then
inc(ImageIndex, Counter-1);
if (ImageIndex>=0) and (ImageIndex<LevelInfo.ImageList.Count) and
(LevelInfo.ImageList<>nil) then begin
RVSaveImageSharedImageInHTML(LevelInfo.ImageList, ImageIndex, nil, Location, RVData, Path,
imgSavePrefix, imgSaveNo, CurrentFileColor, SaveOptions, Bullets);
end;
end;
if UseCSS and (LevelInfo.MarkerIndent>=LevelInfo.LeftIndent) then
RVFWrite(Stream, Format('<SPAN style="width:%dpx">',
[LevelInfo.LeftIndent+LevelInfo.FirstIndent-LevelInfo.MarkerIndent]));
if Location<>'' then begin
if LevelInfo.ImageList=nil then begin
W := 0;
H := 0;
Exclude(SaveOptions, rvsoImageSizes);
end
else begin
W := TImageList(LevelInfo.ImageList).Width;
H := TImageList(LevelInfo.ImageList).Height;
end;
RVFWriteLine(Stream,
Format('<IMG%ssrc="%s">',[RV_GetExtraIMGStr(SaveOptions, W, H),Location]));
end;
if UseCSS and (LevelInfo.MarkerIndent>=LevelInfo.LeftIndent) then
RVFWrite(Stream, Format('</SPAN>',
[LevelInfo.LeftIndent+LevelInfo.FirstIndent-LevelInfo.MarkerIndent]));
end;
rvlstPicture:
begin
TCustomRVData(RVData).HTMLSaveImage(TCustomRVData(RVData), ItemNo, Path, CurrentFileColor, Location, DoDefault);
if DoDefault and (LevelInfo.Picture.Graphic<>nil) then
RVSaveImageSharedImageInHTML(nil, -1, LevelInfo.Picture.Graphic, Location, RVData, Path,
imgSavePrefix, imgSaveNo, CurrentFileColor, SaveOptions, Bullets);
if Location<>'' then begin
if LevelInfo.Picture.Graphic=nil then begin
W := 0;
H := 0;
Exclude(SaveOptions, rvsoImageSizes);
end
else begin
W := LevelInfo.Picture.Graphic.Width;
H := LevelInfo.Picture.Graphic.Height;
end;
RVFWriteLine(Stream,
Format('<IMG%ssrc="%s">',[RV_GetExtraIMGStr(SaveOptions, W, H),Location]));
end;
end;
end
end;
{------------------------------------------------------------------------------}
function TRVMarkerItemInfo.GetLICSS(RVData: TPersistent; ItemNo: Integer; const Path,
imgSavePrefix: String; var imgSaveNo: Integer; CurrentFileColor: TColor;
SaveOptions: TRVSaveOptions; Bullets: TRVList): String;
var LevelInfo: TRVListLevel;
DoDefault : Boolean;
Location: String;
ImageIndex: Integer;
begin
Result := '';
LevelInfo := GetLevelInfo(TCustomRVData(RVData).GetRVStyle);
case LevelInfo.ListType of
rvlstImageList,rvlstImageListCounter:
begin
TCustomRVData(RVData).HTMLSaveImage(TCustomRVData(RVData), ItemNo, Path, CurrentFileColor, Location, DoDefault);
if DoDefault then begin
ImageIndex := LevelInfo.ImageIndex;
if LevelInfo.ListType=rvlstImageListCounter then
inc(ImageIndex, Counter-1);
if (ImageIndex>=0) and (ImageIndex<LevelInfo.ImageList.Count) and
(LevelInfo.ImageList<>nil) then begin
RVSaveImageSharedImageInHTML(LevelInfo.ImageList, ImageIndex, nil, Location, RVData, Path,
imgSavePrefix, imgSaveNo, CurrentFileColor, SaveOptions, Bullets);
end;
end;
if Location<>'' then
Result := Format('list-style: url(''%s'')',[Location]);
end;
rvlstPicture:
begin
TCustomRVData(RVData).HTMLSaveImage(TCustomRVData(RVData), ItemNo, Path, CurrentFileColor, Location, DoDefault);
if DoDefault and (LevelInfo.Picture.Graphic<>nil) then
RVSaveImageSharedImageInHTML(nil, -1, LevelInfo.Picture.Graphic, Location, RVData, Path,
imgSavePrefix, imgSaveNo, CurrentFileColor, SaveOptions, Bullets);
if Location<>'' then
Result := Format('list-style: url(''%s'')',[Location]);
end;
end;
if Result<>'' then
Result := Format(' style="{ %s }"', [Result]);
end;
{------------------------------------------------------------------------------}
procedure TRVMarkerItemInfo.MarkStylesInUse(UsedTextStyles, UsedParaStyles,
UsedListStyles: TRVIntegerList);
begin
inherited;
if ListNo>=0 then
UsedListStyles[ListNo] := 1;
end;
{------------------------------------------------------------------------------}
procedure TRVMarkerItemInfo.UpdateStyles(TextStylesShift, ParaStylesShift,
ListStylesShift: TRVIntegerList);
begin
inherited;
if ListNo>=0 then
dec(ListNo,ListStylesShift[ListNo]-1);
end;
{------------------------------------------------------------------------------}
function ProcessSymbolString(const s: String): String;
var i: Integer;
begin
Result := s;
for i := 1 to Length(s) do begin
if Result[i] in [#$A7..#$AA,#$B7,#$D7,#$E0] then
Result[i] := '*';
end;
RV_ReplaceStr(Result,#$DB,'<=>');
RV_ReplaceStr(Result,#$DC,'<=');
RV_ReplaceStr(Result,#$DE,'=>');
RV_ReplaceStr(Result,#$AB,'<->');
RV_ReplaceStr(Result,#$AC,'<-');
RV_ReplaceStr(Result,#$AE,'->');
end;
{------------------------------------------------------------------------------}
function TRVMarkerItemInfo.AsText(LineWidth: Integer; RVData: TPersistent;
const Text, Path: String; TextOnly, Unicode: Boolean): String;
var LevelInfo: TRVListLevel;
{$IFNDEF RVDONOTUSEUNICODE}
i: Integer;
{$ENDIF}
begin
Result := '';
LevelInfo := GetLevelInfo(TCustomRVData(RVData).GetRVStyle);
case LevelInfo.ListType of
rvlstBullet,rvlstDecimal,rvlstLowerAlpha,rvlstUpperAlpha,
rvlstLowerRoman,rvlstUpperRoman:
begin
if (AnsiCompareText(LevelInfo.Font.Name,'Symbol')=0) then
Result := ProcessSymbolString(DisplayString)
else
Result := DisplayString;
Result := Result+' ';
if Unicode then
Result := RVU_AnsiToUnicode(CP_ACP, Result)
end;
rvlstPicture,rvlstImageList,rvlstImageListCounter:
begin
Result := '* ';
if Unicode then
Result := RVU_AnsiToUnicode(CP_ACP, Result)
end;
{$IFNDEF RVDONOTUSEUNICODE}
{$IFDEF RICHVIEWCBDEF3}
rvlstUnicodeBullet:
begin
Result := RVU_GetRawUnicode(LevelInfo.FormatStringW+' ');
if not Unicode then begin
Result := RVU_UnicodeToAnsi(CP_ACP, Result);
for i := 1 to Length(Result) do begin
if i>Length(LevelInfo.FormatStringW) then
break;
if (Result[i]='?') and (LevelInfo.FormatStringW[i]<>'?') then
Result[i] := '*';
end;
end;
end;
{$ENDIF}
{$ENDIF}
end;
end;
{------------------------------------------------------------------------------}
function TRVMarkerItemInfo.GetIndexInList(List: TList): Integer;
begin
if List=nil then begin
Result := -1;
exit;
end;
if (FCachedIndexInList<0) or (FCachedIndexInList>=List.Count) or
(List.Items[FCachedIndexInList]<>Self) then
FCachedIndexInList := List.IndexOf(Self);
Result := FCachedIndexInList;
end;
{=============================== TRVMarkerList ================================}
function TRVMarkerList.FindParentMarker(Index: Integer): Integer;
var Marker, Marker2: TRVMarkerItemInfo;
i: Integer;
begin
Marker := TRVMarkerItemInfo(Items[Index]);
for i := Index-1 downto 0 do begin
Marker2 := TRVMarkerItemInfo(Items[i]);
if (Marker2.ListNo = Marker.ListNo) and
(Marker2.Level<Marker.Level) then begin
Result := i;
exit;
end;
end;
Result := -1;
end;
{------------------------------------------------------------------------------}
function TRVMarkerList.InsertAfter(InsertMe, AfterMe: TRVMarkerItemInfo): Integer;
begin
if AfterMe = nil then
Result := 0
else
Result := AfterMe.GetIndexInList(Self)+1;
Insert(Result, InsertMe);
InsertMe.FCachedIndexInList := Result;
end;
{------------------------------------------------------------------------------}
procedure TRVMarkerList.RecalcCounters(StartFrom: Integer; RVStyle: TRVStyle);
var i,j, ListNo: Integer;
LevelReset: Boolean;
Marker, Markerj: TRVMarkerItemInfo;
LevelInfo: TRVListLevel;
begin
if StartFrom>=Count then
exit;
ListNo := TRVMarkerItemInfo(Items[StartFrom]).ListNo;
if ListNo<0 then
exit;
for i := StartFrom to Count-1 do begin
Marker := TRVMarkerItemInfo(Items[i]);
if Marker.ListNo=ListNo then begin
if Marker.Reset then
Marker.Counter := Marker.StartFrom
else begin
LevelInfo := TRVMarkerItemInfo(Items[i]).GetLevelInfo(RVStyle);
Marker.Counter := LevelInfo.StartFrom;
LevelReset := rvloLevelReset in LevelInfo.Options;
for j := i-1 downto 0 do begin
Markerj := TRVMarkerItemInfo(Items[j]);
if Markerj.ListNo=ListNo then
if Markerj.Level=Marker.Level then begin
Marker.Counter := Markerj.Counter+1;
break;
end
else if LevelReset and (Markerj.Level<Marker.Level) then begin
Marker.Counter := LevelInfo.StartFrom;
break;
end
else if (Markerj.Level>Marker.Level) then
Marker.Counter := LevelInfo.StartFrom+1;
end;
end;
Marker.CalcDisplayString(RVStyle, Self, i);
end;
end;
end;
{$ENDIF}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -