⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rvmarker.pas

📁 richview1.7 full.source
💻 PAS
📖 第 1 页 / 共 3 页
字号:
          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 + -