aboutsummaryrefslogtreecommitdiff
path: root/contrib/libxo/doc/xo.rst
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/libxo/doc/xo.rst')
-rw-r--r--contrib/libxo/doc/xo.rst234
1 files changed, 234 insertions, 0 deletions
diff --git a/contrib/libxo/doc/xo.rst b/contrib/libxo/doc/xo.rst
new file mode 100644
index 000000000000..5a9e8819122e
--- /dev/null
+++ b/contrib/libxo/doc/xo.rst
@@ -0,0 +1,234 @@
+.. index:: --libxo, xo
+.. _xo:
+
+The "xo" Utility
+================
+
+The `xo` utility allows command line access to the functionality of
+the libxo library. Using `xo`, shell scripts can emit XML, JSON, and
+HTML using the same commands that emit text output.
+
+The style of output can be selected using a specific option: "-X" for
+XML, "-J" for JSON, "-H" for HTML, or "-T" for TEXT, which is the
+default. The "--style <style>" option can also be used. The standard
+set of "--libxo" options are available (see :ref:`options`), as well
+as the :ref:`LIBXO_OPTIONS <libxo-options>` environment variable.
+
+The `xo` utility accepts a format string suitable for `xo_emit` and
+a set of zero or more arguments used to supply data for that string::
+
+ xo "The {k:name} weighs {:weight/%d} pounds.\n" fish 6
+
+ TEXT:
+ The fish weighs 6 pounds.
+
+ XML:
+ <name>fish</name>
+ <weight>6</weight>
+
+ JSON:
+ "name": "fish",
+ "weight": 6
+
+ HTML:
+ <div class="line">
+ <div class="text">The </div>
+ <div class="data" data-tag="name">fish</div>
+ <div class="text"> weighs </div>
+ <div class="data" data-tag="weight">6</div>
+ <div class="text"> pounds.</div>
+ </div>
+
+The `--wrap $path` option can be used to wrap emitted content in a
+specific hierarchy. The path is a set of hierarchical names separated
+by the '/' character::
+
+ xo --wrap top/a/b/c '{:tag}' value
+
+ XML:
+ <top>
+ <a>
+ <b>
+ <c>
+ <tag>value</tag>
+ </c>
+ </b>
+ </a>
+ </top>
+
+ JSON:
+ "top": {
+ "a": {
+ "b": {
+ "c": {
+ "tag": "value"
+ }
+ }
+ }
+ }
+
+The `--open $path` and `--close $path` can be used to emit
+hierarchical information without the matching close and open
+tag. This allows a shell script to emit open tags, data, and
+then close tags. The `--depth` option may be used to set the
+depth for indentation. The `--leading-xpath` may be used to
+prepend data to the XPath values used for HTML output style::
+
+ EXAMPLE:
+ #!/bin/sh
+ xo --open top/data
+ xo --depth 2 '{:tag}' value
+ xo --close top/data
+
+ XML:
+ <top>
+ <data>
+ <tag>value</tag>
+ </data>
+ </top>
+
+ JSON:
+ "top": {
+ "data": {
+ "tag": "value"
+ }
+ }
+
+When making partial lines of output (where the format string does not
+include a newline), use the `--continuation` option to let secondary
+invocations know they are adding data to an existing line.
+
+When emitting a series of objects, use the `--not-first` option to
+ensure that any details from the previous object (e.g. commas in JSON)
+are handled correctly.
+
+Use the `--top-wrap` option to ensure any top-level object details are
+handled correctly, e.g. wrap the entire output in a top-level set of
+braces for JSON output.
+
+::
+
+ EXAMPLE:
+ #!/bin/sh
+ xo --top-wrap --open top/data
+ xo --depth 2 'First {:tag} ' value1
+ xo --depth 2 --continuation 'and then {:tag}\n' value2
+ xo --top-wrap --close top/data
+
+ TEXT:
+ First value1 and then value2
+
+ HTML:
+ <div class="line">
+ <div class="text">First </div>
+ <div class="data" data-tag="tag">value1</div>
+ <div class="text"> </div>
+ <div class="text">and then </div>
+ <div class="data" data-tag="tag">value2</div>
+ </div>
+
+ XML:
+ <top>
+ <data>
+ <tag>value1</tag>
+ <tag>value2</tag>
+ </data>
+ </top>
+
+ JSON:
+ {
+ "top": {
+ "data": {
+ "tag": "value1",
+ "tag": "value2"
+ }
+ }
+ }
+
+Lists and Instances
+-------------------
+
+A "*list*" is set of one or more instances that appear under the same
+parent. The instances contain details about a specific object. One
+can think of instances as objects or records. A call is needed to
+open and close the list, while a distinct call is needed to open and
+close each instance of the list.
+
+Use the `--open-list` and `--open-instances` to open lists and
+instances. Use the `--close-list` and `--close-instances` to close
+them. Each of these options take a `name` parameter, providing the
+name of the list and instance.
+
+In the following example, a list named "machine" is created with three
+instances::
+
+ opts="--json"
+ xo $opts --open-list machine
+ NF=
+ for name in red green blue; do
+ xo $opts --depth 1 $NF --open-instance machine
+ xo $opts --depth 2 "Machine {k:name} has {:memory}\n" $name 55
+ xo $opts --depth 1 --close-instance machine
+ NF=--not-first
+ done
+ xo $opts $NF --close-list machine
+
+The normal `libxo` functions use a state machine to help these
+transitions, but since each `xo` command is invoked independent of the
+previous calls, the state must be passed in explicitly via these
+command line options.
+
+The `--instance` option can be used to treat a single `xo` invocation
+as an instance with the given set of fields::
+
+ % xo --libxo:XP --instance foo 'The {:product} is {:status}\n' stereo "in route"
+ <foo>
+ <product>stereo</product>
+ <status>in route</status>
+ </foo>
+
+Command Line Options
+--------------------
+
+::
+
+ Usage: xo [options] format [fields]
+ --close <path> Close tags for the given path
+ --close-instance <name> Close an open instance name
+ --close-list <name> Close an open list name
+ --continuation OR -C Output belongs on same line as previous output
+ --depth <num> Set the depth for pretty printing
+ --help Display this help text
+ --html OR -H Generate HTML output
+ --instance OR -I <name> Wrap in an instance of the given name
+ --json OR -J Generate JSON output
+ --leading-xpath <path> Add a prefix to generated XPaths (HTML)
+ --not-first Indicate this object is not the first (JSON)
+ --open <path> Open tags for the given path
+ --open-instance <name> Open an instance given by name
+ --open-list <name> Open a list given by name
+ --option <opts> -or -O <opts> Give formatting options
+ --pretty OR -p Make 'pretty' output (add indent, newlines)
+ --style <style> Generate given style (xml, json, text, html)
+ --text OR -T Generate text output (the default style)
+ --top-wrap Generate a top-level object wrapper (JSON)
+ --version Display version information
+ --warn OR -W Display warnings in text on stderr
+ --warn-xml Display warnings in xml on stdout
+ --wrap <path> Wrap output in a set of containers
+ --xml OR -X Generate XML output
+ --xpath Add XPath data to HTML output)
+
+Example
+-------
+
+::
+
+ % xo 'The {:product} is {:status}\n' stereo "in route"
+ The stereo is in route
+ % xo -p -X 'The {:product} is {:status}\n' stereo "in route"
+ <product>stereo</product>
+ <status>in route</status>
+ % xo --libxo xml,pretty 'The {:product} is {:status}\n' stereo "in route"
+ <product>stereo</product>
+ <status>in route</status>