Enhance the XML program to add spaces to show the indentation structure.
Builder := Object clone
Builder numIndents := 0
Builder doIndents := method (for (i, 1, numIndents, write(" ")))
Builder openTag := method(name, doIndents; writeln("<", name, ">"))
Builder closeTag := method(name, doIndents; writeln("</", name, ">"))
Builder forward := method (
openTag(call message name);
numIndents = numIndents + 1;
call message arguments foreach (
arg,
content := self doMessage(arg);
if (content type == "Sequence", doIndents; writeln(content))
);
numIndents = numIndents - 1;
closeTag(call message name)
)
Builder ul(
li("Javascript"),
li("Lua"),
li("Javascript")
)
Create a list syntax that uses brackets
squareBrackets := method(call message arguments)
Enhance the XML program to handle attributes: if the first argument is a map (use the curly brackets syntax), add attributes to the XML program. For example: book({"author": "Tate"}...) would print <book author="Tate">.
OperatorTable addAssignOperator(":", "atPutNumber")
Map atPutNumber := method(
self atPut(
call evalArgAt(0) asMutable removePrefix("\"") removeSuffix("\""),
call evalArgAt(1)
)
)
curlyBrackets := method(
map := Map clone;
call message arguments foreach(arg, map doMessage(arg));
map
)
Builder := Object clone
Builder numIndents := 0
Builder doIndents := method (for (i, 1, numIndents, write(" ")))
Builder doAttributes := method(map, map keys foreach(key, write(" ", key, "=\"", map at(key) ,"\"")))
Builder forward := method (
doIndents; write("<", call message name);
if(call message arguments size == 0, writeln(">"));
numIndents = numIndents + 1;
call message arguments foreach (i, arg,
content := self doMessage(arg);
if (i == 0,
if(content type == "Map", doAttributes(content));
writeln(">")
)
if (content type == "Sequence", doIndents; writeln(content));
);
numIndents = numIndents - 1;
doIndents; writeln("</", call message name, ">")
)