<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sebastijan Kaplar</title>
    <description>The latest articles on DEV Community by Sebastijan Kaplar (@skaplar).</description>
    <link>https://dev.to/skaplar</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F224392%2Fafca9ddd-2b57-4bb6-849b-4fdf627bf18b.png</url>
      <title>DEV Community: Sebastijan Kaplar</title>
      <link>https://dev.to/skaplar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/skaplar"/>
    <language>en</language>
    <item>
      <title>Extending Mustache usage in Pharo Smalltalk </title>
      <dc:creator>Sebastijan Kaplar</dc:creator>
      <pubDate>Fri, 06 Sep 2019 11:32:39 +0000</pubDate>
      <link>https://dev.to/skaplar/extending-mustache-usage-in-pharo-smalltalk-3mph</link>
      <guid>https://dev.to/skaplar/extending-mustache-usage-in-pharo-smalltalk-3mph</guid>
      <description>&lt;p&gt;Mustache is a template system with wide variety of implementations. One of those is in Pharo Smalltalk, which will be focused on in this article. You can find out more about it &lt;a href="https://github.com/noha/mustache" rel="noopener noreferrer"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;First thing you'll notice when you open &lt;a href="https://mustache.github.io" rel="noopener noreferrer"&gt;mustache.github.io&lt;/a&gt; is Logic-less templates, and it should remain that way. However often you want to extend the usage of one such template system and adjust it to your own needs.&lt;/p&gt;

&lt;p&gt;In this article we'll see how to adapt to certain requirements, how to generate new templates and use them to render html forms, especially when you can't affect the incoming data. &lt;/p&gt;

&lt;p&gt;Let's say we have a data that looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Worker"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"formProperties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"firstName"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"component"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TextFieldComponent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"First Name"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lastName"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"component"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TextFieldComponent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Last Name"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now if we want to render this as an html form, it already looks familiar. One entry in formProperties should correspond to one form row, we have a name, and a label but we are missing a type for our input. Obviously we should use component, but we should do something because there is no TextFieldComponent input type.&lt;/p&gt;

&lt;p&gt;Idea is to create a template with one partial which will contain partials for each form property.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight smalltalk"&gt;&lt;code&gt;&lt;span class="nc"&gt;MiniExample&lt;/span&gt; &lt;span class="nf"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;render:&lt;/span&gt; &lt;span class="nv"&gt;json&lt;/span&gt;

&lt;span class="nv"&gt;templateString&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nb"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;writeStream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;templateString&lt;/span&gt; &lt;span class="nf"&gt;nextPutAll:&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt; &lt;span class="nf"&gt;baseTemplate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;partial&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nb"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;writeStream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nc"&gt;Dictionary&lt;/span&gt; &lt;span class="nb"&gt;new&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;s&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nc"&gt;NeoJSONReader&lt;/span&gt; &lt;span class="nf"&gt;fromString:&lt;/span&gt; &lt;span class="nv"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt; &lt;span class="nf"&gt;at:&lt;/span&gt; &lt;span class="s"&gt;'formProperties'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;do:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;el&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; 
        &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; tmp &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
        &lt;span class="nv"&gt;tmp&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt; &lt;span class="nf"&gt;preparePartialTemplate:&lt;/span&gt; &lt;span class="nv"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
        &lt;span class="nv"&gt;parts&lt;/span&gt; &lt;span class="nf"&gt;at:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;el&lt;/span&gt; &lt;span class="nf"&gt;at:&lt;/span&gt; &lt;span class="s"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;put:&lt;/span&gt; &lt;span class="nv"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
        &lt;span class="nv"&gt;partial&lt;/span&gt; &lt;span class="nf"&gt;nextPutAll:&lt;/span&gt; &lt;span class="s"&gt;'{{&amp;gt; '&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
        &lt;span class="nv"&gt;partial&lt;/span&gt; &lt;span class="nf"&gt;nextPutAll:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;el&lt;/span&gt; &lt;span class="nf"&gt;at:&lt;/span&gt; &lt;span class="s"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
        &lt;span class="nv"&gt;partial&lt;/span&gt; &lt;span class="nf"&gt;nextPutAll:&lt;/span&gt; &lt;span class="s"&gt;'}}'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="p"&gt;].&lt;/span&gt;

