You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HelpNDoc 8.0.0.187:如何通过Pascal脚本在当前主题位置插入代码片段?

问题描述

我尝试将代码片段保存到TMemoryStream中,希望能将其插入到当前主题的对应位置。该流为二进制格式,我已将其写入硬盘验证。以下是HelpNDoc Pascal引擎的代码片段,其中参数content代表当前HTML主题文本:

function getCustomHintBoxCode(content: String): String;
var _idx: Integer;

var _txt: String ;
var _tmp: String ;
var _str: String ;

var _arr: THndLibraryItemsInfoArray;
var _inf: THndLibraryItemsInfo;

const _hintbox = 'hintbox';
const _snippet = 'snippet'; 

begin
  _arr := HndLibraryItems.GetItemList([7]);  // 7 = Snippets
  _str := content;
  for _idx := 0 to Length(_arr) - 1 do
  begin
    _inf := _arr[ _idx ];
    _tmp := Trim( Copy(_inf.Caption,Length(_snippet)+2,64));
    if (LowerCase(Copy(_inf.Caption,1,7)) = _snippet) then
    begin
      HndLibraryItems.GetItemContent(_inf.id).SaveToFile('E:\out.tmp');
      showmessage('0: ' + _tmp);
    end;
  end;
  result := _str; 
end;

请问是否可以将该流直接保存到现有主题的当前位置?或者能否将该流保存为HTML或文本格式?

解决方案

1. 能否直接将二进制流插入到主题当前位置?

不能直接插入二进制流。因为HelpNDoc的主题内容是HTML格式的文本,二进制流无法直接嵌入到HTML结构中,必须先转换为HTML兼容的格式(比如转为文本/HTML代码块)。

2. 如何将流保存为HTML或文本格式?

HelpNDoc的代码片段库项本身是以带格式的HTML存储的,HndLibraryItems.GetItemContent返回的流本质是文本格式的HTML内容。你可以直接将流读取为字符串,再整合到主题内容中:

修改后的示例代码

function getCustomHintBoxCode(content: String): String;
var _idx: Integer;
var _tmp: String ;
var _str: String ;
var _arr: THndLibraryItemsInfoArray;
var _inf: THndLibraryItemsInfo;
var _contentStream: TMemoryStream;
var _snippetHtml: String;

const _hintbox = 'hintbox';
const _snippet = 'snippet'; 

begin
  _arr := HndLibraryItems.GetItemList([7]);  // 7 = Snippets
  _str := content;
  for _idx := 0 to Length(_arr) - 1 do
  begin
    _inf := _arr[ _idx ];
    _tmp := Trim( Copy(_inf.Caption,Length(_snippet)+2,64));
    if (LowerCase(Copy(_inf.Caption,1,7)) = _snippet) then
    begin
      _contentStream := HndLibraryItems.GetItemContent(_inf.id);
      // 将流内容读取为HTML字符串
      SetLength(_snippetHtml, _contentStream.Size);
      _contentStream.ReadBuffer(_snippetHtml[1], _contentStream.Size);
      
      // 示例:将代码片段插入到主题内容末尾
      _str := _str + '<div class="custom-snippet">' + _snippetHtml + '</div>';
      
      // 若需插入指定位置:可在主题中设置占位符(如<!-- SNIPPET_PLACEHOLDER -->),用替换方式插入
      // _str := StringReplace(_str, '<!-- SNIPPET_PLACEHOLDER -->', '<div class="custom-snippet">' + _snippetHtml + '</div>', [rfReplaceAll]);
    end;
  end;
  result := _str; 
end;

关键说明

  • 代码片段的流内容本身就是带语法高亮的HTML文本,无需额外二进制转文本操作,直接读取即可。
  • 最终返回修改后的_str,HelpNDoc会自动将其更新为主题的HTML内容。

内容的提问来源于stack exchange,提问作者Jens

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 02:06:53