Você já deve ter se deparado com algum site cujo conteúdo se manteve mesmo após alguma alteração visual, seja ela gritante ou sutil. Uma maneira muito útil de separar o código da aplicação e o design das páginas, é através do uso de modelos ou templates.
No nosso caso, os 
templates nada mais são do que páginas HTML e CSS com tags especiais que serão lidas e preenchidas (quando necessário) pelo nosso CGI, criando um conteúdo gerado dinamicamente. 
Dessa maneira, podemos ter vários layouts diferentes para nosso site ou aplicação e usar as tags especiais somente onde desejamos que o conteúdo, links ou outras informações sejam exibidos.
As aplicações CGI criadas com o FreePascal/Lazarus e a biblioteca fpWeb nos permitem criar tags com os caracteres que desejarmos, inclusive diferenciando-se das tags do HTML comum. 
As tags para os templates nem precisam estar no formato "<tag>", elas podem ser definidas com quaisquer sinais ou sequência deles, por exemplo:
Para esta parte do artigo, crie uma nova action no WebModule com o name "modelo". No evento OnRequest, vamos adicionar os códigos abaixo que, por exigirem um pouco mais de explicação, dividi nos sub-tópicos abaixo.
Configurando as tags
Iniciaremos o método preparando o formato da resposta e em seguida, diremos ao CGI que permita tags no template/modelo e qual será o formato/sintaxe dessas tags:
//configurando a resposta
AResponse.ContentType := 'text/html;charset=utf-8';
//Configurando o formato das Tags dentro do HTML
//permite que sejam usadas tags nos templates
ModuleTemplate.AllowTagParams := true;
//configura como elas serão utilizadas
(*Neste caso o formato será [+nome_da_tag+] mas pode ser alterado para como
for melhor em seu projeto.*)
ModuleTemplate.StartDelimiter := '[+';
ModuleTemplate.EndDelimiter := '+]';
Informando quais tags serão interpretadas
Para fazer o 
parsing das tags, devemos ter um método dedicado a isso. Vamos chamá-lo de "tagReplace" e iremos declará-lo inicialmente na seção Private da classe de nosso WebModule:
procedure tagReplace(Sender: TObject; const TagString:String; TagParams: TStringList; Out ReplaceText: String);
Após a declaração do método, já podemos conectá-lo ao gerenciador de templates do nosso projeto dentro do método da action "modelo", logo após a configuração das tags:
//Conecta o método ao WebModule
ModuleTemplate.OnReplaceTag := @tagReplace;
Podemos definir agora, quais as tags que serão substituídas e o conteúdo que receberão. Para isso, vamos implementar a 
Procedure tagReplace que declaramos anteriormente:
procedure TFPWebModule1.tagReplace(Sender: TObject; const TagString:String; TagParams: TStringList; Out ReplaceText: String);
var
  i: integer;
  straux: string;
begin
  if AnsiCompareText(TagString, 'DataAgora') = 0 then
  begin
     //substitui a tag pela data de hoje
     ReplaceText := FormatDateTime('dddd, dd "de" mmmm "de" yyyy', Now  );
  end;
  if AnsiCompareText(TagString, 'menus') = 0 then
  begin
     //inicializa straux (string auxiliar)
     straux := '';
     //cria alguns itens de menu dinamicamente
     for i:=1 to 7 do
     begin
         straux:= straux + '<a href="#">Menu Item ' + IntToStr(i) + '</a><br />';
     end;
     //retorna os itens
     ReplaceText:= straux;
  end;
end;
Preparando a aplicação para ler o template
De volta ao método da ação "modelo", indicaremos onde está a página HTML que será usada como template. Ela ainda não precisa existir, iremos codificá-la mais adiante. 
Adicione o código abaixo logo após a linha onde ligamos o método tagReplace ao nosso WebModule:
//Indica onde está o HTML a ser lido
(*Segundo as configurações do servidor no primeiro artigo, este modelo estaria
um diretório acima do cgi-bin. *)
ModuleTemplate.FileName :=  '../main.html';
Retornando o template (modelo) interpretado
Por fim, finalizamos este método com o retorno da página com as tags já preenchidas e sinalizamos que a action foi concluída:
//Retorna o HTML com as tags substituídas
AResponse.Content := ModuleTemplate.GetContent;
//ação finalizada
Handled:= true;
Codificando o HTML e o CSS
Todos os códigos anteriores devem estar, na sequência mencionada, dentro do evento OnRequest da action "modelo", exceto pela implementação e declaração do método que substitui as tags. 
Os códigos HTML e CSS também ficarão de fora do nosso CGI. Você pode até já compilá-lo neste momento, se estiver satisfeito com as configurações e caminhos feitos.
O que vamos fazer agora, é criar um simples documento HTML com um pouco de CSS embutido e com uma estrutura que nos mostrará como as tags podem ser utilizadas. 
Note que não focaremos em nenhuma beleza visual neste exemplo e o correto a se fazer, é ter um arquivo CSS separado do HTML - aqui só misturaremos para fins de estudo:
<!DOCTYPE html>
<html>
  <head>
     <title>Pascal para Web com CGI</title>
     <style>
         html, body { font-family: Arial, Helvetica, Sans Serif; }
         header, nav { display: block; }
         header h1 { color: #0099cc; }
         nav { float: left; margin-right: 30px; }
         nav a { text-decoration: none; color: green; }
         nav a:hover { text-decoration: underline; color: red; }
         #content { float:left; }
     </style>
  </head>
  <body>
     <header>
         <!-- nosso cabeçalho e a data atual -->
         <h1>Site do dia [+DataAgora+]</h1>
     </header>
     <nav>
         <!-- nossos menus dinâmicos -->
         [+menus+]
     </nav>
     <div id="content">
     <p>
     Conteúdo de exemplo... preencha aqui com as frases que mais gosta dos parágrafos de Loren Ipsun... !
     </p>
     </div>
  </body>
</html>
Salve este arquivo com o nome "main.html" no diretório logo acima de "cgi-bin". Se usou outro nome e caminho, atente para quando e onde for salvar este arquivo.
Agora que todas as etapas estão concluídas, podemos acessar nossa aplicação e verificar o resultado no endereço:
-   http://127.0.0.1/cgi-bin/projeto.cgi/modelo
Se tudo foi programado corretamente, você deverá ver a página carregada com as informações corretas preenchidas nos lugares onde as tags foram especificadas. 
Através desta técnica, podemos retornar qualquer informação, resultados de consultas em bancos de dados e até outras páginas HTML.
Só nos resta melhorar a URL de acesso ao nosso CGI... é o próximo passo!