&lt;span class="nv"&gt;p&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nv"&gt;partial&lt;/span&gt; &lt;span class="nf"&gt;contents&lt;/span&gt; &lt;span class="nf"&gt;asMustacheTemplate&lt;/span&gt; &lt;span class="nf"&gt;value:&lt;/span&gt; &lt;span class="s"&gt;''&lt;/span&gt; &lt;span class="nf"&gt;asDictionary&lt;/span&gt; &lt;span class="nf"&gt;partials:&lt;/span&gt; &lt;span class="nv"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="nv"&gt;templateString&lt;/span&gt; &lt;span class="nf"&gt;contents&lt;/span&gt; &lt;span class="nf"&gt;asMustacheTemplate&lt;/span&gt; &lt;span class="nf"&gt;value:&lt;/span&gt; &lt;span class="nv"&gt;s&lt;/span&gt; &lt;span class="nf"&gt;partials:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'partial'&lt;/span&gt; &lt;span class="nf"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;p&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nf"&gt;asDictionary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we can see the &lt;code&gt;json&lt;/code&gt; argument, it represents the data we want to handle and I am using &lt;a href="https://github.com/svenvc/NeoJSON" rel="noopener noreferrer"&gt;NeoJSON&lt;/a&gt; to read JSON and convert it to a Smalltalk object. &lt;code&gt;templateString&lt;/code&gt; contains the base template for this example, it has a &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;simple form, &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{{ name }}&lt;/code&gt; template which will directly replaced with &lt;code&gt;name&lt;/code&gt; from json, &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{{&amp;gt; partial }}&lt;/code&gt; which will be replaced with that many partials, how many entries there are in the &lt;code&gt;formProperties&lt;/code&gt;, or two in this case.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight smalltalk"&gt;&lt;code&gt;&lt;span class="nc"&gt;MiniExample&lt;/span&gt; &lt;span class="nf"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;baseTemplate&lt;/span&gt;

&lt;span class="o"&gt;^&lt;/span&gt;
&lt;span class="s"&gt;'&amp;lt;form action="http://localhost:8081/addNewEntity" method="post"&amp;gt;
    {{ name }}
    {{&amp;gt; partial }}
    &amp;lt;button type="submit" class="btn btn-primary"&amp;gt;Submit&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;'&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next we have &lt;code&gt;partial&lt;/code&gt; which will contain generated partials and it will look like this &lt;code&gt;{{&amp;gt; firstName}}{{&amp;gt; lastName}}&lt;/code&gt; at the end of iteration, and &lt;code&gt;parts&lt;/code&gt; dictionary that will hold two templates for the two generated partials. So let's take a deeper look at what &lt;code&gt;do:&lt;/code&gt; does.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;:el&lt;/code&gt; is a dictionary, it contains a name, component and a label, while &lt;code&gt;preparePartialTemplate:&lt;/code&gt; is a method that expects a dictionary and returns a template. When the &lt;code&gt;preparePartialTemplate:&lt;/code&gt; finishes we store the result in the &lt;code&gt;parts&lt;/code&gt; dictionary, and generate partial that will correspond to that template eg. &lt;code&gt;{{&amp;gt; firstName}}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here you can organize the template however you want, for the sake of tutorial I'm keeping it simple and in the same place.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight smalltalk"&gt;&lt;code&gt;&lt;span class="nc"&gt;MiniExample&lt;/span&gt; &lt;span class="nf"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;preparePartialTemplate:&lt;/span&gt; &lt;span class="nv"&gt;dict&lt;/span&gt;

&lt;span class="nv"&gt;templateString&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nb"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;writeStream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;templateString&lt;/span&gt; &lt;span class="nf"&gt;nextPutAll:&lt;/span&gt;
&lt;span class="s"&gt;'
&amp;lt;div class="form-group"&amp;gt;
    &amp;lt;label for="{{ label }}"&amp;gt;{{ label }}&amp;lt;/label&amp;gt;
