Exercises
We need a few more features for our HTML library to be useful for
our blog software. Add the following features to our Html.Internal module
and expose them from Html.
1. Unordered lists
These lists have the form:
<ul>
<li>item 1</li>
<li>item 2</li>
<li>...</li>
</ul>
We want in our library a new function:
ul_ :: [Structure] -> Structure
So that users can write this:
ul_
[ p_ "item 1"
, p_ "item 2"
, p_ "item 3"
]
and get this:
<ul>
<li><p>item 1</p></li>
<li><p>item 2</p></li>
<li><p>item 3</p></li>
</ul>
2. Ordered lists
Very similar to unordered lists, but instead of <ul> we use <ol>
3. Code blocks
Very similar to <p>, but use the <pre> tag. Call this function code_.
Solutions
Unordered lists
ul_ :: [Structure] -> Structure
ul_ =
Structure . el "ul" . concat . map (el "li" . getStructureString)
Ordered lists
ol_ :: [Structure] -> Structure
ol_ =
Structure . el "ol" . concat . map (el "li" . getStructureString)
Note: the two functions above could be unified.
Code blocks
code_ :: String -> Structure
code_ = Structure . el "pre" . escape