[fork] Ok it works, waiting for better days when I can use the original hx-yaml and Haxe 4 / HashLink
- Since Haxe 4 deprecates
haxe.Utf8
- Since Utf8
encode
anddecode
throw at least on HashLink, - Since HashLink does not have utf8 regex classes, ...it means this hx-yaml library is unusable for the time being, (as of 2019 October, the 27th, date of release of Haxe 4.0).
Say we don't care too much for Utf8, because we use yaml in config file that nobody else can edit. In that case we can use this fork.
- regex classes (i.e. what comes between
[..]
in a regex) for HashLink are changed so as to completely disregard special multibyte characters. Utf8.encode()
andUtf8.decode()
are both changed the identify function (they just return their parameter), and the deprecation message is removed.
This is very dirty and doesn't do justice to hx-yaml, but one day things will hopefully evolve so I get rid of those fixes, and for the time being I need this...
Anyway, the original README follows...
A cross platform YAML 1.2 parser and renderer for Haxe 3+. Ported from the feature rich js-yaml. Currently supports JavaScript, Flash (as3), CPP and Neko 2.0+.
From haxelib:
haxelib install yaml
Or the latest directly from GitHub
haxelib git yaml https://github.com/mikestead/hx-yaml.git src
invoice: 34843
date : 2001-01-23
bill_to: &id001
given : Chris
family : Dumars
address:
lines: |
458 Walkman Dr.
Suite #292
city : Royal Oak
state : MI
postal : 48046
ship_to: *id001
tax : 251.42
457: true
total: 4443.52
comments: >
Late afternoon is best.
Backup contact is Nancy
Billsmer @ 338-4338.
import yaml.Yaml;
import yaml.Parser;
import yaml.Renderer;
import yaml.util.ObjectMap;
class Example
{ml
static function main()
{
parsingExample();
renderingExample();
}
static function parsingExample()
{
#if sys
// Load and parse our invoice document using yaml.util.ObjectMap for key => value containers.
// Using this default option allows for complex key types and a slightly nicer api to
// iterate keys/values.
// Equivalent to Yaml.read("invoice.yaml", Parser.options().useMaps());
var data:AnyObjectMap = Yaml.read("invoice.yaml");
trace(data.get("tax")); // 251.42
trace(data.get(457)); // true
// Load and parse the same document this time using dynamic objects for key => value containers.
// This option will stringify all keys but is useful for mapping to typedefs.
var data = Yaml.read("invoice.yaml", Parser.options().useObjects());
trace(data.invoice); // 3483
trace(data.ship_to.given); // Chris
trace(Reflect.field(data, "457")); // true
#end
// If you already have the yaml document in string form you can parse it directly
var data = Yaml.parse("key: value");
trace(data.get("key")); // value
}
static function renderingExample()
{
var receipt = {assistant:"Chris", items:[{rice:2.34}, {milk:1.22}]};
// Render an object tree as a yaml document.
var document = Yaml.render(receipt);
trace(document);
// assistant: Chris
// items:
// - rice: 2.34
// - milk: 1.22
#if sys
// This time write that same document to disk and adjust the flow level giving
// a more compact result.
Yaml.write("receipt.yaml", receipt, Renderer.options().setFlowLevel(1));
#end
}
}
assistant: Chris
items: [{rice: 2.34}, {milk: 1.22}]
// Parse a single yaml document into object form
yaml.Yaml.parse(document:String, ?options:ParserOptions):Dynamic
// (sys only) Read a single yaml document from disk and parse it into object form
yaml.Yaml.read(filePath:String, ?options:ParserOptions):Dynamic
yaml.Parser.ParserOptions:
- strict:Bool - Parser will throw errors instead of tracing warnings. Default `false`.
- validate:Bool - Perform validation checks while parsing. Default is `true`.
- schema:Schema - The schema to use. Default is `yaml.schema.DefaultSchema`.
- maps:Boolean - True when using ObjectMaps, false when using Dynamic objects.
// Render a yaml object graph as a yaml document
yaml.Yaml.render(data:Dynamic, ?options:RenderOptions):String
// (sys only) Render a yaml object graph as a yaml document and write it to disk
yaml.Yaml.write(filePath:String, data:Dynamic, ?options:RenderOptions):Void
yaml.Renderer.RendererOptions:
- indent:Int - The space indentation to use. Default `2`.
- flowLevel:Int - The level of nesting, when to switch from block to flow
style for collections. -1 means block style everywhere. Default `-1`.
- styles:StringMap - "tag" => "style" map. Each tag may have its own set of styles.
- schema:Schema - The schema to use. Default is `yaml.schema.DefaultSchema`.
!!null
"canonical" => "~"
!!int
"binary" => "0b1", "0b101010", "0b1110001111010"
"octal" => "01", "052", "016172"
"decimal" => "1", "42", "7290"
"hexadecimal" => "0x1", "0x2A", "0x1C7A"
!!null, !!bool, !!float
"lowercase" => "null", "true", "false", ".nan", '.inf'
"uppercase" => "NULL", "TRUE", "FALSE", ".NAN", '.INF'
"camelcase" => "Null", "True", "False", ".NaN", '.Inf'
By default, !!int uses decimal
, and !!null, !!bool, !!float use lowercase
.
The list of standard YAML tags and corresponding Haxe types. See also YAML types.
!!null '' # null
!!bool 'yes' # Bool
!!int '3...' # Int
!!float '3.14...' # Float
!!binary '...base64...' # haxe.Binary
!!timestamp 'YYYY-...' # Date
!!omap [ ... ] # Array of yaml.util.ObjectMap
!!pairs [ ... ] # Array of Array pairs
!!set { ... } # yaml.util.ObjectMap of keys with null values
!!str '...' # String
!!seq [ ... ] # Array
!!map { ... } # yaml.util.ObjectMap
When parsing into maps, yaml.util.ObjectMap
is used. Under Haxe 3.0 haxe.ds.ObjectMap
would be used but it doesn't support primitive
keys on all targets and we need a map which can contain a mixture of key types.
- Under CPP and Neko UTC date translation is not yet possible so dates will be represented in local time instead.
- Requires Neko 2.0+ when used under the Neko runtime due to its support for Unicode based regular expressions.
- CPP support requires Haxe 3.1.2+ and hxcpp 3.0.2+
MIT - See LICENSE