Ansie
Ansie is a rich-text terminal rendering package that uses HTML-like markup instead of complicated terminal codes to generate its output.
I started this package out of frustration of not having a relatively simple way to output rich text without relying on direct terminal codes which is difficult to parse with the human eye. Yes, there is chalk but I was hoping to have something that would allow for easily updating the look and feel without imperative programming required. Ink is neat but it relies on a heavy-handed approach for layout (it uses a Rust-based layout engine for determining the layout of flexboxes - super cool, but not what I wanted).
With Ansie, there are no dependencies for the library - not even chalk. It uses PEGJS to build a parser that will read an XML-based string and translate that into terminal codes.
For example:
1<h1 bold marginBottom="1">My Console App</h1>
2<h2 fg="gray" marginBottom="1">A little something I wrote</h2>
3<p marginBottom="1">
4 In order to used this app, do the following:
5 <li bullet="*" marginBottom="1">Create a config file</li>
6 <li bullet="*" marginBottom="1">Run the utility with the -h flag</li>
7 <li bullet="*" marginBottom="1">etc...</li>
8</p>
This feels better to me, as a web developer than the same thing written out with terminal codes:
1^[[1mMy Console App^[[22m
2^[[90mA little something I wrote^[[39m
3In order to used this app, do the following:
4* Create a config file
5* Run the utility with the -h flag
6* etc...
As I play with the grammar and the compilation I'm learning a lot about the intricacies of parsing and rendering a declarative language like HTML. Decisions like whether to make the language more terse and sacrifice consistency is a big one. Another one is what to do with the "space between" declarations. Do you interpret them as-is (e.g., space and newlines) or do you force the user to explicitly define them? In the end, I have a feeling this will be an option, but the decision is one I'm sure was made a long time ago in the HTML realm: be explicit unless you use the <pre>
. Another interesting option that I will probably add in the near future.