<div dir="ltr">Michael,<div><br></div><div>Here is an example of how easy it is.</div><div><br></div><div><font face="monospace">    public class CodeSearch : TemplateHandler<br>    {<br>        private static readonly string searchSql = "search.sql".LoadResourceText();<br><br>        protected override void Run(Templates templates, </font><span style="font-family:monospace">StringBuilder output</span><span style="font-family:monospace">)</span></div><div><font face="monospace">        {<br>            SearchItems = DataCommand<br>                .Prepare(searchSql)<br>                .Add("@phrase", </font><span style="font-family:monospace">Read("phrase")</span><font face="monospace">)<br>                .Compose();<br>            templates[Read("format") + "SearchItem"].FormatObject(this, output);<br>        }<br><br>        public IEnumerable<object> SearchItems { get; set; }<br>    }</font></div><div><font face="monospace"><br></font></div><div><font face="arial, sans-serif">So given the url, </font><a href="https://docs.getlazarus.org/?method=codesearch&format=xml&phrase=TStringList" target="_blank">https://docs.getlazarus.org/?method=codesearch&format=xml&phrase=TStringList</a> in steps:</div><div><br></div><div>1) The library automatically finds the CodeSearch class without any code to write</div><div>2) It runs the template handler automatically</div><div>3) In run we execute some SQL to search for a phrase and compose the results as a collection of anonymous objects<br></div><div>4) The we select the template we want and format the CodeSearch object and its available properties, in this case our search result "SearchItems".</div><div><br></div><div>The FormatObject method is a template engine that uses reflection to lookup properties with mustache braces. It has the ability to query subproperties and use all available format specifiers. Collection properties (IEnumerable<span style="font-family:monospace"><T>)</span> are expanded by a detail template that can read through reflection the properties of the anonymous objects in the collection by name and template them as well.</div><div><br></div><div>Here are some template examples. Note you can access sub properties using object.suprop.susubprop syntax as well as custom formatting in the template (i.e. Price:C2 or Page.Modified:yyyyy-mm-dd).</div><div><br></div><div><title>{Title}</title> or <title>{Page.Title}</title> // Welcome to our website</div><div><div>Price is {Amount:C2}</div> // Price is $15.75<br></div><div><div>Page modified on {Page.Modified:yyyyy-mm-dd}</div> // Page modified on 2019-07-10</div><div><div>{SeachItems}</div> // Expands our template<br></div><div><br></div><div><br></div></div>