秋·风

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  276 随笔 :: 0 文章 :: 305 评论 :: 19万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

这2天在学习在本地部署大模型,大模型输出的答案大部分是markdown格式,怎样才能将markdown格式转为HTML然后在浏览器显示呢?

经过搜索,发现用fpc_markdown+Synedit+THtmlViewer或CEF4DELPHI(添加TSynEdit/TSynExporterHTML/TSynHTMLSyn/TSynCppSyn/TSynFreePascalSyn)可以实现markdown格式显示及pascal/C/C++/Html等的高亮显示。
如果浏览器用CEF4Delphi,显示的效果非常好,缺点是要带一堆配置文件,如果要求不高,可以用THtmlViewer控件。

以下截图是用THtmlViewer控件显示的:


以下截图是用CEF4Delphi控件显示的:


以下是使用THtmlViewer控件的完整代码:

复制代码
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ExtCtrls, SynHighlighterPas, SynHighlighterHTML,
  SynHighlighterCpp, SynExportHTML, HtmlView, opensslsockets, IniFiles,
  MarkdownProcessor, MarkdownUtils,SynEdit;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    HtmlViewer: THtmlViewer;
    Label3: TLabel;
    Memo1: TMemo;
    SynCppSyn1: TSynCppSyn;
    SynExporterHTML1: TSynExporterHTML;
    SynFreePascalSyn1: TSynFreePascalSyn;
    SynHTMLSyn1: TSynHTMLSyn;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private

  public

  end;

  TCodeEmiter = class(TBlockEmitter)
  public
    procedure emitBlock(out_: TStringBuilder; lines: TStringList; meta: String); override;
  end;

var
  Form1: TForm1;
  url:string;


implementation

{$R *.lfm}

var
md:TMarkdownProcessor=nil;const
CSSDecoration = '<style type="text/css">'#10+
                'code{'#10+
                '  color: #A00;'#10+
                '}'#10+
                'pre{'#10+
                '  background: #f4f4f4;'#10+
                '  border: 1px solid #ddd;'#10+
                '  border-left: 3px solid #f36d33;'#10+
                '  color: #555;'#10+
                '  overflow: auto;'#10+
                '  padding: 1em 1.5em;'#10+
                '  display: block;'#10+
                '}'#10+
                'pre code{'#10+
                '  color: inherit;'#10+
                '}'#10+
                'Blockquote{'#10+
                '  border-left: 3px solid #d0d0d0;'#10+
                '  padding-left: 0.5em;'#10+
                '  margin-left:1em;'#10+
                '}'#10+
                'Blockquote p{'#10+
                '  margin: 0;'#10+
                '}'#10+
                'table{'#10+
                '  border:1px solid;'#10+
                '  border-collapse:collapse;'#10+
                '}'#10+
                'th{'+
                '  padding:5px;'#10+
                '  background: #e0e0e0;'#10+
                '  border:1px solid;'#10+
                '}'#10+
                'td{'#10+
                '  padding:5px;'#10+
                '  border:1px solid;'#10+
                '}'#10+
                '</style>'#10;

procedure TCodeEmiter.emitBlock(out_: TStringBuilder; lines: TStringList;
  meta: String);
var
  s:string;

  procedure exportlines;
  var
    sstream: TStringStream;
  begin
    Form1.SynExporterHTML1.ExportAll(lines);
    try
      sstream:=TStringStream.Create('');
      Form1.SynExporterHTML1.SaveToStream(sstream);
      out_.Append(sstream.DataString);
    finally
      if assigned(sstream) then freeandnil(sstream);
    end;
  end;

begin
  case meta of
'html':
      begin
        Form1.SynExporterHTML1.Highlighter:=Form1.SynHTMLSyn1;
        exportlines;
      end;
    'fpc','pas','pascal':
      begin
        Form1.SynExporterHTML1.Highlighter:=Form1.SynFreePascalSyn1;
        exportlines;
      end;
    'cpp','c++','c':
      begin
        Form1.SynExporterHTML1.Highlighter:=Form1.SynCppSyn1;
        exportlines;
      end
    else
      begin
        if meta='' then   out_.append('<pre><code>')
        else out_.append('<pre><code class="'+meta+'">');
        for s in lines do
        begin
          TUtils.appendValue(out_,s,0,Length(s));
          out_.append(#10);
        end;
        out_.append('</code></pre>'#10);
      end;
  end;
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  SE_HTML:TSynEdit;
begin
  SE_HTML:=TSynEdit.Create(nil);
  SE_HTML.Text:=CSSDecoration+md.process(Memo1.Text);
  HtmlViewer.LoadFromString(SE_HTML.Text);
  SE_HTML.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  md := TMarkdownProcessor.createDialect(mdCommonMark);
  md.UnSafe := false;
  md.config.codeBlockEmitter:=TCodeEmiter.Create;
  HtmlViewer.DefBackground:=clWhite;
  HtmlViewer.DefFontColor:=clBlack;
  HtmlViewer.DefFontName:='Helvetica';
  HtmlViewer.DefFontSize:=10;
  HtmlViewer.DefPreFontName:='Courier';
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if assigned(md) then md.Free;
end;

end.
复制代码

 

posted on   秋·风  阅读(73)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示