aboutsummaryrefslogtreecommitdiff
path: root/contrib/libxo/doc/intro.rst
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/libxo/doc/intro.rst')
-rw-r--r--contrib/libxo/doc/intro.rst90
1 files changed, 90 insertions, 0 deletions
diff --git a/contrib/libxo/doc/intro.rst b/contrib/libxo/doc/intro.rst
new file mode 100644
index 000000000000..40b3a4f4a5de
--- /dev/null
+++ b/contrib/libxo/doc/intro.rst
@@ -0,0 +1,90 @@
+
+Introducing libxo
+=================
+
+The libxo library allows an application to generate text, XML, JSON,
+and HTML output using a common set of function calls. The application
+decides at run time which output style should be produced. The
+application calls a function "xo_emit" to product output that is
+described in a format string. A "field descriptor" tells libxo what
+the field is and what it means. Each field descriptor is placed in
+braces with printf-like :ref:`format-strings`::
+
+ xo_emit(" {:lines/%7ju} {:words/%7ju} "
+ "{:characters/%7ju} {d:filename/%s}\n",
+ linect, wordct, charct, file);
+
+Each field can have a role, with the 'value' role being the default,
+and the role tells libxo how and when to render that field (see
+:ref:`field-roles` for details). Modifiers change how the field is
+rendered in different output styles (see :ref:`field-modifiers` for
+details. Output can then be generated in various style, using the
+"--libxo" option::
+
+ % wc /etc/motd
+ 25 165 1140 /etc/motd
+ % wc --libxo xml,pretty,warn /etc/motd
+ <wc>
+ <file>
+ <lines>25</lines>
+ <words>165</words>
+ <characters>1140</characters>
+ <filename>/etc/motd</filename>
+ </file>
+ </wc>
+ % wc --libxo json,pretty,warn /etc/motd
+ {
+ "wc": {
+ "file": [
+ {
+ "lines": 25,
+ "words": 165,
+ "characters": 1140,
+ "filename": "/etc/motd"
+ }
+ ]
+ }
+ }
+ % wc --libxo html,pretty,warn /etc/motd
+ <div class="line">
+ <div class="text"> </div>
+ <div class="data" data-tag="lines"> 25</div>
+ <div class="text"> </div>
+ <div class="data" data-tag="words"> 165</div>
+ <div class="text"> </div>
+ <div class="data" data-tag="characters"> 1140</div>
+ <div class="text"> </div>
+ <div class="data" data-tag="filename">/etc/motd</div>
+ </div>
+
+Same code path, same format strings, same information, but it's
+rendered in distinct styles based on run-time flags.
+
+.. admonition:: Tale of Two Code Paths
+
+ You want to prepare for the future, but you need to live in the
+ present. You'd love a flying car, but need to get work done today.
+ You want to support features like XML, JSON, and HTML rendering to
+ allow integration with NETCONF, REST, and web browsers, but you need
+ to make text output for command line users.
+
+ And you don't want multiple code paths that can't help but get out
+ of sync::
+
+ /* None of this "if (xml) {... } else {...}" logic */
+ if (xml) {
+ /* some code to make xml */
+ } else {
+ /* other code to make text */
+ /* oops! forgot to add something on both clauses! */
+ }
+
+ /* And ifdefs are right out. */
+ #ifdef MAKE_XML
+ /* icky */
+ #else
+ /* pooh */
+ #endif
+
+ But you'd really, really like all the fancy features that modern
+ encoding formats can provide. libxo can help.