convert docs to markdown and remove built doc artifacts (#153)

convert docs to markdown and remove built doc artifacts
merged-on-behalf-of: BBasile <BBasile@users.noreply.github.com>
This commit is contained in:
Cameron Ross 2018-06-12 02:57:28 -03:00 committed by The Dlang Bot
parent ab0e2c0519
commit 03c9972485
83 changed files with 656 additions and 10839 deletions

Binary file not shown.

Binary file not shown.

View file

@ -1,4 +0,0 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 4cd0b7d9cdc8d1c058e809aa7e0397b3
tags: 645f666f9bcd5a90fca523b33c5a78b7

View file

@ -1,61 +0,0 @@
.. highlight:: yaml
=====================================================
Differences between D:YAML and the YAML specification
=====================================================
There are some differences between D:YAML and the YAML 1.1 specification. Some
are caused by difficulty of implementation of some features, such as multiple
Unicode encodings within single stream, and some by unnecessary restrictions or
ambiguities in the specification.
Still, D:YAML tries to be as close to the specification as possible. It should
never load documents with different meaning than according to the specification,
and documents that fail to load should be very rare (for instance, very few
files use multiple Unicode encodings).
--------------------------
List of known differences:
--------------------------
Differences that can cause valid YAML documents not to load:
* No support for byte order marks and multiple Unicode encodings in a stream.
* Plain scalars in flow context cannot contain ``,``, ``:`` and ``?``.
This might change with ``:`` in the future.
See http://pyyaml.org/wiki/YAMLColonInFlowContext for details.
* The specification does not restrict characters for anchors and
aliases. This may lead to problems, for instance, the document::
[ *alias, value ]
can be interpteted in two ways, as::
[ "value" ]
and::
[ *alias , "value" ]
Therefore we restrict aliases and anchors to ASCII alphanumeric characters.
* The specification is confusing about tabs in plain scalars. We don't use tabs
in plain scalars at all.
* There is no support for recursive data structures in DYAML.
Other differences:
* Indentation is ignored in the flow context, which is less restrictive than the
specification. This allows code such as::
key: {
}
* Indentation rules for quoted scalars are loosed: They don't need to adhere
indentation as ``"`` and ``'`` clearly mark the beginning and the end of them.
* We allow ``_`` in tag handles.
* Right now, two mappings with the same contents but different orderings are
considered unequal, even if they are unordered mappings. This is because all
mappings are ordered in the D:YAML implementation. This should change in
future, once D associative arrays work with variant types or a map class or
struct appears in Phobos.

View file

@ -1,21 +0,0 @@
================================
Welcome to D:YAML documentation!
================================
API Documentation `(online) <http://ddocs.org/dyaml/~master/index.html>`_ `(local copy) <api/index.html>`_
Tutorials:
.. toctree::
:maxdepth: 2
tutorials/getting_started
tutorials/custom_types
tutorials/yaml_syntax
Articles:
.. toctree::
:maxdepth: 2
articles/spec_differences

View file

@ -1,337 +0,0 @@
======================
Custom YAML data types
======================
Sometimes you need to serialize complex data types such as classes. To do this
you could use plain nodes such as mappings with classes' fields. YAML also
supports custom types with identifiers called *tags*. That is the topic of this
tutorial.
Each YAML node has a tag specifying its type. For instance: strings use the tag
``tag:yaml.org,2002:str``. Tags of most default types are *implicitly resolved*
during parsing - you don't need to specify tag for each float, integer, etc.
D:YAML can also implicitly resolve custom tags, as we will show later.
-----------
Constructor
-----------
D:YAML uses the `Constructor <../api/dyaml.constructor.html>`_ class to process
each node to hold data type corresponding to its tag. *Constructor* stores
functions to process each supported tag. These are supplied by the user using
the *addConstructorXXX()* methods, where *XXX* is *Scalar*, *Sequence* or
*Mapping*. *Constructor* is then passed to *Loader*, which parses YAML input.
Structs and classes must implement the *opCmp()* operator for YAML support. This
is used for duplicate detection in mappings, sorting and equality comparisons of
nodes. The signature of the operator that must be implemented is
``const int opCmp(ref const MyStruct s)`` for structs where *MyStruct* is the
struct type, and ``int opCmp(Object o)`` for classes. Note that the class
*opCmp()* should not alter the compared values - it is not const for compatibility
reasons.
We will implement support for an RGB color type. It is implemented as the
following struct:
.. code-block:: d
struct Color
{
ubyte red;
ubyte green;
ubyte blue;
const int opCmp(ref const Color c)
{
if(red != c.red) {return red - c.red;}
if(green != c.green){return green - c.green;}
if(blue != c.blue) {return blue - c.blue;}
return 0;
}
}
First, we need a function to construct our data type. The function will take a
reference to *Node* to construct from. The node is guaranteed to contain either
a *string*, an array of *Node* or of *Node.Pair*, depending on whether we're
constructing our value from a scalar, sequence, or mapping, respectively.
If this function throws any exception, D:YAML handles it and adds its message
to a *YAMLException* that will be thrown when loading the file.
In this tutorial, we have functions to construct a color from a scalar, using
CSS-like format, RRGGBB, or from a mapping, where we use the following format:
{r:RRR, g:GGG, b:BBB} . Code of these functions:
.. code-block:: d
Color constructColorScalar(ref Node node)
{
string value = node.as!string;
if(value.length != 6)
{
throw new Exception("Invalid color: " ~ value);
}
//We don't need to check for uppercase chars this way.
value = value.toLower();
//Get value of a hex digit.
uint hex(char c)
{
import std.ascii;
if(!std.ascii.isHexDigit(c))
{
throw new Exception("Invalid color: " ~ value);
}
if(std.ascii.isDigit(c))
{
return c - '0';
}
return c - 'a' + 10;
}
Color result;
result.red = cast(ubyte)(16 * hex(value[0]) + hex(value[1]));
result.green = cast(ubyte)(16 * hex(value[2]) + hex(value[3]));
result.blue = cast(ubyte)(16 * hex(value[4]) + hex(value[5]));
return result;
}
Color constructColorMapping(ref Node node)
{
ubyte r,g,b;
//Might throw if a value is missing is not an integer, or is out of range.
//If this happens, D:YAML will handle the exception and use its message
//in a YAMLException thrown when loading.
r = node["r"].as!ubyte;
g = node["g"].as!ubyte;
b = node["b"].as!ubyte;
return Color(cast(ubyte)r, cast(ubyte)g, cast(ubyte)b);
}
Next, we need some YAML data using our new tag. Create a file called
``input.yaml`` with the following contents:
.. code-block:: yaml
scalar-red: !color FF0000
scalar-orange: !color FFFF00
mapping-red: !color-mapping {r: 255, g: 0, b: 0}
mapping-orange:
!color-mapping
r: 255
g: 255
b: 0
You can see that we're using tag ``!color`` for scalar colors, and
``!color-mapping`` for colors expressed as mappings.
Finally, the code to put it all together:
.. code-block:: d
void main()
{
auto red = Color(255, 0, 0);
auto orange = Color(255, 255, 0);
try
{
auto constructor = new Constructor;
//both functions handle the same tag, but one handles scalar, one mapping.
constructor.addConstructorScalar("!color", &constructColorScalar);
constructor.addConstructorMapping("!color-mapping", &constructColorMapping);
auto loader = Loader("input.yaml");
loader.constructor = constructor;
auto root = loader.load();
if(root["scalar-red"].as!Color == red &&
root["mapping-red"].as!Color == red &&
root["scalar-orange"].as!Color == orange &&
root["mapping-orange"].as!Color == orange)
{
writeln("SUCCESS");
return;
}
}
catch(YAMLException e)
{
writeln(e.msg);
}
writeln("FAILURE");
}
First, we create a *Constructor* and pass functions to handle the ``!color``
and ``!color-mapping`` tag. We construct a *Loader* and pass the *Constructor*
to it. We then load the YAML document, and finally, read the colors to test if
they were loaded as expected.
You can find the source code for what we've done so far in the
``examples/constructor`` directory in the D:YAML package.
--------
Resolver
--------
Specifying tag for every color can be tedious. D:YAML can implicitly resolve
scalar tags using regular expressions. This is how default types are resolved.
We will use the `Resolver <../api/dyaml.resolver.html>`_ class to add implicit
tag resolution for the Color data type (in its scalar form).
We use the *addImplicitResolver()* method of *Resolver*, passing the tag,
regular expression the scalar must match to resolve to this tag, and a string of
possible starting characters of the scalar. Then we pass the *Resolver* to
*Loader*.
Note that resolvers added first override ones added later. If no resolver
matches a scalar, YAML string tag is used. Therefore our custom values must not
be resolvable as any non-string YAML data type.
Add this to your code to add implicit resolution of ``!color``.
.. code-block:: d
//code from the previous example...
auto resolver = new Resolver;
import std.regex;
resolver.addImplicitResolver("!color", std.regex.regex("[0-9a-fA-F]{6}"),
"0123456789abcdefABCDEF");
auto loader = Loader("input.yaml");
loader.constructor = constructor;
loader.resolver = resolver;
//code from the previous example...
Now, change contents of ``input.yaml`` to this:
.. code-block:: yaml
scalar-red: FF0000
scalar-orange: FFFF00
mapping-red: !color-mapping {r: 255, g: 0, b: 0}
mapping-orange:
!color-mapping
r: 255
g: 255
b: 0
We no longer need to specify the tag for scalar color values. Compile and test
the example. If everything went as expected, it should report success.
You can find the complete code in the ``examples/resolver`` directory in the
D:YAML package.
-----------
Representer
-----------
Now that you can load custom data types, it might be good to know how to dump
them. D:YAML uses the `Representer <../api/dyaml.representer.html>`_ class for
this purpose.
*Representer* processes YAML nodes into plain mapping, sequence or scalar nodes
ready for output. Just like with *Constructor*, this is done by user specified
functions. These functions take references to a node to process and to the
*Representer*, and return the processed node.
Representer functions can be added with the *addRepresenter()* method. The
*Representer* is then passed to *Dumper*, which dumps YAML documents. Only one
function per type can be specified. This is asserted in *addRepresenter()*
preconditions. Default YAML types already have representer functions specified,
but you can disable them by constructing *Representer* with the
*useDefaultRepresenters* parameter set to false.
By default, tags are explicitly output for all non-default types. To make dumped
tags implicit, you can pass a *Resolver* that will resolve them implicitly. Of
course, you will need to use an identical *Resolver* when loading the output.
With the following code, we will add support for dumping the our Color type.
.. code-block:: d
Node representColor(ref Node node, Representer representer)
{
//The node is guaranteed to be Color as we add representer for Color.
Color color = node.as!Color;
static immutable hex = "0123456789ABCDEF";
//Using the color format from the Constructor example.
string scalar;
foreach(channel; [color.red, color.green, color.blue])
{
scalar ~= hex[channel / 16];
scalar ~= hex[channel % 16];
}
//Representing as a scalar, with custom tag to specify this data type.
return representer.representScalar("!color", scalar);
}
First we get the *Color* from the node. Then we convert it to a string with the
CSS-like format we've used before. Finally, we use the *representScalar()*
method of *Representer* to get a scalar node ready for output. There are
corresponding *representMapping()* and *representSequence()* methods
as well, with examples in the
`Resolver API documentation <../api/dyaml.resolver.html>`_.
Since a type can only have one representer function, we don't dump *Color* both
in the scalar and mapping formats we've used before. However, you can decide to
dump the node with different formats/tags in the representer function itself.
E.g. you could dump the Color as a mapping based on some arbitrary condition,
such as the color being white.
.. code-block:: d
void main()
{
try
{
auto representer = new Representer;
representer.addRepresenter!Color(&representColor);
auto resolver = new Resolver;
import std.regex;
resolver.addImplicitResolver("!color", std.regex.regex("[0-9a-fA-F]{6}"),
"0123456789abcdefABCDEF");
auto dumper = Dumper("output.yaml");
dumper.representer = representer;
dumper.resolver = resolver;
auto document = Node([Color(255, 0, 0),
Color(0, 255, 0),
Color(0, 0, 255)]);
dumper.dump(document);
}
catch(YAMLException e)
{
writeln(e.msg);
}
}
We construct a new *Representer*, and specify a representer function for the
*Color* (the template argument) type. We also construct a *Resolver*, same as in
the previous section, so the ``!color`` tag will be implicit. Of course,
identical *Resolver* would then have to be used when loading the file.
You don't need to do this if you want the tag to be explicit.
We construct a *Dumper* to file ``output.yaml`` and pass the *Representer* and
*Resolver* to it. Then, we create a simple node containing a sequence of colors
and finally, we dump it.
Source code for this section can be found in the ``examples/representer``
directory of the D:YAML package.

View file

@ -1,176 +0,0 @@
===============
Getting started
===============
Welcome to D:YAML! D:YAML is a `YAML <http://en.wikipedia.org/wiki/YAML>`_ parser
library for the `D programming language <http://dlang.org>`_. This tutorial will
explain how to set D:YAML up and use it in your projects.
This is meant to be the **simplest possible** introduction to D:YAML. Some of this
information might already be known to you. Only basic usage is covered.
----------
Setting up
----------
^^^^^^^^^^^^^^^^^^^^^^^^
Install the DMD compiler
^^^^^^^^^^^^^^^^^^^^^^^^
Digital Mars D compiler, or DMD, is the most commonly used D compiler. You can find its
newest version `here <http://dlang.org/download.html>`_. Download the version of DMD
for your operating system and install it.
.. note::
Other D compilers exist, such as
`GDC <http://gdcproject.org/>`_ and
`LDC <http://bitbucket.org/goshawk/gdc/wiki/Home>`_.
^^^^^^^^^^^
Install dub
^^^^^^^^^^^
`dub <http://code.dlang.org/about>`_ is a build system and package manager for D.
It is the standard way to manage D projects and their dependencies, compilation and so
on.
DMD may include DUB in future releases, but at this point we need to install it
separately. See
`installation instructions <https://github.com/D-Programming-Language/dub#installation>`_.
-------------------------
Your first D:YAML project
-------------------------
Create a directory for your project and in that directory, create a new file named
``input.yaml`` and paste this code into the file:
.. code-block:: yaml
Hello World : [Hello, World]
Answer: 42
This will serve as input for our example.
Now we need to parse it. Create a new file with name ``main.d``. Paste following code
into the file:
.. code-block:: d
import std.stdio;
import yaml;
void main()
{
//Read the input.
Node root = Loader("input.yaml").load();
//Display the data read.
foreach(string word; root["Hello World"])
{
writeln(word);
}
writeln("The answer is ", root["Answer"].as!int);
//Dump the loaded document to output.yaml.
Dumper("output.yaml").dump(root);
}
^^^^^^^^^^^^^^^^^^^^^^^
Explanation of the code
^^^^^^^^^^^^^^^^^^^^^^^
First, we import the *dyaml.all* module. This is the only D:YAML module you need to
import - it automatically imports all needed modules.
Next we load the file using the *Loader.load()* method. *Loader* is a struct used for
parsing YAML documents. The *load()* method loads the file as **one** YAML document, or
throws *YAMLException*, D:YAML exception type, if the file could not be parsed or
contains more than one document. Note that we don't do any error checking here in order
to keep the example as simple as possible.
*Node* represents a node in a YAML document. It can be a sequence (array), mapping
(associative array) or a scalar (value). Here the root node is a mapping, and we use the
index operator to get subnodes with keys "Hello World" and "Answer". We iterate over the
former, as it is a sequence, and use the *Node.as()* method on the latter to read its
value as an integer.
You can iterate over a mapping or sequence as if it was an associative or normal array,
respectively. If you try to iterate over a scalar, it will throw a *YAMLException*.
You can iterate using *Node* as the iterated type, or specify the type iterated nodes
are expected to have. D:YAML will automatically convert to that type if possible. Here
we specify the *string* type, so we iterate over the "Hello World" sequence as an array
of strings. If it is not possible to convert to iterated type, a *YAMLException* is
thrown. For instance, if we specified *int* here, we would get an error, as "Hello"
cannot be converted to an integer.
The *Node.as()* method is used to read value of a scalar node as specified type. If the
scalar does not have the specified type, D:YAML will try to convert it, throwing
*YAMLException* if not possible.
Finally we dump the document we just read to ``output.yaml`` with the *Dumper.dump()*
method. *Dumper* is a struct used to dump YAML documents. The *dump()* method writes
one or more documents to a file, throwing *YAMLException* if the file could not be
written to.
D:YAML tries to preserve style information in documents so e.g. ``[Hello, World]`` is
not turned into:
| ``- Hello``
| ``- World``
However, comments are not preserved and neither are any extra formatting whitespace that
doesn't affect the meaning of YAML contents.
^^^^^^^^^
Compiling
^^^^^^^^^
We're going to use dub, which we installed at the beginning, to compile our project.
Create a file called ``dub.json`` with the following contents:
.. code-block:: json
{
"name": "getting-started",
"targetType": "executable",
"sourceFiles": ["main.d"],
"mainSourceFile": "main.d",
"dependencies":
{
"dyaml": { "version" : "~>0.5.0" },
},
}
This file tells dub that we're building an executable called ``getting-started`` from
a D source file ``main.d``, and that our project depends on D:YAML 0.5.0 or any newer,
bugfix release of D:YAML 0.5 . DUB will automatically find and download the correct
version of D:YAML when the project is built.
Now run the following command in your project's directory::
dub build
dub will automatically download D:YAML and compile it, and then then it will compile our
program. This will generate an executable called ``getting-started`` or
``getting-started.exe`` in your directory. When you run it, it should produce the
following output::
Hello
World
The answer is 42
^^^^^^^^^^
Conclusion
^^^^^^^^^^
You should now have a basic idea about how to use D:YAML. To learn more, look at the
`API documentation <../api/index.html>`_ and other tutorials. You can find code for this
example in the ``example/getting_started`` directory in the package.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 673 B

View file

@ -1,537 +0,0 @@
/*
* basic.css
* ~~~~~~~~~
*
* Sphinx stylesheet -- basic theme.
*
* :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/* -- main layout ----------------------------------------------------------- */
div.clearer {
clear: both;
}
/* -- relbar ---------------------------------------------------------------- */
div.related {
width: 100%;
font-size: 90%;
}
div.related h3 {
display: none;
}
div.related ul {
margin: 0;
padding: 0 0 0 10px;
list-style: none;
}
div.related li {
display: inline;
}
div.related li.right {
float: right;
margin-right: 5px;
}
/* -- sidebar --------------------------------------------------------------- */
div.sphinxsidebarwrapper {
padding: 10px 5px 0 10px;
}
div.sphinxsidebar {
float: left;
width: 230px;
margin-left: -100%;
font-size: 90%;
}
div.sphinxsidebar ul {
list-style: none;
}
div.sphinxsidebar ul ul,
div.sphinxsidebar ul.want-points {
margin-left: 20px;
list-style: square;
}
div.sphinxsidebar ul ul {
margin-top: 0;
margin-bottom: 0;
}
div.sphinxsidebar form {
margin-top: 10px;
}
div.sphinxsidebar input {
border: 1px solid #98dbcc;
font-family: sans-serif;
font-size: 1em;
}
div.sphinxsidebar #searchbox input[type="text"] {
width: 170px;
}
div.sphinxsidebar #searchbox input[type="submit"] {
width: 30px;
}
img {
border: 0;
max-width: 100%;
}
/* -- search page ----------------------------------------------------------- */
ul.search {
margin: 10px 0 0 20px;
padding: 0;
}
ul.search li {
padding: 5px 0 5px 20px;
background-image: url(file.png);
background-repeat: no-repeat;
background-position: 0 7px;
}
ul.search li a {
font-weight: bold;
}
ul.search li div.context {
color: #888;
margin: 2px 0 0 30px;
text-align: left;
}
ul.keywordmatches li.goodmatch a {
font-weight: bold;
}
/* -- index page ------------------------------------------------------------ */
table.contentstable {
width: 90%;
}
table.contentstable p.biglink {
line-height: 150%;
}
a.biglink {
font-size: 1.3em;
}
span.linkdescr {
font-style: italic;
padding-top: 5px;
font-size: 90%;
}
/* -- general index --------------------------------------------------------- */
table.indextable {
width: 100%;
}
table.indextable td {
text-align: left;
vertical-align: top;
}
table.indextable dl, table.indextable dd {
margin-top: 0;
margin-bottom: 0;
}
table.indextable tr.pcap {
height: 10px;
}
table.indextable tr.cap {
margin-top: 10px;
background-color: #f2f2f2;
}
img.toggler {
margin-right: 3px;
margin-top: 3px;
cursor: pointer;
}
div.modindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
div.genindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
/* -- general body styles --------------------------------------------------- */
a.headerlink {
visibility: hidden;
}
h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
h4:hover > a.headerlink,
h5:hover > a.headerlink,
h6:hover > a.headerlink,
dt:hover > a.headerlink {
visibility: visible;
}
div.body p.caption {
text-align: inherit;
}
div.body td {
text-align: left;
}
.field-list ul {
padding-left: 1em;
}
.first {
margin-top: 0 !important;
}
p.rubric {
margin-top: 30px;
font-weight: bold;
}
img.align-left, .figure.align-left, object.align-left {
clear: left;
float: left;
margin-right: 1em;
}
img.align-right, .figure.align-right, object.align-right {
clear: right;
float: right;
margin-left: 1em;
}
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left;
}
.align-center {
text-align: center;
}
.align-right {
text-align: right;
}
/* -- sidebars -------------------------------------------------------------- */
div.sidebar {
margin: 0 0 0.5em 1em;
border: 1px solid #ddb;
padding: 7px 7px 0 7px;
background-color: #ffe;
width: 40%;
float: right;
}
p.sidebar-title {
font-weight: bold;
}
/* -- topics ---------------------------------------------------------------- */
div.topic {
border: 1px solid #ccc;
padding: 7px 7px 0 7px;
margin: 10px 0 10px 0;
}
p.topic-title {
font-size: 1.1em;
font-weight: bold;
margin-top: 10px;
}
/* -- admonitions ----------------------------------------------------------- */
div.admonition {
margin-top: 10px;
margin-bottom: 10px;
padding: 7px;
}
div.admonition dt {
font-weight: bold;
}
div.admonition dl {
margin-bottom: 0;
}
p.admonition-title {
margin: 0px 10px 5px 0px;
font-weight: bold;
}
div.body p.centered {
text-align: center;
margin-top: 25px;
}
/* -- tables ---------------------------------------------------------------- */
table.docutils {
border: 0;
border-collapse: collapse;
}
table.docutils td, table.docutils th {
padding: 1px 8px 1px 5px;
border-top: 0;
border-left: 0;
border-right: 0;
border-bottom: 1px solid #aaa;
}
table.field-list td, table.field-list th {
border: 0 !important;
}
table.footnote td, table.footnote th {
border: 0 !important;
}
th {
text-align: left;
padding-right: 5px;
}
table.citation {
border-left: solid 1px gray;
margin-left: 1px;
}
table.citation td {
border-bottom: none;
}
/* -- other body styles ----------------------------------------------------- */
ol.arabic {
list-style: decimal;
}
ol.loweralpha {
list-style: lower-alpha;
}
ol.upperalpha {
list-style: upper-alpha;
}
ol.lowerroman {
list-style: lower-roman;
}
ol.upperroman {
list-style: upper-roman;
}
dl {
margin-bottom: 15px;
}
dd p {
margin-top: 0px;
}
dd ul, dd table {
margin-bottom: 10px;
}
dd {
margin-top: 3px;
margin-bottom: 10px;
margin-left: 30px;
}
dt:target, .highlighted {
background-color: #fbe54e;
}
dl.glossary dt {
font-weight: bold;
font-size: 1.1em;
}
.field-list ul {
margin: 0;
padding-left: 1em;
}
.field-list p {
margin: 0;
}
.optional {
font-size: 1.3em;
}
.versionmodified {
font-style: italic;
}
.system-message {
background-color: #fda;
padding: 5px;
border: 3px solid red;
}
.footnote:target {
background-color: #ffa;
}
.line-block {
display: block;
margin-top: 1em;
margin-bottom: 1em;
}
.line-block .line-block {
margin-top: 0;
margin-bottom: 0;
margin-left: 1.5em;
}
.guilabel, .menuselection {
font-family: sans-serif;
}
.accelerator {
text-decoration: underline;
}
.classifier {
font-style: oblique;
}
abbr, acronym {
border-bottom: dotted 1px;
cursor: help;
}
/* -- code displays --------------------------------------------------------- */
pre {
overflow: auto;
overflow-y: hidden; /* fixes display issues on Chrome browsers */
}
td.linenos pre {
padding: 5px 0px;
border: 0;
background-color: transparent;
color: #aaa;
}
table.highlighttable {
margin-left: 0.5em;
}
table.highlighttable td {
padding: 0 0.5em 0 0.5em;
}
tt.descname {
background-color: transparent;
font-weight: bold;
font-size: 1.2em;
}
tt.descclassname {
background-color: transparent;
}
tt.xref, a tt {
background-color: transparent;
font-weight: bold;
}
h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
background-color: transparent;
}
.viewcode-link {
float: right;
}
.viewcode-back {
float: right;
font-family: sans-serif;
}
div.viewcode-block:target {
margin: -1px -10px;
padding: 0 10px;
}
/* -- math display ---------------------------------------------------------- */
img.math {
vertical-align: middle;
}
div.body div.math p {
text-align: center;
}
span.eqno {
float: right;
}
/* -- printout stylesheet --------------------------------------------------- */
@media print {
div.document,
div.documentwrapper,
div.bodywrapper {
margin: 0 !important;
width: 100%;
}
div.sphinxsidebar,
div.related,
div.footer,
#top-link {
display: none;
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

View file

@ -1,256 +0,0 @@
/*
* default.css_t
* ~~~~~~~~~~~~~
*
* Sphinx stylesheet -- default theme.
*
* :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
@import url("basic.css");
/* -- page layout ----------------------------------------------------------- */
body {
font-family: Verdana, "Deja Vu", "Bitstream Vera Sans", sans-serif;
font-size: 100%;
background-color: #1f252b;
color: #000;
margin: 0;
padding: 0;
}
div.document {
background-color: #1f252b;
}
div.documentwrapper {
float: left;
width: 100%;
}
div.bodywrapper {
margin: 0 0 0 230px;
}
div.body {
background-color: #f6f6f6;
color: black;
padding: 0 20px 30px 20px;
}
div.footer {
color: #ccc;
width: 100%;
padding: 9px 0 9px 0;
text-align: center;
font-size: 75%;
}
div.footer a {
color: #ccc;
text-decoration: underline;
}
div.related {
background-color: #303333;
line-height: 30px;
color: #ccc;
}
div.related a {
color: #ffffff;
}
div.sphinxsidebar {
}
div.sphinxsidebar h3 {
font-family: Georgia, "Times New Roman", Times, serif;
color: #ffffff;
font-size: 1.4em;
font-weight: normal;
margin: 0;
padding: 0;
}
div.sphinxsidebar h3 a {
color: #ffffff;
}
div.sphinxsidebar h4 {
font-family: Georgia, "Times New Roman", Times, serif;
color: #ffffff;
font-size: 1.3em;
font-weight: normal;
margin: 5px 0 0 0;
padding: 0;
}
div.sphinxsidebar p {
color: #ffffff;
}
div.sphinxsidebar p.topless {
margin: 5px 10px 10px 10px;
}
div.sphinxsidebar ul {
margin: 10px;
padding: 0;
color: #ffffff;
}
div.sphinxsidebar a {
color: #ddd;
}
div.sphinxsidebar input {
border: 1px solid #ddd;
font-family: sans-serif;
font-size: 1em;
}
/* -- hyperlink styles ------------------------------------------------------ */
a {
color: #006;
text-decoration: none;
}
a:visited {
color: #606;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
/* -- body styles ----------------------------------------------------------- */
div.body h1,
div.body h2,
div.body h3,
div.body h4,
div.body h5,
div.body h6 {
font-family: Georgia, "Times New Roman", Times, serif;
background-color: #f6f6f6;
font-weight: normal;
color: #633;
border-bottom: 1px solid #ccc;
margin: 20px -20px 10px -20px;
padding: 3px 0 3px 10px;
}
div.body h1 { margin-top: 0; font-size: 200%; }
div.body h2 { font-size: 160%; }
div.body h3 { font-size: 140%; }
div.body h4 { font-size: 120%; }
div.body h5 { font-size: 110%; }
div.body h6 { font-size: 100%; }
a.headerlink {
color: #006;
font-size: 0.8em;
padding: 0 4px 0 4px;
text-decoration: none;
}
a.headerlink:hover {
background-color: #006;
color: white;
}
div.body p, div.body dd, div.body li {
text-align: justify;
line-height: 130%;
}
div.admonition p.admonition-title + p {
display: inline;
}
div.admonition p {
margin-bottom: 5px;
}
div.admonition pre {
margin-bottom: 5px;
}
div.admonition ul, div.admonition ol {
margin-bottom: 5px;
}
div.note {
background-color: #eee;
border: 1px solid #ccc;
}
div.seealso {
background-color: #ffc;
border: 1px solid #ff6;
}
div.topic {
background-color: #eee;
}
div.warning {
background-color: #ffe4e4;
border: 1px solid #f66;
}
p.admonition-title {
display: inline;
}
p.admonition-title:after {
content: ":";
}
pre {
padding: 5px;
background-color: fcfcfc;
color: 000066;
line-height: 120%;
border: 1px solid #ac9;
border-left: none;
border-right: none;
}
tt {
background-color: #ecf0f3;
padding: 0 1px 0 1px;
font-size: 0.95em;
}
th {
background-color: #ede;
}
.warning tt {
background: #efc2c2;
}
.note tt {
background: #d6d6d6;
}
.viewcode-back {
font-family: Verdana, "Deja Vu", "Bitstream Vera Sans", sans-serif;
}
div.viewcode-block:target {
background-color: #f4debf;
border-top: 1px solid #ac9;
border-bottom: 1px solid #ac9;
}

View file

@ -1,238 +0,0 @@
/*
* doctools.js
* ~~~~~~~~~~~
*
* Sphinx JavaScript utilities for all documentation.
*
* :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/**
* select a different prefix for underscore
*/
$u = _.noConflict();
/**
* make the code below compatible with browsers without
* an installed firebug like debugger
if (!window.console || !console.firebug) {
var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
"dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
"profile", "profileEnd"];
window.console = {};
for (var i = 0; i < names.length; ++i)
window.console[names[i]] = function() {};
}
*/
/**
* small helper function to urldecode strings
*/
jQuery.urldecode = function(x) {
return decodeURIComponent(x).replace(/\+/g, ' ');
};
/**
* small helper function to urlencode strings
*/
jQuery.urlencode = encodeURIComponent;
/**
* This function returns the parsed url parameters of the
* current request. Multiple values per key are supported,
* it will always return arrays of strings for the value parts.
*/
jQuery.getQueryParameters = function(s) {
if (typeof s == 'undefined')
s = document.location.search;
var parts = s.substr(s.indexOf('?') + 1).split('&');
var result = {};
for (var i = 0; i < parts.length; i++) {
var tmp = parts[i].split('=', 2);
var key = jQuery.urldecode(tmp[0]);
var value = jQuery.urldecode(tmp[1]);
if (key in result)
result[key].push(value);
else
result[key] = [value];
}
return result;
};
/**
* highlight a given string on a jquery object by wrapping it in
* span elements with the given class name.
*/
jQuery.fn.highlightText = function(text, className) {
function highlight(node) {
if (node.nodeType == 3) {
var val = node.nodeValue;
var pos = val.toLowerCase().indexOf(text);
if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) {
var span = document.createElement("span");
span.className = className;
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
document.createTextNode(val.substr(pos + text.length)),
node.nextSibling));
node.nodeValue = val.substr(0, pos);
}
}
else if (!jQuery(node).is("button, select, textarea")) {
jQuery.each(node.childNodes, function() {
highlight(this);
});
}
}
return this.each(function() {
highlight(this);
});
};
/**
* Small JavaScript module for the documentation.
*/
var Documentation = {
init : function() {
this.fixFirefoxAnchorBug();
this.highlightSearchWords();
this.initIndexTable();
},
/**
* i18n support
*/
TRANSLATIONS : {},
PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
LOCALE : 'unknown',
// gettext and ngettext don't access this so that the functions
// can safely bound to a different name (_ = Documentation.gettext)
gettext : function(string) {
var translated = Documentation.TRANSLATIONS[string];
if (typeof translated == 'undefined')
return string;
return (typeof translated == 'string') ? translated : translated[0];
},
ngettext : function(singular, plural, n) {
var translated = Documentation.TRANSLATIONS[singular];
if (typeof translated == 'undefined')
return (n == 1) ? singular : plural;
return translated[Documentation.PLURALEXPR(n)];
},
addTranslations : function(catalog) {
for (var key in catalog.messages)
this.TRANSLATIONS[key] = catalog.messages[key];
this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
this.LOCALE = catalog.locale;
},
/**
* add context elements like header anchor links
*/
addContextElements : function() {
$('div[id] > :header:first').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this headline')).
appendTo(this);
});
$('dt[id]').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this definition')).
appendTo(this);
});
},
/**
* workaround a firefox stupidity
*/
fixFirefoxAnchorBug : function() {
if (document.location.hash && $.browser.mozilla)
window.setTimeout(function() {
document.location.href += '';
}, 10);
},
/**
* highlight the search words provided in the url in the text
*/
highlightSearchWords : function() {
var params = $.getQueryParameters();
var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
if (terms.length) {
var body = $('div.body');
if (!body.length) {
body = $('body');
}
window.setTimeout(function() {
$.each(terms, function() {
body.highlightText(this.toLowerCase(), 'highlighted');
});
}, 10);
$('<p class="highlight-link"><a href="javascript:Documentation.' +
'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
.appendTo($('#searchbox'));
}
},
/**
* init the domain index toggle buttons
*/
initIndexTable : function() {
var togglers = $('img.toggler').click(function() {
var src = $(this).attr('src');
var idnum = $(this).attr('id').substr(7);
$('tr.cg-' + idnum).toggle();
if (src.substr(-9) == 'minus.png')
$(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
else
$(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
}).css('display', '');
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
togglers.click();
}
},
/**
* helper function to hide the search marks again
*/
hideSearchWords : function() {
$('#searchbox .highlight-link').fadeOut(300);
$('span.highlighted').removeClass('highlighted');
},
/**
* make the url absolute
*/
makeURL : function(relativeURL) {
return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
},
/**
* get the current relative url
*/
getCurrentURL : function() {
var path = document.location.pathname;
var parts = path.split(/\//);
$.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
if (this == '..')
parts.pop();
});
var url = parts.join('/');
return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
}
};
// quick alias for translations
_ = Documentation.gettext;
$(document).ready(function() {
Documentation.init();
});

Binary file not shown.

Before

Width:  |  Height:  |  Size: 368 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 363 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 392 B

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 199 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 199 B

View file

@ -1,63 +0,0 @@
.highlight .hll { background-color: #ffffcc }
.highlight { background: #eeffcc; }
.highlight .c { color: #408090; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #FF0000 } /* Error */
.highlight .k { color: #007020; font-weight: bold } /* Keyword */
.highlight .o { color: #666666 } /* Operator */
.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #007020 } /* Comment.Preproc */
.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #FF0000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */
.highlight .go { color: #333333 } /* Generic.Output */
.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #0044DD } /* Generic.Traceback */
.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #007020 } /* Keyword.Pseudo */
.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #902000 } /* Keyword.Type */
.highlight .m { color: #208050 } /* Literal.Number */
.highlight .s { color: #4070a0 } /* Literal.String */
.highlight .na { color: #4070a0 } /* Name.Attribute */
.highlight .nb { color: #007020 } /* Name.Builtin */
.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
.highlight .no { color: #60add5 } /* Name.Constant */
.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #007020 } /* Name.Exception */
.highlight .nf { color: #06287e } /* Name.Function */
.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */
.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #bb60d5 } /* Name.Variable */
.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #208050 } /* Literal.Number.Bin */
.highlight .mf { color: #208050 } /* Literal.Number.Float */
.highlight .mh { color: #208050 } /* Literal.Number.Hex */
.highlight .mi { color: #208050 } /* Literal.Number.Integer */
.highlight .mo { color: #208050 } /* Literal.Number.Oct */
.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
.highlight .sc { color: #4070a0 } /* Literal.String.Char */
.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #4070a0 } /* Literal.String.Double */
.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
.highlight .sx { color: #c65d09 } /* Literal.String.Other */
.highlight .sr { color: #235388 } /* Literal.String.Regex */
.highlight .s1 { color: #4070a0 } /* Literal.String.Single */
.highlight .ss { color: #517918 } /* Literal.String.Symbol */
.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */

View file

@ -1,622 +0,0 @@
/*
* searchtools.js_t
* ~~~~~~~~~~~~~~~~
*
* Sphinx JavaScript utilties for the full-text search.
*
* :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/**
* Porter Stemmer
*/
var Stemmer = function() {
var step2list = {
ational: 'ate',
tional: 'tion',
enci: 'ence',
anci: 'ance',
izer: 'ize',
bli: 'ble',
alli: 'al',
entli: 'ent',
eli: 'e',
ousli: 'ous',
ization: 'ize',
ation: 'ate',
ator: 'ate',
alism: 'al',
iveness: 'ive',
fulness: 'ful',
ousness: 'ous',
aliti: 'al',
iviti: 'ive',
biliti: 'ble',
logi: 'log'
};
var step3list = {
icate: 'ic',
ative: '',
alize: 'al',
iciti: 'ic',
ical: 'ic',
ful: '',
ness: ''
};
var c = "[^aeiou]"; // consonant
var v = "[aeiouy]"; // vowel
var C = c + "[^aeiouy]*"; // consonant sequence
var V = v + "[aeiou]*"; // vowel sequence
var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0
var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1
var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1
var s_v = "^(" + C + ")?" + v; // vowel in stem
this.stemWord = function (w) {
var stem;
var suffix;
var firstch;
var origword = w;
if (w.length < 3)
return w;
var re;
var re2;
var re3;
var re4;
firstch = w.substr(0,1);
if (firstch == "y")
w = firstch.toUpperCase() + w.substr(1);
// Step 1a
re = /^(.+?)(ss|i)es$/;
re2 = /^(.+?)([^s])s$/;
if (re.test(w))
w = w.replace(re,"$1$2");
else if (re2.test(w))
w = w.replace(re2,"$1$2");
// Step 1b
re = /^(.+?)eed$/;
re2 = /^(.+?)(ed|ing)$/;
if (re.test(w)) {
var fp = re.exec(w);
re = new RegExp(mgr0);
if (re.test(fp[1])) {
re = /.$/;
w = w.replace(re,"");
}
}
else if (re2.test(w)) {
var fp = re2.exec(w);
stem = fp[1];
re2 = new RegExp(s_v);
if (re2.test(stem)) {
w = stem;
re2 = /(at|bl|iz)$/;
re3 = new RegExp("([^aeiouylsz])\\1$");
re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
if (re2.test(w))
w = w + "e";
else if (re3.test(w)) {
re = /.$/;
w = w.replace(re,"");
}
else if (re4.test(w))
w = w + "e";
}
}
// Step 1c
re = /^(.+?)y$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(s_v);
if (re.test(stem))
w = stem + "i";
}
// Step 2
re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
suffix = fp[2];
re = new RegExp(mgr0);
if (re.test(stem))
w = stem + step2list[suffix];
}
// Step 3
re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
suffix = fp[2];
re = new RegExp(mgr0);
if (re.test(stem))
w = stem + step3list[suffix];
}
// Step 4
re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
re2 = /^(.+?)(s|t)(ion)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(mgr1);
if (re.test(stem))
w = stem;
}
else if (re2.test(w)) {
var fp = re2.exec(w);
stem = fp[1] + fp[2];
re2 = new RegExp(mgr1);
if (re2.test(stem))
w = stem;
}
// Step 5
re = /^(.+?)e$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(mgr1);
re2 = new RegExp(meq1);
re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
w = stem;
}
re = /ll$/;
re2 = new RegExp(mgr1);
if (re.test(w) && re2.test(w)) {
re = /.$/;
w = w.replace(re,"");
}
// and turn initial Y back to y
if (firstch == "y")
w = firstch.toLowerCase() + w.substr(1);
return w;
}
}
/**
* Simple result scoring code.
*/
var Scorer = {
// Implement the following function to further tweak the score for each result
// The function takes a result array [filename, title, anchor, descr, score]
// and returns the new score.
/*
score: function(result) {
return result[4];
},
*/
// query matches the full name of an object
objNameMatch: 11,
// or matches in the last dotted part of the object name
objPartialMatch: 6,
// Additive scores depending on the priority of the object
objPrio: {0: 15, // used to be importantResults
1: 5, // used to be objectResults
2: -5}, // used to be unimportantResults
// Used when the priority is not in the mapping.
objPrioDefault: 0,
// query found in title
title: 15,
// query found in terms
term: 5
};
/**
* Search Module
*/
var Search = {
_index : null,
_queued_query : null,
_pulse_status : -1,
init : function() {
var params = $.getQueryParameters();
if (params.q) {
var query = params.q[0];
$('input[name="q"]')[0].value = query;
this.performSearch(query);
}
},
loadIndex : function(url) {
$.ajax({type: "GET", url: url, data: null,
dataType: "script", cache: true,
complete: function(jqxhr, textstatus) {
if (textstatus != "success") {
document.getElementById("searchindexloader").src = url;
}
}});
},
setIndex : function(index) {
var q;
this._index = index;
if ((q = this._queued_query) !== null) {
this._queued_query = null;
Search.query(q);
}
},
hasIndex : function() {
return this._index !== null;
},
deferQuery : function(query) {
this._queued_query = query;
},
stopPulse : function() {
this._pulse_status = 0;
},
startPulse : function() {
if (this._pulse_status >= 0)
return;
function pulse() {
var i;
Search._pulse_status = (Search._pulse_status + 1) % 4;
var dotString = '';
for (i = 0; i < Search._pulse_status; i++)
dotString += '.';
Search.dots.text(dotString);
if (Search._pulse_status > -1)
window.setTimeout(pulse, 500);
}
pulse();
},
/**
* perform a search for something (or wait until index is loaded)
*/
performSearch : function(query) {
// create the required interface elements
this.out = $('#search-results');
this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
this.dots = $('<span></span>').appendTo(this.title);
this.status = $('<p style="display: none"></p>').appendTo(this.out);
this.output = $('<ul class="search"/>').appendTo(this.out);
$('#search-progress').text(_('Preparing search...'));
this.startPulse();
// index already loaded, the browser was quick!
if (this.hasIndex())
this.query(query);
else
this.deferQuery(query);
},
/**
* execute search (requires search index to be loaded)
*/
query : function(query) {
var i;
var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];
// stem the searchterms and add them to the correct list
var stemmer = new Stemmer();
var searchterms = [];
var excluded = [];
var hlterms = [];
var tmp = query.split(/\s+/);
var objectterms = [];
for (i = 0; i < tmp.length; i++) {
if (tmp[i] !== "") {
objectterms.push(tmp[i].toLowerCase());
}
if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i].match(/^\d+$/) ||
tmp[i] === "") {
// skip this "word"
continue;
}
// stem the word
var word = stemmer.stemWord(tmp[i].toLowerCase());
var toAppend;
// select the correct list
if (word[0] == '-') {
toAppend = excluded;
word = word.substr(1);
}
else {
toAppend = searchterms;
hlterms.push(tmp[i].toLowerCase());
}
// only add if not already in the list
if (!$u.contains(toAppend, word))
toAppend.push(word);
}
var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
// console.debug('SEARCH: searching for:');
// console.info('required: ', searchterms);
// console.info('excluded: ', excluded);
// prepare search
var terms = this._index.terms;
var titleterms = this._index.titleterms;
// array of [filename, title, anchor, descr, score]
var results = [];
$('#search-progress').empty();
// lookup as object
for (i = 0; i < objectterms.length; i++) {
var others = [].concat(objectterms.slice(0, i),
objectterms.slice(i+1, objectterms.length));
results = results.concat(this.performObjectSearch(objectterms[i], others));
}
// lookup as search terms in fulltext
results = results.concat(this.performTermsSearch(searchterms, excluded, terms, Scorer.term))
.concat(this.performTermsSearch(searchterms, excluded, titleterms, Scorer.title));
// let the scorer override scores with a custom scoring function
if (Scorer.score) {
for (i = 0; i < results.length; i++)
results[i][4] = Scorer.score(results[i]);
}
// now sort the results by score (in opposite order of appearance, since the
// display function below uses pop() to retrieve items) and then
// alphabetically
results.sort(function(a, b) {
var left = a[4];
var right = b[4];
if (left > right) {
return 1;
} else if (left < right) {
return -1;
} else {
// same score: sort alphabetically
left = a[1].toLowerCase();
right = b[1].toLowerCase();
return (left > right) ? -1 : ((left < right) ? 1 : 0);
}
});
// for debugging
//Search.lastresults = results.slice(); // a copy
//console.info('search results:', Search.lastresults);
// print the results
var resultCount = results.length;
function displayNextItem() {
// results left, load the summary and display it
if (results.length) {
var item = results.pop();
var listItem = $('<li style="display:none"></li>');
if (DOCUMENTATION_OPTIONS.FILE_SUFFIX === '') {
// dirhtml builder
var dirname = item[0] + '/';
if (dirname.match(/\/index\/$/)) {
dirname = dirname.substring(0, dirname.length-6);
} else if (dirname == 'index/') {
dirname = '';
}
listItem.append($('<a/>').attr('href',
DOCUMENTATION_OPTIONS.URL_ROOT + dirname +
highlightstring + item[2]).html(item[1]));
} else {
// normal html builders
listItem.append($('<a/>').attr('href',
item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
highlightstring + item[2]).html(item[1]));
}
if (item[3]) {
listItem.append($('<span> (' + item[3] + ')</span>'));
Search.output.append(listItem);
listItem.slideDown(5, function() {
displayNextItem();
});
} else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
$.ajax({url: DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' + item[0] + '.txt',
dataType: "text",
complete: function(jqxhr, textstatus) {
var data = jqxhr.responseText;
if (data !== '') {
listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
}
Search.output.append(listItem);
listItem.slideDown(5, function() {
displayNextItem();
});
}});
} else {
// no source available, just display title
Search.output.append(listItem);
listItem.slideDown(5, function() {
displayNextItem();
});
}
}
// search finished, update title and status message
else {
Search.stopPulse();
Search.title.text(_('Search Results'));
if (!resultCount)
Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
else
Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
Search.status.fadeIn(500);
}
}
displayNextItem();
},
/**
* search for object names
*/
performObjectSearch : function(object, otherterms) {
var filenames = this._index.filenames;
var objects = this._index.objects;
var objnames = this._index.objnames;
var titles = this._index.titles;
var i;
var results = [];
for (var prefix in objects) {
for (var name in objects[prefix]) {
var fullname = (prefix ? prefix + '.' : '') + name;
if (fullname.toLowerCase().indexOf(object) > -1) {
var score = 0;
var parts = fullname.split('.');
// check for different match types: exact matches of full name or
// "last name" (i.e. last dotted part)
if (fullname == object || parts[parts.length - 1] == object) {
score += Scorer.objNameMatch;
// matches in last name
} else if (parts[parts.length - 1].indexOf(object) > -1) {
score += Scorer.objPartialMatch;
}
var match = objects[prefix][name];
var objname = objnames[match[1]][2];
var title = titles[match[0]];
// If more than one term searched for, we require other words to be
// found in the name/title/description
if (otherterms.length > 0) {
var haystack = (prefix + ' ' + name + ' ' +
objname + ' ' + title).toLowerCase();
var allfound = true;
for (i = 0; i < otherterms.length; i++) {
if (haystack.indexOf(otherterms[i]) == -1) {
allfound = false;
break;
}
}
if (!allfound) {
continue;
}
}
var descr = objname + _(', in ') + title;
var anchor = match[3];
if (anchor === '')
anchor = fullname;
else if (anchor == '-')
anchor = objnames[match[1]][1] + '-' + fullname;
// add custom score for some objects according to scorer
if (Scorer.objPrio.hasOwnProperty(match[2])) {
score += Scorer.objPrio[match[2]];
} else {
score += Scorer.objPrioDefault;
}
results.push([filenames[match[0]], fullname, '#'+anchor, descr, score]);
}
}
}
return results;
},
/**
* search for full-text terms in the index
*/
performTermsSearch : function(searchterms, excluded, terms, score) {
var filenames = this._index.filenames;
var titles = this._index.titles;
var i, j, file, files;
var fileMap = {};
var results = [];
// perform the search on the required terms
for (i = 0; i < searchterms.length; i++) {
var word = searchterms[i];
// no match but word was a required one
if ((files = terms[word]) === undefined)
break;
if (files.length === undefined) {
files = [files];
}
// create the mapping
for (j = 0; j < files.length; j++) {
file = files[j];
if (file in fileMap)
fileMap[file].push(word);
else
fileMap[file] = [word];
}
}
// now check if the files don't contain excluded terms
for (file in fileMap) {
var valid = true;
// check if all requirements are matched
if (fileMap[file].length != searchterms.length)
continue;
// ensure that none of the excluded terms is in the search result
for (i = 0; i < excluded.length; i++) {
if (terms[excluded[i]] == file ||
$u.contains(terms[excluded[i]] || [], file)) {
valid = false;
break;
}
}
// if we have still a valid result we can add it to the result list
if (valid) {
results.push([filenames[file], titles[file], '', null, score]);
}
}
return results;
},
/**
* helper function to return a node containing the
* search summary for a given text. keywords is a list
* of stemmed words, hlwords is the list of normal, unstemmed
* words. the first one is used to find the occurance, the
* latter for highlighting it.
*/
makeSearchSummary : function(text, keywords, hlwords) {
var textLower = text.toLowerCase();
var start = 0;
$.each(keywords, function() {
var i = textLower.indexOf(this.toLowerCase());
if (i > -1)
start = i;
});
start = Math.max(start - 120, 0);
var excerpt = ((start > 0) ? '...' : '') +
$.trim(text.substr(start, 240)) +
((start + 240 - text.length) ? '...' : '');
var rv = $('<div class="context"></div>').text(excerpt);
$.each(hlwords, function() {
rv = rv.highlightText(this, 'highlighted');
});
return rv;
}
};
$(document).ready(function() {
Search.init();
});

View file

@ -1,159 +0,0 @@
/*
* sidebar.js
* ~~~~~~~~~~
*
* This script makes the Sphinx sidebar collapsible.
*
* .sphinxsidebar contains .sphinxsidebarwrapper. This script adds
* in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton
* used to collapse and expand the sidebar.
*
* When the sidebar is collapsed the .sphinxsidebarwrapper is hidden
* and the width of the sidebar and the margin-left of the document
* are decreased. When the sidebar is expanded the opposite happens.
* This script saves a per-browser/per-session cookie used to
* remember the position of the sidebar among the pages.
* Once the browser is closed the cookie is deleted and the position
* reset to the default (expanded).
*
* :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
$(function() {
// global elements used by the functions.
// the 'sidebarbutton' element is defined as global after its
// creation, in the add_sidebar_button function
var bodywrapper = $('.bodywrapper');
var sidebar = $('.sphinxsidebar');
var sidebarwrapper = $('.sphinxsidebarwrapper');
// for some reason, the document has no sidebar; do not run into errors
if (!sidebar.length) return;
// original margin-left of the bodywrapper and width of the sidebar
// with the sidebar expanded
var bw_margin_expanded = bodywrapper.css('margin-left');
var ssb_width_expanded = sidebar.width();
// margin-left of the bodywrapper and width of the sidebar
// with the sidebar collapsed
var bw_margin_collapsed = '.8em';
var ssb_width_collapsed = '.8em';
// colors used by the current theme
var dark_color = $('.related').css('background-color');
var light_color = $('.document').css('background-color');
function sidebar_is_collapsed() {
return sidebarwrapper.is(':not(:visible)');
}
function toggle_sidebar() {
if (sidebar_is_collapsed())
expand_sidebar();
else
collapse_sidebar();
}
function collapse_sidebar() {
sidebarwrapper.hide();
sidebar.css('width', ssb_width_collapsed);
bodywrapper.css('margin-left', bw_margin_collapsed);
sidebarbutton.css({
'margin-left': '0',
'height': bodywrapper.height()
});
sidebarbutton.find('span').text('»');
sidebarbutton.attr('title', _('Expand sidebar'));
document.cookie = 'sidebar=collapsed';
}
function expand_sidebar() {
bodywrapper.css('margin-left', bw_margin_expanded);
sidebar.css('width', ssb_width_expanded);
sidebarwrapper.show();
sidebarbutton.css({
'margin-left': ssb_width_expanded-12,
'height': bodywrapper.height()
});
sidebarbutton.find('span').text('«');
sidebarbutton.attr('title', _('Collapse sidebar'));
document.cookie = 'sidebar=expanded';
}
function add_sidebar_button() {
sidebarwrapper.css({
'float': 'left',
'margin-right': '0',
'width': ssb_width_expanded - 28
});
// create the button
sidebar.append(
'<div id="sidebarbutton"><span>&laquo;</span></div>'
);
var sidebarbutton = $('#sidebarbutton');
light_color = sidebarbutton.css('background-color');
// find the height of the viewport to center the '<<' in the page
var viewport_height;
if (window.innerHeight)
viewport_height = window.innerHeight;
else
viewport_height = $(window).height();
sidebarbutton.find('span').css({
'display': 'block',
'margin-top': (viewport_height - sidebar.position().top - 20) / 2
});
sidebarbutton.click(toggle_sidebar);
sidebarbutton.attr('title', _('Collapse sidebar'));
sidebarbutton.css({
'color': '#FFFFFF',
'border-left': '1px solid ' + dark_color,
'font-size': '1.2em',
'cursor': 'pointer',
'height': bodywrapper.height(),
'padding-top': '1px',
'margin-left': ssb_width_expanded - 12
});
sidebarbutton.hover(
function () {
$(this).css('background-color', dark_color);
},
function () {
$(this).css('background-color', light_color);
}
);
}
function set_position_from_cookie() {
if (!document.cookie)
return;
var items = document.cookie.split(';');
for(var k=0; k<items.length; k++) {
var key_val = items[k].split('=');
var key = key_val[0].replace(/ /, ""); // strip leading spaces
if (key == 'sidebar') {
var value = key_val[1];
if ((value == 'collapsed') && (!sidebar_is_collapsed()))
collapse_sidebar();
else if ((value == 'expanded') && (sidebar_is_collapsed()))
expand_sidebar();
}
}
}
add_sidebar_button();
var sidebarbutton = $('#sidebarbutton');
set_position_from_cookie();
});

View file

@ -1,31 +0,0 @@
// Underscore.js 1.3.1
// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
// Underscore is freely distributable under the MIT license.
// Portions of Underscore are inspired or borrowed from Prototype,
// Oliver Steele's Functional, and John Resig's Micro-Templating.
// For all details and documentation:
// http://documentcloud.github.com/underscore
(function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source==
c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c,
h)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION="1.3.1";var j=b.each=
b.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e<f;e++){if(e in a&&c.call(d,a[e],e,a)===n)break}else for(e in a)if(b.has(a,e)&&c.call(d,a[e],e,a)===n)break};b.map=b.collect=function(a,c,b){var e=[];if(a==null)return e;if(x&&a.map===x)return a.map(c,b);j(a,function(a,g,h){e[e.length]=c.call(b,a,g,h)});if(a.length===+a.length)e.length=a.length;return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var f=arguments.length>2;a==
null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect=
function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e=
e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck=
function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b<e.computed&&(e={value:a,computed:b})});
return e.value};b.shuffle=function(a){var b=[],d;j(a,function(a,f){f==0?b[0]=a:(d=Math.floor(Math.random()*(f+1)),b[f]=b[d],b[d]=a)});return b};b.sortBy=function(a,c,d){return b.pluck(b.map(a,function(a,b,g){return{value:a,criteria:c.call(d,a,b,g)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;return c<d?-1:c>d?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a,
c,d){d||(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){return!a?[]:a.toArray?a.toArray():b.isArray(a)?i.call(a):b.isArguments(a)?i.call(a):b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=b.head=function(a,b,d){return b!=null&&!d?i.call(a,0,b):a[0]};b.initial=function(a,b,d){return i.call(a,0,a.length-(b==null||d?1:b))};b.last=function(a,b,d){return b!=null&&!d?i.call(a,Math.max(a.length-b,0)):a[a.length-1]};b.rest=
b.tail=function(a,b,d){return i.call(a,b==null||d?1:b)};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a,c){return b.reduce(a,function(a,e){if(b.isArray(e))return a.concat(c?e:b.flatten(e));a[a.length]=e;return a},[])};b.without=function(a){return b.difference(a,i.call(arguments,1))};b.uniq=b.unique=function(a,c,d){var d=d?b.map(a,d):a,e=[];b.reduce(d,function(d,g,h){if(0==h||(c===true?b.last(d)!=g:!b.include(d,g)))d[d.length]=g,e[e.length]=a[h];return d},[]);
return e};b.union=function(){return b.uniq(b.flatten(arguments,true))};b.intersection=b.intersect=function(a){var c=i.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,""+e);return d};b.indexOf=function(a,c,
d){if(a==null)return-1;var e;if(d)return d=b.sortedIndex(a,c),a[d]===c?d:-1;if(p&&a.indexOf===p)return a.indexOf(c);for(d=0,e=a.length;d<e;d++)if(d in a&&a[d]===c)return d;return-1};b.lastIndexOf=function(a,b){if(a==null)return-1;if(D&&a.lastIndexOf===D)return a.lastIndexOf(b);for(var d=a.length;d--;)if(d in a&&a[d]===b)return d;return-1};b.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);for(var d=arguments[2]||1,e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;)g[f++]=a,a+=d;return g};
var F=function(){};b.bind=function(a,c){var d,e;if(a.bind===s&&s)return s.apply(a,i.call(arguments,1));if(!b.isFunction(a))throw new TypeError;e=i.call(arguments,2);return d=function(){if(!(this instanceof d))return a.apply(c,e.concat(i.call(arguments)));F.prototype=a.prototype;var b=new F,g=a.apply(b,e.concat(i.call(arguments)));return Object(g)===g?g:b}};b.bindAll=function(a){var c=i.call(arguments,1);c.length==0&&(c=b.functions(a));j(c,function(c){a[c]=b.bind(a[c],a)});return a};b.memoize=function(a,
c){var d={};c||(c=b.identity);return function(){var e=c.apply(this,arguments);return b.has(d,e)?d[e]:d[e]=a.apply(this,arguments)}};b.delay=function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(i.call(arguments,1)))};b.throttle=function(a,c){var d,e,f,g,h,i=b.debounce(function(){h=g=false},c);return function(){d=this;e=arguments;var b;f||(f=setTimeout(function(){f=null;h&&a.apply(d,e);i()},c));g?h=true:
a.apply(d,e);i();g=true}};b.debounce=function(a,b){var d;return function(){var e=this,f=arguments;clearTimeout(d);d=setTimeout(function(){d=null;a.apply(e,f)},b)}};b.once=function(a){var b=false,d;return function(){if(b)return d;b=true;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=[a].concat(i.call(arguments,0));return b.apply(this,d)}};b.compose=function(){var a=arguments;return function(){for(var b=arguments,d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}};
b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments,
1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)};
b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"};
b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.escape=function(a){return(""+a).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")};b.mixin=function(a){j(b.functions(a),
function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return"',_.escape("+
u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]=
function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain=
true;return this};m.prototype.value=function(){return this._wrapped}}).call(this);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 372 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 363 B

View file

@ -1,808 +0,0 @@
/*
* websupport.js
* ~~~~~~~~~~~~~
*
* sphinx.websupport utilties for all documentation.
*
* :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
(function($) {
$.fn.autogrow = function() {
return this.each(function() {
var textarea = this;
$.fn.autogrow.resize(textarea);
$(textarea)
.focus(function() {
textarea.interval = setInterval(function() {
$.fn.autogrow.resize(textarea);
}, 500);
})
.blur(function() {
clearInterval(textarea.interval);
});
});
};
$.fn.autogrow.resize = function(textarea) {
var lineHeight = parseInt($(textarea).css('line-height'), 10);
var lines = textarea.value.split('\n');
var columns = textarea.cols;
var lineCount = 0;
$.each(lines, function() {
lineCount += Math.ceil(this.length / columns) || 1;
});
var height = lineHeight * (lineCount + 1);
$(textarea).css('height', height);
};
})(jQuery);
(function($) {
var comp, by;
function init() {
initEvents();
initComparator();
}
function initEvents() {
$('a.comment-close').live("click", function(event) {
event.preventDefault();
hide($(this).attr('id').substring(2));
});
$('a.vote').live("click", function(event) {
event.preventDefault();
handleVote($(this));
});
$('a.reply').live("click", function(event) {
event.preventDefault();
openReply($(this).attr('id').substring(2));
});
$('a.close-reply').live("click", function(event) {
event.preventDefault();
closeReply($(this).attr('id').substring(2));
});
$('a.sort-option').live("click", function(event) {
event.preventDefault();
handleReSort($(this));
});
$('a.show-proposal').live("click", function(event) {
event.preventDefault();
showProposal($(this).attr('id').substring(2));
});
$('a.hide-proposal').live("click", function(event) {
event.preventDefault();
hideProposal($(this).attr('id').substring(2));
});
$('a.show-propose-change').live("click", function(event) {
event.preventDefault();
showProposeChange($(this).attr('id').substring(2));
});
$('a.hide-propose-change').live("click", function(event) {
event.preventDefault();
hideProposeChange($(this).attr('id').substring(2));
});
$('a.accept-comment').live("click", function(event) {
event.preventDefault();
acceptComment($(this).attr('id').substring(2));
});
$('a.delete-comment').live("click", function(event) {
event.preventDefault();
deleteComment($(this).attr('id').substring(2));
});
$('a.comment-markup').live("click", function(event) {
event.preventDefault();
toggleCommentMarkupBox($(this).attr('id').substring(2));
});
}
/**
* Set comp, which is a comparator function used for sorting and
* inserting comments into the list.
*/
function setComparator() {
// If the first three letters are "asc", sort in ascending order
// and remove the prefix.
if (by.substring(0,3) == 'asc') {
var i = by.substring(3);
comp = function(a, b) { return a[i] - b[i]; };
} else {
// Otherwise sort in descending order.
comp = function(a, b) { return b[by] - a[by]; };
}
// Reset link styles and format the selected sort option.
$('a.sel').attr('href', '#').removeClass('sel');
$('a.by' + by).removeAttr('href').addClass('sel');
}
/**
* Create a comp function. If the user has preferences stored in
* the sortBy cookie, use those, otherwise use the default.
*/
function initComparator() {
by = 'rating'; // Default to sort by rating.
// If the sortBy cookie is set, use that instead.
if (document.cookie.length > 0) {
var start = document.cookie.indexOf('sortBy=');
if (start != -1) {
start = start + 7;
var end = document.cookie.indexOf(";", start);
if (end == -1) {
end = document.cookie.length;
by = unescape(document.cookie.substring(start, end));
}
}
}
setComparator();
}
/**
* Show a comment div.
*/
function show(id) {
$('#ao' + id).hide();
$('#ah' + id).show();
var context = $.extend({id: id}, opts);
var popup = $(renderTemplate(popupTemplate, context)).hide();
popup.find('textarea[name="proposal"]').hide();
popup.find('a.by' + by).addClass('sel');
var form = popup.find('#cf' + id);
form.submit(function(event) {
event.preventDefault();
addComment(form);
});
$('#s' + id).after(popup);
popup.slideDown('fast', function() {
getComments(id);
});
}
/**
* Hide a comment div.
*/
function hide(id) {
$('#ah' + id).hide();
$('#ao' + id).show();
var div = $('#sc' + id);
div.slideUp('fast', function() {
div.remove();
});
}
/**
* Perform an ajax request to get comments for a node
* and insert the comments into the comments tree.
*/
function getComments(id) {
$.ajax({
type: 'GET',
url: opts.getCommentsURL,
data: {node: id},
success: function(data, textStatus, request) {
var ul = $('#cl' + id);
var speed = 100;
$('#cf' + id)
.find('textarea[name="proposal"]')
.data('source', data.source);
if (data.comments.length === 0) {
ul.html('<li>No comments yet.</li>');
ul.data('empty', true);
} else {
// If there are comments, sort them and put them in the list.
var comments = sortComments(data.comments);
speed = data.comments.length * 100;
appendComments(comments, ul);
ul.data('empty', false);
}
$('#cn' + id).slideUp(speed + 200);
ul.slideDown(speed);
},
error: function(request, textStatus, error) {
showError('Oops, there was a problem retrieving the comments.');
},
dataType: 'json'
});
}
/**
* Add a comment via ajax and insert the comment into the comment tree.
*/
function addComment(form) {
var node_id = form.find('input[name="node"]').val();
var parent_id = form.find('input[name="parent"]').val();
var text = form.find('textarea[name="comment"]').val();
var proposal = form.find('textarea[name="proposal"]').val();
if (text == '') {
showError('Please enter a comment.');
return;
}
// Disable the form that is being submitted.
form.find('textarea,input').attr('disabled', 'disabled');
// Send the comment to the server.
$.ajax({
type: "POST",
url: opts.addCommentURL,
dataType: 'json',
data: {
node: node_id,
parent: parent_id,
text: text,
proposal: proposal
},
success: function(data, textStatus, error) {
// Reset the form.
if (node_id) {
hideProposeChange(node_id);
}
form.find('textarea')
.val('')
.add(form.find('input'))
.removeAttr('disabled');
var ul = $('#cl' + (node_id || parent_id));
if (ul.data('empty')) {
$(ul).empty();
ul.data('empty', false);
}
insertComment(data.comment);
var ao = $('#ao' + node_id);
ao.find('img').attr({'src': opts.commentBrightImage});
if (node_id) {
// if this was a "root" comment, remove the commenting box
// (the user can get it back by reopening the comment popup)
$('#ca' + node_id).slideUp();
}
},
error: function(request, textStatus, error) {
form.find('textarea,input').removeAttr('disabled');
showError('Oops, there was a problem adding the comment.');
}
});
}
/**
* Recursively append comments to the main comment list and children
* lists, creating the comment tree.
*/
function appendComments(comments, ul) {
$.each(comments, function() {
var div = createCommentDiv(this);
ul.append($(document.createElement('li')).html(div));
appendComments(this.children, div.find('ul.comment-children'));
// To avoid stagnating data, don't store the comments children in data.
this.children = null;
div.data('comment', this);
});
}
/**
* After adding a new comment, it must be inserted in the correct
* location in the comment tree.
*/
function insertComment(comment) {
var div = createCommentDiv(comment);
// To avoid stagnating data, don't store the comments children in data.
comment.children = null;
div.data('comment', comment);
var ul = $('#cl' + (comment.node || comment.parent));
var siblings = getChildren(ul);
var li = $(document.createElement('li'));
li.hide();
// Determine where in the parents children list to insert this comment.
for(i=0; i < siblings.length; i++) {
if (comp(comment, siblings[i]) <= 0) {
$('#cd' + siblings[i].id)
.parent()
.before(li.html(div));
li.slideDown('fast');
return;
}
}
// If we get here, this comment rates lower than all the others,
// or it is the only comment in the list.
ul.append(li.html(div));
li.slideDown('fast');
}
function acceptComment(id) {
$.ajax({
type: 'POST',
url: opts.acceptCommentURL,
data: {id: id},
success: function(data, textStatus, request) {
$('#cm' + id).fadeOut('fast');
$('#cd' + id).removeClass('moderate');
},
error: function(request, textStatus, error) {
showError('Oops, there was a problem accepting the comment.');
}
});
}
function deleteComment(id) {
$.ajax({
type: 'POST',
url: opts.deleteCommentURL,
data: {id: id},
success: function(data, textStatus, request) {
var div = $('#cd' + id);
if (data == 'delete') {
// Moderator mode: remove the comment and all children immediately
div.slideUp('fast', function() {
div.remove();
});
return;
}
// User mode: only mark the comment as deleted
div
.find('span.user-id:first')
.text('[deleted]').end()
.find('div.comment-text:first')
.text('[deleted]').end()
.find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id +
', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id)
.remove();
var comment = div.data('comment');
comment.username = '[deleted]';
comment.text = '[deleted]';
div.data('comment', comment);
},
error: function(request, textStatus, error) {
showError('Oops, there was a problem deleting the comment.');
}
});
}
function showProposal(id) {
$('#sp' + id).hide();
$('#hp' + id).show();
$('#pr' + id).slideDown('fast');
}
function hideProposal(id) {
$('#hp' + id).hide();
$('#sp' + id).show();
$('#pr' + id).slideUp('fast');
}
function showProposeChange(id) {
$('#pc' + id).hide();
$('#hc' + id).show();
var textarea = $('#pt' + id);
textarea.val(textarea.data('source'));
$.fn.autogrow.resize(textarea[0]);
textarea.slideDown('fast');
}
function hideProposeChange(id) {
$('#hc' + id).hide();
$('#pc' + id).show();
var textarea = $('#pt' + id);
textarea.val('').removeAttr('disabled');
textarea.slideUp('fast');
}
function toggleCommentMarkupBox(id) {
$('#mb' + id).toggle();
}
/** Handle when the user clicks on a sort by link. */
function handleReSort(link) {
var classes = link.attr('class').split(/\s+/);
for (var i=0; i<classes.length; i++) {
if (classes[i] != 'sort-option') {
by = classes[i].substring(2);
}
}
setComparator();
// Save/update the sortBy cookie.
var expiration = new Date();
expiration.setDate(expiration.getDate() + 365);
document.cookie= 'sortBy=' + escape(by) +
';expires=' + expiration.toUTCString();
$('ul.comment-ul').each(function(index, ul) {
var comments = getChildren($(ul), true);
comments = sortComments(comments);
appendComments(comments, $(ul).empty());
});
}
/**
* Function to process a vote when a user clicks an arrow.
*/
function handleVote(link) {
if (!opts.voting) {
showError("You'll need to login to vote.");
return;
}
var id = link.attr('id');
if (!id) {
// Didn't click on one of the voting arrows.
return;
}
// If it is an unvote, the new vote value is 0,
// Otherwise it's 1 for an upvote, or -1 for a downvote.
var value = 0;
if (id.charAt(1) != 'u') {
value = id.charAt(0) == 'u' ? 1 : -1;
}
// The data to be sent to the server.
var d = {
comment_id: id.substring(2),
value: value
};
// Swap the vote and unvote links.
link.hide();
$('#' + id.charAt(0) + (id.charAt(1) == 'u' ? 'v' : 'u') + d.comment_id)
.show();
// The div the comment is displayed in.
var div = $('div#cd' + d.comment_id);
var data = div.data('comment');
// If this is not an unvote, and the other vote arrow has
// already been pressed, unpress it.
if ((d.value !== 0) && (data.vote === d.value * -1)) {
$('#' + (d.value == 1 ? 'd' : 'u') + 'u' + d.comment_id).hide();
$('#' + (d.value == 1 ? 'd' : 'u') + 'v' + d.comment_id).show();
}
// Update the comments rating in the local data.
data.rating += (data.vote === 0) ? d.value : (d.value - data.vote);
data.vote = d.value;
div.data('comment', data);
// Change the rating text.
div.find('.rating:first')
.text(data.rating + ' point' + (data.rating == 1 ? '' : 's'));
// Send the vote information to the server.
$.ajax({
type: "POST",
url: opts.processVoteURL,
data: d,
error: function(request, textStatus, error) {
showError('Oops, there was a problem casting that vote.');
}
});
}
/**
* Open a reply form used to reply to an existing comment.
*/
function openReply(id) {
// Swap out the reply link for the hide link
$('#rl' + id).hide();
$('#cr' + id).show();
// Add the reply li to the children ul.
var div = $(renderTemplate(replyTemplate, {id: id})).hide();
$('#cl' + id)
.prepend(div)
// Setup the submit handler for the reply form.
.find('#rf' + id)
.submit(function(event) {
event.preventDefault();
addComment($('#rf' + id));
closeReply(id);
})
.find('input[type=button]')
.click(function() {
closeReply(id);
});
div.slideDown('fast', function() {
$('#rf' + id).find('textarea').focus();
});
}
/**
* Close the reply form opened with openReply.
*/
function closeReply(id) {
// Remove the reply div from the DOM.
$('#rd' + id).slideUp('fast', function() {
$(this).remove();
});
// Swap out the hide link for the reply link
$('#cr' + id).hide();
$('#rl' + id).show();
}
/**
* Recursively sort a tree of comments using the comp comparator.
*/
function sortComments(comments) {
comments.sort(comp);
$.each(comments, function() {
this.children = sortComments(this.children);
});
return comments;
}
/**
* Get the children comments from a ul. If recursive is true,
* recursively include childrens' children.
*/
function getChildren(ul, recursive) {
var children = [];
ul.children().children("[id^='cd']")
.each(function() {
var comment = $(this).data('comment');
if (recursive)
comment.children = getChildren($(this).find('#cl' + comment.id), true);
children.push(comment);
});
return children;
}
/** Create a div to display a comment in. */
function createCommentDiv(comment) {
if (!comment.displayed && !opts.moderator) {
return $('<div class="moderate">Thank you! Your comment will show up '
+ 'once it is has been approved by a moderator.</div>');
}
// Prettify the comment rating.
comment.pretty_rating = comment.rating + ' point' +
(comment.rating == 1 ? '' : 's');
// Make a class (for displaying not yet moderated comments differently)
comment.css_class = comment.displayed ? '' : ' moderate';
// Create a div for this comment.
var context = $.extend({}, opts, comment);
var div = $(renderTemplate(commentTemplate, context));
// If the user has voted on this comment, highlight the correct arrow.
if (comment.vote) {
var direction = (comment.vote == 1) ? 'u' : 'd';
div.find('#' + direction + 'v' + comment.id).hide();
div.find('#' + direction + 'u' + comment.id).show();
}
if (opts.moderator || comment.text != '[deleted]') {
div.find('a.reply').show();
if (comment.proposal_diff)
div.find('#sp' + comment.id).show();
if (opts.moderator && !comment.displayed)
div.find('#cm' + comment.id).show();
if (opts.moderator || (opts.username == comment.username))
div.find('#dc' + comment.id).show();
}
return div;
}
/**
* A simple template renderer. Placeholders such as <%id%> are replaced
* by context['id'] with items being escaped. Placeholders such as <#id#>
* are not escaped.
*/
function renderTemplate(template, context) {
var esc = $(document.createElement('div'));
function handle(ph, escape) {
var cur = context;
$.each(ph.split('.'), function() {
cur = cur[this];
});
return escape ? esc.text(cur || "").html() : cur;
}
return template.replace(/<([%#])([\w\.]*)\1>/g, function() {
return handle(arguments[2], arguments[1] == '%' ? true : false);
});
}
/** Flash an error message briefly. */
function showError(message) {
$(document.createElement('div')).attr({'class': 'popup-error'})
.append($(document.createElement('div'))
.attr({'class': 'error-message'}).text(message))
.appendTo('body')
.fadeIn("slow")
.delay(2000)
.fadeOut("slow");
}
/** Add a link the user uses to open the comments popup. */
$.fn.comment = function() {
return this.each(function() {
var id = $(this).attr('id').substring(1);
var count = COMMENT_METADATA[id];
var title = count + ' comment' + (count == 1 ? '' : 's');
var image = count > 0 ? opts.commentBrightImage : opts.commentImage;
var addcls = count == 0 ? ' nocomment' : '';
$(this)
.append(
$(document.createElement('a')).attr({
href: '#',
'class': 'sphinx-comment-open' + addcls,
id: 'ao' + id
})
.append($(document.createElement('img')).attr({
src: image,
alt: 'comment',
title: title
}))
.click(function(event) {
event.preventDefault();
show($(this).attr('id').substring(2));
})
)
.append(
$(document.createElement('a')).attr({
href: '#',
'class': 'sphinx-comment-close hidden',
id: 'ah' + id
})
.append($(document.createElement('img')).attr({
src: opts.closeCommentImage,
alt: 'close',
title: 'close'
}))
.click(function(event) {
event.preventDefault();
hide($(this).attr('id').substring(2));
})
);
});
};
var opts = {
processVoteURL: '/_process_vote',
addCommentURL: '/_add_comment',
getCommentsURL: '/_get_comments',
acceptCommentURL: '/_accept_comment',
deleteCommentURL: '/_delete_comment',
commentImage: '/static/_static/comment.png',
closeCommentImage: '/static/_static/comment-close.png',
loadingImage: '/static/_static/ajax-loader.gif',
commentBrightImage: '/static/_static/comment-bright.png',
upArrow: '/static/_static/up.png',
downArrow: '/static/_static/down.png',
upArrowPressed: '/static/_static/up-pressed.png',
downArrowPressed: '/static/_static/down-pressed.png',
voting: false,
moderator: false
};
if (typeof COMMENT_OPTIONS != "undefined") {
opts = jQuery.extend(opts, COMMENT_OPTIONS);
}
var popupTemplate = '\
<div class="sphinx-comments" id="sc<%id%>">\
<p class="sort-options">\
Sort by:\
<a href="#" class="sort-option byrating">best rated</a>\
<a href="#" class="sort-option byascage">newest</a>\
<a href="#" class="sort-option byage">oldest</a>\
</p>\
<div class="comment-header">Comments</div>\
<div class="comment-loading" id="cn<%id%>">\
loading comments... <img src="<%loadingImage%>" alt="" /></div>\
<ul id="cl<%id%>" class="comment-ul"></ul>\
<div id="ca<%id%>">\
<p class="add-a-comment">Add a comment\
(<a href="#" class="comment-markup" id="ab<%id%>">markup</a>):</p>\
<div class="comment-markup-box" id="mb<%id%>">\
reStructured text markup: <i>*emph*</i>, <b>**strong**</b>, \
<tt>``code``</tt>, \
code blocks: <tt>::</tt> and an indented block after blank line</div>\
<form method="post" id="cf<%id%>" class="comment-form" action="">\
<textarea name="comment" cols="80"></textarea>\
<p class="propose-button">\
<a href="#" id="pc<%id%>" class="show-propose-change">\
Propose a change &#9657;\
</a>\
<a href="#" id="hc<%id%>" class="hide-propose-change">\
Propose a change &#9663;\
</a>\
</p>\
<textarea name="proposal" id="pt<%id%>" cols="80"\
spellcheck="false"></textarea>\
<input type="submit" value="Add comment" />\
<input type="hidden" name="node" value="<%id%>" />\
<input type="hidden" name="parent" value="" />\
</form>\
</div>\
</div>';
var commentTemplate = '\
<div id="cd<%id%>" class="sphinx-comment<%css_class%>">\
<div class="vote">\
<div class="arrow">\
<a href="#" id="uv<%id%>" class="vote" title="vote up">\
<img src="<%upArrow%>" />\
</a>\
<a href="#" id="uu<%id%>" class="un vote" title="vote up">\
<img src="<%upArrowPressed%>" />\
</a>\
</div>\
<div class="arrow">\
<a href="#" id="dv<%id%>" class="vote" title="vote down">\
<img src="<%downArrow%>" id="da<%id%>" />\
</a>\
<a href="#" id="du<%id%>" class="un vote" title="vote down">\
<img src="<%downArrowPressed%>" />\
</a>\
</div>\
</div>\
<div class="comment-content">\
<p class="tagline comment">\
<span class="user-id"><%username%></span>\
<span class="rating"><%pretty_rating%></span>\
<span class="delta"><%time.delta%></span>\
</p>\
<div class="comment-text comment"><#text#></div>\
<p class="comment-opts comment">\
<a href="#" class="reply hidden" id="rl<%id%>">reply &#9657;</a>\
<a href="#" class="close-reply" id="cr<%id%>">reply &#9663;</a>\
<a href="#" id="sp<%id%>" class="show-proposal">proposal &#9657;</a>\
<a href="#" id="hp<%id%>" class="hide-proposal">proposal &#9663;</a>\
<a href="#" id="dc<%id%>" class="delete-comment hidden">delete</a>\
<span id="cm<%id%>" class="moderation hidden">\
<a href="#" id="ac<%id%>" class="accept-comment">accept</a>\
</span>\
</p>\
<pre class="proposal" id="pr<%id%>">\
<#proposal_diff#>\
</pre>\
<ul class="comment-children" id="cl<%id%>"></ul>\
</div>\
<div class="clearleft"></div>\
</div>\
</div>';
var replyTemplate = '\
<li>\
<div class="reply-div" id="rd<%id%>">\
<form id="rf<%id%>">\
<textarea name="comment" cols="80"></textarea>\
<input type="submit" value="Add reply" />\
<input type="button" value="Cancel" />\
<input type="hidden" name="parent" value="<%id%>" />\
<input type="hidden" name="node" value="" />\
</form>\
</div>\
</li>';
$(document).ready(function() {
init();
});
})(jQuery);
$(document).ready(function() {
// add comment anchors for all paragraphs that are commentable
$('.sphinx-has-comment').comment();
// highlight search words in search results
$("div.context").each(function() {
var params = $.getQueryParameters();
var terms = (params.q) ? params.q[0].split(/\s+/) : [];
var result = $(this);
$.each(terms, function() {
result.highlightText(this.toLowerCase(), 'highlighted');
});
});
// directly open comment window if requested
var anchor = document.location.hash;
if (anchor.substring(0, 9) == '#comment-') {
$('#ao' + anchor.substring(9)).click();
document.location.hash = '#s' + anchor.substring(9);
}
});

View file

@ -1,189 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../style.css"/>
<script src="../highlight.pack.js"></script>
<title>dyaml.constructor</title>
<base href="../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.constructor</small>
</div>
<div class="sidebar">
<a href="dyaml/constructor.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/constructor.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li><span class=" selected">dyaml.<a href="dyaml/constructor.html">constructor</a></span>
</li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li>dyaml.<a href="dyaml/node.html">node</a></li>
<li>dyaml.<a href="dyaml/representer.html">representer</a></li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li>dyaml.<a href="dyaml/style.html">style</a></li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><a class="anchor" id="constructNull"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/YAMLNull.html">YAMLNull</a> <a href="dyaml/constructor.html#constructNull">constructNull</a>(ref <a href="dyaml/node/Node.html">Node</a> node) @safe pure nothrow @nogc
</code></pre>
<div class="section "><p>Construct a _null _node.
</p>
</div>
</div></div><a class="anchor" id="constructMerge"></a><div class="symbol"><div class="description"><pre><code>public YAMLMerge <a href="dyaml/constructor.html#constructMerge">constructMerge</a>(ref <a href="dyaml/node/Node.html">Node</a> node) @safe pure nothrow @nogc
</code></pre>
<div class="section "><p>Construct a merge _node - a _node that merges another _node into a mapping.
</p>
</div>
</div></div><a class="anchor" id="constructBool"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">bool</a> <a href="dyaml/constructor.html#constructBool">constructBool</a>(ref <a href="dyaml/node/Node.html">Node</a> node) @safe
</code></pre>
<div class="section "><p>Construct a boolean _node.
</p>
</div>
</div></div><a class="anchor" id="constructLong"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">long</a> <a href="dyaml/constructor.html#constructLong">constructLong</a>(ref <a href="dyaml/node/Node.html">Node</a> node)
</code></pre>
<div class="section "><p>Construct an integer (long) _node.
</p>
</div>
</div></div><a class="anchor" id="constructReal"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">real</a> <a href="dyaml/constructor.html#constructReal">constructReal</a>(ref <a href="dyaml/node/Node.html">Node</a> node)
</code></pre>
<div class="section "><p>Construct a floating point (real) _node.
</p>
</div>
</div></div><a class="anchor" id="constructBinary"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">ubyte</a>[] <a href="dyaml/constructor.html#constructBinary">constructBinary</a>(ref <a href="dyaml/node/Node.html">Node</a> node)
</code></pre>
<div class="section "><p>Construct a binary (base64) _node.
</p>
</div>
</div></div><a class="anchor" id="constructTimestamp"></a><div class="symbol"><div class="description"><pre><code>public SysTime <a href="dyaml/constructor.html#constructTimestamp">constructTimestamp</a>(ref <a href="dyaml/node/Node.html">Node</a> node)
</code></pre>
<div class="section "><p>Construct a timestamp (SysTime) _node.
</p>
</div>
</div></div><a class="anchor" id="constructString"></a><div class="symbol"><div class="description"><pre><code>public string <a href="dyaml/constructor.html#constructString">constructString</a>(ref <a href="dyaml/node/Node.html">Node</a> node)
</code></pre>
<div class="section "><p>Construct a string _node.
</p>
</div>
</div></div><a class="anchor" id="getPairs"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a>.Pair[] <a href="dyaml/constructor.html#getPairs">getPairs</a>(
string type,
<a href="dyaml/node/Node.html">Node</a>[] nodes)
</code></pre>
<div class="section "><p>Convert a sequence of single-element mappings into a sequence of pairs.
</p>
</div>
</div></div><a class="anchor" id="constructOrderedMap"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a>.Pair[] <a href="dyaml/constructor.html#constructOrderedMap">constructOrderedMap</a>(ref <a href="dyaml/node/Node.html">Node</a> node)
</code></pre>
<div class="section "><p>Construct an ordered map (ordered sequence of key:value pairs without duplicates) _node.
</p>
</div>
</div></div><a class="anchor" id="constructPairs"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a>.Pair[] <a href="dyaml/constructor.html#constructPairs">constructPairs</a>(ref <a href="dyaml/node/Node.html">Node</a> node)
</code></pre>
<div class="section "><p>Construct a pairs (ordered sequence of key: value pairs allowing duplicates) _node.
</p>
</div>
</div></div><a class="anchor" id="constructSet"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a>[] <a href="dyaml/constructor.html#constructSet">constructSet</a>(ref <a href="dyaml/node/Node.html">Node</a> node)
</code></pre>
<div class="section "><p>Construct a set _node.
</p>
</div>
</div></div><a class="anchor" id="constructSequence"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a>[] <a href="dyaml/constructor.html#constructSequence">constructSequence</a>(ref <a href="dyaml/node/Node.html">Node</a> node)
</code></pre>
<div class="section "><p>Construct a sequence (array) _node.
</p>
</div>
</div></div><a class="anchor" id="constructMap"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a>.Pair[] <a href="dyaml/constructor.html#constructMap">constructMap</a>(ref <a href="dyaml/node/Node.html">Node</a> node)
</code></pre>
<div class="section "><p>Construct an unordered map (unordered set of key:value _pairs without duplicates) _node.
</p>
</div>
</div></div><div class="description"><div class="section "><p>Class that processes YAML mappings, sequences and scalars into nodes. This can be
used to add custom data types. A tutorial can be found
<a href="../tutorials/custom_types.html">here</a>.
</p>
</div>
</div><div class="section members"><h2>Functions</h2><table><tr><td><a href="dyaml/constructor.html#constructNull">constructNull</a><span class="extrainfo"><span class="method-attribs"><span class="attr-safe">@safe</span>, <span class="attr-pure">pure</span>, <span class="attr-nothrow">nothrow</span>, <span class="attr-nogc">@nogc</span></span></span></td><td></td><td><p>Construct a _null _node.
</p>
</td></tr><tr><td><a href="dyaml/constructor.html#constructMerge">constructMerge</a><span class="extrainfo"><span class="method-attribs"><span class="attr-safe">@safe</span>, <span class="attr-pure">pure</span>, <span class="attr-nothrow">nothrow</span>, <span class="attr-nogc">@nogc</span></span></span></td><td></td><td><p>Construct a merge _node - a _node that merges another _node into a mapping.
</p>
</td></tr><tr><td><a href="dyaml/constructor.html#constructBool">constructBool</a><span class="extrainfo"><span class="method-attribs"><span class="attr-safe">@safe</span></span></span></td><td></td><td><p>Construct a boolean _node.
</p>
</td></tr><tr><td><a href="dyaml/constructor.html#constructLong">constructLong</a><span class="extrainfo"></span></td><td></td><td><p>Construct an integer (long) _node.
</p>
</td></tr><tr><td><a href="dyaml/constructor.html#constructReal">constructReal</a><span class="extrainfo"></span></td><td></td><td><p>Construct a floating point (real) _node.
</p>
</td></tr><tr><td><a href="dyaml/constructor.html#constructBinary">constructBinary</a><span class="extrainfo"></span></td><td></td><td><p>Construct a binary (base64) _node.
</p>
</td></tr><tr><td><a href="dyaml/constructor.html#constructTimestamp">constructTimestamp</a><span class="extrainfo"></span></td><td></td><td><p>Construct a timestamp (SysTime) _node.
</p>
</td></tr><tr><td><a href="dyaml/constructor.html#constructString">constructString</a><span class="extrainfo"></span></td><td></td><td><p>Construct a string _node.
</p>
</td></tr><tr><td><a href="dyaml/constructor.html#getPairs">getPairs</a><span class="extrainfo"></span></td><td></td><td><p>Convert a sequence of single-element mappings into a sequence of pairs.
</p>
</td></tr><tr><td><a href="dyaml/constructor.html#constructOrderedMap">constructOrderedMap</a><span class="extrainfo"></span></td><td></td><td><p>Construct an ordered map (ordered sequence of key:value pairs without duplicates) _node.
</p>
</td></tr><tr><td><a href="dyaml/constructor.html#constructPairs">constructPairs</a><span class="extrainfo"></span></td><td></td><td><p>Construct a pairs (ordered sequence of key: value pairs allowing duplicates) _node.
</p>
</td></tr><tr><td><a href="dyaml/constructor.html#constructSet">constructSet</a><span class="extrainfo"></span></td><td></td><td><p>Construct a set _node.
</p>
</td></tr><tr><td><a href="dyaml/constructor.html#constructSequence">constructSequence</a><span class="extrainfo"></span></td><td></td><td><p>Construct a sequence (array) _node.
</p>
</td></tr><tr><td><a href="dyaml/constructor.html#constructMap">constructMap</a><span class="extrainfo"></span></td><td></td><td><p>Construct an unordered map (unordered set of key:value _pairs without duplicates) _node.
</p>
</td></tr></table><h2>Classes</h2><table><tr><td><a href="dyaml/constructor/Constructor.html">Constructor</a></td><td></td><td><p>Constructs YAML values.
</p>
</td></tr></table>
</div>
</div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,291 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../../style.css"/>
<script src="../../highlight.pack.js"></script>
<title>Constructor</title>
<base href="../../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.<a href=dyaml/constructor.html>constructor</a>.</small><span class="highlight">Constructor</span>
</div>
<div class="sidebar">
<a href="dyaml/constructor.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/constructor.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li><span class=" selected">dyaml.<a href="dyaml/constructor.html">constructor</a></span>
</li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li>dyaml.<a href="dyaml/node.html">node</a></li>
<li>dyaml.<a href="dyaml/representer.html">representer</a></li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li>dyaml.<a href="dyaml/style.html">style</a></li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><div class="description"><pre><code>public final class Constructor
</code></pre>
<div class="section "><p>Constructs YAML values.
</p>
</div>
<div class="section"><p>Each YAML scalar, sequence or mapping has a tag specifying its data type.
Constructor uses user-specifyable functions to create a node of desired
data type from a scalar, sequence or mapping.
</p>
<p> Each of these functions is associated with a tag, and can process either
a scalar, a sequence, or a mapping. The constructor passes each value to
the function with corresponding tag, which then returns the resulting value
that can be stored in a node.
</p>
<p> If a tag is detected with no known constructor function, it is considered an error.
</p>
</div>
</div><a class="anchor" id="this"></a><div class="symbol"><div class="description"><pre><code>public this(const Flag!"useDefaultConstructors" defaultConstructors = Yes.useDefaultConstructors) @safe nothrow
</code></pre>
<div class="section "><p>Construct a Constructor.
</p>
</div>
<div class="section"><p>/// If you don't want to support default YAML tags/data types, you can use
defaultConstructors to disable constructor functions for these.
</p>
<p>/// Params: defaultConstructors = Use constructors for default YAML tags?
</p>
</div>
</div></div><a class="anchor" id="addConstructorScalar"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/constructor/Constructor.html#addConstructorScalar">addConstructorScalar</a>(T)(
const string tag,
T function(ref <a href="dyaml/node/Node.html">Node</a>) ctor) @safe nothrow
</code></pre>
<div class="section "><p>Add a constructor function from scalar.
</p>
</div>
<div class="section"><p>The function must take a reference to <code class="d_inlinecode">Node</code> to construct from.
The node contains a string for scalars, <code class="d_inlinecode">Node[]</code> for sequences and
<code class="d_inlinecode">Node.Pair[]</code> for mappings.
</p>
<p> Any exception thrown by this function will be caught by D:YAML and
its message will be added to a <code class="d_inlinecode">YAMLException</code> that will also tell
the user which type failed to construct, and position in the file.
</p>
<p> The value returned by this function will be stored in the resulting node.
</p>
<p> Only one constructor function can be set for one tag.
</p>
<p> Structs and classes must implement the <code class="d_inlinecode">opCmp()</code> operator for D:YAML
support. The signature of the operator that must be implemented
is <code class="d_inlinecode">const int opCmp(ref const MyStruct s)</code> for structs where
<i>MyStruct</i> is the struct type, and <code class="d_inlinecode">int opCmp(Object o)</code> for
classes. Note that the class <code class="d_inlinecode">opCmp()</code> should not alter the compared
values - it is not const for compatibility reasons.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">tag</td><td class="paramDoc"><p>Tag for the function to handle.
</p>
</td></tr>
<tr class="param"><td class="paramName">ctor</td><td class="paramDoc"><p>Constructor function.
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Example</h2>
<pre><code> import std.string;
import dyaml.all;
struct MyStruct
{
int x, y, z;
//Any D:YAML type must have a custom opCmp operator.
//This is used for ordering in mappings.
const int opCmp(ref const MyStruct s)
{
if(x != s.x){return x - s.x;}
if(y != s.y){return y - s.y;}
if(z != s.z){return z - s.z;}
return 0;
}
}
MyStruct constructMyStructScalar(ref <a href="dyaml/node/Node.html">Node</a> node)
{
//Guaranteed to be string as we construct from scalar.
//!mystruct x:y:z
auto parts = node.as!string().split(":");
// If <a href="dyaml/constructor/Constructor.html#this">this</a> throws, the D:YAML will handle it and throw a <a href="dyaml/exception/YAMLException.html">YAMLException</a>.
return MyStruct(to!int(parts[0]), to!int(parts[1]), to!int(parts[2]));
}
void main()
{
auto loader = <a href="dyaml/loader/Loader.html">Loader</a>("file.yaml");
auto constructor = new <a href="dyaml/constructor/Constructor.html">Constructor</a>;
constructor.<a href="dyaml/constructor/Constructor.html#addConstructorScalar">addConstructorScalar</a>("!mystruct", &constructMyStructScalar);
loader.constructor = constructor;
<a href="dyaml/node/Node.html">Node</a> node = loader.load();
}
</code></pre>
</div>
</div></div><a class="anchor" id="addConstructorSequence"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/constructor/Constructor.html#addConstructorSequence">addConstructorSequence</a>(T)(
const string tag,
T function(ref <a href="dyaml/node/Node.html">Node</a>) ctor) @safe nothrow
</code></pre>
<div class="section "><p>Add a constructor function from sequence.
</p>
</div>
<div class="section"><h2>Example</h2>
<pre><code> import std.string;
import dyaml.all;
struct MyStruct
{
int x, y, z;
//Any D:YAML type must have a custom opCmp operator.
//This is used for ordering in mappings.
const int opCmp(ref const MyStruct s)
{
if(x != s.x){return x - s.x;}
if(y != s.y){return y - s.y;}
if(z != s.z){return z - s.z;}
return 0;
}
}
MyStruct constructMyStructSequence(ref <a href="dyaml/node/Node.html">Node</a> node)
{
//node is guaranteed to be sequence.
//!mystruct [x, y, z]
return MyStruct(node[0].as!int, node[1].as!int, node[2].as!int);
}
void main()
{
auto loader = <a href="dyaml/loader/Loader.html">Loader</a>("file.yaml");
auto constructor = new <a href="dyaml/constructor/Constructor.html">Constructor</a>;
constructor.<a href="dyaml/constructor/Constructor.html#addConstructorSequence">addConstructorSequence</a>("!mystruct", &constructMyStructSequence);
loader.constructor = constructor;
<a href="dyaml/node/Node.html">Node</a> node = loader.load();
}
</code></pre>
</div>
<div class="section seealso">
<h2>See Also:</h2>
<div class="seealso-content">
<pre class="prettyprint"><code><a href="dyaml/constructor/Constructor.html#addConstructorScalar">addConstructorScalar</a>
</code></pre>
</div>
</div>
</div></div><a class="anchor" id="addConstructorMapping"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/constructor/Constructor.html#addConstructorMapping">addConstructorMapping</a>(T)(
const string tag,
T function(ref <a href="dyaml/node/Node.html">Node</a>) ctor) @safe nothrow
</code></pre>
<div class="section "><p>Add a constructor function from a mapping.
</p>
</div>
<div class="section"><h2>Example</h2>
<pre><code> import std.string;
import dyaml.all;
struct MyStruct
{
int x, y, z;
//Any D:YAML type must have a custom opCmp operator.
//This is used for ordering in mappings.
const int opCmp(ref const MyStruct s)
{
if(x != s.x){return x - s.x;}
if(y != s.y){return y - s.y;}
if(z != s.z){return z - s.z;}
return 0;
}
}
MyStruct constructMyStructMapping(ref <a href="dyaml/node/Node.html">Node</a> node)
{
//node is guaranteed to be mapping.
//!mystruct {"x": x, "y": y, "z": z}
return MyStruct(node["x"].as!int, node["y"].as!int, node["z"].as!int);
}
void main()
{
auto loader = <a href="dyaml/loader/Loader.html">Loader</a>("file.yaml");
auto constructor = new <a href="dyaml/constructor/Constructor.html">Constructor</a>;
constructor.<a href="dyaml/constructor/Constructor.html#addConstructorMapping">addConstructorMapping</a>("!mystruct", &constructMyStructMapping);
loader.constructor = constructor;
<a href="dyaml/node/Node.html">Node</a> node = loader.load();
}
</code></pre>
</div>
<div class="section seealso">
<h2>See Also:</h2>
<div class="seealso-content">
<pre class="prettyprint"><code><a href="dyaml/constructor/Constructor.html#addConstructorScalar">addConstructorScalar</a>
</code></pre>
</div>
</div>
</div></div><div class="section members"><h2>Functions</h2><table><tr><td><a href="dyaml/constructor/Constructor.html#this">this</a></td><td></td><td><p>Construct a Constructor.
</p>
</td></tr><tr><td><a href="dyaml/constructor/Constructor.html#addConstructorScalar">addConstructorScalar</a><span class="extrainfo"><span class="method-attribs"><span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Add a constructor function from scalar.
</p>
</td></tr><tr><td><a href="dyaml/constructor/Constructor.html#addConstructorSequence">addConstructorSequence</a><span class="extrainfo"><span class="method-attribs"><span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Add a constructor function from sequence.
</p>
</td></tr><tr><td><a href="dyaml/constructor/Constructor.html#addConstructorMapping">addConstructorMapping</a><span class="extrainfo"><span class="method-attribs"><span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Add a constructor function from a mapping.
</p>
</td></tr></table>
</div>
</div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,64 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../style.css"/>
<script src="../highlight.pack.js"></script>
<title>dyaml.dumper</title>
<base href="../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.dumper</small>
</div>
<div class="sidebar">
<a href="dyaml/dumper.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/dumper.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li><span class=" selected">dyaml.<a href="dyaml/dumper.html">dumper</a></span>
</li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li>dyaml.<a href="dyaml/node.html">node</a></li>
<li>dyaml.<a href="dyaml/representer.html">representer</a></li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li>dyaml.<a href="dyaml/style.html">style</a></li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><div class="description"><div class="section "><p>YAML dumper.
</p>
</div>
<div class="section"><p>Code based on <a href="http://www.pyyaml.org">PyYAML</a>.
</p>
</div>
</div><div class="section members"><h2>Structs</h2><table><tr><td><a href="dyaml/dumper/Dumper.html">Dumper</a></td><td></td><td><p>Dumps YAML documents to files or streams.
</p>
</td></tr></table>
</div>
</div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,319 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../../style.css"/>
<script src="../../highlight.pack.js"></script>
<title>Dumper</title>
<base href="../../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.<a href=dyaml/dumper.html>dumper</a>.</small><span class="highlight">Dumper</span>
</div>
<div class="sidebar">
<a href="dyaml/dumper.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/dumper.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li><span class=" selected">dyaml.<a href="dyaml/dumper.html">dumper</a></span>
</li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li>dyaml.<a href="dyaml/node.html">node</a></li>
<li>dyaml.<a href="dyaml/representer.html">representer</a></li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li>dyaml.<a href="dyaml/style.html">style</a></li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><div class="description"><pre><code>public struct Dumper
</code></pre>
<div class="section "><p>Dumps YAML documents to files or streams.
</p>
</div>
<div class="section"><p>User specified Representer and/or Resolver can be used to support new
tags / data types.
</p>
<p>Setters are provided to affect output details (style, encoding, etc.).
</p>
</div>
<div class="section"><h2>Examples</h2>
Write to a file:
<pre><code>auto node = <a href="dyaml/node/Node.html">Node</a>([1, 2, 3, 4, 5]);
<a href="dyaml/dumper/Dumper.html">Dumper</a>("file.yaml").<a href="dyaml/dumper/Dumper.html#dump">dump</a>(node);</code></pre>
Write multiple YAML documents to a file:
<pre><code>auto node1 = <a href="dyaml/node/Node.html">Node</a>([1, 2, 3, 4, 5]);
auto node2 = <a href="dyaml/node/Node.html">Node</a>("This document contains only one string");
<a href="dyaml/dumper/Dumper.html">Dumper</a>("file.yaml").<a href="dyaml/dumper/Dumper.html#dump">dump</a>(node1, node2);
//Or with an array:
//<a href="dyaml/dumper/Dumper.html">Dumper</a>("file.yaml").<a href="dyaml/dumper/Dumper.html#dump">dump</a>([node1, node2]);
</code></pre>
Write to memory:
<pre><code>import std.stream;
auto stream = new MemoryStream();
auto node = <a href="dyaml/node/Node.html">Node</a>([1, 2, 3, 4, 5]);
<a href="dyaml/dumper/Dumper.html">Dumper</a>(stream).<a href="dyaml/dumper/Dumper.html#dump">dump</a>(node);</code></pre>
Use a custom representer/resolver to support custom data types and/or implicit tags:
<pre><code>auto node = <a href="dyaml/node/Node.html">Node</a>([1, 2, 3, 4, 5]);
auto <a href="dyaml/dumper/Dumper.html#representer">representer</a> = new <a href="dyaml/representer/Representer.html">Representer</a>();
auto <a href="dyaml/dumper/Dumper.html#resolver">resolver</a> = new <a href="dyaml/resolver/Resolver.html">Resolver</a>();
//Add <a href="dyaml/dumper/Dumper.html#representer">representer</a> functions / <a href="dyaml/dumper/Dumper.html#resolver">resolver</a> expressions here...
auto dumper = <a href="dyaml/dumper/Dumper.html">Dumper</a>("file.yaml");
dumper.<a href="dyaml/dumper/Dumper.html#representer">representer</a> = <a href="dyaml/dumper/Dumper.html#representer">representer</a>;
dumper.<a href="dyaml/dumper/Dumper.html#resolver">resolver</a> = <a href="dyaml/dumper/Dumper.html#resolver">resolver</a>;
dumper.<a href="dyaml/dumper/Dumper.html#dump">dump</a>(node);</code></pre>
</div>
</div><a class="anchor" id="this"></a><div class="symbol"><div class="description"><pre><code>public this(string filename) @trusted
</code></pre>
<div class="section "><p>Construct a Dumper writing to a file.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">filename</td><td class="paramDoc"><p>File name to write to.
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Throws</h2>
<p> YAMLException if the file can not be dumped to (e.g. cannot be opened).
</p>
</div>
</div></div><a class="anchor" id="this"></a><div class="symbol"><div class="description"><pre><code>public this(Stream stream) @safe
</code></pre>
<div class="section "><p>Construct a Dumper writing to a _stream. This is useful to e.g. write to memory.
</p>
</div>
</div></div><a class="anchor" id="name"></a><div class="symbol"><div class="description"><pre><code>public @property <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/dumper/Dumper.html#name">name</a>(string name) pure @safe nothrow
</code></pre>
<div class="section "><p>Set stream _name. Used in debugging messages.
</p>
</div>
</div></div><a class="anchor" id="resolver"></a><div class="symbol"><div class="description"><pre><code>public @property <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/dumper/Dumper.html#resolver">resolver</a>(<a href="dyaml/resolver/Resolver.html">Resolver</a> resolver) @trusted
</code></pre>
<div class="section "><p>Specify custom Resolver to use.
</p>
</div>
</div></div><a class="anchor" id="representer"></a><div class="symbol"><div class="description"><pre><code>public @property <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/dumper/Dumper.html#representer">representer</a>(<a href="dyaml/representer/Representer.html">Representer</a> representer) @trusted
</code></pre>
<div class="section "><p>Specify custom Representer to use.
</p>
</div>
</div></div><a class="anchor" id="canonical"></a><div class="symbol"><div class="description"><pre><code>public @property <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/dumper/Dumper.html#canonical">canonical</a>(<a href="http://dlang.org/type.html#basic-data-types">bool</a> canonical) pure @safe nothrow
</code></pre>
<div class="section "><p>Write scalars in _canonical form?
</p>
</div>
</div></div><a class="anchor" id="indent"></a><div class="symbol"><div class="description"><pre><code>public @property <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/dumper/Dumper.html#indent">indent</a>(<a href="http://dlang.org/type.html#basic-data-types">uint</a> indent) pure @safe nothrow
</code></pre>
<div class="section "><p>Set indentation width. 2 by default. Must not be zero.
</p>
</div>
<div class="section "><h2>Contracts</h2><pre><code>in
{
assert (<a href="dyaml/dumper/Dumper.html#indent">indent</a> != 0, "Can't use zero YAML <a href="dyaml/dumper/Dumper.html#indent">indent</a> width");
}
</code></pre>
</div>
</div></div><a class="anchor" id="textWidth"></a><div class="symbol"><div class="description"><pre><code>public @property <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/dumper/Dumper.html#textWidth">textWidth</a>(<a href="http://dlang.org/type.html#basic-data-types">uint</a> width) pure @safe nothrow
</code></pre>
<div class="section "><p>Set preferred text _width.
</p>
</div>
</div></div><a class="anchor" id="lineBreak"></a><div class="symbol"><div class="description"><pre><code>public @property <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/dumper/Dumper.html#lineBreak">lineBreak</a>(<a href="dyaml/linebreak/LineBreak.html">LineBreak</a> lineBreak) pure @safe nothrow
</code></pre>
<div class="section "><p>Set line break to use. Unix by default.
</p>
</div>
</div></div><a class="anchor" id="encoding"></a><div class="symbol"><div class="description"><pre><code>public @property <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/dumper/Dumper.html#encoding">encoding</a>(Encoding encoding) pure @safe nothrow
</code></pre>
<div class="section "><p>Set character _encoding to use. UTF-8 by default.
</p>
</div>
</div></div><a class="anchor" id="explicitStart"></a><div class="symbol"><div class="description"><pre><code>public @property <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/dumper/Dumper.html#explicitStart">explicitStart</a>(<a href="http://dlang.org/type.html#basic-data-types">bool</a> explicit) pure @safe nothrow
</code></pre>
<div class="section "><p>Always explicitly write document start?
</p>
</div>
</div></div><a class="anchor" id="explicitEnd"></a><div class="symbol"><div class="description"><pre><code>public @property <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/dumper/Dumper.html#explicitEnd">explicitEnd</a>(<a href="http://dlang.org/type.html#basic-data-types">bool</a> explicit) pure @safe nothrow
</code></pre>
<div class="section "><p>Always explicitly write document end?
</p>
</div>
</div></div><a class="anchor" id="YAMLVersion"></a><div class="symbol"><div class="description"><pre><code>public @property <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/dumper/Dumper.html#YAMLVersion">YAMLVersion</a>(string YAMLVersion) pure @safe nothrow
</code></pre>
<div class="section "><p>Specify YAML version string. "1.1" by default.
</p>
</div>
</div></div><a class="anchor" id="tagDirectives"></a><div class="symbol"><div class="description"><pre><code>public @property <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/dumper/Dumper.html#tagDirectives">tagDirectives</a>(string[string] tags) pure @trusted
</code></pre>
<div class="section "><p>Specify tag directives.
</p>
</div>
<div class="section"><p>A tag directive specifies a shorthand notation for specifying _tags.
Each tag directive associates a handle with a prefix. This allows for
compact tag notation.
</p>
<p>Each handle specified MUST start and end with a '!' character
(a single character "!" handle is allowed as well).
</p>
<p>Only alphanumeric characters, '-', and '__' may be used in handles.
</p>
<p>Each prefix MUST not be empty.
</p>
<p>The "!!" handle is used for default YAML _tags with prefix
</p>
</div>
<div class="section"><h2>"tag</h2>
<p>yaml.org,2002:". This can be overridden.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">tags</td><td class="paramDoc"><p>Tag directives (keys are handles, values are prefixes).
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Example</h2>
<pre><code><a href="dyaml/dumper/Dumper.html">Dumper</a> dumper = <a href="dyaml/dumper/Dumper.html">Dumper</a>("file.yaml");
string[string] directives;
directives["!short!"] = "tag:long.org,2011:";
//This will emit tags starting with "tag:long.org,2011"
//with a "!short!" prefix instead.
dumper.<a href="dyaml/dumper/Dumper.html#tagDirectives">tagDirectives</a>(directives);
dumper.<a href="dyaml/dumper/Dumper.html#dump">dump</a>(<a href="dyaml/node/Node.html">Node</a>("foo"));</code></pre>
</div>
</div></div><a class="anchor" id="dump"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/dumper/Dumper.html#dump">dump</a>(<a href="dyaml/node/Node.html">Node</a>[] documents...) @trusted
</code></pre>
<div class="section "><p>Dump one or more YAML _documents to the file/stream.
</p>
</div>
<div class="section"><p>Note that while you can call dump() multiple times on the same
dumper, you will end up writing multiple YAML "files" to the same
file/stream.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">documents</td><td class="paramDoc"><p>Documents to _dump (root nodes of the _documents).
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Throws</h2>
<p> YAMLException on error (e.g. invalid nodes,
unable to write to file/stream).
</p>
</div>
</div></div><div class="section members"><h2>Functions</h2><table><tr><td><a href="dyaml/dumper/Dumper.html#this">this</a></td><td></td><td><p>Construct a Dumper writing to a file.
</p>
</td></tr><tr><td><a href="dyaml/dumper/Dumper.html#this">this</a></td><td></td><td><p>Construct a Dumper writing to a _stream. This is useful to e.g. write to memory.
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/dumper/Dumper.html#name">name</a><span class="extrainfo"><span class="method-attribs"><span class="attr-pure">pure</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Set stream _name. Used in debugging messages.
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/dumper/Dumper.html#resolver">resolver</a><span class="extrainfo"><span class="method-attribs"><span class="attr-trusted">@trusted</span></span></span></td><td></td><td><p>Specify custom Resolver to use.
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/dumper/Dumper.html#representer">representer</a><span class="extrainfo"><span class="method-attribs"><span class="attr-trusted">@trusted</span></span></span></td><td></td><td><p>Specify custom Representer to use.
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/dumper/Dumper.html#canonical">canonical</a><span class="extrainfo"><span class="method-attribs"><span class="attr-pure">pure</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Write scalars in _canonical form?
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/dumper/Dumper.html#indent">indent</a><span class="extrainfo"><span class="method-attribs"><span class="attr-pure">pure</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Set indentation width. 2 by default. Must not be zero.
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/dumper/Dumper.html#textWidth">textWidth</a><span class="extrainfo"><span class="method-attribs"><span class="attr-pure">pure</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Set preferred text _width.
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/dumper/Dumper.html#lineBreak">lineBreak</a><span class="extrainfo"><span class="method-attribs"><span class="attr-pure">pure</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Set line break to use. Unix by default.
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/dumper/Dumper.html#encoding">encoding</a><span class="extrainfo"><span class="method-attribs"><span class="attr-pure">pure</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Set character _encoding to use. UTF-8 by default.
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/dumper/Dumper.html#explicitStart">explicitStart</a><span class="extrainfo"><span class="method-attribs"><span class="attr-pure">pure</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Always explicitly write document start?
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/dumper/Dumper.html#explicitEnd">explicitEnd</a><span class="extrainfo"><span class="method-attribs"><span class="attr-pure">pure</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Always explicitly write document end?
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/dumper/Dumper.html#YAMLVersion">YAMLVersion</a><span class="extrainfo"><span class="method-attribs"><span class="attr-pure">pure</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Specify YAML version string. "1.1" by default.
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/dumper/Dumper.html#tagDirectives">tagDirectives</a><span class="extrainfo"><span class="method-attribs"><span class="attr-pure">pure</span>, <span class="attr-trusted">@trusted</span></span></span></td><td></td><td><p>Specify tag directives.
</p>
</td></tr><tr><td><a href="dyaml/dumper/Dumper.html#dump">dump</a><span class="extrainfo"><span class="method-attribs"><span class="attr-trusted">@trusted</span></span></span></td><td></td><td><p>Dump one or more YAML _documents to the file/stream.
</p>
</td></tr></table>
</div>
</div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,59 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../style.css"/>
<script src="../highlight.pack.js"></script>
<title>dyaml.exception</title>
<base href="../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.exception</small>
</div>
<div class="sidebar">
<a href="dyaml/exception.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/exception.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li><span class=" selected">dyaml.<a href="dyaml/exception.html">exception</a></span>
</li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li>dyaml.<a href="dyaml/node.html">node</a></li>
<li>dyaml.<a href="dyaml/representer.html">representer</a></li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li>dyaml.<a href="dyaml/style.html">style</a></li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><div class="description"><div class="section "><p>Exceptions thrown by D:YAML and _exception related code.
</p>
</div>
</div><div class="section members"><h2>Classes</h2><table><tr><td><a href="dyaml/exception/YAMLException.html">YAMLException</a></td><td></td><td><p>Base class for all exceptions thrown by D:YAML.
</p>
</td></tr></table>
</div>
</div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,71 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../../style.css"/>
<script src="../../highlight.pack.js"></script>
<title>YAMLException</title>
<base href="../../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.<a href=dyaml/exception.html>exception</a>.</small><span class="highlight">YAMLException</span>
</div>
<div class="sidebar">
<a href="dyaml/exception.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/exception.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li><span class=" selected">dyaml.<a href="dyaml/exception.html">exception</a></span>
</li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li>dyaml.<a href="dyaml/node.html">node</a></li>
<li>dyaml.<a href="dyaml/representer.html">representer</a></li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li>dyaml.<a href="dyaml/style.html">style</a></li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><div class="description"><pre><code>public class YAMLException : Exception
</code></pre>
<div class="section "><p>Base class for all exceptions thrown by D:YAML.
</p>
</div>
</div><a class="anchor" id="this"></a><div class="symbol"><div class="description"><pre><code>public this(
string msg,
string file = __FILE__,
size_t line = __LINE__) @safe pure nothrow
</code></pre>
<div class="section "><p>Construct a YAMLException with specified message and position where it was thrown.
</p>
</div>
</div></div><div class="section members"><h2>Functions</h2><table><tr><td><a href="dyaml/exception/YAMLException.html#this">this</a></td><td></td><td><p>Construct a YAMLException with specified message and position where it was thrown.
</p>
</td></tr></table>
</div>
</div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,164 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../style.css"/>
<script src="../highlight.pack.js"></script>
<title>dyaml.hacks</title>
<base href="../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.hacks</small>
</div>
<div class="sidebar">
<a href="dyaml/hacks.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/hacks.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li><span class=" selected">dyaml.<a href="dyaml/hacks.html">hacks</a></span>
</li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li>dyaml.<a href="dyaml/node.html">node</a></li>
<li>dyaml.<a href="dyaml/representer.html">representer</a></li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li>dyaml.<a href="dyaml/style.html">style</a></li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><a class="anchor" id="scalarStyleHack"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/style/ScalarStyle.html">ScalarStyle</a> <a href="dyaml/hacks.html#scalarStyleHack">scalarStyleHack</a>(ref const(<a href="dyaml/node/Node.html">Node</a>) node) @safe nothrow
</code></pre>
<div class="section "><p>Get the scalar style a node had in the file it was loaded from.
</p>
</div>
<div class="section"><p>This is only useful for nodes loaded from files.
</p>
<p> This is a "hack" because a YAML application is supposed to be unaware of styles
used in YAML styles, i.e. treating different styles differently is unstandard.
However, determining style may be useful in some cases, e.g. YAML utilities.
</p>
<p> May only be called on scalar nodes (nodes where node.isScalar() == true).
</p>
</div>
<div class="section"><h2>Example</h2>
<pre><code> // <a href="dyaml/node/Node.html">Node</a> node // loaded from a file
if(node.isScalar)
{
import std.stdio;
writeln(node.<a href="dyaml/hacks.html#scalarStyleHack">scalarStyleHack</a>());
}
</code></pre>
</div>
</div></div><a class="anchor" id="collectionStyleHack"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/style/CollectionStyle.html">CollectionStyle</a> <a href="dyaml/hacks.html#collectionStyleHack">collectionStyleHack</a>(ref const(<a href="dyaml/node/Node.html">Node</a>) node) @safe nothrow
</code></pre>
<div class="section "><p>Get the collection style a YAML node had in the file it was loaded from.
</p>
</div>
<div class="section"><p>May only be called on collection nodes (nodes where node.isScalar() != true).
</p>
</div>
<div class="section seealso">
<h2>See Also:</h2>
<div class="seealso-content">
<p> scalarStyleHack
</p>
</div>
</div>
</div></div><a class="anchor" id="scalarStyleHack"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/hacks.html#scalarStyleHack">scalarStyleHack</a>(
ref <a href="dyaml/node/Node.html">Node</a> node,
const <a href="dyaml/style/ScalarStyle.html">ScalarStyle</a> rhs) @safe nothrow
</code></pre>
<div class="section "><p>Set the scalar style node should have when written to a file.
</p>
</div>
<div class="section"><p>Setting the style might be useful when generating YAML or reformatting existing files.
</p>
<p> May only be called on scalar nodes (nodes where node.isScalar() == true).
</p>
</div>
<div class="section "><h2>Example</h2>
<pre><code>writeln("D:YAML <a href="dyaml/hacks.html#scalarStyleHack">scalarStyleHack</a> setter unittest");
auto node = <a href="dyaml/node/Node.html">Node</a>(5);
node.<a href="dyaml/hacks.html#scalarStyleHack">scalarStyleHack</a> = <a href="dyaml/style/ScalarStyle.html#DoubleQuoted">ScalarStyle.DoubleQuoted</a>;
assert(node.<a href="dyaml/hacks.html#scalarStyleHack">scalarStyleHack</a>() == <a href="dyaml/style/ScalarStyle.html#DoubleQuoted">ScalarStyle.DoubleQuoted</a>);
</code></pre>
</div>
</div></div><a class="anchor" id="collectionStyleHack"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/hacks.html#collectionStyleHack">collectionStyleHack</a>(
ref <a href="dyaml/node/Node.html">Node</a> node,
const <a href="dyaml/style/CollectionStyle.html">CollectionStyle</a> rhs) @safe nothrow
</code></pre>
<div class="section "><p>Set the collection style node should have when written to a file.
</p>
</div>
<div class="section"><p>Setting the style might be useful when generating YAML or reformatting existing files.
</p>
<p> May only be called on collection nodes (nodes where node.isScalar() != true).
</p>
</div>
<div class="section "><h2>Example</h2>
<pre><code>writeln("D:YAML <a href="dyaml/hacks.html#collectionStyleHack">collectionStyleHack</a> setter unittest");
auto node = <a href="dyaml/node/Node.html">Node</a>([1, 2, 3, 4, 5]);
node.<a href="dyaml/hacks.html#collectionStyleHack">collectionStyleHack</a> = <a href="dyaml/style/CollectionStyle.html#Block">CollectionStyle.Block</a>;
assert(node.<a href="dyaml/hacks.html#collectionStyleHack">collectionStyleHack</a>() == <a href="dyaml/style/CollectionStyle.html#Block">CollectionStyle.Block</a>);
</code></pre>
</div>
</div></div><div class="description"><div class="section "><p>Functionality that may sometimes be needed but allows unsafe or unstandard behavior, and should only be used in specific cases.
</p>
</div>
</div><div class="section members"><h2>Functions</h2><table><tr><td><a href="dyaml/hacks.html#scalarStyleHack">scalarStyleHack</a><span class="extrainfo"><span class="method-attribs"><span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Get the scalar style a node had in the file it was loaded from.
</p>
</td></tr><tr><td><a href="dyaml/hacks.html#collectionStyleHack">collectionStyleHack</a><span class="extrainfo"><span class="method-attribs"><span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Get the collection style a YAML node had in the file it was loaded from.
</p>
</td></tr><tr><td><a href="dyaml/hacks.html#scalarStyleHack">scalarStyleHack</a><span class="extrainfo"><span class="method-attribs"><span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Set the scalar style node should have when written to a file.
</p>
</td></tr><tr><td><a href="dyaml/hacks.html#collectionStyleHack">collectionStyleHack</a><span class="extrainfo"><span class="method-attribs"><span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Set the collection style node should have when written to a file.
</p>
</td></tr></table>
</div>
</div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,54 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../style.css"/>
<script src="../highlight.pack.js"></script>
<title>dyaml.linebreak</title>
<base href="../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.linebreak</small>
</div>
<div class="sidebar">
<a href="dyaml/linebreak.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/linebreak.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li><span class=" selected">dyaml.<a href="dyaml/linebreak.html">linebreak</a></span>
</li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li>dyaml.<a href="dyaml/node.html">node</a></li>
<li>dyaml.<a href="dyaml/representer.html">representer</a></li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li>dyaml.<a href="dyaml/style.html">style</a></li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><div class="description"></div><div class="section members"><h2>Enums</h2><table><tr><td><a href="dyaml/linebreak/LineBreak.html">LineBreak</a></td><td></td><td><p>Enumerates platform specific line breaks.
</p>
</td></tr></table>
</div>
</div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,65 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../../style.css"/>
<script src="../../highlight.pack.js"></script>
<title>LineBreak</title>
<base href="../../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.<a href=dyaml/linebreak.html>linebreak</a>.</small><span class="highlight">LineBreak</span>
</div>
<div class="sidebar">
<a href="dyaml/linebreak.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/linebreak.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li><span class=" selected">dyaml.<a href="dyaml/linebreak.html">linebreak</a></span>
</li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li>dyaml.<a href="dyaml/node.html">node</a></li>
<li>dyaml.<a href="dyaml/representer.html">representer</a></li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li>dyaml.<a href="dyaml/style.html">style</a></li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><div class="description"><pre><code>public enum LineBreak
</code></pre>
<div class="section "><p>Enumerates platform specific line breaks.
</p>
</div>
</div><div class="section members"><h2>Values</h2><table><tr><td>Unix</td><td></td><td><p>Unix line break ("\n").
</p>
</td></tr><tr><td>Windows</td><td></td><td><p>Windows line break ("\r\n").
</p>
</td></tr><tr><td>Macintosh</td><td></td><td><p>Macintosh line break ("\r").
</p>
</td></tr></table>
</div>
</div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,59 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../style.css"/>
<script src="../highlight.pack.js"></script>
<title>dyaml.loader</title>
<base href="../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.loader</small>
</div>
<div class="sidebar">
<a href="dyaml/loader.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/loader.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li><span class=" selected">dyaml.<a href="dyaml/loader.html">loader</a></span>
</li>
<li>dyaml.<a href="dyaml/node.html">node</a></li>
<li>dyaml.<a href="dyaml/representer.html">representer</a></li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li>dyaml.<a href="dyaml/style.html">style</a></li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><div class="description"><div class="section "><p>Class used to load YAML documents.
</p>
</div>
</div><div class="section members"><h2>Structs</h2><table><tr><td><a href="dyaml/loader/Loader.html">Loader</a></td><td></td><td><p>Loads YAML documents from files or streams.
</p>
</td></tr></table>
</div>
</div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,329 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../../style.css"/>
<script src="../../highlight.pack.js"></script>
<title>Loader</title>
<base href="../../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.<a href=dyaml/loader.html>loader</a>.</small><span class="highlight">Loader</span>
</div>
<div class="sidebar">
<a href="dyaml/loader.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/loader.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li><span class=" selected">dyaml.<a href="dyaml/loader.html">loader</a></span>
</li>
<li>dyaml.<a href="dyaml/node.html">node</a></li>
<li>dyaml.<a href="dyaml/representer.html">representer</a></li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li>dyaml.<a href="dyaml/style.html">style</a></li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><div class="description"><pre><code>public struct Loader
</code></pre>
<div class="section "><p>Loads YAML documents from files or streams.
</p>
</div>
<div class="section"><p>User specified Constructor and/or Resolver can be used to support new
tags / data types.
</p>
</div>
<div class="section"><h2>Examples</h2>
Load single YAML document from a file:
<pre><code> auto rootNode = <a href="dyaml/loader/Loader.html">Loader</a>("file.yaml").<a href="dyaml/loader/Loader.html#load">load</a>();
...
</code></pre>
Load all YAML documents from a file:
<pre><code> auto nodes = <a href="dyaml/loader/Loader.html">Loader</a>("file.yaml").<a href="dyaml/loader/Loader.html#loadAll">loadAll</a>();
...
</code></pre>
Iterate over YAML documents in a file, lazily loading them:
<pre><code> auto loader = <a href="dyaml/loader/Loader.html">Loader</a>("file.yaml");
foreach(ref node; loader)
{
...
}
</code></pre>
Load YAML from a string:
<pre><code> char[] yaml_input = "red: '#ff0000'\n"
"green: '#00ff00'\n"
"blue: '#0000ff'".dup;
auto colors = <a href="dyaml/loader/Loader.html#fromString">Loader.fromString</a>(yaml_input).<a href="dyaml/loader/Loader.html#load">load</a>();
foreach(string color, string value; colors)
{
import std.stdio;
writeln(color, " is ", value, " in HTML/CSS");
}
</code></pre>
Load a file into a buffer in memory and then load YAML from that buffer:
<pre><code> try
{
import std.file;
void[] buffer = std.file.read("file.yaml");
auto yamlNode = <a href="dyaml/loader/Loader.html">Loader</a>(buffer);
// Read data from yamlNode here...
}
catch(FileException e)
{
writeln("Failed to read file 'file.yaml'");
}
</code></pre>
Use a custom constructor/resolver to support custom data types and/or implicit tags:
<pre><code> auto <a href="dyaml/loader/Loader.html#constructor">constructor</a> = new <a href="dyaml/constructor/Constructor.html">Constructor</a>();
auto <a href="dyaml/loader/Loader.html#resolver">resolver</a> = new <a href="dyaml/resolver/Resolver.html">Resolver</a>();
// Add <a href="dyaml/loader/Loader.html#constructor">constructor</a> functions / <a href="dyaml/loader/Loader.html#resolver">resolver</a> expressions here...
auto loader = <a href="dyaml/loader/Loader.html">Loader</a>("file.yaml");
loader.<a href="dyaml/loader/Loader.html#constructor">constructor</a> = <a href="dyaml/loader/Loader.html#constructor">constructor</a>;
loader.<a href="dyaml/loader/Loader.html#resolver">resolver</a> = <a href="dyaml/loader/Loader.html#resolver">resolver</a>;
auto rootNode = loader.<a href="dyaml/loader/Loader.html#load">load</a>(node);
</code></pre>
</div>
</div><a class="anchor" id="this"></a><div class="symbol"><div class="description"><pre><code>public this(string filename) @trusted
</code></pre>
<div class="section "><p>Construct a Loader to load YAML from a file.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">filename</td><td class="paramDoc"><p>Name of the file to load from.
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Throws</h2>
<p> YAMLException if the file could not be opened or read.
</p>
</div>
</div></div><a class="anchor" id="fromString"></a><div class="symbol"><div class="description"><pre><code>public static <a href="dyaml/loader/Loader.html">Loader</a> <a href="dyaml/loader/Loader.html#fromString">fromString</a>(<a href="http://dlang.org/type.html#basic-data-types">char</a>[] data) @safe
</code></pre>
<div class="section "><p>Construct a Loader to load YAML from a string (char []).
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">data</td><td class="paramDoc"><p>String to load YAML from. <b>will</b> be overwritten during parsing as D:YAML reuses memory. Use data.dup if you don't want to modify the original string.
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Returns</h2>
<p> Loader loading YAML from given string.
</p>
</div>
<div class="section"><h2>Throws</h2>
<p> YAMLException if data could not be read (e.g. a decoding error)
</p>
</div>
<div class="section "><h2>Example</h2>
<pre><code>assert(<a href="dyaml/loader/Loader.html#fromString">Loader.fromString</a>(cast(char[])"42").<a href="dyaml/loader/Loader.html#load">load</a>().as!int == 42);
</code></pre>
</div>
</div></div><a class="anchor" id="this"></a><div class="symbol"><div class="description"><pre><code>public this(<a href="http://dlang.org/type.html#basic-data-types">void</a>[] yamlData) @safe
</code></pre>
<div class="section "><p>Construct a Loader to load YAML from a buffer.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">yamlData</td><td class="paramDoc"><p>Buffer with YAML data to load. This may be e.g. a file loaded to memory or a string with YAML data. Note that buffer <b>will</b> be overwritten, as D:YAML minimizes memory allocations by reusing the input _buffer. <b>Must not be deleted or modified by the user as long as nodes loaded by this Loader are in use!</b> - Nodes may refer to data in this buffer. Note that D:YAML looks for byte-order-marks YAML files encoded in UTF-16/UTF-32 (and sometimes UTF-8) use to specify the encoding and endianness, so it should be enough to load an entire file to a buffer and pass it to D:YAML, regardless of Unicode encoding.
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Throws</h2>
<p> YAMLException if yamlData contains data illegal in YAML.
</p>
</div>
</div></div><a class="anchor" id="name"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/loader/Loader.html#name">name</a>(string name) pure @safe nothrow @nogc
</code></pre>
<div class="section "><p>Set stream _name. Used in debugging messages.
</p>
</div>
</div></div><a class="anchor" id="resolver"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/loader/Loader.html#resolver">resolver</a>(<a href="dyaml/resolver/Resolver.html">Resolver</a> resolver) pure @safe nothrow @nogc
</code></pre>
<div class="section "><p>Specify custom Resolver to use.
</p>
</div>
</div></div><a class="anchor" id="constructor"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/loader/Loader.html#constructor">constructor</a>(<a href="dyaml/constructor/Constructor.html">Constructor</a> constructor) pure @safe nothrow @nogc
</code></pre>
<div class="section "><p>Specify custom Constructor to use.
</p>
</div>
</div></div><a class="anchor" id="load"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a> <a href="dyaml/loader/Loader.html#load">load</a>() @safe
</code></pre>
<div class="section "><p>Load single YAML document.
</p>
</div>
<div class="section "><h2>Contracts</h2><pre><code>in
{
assert (!done_, "<a href="dyaml/loader/Loader.html">Loader</a>: Trying to <a href="dyaml/loader/Loader.html#load">load</a> YAML twice");
}
</code></pre>
</div>
<div class="section"><p>If none or more than one YAML document is found, this throws a YAMLException.
</p>
<p> This can only be called once; this is enforced by contract.
</p>
</div>
<div class="section"><h2>Returns</h2>
<p> Root node of the document.
</p>
</div>
<div class="section"><h2>Throws</h2>
<p> YAMLException if there wasn't exactly one document
or on a YAML parsing error.
</p>
</div>
</div></div><a class="anchor" id="loadAll"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a>[] <a href="dyaml/loader/Loader.html#loadAll">loadAll</a>() @trusted
</code></pre>
<div class="section "><p>Load all YAML documents.
</p>
</div>
<div class="section"><p>This is just a shortcut that iterates over all documents and returns them
all at once. Calling loadAll after iterating over the node or vice versa
will not return any documents, as they have all been parsed already.
</p>
<p> This can only be called once; this is enforced by contract.
</p>
</div>
<div class="section"><h2>Returns</h2>
<p> Array of root nodes of all documents in the file/stream.
</p>
</div>
<div class="section"><h2>Throws</h2>
<p> YAMLException on a parsing error.
</p>
</div>
</div></div><a class="anchor" id="opApply"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">int</a> <a href="dyaml/loader/Loader.html#opApply">opApply</a>(<a href="http://dlang.org/type.html#basic-data-types">int</a> delegate(ref <a href="dyaml/node/Node.html">Node</a>) dg) @trusted
</code></pre>
<div class="section "><p>Foreach over YAML documents.
</p>
</div>
<div class="section "><h2>Contracts</h2><pre><code>in
{
assert (!done_, "<a href="dyaml/loader/Loader.html">Loader</a>: Trying to <a href="dyaml/loader/Loader.html#load">load</a> YAML twice");
}
</code></pre>
</div>
<div class="section"><p>Parses documents lazily, when they are needed.
</p>
<p> Foreach over a Loader can only be used once; this is enforced by contract.
</p>
</div>
<div class="section"><h2>Throws</h2>
<p> YAMLException on a parsing error.
</p>
</div>
</div></div><div class="section members"><h2>Functions</h2><table><tr><td><a href="dyaml/loader/Loader.html#this">this</a></td><td></td><td><p>Construct a Loader to load YAML from a file.
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-static">static</span></span></span><a href="dyaml/loader/Loader.html#fromString">fromString</a><span class="extrainfo"><span class="method-attribs"><span class="attr-safe">@safe</span></span></span></td><td></td><td><p>Construct a Loader to load YAML from a string (char []).
</p>
</td></tr><tr><td><a href="dyaml/loader/Loader.html#this">this</a></td><td></td><td><p>Construct a Loader to load YAML from a buffer.
</p>
</td></tr><tr><td><a href="dyaml/loader/Loader.html#name">name</a><span class="extrainfo"><span class="method-attribs"><span class="attr-pure">pure</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span>, <span class="attr-nogc">@nogc</span></span></span></td><td></td><td><p>Set stream _name. Used in debugging messages.
</p>
</td></tr><tr><td><a href="dyaml/loader/Loader.html#resolver">resolver</a><span class="extrainfo"><span class="method-attribs"><span class="attr-pure">pure</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span>, <span class="attr-nogc">@nogc</span></span></span></td><td></td><td><p>Specify custom Resolver to use.
</p>
</td></tr><tr><td><a href="dyaml/loader/Loader.html#constructor">constructor</a><span class="extrainfo"><span class="method-attribs"><span class="attr-pure">pure</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span>, <span class="attr-nogc">@nogc</span></span></span></td><td></td><td><p>Specify custom Constructor to use.
</p>
</td></tr><tr><td><a href="dyaml/loader/Loader.html#load">load</a><span class="extrainfo"><span class="method-attribs"><span class="attr-safe">@safe</span></span></span></td><td></td><td><p>Load single YAML document.
</p>
</td></tr><tr><td><a href="dyaml/loader/Loader.html#loadAll">loadAll</a><span class="extrainfo"><span class="method-attribs"><span class="attr-trusted">@trusted</span></span></span></td><td></td><td><p>Load all YAML documents.
</p>
</td></tr><tr><td><a href="dyaml/loader/Loader.html#opApply">opApply</a><span class="extrainfo"><span class="method-attribs"><span class="attr-trusted">@trusted</span></span></span></td><td></td><td><p>Foreach over YAML documents.
</p>
</td></tr></table>
</div>
</div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,64 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../style.css"/>
<script src="../highlight.pack.js"></script>
<title>dyaml.node</title>
<base href="../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.node</small>
</div>
<div class="sidebar">
<a href="dyaml/node.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/node.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li><span class=" selected">dyaml.<a href="dyaml/node.html">node</a></span>
</li>
<li>dyaml.<a href="dyaml/representer.html">representer</a></li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li>dyaml.<a href="dyaml/style.html">style</a></li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><div class="description"><div class="section "><p>Node of a YAML document. Used to read YAML data once it's loaded,
and to prepare data to emit.
</p>
</div>
</div><div class="section members"><h2>Structs</h2><table><tr><td><a href="dyaml/node/YAMLNull.html">YAMLNull</a></td><td></td><td><p>Null YAML type. Used in nodes with _null values.
</p>
</td></tr><tr><td><a href="dyaml/node/Node.html">Node</a></td><td></td><td><p>YAML node.
</p>
</td></tr></table><h2>Classes</h2><table><tr><td><a href="dyaml/node/NodeException.html">NodeException</a></td><td></td><td><p>Exception thrown at node related errors.
</p>
</td></tr></table>
</div>
</div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,866 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../../style.css"/>
<script src="../../highlight.pack.js"></script>
<title>Node</title>
<base href="../../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.<a href=dyaml/node.html>node</a>.</small><span class="highlight">Node</span>
</div>
<div class="sidebar">
<a href="dyaml/node.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/node.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li><span class=" selected">dyaml.<a href="dyaml/node.html">node</a></span>
</li>
<li>dyaml.<a href="dyaml/representer.html">representer</a></li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li>dyaml.<a href="dyaml/style.html">style</a></li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><div class="description"><pre><code>public struct Node
</code></pre>
<div class="section "><p>YAML node.
</p>
</div>
<div class="section"><p>This is a pseudo-dynamic type that can store any YAML value, including a
sequence or mapping of nodes. You can get data from a Node directly or
iterate over it if it's a collection.
</p>
</div>
</div><a class="anchor" id="this"></a><div class="symbol"><div class="description"><pre><code>public this(T)(
T value,
const string tag = null) @trusted
if(!scalarCtorNothrow!T && (!isArray!T && !isAssociativeArray!T))
</code></pre>
<div class="section "><p>Construct a Node from a value.
</p>
</div>
<div class="section"><p>Any type except for Node can be stored in a Node, but default YAML
types (integers, floats, strings, timestamps, etc.) will be stored
more efficiently. To create a node representing a null value,
construct it from YAMLNull.
</p>
<p> Note that to emit any non-default types you store
in a node, you need a Representer to represent them in YAML -
otherwise emitting will fail.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">value</td><td class="paramDoc"><p>Value to store in the node.
</p>
</td></tr>
<tr class="param"><td class="paramName">tag</td><td class="paramDoc"><p>Overrides tag of the node when emitted, regardless of tag determined by Representer. Representer uses this to determine YAML data type when a D data type maps to multiple different YAML data types. Tag must be in full form, e.g. "tag:yaml.org,2002:int", not a shortcut, like "!!int".
</p>
</td></tr>
</table>
</div>
</div></div><a class="anchor" id="this"></a><div class="symbol"><div class="description"><pre><code>public this(T)(
T value,
const string tag = null) @safe pure nothrow
if(scalarCtorNothrow!T)
</code></pre>
<div class="section "><p>Ditto.
</p>
</div>
</div></div><a class="anchor" id="this"></a><div class="symbol"><div class="description"><pre><code>public this(T)(
T[] array,
const string tag = null) @safe
if(!isSomeString!(T[]))
</code></pre>
<div class="section "><p>Construct a node from an _array.
</p>
</div>
<div class="section"><p>If _array is an _array of nodes or pairs, it is stored directly.
Otherwise, every value in the array is converted to a node, and
those nodes are stored.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">array</td><td class="paramDoc"><p>Values to store in the node.
</p>
</td></tr>
<tr class="param"><td class="paramName">tag</td><td class="paramDoc"><p>Overrides tag of the node when emitted, regardless of tag determined by Representer. Representer uses this to determine YAML data type when a D data type maps to multiple different YAML data types. This is used to differentiate between YAML sequences ("!!seq") and sets ("!!set"), which both are internally represented as an array_ of nodes. Tag must be in full form, e.g. "tag:yaml.org,2002:set", not a shortcut, like "!!set".
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Examples</h2>
<pre><code> // Will be emitted <a href="dyaml/node/Node.html#as">as</a> a sequence (default for arrays)
auto seq = <a href="dyaml/node/Node.html">Node</a>([1, 2, 3, 4, 5]);
// Will be emitted <a href="dyaml/node/Node.html#as">as</a> a set (overriden <a href="dyaml/node/Node.html#tag">tag</a>)
auto set = <a href="dyaml/node/Node.html">Node</a>([1, 2, 3, 4, 5], "<a href="dyaml/node/Node.html#tag">tag</a>:yaml.org,2002:set");
</code></pre>
</div>
</div></div><a class="anchor" id="this"></a><div class="symbol"><div class="description"><pre><code>public this(K, V)(
V[K] array,
const string tag = null) @safe
</code></pre>
<div class="section "><p>Construct a node from an associative _array.
</p>
</div>
<div class="section"><p>If keys and/or values of _array are nodes, they stored directly.
Otherwise they are converted to nodes and then stored.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">array</td><td class="paramDoc"><p>Values to store in the node.
</p>
</td></tr>
<tr class="param"><td class="paramName">tag</td><td class="paramDoc"><p>Overrides tag of the node when emitted, regardless of tag determined by Representer. Representer uses this to determine YAML data type when a D data type maps to multiple different YAML data types. This is used to differentiate between YAML unordered mappings ("!!map"), ordered mappings ("!!omap"), and pairs ("!!pairs") which are all internally represented as an _array of node pairs. Tag must be in full form, e.g. "tag:yaml.org,2002:omap", not a shortcut, like "!!omap".
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Examples</h2>
<pre><code> // Will be emitted <a href="dyaml/node/Node.html#as">as</a> an unordered mapping (default for mappings)
auto map = <a href="dyaml/node/Node.html">Node</a>([1 : "a", 2 : "b"]);
// Will be emitted <a href="dyaml/node/Node.html#as">as</a> an ordered map (overriden <a href="dyaml/node/Node.html#tag">tag</a>)
auto omap = <a href="dyaml/node/Node.html">Node</a>([1 : "a", 2 : "b"], "<a href="dyaml/node/Node.html#tag">tag</a>:yaml.org,2002:omap");
// Will be emitted <a href="dyaml/node/Node.html#as">as</a> pairs (overriden <a href="dyaml/node/Node.html#tag">tag</a>)
auto pairs = <a href="dyaml/node/Node.html">Node</a>([1 : "a", 2 : "b"], "<a href="dyaml/node/Node.html#tag">tag</a>:yaml.org,2002:pairs");
</code></pre>
</div>
</div></div><a class="anchor" id="this"></a><div class="symbol"><div class="description"><pre><code>public this(K, V)(
K[] keys,
V[] values,
const string tag = null) @safe
if(!(isSomeString!(K[]) || isSomeString!(V[])))
</code></pre>
<div class="section "><p>Construct a node from arrays of _keys and _values.
</p>
</div>
<div class="section "><h2>Contracts</h2><pre><code>in
{
assert (keys.<a href="dyaml/node/Node.html#length">length</a> == values.<a href="dyaml/node/Node.html#length">length</a>, "Lengths of keys and values arrays to construct ""a YAML node from don't match");
}
</code></pre>
</div>
<div class="section"><p>Constructs a mapping node with key-value pairs from
_keys and _values, keeping their order. Useful when order
is important (ordered maps, pairs).
</p>
<p> keys and values must have equal length.
</p>
<p> If _keys and/or _values are nodes, they are stored directly/
Otherwise they are converted to nodes and then stored.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">keys</td><td class="paramDoc"><p>Keys of the mapping, from first to last pair.
</p>
</td></tr>
<tr class="param"><td class="paramName">values</td><td class="paramDoc"><p>Values of the mapping, from first to last pair.
</p>
</td></tr>
<tr class="param"><td class="paramName">tag</td><td class="paramDoc"><p>Overrides tag of the node when emitted, regardless of tag determined by Representer. Representer uses this to determine YAML data type when a D data type maps to multiple different YAML data types. This is used to differentiate between YAML unordered mappings ("!!map"), ordered mappings ("!!omap"), and pairs ("!!pairs") which are all internally represented as an array of node pairs. Tag must be in full form, e.g. "tag:yaml.org,2002:omap", not a shortcut, like "!!omap".
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Examples</h2>
<pre><code> // Will be emitted <a href="dyaml/node/Node.html#as">as</a> an unordered mapping (default for mappings)
auto map = <a href="dyaml/node/Node.html">Node</a>([1, 2], ["a", "b"]);
// Will be emitted <a href="dyaml/node/Node.html#as">as</a> an ordered map (overriden <a href="dyaml/node/Node.html#tag">tag</a>)
auto omap = <a href="dyaml/node/Node.html">Node</a>([1, 2], ["a", "b"], "<a href="dyaml/node/Node.html#tag">tag</a>:yaml.org,2002:omap");
// Will be emitted <a href="dyaml/node/Node.html#as">as</a> pairs (overriden <a href="dyaml/node/Node.html#tag">tag</a>)
auto pairs = <a href="dyaml/node/Node.html">Node</a>([1, 2], ["a", "b"], "<a href="dyaml/node/Node.html#tag">tag</a>:yaml.org,2002:pairs");
</code></pre>
</div>
</div></div><a class="anchor" id="isValid"></a><div class="symbol"><div class="description"><pre><code>public @property <a href="http://dlang.org/type.html#basic-data-types">bool</a> <a href="dyaml/node/Node.html#isValid">isValid</a>() const @safe pure nothrow
</code></pre>
<div class="section "><p>Is this node valid (initialized)?
</p>
</div>
</div></div><a class="anchor" id="isScalar"></a><div class="symbol"><div class="description"><pre><code>public @property <a href="http://dlang.org/type.html#basic-data-types">bool</a> <a href="dyaml/node/Node.html#isScalar">isScalar</a>() const @safe nothrow
</code></pre>
<div class="section "><p>Is this node a scalar value?
</p>
</div>
</div></div><a class="anchor" id="isSequence"></a><div class="symbol"><div class="description"><pre><code>public @property <a href="http://dlang.org/type.html#basic-data-types">bool</a> <a href="dyaml/node/Node.html#isSequence">isSequence</a>() const @safe nothrow
</code></pre>
<div class="section "><p>Is this node a sequence?
</p>
</div>
</div></div><a class="anchor" id="isMapping"></a><div class="symbol"><div class="description"><pre><code>public @property <a href="http://dlang.org/type.html#basic-data-types">bool</a> <a href="dyaml/node/Node.html#isMapping">isMapping</a>() const @safe nothrow
</code></pre>
<div class="section "><p>Is this node a mapping?
</p>
</div>
</div></div><a class="anchor" id="isUserType"></a><div class="symbol"><div class="description"><pre><code>public @property <a href="http://dlang.org/type.html#basic-data-types">bool</a> <a href="dyaml/node/Node.html#isUserType">isUserType</a>() const @safe nothrow
</code></pre>
<div class="section "><p>Is this node a user defined type?
</p>
</div>
</div></div><a class="anchor" id="isNull"></a><div class="symbol"><div class="description"><pre><code>public @property <a href="http://dlang.org/type.html#basic-data-types">bool</a> <a href="dyaml/node/Node.html#isNull">isNull</a>() const @safe nothrow
</code></pre>
<div class="section "><p>Is this node null?
</p>
</div>
</div></div><a class="anchor" id="tag"></a><div class="symbol"><div class="description"><pre><code>public @property string <a href="dyaml/node/Node.html#tag">tag</a>() const @safe nothrow
</code></pre>
<div class="section "><p>Return tag of the node.
</p>
</div>
</div></div><a class="anchor" id="opEquals"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">bool</a> <a href="dyaml/node/Node.html#opEquals">opEquals</a>(T)(const auto ref T rhs) const @safe
</code></pre>
<div class="section "><p>Equality test.
</p>
</div>
<div class="section"><p>If T is Node, recursively compares all subnodes.
This might be quite expensive if testing entire documents.
</p>
<p> If T is not Node, gets a value of type T from the node and tests
equality with that.
</p>
<p> To test equality with a null YAML value, use YAMLNull.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">rhs</td><td class="paramDoc"><p>Variable to test equality with.
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Returns</h2>
<p> true if equal, false otherwise.
</p>
</div>
<div class="section "><h2>Example</h2>
<pre><code>auto node = <a href="dyaml/node/Node.html">Node</a>(42);
assert(node == 42);
assert(node != "42");
assert(node != "43");
auto node2 = <a href="dyaml/node/Node.html">Node</a>(<a href="dyaml/node/YAMLNull.html">YAMLNull</a>());
assert(node2 == <a href="dyaml/node/YAMLNull.html">YAMLNull</a>());
</code></pre>
</div>
</div></div><a class="anchor" id="as"></a><div class="symbol"><div class="description"><pre><code>alias as = <a href="dyaml/node/Node.html#get">get</a>
</code></pre>
<div class="section "><p>Shortcut for get().
</p>
</div>
</div></div><a class="anchor" id="get"></a><div class="symbol"><div class="description"><pre><code>public @property T <a href="dyaml/node/Node.html#get">get</a>(T, Flag!"stringConversion" stringConversion = Yes.stringConversion)() @trusted
if(!is(T == const))
</code></pre>
<div class="section "><p>Get the value of the node as specified type.
</p>
</div>
<div class="section"><p>If the specifed type does not match type in the node,
conversion is attempted. The stringConversion template
parameter can be used to disable conversion from non-string
types to strings.
</p>
<p> Numeric values are range checked, throwing if out of range of
requested type.
</p>
<p> Timestamps are stored as std.datetime.SysTime.
Binary values are decoded and stored as ubyte[].
</p>
<p> To get a null value, use get!YAMLNull . This is to
prevent getting null values for types such as strings or classes.
</p>
<p> <b>Mapping default values:</b>
</p>
</div>
<div class="section"><h2>Examples</h2>
Automatic type conversion:
<pre><code> auto node = <a href="dyaml/node/Node.html">Node</a>(42);
assert(node.<a href="dyaml/node/Node.html#as">as</a>!int == 42);
assert(node.<a href="dyaml/node/Node.html#as">as</a>!string == "42");
assert(node.<a href="dyaml/node/Node.html#as">as</a>!double == 42.0);
</code></pre>
</div>
<div class="section"><h2>Returns</h2>
<p> Value of the node as specified type.
</p>
</div>
<div class="section"><h2>Throws</h2>
<p> NodeException if unable to convert to specified type, or if
the value is out of range of requested type.
</p>
</div>
</div></div><a class="anchor" id="get"></a><div class="symbol"><div class="description"><pre><code>public @property T <a href="dyaml/node/Node.html#get">get</a>(T, Flag!"stringConversion" stringConversion = Yes.stringConversion)() const @trusted
if(is(T == const))
</code></pre>
<div class="section "><p>Ditto.
</p>
</div>
</div></div><a class="anchor" id="length"></a><div class="symbol"><div class="description"><pre><code>public @property size_t <a href="dyaml/node/Node.html#length">length</a>() const @safe
</code></pre>
<div class="section "><p>If this is a collection, return its _length.
</p>
</div>
<div class="section"><p>Otherwise, throw NodeException.
</p>
</div>
<div class="section"><h2>Returns</h2>
<p> Number of elements in a sequence or key-value pairs in a mapping.
</p>
</div>
<div class="section"><h2>Throws</h2>
<p> NodeException if this is not a sequence nor a mapping.
</p>
</div>
</div></div><a class="anchor" id="opIndex"></a><div class="symbol"><div class="description"><pre><code>public ref <a href="dyaml/node/Node.html">Node</a> <a href="dyaml/node/Node.html#opIndex">opIndex</a>(T)(T index) @trusted
</code></pre>
<div class="section "><p>Get the element at specified index.
</p>
</div>
<div class="section"><p>If the node is a sequence, index must be integral.
</p>
<p> If the node is a mapping, return the value corresponding to the first
key equal to index. containsKey() can be used to determine if a mapping
has a specific key.
</p>
<p> To get element at a null index, use YAMLNull for index.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">index</td><td class="paramDoc"><p>Index to use.
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Returns</h2>
<p> Value corresponding to the index.
</p>
</div>
<div class="section"><h2>Throws</h2>
<p> NodeException if the index could not be found,
non-integral index is used with a sequence or the node is
not a collection.
</p>
</div>
<div class="section "><h2>Example</h2>
<pre><code>writeln("D:YAML <a href="dyaml/node/Node.html">Node</a> <a href="dyaml/node/Node.html#opIndex">opIndex</a> unittest");
alias <a href="dyaml/node/Node.html">Node</a>.Value Value;
alias <a href="dyaml/node/Node.html">Node</a>.Pair Pair;
<a href="dyaml/node/Node.html">Node</a> narray = <a href="dyaml/node/Node.html">Node</a>([11, 12, 13, 14]);
<a href="dyaml/node/Node.html">Node</a> nmap = <a href="dyaml/node/Node.html">Node</a>(["11", "12", "13", "14"], [11, 12, 13, 14]);
assert(narray[0].<a href="dyaml/node/Node.html#as">as</a>!int == 11);
assert(null !is collectException(narray[42]));
assert(nmap["11"].<a href="dyaml/node/Node.html#as">as</a>!int == 11);
assert(nmap["14"].<a href="dyaml/node/Node.html#as">as</a>!int == 14);
</code></pre>
</div>
</div></div><a class="anchor" id="contains"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">bool</a> <a href="dyaml/node/Node.html#contains">contains</a>(T)(T rhs) const @safe
</code></pre>
<div class="section "><p>Determine if a collection contains specified value.
</p>
</div>
<div class="section"><p>If the node is a sequence, check if it contains the specified value.
If it's a mapping, check if it has a value that matches specified value.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">rhs</td><td class="paramDoc"><p>Item to look for. Use YAMLNull to check for a null value.
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Returns</h2>
<p> true if rhs was found, false otherwise.
</p>
</div>
<div class="section"><h2>Throws</h2>
<p> NodeException if the node is not a collection.
</p>
</div>
</div></div><a class="anchor" id="containsKey"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">bool</a> <a href="dyaml/node/Node.html#containsKey">containsKey</a>(T)(T rhs) const @safe
</code></pre>
<div class="section "><p>Determine if a mapping contains specified key.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">rhs</td><td class="paramDoc"><p>Key to look for. Use YAMLNull to check for a null key.
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Returns</h2>
<p> true if rhs was found, false otherwise.
</p>
</div>
<div class="section"><h2>Throws</h2>
<p> NodeException if the node is not a mapping.
</p>
</div>
</div></div><a class="anchor" id="opAssign"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/node/Node.html#opAssign">opAssign</a>(<a href="dyaml/node/Node.html">Node</a> rhs) @safe nothrow
</code></pre>
<div class="section "><p>Assignment (shallow copy) by value.
</p>
</div>
</div></div><a class="anchor" id="opAssign"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/node/Node.html#opAssign">opAssign</a>(ref <a href="dyaml/node/Node.html">Node</a> rhs) @trusted nothrow
</code></pre>
<div class="section "><p>Assignment (shallow copy) by reference.
</p>
</div>
</div></div><a class="anchor" id="opIndexAssign"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/node/Node.html#opIndexAssign">opIndexAssign</a>(K, V)(
V value,
K index) @safe
</code></pre>
<div class="section "><p>Set element at specified index in a collection.
</p>
</div>
<div class="section"><p>This method can only be called on collection nodes.
</p>
<p> If the node is a sequence, index must be integral.
</p>
<p> If the node is a mapping, sets the _value corresponding to the first
key matching index (including conversion, so e.g. "42" matches 42).
</p>
<p> If the node is a mapping and no key matches index, a new key-value
pair is added to the mapping. In sequences the index must be in
range. This ensures behavior siilar to D arrays and associative
arrays.
</p>
<p> To set element at a null index, use YAMLNull for index.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">index</td><td class="paramDoc"><p>Index of the value to set.
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Throws</h2>
<p> NodeException if the node is not a collection, index is out
of range or if a non-integral index is used on a sequence node.
</p>
</div>
</div></div><a class="anchor" id="opApply"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">int</a> <a href="dyaml/node/Node.html#opApply">opApply</a>(T)(<a href="http://dlang.org/type.html#basic-data-types">int</a> delegate(ref T) dg) @trusted
</code></pre>
<div class="section "><p>Foreach over a sequence, getting each element as T.
</p>
</div>
<div class="section"><p>If T is Node, simply iterate over the nodes in the sequence.
Otherwise, convert each node to T during iteration.
</p>
</div>
<div class="section"><h2>Throws</h2>
<p> NodeException if the node is not a sequence or an
element could not be converted to specified type.
</p>
</div>
</div></div><a class="anchor" id="opApply"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">int</a> <a href="dyaml/node/Node.html#opApply">opApply</a>(K, V)(<a href="http://dlang.org/type.html#basic-data-types">int</a> delegate(
ref K,
ref V) dg) @trusted
</code></pre>
<div class="section "><p>Foreach over a mapping, getting each key/value as K/V.
</p>
</div>
<div class="section"><p>If the K and/or V is Node, simply iterate over the nodes in the mapping.
Otherwise, convert each key/value to T during iteration.
</p>
</div>
<div class="section"><h2>Throws</h2>
<p> NodeException if the node is not a mapping or an
element could not be converted to specified type.
</p>
</div>
</div></div><a class="anchor" id="add"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/node/Node.html#add">add</a>(T)(T value) @safe
</code></pre>
<div class="section "><p>Add an element to a sequence.
</p>
</div>
<div class="section"><p>This method can only be called on sequence nodes.
</p>
<p> If value is a node, it is copied to the sequence directly. Otherwise
value is converted to a node and then stored in the sequence.
</p>
<p> <p>When emitting, all values in the sequence will be emitted. When
using the !!set tag, the user needs to ensure that all elements in
the sequence are unique, otherwise <b>invalid</b> YAML code will be
emitted.</p>
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">value</td><td class="paramDoc"><p>Value to _add to the sequence.
</p>
</td></tr>
</table>
</div>
</div></div><a class="anchor" id="add"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/node/Node.html#add">add</a>(K, V)(
K key,
V value) @safe
</code></pre>
<div class="section "><p>Add a key-value pair to a mapping.
</p>
</div>
<div class="section"><p>This method can only be called on mapping nodes.
</p>
<p> If key and/or value is a node, it is copied to the mapping directly.
Otherwise it is converted to a node and then stored in the mapping.
</p>
<p> <p>It is possible for the same key to be present more than once in a
mapping. When emitting, all key-value pairs will be emitted.
This is useful with the "!!pairs" tag, but will result in
<b>invalid</b> YAML with "!!map" and "!!omap" tags.</p>
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">key</td><td class="paramDoc"><p>Key to _add.
</p>
</td></tr>
<tr class="param"><td class="paramName">value</td><td class="paramDoc"><p>Value to _add.
</p>
</td></tr>
</table>
</div>
</div></div><a class="anchor" id="opBinaryRight"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a>* <a href="dyaml/node/Node.html#opBinaryRight">opBinaryRight</a>(string op, K)(K key) @system
if(op == "in")
</code></pre>
<div class="section "><p>Determine whether a key is in a mapping, and access its value.
</p>
</div>
<div class="section"><p>This method can only be called on mapping nodes.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">key</td><td class="paramDoc"><p>Key to search for.
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Returns</h2>
<p> A pointer to the value (as a Node) corresponding to key,
or null if not found.
</p>
</div>
<div class="section note"><h2>Note:</h2>
<div class="note-content">
<pre class="prettyprint"><code> Any modification to the node can invalidate the returned
pointer.
</code></pre>
</div>
</div>
<div class="section seealso">
<h2>See Also:</h2>
<div class="seealso-content">
<p> contains
</p>
</div>
</div>
</div></div><a class="anchor" id="remove"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/node/Node.html#remove">remove</a>(T)(T rhs) @trusted
</code></pre>
<div class="section "><p>Remove first (if any) occurence of a value in a collection.
</p>
</div>
<div class="section"><p>This method can only be called on collection nodes.
</p>
<p> If the node is a sequence, the first node matching value is removed.
If the node is a mapping, the first key-value pair where _value
matches specified value is removed.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">rhs</td><td class="paramDoc"><p>Value to _remove.
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Throws</h2>
<p> NodeException if the node is not a collection.
</p>
</div>
</div></div><a class="anchor" id="removeAt"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/node/Node.html#removeAt">removeAt</a>(T)(T index) @trusted
</code></pre>
<div class="section "><p>Remove element at the specified index of a collection.
</p>
</div>
<div class="section"><p>This method can only be called on collection nodes.
</p>
<p> If the node is a sequence, index must be integral.
</p>
<p> If the node is a mapping, remove the first key-value pair where
key matches index.
</p>
<p> If the node is a mapping and no key matches index, nothing is removed
and no exception is thrown. This ensures behavior siilar to D arrays
and associative arrays.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">index</td><td class="paramDoc"><p>Index to remove at.
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Throws</h2>
<p> NodeException if the node is not a collection, index is out
of range or if a non-integral index is used on a sequence node.
</p>
</div>
</div></div><a class="anchor" id="opCmp"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">int</a> <a href="dyaml/node/Node.html#opCmp">opCmp</a>(ref const <a href="dyaml/node/Node.html">Node</a> node) const @safe
</code></pre>
<div class="section "><p>Compare with another _node.
</p>
</div>
</div></div><div class="section members"><h2>Aliases</h2><table><tr><td><a href="dyaml/node/Node.html#as">as</a></td><td><pre><code><a href="dyaml/node/Node.html#get">get</a>
</code></pre>
</td><td><p>Shortcut for get().
</p>
</td></tr></table><h2>Functions</h2><table><tr><td><a href="dyaml/node/Node.html#this">this</a></td><td></td><td><p>Construct a Node from a value.
</p>
</td></tr><tr><td><a href="dyaml/node/Node.html#this">this</a></td><td></td><td><p>Ditto.
</p>
</td></tr><tr><td><a href="dyaml/node/Node.html#this">this</a></td><td></td><td><p>Construct a node from an _array.
</p>
</td></tr><tr><td><a href="dyaml/node/Node.html#this">this</a></td><td></td><td><p>Construct a node from an associative _array.
</p>
</td></tr><tr><td><a href="dyaml/node/Node.html#this">this</a></td><td></td><td><p>Construct a node from arrays of _keys and _values.
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/node/Node.html#isValid">isValid</a><span class="extrainfo"><span class="method-attribs"><span class="attr-const">const</span>, <span class="attr-safe">@safe</span>, <span class="attr-pure">pure</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Is this node valid (initialized)?
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/node/Node.html#isScalar">isScalar</a><span class="extrainfo"><span class="method-attribs"><span class="attr-const">const</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Is this node a scalar value?
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/node/Node.html#isSequence">isSequence</a><span class="extrainfo"><span class="method-attribs"><span class="attr-const">const</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Is this node a sequence?
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/node/Node.html#isMapping">isMapping</a><span class="extrainfo"><span class="method-attribs"><span class="attr-const">const</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Is this node a mapping?
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/node/Node.html#isUserType">isUserType</a><span class="extrainfo"><span class="method-attribs"><span class="attr-const">const</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Is this node a user defined type?
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/node/Node.html#isNull">isNull</a><span class="extrainfo"><span class="method-attribs"><span class="attr-const">const</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Is this node null?
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/node/Node.html#tag">tag</a><span class="extrainfo"><span class="method-attribs"><span class="attr-const">const</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Return tag of the node.
</p>
</td></tr><tr><td><a href="dyaml/node/Node.html#opEquals">opEquals</a><span class="extrainfo"><span class="method-attribs"><span class="attr-const">const</span>, <span class="attr-safe">@safe</span></span></span></td><td></td><td><p>Equality test.
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/node/Node.html#get">get</a><span class="extrainfo"><span class="method-attribs"><span class="attr-trusted">@trusted</span></span></span></td><td></td><td><p>Get the value of the node as specified type.
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/node/Node.html#get">get</a><span class="extrainfo"><span class="method-attribs"><span class="attr-const">const</span>, <span class="attr-trusted">@trusted</span></span></span></td><td></td><td><p>Ditto.
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/node/Node.html#length">length</a><span class="extrainfo"><span class="method-attribs"><span class="attr-const">const</span>, <span class="attr-safe">@safe</span></span></span></td><td></td><td><p>If this is a collection, return its _length.
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-ref">ref</span></span></span><a href="dyaml/node/Node.html#opIndex">opIndex</a><span class="extrainfo"><span class="method-attribs"><span class="attr-trusted">@trusted</span></span></span></td><td></td><td><p>Get the element at specified index.
</p>
</td></tr><tr><td><a href="dyaml/node/Node.html#contains">contains</a><span class="extrainfo"><span class="method-attribs"><span class="attr-const">const</span>, <span class="attr-safe">@safe</span></span></span></td><td></td><td><p>Determine if a collection contains specified value.
</p>
</td></tr><tr><td><a href="dyaml/node/Node.html#containsKey">containsKey</a><span class="extrainfo"><span class="method-attribs"><span class="attr-const">const</span>, <span class="attr-safe">@safe</span></span></span></td><td></td><td><p>Determine if a mapping contains specified key.
</p>
</td></tr><tr><td><a href="dyaml/node/Node.html#opAssign">opAssign</a><span class="extrainfo"><span class="method-attribs"><span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Assignment (shallow copy) by value.
</p>
</td></tr><tr><td><a href="dyaml/node/Node.html#opAssign">opAssign</a><span class="extrainfo"><span class="method-attribs"><span class="attr-trusted">@trusted</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Assignment (shallow copy) by reference.
</p>
</td></tr><tr><td><a href="dyaml/node/Node.html#opIndexAssign">opIndexAssign</a><span class="extrainfo"><span class="method-attribs"><span class="attr-safe">@safe</span></span></span></td><td></td><td><p>Set element at specified index in a collection.
</p>
</td></tr><tr><td><a href="dyaml/node/Node.html#opApply">opApply</a><span class="extrainfo"><span class="method-attribs"><span class="attr-trusted">@trusted</span></span></span></td><td></td><td><p>Foreach over a sequence, getting each element as T.
</p>
</td></tr><tr><td><a href="dyaml/node/Node.html#opApply">opApply</a><span class="extrainfo"><span class="method-attribs"><span class="attr-trusted">@trusted</span></span></span></td><td></td><td><p>Foreach over a mapping, getting each key/value as K/V.
</p>
</td></tr><tr><td><a href="dyaml/node/Node.html#add">add</a><span class="extrainfo"><span class="method-attribs"><span class="attr-safe">@safe</span></span></span></td><td></td><td><p>Add an element to a sequence.
</p>
</td></tr><tr><td><a href="dyaml/node/Node.html#add">add</a><span class="extrainfo"><span class="method-attribs"><span class="attr-safe">@safe</span></span></span></td><td></td><td><p>Add a key-value pair to a mapping.
</p>
</td></tr><tr><td><a href="dyaml/node/Node.html#opBinaryRight">opBinaryRight</a><span class="extrainfo"><span class="method-attribs"><span class="attr-system">@system</span></span></span></td><td></td><td><p>Determine whether a key is in a mapping, and access its value.
</p>
</td></tr><tr><td><a href="dyaml/node/Node.html#remove">remove</a><span class="extrainfo"><span class="method-attribs"><span class="attr-trusted">@trusted</span></span></span></td><td></td><td><p>Remove first (if any) occurence of a value in a collection.
</p>
</td></tr><tr><td><a href="dyaml/node/Node.html#removeAt">removeAt</a><span class="extrainfo"><span class="method-attribs"><span class="attr-trusted">@trusted</span></span></span></td><td></td><td><p>Remove element at the specified index of a collection.
</p>
</td></tr><tr><td><a href="dyaml/node/Node.html#opCmp">opCmp</a><span class="extrainfo"><span class="method-attribs"><span class="attr-const">const</span>, <span class="attr-safe">@safe</span></span></span></td><td></td><td><p>Compare with another _node.
</p>
</td></tr></table>
</div>
</div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,57 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../../style.css"/>
<script src="../../highlight.pack.js"></script>
<title>NodeException</title>
<base href="../../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.<a href=dyaml/node.html>node</a>.</small><span class="highlight">NodeException</span>
</div>
<div class="sidebar">
<a href="dyaml/node.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/node.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li><span class=" selected">dyaml.<a href="dyaml/node.html">node</a></span>
</li>
<li>dyaml.<a href="dyaml/representer.html">representer</a></li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li>dyaml.<a href="dyaml/style.html">style</a></li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><div class="description"><pre><code>public class NodeException : <a href="dyaml/exception/YAMLException.html">YAMLException</a>
</code></pre>
<div class="section "><p>Exception thrown at node related errors.
</p>
</div>
</div></div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,68 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../../style.css"/>
<script src="../../highlight.pack.js"></script>
<title>YAMLNull</title>
<base href="../../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.<a href=dyaml/node.html>node</a>.</small><span class="highlight">YAMLNull</span>
</div>
<div class="sidebar">
<a href="dyaml/node.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/node.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li><span class=" selected">dyaml.<a href="dyaml/node.html">node</a></span>
</li>
<li>dyaml.<a href="dyaml/representer.html">representer</a></li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li>dyaml.<a href="dyaml/style.html">style</a></li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><div class="description"><pre><code>public struct YAMLNull
</code></pre>
<div class="section "><p>Null YAML type. Used in nodes with _null values.
</p>
</div>
</div><a class="anchor" id="toString"></a><div class="symbol"><div class="description"><pre><code>public string <a href="dyaml/node/YAMLNull.html#toString">toString</a>() const pure @safe nothrow
</code></pre>
<div class="section "><p>Used for string conversion.
</p>
</div>
</div></div><div class="section members"><h2>Functions</h2><table><tr><td><a href="dyaml/node/YAMLNull.html#toString">toString</a><span class="extrainfo"><span class="method-attribs"><span class="attr-const">const</span>, <span class="attr-pure">pure</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Used for string conversion.
</p>
</td></tr></table>
</div>
</div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,179 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../style.css"/>
<script src="../highlight.pack.js"></script>
<title>dyaml.representer</title>
<base href="../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.representer</small>
</div>
<div class="sidebar">
<a href="dyaml/representer.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/representer.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li>dyaml.<a href="dyaml/node.html">node</a></li>
<li><span class=" selected">dyaml.<a href="dyaml/representer.html">representer</a></span>
</li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li>dyaml.<a href="dyaml/style.html">style</a></li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><a class="anchor" id="representNull"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a> <a href="dyaml/representer.html#representNull">representNull</a>(
ref <a href="dyaml/node/Node.html">Node</a> node,
<a href="dyaml/representer/Representer.html">Representer</a> representer) @safe
</code></pre>
<div class="section "><p>Represent a _null _node as a _null YAML value.
</p>
</div>
</div></div><a class="anchor" id="representString"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a> <a href="dyaml/representer.html#representString">representString</a>(
ref <a href="dyaml/node/Node.html">Node</a> node,
<a href="dyaml/representer/Representer.html">Representer</a> representer) @safe
</code></pre>
<div class="section "><p>Represent a string _node as a string scalar.
</p>
</div>
</div></div><a class="anchor" id="representBytes"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a> <a href="dyaml/representer.html#representBytes">representBytes</a>(
ref <a href="dyaml/node/Node.html">Node</a> node,
<a href="dyaml/representer/Representer.html">Representer</a> representer) @system
</code></pre>
<div class="section "><p>Represent a bytes _node as a binary scalar.
</p>
</div>
</div></div><a class="anchor" id="representBool"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a> <a href="dyaml/representer.html#representBool">representBool</a>(
ref <a href="dyaml/node/Node.html">Node</a> node,
<a href="dyaml/representer/Representer.html">Representer</a> representer) @safe
</code></pre>
<div class="section "><p>Represent a bool _node as a bool scalar.
</p>
</div>
</div></div><a class="anchor" id="representLong"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a> <a href="dyaml/representer.html#representLong">representLong</a>(
ref <a href="dyaml/node/Node.html">Node</a> node,
<a href="dyaml/representer/Representer.html">Representer</a> representer) @system
</code></pre>
<div class="section "><p>Represent a long _node as an integer scalar.
</p>
</div>
</div></div><a class="anchor" id="representReal"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a> <a href="dyaml/representer.html#representReal">representReal</a>(
ref <a href="dyaml/node/Node.html">Node</a> node,
<a href="dyaml/representer/Representer.html">Representer</a> representer) @system
</code></pre>
<div class="section "><p>Represent a real _node as a floating point scalar.
</p>
</div>
</div></div><a class="anchor" id="representSysTime"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a> <a href="dyaml/representer.html#representSysTime">representSysTime</a>(
ref <a href="dyaml/node/Node.html">Node</a> node,
<a href="dyaml/representer/Representer.html">Representer</a> representer) @system
</code></pre>
<div class="section "><p>Represent a SysTime _node as a timestamp.
</p>
</div>
</div></div><a class="anchor" id="representNodes"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a> <a href="dyaml/representer.html#representNodes">representNodes</a>(
ref <a href="dyaml/node/Node.html">Node</a> node,
<a href="dyaml/representer/Representer.html">Representer</a> representer) @safe
</code></pre>
<div class="section "><p>Represent a sequence _node as sequence/set.
</p>
</div>
</div><a class="anchor" id="representNodes.pairs"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a>.Pair[] pairs
</code></pre>
<div class="section "><p>YAML sets are mapping with null values.
</p>
</div>
</div></div><div class="section members"><h2>Variables</h2><table><tr><td><a href="dyaml/representer.html#representNodes.pairs">pairs</a></td><td><pre><code><a href="dyaml/node/Node.html">Node</a>.Pair[]
</code></pre>
</td><td><p>YAML sets are mapping with null values.
</p>
</td></tr></table>
</div>
</div><a class="anchor" id="representPairs"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a> <a href="dyaml/representer.html#representPairs">representPairs</a>(
ref <a href="dyaml/node/Node.html">Node</a> node,
<a href="dyaml/representer/Representer.html">Representer</a> representer) @system
</code></pre>
<div class="section "><p>Represent a mapping _node as map/ordered map/pairs.
</p>
</div>
</div></div><div class="description"><div class="section "><p>YAML node _representer. Prepares YAML nodes for output. A tutorial can be
found <a href="../tutorials/custom_types.html">here</a>. <br/>
</p>
</div>
<div class="section"><p>Code based on <a href="http://www.pyyaml.org">PyYAML</a>.
</p>
</div>
</div><div class="section members"><h2>Functions</h2><table><tr><td><a href="dyaml/representer.html#representNull">representNull</a><span class="extrainfo"><span class="method-attribs"><span class="attr-safe">@safe</span></span></span></td><td></td><td><p>Represent a _null _node as a _null YAML value.
</p>
</td></tr><tr><td><a href="dyaml/representer.html#representString">representString</a><span class="extrainfo"><span class="method-attribs"><span class="attr-safe">@safe</span></span></span></td><td></td><td><p>Represent a string _node as a string scalar.
</p>
</td></tr><tr><td><a href="dyaml/representer.html#representBytes">representBytes</a><span class="extrainfo"><span class="method-attribs"><span class="attr-system">@system</span></span></span></td><td></td><td><p>Represent a bytes _node as a binary scalar.
</p>
</td></tr><tr><td><a href="dyaml/representer.html#representBool">representBool</a><span class="extrainfo"><span class="method-attribs"><span class="attr-safe">@safe</span></span></span></td><td></td><td><p>Represent a bool _node as a bool scalar.
</p>
</td></tr><tr><td><a href="dyaml/representer.html#representLong">representLong</a><span class="extrainfo"><span class="method-attribs"><span class="attr-system">@system</span></span></span></td><td></td><td><p>Represent a long _node as an integer scalar.
</p>
</td></tr><tr><td><a href="dyaml/representer.html#representReal">representReal</a><span class="extrainfo"><span class="method-attribs"><span class="attr-system">@system</span></span></span></td><td></td><td><p>Represent a real _node as a floating point scalar.
</p>
</td></tr><tr><td><a href="dyaml/representer.html#representSysTime">representSysTime</a><span class="extrainfo"><span class="method-attribs"><span class="attr-system">@system</span></span></span></td><td></td><td><p>Represent a SysTime _node as a timestamp.
</p>
</td></tr><tr><td><a href="dyaml/representer.html#representNodes">representNodes</a><span class="extrainfo"><span class="method-attribs"><span class="attr-safe">@safe</span></span></span></td><td></td><td><p>Represent a sequence _node as sequence/set.
</p>
</td></tr><tr><td><a href="dyaml/representer.html#representPairs">representPairs</a><span class="extrainfo"><span class="method-attribs"><span class="attr-system">@system</span></span></span></td><td></td><td><p>Represent a mapping _node as map/ordered map/pairs.
</p>
</td></tr></table><h2>Classes</h2><table><tr><td><a href="dyaml/representer/RepresenterException.html">RepresenterException</a></td><td></td><td><p>Exception thrown on Representer errors.
</p>
</td></tr><tr><td><a href="dyaml/representer/Representer.html">Representer</a></td><td></td><td><p>Represents YAML nodes as scalar, sequence and mapping nodes ready for output.
</p>
</td></tr></table>
</div>
</div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,433 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../../style.css"/>
<script src="../../highlight.pack.js"></script>
<title>Representer</title>
<base href="../../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.<a href=dyaml/representer.html>representer</a>.</small><span class="highlight">Representer</span>
</div>
<div class="sidebar">
<a href="dyaml/representer.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/representer.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li>dyaml.<a href="dyaml/node.html">node</a></li>
<li><span class=" selected">dyaml.<a href="dyaml/representer.html">representer</a></span>
</li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li>dyaml.<a href="dyaml/style.html">style</a></li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><div class="description"><pre><code>public final class Representer
</code></pre>
<div class="section "><p>Represents YAML nodes as scalar, sequence and mapping nodes ready for output.
</p>
</div>
<div class="section"><p>This class is used to add support for dumping of custom data types.
</p>
<p>It can also override default node formatting styles for output.
</p>
</div>
</div><a class="anchor" id="this"></a><div class="symbol"><div class="description"><pre><code>public this(const Flag!"useDefaultRepresenters" useDefaultRepresenters = Yes.useDefaultRepresenters) @safe pure
</code></pre>
<div class="section "><p>Construct a Representer.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">useDefaultRepresenters</td><td class="paramDoc"><p>Use default representer functions for default YAML types? This can be disabled to use custom representer functions for default types.
</p>
</td></tr>
</table>
</div>
</div></div><a class="anchor" id="defaultScalarStyle"></a><div class="symbol"><div class="description"><pre><code>public @property <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/representer/Representer.html#defaultScalarStyle">defaultScalarStyle</a>(<a href="dyaml/style/ScalarStyle.html">ScalarStyle</a> style) pure @safe nothrow
</code></pre>
<div class="section "><p>Set default _style for scalars. If style is <code class="d_inlinecode">ScalarStyle.Invalid</code>, the _style is chosen automatically.
</p>
</div>
</div></div><a class="anchor" id="defaultCollectionStyle"></a><div class="symbol"><div class="description"><pre><code>public @property <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/representer/Representer.html#defaultCollectionStyle">defaultCollectionStyle</a>(<a href="dyaml/style/CollectionStyle.html">CollectionStyle</a> style) pure @safe nothrow
</code></pre>
<div class="section "><p>Set default _style for collections. If style is <code class="d_inlinecode">CollectionStyle.Invalid</code>, the _style is chosen automatically.
</p>
</div>
</div></div><a class="anchor" id="addRepresenter"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/representer/Representer.html#addRepresenter">addRepresenter</a>(T)(<a href="dyaml/node/Node.html">Node</a> function(
ref <a href="dyaml/node/Node.html">Node</a>,
<a href="dyaml/representer/Representer.html">Representer</a>) representer) @trusted pure
</code></pre>
<div class="section "><p>Add a function to represent nodes with a specific data type.
</p>
</div>
<div class="section"><p>The representer function takes references to a <code class="d_inlinecode">Node</code> storing the data
type and to the <code class="d_inlinecode">Representer</code>. It returns the represented node and may
throw a <code class="d_inlinecode">RepresenterException</code>. See the example for more information.
</p>
<p>Only one function may be specified for one data type. Default data
types already have representer functions unless disabled in the
<code class="d_inlinecode">Representer</code> constructor.
</p>
<p>Structs and classes must implement the <code class="d_inlinecode">opCmp()</code> operator for D:YAML
support. The signature of the operator that must be implemented
is <code class="d_inlinecode">const int opCmp(ref const MyStruct s)</code> for structs where
<i>MyStruct</i> is the struct type, and <code class="d_inlinecode">int opCmp(Object o)</code> for
classes. Note that the class <code class="d_inlinecode">opCmp()</code> should not alter the compared
values - it is not const for compatibility reasons.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">representer</td><td class="paramDoc"><p>Representer function to add.
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Examples</h2>
Representing a simple struct:
<pre><code>import std.string;
import dyaml.all;
struct MyStruct
{
int x, y, z;
//Any D:YAML type must have a custom opCmp operator.
//This is used for ordering in mappings.
const int opCmp(ref const MyStruct s)
{
if(x != s.x){return x - s.x;}
if(y != s.y){return y - s.y;}
if(z != s.z){return z - s.z;}
return 0;
}
}
<a href="dyaml/node/Node.html">Node</a> representMyStruct(ref <a href="dyaml/node/Node.html">Node</a> node, <a href="dyaml/representer/Representer.html">Representer</a> representer)
{
//The node is guaranteed to be MyStruct as we add representer for MyStruct.
auto value = node.as!MyStruct;
//Using custom scalar format, x:y:z.
auto scalar = format("%s:%s:%s", value.x, value.y, value.z);
//Representing as a scalar, with custom tag to specify <a href="dyaml/representer/Representer.html#this">this</a> data type.
return representer.<a href="dyaml/representer/Representer.html#representScalar">representScalar</a>("!mystruct.tag", scalar);
}
void main()
{
auto dumper = <a href="dyaml/dumper/Dumper.html">Dumper</a>("file.yaml");
auto representer = new <a href="dyaml/representer/Representer.html">Representer</a>;
representer.<a href="dyaml/representer/Representer.html#addRepresenter">addRepresenter</a>!MyStruct(&representMyStruct);
dumper.representer = representer;
dumper.dump(<a href="dyaml/node/Node.html">Node</a>(MyStruct(1,2,3)));
}</code></pre>
Representing a class:
<pre><code>import std.string;
import dyaml.all;
class MyClass
{
int x, y, z;
<a href="dyaml/representer/Representer.html#this">this</a>(int x, int y, int z)
{
<a href="dyaml/representer/Representer.html#this">this</a>.x = x;
<a href="dyaml/representer/Representer.html#this">this</a>.y = y;
<a href="dyaml/representer/Representer.html#this">this</a>.z = z;
}
//Any D:YAML type must have a custom opCmp operator.
//This is used for ordering in mappings.
override int opCmp(Object o)
{
MyClass s = cast(MyClass)o;
if(s is null){return -1;}
if(x != s.x){return x - s.x;}
if(y != s.y){return y - s.y;}
if(z != s.z){return z - s.z;}
return 0;
}
///Useful for <a href="dyaml/node/Node.html#as">Node.as</a>!string .
override string toString()
{
return format("MyClass(%s, %s, %s)", x, y, z);
}
}
//Same as representMyStruct.
<a href="dyaml/node/Node.html">Node</a> representMyClass(ref <a href="dyaml/node/Node.html">Node</a> node, <a href="dyaml/representer/Representer.html">Representer</a> representer)
{
//The node is guaranteed to be MyClass as we add representer for MyClass.
auto value = node.as!MyClass;
//Using custom scalar format, x:y:z.
auto scalar = format("%s:%s:%s", value.x, value.y, value.z);
//Representing as a scalar, with custom tag to specify <a href="dyaml/representer/Representer.html#this">this</a> data type.
return representer.<a href="dyaml/representer/Representer.html#representScalar">representScalar</a>("!myclass.tag", scalar);
}
void main()
{
auto dumper = <a href="dyaml/dumper/Dumper.html">Dumper</a>("file.yaml");
auto representer = new <a href="dyaml/representer/Representer.html">Representer</a>;
representer.<a href="dyaml/representer/Representer.html#addRepresenter">addRepresenter</a>!MyClass(&representMyClass);
dumper.representer = representer;
dumper.dump(<a href="dyaml/node/Node.html">Node</a>(new MyClass(1,2,3)));
}</code></pre>
</div>
</div></div><a class="anchor" id="representScalar"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a> <a href="dyaml/representer/Representer.html#representScalar">representScalar</a>(
string tag,
string scalar,
<a href="dyaml/style/ScalarStyle.html">ScalarStyle</a> style = <a href="dyaml/style/ScalarStyle.html">ScalarStyle</a>.Invalid) @safe
</code></pre>
<div class="section "><p>Represent a _scalar with specified _tag.
</p>
</div>
<div class="section"><p>This is used by representer functions that produce scalars.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">tag</td><td class="paramDoc"><p>Tag of the _scalar.
</p>
</td></tr>
<tr class="param"><td class="paramName">scalar</td><td class="paramDoc"><p>Scalar value.
</p>
</td></tr>
<tr class="param"><td class="paramName">style</td><td class="paramDoc"><p>Style of the _scalar. If invalid, default _style will be used. If the node was loaded before, previous _style will always be used.
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Returns</h2>
<p> The represented node.
</p>
</div>
<div class="section"><h2>Example</h2>
<pre><code>struct MyStruct
{
int x, y, z;
//Any D:YAML type must have a custom opCmp operator.
//This is used for ordering in mappings.
const int opCmp(ref const MyStruct s)
{
if(x != s.x){return x - s.x;}
if(y != s.y){return y - s.y;}
if(z != s.z){return z - s.z;}
return 0;
}
}
<a href="dyaml/node/Node.html">Node</a> representMyStruct(ref <a href="dyaml/node/Node.html">Node</a> node, <a href="dyaml/representer/Representer.html">Representer</a> representer)
{
auto value = node.as!MyStruct;
auto scalar = format("%s:%s:%s", value.x, value.y, value.z);
return representer.<a href="dyaml/representer/Representer.html#representScalar">representScalar</a>("!mystruct.tag", scalar);
}</code></pre>
</div>
</div></div><a class="anchor" id="representSequence"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a> <a href="dyaml/representer/Representer.html#representSequence">representSequence</a>(
string tag,
<a href="dyaml/node/Node.html">Node</a>[] sequence,
<a href="dyaml/style/CollectionStyle.html">CollectionStyle</a> style = <a href="dyaml/style/CollectionStyle.html">CollectionStyle</a>.Invalid) @trusted
</code></pre>
<div class="section "><p>Represent a _sequence with specified _tag, representing children first.
</p>
</div>
<div class="section"><p>This is used by representer functions that produce sequences.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">tag</td><td class="paramDoc"><p>Tag of the _sequence.
</p>
</td></tr>
<tr class="param"><td class="paramName">sequence</td><td class="paramDoc"><p>Sequence of nodes.
</p>
</td></tr>
<tr class="param"><td class="paramName">style</td><td class="paramDoc"><p>Style of the _sequence. If invalid, default _style will be used. If the node was loaded before, previous _style will always be used.
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Returns</h2>
<p> The represented node.
</p>
</div>
<div class="section"><h2>Throws</h2>
<p> <code class="d_inlinecode">RepresenterException</code> if a child could not be represented.
</p>
</div>
<div class="section"><h2>Example</h2>
<pre><code>struct MyStruct
{
int x, y, z;
//Any D:YAML type must have a custom opCmp operator.
//This is used for ordering in mappings.
const int opCmp(ref const MyStruct s)
{
if(x != s.x){return x - s.x;}
if(y != s.y){return y - s.y;}
if(z != s.z){return z - s.z;}
return 0;
}
}
<a href="dyaml/node/Node.html">Node</a> representMyStruct(ref <a href="dyaml/node/Node.html">Node</a> node, <a href="dyaml/representer/Representer.html">Representer</a> representer)
{
auto value = node.as!MyStruct;
auto nodes = [<a href="dyaml/node/Node.html">Node</a>(value.x), <a href="dyaml/node/Node.html">Node</a>(value.y), <a href="dyaml/node/Node.html">Node</a>(value.z)];
//use flow style
return representer.<a href="dyaml/representer/Representer.html#representSequence">representSequence</a>("!mystruct.tag", nodes,
<a href="dyaml/style/CollectionStyle.html#Flow">CollectionStyle.Flow</a>);
}</code></pre>
</div>
</div></div><a class="anchor" id="representMapping"></a><div class="symbol"><div class="description"><pre><code>public <a href="dyaml/node/Node.html">Node</a> <a href="dyaml/representer/Representer.html#representMapping">representMapping</a>(
string tag,
<a href="dyaml/node/Node.html">Node</a>.Pair[] pairs,
<a href="dyaml/style/CollectionStyle.html">CollectionStyle</a> style = <a href="dyaml/style/CollectionStyle.html">CollectionStyle</a>.Invalid) @trusted
</code></pre>
<div class="section "><p>Represent a mapping with specified _tag, representing children first.
</p>
</div>
<div class="section"><p>This is used by representer functions that produce mappings.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">tag</td><td class="paramDoc"><p>Tag of the mapping.
</p>
</td></tr>
<tr class="param"><td class="paramName">pairs</td><td class="paramDoc"><p>Key-value _pairs of the mapping.
</p>
</td></tr>
<tr class="param"><td class="paramName">style</td><td class="paramDoc"><p>Style of the mapping. If invalid, default _style will be used. If the node was loaded before, previous _style will always be used.
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Returns</h2>
<p> The represented node.
</p>
</div>
<div class="section"><h2>Throws</h2>
<p> <code class="d_inlinecode">RepresenterException</code> if a child could not be represented.
</p>
</div>
<div class="section"><h2>Example</h2>
<pre><code>struct MyStruct
{
int x, y, z;
//Any D:YAML type must have a custom opCmp operator.
//This is used for ordering in mappings.
const int opCmp(ref const MyStruct s)
{
if(x != s.x){return x - s.x;}
if(y != s.y){return y - s.y;}
if(z != s.z){return z - s.z;}
return 0;
}
}
<a href="dyaml/node/Node.html">Node</a> representMyStruct(ref <a href="dyaml/node/Node.html">Node</a> node, <a href="dyaml/representer/Representer.html">Representer</a> representer)
{
auto value = node.as!MyStruct;
auto pairs = [<a href="dyaml/node/Node.html">Node</a>.Pair("x", value.x),
<a href="dyaml/node/Node.html">Node</a>.Pair("y", value.y),
<a href="dyaml/node/Node.html">Node</a>.Pair("z", value.z)];
return representer.<a href="dyaml/representer/Representer.html#representMapping">representMapping</a>("!mystruct.tag", pairs);
}</code></pre>
</div>
</div></div><div class="section members"><h2>Functions</h2><table><tr><td><a href="dyaml/representer/Representer.html#this">this</a></td><td></td><td><p>Construct a Representer.
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/representer/Representer.html#defaultScalarStyle">defaultScalarStyle</a><span class="extrainfo"><span class="method-attribs"><span class="attr-pure">pure</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Set default _style for scalars. If style is <code class="d_inlinecode">ScalarStyle.Invalid</code>, the _style is chosen automatically.
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/representer/Representer.html#defaultCollectionStyle">defaultCollectionStyle</a><span class="extrainfo"><span class="method-attribs"><span class="attr-pure">pure</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Set default _style for collections. If style is <code class="d_inlinecode">CollectionStyle.Invalid</code>, the _style is chosen automatically.
</p>
</td></tr><tr><td><a href="dyaml/representer/Representer.html#addRepresenter">addRepresenter</a><span class="extrainfo"><span class="method-attribs"><span class="attr-trusted">@trusted</span>, <span class="attr-pure">pure</span></span></span></td><td></td><td><p>Add a function to represent nodes with a specific data type.
</p>
</td></tr><tr><td><a href="dyaml/representer/Representer.html#representScalar">representScalar</a><span class="extrainfo"><span class="method-attribs"><span class="attr-safe">@safe</span></span></span></td><td></td><td><p>Represent a _scalar with specified _tag.
</p>
</td></tr><tr><td><a href="dyaml/representer/Representer.html#representSequence">representSequence</a><span class="extrainfo"><span class="method-attribs"><span class="attr-trusted">@trusted</span></span></span></td><td></td><td><p>Represent a _sequence with specified _tag, representing children first.
</p>
</td></tr><tr><td><a href="dyaml/representer/Representer.html#representMapping">representMapping</a><span class="extrainfo"><span class="method-attribs"><span class="attr-trusted">@trusted</span></span></span></td><td></td><td><p>Represent a mapping with specified _tag, representing children first.
</p>
</td></tr></table>
</div>
</div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,57 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../../style.css"/>
<script src="../../highlight.pack.js"></script>
<title>RepresenterException</title>
<base href="../../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.<a href=dyaml/representer.html>representer</a>.</small><span class="highlight">RepresenterException</span>
</div>
<div class="sidebar">
<a href="dyaml/representer.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/representer.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li>dyaml.<a href="dyaml/node.html">node</a></li>
<li><span class=" selected">dyaml.<a href="dyaml/representer.html">representer</a></span>
</li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li>dyaml.<a href="dyaml/style.html">style</a></li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><div class="description"><pre><code>public class RepresenterException : <a href="dyaml/exception/YAMLException.html">YAMLException</a>
</code></pre>
<div class="section "><p>Exception thrown on Representer errors.
</p>
</div>
</div></div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,67 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../style.css"/>
<script src="../highlight.pack.js"></script>
<title>dyaml.resolver</title>
<base href="../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.resolver</small>
</div>
<div class="sidebar">
<a href="dyaml/resolver.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/resolver.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li>dyaml.<a href="dyaml/node.html">node</a></li>
<li>dyaml.<a href="dyaml/representer.html">representer</a></li>
<li><span class=" selected">dyaml.<a href="dyaml/resolver.html">resolver</a></span>
</li>
<li>dyaml.<a href="dyaml/style.html">style</a></li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><div class="description"><div class="section "><p>Implements a class that resolves YAML tags. This can be used to implicitly
resolve tags for custom data types, removing the need to explicitly
specify tags in YAML. A tutorial can be found
<a href="../tutorials/custom_types.html">here</a>. <br/>
</p>
</div>
<div class="section"><p>Code based on <a href="http://www.pyyaml.org">PyYAML</a>.
</p>
</div>
</div><div class="section members"><h2>Classes</h2><table><tr><td><a href="dyaml/resolver/Resolver.html">Resolver</a></td><td></td><td><p>Resolves YAML tags (data types).
</p>
</td></tr></table>
</div>
</div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,173 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../../style.css"/>
<script src="../../highlight.pack.js"></script>
<title>Resolver</title>
<base href="../../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.<a href=dyaml/resolver.html>resolver</a>.</small><span class="highlight">Resolver</span>
</div>
<div class="sidebar">
<a href="dyaml/resolver.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/resolver.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li>dyaml.<a href="dyaml/node.html">node</a></li>
<li>dyaml.<a href="dyaml/representer.html">representer</a></li>
<li><span class=" selected">dyaml.<a href="dyaml/resolver.html">resolver</a></span>
</li>
<li>dyaml.<a href="dyaml/style.html">style</a></li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><div class="description"><pre><code>public final class Resolver
</code></pre>
<div class="section "><p>Resolves YAML tags (data types).
</p>
</div>
<div class="section"><p>Can be used to implicitly resolve custom data types of scalar values.
</p>
</div>
</div><a class="anchor" id="this"></a><div class="symbol"><div class="description"><pre><code>public this(Flag!"useDefaultImplicitResolvers" defaultImplicitResolvers = Yes.useDefaultImplicitResolvers) @safe
</code></pre>
<div class="section "><p>Construct a Resolver.
</p>
</div>
<div class="section"><p>If you don't want to implicitly resolve default YAML tags/data types,
you can use defaultImplicitResolvers to disable default resolvers.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">defaultImplicitResolvers</td><td class="paramDoc"><p>Use default YAML implicit resolvers?
</p>
</td></tr>
</table>
</div>
</div></div><a class="anchor" id="addImplicitResolver"></a><div class="symbol"><div class="description"><pre><code>public <a href="http://dlang.org/type.html#basic-data-types">void</a> <a href="dyaml/resolver/Resolver.html#addImplicitResolver">addImplicitResolver</a>(
string tag,
Regex!char regexp,
string first) pure @safe
</code></pre>
<div class="section "><p>Add an implicit scalar resolver.
</p>
</div>
<div class="section"><p>If a scalar matches regexp and starts with any character in first,
its _tag is set to tag. If it matches more than one resolver _regexp
resolvers added _first override ones added later. Default resolvers
override any user specified resolvers, but they can be disabled in
Resolver constructor.
</p>
<p>If a scalar is not resolved to anything, it is assigned the default
YAML _tag for strings.
</p>
</div>
<div class="section"><h2>Parameters</h2>
<table class="params">
<tr class="param"><td class="paramName">tag</td><td class="paramDoc"><p>Tag to resolve to.
</p>
</td></tr>
<tr class="param"><td class="paramName">regexp</td><td class="paramDoc"><p>Regular expression the scalar must match to have this _tag.
</p>
</td></tr>
<tr class="param"><td class="paramName">first</td><td class="paramDoc"><p>String of possible starting characters of the scalar.
</p>
</td></tr>
</table>
</div>
<div class="section"><h2>Examples</h2>
Resolve scalars starting with 'A' to !_tag :
<pre><code>import std.regex;
import dyaml.all;
void main()
{
auto loader = <a href="dyaml/loader/Loader.html">Loader</a>("file.txt");
auto resolver = new <a href="dyaml/resolver/Resolver.html">Resolver</a>();
resolver.<a href="dyaml/resolver/Resolver.html#addImplicitResolver">addImplicitResolver</a>("!tag", std.regex.regex("A.*"), "A");
loader.resolver = resolver;
//Note that we have no constructor from tag "!tag", so we can't
//actually load anything that resolves to <a href="dyaml/resolver/Resolver.html#this">this</a> tag.
//See <a href="dyaml/constructor/Constructor.html">Constructor</a> API documentation and tutorial for more information.
auto node = loader.load();
}</code></pre>
</div>
</div></div><a class="anchor" id="defaultScalarTag"></a><div class="symbol"><div class="description"><pre><code>package @property Tag <a href="dyaml/resolver/Resolver.html#defaultScalarTag">defaultScalarTag</a>() const pure @safe nothrow
</code></pre>
<div class="section "><p>Return default scalar tag.
</p>
</div>
</div></div><a class="anchor" id="defaultSequenceTag"></a><div class="symbol"><div class="description"><pre><code>package @property Tag <a href="dyaml/resolver/Resolver.html#defaultSequenceTag">defaultSequenceTag</a>() const pure @safe nothrow
</code></pre>
<div class="section "><p>Return default sequence tag.
</p>
</div>
</div></div><a class="anchor" id="defaultMappingTag"></a><div class="symbol"><div class="description"><pre><code>package @property Tag <a href="dyaml/resolver/Resolver.html#defaultMappingTag">defaultMappingTag</a>() const pure @safe nothrow
</code></pre>
<div class="section "><p>Return default mapping tag.
</p>
</div>
</div></div><div class="section members"><h2>Functions</h2><table><tr><td><a href="dyaml/resolver/Resolver.html#this">this</a></td><td></td><td><p>Construct a Resolver.
</p>
</td></tr><tr><td><a href="dyaml/resolver/Resolver.html#addImplicitResolver">addImplicitResolver</a><span class="extrainfo"><span class="method-attribs"><span class="attr-pure">pure</span>, <span class="attr-safe">@safe</span></span></span></td><td></td><td><p>Add an implicit scalar resolver.
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/resolver/Resolver.html#defaultScalarTag">defaultScalarTag</a><span class="extrainfo"><span class="method-attribs"><span class="attr-const">const</span>, <span class="attr-pure">pure</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Return default scalar tag.
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/resolver/Resolver.html#defaultSequenceTag">defaultSequenceTag</a><span class="extrainfo"><span class="method-attribs"><span class="attr-const">const</span>, <span class="attr-pure">pure</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Return default sequence tag.
</p>
</td></tr><tr><td><span class="extrainfo"><span class="attribs"><span class="attr-property">@property</span></span></span><a href="dyaml/resolver/Resolver.html#defaultMappingTag">defaultMappingTag</a><span class="extrainfo"><span class="method-attribs"><span class="attr-const">const</span>, <span class="attr-pure">pure</span>, <span class="attr-safe">@safe</span>, <span class="attr-nothrow">nothrow</span></span></span></td><td></td><td><p>Return default mapping tag.
</p>
</td></tr></table>
</div>
</div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,61 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../style.css"/>
<script src="../highlight.pack.js"></script>
<title>dyaml.style</title>
<base href="../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.style</small>
</div>
<div class="sidebar">
<a href="dyaml/style.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/style.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li>dyaml.<a href="dyaml/node.html">node</a></li>
<li>dyaml.<a href="dyaml/representer.html">representer</a></li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li><span class=" selected">dyaml.<a href="dyaml/style.html">style</a></span>
</li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><div class="description"><div class="section "><p>YAML node formatting styles.
</p>
</div>
</div><div class="section members"><h2>Enums</h2><table><tr><td><a href="dyaml/style/ScalarStyle.html">ScalarStyle</a></td><td></td><td><p>Scalar styles.
</p>
</td></tr><tr><td><a href="dyaml/style/CollectionStyle.html">CollectionStyle</a></td><td></td><td><p>Collection styles.
</p>
</td></tr></table>
</div>
</div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,65 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../../style.css"/>
<script src="../../highlight.pack.js"></script>
<title>CollectionStyle</title>
<base href="../../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.<a href=dyaml/style.html>style</a>.</small><span class="highlight">CollectionStyle</span>
</div>
<div class="sidebar">
<a href="dyaml/style.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/style.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li>dyaml.<a href="dyaml/node.html">node</a></li>
<li>dyaml.<a href="dyaml/representer.html">representer</a></li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li><span class=" selected">dyaml.<a href="dyaml/style.html">style</a></span>
</li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><div class="description"><pre><code>public enum CollectionStyle : <a href="http://dlang.org/type.html#basic-data-types">ubyte</a>
</code></pre>
<div class="section "><p>Collection styles.
</p>
</div>
</div><div class="section members"><h2>Values</h2><table><tr><td>Invalid</td><td></td><td><p>Invalid (uninitialized) style
</p>
</td></tr><tr><td>Block</td><td></td><td><p>Block style.
</p>
</td></tr><tr><td>Flow</td><td></td><td><p>Flow style.
</p>
</td></tr></table>
</div>
</div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,71 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="../../style.css"/>
<script src="../../highlight.pack.js"></script>
<title>ScalarStyle</title>
<base href="../../"/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
<small>dyaml.<a href=dyaml/style.html>style</a>.</small><span class="highlight">ScalarStyle</span>
</div>
<div class="sidebar">
<a href="dyaml/style.html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href="dyaml/style.html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml" style='display:block'>
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li>dyaml.<a href="dyaml/node.html">node</a></li>
<li>dyaml.<a href="dyaml/representer.html">representer</a></li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li><span class=" selected">dyaml.<a href="dyaml/style.html">style</a></span>
</li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<div class="aggregate-symbol"><div class="description"><pre><code>public enum ScalarStyle : <a href="http://dlang.org/type.html#basic-data-types">ubyte</a>
</code></pre>
<div class="section "><p>Scalar styles.
</p>
</div>
</div><div class="section members"><h2>Values</h2><table><tr><td>Invalid</td><td></td><td><p>Invalid (uninitialized) style
</p>
</td></tr><tr><td>Literal</td><td></td><td><p><code class="prettyprint">|</code> (Literal block style)
</p>
</td></tr><tr><td>Folded</td><td></td><td><p><code class="prettyprint">&gt;</code> (Folded block style)
</p>
</td></tr><tr><td>Plain</td><td></td><td><p>Plain scalar
</p>
</td></tr><tr><td>SingleQuoted</td><td></td><td><p>Single quoted scalar
</p>
</td></tr><tr><td>DoubleQuoted</td><td></td><td><p>Double quoted scalar
</p>
</td></tr></table>
</div>
</div><script>hljs.initHighlightingOnLoad();</script>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

File diff suppressed because one or more lines are too long

View file

@ -1,84 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="style.css"/>
<script src="highlight.pack.js"></script>
<title>Index</title>
<base href=""/>
<script src="search.js"></script>
<script src="show_hide.js"></script>
</head>
<body>
<div class="main">
<div class="breadcrumbs">
<table id="results"></table>
<a href="index.html" class="home"></a><input type="search" id="search" placeholder="Search" onkeyup="searchSubmit(this.value, event)"/>
Main Page
</div>
<div class="sidebar">
<a href=".html#hide-toc" class="hide" id="hide-toc">&#171;</a>
<a href=".html#show-toc" class="show" id="show-toc">&#187;</a>
<div id="toc-id" class="toc">
<ul><li><span class="package" onclick="show_hide('dyaml');">dyaml</span>
<ul id="dyaml">
<li>dyaml.<a href="dyaml/constructor.html">constructor</a></li>
<li>dyaml.<a href="dyaml/dumper.html">dumper</a></li>
<li>dyaml.<a href="dyaml/exception.html">exception</a></li>
<li>dyaml.<a href="dyaml/hacks.html">hacks</a></li>
<li>dyaml.<a href="dyaml/linebreak.html">linebreak</a></li>
<li>dyaml.<a href="dyaml/loader.html">loader</a></li>
<li>dyaml.<a href="dyaml/node.html">node</a></li>
<li>dyaml.<a href="dyaml/representer.html">representer</a></li>
<li>dyaml.<a href="dyaml/resolver.html">resolver</a></li>
<li>dyaml.<a href="dyaml/style.html">style</a></li>
</ul>
</li>
</ul>
</div></div>
<div class="content">
<table class="module-list">
<tr><td class="module-name"><a href="dyaml/constructor.html">dyaml.constructor</a></td><td><p>Class that processes YAML mappings, sequences and scalars into nodes. This can be
used to add custom data types. A tutorial can be found
<a href="../tutorials/custom_types.html">here</a>.
</p>
</td></tr>
<tr><td class="module-name"><a href="dyaml/dumper.html">dyaml.dumper</a></td><td><p>YAML dumper.
</p>
</td></tr>
<tr><td class="module-name"><a href="dyaml/exception.html">dyaml.exception</a></td><td><p>Exceptions thrown by D:YAML and _exception related code.
</p>
</td></tr>
<tr><td class="module-name"><a href="dyaml/hacks.html">dyaml.hacks</a></td><td><p>Functionality that may sometimes be needed but allows unsafe or unstandard behavior, and should only be used in specific cases.
</p>
</td></tr>
<tr><td class="module-name"><a href="dyaml/linebreak.html">dyaml.linebreak</a></td><td></td></tr>
<tr><td class="module-name"><a href="dyaml/loader.html">dyaml.loader</a></td><td><p>Class used to load YAML documents.
</p>
</td></tr>
<tr><td class="module-name"><a href="dyaml/node.html">dyaml.node</a></td><td><p>Node of a YAML document. Used to read YAML data once it's loaded,
and to prepare data to emit.
</p>
</td></tr>
<tr><td class="module-name"><a href="dyaml/representer.html">dyaml.representer</a></td><td><p>YAML node _representer. Prepares YAML nodes for output. A tutorial can be
found <a href="../tutorials/custom_types.html">here</a>. <br/>
</p>
</td></tr>
<tr><td class="module-name"><a href="dyaml/resolver.html">dyaml.resolver</a></td><td><p>Implements a class that resolves YAML tags. This can be used to implicitly
resolve tags for custom data types, removing the need to explicitly
specify tags in YAML. A tutorial can be found
<a href="../tutorials/custom_types.html">here</a>. <br/>
</p>
</td></tr>
<tr><td class="module-name"><a href="dyaml/style.html">dyaml.style</a></td><td><p>YAML node formatting styles.
</p>
</td></tr>
</div>
<footer>
Generated with <a href="https://github.com/kiith-sa/harbored-mod">harbored-mod</a>
</footer>
</div>
</body>
</html>

View file

@ -1,179 +0,0 @@
"use strict";
var items = [
{"dyaml.node" : "dyaml/node.html"},
{"dyaml.node.NodeException" : "dyaml/node/NodeException.html"},
{"dyaml.node.YAMLNull" : "dyaml/node/YAMLNull.html"},
{"dyaml.node.YAMLNull.toString" : "dyaml/node/YAMLNull.html#toString"},
{"dyaml.node.Node" : "dyaml/node/Node.html"},
{"dyaml.node.Node.this" : "dyaml/node/Node.html#this"},
{"dyaml.node.Node.this" : "dyaml/node/Node.html#this"},
{"dyaml.node.Node.this" : "dyaml/node/Node.html#this"},
{"dyaml.node.Node.this" : "dyaml/node/Node.html#this"},
{"dyaml.node.Node.this" : "dyaml/node/Node.html#this"},
{"dyaml.node.Node.isValid" : "dyaml/node/Node.html#isValid"},
{"dyaml.node.Node.isScalar" : "dyaml/node/Node.html#isScalar"},
{"dyaml.node.Node.isSequence" : "dyaml/node/Node.html#isSequence"},
{"dyaml.node.Node.isMapping" : "dyaml/node/Node.html#isMapping"},
{"dyaml.node.Node.isUserType" : "dyaml/node/Node.html#isUserType"},
{"dyaml.node.Node.isNull" : "dyaml/node/Node.html#isNull"},
{"dyaml.node.Node.tag" : "dyaml/node/Node.html#tag"},
{"dyaml.node.Node.opEquals" : "dyaml/node/Node.html#opEquals"},
{"dyaml.node.Node.as" : "dyaml/node/Node.html#as"},
{"dyaml.node.Node.get" : "dyaml/node/Node.html#get"},
{"dyaml.node.Node.get" : "dyaml/node/Node.html#get"},
{"dyaml.node.Node.length" : "dyaml/node/Node.html#length"},
{"dyaml.node.Node.opIndex" : "dyaml/node/Node.html#opIndex"},
{"dyaml.node.Node.contains" : "dyaml/node/Node.html#contains"},
{"dyaml.node.Node.containsKey" : "dyaml/node/Node.html#containsKey"},
{"dyaml.node.Node.opAssign" : "dyaml/node/Node.html#opAssign"},
{"dyaml.node.Node.opAssign" : "dyaml/node/Node.html#opAssign"},
{"dyaml.node.Node.opIndexAssign" : "dyaml/node/Node.html#opIndexAssign"},
{"dyaml.node.Node.opApply" : "dyaml/node/Node.html#opApply"},
{"dyaml.node.Node.opApply" : "dyaml/node/Node.html#opApply"},
{"dyaml.node.Node.add" : "dyaml/node/Node.html#add"},
{"dyaml.node.Node.add" : "dyaml/node/Node.html#add"},
{"dyaml.node.Node.opBinaryRight" : "dyaml/node/Node.html#opBinaryRight"},
{"dyaml.node.Node.remove" : "dyaml/node/Node.html#remove"},
{"dyaml.node.Node.removeAt" : "dyaml/node/Node.html#removeAt"},
{"dyaml.node.Node.opCmp" : "dyaml/node/Node.html#opCmp"},
{"dyaml.resolver" : "dyaml/resolver.html"},
{"dyaml.resolver.Resolver" : "dyaml/resolver/Resolver.html"},
{"dyaml.resolver.Resolver.this" : "dyaml/resolver/Resolver.html#this"},
{"dyaml.resolver.Resolver.addImplicitResolver" : "dyaml/resolver/Resolver.html#addImplicitResolver"},
{"dyaml.resolver.Resolver.defaultScalarTag" : "dyaml/resolver/Resolver.html#defaultScalarTag"},
{"dyaml.resolver.Resolver.defaultSequenceTag" : "dyaml/resolver/Resolver.html#defaultSequenceTag"},
{"dyaml.resolver.Resolver.defaultMappingTag" : "dyaml/resolver/Resolver.html#defaultMappingTag"},
{"dyaml.hacks" : "dyaml/hacks.html"},
{"dyaml.hacks.scalarStyleHack" : "dyaml/hacks.html#scalarStyleHack"},
{"dyaml.hacks.collectionStyleHack" : "dyaml/hacks.html#collectionStyleHack"},
{"dyaml.hacks.scalarStyleHack" : "dyaml/hacks.html#scalarStyleHack"},
{"dyaml.hacks.collectionStyleHack" : "dyaml/hacks.html#collectionStyleHack"},
{"dyaml.dumper" : "dyaml/dumper.html"},
{"dyaml.dumper.Dumper" : "dyaml/dumper/Dumper.html"},
{"dyaml.dumper.Dumper.this" : "dyaml/dumper/Dumper.html#this"},
{"dyaml.dumper.Dumper.this" : "dyaml/dumper/Dumper.html#this"},
{"dyaml.dumper.Dumper.name" : "dyaml/dumper/Dumper.html#name"},
{"dyaml.dumper.Dumper.resolver" : "dyaml/dumper/Dumper.html#resolver"},
{"dyaml.dumper.Dumper.representer" : "dyaml/dumper/Dumper.html#representer"},
{"dyaml.dumper.Dumper.canonical" : "dyaml/dumper/Dumper.html#canonical"},
{"dyaml.dumper.Dumper.indent" : "dyaml/dumper/Dumper.html#indent"},
{"dyaml.dumper.Dumper.textWidth" : "dyaml/dumper/Dumper.html#textWidth"},
{"dyaml.dumper.Dumper.lineBreak" : "dyaml/dumper/Dumper.html#lineBreak"},
{"dyaml.dumper.Dumper.encoding" : "dyaml/dumper/Dumper.html#encoding"},
{"dyaml.dumper.Dumper.explicitStart" : "dyaml/dumper/Dumper.html#explicitStart"},
{"dyaml.dumper.Dumper.explicitEnd" : "dyaml/dumper/Dumper.html#explicitEnd"},
{"dyaml.dumper.Dumper.YAMLVersion" : "dyaml/dumper/Dumper.html#YAMLVersion"},
{"dyaml.dumper.Dumper.tagDirectives" : "dyaml/dumper/Dumper.html#tagDirectives"},
{"dyaml.dumper.Dumper.dump" : "dyaml/dumper/Dumper.html#dump"},
{"dyaml.representer" : "dyaml/representer.html"},
{"dyaml.representer.RepresenterException" : "dyaml/representer/RepresenterException.html"},
{"dyaml.representer.Representer" : "dyaml/representer/Representer.html"},
{"dyaml.representer.Representer.this" : "dyaml/representer/Representer.html#this"},
{"dyaml.representer.Representer.defaultScalarStyle" : "dyaml/representer/Representer.html#defaultScalarStyle"},
{"dyaml.representer.Representer.defaultCollectionStyle" : "dyaml/representer/Representer.html#defaultCollectionStyle"},
{"dyaml.representer.Representer.addRepresenter" : "dyaml/representer/Representer.html#addRepresenter"},
{"dyaml.representer.Representer.representScalar" : "dyaml/representer/Representer.html#representScalar"},
{"dyaml.representer.Representer.representSequence" : "dyaml/representer/Representer.html#representSequence"},
{"dyaml.representer.Representer.representMapping" : "dyaml/representer/Representer.html#representMapping"},
{"dyaml.representer.representNull" : "dyaml/representer.html#representNull"},
{"dyaml.representer.representString" : "dyaml/representer.html#representString"},
{"dyaml.representer.representBytes" : "dyaml/representer.html#representBytes"},
{"dyaml.representer.representBool" : "dyaml/representer.html#representBool"},
{"dyaml.representer.representLong" : "dyaml/representer.html#representLong"},
{"dyaml.representer.representReal" : "dyaml/representer.html#representReal"},
{"dyaml.representer.representSysTime" : "dyaml/representer.html#representSysTime"},
{"dyaml.representer.representNodes" : "dyaml/representer.html#representNodes"},
{"dyaml.representer.representNodes.pairs" : "dyaml/representer.html#representNodes.pairs"},
{"dyaml.representer.representPairs" : "dyaml/representer.html#representPairs"},
{"dyaml.exception" : "dyaml/exception.html"},
{"dyaml.exception.YAMLException" : "dyaml/exception/YAMLException.html"},
{"dyaml.exception.YAMLException.this" : "dyaml/exception/YAMLException.html#this"},
{"dyaml.linebreak" : "dyaml/linebreak.html"},
{"dyaml.linebreak.LineBreak" : "dyaml/linebreak/LineBreak.html"},
{"dyaml.loader" : "dyaml/loader.html"},
{"dyaml.loader.Loader" : "dyaml/loader/Loader.html"},
{"dyaml.loader.Loader.this" : "dyaml/loader/Loader.html#this"},
{"dyaml.loader.Loader.fromString" : "dyaml/loader/Loader.html#fromString"},
{"dyaml.loader.Loader.this" : "dyaml/loader/Loader.html#this"},
{"dyaml.loader.Loader.name" : "dyaml/loader/Loader.html#name"},
{"dyaml.loader.Loader.resolver" : "dyaml/loader/Loader.html#resolver"},
{"dyaml.loader.Loader.constructor" : "dyaml/loader/Loader.html#constructor"},
{"dyaml.loader.Loader.load" : "dyaml/loader/Loader.html#load"},
{"dyaml.loader.Loader.loadAll" : "dyaml/loader/Loader.html#loadAll"},
{"dyaml.loader.Loader.opApply" : "dyaml/loader/Loader.html#opApply"},
{"dyaml.style" : "dyaml/style.html"},
{"dyaml.style.ScalarStyle" : "dyaml/style/ScalarStyle.html"},
{"dyaml.style.CollectionStyle" : "dyaml/style/CollectionStyle.html"},
{"dyaml.constructor" : "dyaml/constructor.html"},
{"dyaml.constructor.Constructor" : "dyaml/constructor/Constructor.html"},
{"dyaml.constructor.Constructor.this" : "dyaml/constructor/Constructor.html#this"},
{"dyaml.constructor.Constructor.addConstructorScalar" : "dyaml/constructor/Constructor.html#addConstructorScalar"},
{"dyaml.constructor.Constructor.addConstructorSequence" : "dyaml/constructor/Constructor.html#addConstructorSequence"},
{"dyaml.constructor.Constructor.addConstructorMapping" : "dyaml/constructor/Constructor.html#addConstructorMapping"},
{"dyaml.constructor.constructNull" : "dyaml/constructor.html#constructNull"},
{"dyaml.constructor.constructMerge" : "dyaml/constructor.html#constructMerge"},
{"dyaml.constructor.constructBool" : "dyaml/constructor.html#constructBool"},
{"dyaml.constructor.constructLong" : "dyaml/constructor.html#constructLong"},
{"dyaml.constructor.constructReal" : "dyaml/constructor.html#constructReal"},
{"dyaml.constructor.constructBinary" : "dyaml/constructor.html#constructBinary"},
{"dyaml.constructor.constructTimestamp" : "dyaml/constructor.html#constructTimestamp"},
{"dyaml.constructor.constructString" : "dyaml/constructor.html#constructString"},
{"dyaml.constructor.getPairs" : "dyaml/constructor.html#getPairs"},
{"dyaml.constructor.constructOrderedMap" : "dyaml/constructor.html#constructOrderedMap"},
{"dyaml.constructor.constructPairs" : "dyaml/constructor.html#constructPairs"},
{"dyaml.constructor.constructSet" : "dyaml/constructor.html#constructSet"},
{"dyaml.constructor.constructSequence" : "dyaml/constructor.html#constructSequence"},
{"dyaml.constructor.constructMap" : "dyaml/constructor.html#constructMap"},
];
function search(str) {
var re = new RegExp(str.toLowerCase());
var ret = {};
for (var i = 0; i < items.length; i++) {
var k = Object.keys(items[i])[0];
if (re.test(k.toLowerCase()))
ret[k] = items[i][k];
}
return ret;
}
function searchSubmit(value, event) {
console.log("searchSubmit");
var resultTable = document.getElementById("results");
while (resultTable.firstChild)
resultTable.removeChild(resultTable.firstChild);
if (value === "" || event.keyCode == 27) {
resultTable.style.display = "none";
return;
}
resultTable.style.display = "block";
var results = search(value);
var keys = Object.keys(results);
if (keys.length === 0) {
var row = resultTable.insertRow();
var td = document.createElement("td");
var node = document.createTextNode("No results");
td.appendChild(node);
row.appendChild(td);
return;
}
for (var i = 0; i < keys.length; i++) {
var k = keys[i];
var v = results[keys[i]];
var link = document.createElement("a");
link.href = v;
link.textContent = k;
link.attributes.id = "link" + i;
var row = resultTable.insertRow();
row.appendChild(link);
}
}
function hideSearchResults(event) {
if (event.keyCode != 27)
return;
var resultTable = document.getElementById("results");
while (resultTable.firstChild)
resultTable.removeChild(resultTable.firstChild);
resultTable.style.display = "none";
}

View file

@ -1,17 +0,0 @@
window.onload = function(e)
{
var elems = document.querySelectorAll( "div.toc ul ul" );
for( i in elems )
{
if( elems[i].style.display != "block" )
elems[i].style.display = "none";
}
}
function show_hide(id)
{
var elem = document.getElementById( id );
if( elem.style.display == "block" )
elem.style.display = "none";
else elem.style.display = "block";
}

View file

@ -1,726 +0,0 @@
html {
font-family: Verdana, "DejaVu Sans", sans;
margin: 0;
padding: 0;
background-color: #333;
border-left: .2em solid #333;
border-right: .2em solid #333;
min-height: 100%;
}
body {
margin: 0;
padding: 0;
}
div.main {
overflow: hidden;
background-color: #F8F8F8;
}
/**** BREADCRUMBS ****/
div.breadcrumbs {
color: white;
background-color: #333;
padding: 1.0em 0.5em 0.0em 0.5em;
left: 0;
box-sizing: border-box;
text-align: right;
top: 0;
width: 100%;
height: 48px;
font-size: 95%;
position: fixed;
}
div.breadcrumbs a {
color: white;
}
div.breadcrumbs span.highlight, div.breadcrumbs span a {
color: #DAAF07;
}
div.breadcrumbs input {
width: 7em;
margin-top: -0.1em;
}
div.breadcrumbs small {
font-size: 0.8em;
}
/** narrow screen hacks **/
@media only screen and (max-width: 1000px)
{
div.breadcrumbs span, div.breadcrumbs small {
font-size: 80%;
}
}
@media only screen and (max-width: 800px)
{
div.breadcrumbs small {
display: none;
position: fixed;
}
div.breadcrumbs span {
font-size: 75%;
}
}
@media only screen and (max-width: 600px)
{
div.breadcrumbs span {
font-size: 65%;
}
}
div.breadcrumbs a.home {
float: left;
font-weight: bold;
font-size: 200%;
margin: 0 2% 0 0%;
margin-top: -0.3em;
text-decoration: none;
}
div.breadcrumbs input {
float: left;
}
/* anchors need to compensate for the fixed-pos breadcrumbs */
a.anchor
{
display: block;
position: relative;
top: -48px;
visibility: hidden;
}
/** SEARCH RESULTS **/
#results {
position: absolute;
max-height: 30em;
background-color: #eee;
box-shadow: 0 .25em .25em black;
display: none;
text-align: left;
color: black;
margin-top: 2em;
font-size: 70%;
z-index: 1000;
overflow-y: scroll;
}
#results a {
color: blue;
}
/**** SIDEBAR, TABLE OF CONTENTS ****/
div.sidebar {
margin-top: 48px;
float: left;
margin-right: -1px;
border-right: 1px solid #D0D0D0;
background-color: #F8F8F0;
}
div.toc {
padding: 1.5em 0.75em 1em 0.5em;
font-size: 0.55em;
line-height: 1.95em;
display:block;
}
@media only screen and (max-width: 800px)
{
div.toc {
font-size: 0.5em;
padding: 1.5em 0.4em 1em 0.2em;
}
}
/* stuff for showing/hiding the sidebar */
.hide, .show {
display: block;
float: right;
border-right: 1px solid #D0D0D0;
border-bottom: 1px solid #D0D0D0;
border-left: 1px solid #D0D0D0;
/* to avoid having double border */
margin-right: -1px;
font-size: 1.1em;
padding: 0 0.6em;
}
a.hide, a.show {
color: #111;
text-decoration: none;
}
.hide {
background-color: #F8F8F8;
border-bottom-left-radius:3px;
border-right: 1px solid #F8F8F8;
}
.show {
background-color: #F8F8F0;
border-bottom-right-radius:3px;
display: none;
}
.hide:target + .show {
display: inline;
position: absolute;
}
.hide:target {
display: none;
}
.hide:target ~ .toc {
display:none;
}
div.toc .toc-additional {
border-bottom: 1px dashed #333;
line-height: 1.5em;
}
div.toc .toc-additional p, div.toc .toc-additional ul {
margin: 0.4em 0;
}
div.toc ul {
list-style-type: none;
padding-left: 0;
padding-bottom: 0.5em;
}
div.toc ul ul {
list-style-type: none;
padding-left: 0.5em;
}
div.toc a {
color: #111;
font-size: 1.25em;
}
@media only screen and (max-width: 800px)
{
div.toc ul ul {
padding-left: 0.2em;
}
}
div.toc span.package {
cursor: pointer;
line-height: 1.8em;
font-weight: bold;
border: 1px solid rgba(0, 0, 0, 0.12);
border-radius: 2px;
background-color: #F0F0F0;
font-size: 1.25em;
padding: 0 0.2em;
/* counteracts the text movement caused by the padding */
margin: 0 -0.2em;
}
div.toc span.package a {
font-size: 1em;
}
/* Highlight the current module/package */
div.toc .selected {
border-radius: 2px;
background-color: #DAAF07 !important;
padding: 0.325em 0.2em;
/* counteracts the text movement caused by the padding */
margin: -0.325em -0.2em;
}
/**** MAIN CONTENT ****/
div.content {
margin-top: 48px;
padding: 1.5em;
font-size: 90%;
line-height: 130%;
overflow: hidden;
border-left: 1px solid #D0D0D0;
}
@media only screen and (max-width: 800px)
{
div.content {
font-size: 82%;
}
}
@media only screen and (max-width: 600px)
{
div.content {
font-size: 70%;
padding: 1.5em 0.3em 1.5em 0.5em;
}
}
div.content h2 {
margin: .35em 0 .45em 0;
padding-top: .35em;
font-size: 1.3em;
}
div.content h3 {
font-size: 1.1em;
}
div.content tr {
margin: 0;
}
div.content table {
border-collapse: collapse;
border-bottom: 1px dashed #333;
font-size: 90%;
line-height: 130%;
margin: 1em 0;
}
div.content td {
border-top: 1px dashed #333;
margin: 0;
padding: .32em;
}
div.content td:first-child {
text-align: center;
}
/* prevent function attribs from wrapping, make the cell wider instead */
div.content td:first-child * {
white-space: nowrap
}
/* The first markdown-generated paragraph in e.g. Params tables shouldn't add any vertical
* space
*/
div.content td p:first-child {
margin: 0;
}
div.content p strong {
font-size: 92%;
}
.paramName {
font-weight: bold;
width: 6em;
}
div.section {
padding: 0;
margin: 0;
}
/**** EXTRA INFO IN FUNCTION/CLASS/ETC LISTS ****/
div.content td .extrainfo{
display: block;
line-height: 105%;
font-family: monospace;
font-size: 85%;
text-align: center;
}
.extrainfo div {
display: block;
margin: 0;
}
.extrainfo .attr-const { color: blueviolet; }
.extrainfo .attr-pure { color: darkslategray; }
.extrainfo .attr-nothrow { color: brown; }
.extrainfo .attr-nogc { color: darkgreen; }
.extrainfo .attr-safe { color: darkblue; }
.extrainfo .attr-trusted { color: firebrick; }
.extrainfo .attr-system { color: darkred; }
.extrainfo .attr-final { color: darkolivegreen; }
.extrainfo .attr-ref { color: fuchsia; }
/**** SYMBOLS (not used by the one-file-for-every-variable writer backend) ****/
div.aggregate-symbol {
display: flex;
flex-direction: column;
display: -webkit-flex;
-webkit-flex-direction: column;
}
div.aggregate-symbol div.description {
order: -2;
-webkit-order: -2;
}
div.aggregate-symbol div.members {
order: -1;
-webkit-order: -1;
padding-bottom: 0.3em;
border-bottom: 10px solid #333;
margin: 1em 0em 1.5em 0em;
}
div.symbol {
border-radius: 3px;
border: 1px solid #d0d0d0;
padding: 1px 0.4em;
margin: 0.5em 0;
}
a.anchor:target + div.symbol {
border: 2px solid #DAAF07;
border-radius: 0;
background-color: #F8F8F0;
}
/**** SECTION-SPECIFIC STYLES ****/
.section.seealso, .section.note, .section.imports {
font-size: 75%;
line-height: 135%;
/* background-color: #F0F0C0; */
/* background-color: #DA7F07; */
/* background-color: #DA8F07; */
/* background-color: #DA9F07; */
background-color: #DAAF07;
/* background-color: #EABD08; */
padding: 1em;
margin-bottom: 0.5em;
}
.section.seealso h2, .section.note h2 {
display: block;
float: left;
margin: 0 0.7em -0.05em 0em;
padding: 0;
font-size: 1.1em;
}
.section.imports h2 {
display: inline;
margin: 0.5em 0em;
padding: 0;
font-size: 1.1em;
}
.section.seealso div.seealso-content, .section.note div.note-content {
display: block;
margin-left: 6.5em;
}
.section.imports ul {
margin: 0;
list-style-type: none;
padding-left: 1.5em;
-moz-column-count: 4;
-moz-column-gap: 20px;
-webkit-column-count: 4;
-webkit-column-gap: 20px;
column-count: 4;
column-gap: 20px;
}
@media only screen and (max-width: 1400px)
{
.section.imports ul {
-moz-column-count: 3;
-moz-column-gap: 20px;
-webkit-column-count: 3;
-webkit-column-gap: 20px;
column-count: 3;
column-gap: 20px;
}
}
@media only screen and (max-width: 1100px)
{
.section.imports ul {
-moz-column-count: 2;
-moz-column-gap: 13px;
-webkit-column-count: 2;
-webkit-column-gap: 13px;
column-count: 2;
column-gap: 13px;
}
}
@media only screen and (max-width: 800px)
{
.section.imports ul {
-moz-column-count: 1;
-moz-column-gap: 7px;
-webkit-column-count: 1;
-webkit-column-gap: 7px;
column-count: 1;
column-gap: 7px;
}
}
.section.imports ul a {
color: #111;
}
.section.seealso *:first-child, .section.note *:first-child {
margin-top: 0em;
}
.section.seealso ul, .section.note ul {
padding-left: 1.5em;
}
.section.seealso *:last-child, .section.note *:last-child {
margin-bottom: 0em;
}
/**** FOOTER ****/
footer
{
text-align: center;
font-size: 60%;
color: white;
background-color: #333;
}
footer a
{
color: white;
}
/**** CODE ****/
pre {
margin-top: 0.4em;
}
/* DDoc code examples */
code {
background-color: #333;
color: #eee;
padding: 0.8em;
border-radius: .1em;
display: block;
}
code a {
color: white;
text-decoration: none;
border-bottom: 1px dotted #888;
}
/* hmod/libddoc errors */
div.error {
color: darkred;
}
/* Markdown inline code and $(D code) */
code.prettyprint, .d_inlinecode {
font-family: monospace;
color: #333;
background-color:rgba(0,0,0,0.04);
border-radius: .15em;
border: 1px solid #C0C0C0;
padding: 0.22em;
display: inline;
}
code.prettyprint a {
color: black;
border-color: #777;
}
/*do not affect the first <pre>, which is not in a section*/
div.section pre > code {
margin: .5em;
border-radius: .1em;
padding: 0.8em;
}
div.section td pre {
margin: 0;
padding: 0;
}
div.section td code:not(.prettyprint) {
margin: 0;
padding: 0.6em;
}
.hljs {
display: block; padding: 1em;
background: #282B2E;
overflow-x: auto;
display: block;
}
.hljs-keyword,
.hljs-literal,
.hljs-change,
.hljs-winutils,
.hljs-flow,
.lisp .hljs-title,
.clojure .hljs-built_in,
.nginx .hljs-title,
.css .hljs-id,
.tex .hljs-special {
color: #93C763;
}
.hljs-number {
color: #FFCD22;
}
.hljs {
color: #E0E2E4;
}
.css .hljs-tag,
.css .hljs-pseudo {
color: #D0D2B5;
}
.hljs-attribute,
.hljs .hljs-constant {
color: #668BB0;
}
.xml .hljs-attribute {
color: #B3B689;
}
.xml .hljs-tag .hljs-value {
color: #E8E2B7;
}
.hljs-code,
.hljs-class .hljs-title,
.hljs-header {
color: white;
}
.hljs-class,
.hljs-hexcolor {
color: #93C763;
}
.hljs-regexp {
color: #D39745;
}
.hljs-at_rule,
.hljs-at_rule .hljs-keyword {
color: #A082BD;
}
.hljs-doctype {
color: #557182;
}
.hljs-link_url,
.hljs-tag,
.hljs-tag .hljs-title,
.hljs-bullet,
.hljs-subst,
.hljs-emphasis,
.haskell .hljs-type,
.hljs-preprocessor,
.hljs-pragma,
.ruby .hljs-class .hljs-parent,
.hljs-built_in,
.sql .hljs-aggregate,
.django .hljs-template_tag,
.django .hljs-variable,
.smalltalk .hljs-class,
.hljs-javadoc,
.django .hljs-filter .hljs-argument,
.smalltalk .hljs-localvars,
.smalltalk .hljs-array,
.hljs-attr_selector,
.hljs-pseudo,
.hljs-addition,
.hljs-stream,
.hljs-envvar,
.apache .hljs-tag,
.apache .hljs-cbracket,
.tex .hljs-command,
.hljs-prompt {
color: #8CBBAD;
}
.hljs-string {
color: #EC7600;
}
.hljs-comment,
.java .hljs-annotation,
.hljs-blockquote,
.hljs-horizontal_rule,
.python .hljs-decorator,
.hljs-template_comment,
.hljs-pi,
.hljs-deletion,
.hljs-shebang,
.apache .hljs-sqbracket,
.tex .hljs-formula {
color: #818E96;
}
.hljs-keyword,
.hljs-literal,
.css .hljs-id,
.hljs-phpdoc,
.hljs-title,
.hljs-header,
.haskell .hljs-type,
.vbscript .hljs-built_in,
.sql .hljs-aggregate,
.rsl .hljs-built_in,
.smalltalk .hljs-class,
.diff .hljs-header,
.hljs-chunk,
.hljs-winutils,
.bash .hljs-variable,
.apache .hljs-tag,
.tex .hljs-special,
.hljs-request,
.hljs-at_rule .hljs-keyword,
.hljs-status {
font-weight: bold;
}
.coffeescript .javascript,
.javascript .xml,
.tex .hljs-formula,
.xml .javascript,
.xml .vbscript,
.xml .css,
.xml .hljs-cdata {
opacity: 0.5;
}

View file

@ -1,146 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Differences between D:YAML and the YAML specification &mdash; D:YAML 0.5 documentation</title>
<link rel="stylesheet" href="../_static/default.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
VERSION: '0.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="top" title="D:YAML 0.5 documentation" href="../index.html" />
<link rel="prev" title="YAML syntax" href="../tutorials/yaml_syntax.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../tutorials/yaml_syntax.html" title="YAML syntax"
accesskey="P">previous</a></li>
<li><a href="../index.html">D:YAML 0.5 documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="differences-between-d-yaml-and-the-yaml-specification">
<h1>Differences between D:YAML and the YAML specification<a class="headerlink" href="#differences-between-d-yaml-and-the-yaml-specification" title="Permalink to this headline"></a></h1>
<p>There are some differences between D:YAML and the YAML 1.1 specification. Some
are caused by difficulty of implementation of some features, such as multiple
Unicode encodings within single stream, and some by unnecessary restrictions or
ambiguities in the specification.</p>
<p>Still, D:YAML tries to be as close to the specification as possible. It should
never load documents with different meaning than according to the specification,
and documents that fail to load should be very rare (for instance, very few
files use multiple Unicode encodings).</p>
<div class="section" id="list-of-known-differences">
<h2>List of known differences:<a class="headerlink" href="#list-of-known-differences" title="Permalink to this headline"></a></h2>
<p>Differences that can cause valid YAML documents not to load:</p>
<ul>
<li><p class="first">No support for byte order marks and multiple Unicode encodings in a stream.</p>
</li>
<li><p class="first">Plain scalars in flow context cannot contain <tt class="docutils literal"><span class="pre">,</span></tt>, <tt class="docutils literal"><span class="pre">:</span></tt> and <tt class="docutils literal"><span class="pre">?</span></tt>.
This might change with <tt class="docutils literal"><span class="pre">:</span></tt> in the future.
See <a class="reference external" href="http://pyyaml.org/wiki/YAMLColonInFlowContext">http://pyyaml.org/wiki/YAMLColonInFlowContext</a> for details.</p>
</li>
<li><p class="first">The specification does not restrict characters for anchors and
aliases. This may lead to problems, for instance, the document:</p>
<div class="highlight-yaml"><div class="highlight"><pre><span class="p-Indicator">[</span> <span class="nv">*alias</span><span class="p-Indicator">,</span> <span class="nv">value</span> <span class="p-Indicator">]</span>
</pre></div>
</div>
<p>can be interpteted in two ways, as:</p>
<div class="highlight-yaml"><div class="highlight"><pre><span class="p-Indicator">[</span> <span class="s">&quot;value&quot;</span> <span class="p-Indicator">]</span>
</pre></div>
</div>
<p>and:</p>
<div class="highlight-yaml"><div class="highlight"><pre><span class="p-Indicator">[</span> <span class="nv">*alias</span> <span class="p-Indicator">,</span> <span class="s">&quot;value&quot;</span> <span class="p-Indicator">]</span>
</pre></div>
</div>
<p>Therefore we restrict aliases and anchors to ASCII alphanumeric characters.</p>
</li>
<li><p class="first">The specification is confusing about tabs in plain scalars. We don&#8217;t use tabs
in plain scalars at all.</p>
</li>
<li><p class="first">There is no support for recursive data structures in DYAML.</p>
</li>
</ul>
<p>Other differences:</p>
<ul>
<li><p class="first">Indentation is ignored in the flow context, which is less restrictive than the
specification. This allows code such as:</p>
<div class="highlight-yaml"><div class="highlight"><pre><span class="l-Scalar-Plain">key</span><span class="p-Indicator">:</span> <span class="p-Indicator">{</span>
<span class="p-Indicator">}</span>
</pre></div>
</div>
</li>
<li><p class="first">Indentation rules for quoted scalars are loosed: They don&#8217;t need to adhere
indentation as <tt class="docutils literal"><span class="pre">&quot;</span></tt> and <tt class="docutils literal"><span class="pre">'</span></tt> clearly mark the beginning and the end of them.</p>
</li>
<li><p class="first">We allow <tt class="docutils literal"><span class="pre">_</span></tt> in tag handles.</p>
</li>
<li><p class="first">Right now, two mappings with the same contents but different orderings are
considered unequal, even if they are unordered mappings. This is because all
mappings are ordered in the D:YAML implementation. This should change in
future, once D associative arrays work with variant types or a map class or
struct appears in Phobos.</p>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../index.html">
<img class="logo" src="../_static/logo210.png" alt="Logo"/>
</a></p>
<h3><a href="../index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Differences between D:YAML and the YAML specification</a><ul>
<li><a class="reference internal" href="#list-of-known-differences">List of known differences:</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../tutorials/yaml_syntax.html" title="YAML syntax"
>previous</a></li>
<li><a href="../index.html">D:YAML 0.5 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2011-2014, Ferdinand Majerech. Based on PyYAML http://www.pyyaml.org by Kirill Simonov.
Last updated on Aug 06, 2014.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
</div>
</body>
</html>

View file

@ -1,112 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Welcome to D:YAML documentation! &mdash; D:YAML 0.5 documentation</title>
<link rel="stylesheet" href="_static/default.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '0.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="top" title="D:YAML 0.5 documentation" href="#" />
<link rel="next" title="Getting started" href="tutorials/getting_started.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="tutorials/getting_started.html" title="Getting started"
accesskey="N">next</a></li>
<li><a href="#">D:YAML 0.5 documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="welcome-to-d-yaml-documentation">
<h1>Welcome to D:YAML documentation!<a class="headerlink" href="#welcome-to-d-yaml-documentation" title="Permalink to this headline"></a></h1>
<p>API Documentation <a class="reference external" href="http://ddocs.org/dyaml/~master/index.html">(online)</a> <a class="reference external" href="api/index.html">(local copy)</a></p>
<p>Tutorials:</p>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="tutorials/getting_started.html">Getting started</a><ul>
<li class="toctree-l2"><a class="reference internal" href="tutorials/getting_started.html#setting-up">Setting up</a></li>
<li class="toctree-l2"><a class="reference internal" href="tutorials/getting_started.html#your-first-d-yaml-project">Your first D:YAML project</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="tutorials/custom_types.html">Custom YAML data types</a><ul>
<li class="toctree-l2"><a class="reference internal" href="tutorials/custom_types.html#constructor">Constructor</a></li>
<li class="toctree-l2"><a class="reference internal" href="tutorials/custom_types.html#resolver">Resolver</a></li>
<li class="toctree-l2"><a class="reference internal" href="tutorials/custom_types.html#representer">Representer</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="tutorials/yaml_syntax.html">YAML syntax</a><ul>
<li class="toctree-l2"><a class="reference internal" href="tutorials/yaml_syntax.html#documents">Documents</a></li>
<li class="toctree-l2"><a class="reference internal" href="tutorials/yaml_syntax.html#sequences">Sequences</a></li>
<li class="toctree-l2"><a class="reference internal" href="tutorials/yaml_syntax.html#mappings">Mappings</a></li>
<li class="toctree-l2"><a class="reference internal" href="tutorials/yaml_syntax.html#scalars">Scalars</a></li>
<li class="toctree-l2"><a class="reference internal" href="tutorials/yaml_syntax.html#anchors-and-aliases">Anchors and aliases</a></li>
<li class="toctree-l2"><a class="reference internal" href="tutorials/yaml_syntax.html#tags">Tags</a></li>
</ul>
</li>
</ul>
</div>
<p>Articles:</p>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="articles/spec_differences.html">Differences between D:YAML and the YAML specification</a><ul>
<li class="toctree-l2"><a class="reference internal" href="articles/spec_differences.html#list-of-known-differences">List of known differences:</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="#">
<img class="logo" src="_static/logo210.png" alt="Logo"/>
</a></p>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="tutorials/getting_started.html" title="Getting started"
>next</a></li>
<li><a href="#">D:YAML 0.5 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2011-2014, Ferdinand Majerech. Based on PyYAML http://www.pyyaml.org by Kirill Simonov.
Last updated on Aug 06, 2014.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
</div>
</body>
</html>

Binary file not shown.

View file

@ -1,97 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Search &mdash; D:YAML 0.5 documentation</title>
<link rel="stylesheet" href="_static/default.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '0.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/searchtools.js"></script>
<link rel="top" title="D:YAML 0.5 documentation" href="index.html" />
<script type="text/javascript">
jQuery(function() { Search.loadIndex("searchindex.js"); });
</script>
<script type="text/javascript" id="searchindexloader"></script>
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li><a href="index.html">D:YAML 0.5 documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<h1 id="search-documentation">Search</h1>
<div id="fallback" class="admonition warning">
<script type="text/javascript">$('#fallback').hide();</script>
<p>
Please activate JavaScript to enable the search
functionality.
</p>
</div>
<p>
From here you can search these documents. Enter your search
words into the box below and click "search". Note that the search
function will automatically search for all of the words. Pages
containing fewer words won't appear in the result list.
</p>
<form action="" method="get">
<input type="text" name="q" value="" />
<input type="submit" value="search" />
<span id="search-progress" style="padding-left: 10px"></span>
</form>
<div id="search-results">
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="index.html">
<img class="logo" src="_static/logo210.png" alt="Logo"/>
</a></p>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li><a href="index.html">D:YAML 0.5 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2011-2014, Ferdinand Majerech. Based on PyYAML http://www.pyyaml.org by Kirill Simonov.
Last updated on Aug 06, 2014.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
</div>
</body>
</html>

File diff suppressed because one or more lines are too long

View file

@ -1,385 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Custom YAML data types &mdash; D:YAML 0.5 documentation</title>
<link rel="stylesheet" href="../_static/default.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
VERSION: '0.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="top" title="D:YAML 0.5 documentation" href="../index.html" />
<link rel="next" title="YAML syntax" href="yaml_syntax.html" />
<link rel="prev" title="Getting started" href="getting_started.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="yaml_syntax.html" title="YAML syntax"
accesskey="N">next</a></li>
<li class="right" >
<a href="getting_started.html" title="Getting started"
accesskey="P">previous</a> |</li>
<li><a href="../index.html">D:YAML 0.5 documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="custom-yaml-data-types">
<h1>Custom YAML data types<a class="headerlink" href="#custom-yaml-data-types" title="Permalink to this headline"></a></h1>
<p>Sometimes you need to serialize complex data types such as classes. To do this
you could use plain nodes such as mappings with classes&#8217; fields. YAML also
supports custom types with identifiers called <em>tags</em>. That is the topic of this
tutorial.</p>
<p>Each YAML node has a tag specifying its type. For instance: strings use the tag
<tt class="docutils literal"><span class="pre">tag:yaml.org,2002:str</span></tt>. Tags of most default types are <em>implicitly resolved</em>
during parsing - you don&#8217;t need to specify tag for each float, integer, etc.
D:YAML can also implicitly resolve custom tags, as we will show later.</p>
<div class="section" id="constructor">
<h2>Constructor<a class="headerlink" href="#constructor" title="Permalink to this headline"></a></h2>
<p>D:YAML uses the <a class="reference external" href="../api/dyaml.constructor.html">Constructor</a> class to process
each node to hold data type corresponding to its tag. <em>Constructor</em> stores
functions to process each supported tag. These are supplied by the user using
the <em>addConstructorXXX()</em> methods, where <em>XXX</em> is <em>Scalar</em>, <em>Sequence</em> or
<em>Mapping</em>. <em>Constructor</em> is then passed to <em>Loader</em>, which parses YAML input.</p>
<p>Structs and classes must implement the <em>opCmp()</em> operator for YAML support. This
is used for duplicate detection in mappings, sorting and equality comparisons of
nodes. The signature of the operator that must be implemented is
<tt class="docutils literal"><span class="pre">const</span> <span class="pre">int</span> <span class="pre">opCmp(ref</span> <span class="pre">const</span> <span class="pre">MyStruct</span> <span class="pre">s)</span></tt> for structs where <em>MyStruct</em> is the
struct type, and <tt class="docutils literal"><span class="pre">int</span> <span class="pre">opCmp(Object</span> <span class="pre">o)</span></tt> for classes. Note that the class
<em>opCmp()</em> should not alter the compared values - it is not const for compatibility
reasons.</p>
<p>We will implement support for an RGB color type. It is implemented as the
following struct:</p>
<div class="highlight-d"><div class="highlight"><pre><span class="k">struct</span> <span class="n">Color</span>
<span class="p">{</span>
<span class="kt">ubyte</span> <span class="n">red</span><span class="p">;</span>
<span class="kt">ubyte</span> <span class="n">green</span><span class="p">;</span>
<span class="kt">ubyte</span> <span class="n">blue</span><span class="p">;</span>
<span class="k">const</span> <span class="kt">int</span> <span class="n">opCmp</span><span class="p">(</span><span class="k">ref</span> <span class="k">const</span> <span class="n">Color</span> <span class="n">c</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span><span class="p">(</span><span class="n">red</span> <span class="p">!=</span> <span class="n">c</span><span class="p">.</span><span class="n">red</span><span class="p">)</span> <span class="p">{</span><span class="k">return</span> <span class="n">red</span> <span class="p">-</span> <span class="n">c</span><span class="p">.</span><span class="n">red</span><span class="p">;}</span>
<span class="k">if</span><span class="p">(</span><span class="n">green</span> <span class="p">!=</span> <span class="n">c</span><span class="p">.</span><span class="n">green</span><span class="p">){</span><span class="k">return</span> <span class="n">green</span> <span class="p">-</span> <span class="n">c</span><span class="p">.</span><span class="n">green</span><span class="p">;}</span>
<span class="k">if</span><span class="p">(</span><span class="n">blue</span> <span class="p">!=</span> <span class="n">c</span><span class="p">.</span><span class="n">blue</span><span class="p">)</span> <span class="p">{</span><span class="k">return</span> <span class="n">blue</span> <span class="p">-</span> <span class="n">c</span><span class="p">.</span><span class="n">blue</span><span class="p">;}</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<p>First, we need a function to construct our data type. The function will take a
reference to <em>Node</em> to construct from. The node is guaranteed to contain either
a <em>string</em>, an array of <em>Node</em> or of <em>Node.Pair</em>, depending on whether we&#8217;re
constructing our value from a scalar, sequence, or mapping, respectively.
If this function throws any exception, D:YAML handles it and adds its message
to a <em>YAMLException</em> that will be thrown when loading the file.</p>
<p>In this tutorial, we have functions to construct a color from a scalar, using
CSS-like format, RRGGBB, or from a mapping, where we use the following format:
{r:RRR, g:GGG, b:BBB} . Code of these functions:</p>
<div class="highlight-d"><div class="highlight"><pre><span class="n">Color</span> <span class="n">constructColorScalar</span><span class="p">(</span><span class="k">ref</span> <span class="n">Node</span> <span class="n">node</span><span class="p">)</span>
<span class="p">{</span>
<span class="nb">string</span> <span class="n">value</span> <span class="p">=</span> <span class="n">node</span><span class="p">.</span><span class="n">as</span><span class="p">!</span><span class="nb">string</span><span class="p">;</span>
<span class="k">if</span><span class="p">(</span><span class="n">value</span><span class="p">.</span><span class="n">length</span> <span class="p">!=</span> <span class="mi">6</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">throw</span> <span class="k">new</span> <span class="n">Exception</span><span class="p">(</span><span class="s">&quot;Invalid color: &quot;</span> <span class="p">~</span> <span class="n">value</span><span class="p">);</span>
<span class="p">}</span>
<span class="c1">//We don&#39;t need to check for uppercase chars this way.</span>
<span class="n">value</span> <span class="p">=</span> <span class="n">value</span><span class="p">.</span><span class="n">toLower</span><span class="p">();</span>
<span class="c1">//Get value of a hex digit.</span>
<span class="kt">uint</span> <span class="n">hex</span><span class="p">(</span><span class="kt">char</span> <span class="n">c</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">import</span> <span class="n">std</span><span class="p">.</span><span class="n">ascii</span><span class="p">;</span>
<span class="k">if</span><span class="p">(!</span><span class="n">std</span><span class="p">.</span><span class="n">ascii</span><span class="p">.</span><span class="n">isHexDigit</span><span class="p">(</span><span class="n">c</span><span class="p">))</span>
<span class="p">{</span>
<span class="k">throw</span> <span class="k">new</span> <span class="n">Exception</span><span class="p">(</span><span class="s">&quot;Invalid color: &quot;</span> <span class="p">~</span> <span class="n">value</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">if</span><span class="p">(</span><span class="n">std</span><span class="p">.</span><span class="n">ascii</span><span class="p">.</span><span class="n">isDigit</span><span class="p">(</span><span class="n">c</span><span class="p">))</span>
<span class="p">{</span>
<span class="k">return</span> <span class="n">c</span> <span class="p">-</span> <span class="sc">&#39;0&#39;</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">return</span> <span class="n">c</span> <span class="p">-</span> <span class="sc">&#39;a&#39;</span> <span class="p">+</span> <span class="mi">10</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">Color</span> <span class="n">result</span><span class="p">;</span>
<span class="n">result</span><span class="p">.</span><span class="n">red</span> <span class="p">=</span> <span class="k">cast</span><span class="p">(</span><span class="kt">ubyte</span><span class="p">)(</span><span class="mi">16</span> <span class="p">*</span> <span class="n">hex</span><span class="p">(</span><span class="n">value</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="p">+</span> <span class="n">hex</span><span class="p">(</span><span class="n">value</span><span class="p">[</span><span class="mi">1</span><span class="p">]));</span>
<span class="n">result</span><span class="p">.</span><span class="n">green</span> <span class="p">=</span> <span class="k">cast</span><span class="p">(</span><span class="kt">ubyte</span><span class="p">)(</span><span class="mi">16</span> <span class="p">*</span> <span class="n">hex</span><span class="p">(</span><span class="n">value</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span> <span class="p">+</span> <span class="n">hex</span><span class="p">(</span><span class="n">value</span><span class="p">[</span><span class="mi">3</span><span class="p">]));</span>
<span class="n">result</span><span class="p">.</span><span class="n">blue</span> <span class="p">=</span> <span class="k">cast</span><span class="p">(</span><span class="kt">ubyte</span><span class="p">)(</span><span class="mi">16</span> <span class="p">*</span> <span class="n">hex</span><span class="p">(</span><span class="n">value</span><span class="p">[</span><span class="mi">4</span><span class="p">])</span> <span class="p">+</span> <span class="n">hex</span><span class="p">(</span><span class="n">value</span><span class="p">[</span><span class="mi">5</span><span class="p">]));</span>
<span class="k">return</span> <span class="n">result</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">Color</span> <span class="n">constructColorMapping</span><span class="p">(</span><span class="k">ref</span> <span class="n">Node</span> <span class="n">node</span><span class="p">)</span>
<span class="p">{</span>
<span class="kt">ubyte</span> <span class="n">r</span><span class="p">,</span><span class="n">g</span><span class="p">,</span><span class="n">b</span><span class="p">;</span>
<span class="c1">//Might throw if a value is missing is not an integer, or is out of range.</span>
<span class="c1">//If this happens, D:YAML will handle the exception and use its message</span>
<span class="c1">//in a YAMLException thrown when loading.</span>
<span class="n">r</span> <span class="p">=</span> <span class="n">node</span><span class="p">[</span><span class="s">&quot;r&quot;</span><span class="p">].</span><span class="n">as</span><span class="p">!</span><span class="kt">ubyte</span><span class="p">;</span>
<span class="n">g</span> <span class="p">=</span> <span class="n">node</span><span class="p">[</span><span class="s">&quot;g&quot;</span><span class="p">].</span><span class="n">as</span><span class="p">!</span><span class="kt">ubyte</span><span class="p">;</span>
<span class="n">b</span> <span class="p">=</span> <span class="n">node</span><span class="p">[</span><span class="s">&quot;b&quot;</span><span class="p">].</span><span class="n">as</span><span class="p">!</span><span class="kt">ubyte</span><span class="p">;</span>
<span class="k">return</span> <span class="n">Color</span><span class="p">(</span><span class="k">cast</span><span class="p">(</span><span class="kt">ubyte</span><span class="p">)</span><span class="n">r</span><span class="p">,</span> <span class="k">cast</span><span class="p">(</span><span class="kt">ubyte</span><span class="p">)</span><span class="n">g</span><span class="p">,</span> <span class="k">cast</span><span class="p">(</span><span class="kt">ubyte</span><span class="p">)</span><span class="n">b</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
<p>Next, we need some YAML data using our new tag. Create a file called
<tt class="docutils literal"><span class="pre">input.yaml</span></tt> with the following contents:</p>
<div class="highlight-yaml"><div class="highlight"><pre><span class="l-Scalar-Plain">scalar-red</span><span class="p-Indicator">:</span> <span class="kt">!color</span> <span class="l-Scalar-Plain">FF0000</span>
<span class="l-Scalar-Plain">scalar-orange</span><span class="p-Indicator">:</span> <span class="kt">!color</span> <span class="l-Scalar-Plain">FFFF00</span>
<span class="l-Scalar-Plain">mapping-red</span><span class="p-Indicator">:</span> <span class="kt">!color-mapping</span> <span class="p-Indicator">{</span><span class="nv">r</span><span class="p-Indicator">:</span> <span class="nv">255</span><span class="p-Indicator">,</span> <span class="nv">g</span><span class="p-Indicator">:</span> <span class="nv">0</span><span class="p-Indicator">,</span> <span class="nv">b</span><span class="p-Indicator">:</span> <span class="nv">0</span><span class="p-Indicator">}</span>
<span class="l-Scalar-Plain">mapping-orange</span><span class="p-Indicator">:</span>
<span class="kt">!color-mapping</span>
<span class="l-Scalar-Plain">r</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">255</span>
<span class="l-Scalar-Plain">g</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">255</span>
<span class="l-Scalar-Plain">b</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">0</span>
</pre></div>
</div>
<p>You can see that we&#8217;re using tag <tt class="docutils literal"><span class="pre">!color</span></tt> for scalar colors, and
<tt class="docutils literal"><span class="pre">!color-mapping</span></tt> for colors expressed as mappings.</p>
<p>Finally, the code to put it all together:</p>
<div class="highlight-d"><div class="highlight"><pre><span class="kt">void</span> <span class="n">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">auto</span> <span class="n">red</span> <span class="p">=</span> <span class="n">Color</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
<span class="k">auto</span> <span class="n">orange</span> <span class="p">=</span> <span class="n">Color</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
<span class="k">try</span>
<span class="p">{</span>
<span class="k">auto</span> <span class="n">constructor</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Constructor</span><span class="p">;</span>
<span class="c1">//both functions handle the same tag, but one handles scalar, one mapping.</span>
<span class="n">constructor</span><span class="p">.</span><span class="n">addConstructorScalar</span><span class="p">(</span><span class="s">&quot;!color&quot;</span><span class="p">,</span> <span class="p">&amp;</span><span class="n">constructColorScalar</span><span class="p">);</span>
<span class="n">constructor</span><span class="p">.</span><span class="n">addConstructorMapping</span><span class="p">(</span><span class="s">&quot;!color-mapping&quot;</span><span class="p">,</span> <span class="p">&amp;</span><span class="n">constructColorMapping</span><span class="p">);</span>
<span class="k">auto</span> <span class="n">loader</span> <span class="p">=</span> <span class="n">Loader</span><span class="p">(</span><span class="s">&quot;input.yaml&quot;</span><span class="p">);</span>
<span class="n">loader</span><span class="p">.</span><span class="n">constructor</span> <span class="p">=</span> <span class="n">constructor</span><span class="p">;</span>
<span class="k">auto</span> <span class="n">root</span> <span class="p">=</span> <span class="n">loader</span><span class="p">.</span><span class="n">load</span><span class="p">();</span>
<span class="k">if</span><span class="p">(</span><span class="n">root</span><span class="p">[</span><span class="s">&quot;scalar-red&quot;</span><span class="p">].</span><span class="n">as</span><span class="p">!</span><span class="n">Color</span> <span class="p">==</span> <span class="n">red</span> <span class="p">&amp;&amp;</span>
<span class="n">root</span><span class="p">[</span><span class="s">&quot;mapping-red&quot;</span><span class="p">].</span><span class="n">as</span><span class="p">!</span><span class="n">Color</span> <span class="p">==</span> <span class="n">red</span> <span class="p">&amp;&amp;</span>
<span class="n">root</span><span class="p">[</span><span class="s">&quot;scalar-orange&quot;</span><span class="p">].</span><span class="n">as</span><span class="p">!</span><span class="n">Color</span> <span class="p">==</span> <span class="n">orange</span> <span class="p">&amp;&amp;</span>
<span class="n">root</span><span class="p">[</span><span class="s">&quot;mapping-orange&quot;</span><span class="p">].</span><span class="n">as</span><span class="p">!</span><span class="n">Color</span> <span class="p">==</span> <span class="n">orange</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">writeln</span><span class="p">(</span><span class="s">&quot;SUCCESS&quot;</span><span class="p">);</span>
<span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">catch</span><span class="p">(</span><span class="n">YAMLException</span> <span class="n">e</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">writeln</span><span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="n">msg</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">writeln</span><span class="p">(</span><span class="s">&quot;FAILURE&quot;</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
<p>First, we create a <em>Constructor</em> and pass functions to handle the <tt class="docutils literal"><span class="pre">!color</span></tt>
and <tt class="docutils literal"><span class="pre">!color-mapping</span></tt> tag. We construct a <em>Loader</em> and pass the <em>Constructor</em>
to it. We then load the YAML document, and finally, read the colors to test if
they were loaded as expected.</p>
<p>You can find the source code for what we&#8217;ve done so far in the
<tt class="docutils literal"><span class="pre">examples/constructor</span></tt> directory in the D:YAML package.</p>
</div>
<div class="section" id="resolver">
<h2>Resolver<a class="headerlink" href="#resolver" title="Permalink to this headline"></a></h2>
<p>Specifying tag for every color can be tedious. D:YAML can implicitly resolve
scalar tags using regular expressions. This is how default types are resolved.
We will use the <a class="reference external" href="../api/dyaml.resolver.html">Resolver</a> class to add implicit
tag resolution for the Color data type (in its scalar form).</p>
<p>We use the <em>addImplicitResolver()</em> method of <em>Resolver</em>, passing the tag,
regular expression the scalar must match to resolve to this tag, and a string of
possible starting characters of the scalar. Then we pass the <em>Resolver</em> to
<em>Loader</em>.</p>
<p>Note that resolvers added first override ones added later. If no resolver
matches a scalar, YAML string tag is used. Therefore our custom values must not
be resolvable as any non-string YAML data type.</p>
<p>Add this to your code to add implicit resolution of <tt class="docutils literal"><span class="pre">!color</span></tt>.</p>
<div class="highlight-d"><div class="highlight"><pre><span class="c1">//code from the previous example...</span>
<span class="k">auto</span> <span class="n">resolver</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Resolver</span><span class="p">;</span>
<span class="k">import</span> <span class="n">std</span><span class="p">.</span><span class="n">regex</span><span class="p">;</span>
<span class="n">resolver</span><span class="p">.</span><span class="n">addImplicitResolver</span><span class="p">(</span><span class="s">&quot;!color&quot;</span><span class="p">,</span> <span class="n">std</span><span class="p">.</span><span class="n">regex</span><span class="p">.</span><span class="n">regex</span><span class="p">(</span><span class="s">&quot;[0-9a-fA-F]{6}&quot;</span><span class="p">),</span>
<span class="s">&quot;0123456789abcdefABCDEF&quot;</span><span class="p">);</span>
<span class="k">auto</span> <span class="n">loader</span> <span class="p">=</span> <span class="n">Loader</span><span class="p">(</span><span class="s">&quot;input.yaml&quot;</span><span class="p">);</span>
<span class="n">loader</span><span class="p">.</span><span class="n">constructor</span> <span class="p">=</span> <span class="n">constructor</span><span class="p">;</span>
<span class="n">loader</span><span class="p">.</span><span class="n">resolver</span> <span class="p">=</span> <span class="n">resolver</span><span class="p">;</span>
<span class="c1">//code from the previous example...</span>
</pre></div>
</div>
<p>Now, change contents of <tt class="docutils literal"><span class="pre">input.yaml</span></tt> to this:</p>
<div class="highlight-yaml"><div class="highlight"><pre><span class="l-Scalar-Plain">scalar-red</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">FF0000</span>
<span class="l-Scalar-Plain">scalar-orange</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">FFFF00</span>
<span class="l-Scalar-Plain">mapping-red</span><span class="p-Indicator">:</span> <span class="kt">!color-mapping</span> <span class="p-Indicator">{</span><span class="nv">r</span><span class="p-Indicator">:</span> <span class="nv">255</span><span class="p-Indicator">,</span> <span class="nv">g</span><span class="p-Indicator">:</span> <span class="nv">0</span><span class="p-Indicator">,</span> <span class="nv">b</span><span class="p-Indicator">:</span> <span class="nv">0</span><span class="p-Indicator">}</span>
<span class="l-Scalar-Plain">mapping-orange</span><span class="p-Indicator">:</span>
<span class="kt">!color-mapping</span>
<span class="l-Scalar-Plain">r</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">255</span>
<span class="l-Scalar-Plain">g</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">255</span>
<span class="l-Scalar-Plain">b</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">0</span>
</pre></div>
</div>
<p>We no longer need to specify the tag for scalar color values. Compile and test
the example. If everything went as expected, it should report success.</p>
<p>You can find the complete code in the <tt class="docutils literal"><span class="pre">examples/resolver</span></tt> directory in the
D:YAML package.</p>
</div>
<div class="section" id="representer">
<h2>Representer<a class="headerlink" href="#representer" title="Permalink to this headline"></a></h2>
<p>Now that you can load custom data types, it might be good to know how to dump
them. D:YAML uses the <a class="reference external" href="../api/dyaml.representer.html">Representer</a> class for
this purpose.</p>
<p><em>Representer</em> processes YAML nodes into plain mapping, sequence or scalar nodes
ready for output. Just like with <em>Constructor</em>, this is done by user specified
functions. These functions take references to a node to process and to the
<em>Representer</em>, and return the processed node.</p>
<p>Representer functions can be added with the <em>addRepresenter()</em> method. The
<em>Representer</em> is then passed to <em>Dumper</em>, which dumps YAML documents. Only one
function per type can be specified. This is asserted in <em>addRepresenter()</em>
preconditions. Default YAML types already have representer functions specified,
but you can disable them by constructing <em>Representer</em> with the
<em>useDefaultRepresenters</em> parameter set to false.</p>
<p>By default, tags are explicitly output for all non-default types. To make dumped
tags implicit, you can pass a <em>Resolver</em> that will resolve them implicitly. Of
course, you will need to use an identical <em>Resolver</em> when loading the output.</p>
<p>With the following code, we will add support for dumping the our Color type.</p>
<div class="highlight-d"><div class="highlight"><pre><span class="n">Node</span> <span class="n">representColor</span><span class="p">(</span><span class="k">ref</span> <span class="n">Node</span> <span class="n">node</span><span class="p">,</span> <span class="n">Representer</span> <span class="n">representer</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">//The node is guaranteed to be Color as we add representer for Color.</span>
<span class="n">Color</span> <span class="n">color</span> <span class="p">=</span> <span class="n">node</span><span class="p">.</span><span class="n">as</span><span class="p">!</span><span class="n">Color</span><span class="p">;</span>
<span class="k">static</span> <span class="k">immutable</span> <span class="n">hex</span> <span class="p">=</span> <span class="s">&quot;0123456789ABCDEF&quot;</span><span class="p">;</span>
<span class="c1">//Using the color format from the Constructor example.</span>
<span class="nb">string</span> <span class="n">scalar</span><span class="p">;</span>
<span class="k">foreach</span><span class="p">(</span><span class="n">channel</span><span class="p">;</span> <span class="p">[</span><span class="n">color</span><span class="p">.</span><span class="n">red</span><span class="p">,</span> <span class="n">color</span><span class="p">.</span><span class="n">green</span><span class="p">,</span> <span class="n">color</span><span class="p">.</span><span class="n">blue</span><span class="p">])</span>
<span class="p">{</span>
<span class="n">scalar</span> <span class="p">~=</span> <span class="n">hex</span><span class="p">[</span><span class="n">channel</span> <span class="p">/</span> <span class="mi">16</span><span class="p">];</span>
<span class="n">scalar</span> <span class="p">~=</span> <span class="n">hex</span><span class="p">[</span><span class="n">channel</span> <span class="p">%</span> <span class="mi">16</span><span class="p">];</span>
<span class="p">}</span>
<span class="c1">//Representing as a scalar, with custom tag to specify this data type.</span>
<span class="k">return</span> <span class="n">representer</span><span class="p">.</span><span class="n">representScalar</span><span class="p">(</span><span class="s">&quot;!color&quot;</span><span class="p">,</span> <span class="n">scalar</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
<p>First we get the <em>Color</em> from the node. Then we convert it to a string with the
CSS-like format we&#8217;ve used before. Finally, we use the <em>representScalar()</em>
method of <em>Representer</em> to get a scalar node ready for output. There are
corresponding <em>representMapping()</em> and <em>representSequence()</em> methods
as well, with examples in the
<a class="reference external" href="../api/dyaml.resolver.html">Resolver API documentation</a>.</p>
<p>Since a type can only have one representer function, we don&#8217;t dump <em>Color</em> both
in the scalar and mapping formats we&#8217;ve used before. However, you can decide to
dump the node with different formats/tags in the representer function itself.
E.g. you could dump the Color as a mapping based on some arbitrary condition,
such as the color being white.</p>
<div class="highlight-d"><div class="highlight"><pre><span class="kt">void</span> <span class="n">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">try</span>
<span class="p">{</span>
<span class="k">auto</span> <span class="n">representer</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Representer</span><span class="p">;</span>
<span class="n">representer</span><span class="p">.</span><span class="n">addRepresenter</span><span class="p">!</span><span class="n">Color</span><span class="p">(&amp;</span><span class="n">representColor</span><span class="p">);</span>
<span class="k">auto</span> <span class="n">resolver</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Resolver</span><span class="p">;</span>
<span class="k">import</span> <span class="n">std</span><span class="p">.</span><span class="n">regex</span><span class="p">;</span>
<span class="n">resolver</span><span class="p">.</span><span class="n">addImplicitResolver</span><span class="p">(</span><span class="s">&quot;!color&quot;</span><span class="p">,</span> <span class="n">std</span><span class="p">.</span><span class="n">regex</span><span class="p">.</span><span class="n">regex</span><span class="p">(</span><span class="s">&quot;[0-9a-fA-F]{6}&quot;</span><span class="p">),</span>
<span class="s">&quot;0123456789abcdefABCDEF&quot;</span><span class="p">);</span>
<span class="k">auto</span> <span class="n">dumper</span> <span class="p">=</span> <span class="n">Dumper</span><span class="p">(</span><span class="s">&quot;output.yaml&quot;</span><span class="p">);</span>
<span class="n">dumper</span><span class="p">.</span><span class="n">representer</span> <span class="p">=</span> <span class="n">representer</span><span class="p">;</span>
<span class="n">dumper</span><span class="p">.</span><span class="n">resolver</span> <span class="p">=</span> <span class="n">resolver</span><span class="p">;</span>
<span class="k">auto</span> <span class="n">document</span> <span class="p">=</span> <span class="n">Node</span><span class="p">([</span><span class="n">Color</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span>
<span class="n">Color</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span>
<span class="n">Color</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">)]);</span>
<span class="n">dumper</span><span class="p">.</span><span class="n">dump</span><span class="p">(</span><span class="n">document</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">catch</span><span class="p">(</span><span class="n">YAMLException</span> <span class="n">e</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">writeln</span><span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="n">msg</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<p>We construct a new <em>Representer</em>, and specify a representer function for the
<em>Color</em> (the template argument) type. We also construct a <em>Resolver</em>, same as in
the previous section, so the <tt class="docutils literal"><span class="pre">!color</span></tt> tag will be implicit. Of course,
identical <em>Resolver</em> would then have to be used when loading the file.
You don&#8217;t need to do this if you want the tag to be explicit.</p>
<p>We construct a <em>Dumper</em> to file <tt class="docutils literal"><span class="pre">output.yaml</span></tt> and pass the <em>Representer</em> and
<em>Resolver</em> to it. Then, we create a simple node containing a sequence of colors
and finally, we dump it.</p>
<p>Source code for this section can be found in the <tt class="docutils literal"><span class="pre">examples/representer</span></tt>
directory of the D:YAML package.</p>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../index.html">
<img class="logo" src="../_static/logo210.png" alt="Logo"/>
</a></p>
<h3><a href="../index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Custom YAML data types</a><ul>
<li><a class="reference internal" href="#constructor">Constructor</a></li>
<li><a class="reference internal" href="#resolver">Resolver</a></li>
<li><a class="reference internal" href="#representer">Representer</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="yaml_syntax.html" title="YAML syntax"
>next</a></li>
<li class="right" >
<a href="getting_started.html" title="Getting started"
>previous</a> |</li>
<li><a href="../index.html">D:YAML 0.5 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2011-2014, Ferdinand Majerech. Based on PyYAML http://www.pyyaml.org by Kirill Simonov.
Last updated on Aug 06, 2014.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
</div>
</body>
</html>

View file

@ -1,241 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Getting started &mdash; D:YAML 0.5 documentation</title>
<link rel="stylesheet" href="../_static/default.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
VERSION: '0.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="top" title="D:YAML 0.5 documentation" href="../index.html" />
<link rel="next" title="Custom YAML data types" href="custom_types.html" />
<link rel="prev" title="Welcome to D:YAML documentation!" href="../index.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="custom_types.html" title="Custom YAML data types"
accesskey="N">next</a></li>
<li class="right" >
<a href="../index.html" title="Welcome to D:YAML documentation!"
accesskey="P">previous</a> |</li>
<li><a href="../index.html">D:YAML 0.5 documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="getting-started">
<h1>Getting started<a class="headerlink" href="#getting-started" title="Permalink to this headline"></a></h1>
<p>Welcome to D:YAML! D:YAML is a <a class="reference external" href="http://en.wikipedia.org/wiki/YAML">YAML</a> parser
library for the <a class="reference external" href="http://dlang.org">D programming language</a>. This tutorial will
explain how to set D:YAML up and use it in your projects.</p>
<p>This is meant to be the <strong>simplest possible</strong> introduction to D:YAML. Some of this
information might already be known to you. Only basic usage is covered.</p>
<div class="section" id="setting-up">
<h2>Setting up<a class="headerlink" href="#setting-up" title="Permalink to this headline"></a></h2>
<div class="section" id="install-the-dmd-compiler">
<h3>Install the DMD compiler<a class="headerlink" href="#install-the-dmd-compiler" title="Permalink to this headline"></a></h3>
<p>Digital Mars D compiler, or DMD, is the most commonly used D compiler. You can find its
newest version <a class="reference external" href="http://dlang.org/download.html">here</a>. Download the version of DMD
for your operating system and install it.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Other D compilers exist, such as
<a class="reference external" href="http://gdcproject.org/">GDC</a> and
<a class="reference external" href="http://bitbucket.org/goshawk/gdc/wiki/Home">LDC</a>.</p>
</div>
</div>
<div class="section" id="install-dub">
<h3>Install dub<a class="headerlink" href="#install-dub" title="Permalink to this headline"></a></h3>
<p><a class="reference external" href="http://code.dlang.org/about">dub</a> is a build system and package manager for D.
It is the standard way to manage D projects and their dependencies, compilation and so
on.</p>
<p>DMD may include DUB in future releases, but at this point we need to install it
separately. See
<a class="reference external" href="https://github.com/D-Programming-Language/dub#installation">installation instructions</a>.</p>
</div>
</div>
<div class="section" id="your-first-d-yaml-project">
<h2>Your first D:YAML project<a class="headerlink" href="#your-first-d-yaml-project" title="Permalink to this headline"></a></h2>
<p>Create a directory for your project and in that directory, create a new file named
<tt class="docutils literal"><span class="pre">input.yaml</span></tt> and paste this code into the file:</p>
<div class="highlight-yaml"><div class="highlight"><pre><span class="l-Scalar-Plain">Hello World</span> <span class="p-Indicator">:</span> <span class="p-Indicator">[</span><span class="nv">Hello</span><span class="p-Indicator">,</span> <span class="nv">World</span><span class="p-Indicator">]</span>
<span class="l-Scalar-Plain">Answer</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">42</span>
</pre></div>
</div>
<p>This will serve as input for our example.</p>
<p>Now we need to parse it. Create a new file with name <tt class="docutils literal"><span class="pre">main.d</span></tt>. Paste following code
into the file:</p>
<div class="highlight-d"><div class="highlight"><pre><span class="k">import</span> <span class="n">std</span><span class="p">.</span><span class="n">stdio</span><span class="p">;</span>
<span class="k">import</span> <span class="n">yaml</span><span class="p">;</span>
<span class="kt">void</span> <span class="n">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="c1">//Read the input.</span>
<span class="n">Node</span> <span class="n">root</span> <span class="p">=</span> <span class="n">Loader</span><span class="p">(</span><span class="s">&quot;input.yaml&quot;</span><span class="p">).</span><span class="n">load</span><span class="p">();</span>
<span class="c1">//Display the data read.</span>
<span class="k">foreach</span><span class="p">(</span><span class="nb">string</span> <span class="n">word</span><span class="p">;</span> <span class="n">root</span><span class="p">[</span><span class="s">&quot;Hello World&quot;</span><span class="p">])</span>
<span class="p">{</span>
<span class="n">writeln</span><span class="p">(</span><span class="n">word</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">writeln</span><span class="p">(</span><span class="s">&quot;The answer is &quot;</span><span class="p">,</span> <span class="n">root</span><span class="p">[</span><span class="s">&quot;Answer&quot;</span><span class="p">].</span><span class="n">as</span><span class="p">!</span><span class="kt">int</span><span class="p">);</span>
<span class="c1">//Dump the loaded document to output.yaml.</span>
<span class="n">Dumper</span><span class="p">(</span><span class="s">&quot;output.yaml&quot;</span><span class="p">).</span><span class="n">dump</span><span class="p">(</span><span class="n">root</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
<div class="section" id="explanation-of-the-code">
<h3>Explanation of the code<a class="headerlink" href="#explanation-of-the-code" title="Permalink to this headline"></a></h3>
<p>First, we import the <em>dyaml.all</em> module. This is the only D:YAML module you need to
import - it automatically imports all needed modules.</p>
<p>Next we load the file using the <em>Loader.load()</em> method. <em>Loader</em> is a struct used for
parsing YAML documents. The <em>load()</em> method loads the file as <strong>one</strong> YAML document, or
throws <em>YAMLException</em>, D:YAML exception type, if the file could not be parsed or
contains more than one document. Note that we don&#8217;t do any error checking here in order
to keep the example as simple as possible.</p>
<p><em>Node</em> represents a node in a YAML document. It can be a sequence (array), mapping
(associative array) or a scalar (value). Here the root node is a mapping, and we use the
index operator to get subnodes with keys &#8220;Hello World&#8221; and &#8220;Answer&#8221;. We iterate over the
former, as it is a sequence, and use the <em>Node.as()</em> method on the latter to read its
value as an integer.</p>
<p>You can iterate over a mapping or sequence as if it was an associative or normal array,
respectively. If you try to iterate over a scalar, it will throw a <em>YAMLException</em>.</p>
<p>You can iterate using <em>Node</em> as the iterated type, or specify the type iterated nodes
are expected to have. D:YAML will automatically convert to that type if possible. Here
we specify the <em>string</em> type, so we iterate over the &#8220;Hello World&#8221; sequence as an array
of strings. If it is not possible to convert to iterated type, a <em>YAMLException</em> is
thrown. For instance, if we specified <em>int</em> here, we would get an error, as &#8220;Hello&#8221;
cannot be converted to an integer.</p>
<p>The <em>Node.as()</em> method is used to read value of a scalar node as specified type. If the
scalar does not have the specified type, D:YAML will try to convert it, throwing
<em>YAMLException</em> if not possible.</p>
<p>Finally we dump the document we just read to <tt class="docutils literal"><span class="pre">output.yaml</span></tt> with the <em>Dumper.dump()</em>
method. <em>Dumper</em> is a struct used to dump YAML documents. The <em>dump()</em> method writes
one or more documents to a file, throwing <em>YAMLException</em> if the file could not be
written to.</p>
<p>D:YAML tries to preserve style information in documents so e.g. <tt class="docutils literal"><span class="pre">[Hello,</span> <span class="pre">World]</span></tt> is
not turned into:</p>
<div class="line-block">
<div class="line"><tt class="docutils literal"><span class="pre">-</span> <span class="pre">Hello</span></tt></div>
<div class="line"><tt class="docutils literal"><span class="pre">-</span> <span class="pre">World</span></tt></div>
</div>
<p>However, comments are not preserved and neither are any extra formatting whitespace that
doesn&#8217;t affect the meaning of YAML contents.</p>
</div>
<div class="section" id="compiling">
<h3>Compiling<a class="headerlink" href="#compiling" title="Permalink to this headline"></a></h3>
<p>We&#8217;re going to use dub, which we installed at the beginning, to compile our project.</p>
<p>Create a file called <tt class="docutils literal"><span class="pre">dub.json</span></tt> with the following contents:</p>
<div class="highlight-json"><div class="highlight"><pre><span class="p">{</span>
<span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;getting-started&quot;</span><span class="p">,</span>
<span class="nt">&quot;targetType&quot;</span><span class="p">:</span> <span class="s2">&quot;executable&quot;</span><span class="p">,</span>
<span class="nt">&quot;sourceFiles&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;main.d&quot;</span><span class="p">],</span>
<span class="nt">&quot;mainSourceFile&quot;</span><span class="p">:</span> <span class="s2">&quot;main.d&quot;</span><span class="p">,</span>
<span class="nt">&quot;dependencies&quot;</span><span class="p">:</span>
<span class="p">{</span>
<span class="nt">&quot;dyaml&quot;</span><span class="p">:</span> <span class="p">{</span> <span class="nt">&quot;version&quot;</span> <span class="p">:</span> <span class="s2">&quot;~&gt;0.5.0&quot;</span> <span class="p">},</span>
<span class="p">},</span>
<span class="p">}</span>
</pre></div>
</div>
<p>This file tells dub that we&#8217;re building an executable called <tt class="docutils literal"><span class="pre">getting-started</span></tt> from
a D source file <tt class="docutils literal"><span class="pre">main.d</span></tt>, and that our project depends on D:YAML 0.5.0 or any newer,
bugfix release of D:YAML 0.5 . DUB will automatically find and download the correct
version of D:YAML when the project is built.</p>
<p>Now run the following command in your project&#8217;s directory:</p>
<div class="highlight-python"><div class="highlight"><pre>dub build
</pre></div>
</div>
<p>dub will automatically download D:YAML and compile it, and then then it will compile our
program. This will generate an executable called <tt class="docutils literal"><span class="pre">getting-started</span></tt> or
<tt class="docutils literal"><span class="pre">getting-started.exe</span></tt> in your directory. When you run it, it should produce the
following output:</p>
<div class="highlight-python"><div class="highlight"><pre>Hello
World
The answer is 42
</pre></div>
</div>
</div>
<div class="section" id="conclusion">
<h3>Conclusion<a class="headerlink" href="#conclusion" title="Permalink to this headline"></a></h3>
<p>You should now have a basic idea about how to use D:YAML. To learn more, look at the
<a class="reference external" href="../api/index.html">API documentation</a> and other tutorials. You can find code for this
example in the <tt class="docutils literal"><span class="pre">example/getting_started</span></tt> directory in the package.</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../index.html">
<img class="logo" src="../_static/logo210.png" alt="Logo"/>
</a></p>
<h3><a href="../index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Getting started</a><ul>
<li><a class="reference internal" href="#setting-up">Setting up</a><ul>
<li><a class="reference internal" href="#install-the-dmd-compiler">Install the DMD compiler</a></li>
<li><a class="reference internal" href="#install-dub">Install dub</a></li>
</ul>
</li>
<li><a class="reference internal" href="#your-first-d-yaml-project">Your first D:YAML project</a><ul>
<li><a class="reference internal" href="#explanation-of-the-code">Explanation of the code</a></li>
<li><a class="reference internal" href="#compiling">Compiling</a></li>
<li><a class="reference internal" href="#conclusion">Conclusion</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="custom_types.html" title="Custom YAML data types"
>next</a></li>
<li class="right" >
<a href="../index.html" title="Welcome to D:YAML documentation!"
>previous</a> |</li>
<li><a href="../index.html">D:YAML 0.5 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2011-2014, Ferdinand Majerech. Based on PyYAML http://www.pyyaml.org by Kirill Simonov.
Last updated on Aug 06, 2014.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
</div>
</body>
</html>

View file

@ -1,338 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>YAML syntax &mdash; D:YAML 0.5 documentation</title>
<link rel="stylesheet" href="../_static/default.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
VERSION: '0.5',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="top" title="D:YAML 0.5 documentation" href="../index.html" />
<link rel="next" title="Differences between D:YAML and the YAML specification" href="../articles/spec_differences.html" />
<link rel="prev" title="Custom YAML data types" href="custom_types.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../articles/spec_differences.html" title="Differences between D:YAML and the YAML specification"
accesskey="N">next</a></li>
<li class="right" >
<a href="custom_types.html" title="Custom YAML data types"
accesskey="P">previous</a> |</li>
<li><a href="../index.html">D:YAML 0.5 documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="yaml-syntax">
<h1>YAML syntax<a class="headerlink" href="#yaml-syntax" title="Permalink to this headline"></a></h1>
<p>This is an introduction to the most common YAML constructs. For more detailed
information, see <a class="reference external" href="http://pyyaml.org/wiki/PyYAMLDocumentation">PyYAML documentation</a>,
which this article is based on,
<a class="reference external" href="http://yaml.org/spec/1.1/#id857168">Chapter 2 of the YAML specification</a>
or the <a class="reference external" href="http://en.wikipedia.org/wiki/YAML">Wikipedia page</a>.</p>
<p>YAML is a data serialization format designed for human readability. YAML is a
recursive acronym for &#8220;YAML Ain&#8217;t Markup Language&#8221;.</p>
<p>YAML is similar to JSON, and in fact, JSON is a subset of YAML 1.2; but YAML has
some more advanced features and is easier to read. However, it is also more
difficult to parse (and probably somewhat slower). Data is stored in mappings
(associative arrays), sequences (lists) and scalars (single values). Data
structure hierarchy depends either on indentation (block context, similar to
Python code), or nesting of brackets and braces (flow context, similar to JSON).
YAML comments begin with <tt class="docutils literal"><span class="pre">#</span></tt> and continue until the end of line.</p>
<div class="section" id="documents">
<h2>Documents<a class="headerlink" href="#documents" title="Permalink to this headline"></a></h2>
<p>A YAML stream consists of one or more documents starting with <tt class="docutils literal"><span class="pre">---</span></tt> and
optionally ending with <tt class="docutils literal"><span class="pre">...</span></tt> . <tt class="docutils literal"><span class="pre">---</span></tt> can be left out for the first document.</p>
<p>Single document with no explicit start or end:</p>
<div class="highlight-yaml"><div class="highlight"><pre><span class="p-Indicator">-</span> <span class="l-Scalar-Plain">Red</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">Green</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">Blue</span>
</pre></div>
</div>
<p>Same document with explicit start and end:</p>
<div class="highlight-yaml"><div class="highlight"><pre><span class="nn">---</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">Red</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">Green</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">Blue</span>
<span class="nn">...</span>
</pre></div>
</div>
<p>A stream containing multiple documents:</p>
<div class="highlight-yaml"><div class="highlight"><pre><span class="nn">---</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">Red</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">Green</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">Blue</span>
<span class="nn">---</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">Linux</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">BSD</span>
<span class="nn">---</span>
<span class="l-Scalar-Plain">answer</span> <span class="p-Indicator">:</span> <span class="l-Scalar-Plain">42</span>
</pre></div>
</div>
</div>
<div class="section" id="sequences">
<h2>Sequences<a class="headerlink" href="#sequences" title="Permalink to this headline"></a></h2>
<p>Sequences are arrays of nodes of any type, similar e.g. to Python lists.
In block context, each item begins with hyphen+space &#8220;- &#8221;. In flow context,
sequences have syntax similar to D arrays.</p>
<div class="highlight-yaml"><div class="highlight"><pre><span class="c1">#Block context</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">Red</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">Green</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">Blue</span>
</pre></div>
</div>
<div class="highlight-yaml"><div class="highlight"><pre><span class="c1">#Flow context</span>
<span class="p-Indicator">[</span><span class="nv">Red</span><span class="p-Indicator">,</span> <span class="nv">Green</span><span class="p-Indicator">,</span> <span class="nv">Blue</span><span class="p-Indicator">]</span>
</pre></div>
</div>
<div class="highlight-yaml"><div class="highlight"><pre><span class="c1">#Nested</span>
<span class="p-Indicator">-</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">Red</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">Green</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">Blue</span>
<span class="p-Indicator">-</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">Linux</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">BSD</span>
</pre></div>
</div>
<div class="highlight-yaml"><div class="highlight"><pre><span class="c1">#Nested flow</span>
<span class="p-Indicator">[[</span><span class="nv">Red</span><span class="p-Indicator">,</span> <span class="nv">Green</span><span class="p-Indicator">,</span> <span class="nv">Blue</span><span class="p-Indicator">],</span> <span class="p-Indicator">[</span><span class="nv">Linux</span><span class="p-Indicator">,</span> <span class="nv">BSD</span><span class="p-Indicator">]]</span>
</pre></div>
</div>
<div class="highlight-yaml"><div class="highlight"><pre><span class="c1">#Nested in a mapping</span>
<span class="l-Scalar-Plain">Colors</span><span class="p-Indicator">:</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">Red</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">Green</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">Blue</span>
<span class="l-Scalar-Plain">Operating systems</span><span class="p-Indicator">:</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">Linux</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">BSD</span>
</pre></div>
</div>
</div>
<div class="section" id="mappings">
<h2>Mappings<a class="headerlink" href="#mappings" title="Permalink to this headline"></a></h2>
<p>Mappings are associative arrays where each key and value can be of any type,
similar e.g. to Python dictionaries. In block context, keys and values are
separated by colon+space &#8221;: &#8221;. In flow context, mappings have syntax similar
to D associative arrays, but with braces instead of brackets:</p>
<div class="highlight-yaml"><div class="highlight"><pre><span class="c1">#Block context</span>
<span class="l-Scalar-Plain">CPU</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">Athlon</span>
<span class="l-Scalar-Plain">GPU</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">Radeon</span>
<span class="l-Scalar-Plain">OS</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">Linux</span>
</pre></div>
</div>
<div class="highlight-yaml"><div class="highlight"><pre><span class="c1">#Flow context</span>
<span class="p-Indicator">{</span><span class="nv">CPU</span><span class="p-Indicator">:</span> <span class="nv">Athlon</span><span class="p-Indicator">,</span> <span class="nv">GPU</span><span class="p-Indicator">:</span> <span class="nv">Radeon</span><span class="p-Indicator">,</span> <span class="nv">OS</span><span class="p-Indicator">:</span> <span class="nv">Linux</span><span class="p-Indicator">}</span>
</pre></div>
</div>
<div class="highlight-yaml"><div class="highlight"><pre><span class="c1">#Nested</span>
<span class="l-Scalar-Plain">PC</span><span class="p-Indicator">:</span>
<span class="l-Scalar-Plain">CPU</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">Athlon</span>
<span class="l-Scalar-Plain">GPU</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">Radeon</span>
<span class="l-Scalar-Plain">OS</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">Debian</span>
<span class="l-Scalar-Plain">Phone</span><span class="p-Indicator">:</span>
<span class="l-Scalar-Plain">CPU</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">Cortex</span>
<span class="l-Scalar-Plain">GPU</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">PowerVR</span>
<span class="l-Scalar-Plain">OS</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">Android</span>
</pre></div>
</div>
<div class="highlight-yaml"><div class="highlight"><pre><span class="c1">#Nested flow</span>
<span class="p-Indicator">{</span><span class="nv">PC</span><span class="p-Indicator">:</span> <span class="p-Indicator">{</span><span class="nv">CPU</span><span class="p-Indicator">:</span> <span class="nv">Athlon</span><span class="p-Indicator">,</span> <span class="nv">GPU</span><span class="p-Indicator">:</span> <span class="nv">Radeon</span><span class="p-Indicator">,</span> <span class="nv">OS</span><span class="p-Indicator">:</span> <span class="nv">Debian</span><span class="p-Indicator">},</span>
<span class="nv">Phone</span><span class="p-Indicator">:</span> <span class="p-Indicator">{</span><span class="nv">CPU</span><span class="p-Indicator">:</span> <span class="nv">Cortex</span><span class="p-Indicator">,</span> <span class="nv">GPU</span><span class="p-Indicator">:</span> <span class="nv">PowerVR</span><span class="p-Indicator">,</span> <span class="nv">OS</span><span class="p-Indicator">:</span> <span class="nv">Android</span><span class="p-Indicator">}}</span>
</pre></div>
</div>
<div class="highlight-yaml"><div class="highlight"><pre><span class="c1">#Nested in a sequence</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">CPU</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">Athlon</span>
<span class="l-Scalar-Plain">GPU</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">Radeon</span>
<span class="l-Scalar-Plain">OS</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">Debian</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">CPU</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">Cortex</span>
<span class="l-Scalar-Plain">GPU</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">PowerVR</span>
<span class="l-Scalar-Plain">OS</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">Android</span>
</pre></div>
</div>
<p>Complex keys start with question mark+space &#8221;? &#8221;.</p>
<div class="highlight-yaml"><div class="highlight"><pre><span class="c1">#Nested in a sequence</span>
<span class="p-Indicator">?</span> <span class="p-Indicator">[</span><span class="nv">CPU</span><span class="p-Indicator">,</span> <span class="nv">GPU</span><span class="p-Indicator">]:</span> <span class="p-Indicator">[</span><span class="nv">Athlon</span><span class="p-Indicator">,</span> <span class="nv">Radeon</span><span class="p-Indicator">]</span>
<span class="l-Scalar-Plain">OS</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">Debian</span>
</pre></div>
</div>
</div>
<div class="section" id="scalars">
<h2>Scalars<a class="headerlink" href="#scalars" title="Permalink to this headline"></a></h2>
<p>Scalars are simple values such as integers, strings, timestamps and so on.
There are multiple scalar styles.</p>
<p>Plain scalars use no quotes, start with the first non-space and end with the
last non-space character:</p>
<div class="highlight-yaml"><div class="highlight"><pre><span class="l-Scalar-Plain">scalar</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">Plain scalar</span>
</pre></div>
</div>
<p>Single quoted scalars start and end with single quotes. A single quote is
represented by a pair of single quotes &#8216;&#8217;.</p>
<div class="highlight-yaml"><div class="highlight"><pre><span class="l-Scalar-Plain">scalar</span><span class="p-Indicator">:</span> <span class="s">&#39;Single</span><span class="nv"> </span><span class="s">quoted</span><span class="nv"> </span><span class="s">scalar</span><span class="nv"> </span><span class="s">ending</span><span class="nv"> </span><span class="s">with</span><span class="nv"> </span><span class="s">some</span><span class="nv"> </span><span class="s">spaces</span><span class="nv"> </span><span class="s">&#39;</span>
</pre></div>
</div>
<p>Double quoted scalars support C-style escape sequences.</p>
<div class="highlight-yaml"><div class="highlight"><pre><span class="l-Scalar-Plain">scalar</span><span class="p-Indicator">:</span> <span class="s">&quot;Double</span><span class="nv"> </span><span class="s">quoted</span><span class="nv"> </span><span class="s">scalar</span><span class="nv"> </span><span class="s">\n</span><span class="nv"> </span><span class="s">with</span><span class="nv"> </span><span class="s">some</span><span class="nv"> </span><span class="s">\\</span><span class="nv"> </span><span class="s">escape</span><span class="nv"> </span><span class="s">sequences&quot;</span>
</pre></div>
</div>
<p>Block scalars are convenient for multi-line values. They start either with
<tt class="docutils literal"><span class="pre">|</span></tt> or with <tt class="docutils literal"><span class="pre">&gt;</span></tt>. With <tt class="docutils literal"><span class="pre">|</span></tt>, the newlines in the scalar are preserved.
With <tt class="docutils literal"><span class="pre">&gt;</span></tt>, the newlines between two non-empty lines are removed.</p>
<div class="highlight-yaml"><div class="highlight"><pre><span class="l-Scalar-Plain">scalar</span><span class="p-Indicator">:</span> <span class="p-Indicator">|</span>
<span class="no">Newlines are preserved</span>
<span class="no">First line</span>
<span class="no">Second line</span>
</pre></div>
</div>
<div class="highlight-yaml"><div class="highlight"><pre><span class="l-Scalar-Plain">scalar</span><span class="p-Indicator">:</span> <span class="p-Indicator">&gt;</span>
<span class="no">Newlines are folded</span>
<span class="no">This is still the first paragraph</span>
<span class="no">This is the second</span>
<span class="no">paragraph</span>
</pre></div>
</div>
</div>
<div class="section" id="anchors-and-aliases">
<h2>Anchors and aliases<a class="headerlink" href="#anchors-and-aliases" title="Permalink to this headline"></a></h2>
<p>Anchors and aliases can reduce size of YAML code by allowing you to define a
value once, assign an anchor to it and use alias referring to that anchor
anywhere else you need that value. It is possible to use this to create
recursive data structures and some parsers support this; however, D:YAML does
not (this might change in the future, but it is unlikely).</p>
<div class="highlight-yaml"><div class="highlight"><pre><span class="l-Scalar-Plain">Person</span><span class="p-Indicator">:</span> <span class="nl">&amp;AD</span>
<span class="l-Scalar-Plain">gender</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">male</span>
<span class="l-Scalar-Plain">name</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">Arthur Dent</span>
<span class="l-Scalar-Plain">Clone</span><span class="p-Indicator">:</span> <span class="nv">*AD</span>
</pre></div>
</div>
</div>
<div class="section" id="tags">
<h2>Tags<a class="headerlink" href="#tags" title="Permalink to this headline"></a></h2>
<p>Tags are identifiers that specify data types of YAML nodes. Most default YAML
tags are resolved implicitly, so there is no need to specify them. D:YAML also
supports implicit resolution for custom, user specified tags.</p>
<p>Explicitly specified tags:</p>
<div class="highlight-yaml"><div class="highlight"><pre><span class="l-Scalar-Plain">answer</span><span class="p-Indicator">:</span> <span class="kt">!!int</span> <span class="s">&quot;42&quot;</span>
<span class="l-Scalar-Plain">name</span><span class="p-Indicator">:</span> <span class="kt">!!str</span> <span class="s">&quot;Arthur</span><span class="nv"> </span><span class="s">Dent&quot;</span>
</pre></div>
</div>
<p>Implicit tags:</p>
<div class="highlight-yaml"><div class="highlight"><pre><span class="l-Scalar-Plain">answer</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">42</span> <span class="c1">#int</span>
<span class="l-Scalar-Plain">name</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">Arthur Dent</span> <span class="c1">#string</span>
</pre></div>
</div>
<p>This table shows D types stored in <em>yaml.Node</em> default YAML tags are converted to.
Some of these might change in the future (especially !!map and !!set).</p>
<table border="1" class="docutils">
<colgroup>
<col width="52%" />
<col width="48%" />
</colgroup>
<thead valign="bottom">
<tr class="row-odd"><th class="head">YAML tag</th>
<th class="head">D type</th>
</tr>
</thead>
<tbody valign="top">
<tr class="row-even"><td>!!null</td>
<td>yaml.YAMLNull</td>
</tr>
<tr class="row-odd"><td>!!bool</td>
<td>bool</td>
</tr>
<tr class="row-even"><td>!!int</td>
<td>long</td>
</tr>
<tr class="row-odd"><td>!!float</td>
<td>real</td>
</tr>
<tr class="row-even"><td>!!binary</td>
<td>ubyte[]</td>
</tr>
<tr class="row-odd"><td>!!timestamp</td>
<td>std.datetime.SysTime</td>
</tr>
<tr class="row-even"><td>!!map, !!omap, !!pairs</td>
<td>yaml.Node.Pair[]</td>
</tr>
<tr class="row-odd"><td>!!seq, !!set</td>
<td>yaml.Node[]</td>
</tr>
<tr class="row-even"><td>!!str</td>
<td>string</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../index.html">
<img class="logo" src="../_static/logo210.png" alt="Logo"/>
</a></p>
<h3><a href="../index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">YAML syntax</a><ul>
<li><a class="reference internal" href="#documents">Documents</a></li>
<li><a class="reference internal" href="#sequences">Sequences</a></li>
<li><a class="reference internal" href="#mappings">Mappings</a></li>
<li><a class="reference internal" href="#scalars">Scalars</a></li>
<li><a class="reference internal" href="#anchors-and-aliases">Anchors and aliases</a></li>
<li><a class="reference internal" href="#tags">Tags</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../articles/spec_differences.html" title="Differences between D:YAML and the YAML specification"
>next</a></li>
<li class="right" >
<a href="custom_types.html" title="Custom YAML data types"
>previous</a> |</li>
<li><a href="../index.html">D:YAML 0.5 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2011-2014, Ferdinand Majerech. Based on PyYAML http://www.pyyaml.org by Kirill Simonov.
Last updated on Aug 06, 2014.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
</div>
</body>
</html>

View file

@ -0,0 +1,64 @@
# Differences between D:YAML and the YAML specification
There are some differences between D:YAML and the YAML 1.1
specification. Some are caused by difficulty of implementation of some
features, such as multiple Unicode encodings within single stream, and
some by unnecessary restrictions or ambiguities in the specification.
Still, D:YAML tries to be as close to the specification as possible. It
should never load documents with different meaning than according to the
specification, and documents that fail to load should be very rare (for
instance, very few files use multiple Unicode encodings).
## List of known differences:
Differences that can cause valid YAML documents not to load:
- No support for byte order marks and multiple Unicode encodings in a
stream.
- Plain scalars in flow context cannot contain `,`, `:` and `?`. This
might change with `:` in the future. See
<http://pyyaml.org/wiki/YAMLColonInFlowContext> for details.
- The specification does not restrict characters for anchors and
aliases. This may lead to problems, for instance, the document:
[ *alias, value ]
can be interpteted in two ways, as:
[ "value" ]
and:
[ *alias , "value" ]
Therefore we restrict aliases and anchors to ASCII alphanumeric
characters.
- The specification is confusing about tabs in plain scalars. We don't
use tabs in plain scalars at all.
- There is no support for recursive data structures in DYAML.
Other differences:
- Indentation is ignored in the flow context, which is less
restrictive than the specification. This allows code such as:
key: {
}
- Indentation rules for quoted scalars are loosed: They don't need to
adhere indentation as `"` and `'` clearly mark the beginning and the
end of them.
- We allow `_` in tag handles.
- Right now, two mappings with the same contents but different
orderings are considered unequal, even if they are unordered
mappings. This is because all mappings are ordered in the D:YAML
implementation. This should change in future, once D associative
arrays work with variant types or a map class or struct appears in
Phobos.

11
docs/index.md Normal file
View file

@ -0,0 +1,11 @@
# Welcome to D:YAML documentation!
API Documentation [online](https://dyaml.dpldocs.info/dyaml.html)
Tutorials:
- [Getting Started](tutorials/getting_started.md)
- [Custom Types](tutorials/custom_types.md)
- [YAML Syntax](tutorials/yaml_syntax.md)
Articles:
- [Spec Differences](articles/spec_differences.md)

View file

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

View file

@ -0,0 +1,336 @@
# Custom YAML data types
Sometimes you need to serialize complex data types such as classes. To
do this you could use plain nodes such as mappings with classes' fields.
YAML also supports custom types with identifiers called *tags*. That is
the topic of this tutorial.
Each YAML node has a tag specifying its type. For instance: strings use
the tag `tag:yaml.org,2002:str`. Tags of most default types are
*implicitly resolved* during parsing - you don't need to specify tag for
each float, integer, etc. D:YAML can also implicitly resolve custom
tags, as we will show later.
## Constructor
D:YAML uses the [Constructor](https://dyaml.dpldocs.info/dyaml.constructor.Constructor.html)
class to process each node to hold data type corresponding to its tag.
*Constructor* stores functions to process each supported tag. These are
supplied by the user using the *addConstructorXXX()* methods, where
*XXX* is *Scalar*, *Sequence* or *Mapping*. *Constructor* is then passed
to *Loader*, which parses YAML input.
Structs and classes must implement the *opCmp()* operator for YAML
support. This is used for duplicate detection in mappings, sorting and
equality comparisons of nodes. The signature of the operator that must
be implemented is `const int opCmp(ref const MyStruct s)` for structs
where *MyStruct* is the struct type, and `int opCmp(Object o)` for
classes. Note that the class *opCmp()* should not alter the compared
values - it is not const for compatibility reasons.
We will implement support for an RGB color type. It is implemented as
the following struct:
```D
struct Color
{
ubyte red;
ubyte green;
ubyte blue;
const int opCmp(ref const Color c)
{
if(red != c.red) {return red - c.red;}
if(green != c.green){return green - c.green;}
if(blue != c.blue) {return blue - c.blue;}
return 0;
}
}
```
First, we need a function to construct our data type. The function will
take a reference to *Node* to construct from. The node is guaranteed to
contain either a *string*, an array of *Node* or of *Node.Pair*,
depending on whether we're constructing our value from a scalar,
sequence, or mapping, respectively. If this function throws any
exception, D:YAML handles it and adds its message to a *YAMLException*
that will be thrown when loading the file.
In this tutorial, we have functions to construct a color from a scalar,
using CSS-like format, RRGGBB, or from a mapping, where we use the
following format: {r:RRR, g:GGG, b:BBB} . Code of these functions:
```D
Color constructColorScalar(ref Node node)
{
string value = node.as!string;
if(value.length != 6)
{
throw new Exception("Invalid color: " ~ value);
}
//We don't need to check for uppercase chars this way.
value = value.toLower();
//Get value of a hex digit.
uint hex(char c)
{
import std.ascii;
if(!std.ascii.isHexDigit(c))
{
throw new Exception("Invalid color: " ~ value);
}
if(std.ascii.isDigit(c))
{
return c - '0';
}
return c - 'a' + 10;
}
Color result;
result.red = cast(ubyte)(16 * hex(value[0]) + hex(value[1]));
result.green = cast(ubyte)(16 * hex(value[2]) + hex(value[3]));
result.blue = cast(ubyte)(16 * hex(value[4]) + hex(value[5]));
return result;
}
Color constructColorMapping(ref Node node)
{
ubyte r,g,b;
//Might throw if a value is missing is not an integer, or is out of range.
//If this happens, D:YAML will handle the exception and use its message
//in a YAMLException thrown when loading.
r = node["r"].as!ubyte;
g = node["g"].as!ubyte;
b = node["b"].as!ubyte;
return Color(cast(ubyte)r, cast(ubyte)g, cast(ubyte)b);
}
```
Next, we need some YAML data using our new tag. Create a file called
`input.yaml` with the following contents:
```YAML
scalar-red: !color FF0000
scalar-orange: !color FFFF00
mapping-red: !color-mapping {r: 255, g: 0, b: 0}
mapping-orange:
!color-mapping
r: 255
g: 255
b: 0
```
You can see that we're using tag `!color` for scalar colors, and
`!color-mapping` for colors expressed as mappings.
Finally, the code to put it all together:
```D
void main()
{
auto red = Color(255, 0, 0);
auto orange = Color(255, 255, 0);
try
{
auto constructor = new Constructor;
//both functions handle the same tag, but one handles scalar, one mapping.
constructor.addConstructorScalar("!color", &constructColorScalar);
constructor.addConstructorMapping("!color-mapping", &constructColorMapping);
auto loader = Loader("input.yaml");
loader.constructor = constructor;
auto root = loader.load();
if(root["scalar-red"].as!Color == red &&
root["mapping-red"].as!Color == red &&
root["scalar-orange"].as!Color == orange &&
root["mapping-orange"].as!Color == orange)
{
writeln("SUCCESS");
return;
}
}
catch(YAMLException e)
{
writeln(e.msg);
}
writeln("FAILURE");
}
```
First, we create a *Constructor* and pass functions to handle the
`!color` and `!color-mapping` tag. We construct a *Loader* and pass the
*Constructor* to it. We then load the YAML document, and finally, read
the colors to test if they were loaded as expected.
You can find the source code for what we've done so far in the
`examples/constructor` directory in the D:YAML package.
## Resolver
Specifying tag for every color can be tedious. D:YAML can implicitly
resolve scalar tags using regular expressions. This is how default types
are resolved. We will use the [Resolver](../api/dyaml.resolver.html)
class to add implicit tag resolution for the Color data type (in its
scalar form).
We use the *addImplicitResolver()* method of *Resolver*, passing the
tag, regular expression the scalar must match to resolve to this tag,
and a string of possible starting characters of the scalar. Then we pass
the *Resolver* to *Loader*.
Note that resolvers added first override ones added later. If no
resolver matches a scalar, YAML string tag is used. Therefore our custom
values must not be resolvable as any non-string YAML data type.
Add this to your code to add implicit resolution of `!color`.
```D
//code from the previous example...
auto resolver = new Resolver;
import std.regex;
resolver.addImplicitResolver("!color", std.regex.regex("[0-9a-fA-F]{6}"),
"0123456789abcdefABCDEF");
auto loader = Loader("input.yaml");
loader.constructor = constructor;
loader.resolver = resolver;
//code from the previous example...
```
Now, change contents of `input.yaml` to this:
```YAML
scalar-red: FF0000
scalar-orange: FFFF00
mapping-red: !color-mapping {r: 255, g: 0, b: 0}
mapping-orange:
!color-mapping
r: 255
g: 255
b: 0
```
We no longer need to specify the tag for scalar color values. Compile
and test the example. If everything went as expected, it should report
success.
You can find the complete code in the `examples/resolver` directory in
the D:YAML package.
## Representer
Now that you can load custom data types, it might be good to know how to
dump them. D:YAML uses the [Representer](https://dyaml.dpldocs.info/dyaml.representer.Representer.html)
class for this purpose.
*Representer* processes YAML nodes into plain mapping, sequence or
scalar nodes ready for output. Just like with *Constructor*, this is
done by user specified functions. These functions take references to a
node to process and to the *Representer*, and return the processed node.
Representer functions can be added with the *addRepresenter()* method.
The *Representer* is then passed to *Dumper*, which dumps YAML
documents. Only one function per type can be specified. This is asserted
in *addRepresenter()* preconditions. Default YAML types already have
representer functions specified, but you can disable them by
constructing *Representer* with the *useDefaultRepresenters* parameter
set to false.
By default, tags are explicitly output for all non-default types. To
make dumped tags implicit, you can pass a *Resolver* that will resolve
them implicitly. Of course, you will need to use an identical *Resolver*
when loading the output.
With the following code, we will add support for dumping the our Color
type.
```D
Node representColor(ref Node node, Representer representer)
{
//The node is guaranteed to be Color as we add representer for Color.
Color color = node.as!Color;
static immutable hex = "0123456789ABCDEF";
//Using the color format from the Constructor example.
string scalar;
foreach(channel; [color.red, color.green, color.blue])
{
scalar ~= hex[channel / 16];
scalar ~= hex[channel % 16];
}
//Representing as a scalar, with custom tag to specify this data type.
return representer.representScalar("!color", scalar);
}
```
First we get the *Color* from the node. Then we convert it to a string
with the CSS-like format we've used before. Finally, we use the
*representScalar()* method of *Representer* to get a scalar node ready
for output. There are corresponding *representMapping()* and
*representSequence()* methods as well, with examples in the [Resolver
API documentation](https://dyaml.dpldocs.info/dyaml.resolver.html).
Since a type can only have one representer function, we don't dump
*Color* both in the scalar and mapping formats we've used before.
However, you can decide to dump the node with different formats/tags in
the representer function itself. E.g. you could dump the Color as a
mapping based on some arbitrary condition, such as the color being
white.
```D
void main()
{
try
{
auto representer = new Representer;
representer.addRepresenter!Color(&representColor);
auto resolver = new Resolver;
import std.regex;
resolver.addImplicitResolver("!color", std.regex.regex("[0-9a-fA-F]{6}"),
"0123456789abcdefABCDEF");
auto dumper = Dumper("output.yaml");
dumper.representer = representer;
dumper.resolver = resolver;
auto document = Node([Color(255, 0, 0),
Color(0, 255, 0),
Color(0, 0, 255)]);
dumper.dump(document);
}
catch(YAMLException e)
{
writeln(e.msg);
}
}
```
We construct a new *Representer*, and specify a representer function for
the *Color* (the template argument) type. We also construct a
*Resolver*, same as in the previous section, so the `!color` tag will be
implicit. Of course, identical *Resolver* would then have to be used
when loading the file. You don't need to do this if you want the tag to
be explicit.
We construct a *Dumper* to file `output.yaml` and pass the *Representer*
and *Resolver* to it. Then, we create a simple node containing a
sequence of colors and finally, we dump it.
Source code for this section can be found in the `examples/representer`
directory of the D:YAML package.

View file

@ -0,0 +1,164 @@
# Getting started
Welcome to D:YAML\! D:YAML is a
[YAML](http://en.wikipedia.org/wiki/YAML) parser library for the [D
programming language](http://dlang.org). This tutorial will explain how
to set D:YAML up and use it in your projects.
This is meant to be the **simplest possible** introduction to D:YAML.
Some of this information might already be known to you. Only basic usage
is covered.
## Setting up
### Install the DMD compiler
Digital Mars D compiler, or DMD, is the most commonly used D compiler.
You can find its newest version [here](http://dlang.org/download.html).
Download the version of DMD for your operating system and install it.
Note: Other D compilers exist, such as [GDC](http://gdcproject.org/) and
[LDC](https://github.com/ldc-developers/ldc).
### Install dub
[dub](http://code.dlang.org/about) is a build system and package manager
for D. It is the standard way to manage D projects and their
dependencies, compilation and so on.
DMD may include DUB in future releases, but at this point we need to
install it separately. See [installation
instructions](https://github.com/D-Programming-Language/dub#installation).
## Your first D:YAML project
Create a directory for your project and in that directory, create a new
file named `input.yaml` and paste this code into the file:
```YAML
Hello World : [Hello, World]
Answer: 42
```
This will serve as input for our example.
Now we need to parse it. Create a new file with name `main.d`. Paste
following code into the file:
```D
import std.stdio;
import yaml;
void main()
{
//Read the input.
Node root = Loader("input.yaml").load();
//Display the data read.
foreach(string word; root["Hello World"])
{
writeln(word);
}
writeln("The answer is ", root["Answer"].as!int);
//Dump the loaded document to output.yaml.
Dumper("output.yaml").dump(root);
}
```
### Explanation of the code
First, we import the *dyaml.all* module. This is the only D:YAML module
you need to import - it automatically imports all needed modules.
Next we load the file using the *Loader.load()* method. *Loader* is a
struct used for parsing YAML documents. The *load()* method loads the
file as **one** YAML document, or throws *YAMLException*, D:YAML
exception type, if the file could not be parsed or contains more than
one document. Note that we don't do any error checking here in order to
keep the example as simple as possible.
*Node* represents a node in a YAML document. It can be a sequence
(array), mapping (associative array) or a scalar (value). Here the root
node is a mapping, and we use the index operator to get subnodes with
keys "Hello World" and "Answer". We iterate over the former, as it is a
sequence, and use the *Node.as()* method on the latter to read its value
as an integer.
You can iterate over a mapping or sequence as if it was an associative
or normal array, respectively. If you try to iterate over a scalar, it
will throw a *YAMLException*.
You can iterate using *Node* as the iterated type, or specify the type
iterated nodes are expected to have. D:YAML will automatically convert
to that type if possible. Here we specify the *string* type, so we
iterate over the "Hello World" sequence as an array of strings. If it is
not possible to convert to iterated type, a *YAMLException* is thrown.
For instance, if we specified *int* here, we would get an error, as
"Hello" cannot be converted to an integer.
The *Node.as()* method is used to read value of a scalar node as
specified type. If the scalar does not have the specified type, D:YAML
will try to convert it, throwing *YAMLException* if not possible.
Finally we dump the document we just read to `output.yaml` with the
*Dumper.dump()* method. *Dumper* is a struct used to dump YAML
documents. The *dump()* method writes one or more documents to a file,
throwing *YAMLException* if the file could not be written to.
D:YAML tries to preserve style information in documents so e.g. `[Hello,
World]` is not turned into:
```YAML
- Hello
- World
```
However, comments are not preserved and neither are any extra formatting
whitespace that doesn't affect the meaning of YAML contents.
### Compiling
We're going to use dub, which we installed at the beginning, to compile
our project.
Create a file called `dub.json` with the following contents:
```JSON
{
"name": "getting-started",
"targetType": "executable",
"sourceFiles": ["main.d"],
"mainSourceFile": "main.d",
"dependencies":
{
"dyaml": { "version" : "~>0.5.0" },
},
}
```
This file tells dub that we're building an executable called
`getting-started` from a D source file `main.d`, and that our project
depends on D:YAML 0.5.0 or any newer, bugfix release of D:YAML 0.5 . DUB
will automatically find and download the correct version of D:YAML when
the project is built.
Now run the following command in your project's directory:
dub build
dub will automatically download D:YAML and compile it, and then then it
will compile our program. This will generate an executable called
`getting-started` or `getting-started.exe` in your directory. When you
run it, it should produce the following output:
Hello
World
The answer is 42
### Conclusion
You should now have a basic idea about how to use D:YAML. To learn more,
look at the [API documentation](https://dyaml.dpldocs.info/dyaml.html) and other tutorials.
You can find code for this example in the `example/getting_started`
directory in the package.

View file

@ -1,54 +1,45 @@
===========
YAML syntax
===========
# YAML syntax
This is an introduction to the most common YAML constructs. For more detailed
information, see `PyYAML documentation <http://pyyaml.org/wiki/PyYAMLDocumentation>`_,
This is an introduction to the most common YAML constructs. For more detailed
information, see [PyYAML documentation](http://pyyaml.org/wiki/PyYAMLDocumentation),
which this article is based on,
`Chapter 2 of the YAML specification <http://yaml.org/spec/1.1/#id857168>`_
or the `Wikipedia page <http://en.wikipedia.org/wiki/YAML>`_.
[Chapter 2 of the YAML specification](http://yaml.org/spec/1.1/#id857168)
or the [Wikipedia page](http://en.wikipedia.org/wiki/YAML).
YAML is a data serialization format designed for human readability. YAML is a
YAML is a data serialization format designed for human readability. YAML is a
recursive acronym for "YAML Ain't Markup Language".
YAML is similar to JSON, and in fact, JSON is a subset of YAML 1.2; but YAML has
some more advanced features and is easier to read. However, it is also more
difficult to parse (and probably somewhat slower). Data is stored in mappings
(associative arrays), sequences (lists) and scalars (single values). Data
(associative arrays), sequences (lists) and scalars (single values). Data
structure hierarchy depends either on indentation (block context, similar to
Python code), or nesting of brackets and braces (flow context, similar to JSON).
YAML comments begin with ``#`` and continue until the end of line.
YAML comments begin with `#` and continue until the end of line.
---------
Documents
---------
## Documents
A YAML stream consists of one or more documents starting with ``---`` and
optionally ending with ``...`` . ``---`` can be left out for the first document.
A YAML stream consists of one or more documents starting with `---` and
optionally ending with `...` . `---` can be left out for the first document.
Single document with no explicit start or end:
.. code-block:: yaml
```
- Red
- Green
- Blue
```
Same document with explicit start and end:
.. code-block:: yaml
```
---
- Red
- Green
- Blue
...
```
A stream containing multiple documents:
.. code-block:: yaml
```
---
- Red
- Green
@ -58,30 +49,25 @@ A stream containing multiple documents:
- BSD
---
answer : 42
```
---------
Sequences
---------
## Sequences
Sequences are arrays of nodes of any type, similar e.g. to Python lists.
In block context, each item begins with hyphen+space "- ". In flow context,
sequences have syntax similar to D arrays.
.. code-block:: yaml
```
#Block context
- Red
- Green
- Blue
.. code-block:: yaml
```
```
#Flow context
[Red, Green, Blue]
.. code-block:: yaml
```
```
#Nested
-
- Red
@ -90,14 +76,12 @@ sequences have syntax similar to D arrays.
-
- Linux
- BSD
.. code-block:: yaml
```
```
#Nested flow
[[Red, Green, Blue], [Linux, BSD]]
.. code-block:: yaml
```
```
#Nested in a mapping
Colors:
- Red
@ -106,31 +90,28 @@ sequences have syntax similar to D arrays.
Operating systems:
- Linux
- BSD
```
## Mappings
--------
Mappings
--------
Mappings are associative arrays where each key and value can be of any type,
Mappings are associative arrays where each key and value can be of any type,
similar e.g. to Python dictionaries. In block context, keys and values are
separated by colon+space ": ". In flow context, mappings have syntax similar
to D associative arrays, but with braces instead of brackets:
.. code-block:: yaml
```
#Block context
CPU: Athlon
GPU: Radeon
OS: Linux
.. code-block:: yaml
```
```
#Flow context
{CPU: Athlon, GPU: Radeon, OS: Linux}
.. code-block:: yaml
```
```
#Nested
PC:
CPU: Athlon
@ -141,14 +122,13 @@ to D associative arrays, but with braces instead of brackets:
GPU: PowerVR
OS: Android
.. code-block:: yaml
```
```
#Nested flow
{PC: {CPU: Athlon, GPU: Radeon, OS: Debian},
{PC: {CPU: Athlon, GPU: Radeon, OS: Debian},
Phone: {CPU: Cortex, GPU: PowerVR, OS: Android}}
.. code-block:: yaml
```
```
#Nested in a sequence
- CPU: Athlon
GPU: Radeon
@ -156,85 +136,76 @@ to D associative arrays, but with braces instead of brackets:
- CPU: Cortex
GPU: PowerVR
OS: Android
```
Complex keys start with question mark+space "? ".
.. code-block:: yaml
```
#Nested in a sequence
? [CPU, GPU]: [Athlon, Radeon]
OS: Debian
```
-------
Scalars
-------
## Scalars
Scalars are simple values such as integers, strings, timestamps and so on.
There are multiple scalar styles.
Plain scalars use no quotes, start with the first non-space and end with the
Plain scalars use no quotes, start with the first non-space and end with the
last non-space character:
.. code-block:: yaml
```
scalar: Plain scalar
```
scalar: Plain scalar
Single quoted scalars start and end with single quotes. A single quote is
Single quoted scalars start and end with single quotes. A single quote is
represented by a pair of single quotes ''.
.. code-block:: yaml
```
scalar: 'Single quoted scalar ending with some spaces '
```
Double quoted scalars support C-style escape sequences.
.. code-block:: yaml
```
scalar: "Double quoted scalar \n with some \\ escape sequences"
```
Block scalars are convenient for multi-line values. They start either with
``|`` or with ``>``. With ``|``, the newlines in the scalar are preserved.
With ``>``, the newlines between two non-empty lines are removed.
.. code-block:: yaml
`|` or with `>`. With `|`, the newlines in the scalar are preserved.
With `>`, the newlines between two non-empty lines are removed.
```
scalar: |
Newlines are preserved
First line
Second line
.. code-block:: yaml
Second line
```
```
scalar: >
Newlines are folded
This is still the first paragraph
This is the second
paragraph
```
-------------------
Anchors and aliases
-------------------
## Anchors and aliases
Anchors and aliases can reduce size of YAML code by allowing you to define a
value once, assign an anchor to it and use alias referring to that anchor
anywhere else you need that value. It is possible to use this to create
value once, assign an anchor to it and use alias referring to that anchor
anywhere else you need that value. It is possible to use this to create
recursive data structures and some parsers support this; however, D:YAML does
not (this might change in the future, but it is unlikely).
.. code-block:: yaml
```
Person: &AD
gender: male
name: Arthur Dent
Clone: *AD
```
----
Tags
----
## Tags
Tags are identifiers that specify data types of YAML nodes. Most default YAML
tags are resolved implicitly, so there is no need to specify them. D:YAML also
@ -242,31 +213,29 @@ supports implicit resolution for custom, user specified tags.
Explicitly specified tags:
.. code-block:: yaml
```
answer: !!int "42"
name: !!str "Arthur Dent"
```
Implicit tags:
.. code-block:: yaml
```
answer: 42 #int
name: Arthur Dent #string
```
This table shows D types stored in *yaml.Node* default YAML tags are converted to.
Some of these might change in the future (especially !!map and !!set).
====================== ====================
YAML tag D type
====================== ====================
!!null yaml.YAMLNull
!!bool bool
!!int long
!!float real
!!binary ubyte[]
!!timestamp std.datetime.SysTime
!!map, !!omap, !!pairs yaml.Node.Pair[]
!!seq, !!set yaml.Node[]
!!str string
====================== ====================
|YAML tag |D type |
|-----------------------|---------------------|
|!!null |yaml.YAMLNull |
|!!bool |bool |
|!!int |long |
|!!float |real |
|!!binary |ubyte[] |
|!!timestamp |std.datetime.SysTime |
|!!map, !!omap, !!pairs |yaml.Node.Pair[] |
|!!seq, !!set |yaml.Node[] |
|!!str |string |

View file

@ -1,139 +0,0 @@
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = ../doc
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean ddoc_html html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
clean:
-rm -rf $(BUILDDIR)/*
################################################################################
# DDOC GENERATION CODE
################################################################################
ddoc_html :
cd ../ && hmod
################################################################################
# DDOC GENERATION CODE END
################################################################################
html: ddoc_html
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/DYAML.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/DYAML.qhc"
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/DYAML"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/DYAML"
@echo "# devhelp"
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
make -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."

View file

@ -1,61 +0,0 @@
.. highlight:: yaml
=====================================================
Differences between D:YAML and the YAML specification
=====================================================
There are some differences between D:YAML and the YAML 1.1 specification. Some
are caused by difficulty of implementation of some features, such as multiple
Unicode encodings within single stream, and some by unnecessary restrictions or
ambiguities in the specification.
Still, D:YAML tries to be as close to the specification as possible. It should
never load documents with different meaning than according to the specification,
and documents that fail to load should be very rare (for instance, very few
files use multiple Unicode encodings).
--------------------------
List of known differences:
--------------------------
Differences that can cause valid YAML documents not to load:
* No support for byte order marks and multiple Unicode encodings in a stream.
* Plain scalars in flow context cannot contain ``,``, ``:`` and ``?``.
This might change with ``:`` in the future.
See http://pyyaml.org/wiki/YAMLColonInFlowContext for details.
* The specification does not restrict characters for anchors and
aliases. This may lead to problems, for instance, the document::
[ *alias, value ]
can be interpteted in two ways, as::
[ "value" ]
and::
[ *alias , "value" ]
Therefore we restrict aliases and anchors to ASCII alphanumeric characters.
* The specification is confusing about tabs in plain scalars. We don't use tabs
in plain scalars at all.
* There is no support for recursive data structures in DYAML.
Other differences:
* Indentation is ignored in the flow context, which is less restrictive than the
specification. This allows code such as::
key: {
}
* Indentation rules for quoted scalars are loosed: They don't need to adhere
indentation as ``"`` and ``'`` clearly mark the beginning and the end of them.
* We allow ``_`` in tag handles.
* Right now, two mappings with the same contents but different orderings are
considered unequal, even if they are unordered mappings. This is because all
mappings are ordered in the D:YAML implementation. This should change in
future, once D associative arrays work with variant types or a map class or
struct appears in Phobos.

View file

@ -1,18 +0,0 @@
Ddoc
$(P
This is the complete API documentation for D:YAML. It describes all classes, methods and
global functions provided by the library. This is not the best place to start learning;
it should serve as a reference when detailed information about D:YAML functionality is
needed. To get started with D:YAML see $(LINK2 ../index.html, tutorials).
)
$(P
Although each D:YAML module is documented on a separate page, you don't need to import
individual modules. Importing the $(I yaml) module automatically imports all D:YAML
functionality.
)
Macros:
TITLE=$(PROJECT_NAME) $(PROJECT_VERSION) API documentation

View file

@ -1,236 +0,0 @@
# -*- coding: utf-8 -*-
#
# D:YAML documentation build configuration file, created by
# sphinx-quickstart on Sun Jul 24 15:16:35 2011.
#
# This file is execfile()d with the current directory set to its containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys, os
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.'))
# -- General configuration -----------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = []
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix of source filenames.
source_suffix = '.rst'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'D:YAML'
copyright = (u'2011-2014, Ferdinand Majerech. Based on PyYAML http://www.pyyaml.org '
'by Kirill Simonov')
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '0.5'
# The full version, including alpha/beta/rc tags.
release = '0.5'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# -- Options for HTML output ---------------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'default'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
html_theme_options =\
{
"footerbgcolor" : "#1f252b",
"footertextcolor" : "#ccc",
"sidebarbgcolor" : "#1f252b",
"sidebarlinkcolor" : "#ddd",
"relbarbgcolor" : "#303333",
"relbartextcolor" : "#ccc",
"bgcolor" : "#f6f6f6",
"textcolor" : "black",
"linkcolor" : "#006",
"visitedlinkcolor" : "#606",
"headbgcolor" : "#f6f6f6",
"headtextcolor" : "#633",
"headlinkcolor" : "#006",
"codebgcolor" : "fcfcfc",
"codetextcolor" : "000066",
"bodyfont" : "Verdana, \"Deja Vu\", \"Bitstream Vera Sans\", sans-serif",
"headfont" : "Georgia, \"Times New Roman\", Times, serif"
}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
html_logo = "logo210.png"
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
html_sidebars = {"**" : ["localtoc.html"]}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
html_domain_indices = False
# If false, no index is generated.
html_use_index = False
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Output file base name for HTML help builder.
htmlhelp_basename = 'DYAMLdoc'
# -- Options for LaTeX output --------------------------------------------------
# The paper size ('letter' or 'a4').
#latex_paper_size = 'letter'
# The font size ('10pt', '11pt' or '12pt').
#latex_font_size = '10pt'
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
('index', 'DYAML.tex', u'D:YAML Documentation',
u'Ferdinand Majerech', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Additional stuff for the LaTeX preamble.
#latex_preamble = ''
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = True
# -- Options for manual page output --------------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
('index', 'dyaml', u'D:YAML Documentation',
[u'Ferdinand Majerech'], 1)
]

View file

@ -1,21 +0,0 @@
================================
Welcome to D:YAML documentation!
================================
API Documentation `(online) <http://ddocs.org/dyaml/~master/index.html>`_ `(local copy) <api/index.html>`_
Tutorials:
.. toctree::
:maxdepth: 2
tutorials/getting_started
tutorials/custom_types
tutorials/yaml_syntax
Articles:
.. toctree::
:maxdepth: 2
articles/spec_differences

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

View file

@ -1,337 +0,0 @@
======================
Custom YAML data types
======================
Sometimes you need to serialize complex data types such as classes. To do this
you could use plain nodes such as mappings with classes' fields. YAML also
supports custom types with identifiers called *tags*. That is the topic of this
tutorial.
Each YAML node has a tag specifying its type. For instance: strings use the tag
``tag:yaml.org,2002:str``. Tags of most default types are *implicitly resolved*
during parsing - you don't need to specify tag for each float, integer, etc.
D:YAML can also implicitly resolve custom tags, as we will show later.
-----------
Constructor
-----------
D:YAML uses the `Constructor <../api/dyaml.constructor.html>`_ class to process
each node to hold data type corresponding to its tag. *Constructor* stores
functions to process each supported tag. These are supplied by the user using
the *addConstructorXXX()* methods, where *XXX* is *Scalar*, *Sequence* or
*Mapping*. *Constructor* is then passed to *Loader*, which parses YAML input.
Structs and classes must implement the *opCmp()* operator for YAML support. This
is used for duplicate detection in mappings, sorting and equality comparisons of
nodes. The signature of the operator that must be implemented is
``const int opCmp(ref const MyStruct s)`` for structs where *MyStruct* is the
struct type, and ``int opCmp(Object o)`` for classes. Note that the class
*opCmp()* should not alter the compared values - it is not const for compatibility
reasons.
We will implement support for an RGB color type. It is implemented as the
following struct:
.. code-block:: d
struct Color
{
ubyte red;
ubyte green;
ubyte blue;
const int opCmp(ref const Color c)
{
if(red != c.red) {return red - c.red;}
if(green != c.green){return green - c.green;}
if(blue != c.blue) {return blue - c.blue;}
return 0;
}
}
First, we need a function to construct our data type. The function will take a
reference to *Node* to construct from. The node is guaranteed to contain either
a *string*, an array of *Node* or of *Node.Pair*, depending on whether we're
constructing our value from a scalar, sequence, or mapping, respectively.
If this function throws any exception, D:YAML handles it and adds its message
to a *YAMLException* that will be thrown when loading the file.
In this tutorial, we have functions to construct a color from a scalar, using
CSS-like format, RRGGBB, or from a mapping, where we use the following format:
{r:RRR, g:GGG, b:BBB} . Code of these functions:
.. code-block:: d
Color constructColorScalar(ref Node node)
{
string value = node.as!string;
if(value.length != 6)
{
throw new Exception("Invalid color: " ~ value);
}
//We don't need to check for uppercase chars this way.
value = value.toLower();
//Get value of a hex digit.
uint hex(char c)
{
import std.ascii;
if(!std.ascii.isHexDigit(c))
{
throw new Exception("Invalid color: " ~ value);
}
if(std.ascii.isDigit(c))
{
return c - '0';
}
return c - 'a' + 10;
}
Color result;
result.red = cast(ubyte)(16 * hex(value[0]) + hex(value[1]));
result.green = cast(ubyte)(16 * hex(value[2]) + hex(value[3]));
result.blue = cast(ubyte)(16 * hex(value[4]) + hex(value[5]));
return result;
}
Color constructColorMapping(ref Node node)
{
ubyte r,g,b;
//Might throw if a value is missing is not an integer, or is out of range.
//If this happens, D:YAML will handle the exception and use its message
//in a YAMLException thrown when loading.
r = node["r"].as!ubyte;
g = node["g"].as!ubyte;
b = node["b"].as!ubyte;
return Color(cast(ubyte)r, cast(ubyte)g, cast(ubyte)b);
}
Next, we need some YAML data using our new tag. Create a file called
``input.yaml`` with the following contents:
.. code-block:: yaml
scalar-red: !color FF0000
scalar-orange: !color FFFF00
mapping-red: !color-mapping {r: 255, g: 0, b: 0}
mapping-orange:
!color-mapping
r: 255
g: 255
b: 0
You can see that we're using tag ``!color`` for scalar colors, and
``!color-mapping`` for colors expressed as mappings.
Finally, the code to put it all together:
.. code-block:: d
void main()
{
auto red = Color(255, 0, 0);
auto orange = Color(255, 255, 0);
try
{
auto constructor = new Constructor;
//both functions handle the same tag, but one handles scalar, one mapping.
constructor.addConstructorScalar("!color", &constructColorScalar);
constructor.addConstructorMapping("!color-mapping", &constructColorMapping);
auto loader = Loader("input.yaml");
loader.constructor = constructor;
auto root = loader.load();
if(root["scalar-red"].as!Color == red &&
root["mapping-red"].as!Color == red &&
root["scalar-orange"].as!Color == orange &&
root["mapping-orange"].as!Color == orange)
{
writeln("SUCCESS");
return;
}
}
catch(YAMLException e)
{
writeln(e.msg);
}
writeln("FAILURE");
}
First, we create a *Constructor* and pass functions to handle the ``!color``
and ``!color-mapping`` tag. We construct a *Loader* and pass the *Constructor*
to it. We then load the YAML document, and finally, read the colors to test if
they were loaded as expected.
You can find the source code for what we've done so far in the
``examples/constructor`` directory in the D:YAML package.
--------
Resolver
--------
Specifying tag for every color can be tedious. D:YAML can implicitly resolve
scalar tags using regular expressions. This is how default types are resolved.
We will use the `Resolver <../api/dyaml.resolver.html>`_ class to add implicit
tag resolution for the Color data type (in its scalar form).
We use the *addImplicitResolver()* method of *Resolver*, passing the tag,
regular expression the scalar must match to resolve to this tag, and a string of
possible starting characters of the scalar. Then we pass the *Resolver* to
*Loader*.
Note that resolvers added first override ones added later. If no resolver
matches a scalar, YAML string tag is used. Therefore our custom values must not
be resolvable as any non-string YAML data type.
Add this to your code to add implicit resolution of ``!color``.
.. code-block:: d
//code from the previous example...
auto resolver = new Resolver;
import std.regex;
resolver.addImplicitResolver("!color", std.regex.regex("[0-9a-fA-F]{6}"),
"0123456789abcdefABCDEF");
auto loader = Loader("input.yaml");
loader.constructor = constructor;
loader.resolver = resolver;
//code from the previous example...
Now, change contents of ``input.yaml`` to this:
.. code-block:: yaml
scalar-red: FF0000
scalar-orange: FFFF00
mapping-red: !color-mapping {r: 255, g: 0, b: 0}
mapping-orange:
!color-mapping
r: 255
g: 255
b: 0
We no longer need to specify the tag for scalar color values. Compile and test
the example. If everything went as expected, it should report success.
You can find the complete code in the ``examples/resolver`` directory in the
D:YAML package.
-----------
Representer
-----------
Now that you can load custom data types, it might be good to know how to dump
them. D:YAML uses the `Representer <../api/dyaml.representer.html>`_ class for
this purpose.
*Representer* processes YAML nodes into plain mapping, sequence or scalar nodes
ready for output. Just like with *Constructor*, this is done by user specified
functions. These functions take references to a node to process and to the
*Representer*, and return the processed node.
Representer functions can be added with the *addRepresenter()* method. The
*Representer* is then passed to *Dumper*, which dumps YAML documents. Only one
function per type can be specified. This is asserted in *addRepresenter()*
preconditions. Default YAML types already have representer functions specified,
but you can disable them by constructing *Representer* with the
*useDefaultRepresenters* parameter set to false.
By default, tags are explicitly output for all non-default types. To make dumped
tags implicit, you can pass a *Resolver* that will resolve them implicitly. Of
course, you will need to use an identical *Resolver* when loading the output.
With the following code, we will add support for dumping the our Color type.
.. code-block:: d
Node representColor(ref Node node, Representer representer)
{
//The node is guaranteed to be Color as we add representer for Color.
Color color = node.as!Color;
static immutable hex = "0123456789ABCDEF";
//Using the color format from the Constructor example.
string scalar;
foreach(channel; [color.red, color.green, color.blue])
{
scalar ~= hex[channel / 16];
scalar ~= hex[channel % 16];
}
//Representing as a scalar, with custom tag to specify this data type.
return representer.representScalar("!color", scalar);
}
First we get the *Color* from the node. Then we convert it to a string with the
CSS-like format we've used before. Finally, we use the *representScalar()*
method of *Representer* to get a scalar node ready for output. There are
corresponding *representMapping()* and *representSequence()* methods
as well, with examples in the
`Resolver API documentation <../api/dyaml.resolver.html>`_.
Since a type can only have one representer function, we don't dump *Color* both
in the scalar and mapping formats we've used before. However, you can decide to
dump the node with different formats/tags in the representer function itself.
E.g. you could dump the Color as a mapping based on some arbitrary condition,
such as the color being white.
.. code-block:: d
void main()
{
try
{
auto representer = new Representer;
representer.addRepresenter!Color(&representColor);
auto resolver = new Resolver;
import std.regex;
resolver.addImplicitResolver("!color", std.regex.regex("[0-9a-fA-F]{6}"),
"0123456789abcdefABCDEF");
auto dumper = Dumper("output.yaml");
dumper.representer = representer;
dumper.resolver = resolver;
auto document = Node([Color(255, 0, 0),
Color(0, 255, 0),
Color(0, 0, 255)]);
dumper.dump(document);
}
catch(YAMLException e)
{
writeln(e.msg);
}
}
We construct a new *Representer*, and specify a representer function for the
*Color* (the template argument) type. We also construct a *Resolver*, same as in
the previous section, so the ``!color`` tag will be implicit. Of course,
identical *Resolver* would then have to be used when loading the file.
You don't need to do this if you want the tag to be explicit.
We construct a *Dumper* to file ``output.yaml`` and pass the *Representer* and
*Resolver* to it. Then, we create a simple node containing a sequence of colors
and finally, we dump it.
Source code for this section can be found in the ``examples/representer``
directory of the D:YAML package.

View file

@ -1,176 +0,0 @@
===============
Getting started
===============
Welcome to D:YAML! D:YAML is a `YAML <http://en.wikipedia.org/wiki/YAML>`_ parser
library for the `D programming language <http://dlang.org>`_. This tutorial will
explain how to set D:YAML up and use it in your projects.
This is meant to be the **simplest possible** introduction to D:YAML. Some of this
information might already be known to you. Only basic usage is covered.
----------
Setting up
----------
^^^^^^^^^^^^^^^^^^^^^^^^
Install the DMD compiler
^^^^^^^^^^^^^^^^^^^^^^^^
Digital Mars D compiler, or DMD, is the most commonly used D compiler. You can find its
newest version `here <http://dlang.org/download.html>`_. Download the version of DMD
for your operating system and install it.
.. note::
Other D compilers exist, such as
`GDC <http://gdcproject.org/>`_ and
`LDC <http://bitbucket.org/goshawk/gdc/wiki/Home>`_.
^^^^^^^^^^^
Install dub
^^^^^^^^^^^
`dub <http://code.dlang.org/about>`_ is a build system and package manager for D.
It is the standard way to manage D projects and their dependencies, compilation and so
on.
DMD may include DUB in future releases, but at this point we need to install it
separately. See
`installation instructions <https://github.com/D-Programming-Language/dub#installation>`_.
-------------------------
Your first D:YAML project
-------------------------
Create a directory for your project and in that directory, create a new file named
``input.yaml`` and paste this code into the file:
.. code-block:: yaml
Hello World : [Hello, World]
Answer: 42
This will serve as input for our example.
Now we need to parse it. Create a new file with name ``main.d``. Paste following code
into the file:
.. code-block:: d
import std.stdio;
import yaml;
void main()
{
//Read the input.
Node root = Loader("input.yaml").load();
//Display the data read.
foreach(string word; root["Hello World"])
{
writeln(word);
}
writeln("The answer is ", root["Answer"].as!int);
//Dump the loaded document to output.yaml.
Dumper("output.yaml").dump(root);
}
^^^^^^^^^^^^^^^^^^^^^^^
Explanation of the code
^^^^^^^^^^^^^^^^^^^^^^^
First, we import the *dyaml.all* module. This is the only D:YAML module you need to
import - it automatically imports all needed modules.
Next we load the file using the *Loader.load()* method. *Loader* is a struct used for
parsing YAML documents. The *load()* method loads the file as **one** YAML document, or
throws *YAMLException*, D:YAML exception type, if the file could not be parsed or
contains more than one document. Note that we don't do any error checking here in order
to keep the example as simple as possible.
*Node* represents a node in a YAML document. It can be a sequence (array), mapping
(associative array) or a scalar (value). Here the root node is a mapping, and we use the
index operator to get subnodes with keys "Hello World" and "Answer". We iterate over the
former, as it is a sequence, and use the *Node.as()* method on the latter to read its
value as an integer.
You can iterate over a mapping or sequence as if it was an associative or normal array,
respectively. If you try to iterate over a scalar, it will throw a *YAMLException*.
You can iterate using *Node* as the iterated type, or specify the type iterated nodes
are expected to have. D:YAML will automatically convert to that type if possible. Here
we specify the *string* type, so we iterate over the "Hello World" sequence as an array
of strings. If it is not possible to convert to iterated type, a *YAMLException* is
thrown. For instance, if we specified *int* here, we would get an error, as "Hello"
cannot be converted to an integer.
The *Node.as()* method is used to read value of a scalar node as specified type. If the
scalar does not have the specified type, D:YAML will try to convert it, throwing
*YAMLException* if not possible.
Finally we dump the document we just read to ``output.yaml`` with the *Dumper.dump()*
method. *Dumper* is a struct used to dump YAML documents. The *dump()* method writes
one or more documents to a file, throwing *YAMLException* if the file could not be
written to.
D:YAML tries to preserve style information in documents so e.g. ``[Hello, World]`` is
not turned into:
| ``- Hello``
| ``- World``
However, comments are not preserved and neither are any extra formatting whitespace that
doesn't affect the meaning of YAML contents.
^^^^^^^^^
Compiling
^^^^^^^^^
We're going to use dub, which we installed at the beginning, to compile our project.
Create a file called ``dub.json`` with the following contents:
.. code-block:: json
{
"name": "getting-started",
"targetType": "executable",
"sourceFiles": ["main.d"],
"mainSourceFile": "main.d",
"dependencies":
{
"dyaml": { "version" : "~>0.5.0" },
},
}
This file tells dub that we're building an executable called ``getting-started`` from
a D source file ``main.d``, and that our project depends on D:YAML 0.5.0 or any newer,
bugfix release of D:YAML 0.5 . DUB will automatically find and download the correct
version of D:YAML when the project is built.
Now run the following command in your project's directory::
dub build
dub will automatically download D:YAML and compile it, and then then it will compile our
program. This will generate an executable called ``getting-started`` or
``getting-started.exe`` in your directory. When you run it, it should produce the
following output::
Hello
World
The answer is 42
^^^^^^^^^^
Conclusion
^^^^^^^^^^
You should now have a basic idea about how to use D:YAML. To learn more, look at the
`API documentation <../api/index.html>`_ and other tutorials. You can find code for this
example in the ``example/getting_started`` directory in the package.

View file

@ -1,272 +0,0 @@
===========
YAML syntax
===========
This is an introduction to the most common YAML constructs. For more detailed
information, see `PyYAML documentation <http://pyyaml.org/wiki/PyYAMLDocumentation>`_,
which this article is based on,
`Chapter 2 of the YAML specification <http://yaml.org/spec/1.1/#id857168>`_
or the `Wikipedia page <http://en.wikipedia.org/wiki/YAML>`_.
YAML is a data serialization format designed for human readability. YAML is a
recursive acronym for "YAML Ain't Markup Language".
YAML is similar to JSON, and in fact, JSON is a subset of YAML 1.2; but YAML has
some more advanced features and is easier to read. However, it is also more
difficult to parse (and probably somewhat slower). Data is stored in mappings
(associative arrays), sequences (lists) and scalars (single values). Data
structure hierarchy depends either on indentation (block context, similar to
Python code), or nesting of brackets and braces (flow context, similar to JSON).
YAML comments begin with ``#`` and continue until the end of line.
---------
Documents
---------
A YAML stream consists of one or more documents starting with ``---`` and
optionally ending with ``...`` . ``---`` can be left out for the first document.
Single document with no explicit start or end:
.. code-block:: yaml
- Red
- Green
- Blue
Same document with explicit start and end:
.. code-block:: yaml
---
- Red
- Green
- Blue
...
A stream containing multiple documents:
.. code-block:: yaml
---
- Red
- Green
- Blue
---
- Linux
- BSD
---
answer : 42
---------
Sequences
---------
Sequences are arrays of nodes of any type, similar e.g. to Python lists.
In block context, each item begins with hyphen+space "- ". In flow context,
sequences have syntax similar to D arrays.
.. code-block:: yaml
#Block context
- Red
- Green
- Blue
.. code-block:: yaml
#Flow context
[Red, Green, Blue]
.. code-block:: yaml
#Nested
-
- Red
- Green
- Blue
-
- Linux
- BSD
.. code-block:: yaml
#Nested flow
[[Red, Green, Blue], [Linux, BSD]]
.. code-block:: yaml
#Nested in a mapping
Colors:
- Red
- Green
- Blue
Operating systems:
- Linux
- BSD
--------
Mappings
--------
Mappings are associative arrays where each key and value can be of any type,
similar e.g. to Python dictionaries. In block context, keys and values are
separated by colon+space ": ". In flow context, mappings have syntax similar
to D associative arrays, but with braces instead of brackets:
.. code-block:: yaml
#Block context
CPU: Athlon
GPU: Radeon
OS: Linux
.. code-block:: yaml
#Flow context
{CPU: Athlon, GPU: Radeon, OS: Linux}
.. code-block:: yaml
#Nested
PC:
CPU: Athlon
GPU: Radeon
OS: Debian
Phone:
CPU: Cortex
GPU: PowerVR
OS: Android
.. code-block:: yaml
#Nested flow
{PC: {CPU: Athlon, GPU: Radeon, OS: Debian},
Phone: {CPU: Cortex, GPU: PowerVR, OS: Android}}
.. code-block:: yaml
#Nested in a sequence
- CPU: Athlon
GPU: Radeon
OS: Debian
- CPU: Cortex
GPU: PowerVR
OS: Android
Complex keys start with question mark+space "? ".
.. code-block:: yaml
#Nested in a sequence
? [CPU, GPU]: [Athlon, Radeon]
OS: Debian
-------
Scalars
-------
Scalars are simple values such as integers, strings, timestamps and so on.
There are multiple scalar styles.
Plain scalars use no quotes, start with the first non-space and end with the
last non-space character:
.. code-block:: yaml
scalar: Plain scalar
Single quoted scalars start and end with single quotes. A single quote is
represented by a pair of single quotes ''.
.. code-block:: yaml
scalar: 'Single quoted scalar ending with some spaces '
Double quoted scalars support C-style escape sequences.
.. code-block:: yaml
scalar: "Double quoted scalar \n with some \\ escape sequences"
Block scalars are convenient for multi-line values. They start either with
``|`` or with ``>``. With ``|``, the newlines in the scalar are preserved.
With ``>``, the newlines between two non-empty lines are removed.
.. code-block:: yaml
scalar: |
Newlines are preserved
First line
Second line
.. code-block:: yaml
scalar: >
Newlines are folded
This is still the first paragraph
This is the second
paragraph
-------------------
Anchors and aliases
-------------------
Anchors and aliases can reduce size of YAML code by allowing you to define a
value once, assign an anchor to it and use alias referring to that anchor
anywhere else you need that value. It is possible to use this to create
recursive data structures and some parsers support this; however, D:YAML does
not (this might change in the future, but it is unlikely).
.. code-block:: yaml
Person: &AD
gender: male
name: Arthur Dent
Clone: *AD
----
Tags
----
Tags are identifiers that specify data types of YAML nodes. Most default YAML
tags are resolved implicitly, so there is no need to specify them. D:YAML also
supports implicit resolution for custom, user specified tags.
Explicitly specified tags:
.. code-block:: yaml
answer: !!int "42"
name: !!str "Arthur Dent"
Implicit tags:
.. code-block:: yaml
answer: 42 #int
name: Arthur Dent #string
This table shows D types stored in *yaml.Node* default YAML tags are converted to.
Some of these might change in the future (especially !!map and !!set).
====================== ====================
YAML tag D type
====================== ====================
!!null yaml.YAMLNull
!!bool bool
!!int long
!!float real
!!binary ubyte[]
!!timestamp std.datetime.SysTime
!!map, !!omap, !!pairs yaml.Node.Pair[]
!!seq, !!set yaml.Node[]
!!str string
====================== ====================