Utility functions for managing text fragments and friends.
namespace text utilities
import ideal • machine • channels • string writer
text fragment EMPTY FRAGMENT : base list text node • new(empty[text node] • new())
boolean is block(text element element)
id : element • get id
return is indent(element) || id == text library • HTML || id == text library • HEAD || id == text library • BODY || id == text library • TITLE || id == text library • META || id == text library • LINK || id == text library • P || id == text library • DIV || id == text library • H1 || id == text library • H2 || id == text library • TABLE || id == text library • TR || id == text library • TH || id == text library • TD || id == text library • BR
immutable list[text node] make singleton(text node element)
the list • append(element)
return the list • frozen 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 fragment • nodes
else
utilities • panic("Unknown type " ++ fragment)
overload text fragment join(readonly list[text fragment] fragments)
if fragments • size <= 1
if fragments • is 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 fragments • size == 1
return fragments • first
for (fragment : fragments)
result fragments • append(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 fragment • is empty
return
if fragment is text node
nodes • append(fragment)
else
nodes • append all((fragment !> list text node) • nodes)
private text fragment to fragment(readonly list[text node] nodes)
if nodes • is empty else if nodes • size == 1
return nodes • first
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)
formatter • write(text)
return the writer • elements()
string to markup string(text fragment text)
the writer : string writer • new()
formatter : markup formatter • new(the writer)
formatter • write(text)
return the writer • elements()
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 = missing • instance
return base element • new(id, list dictionary[attribute id, attribute fragment] • new(), child fragment)
text element make css link(string css href)
attributes • put(text library • HREF, css href)
attributes • put(text library • REL, "stylesheet")
attributes • put(text library • TYPE, "text/css")
return base element • new(text library • LINK, attributes, missing • instance)