# TeLML

A Tex-Like Markup Language—which is a bit of a misnomer, because
as presented, it's more of a structured data language optimized for
text documents than an actual markup language. A markup-oriented
use of this library can be found in the
[`telml-markup`](https://github.com/aisamanra/telml-markup)
package.

A _TeLML Document_ is a sequence of textual
fragments interspersed with "tags", which have the format

~~~~
\tagname{ document | document | ... }
~~~~

Whitespace is _not_ allowed between the backslash and the tag
name, but _is_ allowed between the tag name and the following
block. This means that the following is allowed:

~~~~
\tag
  { element_1
  | element_2
  | ...
  | element_n
  }
~~~~

In contrast to TeX, the block is _obligatory_, i.e.
the following is **not** a valid document:

~~~~
\p{this \br and that}
~~~~

Whereas this is:

~~~~
\p{this \br{} and that}
~~~~

(This restriction might at some point be lifted based on experience
with the format.)

The intended use for TeLML is as a building-block for specific
markup formats in which you might want to have arbitrary new
tags, but don't want to use an XML-based solution.

# Formal Grammar

~~~~
<document> ::= <fragment>*
<fragment> ::= <tag> | <text> | "{" <document> "}"

<text>     ::= /([^\]|[\][\{}|])*/

<tag>      ::= "\" <tagname> <spaces> "{" <arglist> "}"
<tagname>  ::= /[A-Za-z][A-Za-z0-9_-]*/
<arglist>  ::= <document> ("|" <document>)*
<spaces>   ::= /[ \t\r\n]*/
~~~~

# Possible Future Modifications

Variations on this theme that might be possible:

- It might (as stated above) be worthwhile to attempt to lift the
  restriction that every tag has an argument block, if nullary
  tags are commonly used.
- It might be nice to optionally allow `\begin{...}` and `\end{...}`
  tags to be parsed as a special case of certain delimiters.
- Maybe a special case for named arguments of the form
  `\tag{arg=stuff|arg=stuff}`, although this could be
  handled at present by using nested tags as in
  `\tag{\arg{stuff}|\arg{stuff}}`.
