1

I tried to save a Snippet to a TMemoryStream in the hope, I could insert the stream on the current topic. The stream is in binary form - I saw it, as I write the stream to my hard disk. Here is a code stripe of my code base for HelpNDoc Pascal-Engine. The parameter "content" stands for the Current HTML Topic text:

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;

Is there a way, to save the stream directly to the current position of the existing topic ? Or: can the stream be saved a HTML or Text ?

Andrew Truckle
  • 17,769
  • 16
  • 66
  • 164
Jens
  • 84
  • 1
  • 10

1 Answers1

2

I solved the problem in this multiple way:

  1. I have add a Variable to the Items-Library witht the name "hintbox_1"

  2. I set the placeholder string to "pophtml"

  3. I have added a new Variable: "enum -> HintBox=001 | HintBox=002 | ...

  4. I create 001.html file(s) in the sub-directory ".\helpers"

  5. I change the Pascal-Template "topics.pas.htm" file, so it fit my needs. the string "HintBox1=" would be cut, and rest "001" String, I added ".html", so I get: "001.html".

  6. let's compile the Project, give me the text of file 001.html into the current topic position, by replace text.

My helper function shows so:

// ------------------------------------------------------------------------
// this is the root path of the HelpNDoc documentation
// files. Some sub-folders will be include later ...
// ------------------------------------------------------------------------ 
const BASE_PATH = 'E:\HelpNDoc\mozilla\';

// ------------------------------------------------------------------------
// @brief  Get the variable, that is set in the content text (editor), and
//         give back the contents of the variable that was defined in the
//         template settings.
//
// @param  content - String: Body text for current topic.         
//
// @return String, that would be append to the current position of compiler
//         processor. It replace the "hintbox" variable with files that will
//         be involved as external files.
//
// @author Jens Kallup
// ------------------------------------------------------------------------
function getCustomHintBoxCode(content: String): String;
var _idx: Integer;
var _len: Integer;

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

var _arr: THndLibraryItemsInfoArray;
var _inf: THndLibraryItemsInfo;

var _lst: TStringList;

const _hintbox = 'hintbox';
begin
  _arr := HndLibraryItems.GetItemList([5]);
  _str := content;
  for _idx := 0 to Length(_arr) - 1 do
  begin
    _inf := _arr[ _idx ];
    _tmp := Trim( Copy(_inf.Caption,Length(_hintbox)+2,64));
    if (LowerCase(Copy(_inf.Caption,1,7)) = _hintbox) then
    begin
      _tmp := HndLibraryItems .GetItemContentAsText (_inf.id);
      _txt := HndGeneratorInfo.GetCustomSettingValue(_tmp);
      _txt := StringReplace(_txt,'HintBox=','',[rfReplaceAll]);
      _txt := _txt + '.html';
      _lst := TStringList.Create;
      try
        try
          _lst.LoadFromFile(BASE_PATH + 'helpers\' + _txt);
        except
          on E: Exception do begin
            ShowMessage('Error occur during read the file: ' + #13#10 +
            BASE_PATH + 'helpers\' + _txt);
          end;
        end;
        if _lst.Count > 0 then
        begin
          _str := StringReplace(
          _str,                // old content
          _tmp,                // mark
          _lst.Text,           // new text
          [rfReplaceAll]);
        end; 
      finally
        _lst.Clear;
        _lst.Free;
      end;
    end;
  end;
  result := _str; 
end;

This bring me the advantage, to set tiny variable name into the Content-Editor instead the big fat boxes like Snippets, ... You would love it :-)

I hope this can be usefull for any others. The code comes as beerware. So, please be fair, and use the code with a little note of this article.

Jens
  • 84
  • 1
  • 10
  • 2
    Don't forget to accept your own answer. – Andrew Truckle Sep 07 '22 at 07:55
  • Hello Andrew, I am not familar with Stackoverflow, and as such, I have a ban on made Question's because I have to proove my Question's. Have you a E-mail Address. where I can contact You ? I would like start correspondence with you about HelpNDoc Pascal Scripting as Co-Author. If you feel free, you can contact me at: paule32.jk@gmail.com. Thanks for your attention, and happy coding – Jens Sep 15 '22 at 05:46