Utility functions for managing text fragments and friends.
namespace text utilities
import idealmachinechannelsstring writer
text fragment EMPTY FRAGMENT : base list text node • new(empty[text node] • new())
boolean is block(text element element)
id : elementget id
return is indent(element) || id == text libraryHTML || id == text libraryHEAD || id == text libraryBODY || id == text libraryTITLE || id == text libraryMETA || id == text libraryLINK || id == text libraryP || id == text libraryDIV || id == text libraryH1 || id == text libraryH2 || id == text libraryTABLE || id == text libraryTR || id == text libraryTH || id == text libraryTD || id == text libraryBR
immutable list[text node] make singleton(text node element)
the listappend(element)
return the listfrozen copy()
immutable list[text node] to list(text fragment or null fragment)
if fragment is null
return empty[text node] • new()
else if fragment is text node
return make singleton(fragment)
else if fragment is list text node
return fragmentnodes
else
utilitiespanic("Unknown type " ++ fragment)
overload text fragment join(readonly list[text fragment] fragments)
if fragmentssize <= 1
if fragmentsis empty else
return fragments[0]
nodes : base list[text node] • new()
for (fragment : fragments)
append(nodes, fragment)
return to fragment(nodes)
overload text fragment join(text fragment first, text fragment second)
nodes : base list[text node] • new()
append(nodes, first)
append(nodes, second)
return to fragment(nodes)
overload text fragment join(text fragment first, text fragment second, text fragment third)
nodes : base list[text node] • new()
append(nodes, first)
append(nodes, second)
append(nodes, third)
return to fragment(nodes)
overload text fragment join(text fragment first, text fragment second, text fragment third, text fragment fourth)
nodes : base list[text node] • new()
append(nodes, first)
append(nodes, second)
append(nodes, third)
append(nodes, fourth)
return to fragment(nodes)
attribute fragment join attributes(readonly list[attribute fragment] fragments)
if fragmentssize == 1
return fragmentsfirst
for (fragment : fragments)
result fragmentsappend(fragment)
return base list attribute fragment • new(result fragments)
private void append(list[text node] nodes, text fragment fragment)
if fragment is string text node
if fragmentis empty
return
if fragment is text node
nodesappend(fragment)
else
nodesappend all((fragment !> list text node) • nodes)
private text fragment to fragment(readonly list[text node] nodes)
if nodesis empty else if nodessize == 1
return nodesfirst
else
return base list text node • new(nodes)
string to plain text(text fragment text)
the writer : string writer • new()
formatter : plain formatter • new(the writer)
formatterwrite(text)
return the writerelements()
string to markup string(text fragment text)
the writer : string writer • new()
formatter : markup formatter • new(the writer)
formatterwrite(text)
return the writerelements()
text element make element(element id id, readonly list[text node] children)
if children is_not null
child fragment = base list text node • new(children)
else
child fragment = missinginstance
return base element • new(id, list dictionary[attribute id, attribute fragment] • new(), child fragment)
text element make css link(string css href)
attributesput(text libraryHREF, css href)
attributesput(text libraryREL, "stylesheet")
attributesput(text libraryTYPE, "text/css")
return base element • new(text libraryLINK, attributes, missinginstance)