danielebarchiesi@4: danielebarchiesi@4: * @license http://arc.semsol.org/license danielebarchiesi@4: * @homepage danielebarchiesi@4: * @package ARC2 danielebarchiesi@4: */ danielebarchiesi@4: danielebarchiesi@4: ARC2::inc('RDFParser'); danielebarchiesi@4: danielebarchiesi@4: class ARC2_RDFXMLParser extends ARC2_RDFParser { danielebarchiesi@4: danielebarchiesi@4: function __construct($a, &$caller) { danielebarchiesi@4: parent::__construct($a, $caller); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function __init() {/* reader */ danielebarchiesi@4: parent::__init(); danielebarchiesi@4: $this->encoding = $this->v('encoding', false, $this->a); danielebarchiesi@4: $this->state = 0; danielebarchiesi@4: $this->x_lang = ''; danielebarchiesi@4: $this->x_base = $this->base; danielebarchiesi@4: $this->xml = 'http://www.w3.org/XML/1998/namespace'; danielebarchiesi@4: $this->rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'; danielebarchiesi@4: $this->nsp = array($this->xml => 'xml', $this->rdf => 'rdf'); danielebarchiesi@4: $this->s_stack = array(); danielebarchiesi@4: $this->s_count = 0; danielebarchiesi@4: $this->target_encoding = ''; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function parse($path, $data = '', $iso_fallback = false) { danielebarchiesi@4: /* reader */ danielebarchiesi@4: if (!$this->v('reader')) { danielebarchiesi@4: ARC2::inc('Reader'); danielebarchiesi@4: $this->reader = new ARC2_Reader($this->a, $this); danielebarchiesi@4: } danielebarchiesi@4: $this->reader->setAcceptHeader('Accept: application/rdf+xml; q=0.9, */*; q=0.1'); danielebarchiesi@4: $this->reader->activate($path, $data); danielebarchiesi@4: $this->x_base = isset($this->a['base']) && $this->a['base'] ? $this->a['base'] : $this->reader->base; danielebarchiesi@4: /* xml parser */ danielebarchiesi@4: $this->initXMLParser(); danielebarchiesi@4: /* parse */ danielebarchiesi@4: $first = true; danielebarchiesi@4: while ($d = $this->reader->readStream()) { danielebarchiesi@4: if (!$this->keep_time_limit) @set_time_limit($this->v('time_limit', 60, $this->a)); danielebarchiesi@4: if ($iso_fallback && $first) { danielebarchiesi@4: $d = '' . "\n" . preg_replace('/^\<\?xml [^\>]+\?\>\s*/s', '', $d); danielebarchiesi@4: $first = false; danielebarchiesi@4: } danielebarchiesi@4: if (!xml_parse($this->xml_parser, $d, false)) { danielebarchiesi@4: $error_str = xml_error_string(xml_get_error_code($this->xml_parser)); danielebarchiesi@4: $line = xml_get_current_line_number($this->xml_parser); danielebarchiesi@4: $this->tmp_error = 'XML error: "' . $error_str . '" at line ' . $line . ' (parsing as ' . $this->getEncoding() . ')'; danielebarchiesi@4: if (!$iso_fallback && preg_match("/Invalid character/i", $error_str)) { danielebarchiesi@4: xml_parser_free($this->xml_parser); danielebarchiesi@4: unset($this->xml_parser); danielebarchiesi@4: $this->reader->closeStream(); danielebarchiesi@4: $this->__init(); danielebarchiesi@4: $this->encoding = 'ISO-8859-1'; danielebarchiesi@4: unset($this->xml_parser); danielebarchiesi@4: unset($this->reader); danielebarchiesi@4: return $this->parse($path, $data, true); danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: return $this->addError($this->tmp_error); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: $this->target_encoding = xml_parser_get_option($this->xml_parser, XML_OPTION_TARGET_ENCODING); danielebarchiesi@4: xml_parser_free($this->xml_parser); danielebarchiesi@4: $this->reader->closeStream(); danielebarchiesi@4: unset($this->reader); danielebarchiesi@4: return $this->done(); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function initXMLParser() { danielebarchiesi@4: if (!isset($this->xml_parser)) { danielebarchiesi@4: $enc = preg_match('/^(utf\-8|iso\-8859\-1|us\-ascii)$/i', $this->getEncoding(), $m) ? $m[1] : 'UTF-8'; danielebarchiesi@4: $parser = xml_parser_create_ns($enc, ''); danielebarchiesi@4: xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 0); danielebarchiesi@4: xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); danielebarchiesi@4: xml_set_element_handler($parser, 'open', 'close'); danielebarchiesi@4: xml_set_character_data_handler($parser, 'cdata'); danielebarchiesi@4: xml_set_start_namespace_decl_handler($parser, 'nsDecl'); danielebarchiesi@4: xml_set_object($parser, $this); danielebarchiesi@4: $this->xml_parser = $parser; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function getEncoding($src = 'config') { danielebarchiesi@4: if ($src == 'parser') { danielebarchiesi@4: return $this->target_encoding; danielebarchiesi@4: } danielebarchiesi@4: elseif (($src == 'config') && $this->encoding) { danielebarchiesi@4: return $this->encoding; danielebarchiesi@4: } danielebarchiesi@4: return $this->reader->getEncoding(); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function getTriples() { danielebarchiesi@4: return $this->v('triples', array()); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function countTriples() { danielebarchiesi@4: return $this->t_count; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function pushS(&$s) { danielebarchiesi@4: $s['pos'] = $this->s_count; danielebarchiesi@4: $this->s_stack[$this->s_count] = $s; danielebarchiesi@4: $this->s_count++; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function popS(){/* php 4.0.x-safe */ danielebarchiesi@4: $r = array(); danielebarchiesi@4: $this->s_count--; danielebarchiesi@4: for ($i = 0, $i_max = $this->s_count; $i < $i_max; $i++) { danielebarchiesi@4: $r[$i] = $this->s_stack[$i]; danielebarchiesi@4: } danielebarchiesi@4: $this->s_stack = $r; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function updateS($s) { danielebarchiesi@4: $this->s_stack[$s['pos']] = $s; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function getParentS() { danielebarchiesi@4: return ($this->s_count && isset($this->s_stack[$this->s_count - 1])) ? $this->s_stack[$this->s_count - 1] : false; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function getParentXBase() { danielebarchiesi@4: if ($p = $this->getParentS()) { danielebarchiesi@4: return isset($p['p_x_base']) && $p['p_x_base'] ? $p['p_x_base'] : (isset($p['x_base']) ? $p['x_base'] : ''); danielebarchiesi@4: } danielebarchiesi@4: return $this->x_base; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function getParentXLang() { danielebarchiesi@4: if ($p = $this->getParentS()) { danielebarchiesi@4: return isset($p['p_x_lang']) && $p['p_x_lang'] ? $p['p_x_lang'] : (isset($p['x_lang']) ? $p['x_lang'] : ''); danielebarchiesi@4: } danielebarchiesi@4: return $this->x_lang; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function addT($s, $p, $o, $s_type, $o_type, $o_dt = '', $o_lang = '') { danielebarchiesi@4: //echo "-----\nadding $s / $p / $o\n-----\n"; danielebarchiesi@4: $t = array('s' => $s, 'p' => $p, 'o' => $o, 's_type' => $s_type, 'o_type' => $o_type, 'o_datatype' => $o_dt, 'o_lang' => $o_lang); danielebarchiesi@4: if ($this->skip_dupes) { danielebarchiesi@4: $h = md5(serialize($t)); danielebarchiesi@4: if (!isset($this->added_triples[$h])) { danielebarchiesi@4: $this->triples[$this->t_count] = $t; danielebarchiesi@4: $this->t_count++; danielebarchiesi@4: $this->added_triples[$h] = true; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: $this->triples[$this->t_count] = $t; danielebarchiesi@4: $this->t_count++; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function reify($t, $s, $p, $o, $s_type, $o_type, $o_dt = '', $o_lang = '') { danielebarchiesi@4: $this->addT($t, $this->rdf.'type', $this->rdf.'Statement', 'uri', 'uri'); danielebarchiesi@4: $this->addT($t, $this->rdf.'subject', $s, 'uri', $s_type); danielebarchiesi@4: $this->addT($t, $this->rdf.'predicate', $p, 'uri', 'uri'); danielebarchiesi@4: $this->addT($t, $this->rdf.'object', $o, 'uri', $o_type, $o_dt, $o_lang); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function open($p, $t, $a) { danielebarchiesi@4: //echo "state is $this->state\n"; danielebarchiesi@4: //echo "opening $t\n"; danielebarchiesi@4: switch($this->state) { danielebarchiesi@4: case 0: return $this->h0Open($t, $a); danielebarchiesi@4: case 1: return $this->h1Open($t, $a); danielebarchiesi@4: case 2: return $this->h2Open($t, $a); danielebarchiesi@4: case 4: return $this->h4Open($t, $a); danielebarchiesi@4: case 5: return $this->h5Open($t, $a); danielebarchiesi@4: case 6: return $this->h6Open($t, $a); danielebarchiesi@4: default: $this->addError('open() called at state ' . $this->state . ' in '.$t); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function close($p, $t) { danielebarchiesi@4: //echo "state is $this->state\n"; danielebarchiesi@4: //echo "closing $t\n"; danielebarchiesi@4: switch($this->state){ danielebarchiesi@4: case 1: return $this->h1Close($t); danielebarchiesi@4: case 2: return $this->h2Close($t); danielebarchiesi@4: case 3: return $this->h3Close($t); danielebarchiesi@4: case 4: return $this->h4Close($t); danielebarchiesi@4: case 5: return $this->h5Close($t); danielebarchiesi@4: case 6: return $this->h6Close($t); danielebarchiesi@4: default: $this->addError('close() called at state ' . $this->state . ' in '.$t); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function cdata($p, $d) { danielebarchiesi@4: //echo "state is $this->state\n"; danielebarchiesi@4: //echo "cdata\n"; danielebarchiesi@4: switch($this->state){ danielebarchiesi@4: case 4: return $this->h4Cdata($d); danielebarchiesi@4: case 6: return $this->h6Cdata($d); danielebarchiesi@4: default: return false; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: function nsDecl($p, $prf, $uri) { danielebarchiesi@4: $this->nsp[$uri] = isset($this->nsp[$uri]) ? $this->nsp[$uri] : $prf; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function h0Open($t, $a) { danielebarchiesi@4: $this->x_lang = $this->v($this->xml.'lang', $this->x_lang, $a); danielebarchiesi@4: $this->x_base = $this->calcURI($this->v($this->xml.'base', $this->x_base, $a)); danielebarchiesi@4: $this->state = 1; danielebarchiesi@4: if ($t !== $this->rdf.'RDF') { danielebarchiesi@4: $this->h1Open($t, $a); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function h1Open($t, $a) { danielebarchiesi@4: $s = array( danielebarchiesi@4: 'x_base' => isset($a[$this->xml.'base']) ? $this->calcURI($a[$this->xml.'base']) : $this->getParentXBase(), danielebarchiesi@4: 'x_lang' => isset($a[$this->xml.'lang']) ? $a[$this->xml.'lang'] : $this->getParentXLang(), danielebarchiesi@4: 'li_count' => 0, danielebarchiesi@4: ); danielebarchiesi@4: /* ID */ danielebarchiesi@4: if (isset($a[$this->rdf.'ID'])) { danielebarchiesi@4: $s['type'] = 'uri'; danielebarchiesi@4: $s['value'] = $this->calcURI('#'.$a[$this->rdf.'ID'], $s['x_base']); danielebarchiesi@4: } danielebarchiesi@4: /* about */ danielebarchiesi@4: elseif (isset($a[$this->rdf.'about'])) { danielebarchiesi@4: $s['type'] = 'uri'; danielebarchiesi@4: $s['value'] = $this->calcURI($a[$this->rdf.'about'], $s['x_base']); danielebarchiesi@4: } danielebarchiesi@4: /* bnode */ danielebarchiesi@4: else { danielebarchiesi@4: $s['type'] = 'bnode'; danielebarchiesi@4: if (isset($a[$this->rdf.'nodeID'])) { danielebarchiesi@4: $s['value'] = '_:'.$a[$this->rdf.'nodeID']; danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: $s['value'] = $this->createBnodeID(); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: /* sub-node */ danielebarchiesi@4: if ($this->state === 4) { danielebarchiesi@4: $sup_s = $this->getParentS(); danielebarchiesi@4: /* new collection */ danielebarchiesi@4: if (isset($sup_s['o_is_coll']) && $sup_s['o_is_coll']) { danielebarchiesi@4: $coll = array('value' => $this->createBnodeID(), 'type' => 'bnode', 'is_coll' => true, 'x_base' => $s['x_base'], 'x_lang' => $s['x_lang']); danielebarchiesi@4: $this->addT($sup_s['value'], $sup_s['p'], $coll['value'], $sup_s['type'], $coll['type']); danielebarchiesi@4: $this->addT($coll['value'], $this->rdf . 'first', $s['value'], $coll['type'], $s['type']); danielebarchiesi@4: $this->pushS($coll); danielebarchiesi@4: } danielebarchiesi@4: /* new entry in existing coll */ danielebarchiesi@4: elseif (isset($sup_s['is_coll']) && $sup_s['is_coll']) { danielebarchiesi@4: $coll = array('value' => $this->createBnodeID(), 'type' => 'bnode', 'is_coll' => true, 'x_base' => $s['x_base'], 'x_lang' => $s['x_lang']); danielebarchiesi@4: $this->addT($sup_s['value'], $this->rdf . 'rest', $coll['value'], $sup_s['type'], $coll['type']); danielebarchiesi@4: $this->addT($coll['value'], $this->rdf . 'first', $s['value'], $coll['type'], $s['type']); danielebarchiesi@4: $this->pushS($coll); danielebarchiesi@4: } danielebarchiesi@4: /* normal sub-node */ danielebarchiesi@4: elseif(isset($sup_s['p']) && $sup_s['p']) { danielebarchiesi@4: $this->addT($sup_s['value'], $sup_s['p'], $s['value'], $sup_s['type'], $s['type']); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: /* typed node */ danielebarchiesi@4: if ($t !== $this->rdf.'Description') { danielebarchiesi@4: $this->addT($s['value'], $this->rdf.'type', $t, $s['type'], 'uri'); danielebarchiesi@4: } danielebarchiesi@4: /* (additional) typing attr */ danielebarchiesi@4: if (isset($a[$this->rdf.'type'])) { danielebarchiesi@4: $this->addT($s['value'], $this->rdf.'type', $a[$this->rdf.'type'], $s['type'], 'uri'); danielebarchiesi@4: } danielebarchiesi@4: /* Seq|Bag|Alt */ danielebarchiesi@4: if (in_array($t, array($this->rdf.'Seq', $this->rdf.'Bag', $this->rdf.'Alt'))) { danielebarchiesi@4: $s['is_con'] = true; danielebarchiesi@4: } danielebarchiesi@4: /* any other attrs (skip rdf and xml, except rdf:_, rdf:value, rdf:Seq) */ danielebarchiesi@4: foreach($a as $k => $v) { danielebarchiesi@4: if (((strpos($k, $this->xml) === false) && (strpos($k, $this->rdf) === false)) || preg_match('/(\_[0-9]+|value|Seq|Bag|Alt|Statement|Property|List)$/', $k)) { danielebarchiesi@4: if (strpos($k, ':')) { danielebarchiesi@4: $this->addT($s['value'], $k, $v, $s['type'], 'literal', '', $s['x_lang']); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: $this->pushS($s); danielebarchiesi@4: $this->state = 2; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function h2Open($t, $a) { danielebarchiesi@4: $s = $this->getParentS(); danielebarchiesi@4: foreach (array('p_x_base', 'p_x_lang', 'p_id', 'o_is_coll') as $k) { danielebarchiesi@4: unset($s[$k]); danielebarchiesi@4: } danielebarchiesi@4: /* base */ danielebarchiesi@4: if (isset($a[$this->xml.'base'])) { danielebarchiesi@4: $s['p_x_base'] = $this->calcURI($a[$this->xml.'base'], $s['x_base']); danielebarchiesi@4: } danielebarchiesi@4: $b = isset($s['p_x_base']) && $s['p_x_base'] ? $s['p_x_base'] : $s['x_base']; danielebarchiesi@4: /* lang */ danielebarchiesi@4: if (isset($a[$this->xml.'lang'])) { danielebarchiesi@4: $s['p_x_lang'] = $a[$this->xml.'lang']; danielebarchiesi@4: } danielebarchiesi@4: $l = isset($s['p_x_lang']) && $s['p_x_lang'] ? $s['p_x_lang'] : $s['x_lang']; danielebarchiesi@4: /* adjust li */ danielebarchiesi@4: if ($t === $this->rdf.'li') { danielebarchiesi@4: $s['li_count']++; danielebarchiesi@4: $t = $this->rdf.'_'.$s['li_count']; danielebarchiesi@4: } danielebarchiesi@4: /* set p */ danielebarchiesi@4: $s['p'] = $t; danielebarchiesi@4: /* reification */ danielebarchiesi@4: if (isset($a[$this->rdf.'ID'])) { danielebarchiesi@4: $s['p_id'] = $a[$this->rdf.'ID']; danielebarchiesi@4: } danielebarchiesi@4: $o = array('value' => '', 'type' => '', 'x_base' => $b, 'x_lang' => $l); danielebarchiesi@4: /* resource/rdf:resource */ danielebarchiesi@4: if (isset($a['resource'])) { danielebarchiesi@4: $a[$this->rdf . 'resource'] = $a['resource']; danielebarchiesi@4: unset($a['resource']); danielebarchiesi@4: } danielebarchiesi@4: if (isset($a[$this->rdf.'resource'])) { danielebarchiesi@4: $o['value'] = $this->calcURI($a[$this->rdf.'resource'], $b); danielebarchiesi@4: $o['type'] = 'uri'; danielebarchiesi@4: $this->addT($s['value'], $s['p'], $o['value'], $s['type'], $o['type']); danielebarchiesi@4: /* type */ danielebarchiesi@4: if (isset($a[$this->rdf.'type'])) { danielebarchiesi@4: $this->addT($o['value'], $this->rdf.'type', $a[$this->rdf.'type'], 'uri', 'uri'); danielebarchiesi@4: } danielebarchiesi@4: /* reification */ danielebarchiesi@4: if (isset($s['p_id'])) { danielebarchiesi@4: $this->reify($this->calcURI('#'.$s['p_id'], $b), $s['value'], $s['p'], $o['value'], $s['type'], $o['type']); danielebarchiesi@4: unset($s['p_id']); danielebarchiesi@4: } danielebarchiesi@4: $this->state = 3; danielebarchiesi@4: } danielebarchiesi@4: /* named bnode */ danielebarchiesi@4: elseif (isset($a[$this->rdf.'nodeID'])) { danielebarchiesi@4: $o['value'] = '_:' . $a[$this->rdf.'nodeID']; danielebarchiesi@4: $o['type'] = 'bnode'; danielebarchiesi@4: $this->addT($s['value'], $s['p'], $o['value'], $s['type'], $o['type']); danielebarchiesi@4: $this->state = 3; danielebarchiesi@4: /* reification */ danielebarchiesi@4: if (isset($s['p_id'])) { danielebarchiesi@4: $this->reify($this->calcURI('#'.$s['p_id'], $b), $s['value'], $s['p'], $o['value'], $s['type'], $o['type']); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: /* parseType */ danielebarchiesi@4: elseif (isset($a[$this->rdf.'parseType'])) { danielebarchiesi@4: if ($a[$this->rdf.'parseType'] === 'Literal') { danielebarchiesi@4: $s['o_xml_level'] = 0; danielebarchiesi@4: $s['o_xml_data'] = ''; danielebarchiesi@4: $s['p_xml_literal_level'] = 0; danielebarchiesi@4: $s['ns'] = array(); danielebarchiesi@4: $this->state = 6; danielebarchiesi@4: } danielebarchiesi@4: elseif ($a[$this->rdf.'parseType'] === 'Resource') { danielebarchiesi@4: $o['value'] = $this->createBnodeID(); danielebarchiesi@4: $o['type'] = 'bnode'; danielebarchiesi@4: $o['has_closing_tag'] = 0; danielebarchiesi@4: $this->addT($s['value'], $s['p'], $o['value'], $s['type'], $o['type']); danielebarchiesi@4: $this->pushS($o); danielebarchiesi@4: /* reification */ danielebarchiesi@4: if (isset($s['p_id'])) { danielebarchiesi@4: $this->reify($this->calcURI('#'.$s['p_id'], $b), $s['value'], $s['p'], $o['value'], $s['type'], $o['type']); danielebarchiesi@4: unset($s['p_id']); danielebarchiesi@4: } danielebarchiesi@4: $this->state = 2; danielebarchiesi@4: } danielebarchiesi@4: elseif ($a[$this->rdf.'parseType'] === 'Collection') { danielebarchiesi@4: $s['o_is_coll'] = true; danielebarchiesi@4: $this->state = 4; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: /* sub-node or literal */ danielebarchiesi@4: else { danielebarchiesi@4: $s['o_cdata'] = ''; danielebarchiesi@4: if (isset($a[$this->rdf.'datatype'])) { danielebarchiesi@4: $s['o_datatype'] = $a[$this->rdf.'datatype']; danielebarchiesi@4: } danielebarchiesi@4: $this->state = 4; danielebarchiesi@4: } danielebarchiesi@4: /* any other attrs (skip rdf and xml) */ danielebarchiesi@4: foreach($a as $k => $v) { danielebarchiesi@4: if (((strpos($k, $this->xml) === false) && (strpos($k, $this->rdf) === false)) || preg_match('/(\_[0-9]+|value)$/', $k)) { danielebarchiesi@4: if (strpos($k, ':')) { danielebarchiesi@4: if (!$o['value']) { danielebarchiesi@4: $o['value'] = $this->createBnodeID(); danielebarchiesi@4: $o['type'] = 'bnode'; danielebarchiesi@4: $this->addT($s['value'], $s['p'], $o['value'], $s['type'], $o['type']); danielebarchiesi@4: } danielebarchiesi@4: /* reification */ danielebarchiesi@4: if (isset($s['p_id'])) { danielebarchiesi@4: $this->reify($this->calcURI('#'.$s['p_id'], $b), $s['value'], $s['p'], $o['value'], $s['type'], $o['type']); danielebarchiesi@4: unset($s['p_id']); danielebarchiesi@4: } danielebarchiesi@4: $this->addT($o['value'], $k, $v, $o['type'], 'literal'); danielebarchiesi@4: $this->state = 3; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: $this->updateS($s); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function h4Open($t, $a) { danielebarchiesi@4: return $this->h1Open($t, $a); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function h5Open($t, $a) { danielebarchiesi@4: $this->state = 4; danielebarchiesi@4: return $this->h4Open($t, $a); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function h6Open($t, $a) { danielebarchiesi@4: $s = $this->getParentS(); danielebarchiesi@4: $data = isset($s['o_xml_data']) ? $s['o_xml_data'] : ''; danielebarchiesi@4: $ns = isset($s['ns']) ? $s['ns'] : array(); danielebarchiesi@4: $parts = $this->splitURI($t); danielebarchiesi@4: if ((count($parts) === 1) || empty($parts[1])) { danielebarchiesi@4: $data .= '<'.$t; danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: $ns_uri = $parts[0]; danielebarchiesi@4: $name = $parts[1]; danielebarchiesi@4: if (!isset($this->nsp[$ns_uri])) { danielebarchiesi@4: foreach ($this->nsp as $tmp1 => $tmp2) { danielebarchiesi@4: if (strpos($t, $tmp1) === 0) { danielebarchiesi@4: $ns_uri = $tmp1; danielebarchiesi@4: $name = substr($t, strlen($tmp1)); danielebarchiesi@4: break; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: $nsp = $this->nsp[$ns_uri]; danielebarchiesi@4: $data .= $nsp ? '<' . $nsp . ':' . $name : '<' . $name; danielebarchiesi@4: /* ns */ danielebarchiesi@4: if (!isset($ns[$nsp.'='.$ns_uri]) || !$ns[$nsp.'='.$ns_uri]) { danielebarchiesi@4: $data .= $nsp ? ' xmlns:'.$nsp.'="'.$ns_uri.'"' : ' xmlns="'.$ns_uri.'"'; danielebarchiesi@4: $ns[$nsp.'='.$ns_uri] = true; danielebarchiesi@4: $s['ns'] = $ns; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: foreach ($a as $k => $v) { danielebarchiesi@4: $parts = $this->splitURI($k); danielebarchiesi@4: if (count($parts) === 1) { danielebarchiesi@4: $data .= ' '.$k.'="'.$v.'"'; danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: $ns_uri = $parts[0]; danielebarchiesi@4: $name = $parts[1]; danielebarchiesi@4: $nsp = $this->v($ns_uri, '', $this->nsp); danielebarchiesi@4: $data .= $nsp ? ' '.$nsp.':'.$name.'="'.$v.'"' : ' '.$name.'="'.$v.'"' ; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: $data .= '>'; danielebarchiesi@4: $s['o_xml_data'] = $data; danielebarchiesi@4: $s['o_xml_level'] = isset($s['o_xml_level']) ? $s['o_xml_level'] + 1 : 1; danielebarchiesi@4: if ($t == $s['p']) {/* xml container prop */ danielebarchiesi@4: $s['p_xml_literal_level'] = isset($s['p_xml_literal_level']) ? $s['p_xml_literal_level'] + 1 : 1; danielebarchiesi@4: } danielebarchiesi@4: $this->updateS($s); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function h1Close($t) {/* end of doc */ danielebarchiesi@4: $this->state = 0; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function h2Close($t) {/* expecting a prop, getting a close */ danielebarchiesi@4: if ($s = $this->getParentS()) { danielebarchiesi@4: $has_closing_tag = (isset($s['has_closing_tag']) && !$s['has_closing_tag']) ? 0 : 1; danielebarchiesi@4: $this->popS(); danielebarchiesi@4: $this->state = 5; danielebarchiesi@4: if ($s = $this->getParentS()) {/* new s */ danielebarchiesi@4: if (!isset($s['p']) || !$s['p']) {/* p close after collection|parseType=Resource|node close after p close */ danielebarchiesi@4: $this->state = $this->s_count ? 4 : 1; danielebarchiesi@4: if (!$has_closing_tag) { danielebarchiesi@4: $this->state = 2; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: elseif (!$has_closing_tag) { danielebarchiesi@4: $this->state = 2; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function h3Close($t) {/* p close */ danielebarchiesi@4: $this->state = 2; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function h4Close($t) {/* empty p | pClose after cdata | pClose after collection */ danielebarchiesi@4: if ($s = $this->getParentS()) { danielebarchiesi@4: $b = isset($s['p_x_base']) && $s['p_x_base'] ? $s['p_x_base'] : (isset($s['x_base']) ? $s['x_base'] : ''); danielebarchiesi@4: if (isset($s['is_coll']) && $s['is_coll']) { danielebarchiesi@4: $this->addT($s['value'], $this->rdf . 'rest', $this->rdf . 'nil', $s['type'], 'uri'); danielebarchiesi@4: /* back to collection start */ danielebarchiesi@4: while ((!isset($s['p']) || ($s['p'] != $t))) { danielebarchiesi@4: $sub_s = $s; danielebarchiesi@4: $this->popS(); danielebarchiesi@4: $s = $this->getParentS(); danielebarchiesi@4: } danielebarchiesi@4: /* reification */ danielebarchiesi@4: if (isset($s['p_id']) && $s['p_id']) { danielebarchiesi@4: $this->reify($this->calcURI('#'.$s['p_id'], $b), $s['value'], $s['p'], $sub_s['value'], $s['type'], $sub_s['type']); danielebarchiesi@4: } danielebarchiesi@4: unset($s['p']); danielebarchiesi@4: $this->updateS($s); danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: $dt = isset($s['o_datatype']) ? $s['o_datatype'] : ''; danielebarchiesi@4: $l = isset($s['p_x_lang']) && $s['p_x_lang'] ? $s['p_x_lang'] : (isset($s['x_lang']) ? $s['x_lang'] : ''); danielebarchiesi@4: $o = array('type' => 'literal', 'value' => $s['o_cdata']); danielebarchiesi@4: $this->addT($s['value'], $s['p'], $o['value'], $s['type'], $o['type'], $dt, $l); danielebarchiesi@4: /* reification */ danielebarchiesi@4: if (isset($s['p_id']) && $s['p_id']) { danielebarchiesi@4: $this->reify($this->calcURI('#'.$s['p_id'], $b), $s['value'], $s['p'], $o['value'], $s['type'], $o['type'], $dt, $l); danielebarchiesi@4: } danielebarchiesi@4: unset($s['o_cdata']); danielebarchiesi@4: unset($s['o_datatype']); danielebarchiesi@4: unset($s['p']); danielebarchiesi@4: $this->updateS($s); danielebarchiesi@4: } danielebarchiesi@4: $this->state = 2; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function h5Close($t) {/* p close */ danielebarchiesi@4: if ($s = $this->getParentS()) { danielebarchiesi@4: unset($s['p']); danielebarchiesi@4: $this->updateS($s); danielebarchiesi@4: $this->state = 2; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function h6Close($t) { danielebarchiesi@4: if ($s = $this->getParentS()) { danielebarchiesi@4: $l = isset($s['p_x_lang']) && $s['p_x_lang'] ? $s['p_x_lang'] : (isset($s['x_lang']) ? $s['x_lang'] : ''); danielebarchiesi@4: $data = $s['o_xml_data']; danielebarchiesi@4: $level = $s['o_xml_level']; danielebarchiesi@4: if ($level === 0) {/* pClose */ danielebarchiesi@4: $this->addT($s['value'], $s['p'], trim($data, ' '), $s['type'], 'literal', $this->rdf.'XMLLiteral', $l); danielebarchiesi@4: unset($s['o_xml_data']); danielebarchiesi@4: $this->state = 2; danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: $parts = $this->splitURI($t); danielebarchiesi@4: if ((count($parts) === 1) || empty($parts[1])) { danielebarchiesi@4: $data .= ''; danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: $ns_uri = $parts[0]; danielebarchiesi@4: $name = $parts[1]; danielebarchiesi@4: if (!isset($this->nsp[$ns_uri])) { danielebarchiesi@4: foreach ($this->nsp as $tmp1 => $tmp2) { danielebarchiesi@4: if (strpos($t, $tmp1) === 0) { danielebarchiesi@4: $ns_uri = $tmp1; danielebarchiesi@4: $name = substr($t, strlen($tmp1)); danielebarchiesi@4: break; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: $nsp = $this->nsp[$ns_uri]; danielebarchiesi@4: $data .= $nsp ? '' : ''; danielebarchiesi@4: } danielebarchiesi@4: $s['o_xml_data'] = $data; danielebarchiesi@4: $s['o_xml_level'] = $level - 1; danielebarchiesi@4: if ($t == $s['p']) {/* xml container prop */ danielebarchiesi@4: $s['p_xml_literal_level']--; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: $this->updateS($s); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function h4Cdata($d) { danielebarchiesi@4: if ($s = $this->getParentS()) { danielebarchiesi@4: $s['o_cdata'] = isset($s['o_cdata']) ? $s['o_cdata'] . $d : $d; danielebarchiesi@4: $this->updateS($s); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: function h6Cdata($d) { danielebarchiesi@4: if ($s = $this->getParentS()) { danielebarchiesi@4: if (isset($s['o_xml_data']) || preg_match("/[\n\r]/", $d) || trim($d)) { danielebarchiesi@4: $d = htmlspecialchars($d, ENT_NOQUOTES); danielebarchiesi@4: $s['o_xml_data'] = isset($s['o_xml_data']) ? $s['o_xml_data'] . $d : $d; danielebarchiesi@4: } danielebarchiesi@4: $this->updateS($s); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* */ danielebarchiesi@4: danielebarchiesi@4: }