'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;templateString&lt;/span&gt; &lt;span class="nf"&gt;nextPutAll:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt; &lt;span class="nf"&gt;determineComponent:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;dict&lt;/span&gt; &lt;span class="nf"&gt;at:&lt;/span&gt; &lt;span class="s"&gt;'component'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;
&lt;span class="nv"&gt;templateString&lt;/span&gt; &lt;span class="nf"&gt;nextPutAll:&lt;/span&gt; &lt;span class="s"&gt;'&amp;lt;/div&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="nv"&gt;templateString&lt;/span&gt; &lt;span class="nf"&gt;contents&lt;/span&gt; &lt;span class="nf"&gt;asMustacheTemplate&lt;/span&gt; &lt;span class="nf"&gt;value:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="s"&gt;'label'&lt;/span&gt; &lt;span class="nf"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;dict&lt;/span&gt; &lt;span class="nf"&gt;at:&lt;/span&gt; &lt;span class="s"&gt;'label'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nf"&gt;asDictionary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, here when you have your component you can do whatever you want, I'm just keeping it short.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight smalltalk"&gt;&lt;code&gt;&lt;span class="nc"&gt;MiniExample&lt;/span&gt; &lt;span class="nf"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;determineComponent:&lt;/span&gt; &lt;span class="nv"&gt;aComponent&lt;/span&gt;

&lt;span class="nv"&gt;aComponent&lt;/span&gt; &lt;span class="nf"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'TextFieldComponent'&lt;/span&gt; &lt;span class="nb"&gt;ifTrue:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; 
    &lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="s"&gt;'&amp;lt;input type="text" id="{{label}}" name="{{ label }}" placeholder="Enter {{label}}"&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And finally, we have our partial:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight handlebars"&gt;&lt;code&gt; partial -&amp;gt; &lt;span class="k"&gt;{{&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;firstName&lt;/span&gt;&lt;span class="k"&gt;}}{{&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;lastName&lt;/span&gt;&lt;span class="k"&gt;}}&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the &lt;code&gt;parts&lt;/code&gt; dictionary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;firstName -&amp;gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-group"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"First Name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;First Name&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-control"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"First Name"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"First Name"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter First Name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

lastName -&amp;gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-group"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"Last Name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Last Name&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-control"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"Last Name"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Last Name"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter Last Name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now to return to the first snippet&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight smalltalk"&gt;&lt;code&gt;&lt;span class="nv"&gt;p&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nv"&gt;partial&lt;/span&gt; &lt;span class="nf"&gt;contents&lt;/span&gt; &lt;span class="nf"&gt;asMustacheTemplate&lt;/span&gt; &lt;span class="nf"&gt;value:&lt;/span&gt; &lt;span class="s"&gt;''&lt;/span&gt; &lt;span class="nf"&gt;asDictionary&lt;/span&gt; &lt;span class="nf"&gt;partials:&lt;/span&gt; &lt;span class="nv"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="nv"&gt;templateString&lt;/span&gt; &lt;span class="nf"&gt;contents&lt;/span&gt; &lt;span class="nf"&gt;asMustacheTemplate&lt;/span&gt; &lt;span class="nf"&gt;value:&lt;/span&gt; &lt;span class="nv"&gt;s&lt;/span&gt; &lt;span class="nf"&gt;partials:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'partial'&lt;/span&gt; &lt;span class="nf"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;p&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nf"&gt;asDictionary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;p&lt;/code&gt; will get the final form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-group"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"First Name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;First Name&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-control"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"First Name"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"First Name"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter First Name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-group"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"Last Name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Last Name&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-control"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"Last Name"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Last Name"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter Last Name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And &lt;code&gt;p&lt;/code&gt; will replace the &lt;code&gt;{{&amp;gt; partial }}&lt;/code&gt; template in the original &lt;code&gt;baseTemplate&lt;/code&gt;, and finally get to the&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"http://localhost:8081/addNewEntity"&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"post"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    {{ name }}
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-group"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"First Name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;First Name&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-control"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"First Name"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"First Name"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter First Name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-group"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"Last Name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Last Name&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-control"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"Last Name"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Last Name"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter Last Name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn btn-primary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And after evaluating, with a little bit of css tweaking, we get something like this&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fqpsbfzdzlm2izib2doyh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fqpsbfzdzlm2izib2doyh.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, it is possible to extend your template and add support for other field types, components, requirements, etc.&lt;/p&gt;

</description>
      <category>smalltalk</category>
      <category>pharo</category>
      <category>mustache</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
