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
相关产品推荐
相关产品推荐

