2011-06-24 14 views
5

De acuerdo con la official documentation, hay una manera de proporcionar devoluciones de llamada para las etiquetas personalizadas YAML:¿Cómo utilizar las devoluciones de etiquetas personalizadas de PHP-YAML?

mixed yaml_parse (string $input [, int $pos = 0 [, int &$ndocs [, array $callbacks ]]]) 

devoluciones de llamada
controladores de contenido para los nodos YAML. Matriz asociativa de etiquetas YAML => asignaciones de devolución de llamada.

Sin embargo, parece que no hay otra documentación sobre el tema, ¡incluso en la fuente de extensión!

he creado este script como una prueba:

<?php 

$yaml =<<<YAML 
--- 
prop: !custom val 
YAML; 

print_r(yaml_parse($yaml,0,$n,array(
    YAML_STR_TAG => function() { 
    echo "YAML_STR_TAG\n"; 
    $args = func_get_args(); 
    print_r($args); 
    return 'x'; 
    }, 
    '!custom' => function() { 
    echo "!custom\n"; 
    $args = func_get_args(); 
    print_r($args); 
    return 'y'; 
    } 
))); 

y me dieron este resultado:

$ php yaml.php 
YAML_STR_TAG 
Array 
(
    [0] => prop 
    [1] => tag:yaml.org,2002:str 
    [2] => 1 
) 
!custom 
Array 
(
    [0] => val 
    [1] => !custom 
    [2] => 1 
) 
Array 
(
    [x] => y 
) 

Desde que yo puedo decir varias cosas:

  • La clave utilizadas en la búsqueda de devolución de llamada es una de PHP-YAML predefined constants o la etiqueta personalizada utilizada en la fuente YAML, incluido el signo de admiración
  • Cada valor de la clave y en un mapa se "etiqueta" y se pasa a la devolución de llamada coincidente, probablemente porque según la especificación YAML, la clave también puede ser válida.
  • Tres argumentos se pasan a la devolución de llamada: el "asunto" de la etiqueta, la propia etiqueta y algún número, probablemente correspondiente a una constante YAML_*_SCALAR_STYLE.
  • El valor de retorno de devoluciones de llamada sustituye a la estructura de datos de etiquetado

Alguien puede confirmar el comportamiento esperado de esta función?

Respuesta

4

Después de mucha investigación y pruebas, he encontrado algunas respuestas.

como se encuentra en la extensión de unit tests, cada una devolución de llamada tiene tres argumentos:

  • mixtos$data - Los datos marcados, ya analizada
  • cadena$tag - El nombre de la etiqueta, ampliado según la offical YAML tag specs:
    • !custom se expande a !custom si no hay una etiqueta pr efix se define
    • !custom se expande a prefixcustom, donde prefix se define mediante los metadatos del documento %TAG ! prefix. Tenga en cuenta que hay no un signo de exclamación inicial
    • !!preset se expande al tipo interno definido por el analizador. Consulte las constantes YAML_*_TAG
    • !<verbatim-tag> expands to verbatim-tag`. Tenga en cuenta que no es un signo de exclamación inicial.
  • número entero$style - El estilo escalar utilizada. Consulte las constantes YAML_*_SCALAR_STYLE

La devolución de llamada debe devolver un valor mixto para que el analizador emita.

Cuestiones relacionadas