2012-03-13 15:00:00 +00:00
|
|
|
<?xml version="1.0" encoding="utf-8"?>
|
2012-05-01 12:31:16 +00:00
|
|
|
<!-- $Revision$ -->
|
2012-03-13 15:00:00 +00:00
|
|
|
|
|
|
|
<chapter xml:id="yaml.callbacks" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
|
|
<title>Callbacks</title>
|
|
|
|
|
|
|
|
<section xml:id="yaml.callbacks.parse">
|
|
|
|
<title>Parse callbacks</title>
|
|
|
|
<para>
|
|
|
|
Parse <type>callbacks</type> are invoked by
|
|
|
|
<function>yaml_parse</function>, <function>yaml_parse_file</function> or
|
|
|
|
<function>yaml_parse_url</function> functions when a registered YAML tag is
|
|
|
|
encountered. The callback is passed the tagged entity's value, the tag, and
|
|
|
|
flags indicating the scalar entity style. The callback must return the data
|
|
|
|
that the YAML parser should emit for this entity.
|
|
|
|
</para>
|
|
|
|
<example>
|
|
|
|
<title>Parse callback example</title>
|
|
|
|
<programlisting role="php">
|
|
|
|
<![CDATA[
|
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* Parsing callback for yaml tag.
|
|
|
|
* @param mixed $value Data from yaml file
|
|
|
|
* @param string $tag Tag that triggered callback
|
|
|
|
* @param int $flags Scalar entity style (see YAML_*_SCALAR_STYLE)
|
|
|
|
* @return mixed Value that YAML parser should emit for the given value
|
|
|
|
*/
|
|
|
|
function tag_callback ($value, $tag, $flags) {
|
|
|
|
var_dump(func_get_args()); // debugging
|
|
|
|
return "Hello {$value}";
|
|
|
|
}
|
|
|
|
|
|
|
|
$yaml = <<<YAML
|
|
|
|
greeting: !example/hello World
|
|
|
|
YAML;
|
|
|
|
|
|
|
|
$result = yaml_parse($yaml, 0, $ndocs, array(
|
|
|
|
'!example/hello' => 'tag_callback',
|
|
|
|
));
|
|
|
|
|
|
|
|
var_dump($result);
|
|
|
|
?>
|
|
|
|
]]>
|
|
|
|
</programlisting>
|
|
|
|
&example.outputs.similar;
|
|
|
|
<screen>
|
|
|
|
<![CDATA[
|
|
|
|
array(3) {
|
|
|
|
[0]=>
|
|
|
|
string(5) "World"
|
|
|
|
[1]=>
|
|
|
|
string(14) "!example/hello"
|
|
|
|
[2]=>
|
|
|
|
int(1)
|
|
|
|
}
|
|
|
|
array(1) {
|
|
|
|
["greeting"]=>
|
|
|
|
string(11) "Hello World"
|
|
|
|
}
|
|
|
|
]]>
|
|
|
|
</screen>
|
|
|
|
</example>
|
|
|
|
</section>
|
|
|
|
|
|
|
|
<section xml:id="yaml.callbacks.emit">
|
|
|
|
<title>Emit callbacks</title>
|
|
|
|
<para>
|
|
|
|
Emit callbacks are invoked when an instance of a registered class is
|
|
|
|
emitted by <function>yaml_emit</function> or
|
|
|
|
<function>yaml_emit_file</function>. The callback is passed the object to
|
|
|
|
be emitted. The callback must return an array having two keys:
|
|
|
|
"<literal>tag</literal>" and "<literal>data</literal>".
|
|
|
|
The value associated with the "<literal>tag</literal>" key must
|
|
|
|
be a string to be used as the YAML tag in the output. The value associated
|
|
|
|
with the "<literal>data</literal>" key will be encoded as YAML
|
|
|
|
and emitted in place of the intercepted object.
|
|
|
|
</para>
|
|
|
|
<example>
|
|
|
|
<title>Emit callback example</title>
|
|
|
|
<programlisting role="php">
|
|
|
|
<![CDATA[
|
|
|
|
<?php
|
|
|
|
class EmitExample {
|
|
|
|
public $data; // data may be in any pecl/yaml suitable type
|
|
|
|
|
|
|
|
public function __construct ($d) {
|
|
|
|
$this->data = $d;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Yaml emit callback function, referred on yaml_emit call by class name.
|
|
|
|
*
|
|
|
|
* Expected to return an array with 2 values:
|
|
|
|
* - 'tag': custom tag for this serialization
|
|
|
|
* - 'data': value to convert to yaml (array, string, bool, number)
|
|
|
|
*
|
|
|
|
* @param object $obj Object to be emitted
|
|
|
|
* @return array Tag and surrogate data to emit
|
|
|
|
*/
|
|
|
|
public static function yamlEmit (EmitExample $obj) {
|
|
|
|
return array(
|
|
|
|
'tag' => '!example/emit',
|
|
|
|
'data' => $obj->data,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$emit_callbacks = array(
|
|
|
|
'EmitExample' => array('EmitExample', 'yamlEmit')
|
|
|
|
);
|
|
|
|
|
|
|
|
$t = new EmitExample(array('a','b','c'));
|
|
|
|
$yaml = yaml_emit(
|
|
|
|
array(
|
|
|
|
'example' => $t,
|
|
|
|
),
|
|
|
|
YAML_ANY_ENCODING,
|
|
|
|
YAML_ANY_BREAK,
|
|
|
|
$emit_callbacks
|
|
|
|
);
|
|
|
|
var_dump($yaml);
|
|
|
|
?>
|
|
|
|
]]>
|
|
|
|
</programlisting>
|
|
|
|
&example.outputs.similar;
|
|
|
|
<screen>
|
|
|
|
<![CDATA[
|
|
|
|
string(43) "---
|
|
|
|
example: !example/emit
|
|
|
|
- a
|
|
|
|
- b
|
|
|
|
- c
|
|
|
|
...
|
|
|
|
"
|
|
|
|
]]>
|
|
|
|
</screen>
|
|
|
|
</example>
|
|
|
|
</section>
|
|
|
|
|
|
|
|
</chapter>
|
|
|
|
|
|
|
|
<!-- Keep this comment at the end of the file
|
|
|
|
Local variables:
|
|
|
|
mode: sgml
|
|
|
|
sgml-omittag:t
|
|
|
|
sgml-shorttag:t
|
|
|
|
sgml-minimize-attributes:nil
|
|
|
|
sgml-always-quote-attributes:t
|
|
|
|
sgml-indent-step:1
|
|
|
|
sgml-indent-data:t
|
|
|
|
indent-tabs-mode:nil
|
|
|
|
sgml-parent-document:nil
|
|
|
|
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
|
|
|
sgml-exposed-tags:nil
|
|
|
|
sgml-local-catalogs:nil
|
|
|
|
sgml-local-ecat-files:nil
|
|
|
|
End:
|
|
|
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
|
|
|
vim: et tw=78 syn=sgml
|
|
|
|
vi: ts=1 sw=1
|
|
|
|
-->
|