# README
= Exercise 5.7 // Refs: :url-base: https://github.com/fenegroni/TGPL-exercise-solutions :workflow: workflows/Exercise 5.7 :action: actions/workflows/ch5ex7.yml :url-workflow: {url-base}/{workflow} :url-action: {url-base}/{action} :badge-exercise: image:{url-workflow}/badge.svg?branch=main[link={url-action}]
{badge-exercise}
Develop startElement
and endElement
into a general HTML pretty-printer.
Print comment nodes, text
nodes, and attributes of each element (<a href='...'>
).
Use short forms like <img/>
instead of <img></img>
when an element has no children.
Write a test to ensure the output can be parsed successfully. (See Chapter 11.)
== Test
We test the implementation of PrettyPrint
,
which reads from input
, writes to output
,
and performs the task in our exercise.
The implementation is a little flaky:
. it uses global variables to keep track of state.
. startElement
prints the start tag of an HTML element
by relying on being called the first time an element is encountered,
before all child elements are visited.
. endElement
prints the end tag of the element
by relying on being called after all child nodes are visited.
. indenting the output requires a global depth
,
incremented by startElement
and decremented by endElement
.
=== The image element
The image element uses the tag <img>
without an end tag and without the /
character at the end.
We handle that case which corrects the exercise requirement.
=== Parsing the output
The html.Parse
function does not seem to return an error
when the html is malformed.
We use the outline
function from the book
to build an outline of the document
and ensure that the output is correctly parsed.