annotate sites/all/libraries/ARC2/arc/parsers/ARC2_TurtleParser.php @ 4:ce11bbd8f642

added modules
author danieleb <danielebarchiesi@me.com>
date Thu, 19 Sep 2013 10:38:44 +0100
parents
children
rev   line source
danielebarchiesi@4 1 <?php
danielebarchiesi@4 2 /**
danielebarchiesi@4 3 * ARC2 SPARQL-enhanced Turtle Parser
danielebarchiesi@4 4 *
danielebarchiesi@4 5 * @author Benjamin Nowack
danielebarchiesi@4 6 * @license <http://arc.semsol.org/license>
danielebarchiesi@4 7 * @homepage <http://arc.semsol.org/>
danielebarchiesi@4 8 * @package ARC2
danielebarchiesi@4 9 * @version 2010-11-16
danielebarchiesi@4 10 */
danielebarchiesi@4 11
danielebarchiesi@4 12 ARC2::inc('RDFParser');
danielebarchiesi@4 13
danielebarchiesi@4 14 class ARC2_TurtleParser extends ARC2_RDFParser {
danielebarchiesi@4 15
danielebarchiesi@4 16 function __construct($a, &$caller) {
danielebarchiesi@4 17 parent::__construct($a, $caller);
danielebarchiesi@4 18 }
danielebarchiesi@4 19
danielebarchiesi@4 20 function __init() {/* reader */
danielebarchiesi@4 21 parent::__init();
danielebarchiesi@4 22 $this->state = 0;
danielebarchiesi@4 23 $this->xml = 'http://www.w3.org/XML/1998/namespace';
danielebarchiesi@4 24 $this->rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
danielebarchiesi@4 25 $this->xsd = 'http://www.w3.org/2001/XMLSchema#';
danielebarchiesi@4 26 $this->nsp = array($this->xml => 'xml', $this->rdf => 'rdf', $this->xsd => 'xsd');
danielebarchiesi@4 27 $this->unparsed_code = '';
danielebarchiesi@4 28 $this->max_parsing_loops = $this->v('turtle_max_parsing_loops', 500, $this->a);
danielebarchiesi@4 29 }
danielebarchiesi@4 30
danielebarchiesi@4 31 /* */
danielebarchiesi@4 32
danielebarchiesi@4 33 function x($re, $v, $options = 'si') {
danielebarchiesi@4 34 $v = preg_replace('/^[\xA0\xC2]+/', ' ', $v);
danielebarchiesi@4 35 while (preg_match('/^\s*(\#[^\xd\xa]*)(.*)$/si', $v, $m)) {/* comment removal */
danielebarchiesi@4 36 $v = $m[2];
danielebarchiesi@4 37 }
danielebarchiesi@4 38 return ARC2::x($re, $v, $options);
danielebarchiesi@4 39 //$this->unparsed_code = ($sub_r && count($sub_r)) ? $sub_r[count($sub_r) - 1] : '';
danielebarchiesi@4 40 }
danielebarchiesi@4 41
danielebarchiesi@4 42 function createBnodeID(){
danielebarchiesi@4 43 $this->bnode_id++;
danielebarchiesi@4 44 return '_:' . $this->bnode_prefix . $this->bnode_id;
danielebarchiesi@4 45 }
danielebarchiesi@4 46
danielebarchiesi@4 47 /* */
danielebarchiesi@4 48
danielebarchiesi@4 49 function addT($t) {
danielebarchiesi@4 50 if ($this->skip_dupes) {
danielebarchiesi@4 51 $h = md5(serialize($t));
danielebarchiesi@4 52 if (!isset($this->added_triples[$h])) {
danielebarchiesi@4 53 $this->triples[$this->t_count] = $t;
danielebarchiesi@4 54 $this->t_count++;
danielebarchiesi@4 55 $this->added_triples[$h] = true;
danielebarchiesi@4 56 }
danielebarchiesi@4 57 }
danielebarchiesi@4 58 else {
danielebarchiesi@4 59 $this->triples[$this->t_count] = $t;
danielebarchiesi@4 60 $this->t_count++;
danielebarchiesi@4 61 }
danielebarchiesi@4 62 }
danielebarchiesi@4 63
danielebarchiesi@4 64 /* */
danielebarchiesi@4 65
danielebarchiesi@4 66 function getTriples() {
danielebarchiesi@4 67 return $this->v('triples', array());
danielebarchiesi@4 68 }
danielebarchiesi@4 69
danielebarchiesi@4 70 function countTriples() {
danielebarchiesi@4 71 return $this->t_count;
danielebarchiesi@4 72 }
danielebarchiesi@4 73
danielebarchiesi@4 74 /* */
danielebarchiesi@4 75
danielebarchiesi@4 76 function getUnparsedCode() {
danielebarchiesi@4 77 return $this->v('unparsed_code', '');
danielebarchiesi@4 78 }
danielebarchiesi@4 79
danielebarchiesi@4 80 /* */
danielebarchiesi@4 81
danielebarchiesi@4 82 function setDefaultPrefixes() {
danielebarchiesi@4 83 $this->prefixes = array(
danielebarchiesi@4 84 'rdf:' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
danielebarchiesi@4 85 'rdfs:' => 'http://www.w3.org/2000/01/rdf-schema#',
danielebarchiesi@4 86 'owl:' => 'http://www.w3.org/2002/07/owl#',
danielebarchiesi@4 87 'xsd:' => 'http://www.w3.org/2001/XMLSchema#',
danielebarchiesi@4 88 );
danielebarchiesi@4 89 if ($ns = $this->v('ns', array(), $this->a)) {
danielebarchiesi@4 90 foreach ($ns as $p => $u) $this->prefixes[$p . ':'] = $u;
danielebarchiesi@4 91 }
danielebarchiesi@4 92 }
danielebarchiesi@4 93
danielebarchiesi@4 94
danielebarchiesi@4 95 function parse($path, $data = '', $iso_fallback = false) {
danielebarchiesi@4 96 $this->setDefaultPrefixes();
danielebarchiesi@4 97 /* reader */
danielebarchiesi@4 98 if (!$this->v('reader')) {
danielebarchiesi@4 99 ARC2::inc('Reader');
danielebarchiesi@4 100 $this->reader = new ARC2_Reader($this->a, $this);
danielebarchiesi@4 101 }
danielebarchiesi@4 102 $this->reader->setAcceptHeader('Accept: application/x-turtle; q=0.9, */*; q=0.1');
danielebarchiesi@4 103 $this->reader->activate($path, $data);
danielebarchiesi@4 104 $this->base = $this->v1('base', $this->reader->base, $this->a);
danielebarchiesi@4 105 $this->r = array('vars' => array());
danielebarchiesi@4 106 /* parse */
danielebarchiesi@4 107 $buffer = '';
danielebarchiesi@4 108 $more_triples = array();
danielebarchiesi@4 109 $sub_v = '';
danielebarchiesi@4 110 $sub_v2 = '';
danielebarchiesi@4 111 $loops = 0;
danielebarchiesi@4 112 $prologue_done = 0;
danielebarchiesi@4 113 while ($d = $this->reader->readStream(0, 8192)) {
danielebarchiesi@4 114 $buffer .= $d;
danielebarchiesi@4 115 $sub_v = $buffer;
danielebarchiesi@4 116 do {
danielebarchiesi@4 117 $proceed = 0;
danielebarchiesi@4 118 if (!$prologue_done) {
danielebarchiesi@4 119 $proceed = 1;
danielebarchiesi@4 120 if ((list($sub_r, $sub_v) = $this->xPrologue($sub_v)) && $sub_r) {
danielebarchiesi@4 121 $loops = 0;
danielebarchiesi@4 122 $sub_v .= $this->reader->readStream(0, 128);
danielebarchiesi@4 123 /* we might have missed the final DOT in the previous prologue loop */
danielebarchiesi@4 124 if ($sub_r = $this->x('\.', $sub_v)) $sub_v = $sub_r[1];
danielebarchiesi@4 125 if ($this->x("\@?(base|prefix)", $sub_v)) {/* more prologue to come, use outer loop */
danielebarchiesi@4 126 $proceed = 0;
danielebarchiesi@4 127 }
danielebarchiesi@4 128 }
danielebarchiesi@4 129 else {
danielebarchiesi@4 130 $prologue_done = 1;
danielebarchiesi@4 131 }
danielebarchiesi@4 132 }
danielebarchiesi@4 133 if ($prologue_done && (list($sub_r, $sub_v, $more_triples, $sub_v2) = $this->xTriplesBlock($sub_v)) && is_array($sub_r)) {
danielebarchiesi@4 134 $proceed = 1;
danielebarchiesi@4 135 $loops = 0;
danielebarchiesi@4 136 foreach ($sub_r as $t) {
danielebarchiesi@4 137 $this->addT($t);
danielebarchiesi@4 138 }
danielebarchiesi@4 139 }
danielebarchiesi@4 140 } while ($proceed);
danielebarchiesi@4 141 $loops++;
danielebarchiesi@4 142 $buffer = $sub_v;
danielebarchiesi@4 143 if ($loops > $this->max_parsing_loops) {/* most probably a parser or code bug, might also be a huge object value, though */
danielebarchiesi@4 144 $this->addError('too many loops: ' . $loops . '. Could not parse "' . substr($buffer, 0, 200) . '..."');
danielebarchiesi@4 145 break;
danielebarchiesi@4 146 }
danielebarchiesi@4 147 }
danielebarchiesi@4 148 foreach ($more_triples as $t) {
danielebarchiesi@4 149 $this->addT($t);
danielebarchiesi@4 150 }
danielebarchiesi@4 151 $sub_v = count($more_triples) ? $sub_v2 : $sub_v;
danielebarchiesi@4 152 $buffer = $sub_v;
danielebarchiesi@4 153 $this->unparsed_code = $buffer;
danielebarchiesi@4 154 $this->reader->closeStream();
danielebarchiesi@4 155 unset($this->reader);
danielebarchiesi@4 156 /* remove trailing comments */
danielebarchiesi@4 157 while (preg_match('/^\s*(\#[^\xd\xa]*)(.*)$/si', $this->unparsed_code, $m)) $this->unparsed_code = $m[2];
danielebarchiesi@4 158 if ($this->unparsed_code && !$this->getErrors()) {
danielebarchiesi@4 159 $rest = preg_replace('/[\x0a|\x0d]/i', ' ', substr($this->unparsed_code, 0, 30));
danielebarchiesi@4 160 if (trim($rest)) $this->addError('Could not parse "' . $rest . '"');
danielebarchiesi@4 161 }
danielebarchiesi@4 162 return $this->done();
danielebarchiesi@4 163 }
danielebarchiesi@4 164
danielebarchiesi@4 165 function xPrologue($v) {
danielebarchiesi@4 166 $r = 0;
danielebarchiesi@4 167 if (!$this->t_count) {
danielebarchiesi@4 168 if ((list($sub_r, $v) = $this->xBaseDecl($v)) && $sub_r) {
danielebarchiesi@4 169 $this->base = $sub_r;
danielebarchiesi@4 170 $r = 1;
danielebarchiesi@4 171 }
danielebarchiesi@4 172 while ((list($sub_r, $v) = $this->xPrefixDecl($v)) && $sub_r) {
danielebarchiesi@4 173 $this->prefixes[$sub_r['prefix']] = $sub_r['uri'];
danielebarchiesi@4 174 $r = 1;
danielebarchiesi@4 175 }
danielebarchiesi@4 176 }
danielebarchiesi@4 177 return array($r, $v);
danielebarchiesi@4 178 }
danielebarchiesi@4 179
danielebarchiesi@4 180 /* 3 */
danielebarchiesi@4 181
danielebarchiesi@4 182 function xBaseDecl($v) {
danielebarchiesi@4 183 if ($r = $this->x("\@?base\s+", $v)) {
danielebarchiesi@4 184 if ((list($r, $sub_v) = $this->xIRI_REF($r[1])) && $r) {
danielebarchiesi@4 185 if ($sub_r = $this->x('\.', $sub_v)) {
danielebarchiesi@4 186 $sub_v = $sub_r[1];
danielebarchiesi@4 187 }
danielebarchiesi@4 188 return array($r, $sub_v);
danielebarchiesi@4 189 }
danielebarchiesi@4 190 }
danielebarchiesi@4 191 return array(0, $v);
danielebarchiesi@4 192 }
danielebarchiesi@4 193
danielebarchiesi@4 194 /* 4 */
danielebarchiesi@4 195
danielebarchiesi@4 196 function xPrefixDecl($v) {
danielebarchiesi@4 197 if ($r = $this->x("\@?prefix\s+", $v)) {
danielebarchiesi@4 198 if ((list($r, $sub_v) = $this->xPNAME_NS($r[1])) && $r) {
danielebarchiesi@4 199 $prefix = $r;
danielebarchiesi@4 200 if((list($r, $sub_v) = $this->xIRI_REF($sub_v)) && $r) {
danielebarchiesi@4 201 $uri = $this->calcURI($r, $this->base);
danielebarchiesi@4 202 if ($sub_r = $this->x('\.', $sub_v)) {
danielebarchiesi@4 203 $sub_v = $sub_r[1];
danielebarchiesi@4 204 }
danielebarchiesi@4 205 return array(array('prefix' => $prefix, 'uri_ref' => $r, 'uri' => $uri), $sub_v);
danielebarchiesi@4 206 }
danielebarchiesi@4 207 }
danielebarchiesi@4 208 }
danielebarchiesi@4 209 return array(0, $v);
danielebarchiesi@4 210 }
danielebarchiesi@4 211
danielebarchiesi@4 212 /* 21.., 32.. */
danielebarchiesi@4 213
danielebarchiesi@4 214 function xTriplesBlock($v) {
danielebarchiesi@4 215 $pre_r = array();
danielebarchiesi@4 216 $r = array();
danielebarchiesi@4 217 $state = 1;
danielebarchiesi@4 218 $sub_v = $v;
danielebarchiesi@4 219 $buffer = $sub_v;
danielebarchiesi@4 220 do {
danielebarchiesi@4 221 $proceed = 0;
danielebarchiesi@4 222 if ($state == 1) {/* expecting subject */
danielebarchiesi@4 223 $t = array('type' => 'triple', 's' => '', 'p' => '', 'o' => '', 's_type' => '', 'p_type' => '', 'o_type' => '', 'o_datatype' => '', 'o_lang' => '');
danielebarchiesi@4 224 if ((list($sub_r, $sub_v) = $this->xVarOrTerm($sub_v)) && $sub_r) {
danielebarchiesi@4 225 $t['s'] = $sub_r['value'];
danielebarchiesi@4 226 $t['s_type'] = $sub_r['type'];
danielebarchiesi@4 227 $state = 2;
danielebarchiesi@4 228 $proceed = 1;
danielebarchiesi@4 229 if ($sub_r = $this->x('(\}|\.)', $sub_v)) {
danielebarchiesi@4 230 if ($t['s_type'] == 'placeholder') {
danielebarchiesi@4 231 $state = 4;
danielebarchiesi@4 232 }
danielebarchiesi@4 233 else {
danielebarchiesi@4 234 $this->addError('"' . $sub_r[1]. '" after subject found.');
danielebarchiesi@4 235 }
danielebarchiesi@4 236 }
danielebarchiesi@4 237 }
danielebarchiesi@4 238 elseif ((list($sub_r, $sub_v) = $this->xCollection($sub_v)) && $sub_r) {
danielebarchiesi@4 239 $t['s'] = $sub_r['id'];
danielebarchiesi@4 240 $t['s_type'] = $sub_r['type'];
danielebarchiesi@4 241 $pre_r = array_merge($pre_r, $sub_r['triples']);
danielebarchiesi@4 242 $state = 2;
danielebarchiesi@4 243 $proceed = 1;
danielebarchiesi@4 244 if ($sub_r = $this->x('\.', $sub_v)) {
danielebarchiesi@4 245 $this->addError('DOT after subject found.');
danielebarchiesi@4 246 }
danielebarchiesi@4 247 }
danielebarchiesi@4 248 elseif ((list($sub_r, $sub_v) = $this->xBlankNodePropertyList($sub_v)) && $sub_r) {
danielebarchiesi@4 249 $t['s'] = $sub_r['id'];
danielebarchiesi@4 250 $t['s_type'] = $sub_r['type'];
danielebarchiesi@4 251 $pre_r = array_merge($pre_r, $sub_r['triples']);
danielebarchiesi@4 252 $state = 2;
danielebarchiesi@4 253 $proceed = 1;
danielebarchiesi@4 254 }
danielebarchiesi@4 255 elseif ($sub_r = $this->x('\.', $sub_v)) {
danielebarchiesi@4 256 $this->addError('Subject expected, DOT found.' . $sub_v);
danielebarchiesi@4 257 }
danielebarchiesi@4 258 }
danielebarchiesi@4 259 if ($state == 2) {/* expecting predicate */
danielebarchiesi@4 260 if ($sub_r = $this->x('a\s+', $sub_v)) {
danielebarchiesi@4 261 $sub_v = $sub_r[1];
danielebarchiesi@4 262 $t['p'] = $this->rdf . 'type';
danielebarchiesi@4 263 $t['p_type'] = 'uri';
danielebarchiesi@4 264 $state = 3;
danielebarchiesi@4 265 $proceed = 1;
danielebarchiesi@4 266 }
danielebarchiesi@4 267 elseif ((list($sub_r, $sub_v) = $this->xVarOrTerm($sub_v)) && $sub_r) {
danielebarchiesi@4 268 if ($sub_r['type'] == 'bnode') {
danielebarchiesi@4 269 $this->addError('Blank node used as triple predicate');
danielebarchiesi@4 270 }
danielebarchiesi@4 271 $t['p'] = $sub_r['value'];
danielebarchiesi@4 272 $t['p_type'] = $sub_r['type'];
danielebarchiesi@4 273 $state = 3;
danielebarchiesi@4 274 $proceed = 1;
danielebarchiesi@4 275 }
danielebarchiesi@4 276 elseif ($sub_r = $this->x('\.', $sub_v)) {
danielebarchiesi@4 277 $state = 4;
danielebarchiesi@4 278 }
danielebarchiesi@4 279 elseif ($sub_r = $this->x('\}', $sub_v)) {
danielebarchiesi@4 280 $buffer = $sub_v;
danielebarchiesi@4 281 $r = array_merge($r, $pre_r);
danielebarchiesi@4 282 $pre_r = array();
danielebarchiesi@4 283 $proceed = 0;
danielebarchiesi@4 284 }
danielebarchiesi@4 285 }
danielebarchiesi@4 286 if ($state == 3) {/* expecting object */
danielebarchiesi@4 287 if ((list($sub_r, $sub_v) = $this->xVarOrTerm($sub_v)) && $sub_r) {
danielebarchiesi@4 288 $t['o'] = $sub_r['value'];
danielebarchiesi@4 289 $t['o_type'] = $sub_r['type'];
danielebarchiesi@4 290 $t['o_lang'] = $this->v('lang', '', $sub_r);
danielebarchiesi@4 291 $t['o_datatype'] = $this->v('datatype', '', $sub_r);
danielebarchiesi@4 292 $pre_r[] = $t;
danielebarchiesi@4 293 $state = 4;
danielebarchiesi@4 294 $proceed = 1;
danielebarchiesi@4 295 }
danielebarchiesi@4 296 elseif ((list($sub_r, $sub_v) = $this->xCollection($sub_v)) && $sub_r) {
danielebarchiesi@4 297 $t['o'] = $sub_r['id'];
danielebarchiesi@4 298 $t['o_type'] = $sub_r['type'];
danielebarchiesi@4 299 $t['o_datatype'] = '';
danielebarchiesi@4 300 $pre_r = array_merge($pre_r, array($t), $sub_r['triples']);
danielebarchiesi@4 301 $state = 4;
danielebarchiesi@4 302 $proceed = 1;
danielebarchiesi@4 303 }
danielebarchiesi@4 304 elseif ((list($sub_r, $sub_v) = $this->xBlankNodePropertyList($sub_v)) && $sub_r) {
danielebarchiesi@4 305 $t['o'] = $sub_r['id'];
danielebarchiesi@4 306 $t['o_type'] = $sub_r['type'];
danielebarchiesi@4 307 $t['o_datatype'] = '';
danielebarchiesi@4 308 $pre_r = array_merge($pre_r, array($t), $sub_r['triples']);
danielebarchiesi@4 309 $state = 4;
danielebarchiesi@4 310 $proceed = 1;
danielebarchiesi@4 311 }
danielebarchiesi@4 312 }
danielebarchiesi@4 313 if ($state == 4) {/* expecting . or ; or , or } */
danielebarchiesi@4 314 if ($sub_r = $this->x('\.', $sub_v)) {
danielebarchiesi@4 315 $sub_v = $sub_r[1];
danielebarchiesi@4 316 $buffer = $sub_v;
danielebarchiesi@4 317 $r = array_merge($r, $pre_r);
danielebarchiesi@4 318 $pre_r = array();
danielebarchiesi@4 319 $state = 1;
danielebarchiesi@4 320 $proceed = 1;
danielebarchiesi@4 321 }
danielebarchiesi@4 322 elseif ($sub_r = $this->x('\;', $sub_v)) {
danielebarchiesi@4 323 $sub_v = $sub_r[1];
danielebarchiesi@4 324 $state = 2;
danielebarchiesi@4 325 $proceed = 1;
danielebarchiesi@4 326 }
danielebarchiesi@4 327 elseif ($sub_r = $this->x('\,', $sub_v)) {
danielebarchiesi@4 328 $sub_v = $sub_r[1];
danielebarchiesi@4 329 $state = 3;
danielebarchiesi@4 330 $proceed = 1;
danielebarchiesi@4 331 if ($sub_r = $this->x('\}', $sub_v)) {
danielebarchiesi@4 332 $this->addError('Object expected, } found.');
danielebarchiesi@4 333 }
danielebarchiesi@4 334 }
danielebarchiesi@4 335 if ($sub_r = $this->x('(\}|\{|OPTIONAL|FILTER|GRAPH)', $sub_v)) {
danielebarchiesi@4 336 $buffer = $sub_v;
danielebarchiesi@4 337 $r = array_merge($r, $pre_r);
danielebarchiesi@4 338 $pre_r = array();
danielebarchiesi@4 339 $proceed = 0;
danielebarchiesi@4 340 }
danielebarchiesi@4 341 }
danielebarchiesi@4 342 } while ($proceed);
danielebarchiesi@4 343 return count($r) ? array($r, $buffer, $pre_r, $sub_v) : array(0, $buffer, $pre_r, $sub_v);
danielebarchiesi@4 344 }
danielebarchiesi@4 345
danielebarchiesi@4 346 /* 39.. */
danielebarchiesi@4 347
danielebarchiesi@4 348 function xBlankNodePropertyList($v) {
danielebarchiesi@4 349 if ($sub_r = $this->x('\[', $v)) {
danielebarchiesi@4 350 $sub_v = $sub_r[1];
danielebarchiesi@4 351 $s = $this->createBnodeID();
danielebarchiesi@4 352 $r = array('id' => $s, 'type' => 'bnode', 'triples' => array());
danielebarchiesi@4 353 $t = array('type' => 'triple', 's' => $s, 'p' => '', 'o' => '', 's_type' => 'bnode', 'p_type' => '', 'o_type' => '', 'o_datatype' => '', 'o_lang' => '');
danielebarchiesi@4 354 $state = 2;
danielebarchiesi@4 355 $closed = 0;
danielebarchiesi@4 356 do {
danielebarchiesi@4 357 $proceed = 0;
danielebarchiesi@4 358 if ($state == 2) {/* expecting predicate */
danielebarchiesi@4 359 if ($sub_r = $this->x('a\s+', $sub_v)) {
danielebarchiesi@4 360 $sub_v = $sub_r[1];
danielebarchiesi@4 361 $t['p'] = $this->rdf . 'type';
danielebarchiesi@4 362 $t['p_type'] = 'uri';
danielebarchiesi@4 363 $state = 3;
danielebarchiesi@4 364 $proceed = 1;
danielebarchiesi@4 365 }
danielebarchiesi@4 366 elseif ((list($sub_r, $sub_v) = $this->xVarOrTerm($sub_v)) && $sub_r) {
danielebarchiesi@4 367 $t['p'] = $sub_r['value'];
danielebarchiesi@4 368 $t['p_type'] = $sub_r['type'];
danielebarchiesi@4 369 $state = 3;
danielebarchiesi@4 370 $proceed = 1;
danielebarchiesi@4 371 }
danielebarchiesi@4 372 }
danielebarchiesi@4 373 if ($state == 3) {/* expecting object */
danielebarchiesi@4 374 if ((list($sub_r, $sub_v) = $this->xVarOrTerm($sub_v)) && $sub_r) {
danielebarchiesi@4 375 $t['o'] = $sub_r['value'];
danielebarchiesi@4 376 $t['o_type'] = $sub_r['type'];
danielebarchiesi@4 377 $t['o_lang'] = $this->v('lang', '', $sub_r);
danielebarchiesi@4 378 $t['o_datatype'] = $this->v('datatype', '', $sub_r);
danielebarchiesi@4 379 $r['triples'][] = $t;
danielebarchiesi@4 380 $state = 4;
danielebarchiesi@4 381 $proceed = 1;
danielebarchiesi@4 382 }
danielebarchiesi@4 383 elseif ((list($sub_r, $sub_v) = $this->xCollection($sub_v)) && $sub_r) {
danielebarchiesi@4 384 $t['o'] = $sub_r['id'];
danielebarchiesi@4 385 $t['o_type'] = $sub_r['type'];
danielebarchiesi@4 386 $t['o_datatype'] = '';
danielebarchiesi@4 387 $r['triples'] = array_merge($r['triples'], array($t), $sub_r['triples']);
danielebarchiesi@4 388 $state = 4;
danielebarchiesi@4 389 $proceed = 1;
danielebarchiesi@4 390 }
danielebarchiesi@4 391 elseif((list($sub_r, $sub_v) = $this->xBlankNodePropertyList($sub_v)) && $sub_r) {
danielebarchiesi@4 392 $t['o'] = $sub_r['id'];
danielebarchiesi@4 393 $t['o_type'] = $sub_r['type'];
danielebarchiesi@4 394 $t['o_datatype'] = '';
danielebarchiesi@4 395 $r['triples'] = array_merge($r['triples'], array($t), $sub_r['triples']);
danielebarchiesi@4 396 $state = 4;
danielebarchiesi@4 397 $proceed = 1;
danielebarchiesi@4 398 }
danielebarchiesi@4 399 }
danielebarchiesi@4 400 if ($state == 4) {/* expecting . or ; or , or ] */
danielebarchiesi@4 401 if ($sub_r = $this->x('\.', $sub_v)) {
danielebarchiesi@4 402 $sub_v = $sub_r[1];
danielebarchiesi@4 403 $state = 1;
danielebarchiesi@4 404 $proceed = 1;
danielebarchiesi@4 405 }
danielebarchiesi@4 406 if ($sub_r = $this->x('\;', $sub_v)) {
danielebarchiesi@4 407 $sub_v = $sub_r[1];
danielebarchiesi@4 408 $state = 2;
danielebarchiesi@4 409 $proceed = 1;
danielebarchiesi@4 410 }
danielebarchiesi@4 411 if ($sub_r = $this->x('\,', $sub_v)) {
danielebarchiesi@4 412 $sub_v = $sub_r[1];
danielebarchiesi@4 413 $state = 3;
danielebarchiesi@4 414 $proceed = 1;
danielebarchiesi@4 415 }
danielebarchiesi@4 416 if ($sub_r = $this->x('\]', $sub_v)) {
danielebarchiesi@4 417 $sub_v = $sub_r[1];
danielebarchiesi@4 418 $proceed = 0;
danielebarchiesi@4 419 $closed = 1;
danielebarchiesi@4 420 }
danielebarchiesi@4 421 }
danielebarchiesi@4 422 } while ($proceed);
danielebarchiesi@4 423 if ($closed) {
danielebarchiesi@4 424 return array($r, $sub_v);
danielebarchiesi@4 425 }
danielebarchiesi@4 426 return array(0, $v);
danielebarchiesi@4 427 }
danielebarchiesi@4 428 return array(0, $v);
danielebarchiesi@4 429 }
danielebarchiesi@4 430
danielebarchiesi@4 431 /* 40.. */
danielebarchiesi@4 432
danielebarchiesi@4 433 function xCollection($v) {
danielebarchiesi@4 434 if ($sub_r = $this->x('\(', $v)) {
danielebarchiesi@4 435 $sub_v = $sub_r[1];
danielebarchiesi@4 436 $s = $this->createBnodeID();
danielebarchiesi@4 437 $r = array('id' => $s, 'type' => 'bnode', 'triples' => array());
danielebarchiesi@4 438 $closed = 0;
danielebarchiesi@4 439 do {
danielebarchiesi@4 440 $proceed = 0;
danielebarchiesi@4 441 if ((list($sub_r, $sub_v) = $this->xVarOrTerm($sub_v)) && $sub_r) {
danielebarchiesi@4 442 $r['triples'][] = array('type' => 'triple', 's' => $s, 'p' => $this->rdf . 'first', 'o' => $sub_r['value'], 's_type' => 'bnode', 'p_type' => 'uri', 'o_type' => $sub_r['type'], 'o_lang' => $this->v('lang', '', $sub_r), 'o_datatype' => $this->v('datatype', '', $sub_r));
danielebarchiesi@4 443 $proceed = 1;
danielebarchiesi@4 444 }
danielebarchiesi@4 445 elseif ((list($sub_r, $sub_v) = $this->xCollection($sub_v)) && $sub_r) {
danielebarchiesi@4 446 $r['triples'][] = array('type' => 'triple', 's' => $s, 'p' => $this->rdf . 'first', 'o' => $sub_r['id'], 's_type' => 'bnode', 'p_type' => 'uri', 'o_type' => $sub_r['type'], 'o_lang' => '', 'o_datatype' => '');
danielebarchiesi@4 447 $r['triples'] = array_merge($r['triples'], $sub_r['triples']);
danielebarchiesi@4 448 $proceed = 1;
danielebarchiesi@4 449 }
danielebarchiesi@4 450 elseif((list($sub_r, $sub_v) = $this->xBlankNodePropertyList($sub_v)) && $sub_r) {
danielebarchiesi@4 451 $r['triples'][] = array('type' => 'triple', 's' => $s, 'p' => $this->rdf . 'first', 'o' => $sub_r['id'], 's_type' => 'bnode', 'p_type' => 'uri', 'o_type' => $sub_r['type'], 'o_lang' => '', 'o_datatype' => '');
danielebarchiesi@4 452 $r['triples'] = array_merge($r['triples'], $sub_r['triples']);
danielebarchiesi@4 453 $proceed = 1;
danielebarchiesi@4 454 }
danielebarchiesi@4 455 if ($proceed) {
danielebarchiesi@4 456 if ($sub_r = $this->x('\)', $sub_v)) {
danielebarchiesi@4 457 $sub_v = $sub_r[1];
danielebarchiesi@4 458 $r['triples'][] = array('type' => 'triple', 's' => $s, 'p' => $this->rdf . 'rest', 'o' => $this->rdf . 'nil', 's_type' => 'bnode', 'p_type' => 'uri', 'o_type' => 'uri', 'o_lang' => '', 'o_datatype' => '');
danielebarchiesi@4 459 $closed = 1;
danielebarchiesi@4 460 $proceed = 0;
danielebarchiesi@4 461 }
danielebarchiesi@4 462 else {
danielebarchiesi@4 463 $next_s = $this->createBnodeID();
danielebarchiesi@4 464 $r['triples'][] = array('type' => 'triple', 's' => $s, 'p' => $this->rdf . 'rest', 'o' => $next_s, 's_type' => 'bnode', 'p_type' => 'uri', 'o_type' => 'bnode', 'o_lang' => '', 'o_datatype' => '');
danielebarchiesi@4 465 $s = $next_s;
danielebarchiesi@4 466 }
danielebarchiesi@4 467 }
danielebarchiesi@4 468 } while ($proceed);
danielebarchiesi@4 469 if ($closed) {
danielebarchiesi@4 470 return array($r, $sub_v);
danielebarchiesi@4 471 }
danielebarchiesi@4 472 }
danielebarchiesi@4 473 return array (0, $v);
danielebarchiesi@4 474 }
danielebarchiesi@4 475
danielebarchiesi@4 476 /* 42 */
danielebarchiesi@4 477
danielebarchiesi@4 478 function xVarOrTerm($v) {
danielebarchiesi@4 479 if ((list($sub_r, $sub_v) = $this->xVar($v)) && $sub_r) {
danielebarchiesi@4 480 return array($sub_r, $sub_v);
danielebarchiesi@4 481 }
danielebarchiesi@4 482 elseif ((list($sub_r, $sub_v) = $this->xGraphTerm($v)) && $sub_r) {
danielebarchiesi@4 483 return array($sub_r, $sub_v);
danielebarchiesi@4 484 }
danielebarchiesi@4 485 return array(0, $v);
danielebarchiesi@4 486 }
danielebarchiesi@4 487
danielebarchiesi@4 488 /* 44, 74.., 75.. */
danielebarchiesi@4 489
danielebarchiesi@4 490 function xVar($v) {
danielebarchiesi@4 491 if ($r = $this->x('(\?|\$)([^\s]+)', $v)) {
danielebarchiesi@4 492 if ((list($sub_r, $sub_v) = $this->xVARNAME($r[2])) && $sub_r) {
danielebarchiesi@4 493 if (!in_array($sub_r, $this->r['vars'])) {
danielebarchiesi@4 494 $this->r['vars'][] = $sub_r;
danielebarchiesi@4 495 }
danielebarchiesi@4 496 return array(array('value' => $sub_r, 'type' => 'var'), $sub_v . $r[3]);
danielebarchiesi@4 497 }
danielebarchiesi@4 498 }
danielebarchiesi@4 499 return array(0, $v);
danielebarchiesi@4 500 }
danielebarchiesi@4 501
danielebarchiesi@4 502 /* 45 */
danielebarchiesi@4 503
danielebarchiesi@4 504 function xGraphTerm($v) {
danielebarchiesi@4 505 foreach (array(
danielebarchiesi@4 506 'IRIref' => 'uri',
danielebarchiesi@4 507 'RDFLiteral' => 'literal',
danielebarchiesi@4 508 'NumericLiteral' => 'literal',
danielebarchiesi@4 509 'BooleanLiteral' => 'literal',
danielebarchiesi@4 510 'BlankNode' => 'bnode',
danielebarchiesi@4 511 'NIL' => 'uri',
danielebarchiesi@4 512 'Placeholder' => 'placeholder'
danielebarchiesi@4 513 ) as $term => $type) {
danielebarchiesi@4 514 $m = 'x' . $term;
danielebarchiesi@4 515 if ((list($sub_r, $sub_v) = $this->$m($v)) && $sub_r) {
danielebarchiesi@4 516 if (!is_array($sub_r)) {
danielebarchiesi@4 517 $sub_r = array('value' => $sub_r);
danielebarchiesi@4 518 }
danielebarchiesi@4 519 $sub_r['type'] = $this->v1('type', $type, $sub_r);
danielebarchiesi@4 520 return array($sub_r, $sub_v);
danielebarchiesi@4 521 }
danielebarchiesi@4 522 }
danielebarchiesi@4 523 return array(0, $v);
danielebarchiesi@4 524 }
danielebarchiesi@4 525
danielebarchiesi@4 526 /* 60 */
danielebarchiesi@4 527
danielebarchiesi@4 528 function xRDFLiteral($v) {
danielebarchiesi@4 529 if ((list($sub_r, $sub_v) = $this->xString($v)) && $sub_r) {
danielebarchiesi@4 530 $sub_r['value'] = $this->unescapeNtripleUTF($sub_r['value']);
danielebarchiesi@4 531 $r = $sub_r;
danielebarchiesi@4 532 if ((list($sub_r, $sub_v) = $this->xLANGTAG($sub_v)) && $sub_r) {
danielebarchiesi@4 533 $r['lang'] = $sub_r;
danielebarchiesi@4 534 }
danielebarchiesi@4 535 elseif (!$this->x('\s', $sub_v) && ($sub_r = $this->x('\^\^', $sub_v)) && (list($sub_r, $sub_v) = $this->xIRIref($sub_r[1])) && $sub_r[1]) {
danielebarchiesi@4 536 $r['datatype'] = $sub_r;
danielebarchiesi@4 537 }
danielebarchiesi@4 538 return array($r, $sub_v);
danielebarchiesi@4 539 }
danielebarchiesi@4 540 return array(0, $v);
danielebarchiesi@4 541 }
danielebarchiesi@4 542
danielebarchiesi@4 543 /* 61.., 62.., 63.., 64.. */
danielebarchiesi@4 544
danielebarchiesi@4 545 function xNumericLiteral($v) {
danielebarchiesi@4 546 $sub_r = $this->x('(\-|\+)?', $v);
danielebarchiesi@4 547 $prefix = $sub_r[1];
danielebarchiesi@4 548 $sub_v = $sub_r[2];
danielebarchiesi@4 549 foreach (array('DOUBLE' => 'double', 'DECIMAL' => 'decimal', 'INTEGER' => 'integer') as $type => $xsd) {
danielebarchiesi@4 550 $m = 'x' . $type;
danielebarchiesi@4 551 if ((list($sub_r, $sub_v) = $this->$m($sub_v)) && ($sub_r !== false)) {
danielebarchiesi@4 552 $r = array('value' => $prefix . $sub_r, 'type' => 'literal', 'datatype' => $this->xsd . $xsd);
danielebarchiesi@4 553 return array($r, $sub_v);
danielebarchiesi@4 554 }
danielebarchiesi@4 555 }
danielebarchiesi@4 556 return array(0, $v);
danielebarchiesi@4 557 }
danielebarchiesi@4 558
danielebarchiesi@4 559 /* 65.. */
danielebarchiesi@4 560
danielebarchiesi@4 561 function xBooleanLiteral($v) {
danielebarchiesi@4 562 if ($r = $this->x('(true|false)', $v)) {
danielebarchiesi@4 563 return array($r[1], $r[2]);
danielebarchiesi@4 564 }
danielebarchiesi@4 565 return array(0, $v);
danielebarchiesi@4 566 }
danielebarchiesi@4 567
danielebarchiesi@4 568 /* 66.., 87.., 88.., 89.., 90.., 91.. */
danielebarchiesi@4 569
danielebarchiesi@4 570 function xString($v) {/* largely simplified, may need some tweaks in following revisions */
danielebarchiesi@4 571 $sub_v = $v;
danielebarchiesi@4 572 if (!preg_match('/^\s*([\']{3}|\'|[\"]{3}|\")(.*)$/s', $sub_v, $m)) return array(0, $v);
danielebarchiesi@4 573 $delim = $m[1];
danielebarchiesi@4 574 $rest = $m[2];
danielebarchiesi@4 575 $sub_types = array("'''" => 'literal_long1', '"""' => 'literal_long2', "'" => 'literal1', '"' => 'literal2');
danielebarchiesi@4 576 $sub_type = $sub_types[$delim];
danielebarchiesi@4 577 $pos = 0;
danielebarchiesi@4 578 $r = false;
danielebarchiesi@4 579 do {
danielebarchiesi@4 580 $proceed = 0;
danielebarchiesi@4 581 $delim_pos = strpos($rest, $delim, $pos);
danielebarchiesi@4 582 if ($delim_pos === false) break;
danielebarchiesi@4 583 $new_rest = substr($rest, $delim_pos + strlen($delim));
danielebarchiesi@4 584 $r = substr($rest, 0, $delim_pos);
danielebarchiesi@4 585 if (!preg_match('/([\x5c]+)$/s', $r, $m) || !(strlen($m[1]) % 2)) {
danielebarchiesi@4 586 $rest = $new_rest;
danielebarchiesi@4 587 }
danielebarchiesi@4 588 else {
danielebarchiesi@4 589 $r = false;
danielebarchiesi@4 590 $pos = $delim_pos + 1;
danielebarchiesi@4 591 $proceed = 1;
danielebarchiesi@4 592 }
danielebarchiesi@4 593 } while ($proceed);
danielebarchiesi@4 594 if ($r !== false) {
danielebarchiesi@4 595 return array(array('value' => $this->toUTF8($r) , 'type' => 'literal', 'sub_type' => $sub_type), $rest);
danielebarchiesi@4 596 }
danielebarchiesi@4 597 return array(0, $v);
danielebarchiesi@4 598 }
danielebarchiesi@4 599
danielebarchiesi@4 600 /* 67 */
danielebarchiesi@4 601
danielebarchiesi@4 602 function xIRIref($v) {
danielebarchiesi@4 603 if ((list($r, $v) = $this->xIRI_REF($v)) && $r) {
danielebarchiesi@4 604 return array($this->calcURI($r, $this->base), $v);
danielebarchiesi@4 605 }
danielebarchiesi@4 606 elseif ((list($r, $v) = $this->xPrefixedName($v)) && $r) {
danielebarchiesi@4 607 return array($r, $v);
danielebarchiesi@4 608 }
danielebarchiesi@4 609 return array(0, $v);
danielebarchiesi@4 610 }
danielebarchiesi@4 611
danielebarchiesi@4 612 /* 68 */
danielebarchiesi@4 613
danielebarchiesi@4 614 function xPrefixedName($v) {
danielebarchiesi@4 615 if ((list($r, $v) = $this->xPNAME_LN($v)) && $r) {
danielebarchiesi@4 616 return array($r, $v);
danielebarchiesi@4 617 }
danielebarchiesi@4 618 elseif ((list($r, $sub_v) = $this->xPNAME_NS($v)) && $r) {
danielebarchiesi@4 619 return isset($this->prefixes[$r]) ? array($this->prefixes[$r], $sub_v) : array(0, $v);
danielebarchiesi@4 620 }
danielebarchiesi@4 621 return array(0, $v);
danielebarchiesi@4 622 }
danielebarchiesi@4 623
danielebarchiesi@4 624 /* 69.., 73.., 93, 94.. */
danielebarchiesi@4 625
danielebarchiesi@4 626 function xBlankNode($v) {
danielebarchiesi@4 627 if (($r = $this->x('\_\:', $v)) && (list($r, $sub_v) = $this->xPN_LOCAL($r[1])) && $r) {
danielebarchiesi@4 628 return array(array('type' => 'bnode', 'value' => '_:' . $r), $sub_v);
danielebarchiesi@4 629 }
danielebarchiesi@4 630 if ($r = $this->x('\[[\x20\x9\xd\xa]*\]', $v)) {
danielebarchiesi@4 631 return array(array('type' => 'bnode', 'value' => $this->createBnodeID()), $r[1]);
danielebarchiesi@4 632 }
danielebarchiesi@4 633 return array(0, $v);
danielebarchiesi@4 634 }
danielebarchiesi@4 635
danielebarchiesi@4 636 /* 70.. @@sync with SPARQLParser */
danielebarchiesi@4 637
danielebarchiesi@4 638 function xIRI_REF($v) {
danielebarchiesi@4 639 //if ($r = $this->x('\<([^\<\>\"\{\}\|\^\'[:space:]]*)\>', $v)) {
danielebarchiesi@4 640 if (($r = $this->x('\<(\$\{[^\>]*\})\>', $v)) && ($sub_r = $this->xPlaceholder($r[1]))) {
danielebarchiesi@4 641 return array($r[1], $r[2]);
danielebarchiesi@4 642 }
danielebarchiesi@4 643 elseif ($r = $this->x('\<\>', $v)) {
danielebarchiesi@4 644 return array(true, $r[1]);
danielebarchiesi@4 645 }
danielebarchiesi@4 646 elseif ($r = $this->x('\<([^\s][^\<\>]*)\>', $v)) {
danielebarchiesi@4 647 return array($r[1] ? $r[1] : true, $r[2]);
danielebarchiesi@4 648 }
danielebarchiesi@4 649 return array(0, $v);
danielebarchiesi@4 650 }
danielebarchiesi@4 651
danielebarchiesi@4 652 /* 71 */
danielebarchiesi@4 653
danielebarchiesi@4 654 function xPNAME_NS($v) {
danielebarchiesi@4 655 list($r, $sub_v) = $this->xPN_PREFIX($v);
danielebarchiesi@4 656 $prefix = $r ? $r : '';
danielebarchiesi@4 657 return ($r = $this->x("\:", $sub_v)) ? array($prefix . ':', $r[1]) : array(0, $v);
danielebarchiesi@4 658 }
danielebarchiesi@4 659
danielebarchiesi@4 660 /* 72 */
danielebarchiesi@4 661
danielebarchiesi@4 662 function xPNAME_LN($v) {
danielebarchiesi@4 663 if ((list($r, $sub_v) = $this->xPNAME_NS($v)) && $r) {
danielebarchiesi@4 664 if (!$this->x('\s', $sub_v) && (list($sub_r, $sub_v) = $this->xPN_LOCAL($sub_v)) && $sub_r) {
danielebarchiesi@4 665 if (!isset($this->prefixes[$r])) {
danielebarchiesi@4 666 return array(0, $v);
danielebarchiesi@4 667 }
danielebarchiesi@4 668 return array($this->prefixes[$r] . $sub_r, $sub_v);
danielebarchiesi@4 669 }
danielebarchiesi@4 670 }
danielebarchiesi@4 671 return array(0, $v);
danielebarchiesi@4 672 }
danielebarchiesi@4 673
danielebarchiesi@4 674 /* 76 */
danielebarchiesi@4 675
danielebarchiesi@4 676 function xLANGTAG($v) {
danielebarchiesi@4 677 if (!$this->x('\s', $v) && ($r = $this->x('\@([a-z]+(\-[a-z0-9]+)*)', $v))) {
danielebarchiesi@4 678 return array($r[1], $r[3]);
danielebarchiesi@4 679 }
danielebarchiesi@4 680 return array(0, $v);
danielebarchiesi@4 681 }
danielebarchiesi@4 682
danielebarchiesi@4 683 /* 77.. */
danielebarchiesi@4 684
danielebarchiesi@4 685 function xINTEGER($v) {
danielebarchiesi@4 686 if ($r = $this->x('([0-9]+)', $v)) {
danielebarchiesi@4 687 return array($r[1], $r[2]);
danielebarchiesi@4 688 }
danielebarchiesi@4 689 return array(false, $v);
danielebarchiesi@4 690 }
danielebarchiesi@4 691
danielebarchiesi@4 692 /* 78.. */
danielebarchiesi@4 693
danielebarchiesi@4 694 function xDECIMAL($v) {
danielebarchiesi@4 695 if ($r = $this->x('([0-9]+\.[0-9]*)', $v)) {
danielebarchiesi@4 696 return array($r[1], $r[2]);
danielebarchiesi@4 697 }
danielebarchiesi@4 698 if ($r = $this->x('(\.[0-9]+)', $v)) {
danielebarchiesi@4 699 return array($r[1], $r[2]);
danielebarchiesi@4 700 }
danielebarchiesi@4 701 return array(false, $v);
danielebarchiesi@4 702 }
danielebarchiesi@4 703
danielebarchiesi@4 704 /* 79.., 86.. */
danielebarchiesi@4 705
danielebarchiesi@4 706 function xDOUBLE($v) {
danielebarchiesi@4 707 if ($r = $this->x('([0-9]+\.[0-9]*E[\+\-]?[0-9]+)', $v)) {
danielebarchiesi@4 708 return array($r[1], $r[2]);
danielebarchiesi@4 709 }
danielebarchiesi@4 710 if ($r = $this->x('(\.[0-9]+E[\+\-]?[0-9]+)', $v)) {
danielebarchiesi@4 711 return array($r[1], $r[2]);
danielebarchiesi@4 712 }
danielebarchiesi@4 713 if ($r = $this->x('([0-9]+E[\+\-]?[0-9]+)', $v)) {
danielebarchiesi@4 714 return array($r[1], $r[2]);
danielebarchiesi@4 715 }
danielebarchiesi@4 716 return array(false, $v);
danielebarchiesi@4 717 }
danielebarchiesi@4 718
danielebarchiesi@4 719 /* 92 */
danielebarchiesi@4 720
danielebarchiesi@4 721 function xNIL($v) {
danielebarchiesi@4 722 if ($r = $this->x('\([\x20\x9\xd\xa]*\)', $v)) {
danielebarchiesi@4 723 return array(array('type' => 'uri', 'value' => $this->rdf . 'nil'), $r[1]);
danielebarchiesi@4 724 }
danielebarchiesi@4 725 return array(0, $v);
danielebarchiesi@4 726 }
danielebarchiesi@4 727
danielebarchiesi@4 728 /* 95.. */
danielebarchiesi@4 729
danielebarchiesi@4 730 function xPN_CHARS_BASE($v) {
danielebarchiesi@4 731 if ($r = $this->x("([a-z]+|\\\u[0-9a-f]{1,4})", $v)) {
danielebarchiesi@4 732 return array($r[1], $r[2]);
danielebarchiesi@4 733 }
danielebarchiesi@4 734 return array(0, $v);
danielebarchiesi@4 735 }
danielebarchiesi@4 736
danielebarchiesi@4 737 /* 96 */
danielebarchiesi@4 738
danielebarchiesi@4 739 function xPN_CHARS_U($v) {
danielebarchiesi@4 740 if ((list($r, $sub_v) = $this->xPN_CHARS_BASE($v)) && $r) {
danielebarchiesi@4 741 return array($r, $sub_v);
danielebarchiesi@4 742 }
danielebarchiesi@4 743 elseif ($r = $this->x("(_)", $v)) {
danielebarchiesi@4 744 return array($r[1], $r[2]);
danielebarchiesi@4 745 }
danielebarchiesi@4 746 return array(0, $v);
danielebarchiesi@4 747 }
danielebarchiesi@4 748
danielebarchiesi@4 749 /* 97.. */
danielebarchiesi@4 750
danielebarchiesi@4 751 function xVARNAME($v) {
danielebarchiesi@4 752 $r = '';
danielebarchiesi@4 753 do {
danielebarchiesi@4 754 $proceed = 0;
danielebarchiesi@4 755 if ($sub_r = $this->x('([0-9]+)', $v)) {
danielebarchiesi@4 756 $r .= $sub_r[1];
danielebarchiesi@4 757 $v = $sub_r[2];
danielebarchiesi@4 758 $proceed = 1;
danielebarchiesi@4 759 }
danielebarchiesi@4 760 elseif ((list($sub_r, $sub_v) = $this->xPN_CHARS_U($v)) && $sub_r) {
danielebarchiesi@4 761 $r .= $sub_r;
danielebarchiesi@4 762 $v = $sub_v;
danielebarchiesi@4 763 $proceed = 1;
danielebarchiesi@4 764 }
danielebarchiesi@4 765 elseif ($r && ($sub_r = $this->x('([\xb7\x300-\x36f]+)', $v))) {
danielebarchiesi@4 766 $r .= $sub_r[1];
danielebarchiesi@4 767 $v = $sub_r[2];
danielebarchiesi@4 768 $proceed = 1;
danielebarchiesi@4 769 }
danielebarchiesi@4 770 } while ($proceed);
danielebarchiesi@4 771 return array($r, $v);
danielebarchiesi@4 772 }
danielebarchiesi@4 773
danielebarchiesi@4 774 /* 98.. */
danielebarchiesi@4 775
danielebarchiesi@4 776 function xPN_CHARS($v) {
danielebarchiesi@4 777 if ((list($r, $sub_v) = $this->xPN_CHARS_U($v)) && $r) {
danielebarchiesi@4 778 return array($r, $sub_v);
danielebarchiesi@4 779 }
danielebarchiesi@4 780 elseif ($r = $this->x('([\-0-9\xb7\x300-\x36f])', $v)) {
danielebarchiesi@4 781 return array($r[1], $r[2]);
danielebarchiesi@4 782 }
danielebarchiesi@4 783 return array(false, $v);
danielebarchiesi@4 784 }
danielebarchiesi@4 785
danielebarchiesi@4 786 /* 99 */
danielebarchiesi@4 787
danielebarchiesi@4 788 function xPN_PREFIX($v) {
danielebarchiesi@4 789 if ($sub_r = $this->x("([^\s\:\(\)\{\}\;\,]+)", $v, 's')) {/* accelerator */
danielebarchiesi@4 790 return array($sub_r[1], $sub_r[2]);/* @@testing */
danielebarchiesi@4 791 }
danielebarchiesi@4 792 if ((list($r, $sub_v) = $this->xPN_CHARS_BASE($v)) && $r) {
danielebarchiesi@4 793 do {
danielebarchiesi@4 794 $proceed = 0;
danielebarchiesi@4 795 list($sub_r, $sub_v) = $this->xPN_CHARS($sub_v);
danielebarchiesi@4 796 if ($sub_r !== false) {
danielebarchiesi@4 797 $r .= $sub_r;
danielebarchiesi@4 798 $proceed = 1;
danielebarchiesi@4 799 }
danielebarchiesi@4 800 elseif ($sub_r = $this->x("\.", $sub_v)) {
danielebarchiesi@4 801 $r .= '.';
danielebarchiesi@4 802 $sub_v = $sub_r[1];
danielebarchiesi@4 803 $proceed = 1;
danielebarchiesi@4 804 }
danielebarchiesi@4 805 } while ($proceed);
danielebarchiesi@4 806 list($sub_r, $sub_v) = $this->xPN_CHARS($sub_v);
danielebarchiesi@4 807 $r .= $sub_r ? $sub_r : '';
danielebarchiesi@4 808 }
danielebarchiesi@4 809 return array($r, $sub_v);
danielebarchiesi@4 810 }
danielebarchiesi@4 811
danielebarchiesi@4 812 /* 100 */
danielebarchiesi@4 813
danielebarchiesi@4 814 function xPN_LOCAL($v) {
danielebarchiesi@4 815 if (($sub_r = $this->x("([^\s\(\)\{\}\[\]\;\,\.]+)", $v, 's')) && !preg_match('/^\./', $sub_r[2])) {/* accelerator */
danielebarchiesi@4 816 return array($sub_r[1], $sub_r[2]);/* @@testing */
danielebarchiesi@4 817 }
danielebarchiesi@4 818 $r = '';
danielebarchiesi@4 819 $sub_v = $v;
danielebarchiesi@4 820 do {
danielebarchiesi@4 821 $proceed = 0;
danielebarchiesi@4 822 if ($this->x('\s', $sub_v)) {
danielebarchiesi@4 823 return array($r, $sub_v);
danielebarchiesi@4 824 }
danielebarchiesi@4 825 if ($sub_r = $this->x('([0-9])', $sub_v)) {
danielebarchiesi@4 826 $r .= $sub_r[1];
danielebarchiesi@4 827 $sub_v = $sub_r[2];
danielebarchiesi@4 828 $proceed = 1;
danielebarchiesi@4 829 }
danielebarchiesi@4 830 elseif ((list($sub_r, $sub_v) = $this->xPN_CHARS_U($sub_v)) && $sub_r) {
danielebarchiesi@4 831 $r .= $sub_r;
danielebarchiesi@4 832 $proceed = 1;
danielebarchiesi@4 833 }
danielebarchiesi@4 834 elseif ($r) {
danielebarchiesi@4 835 if (($sub_r = $this->x('(\.)', $sub_v)) && !preg_match('/^[\s\}]/s', $sub_r[2])) {
danielebarchiesi@4 836 $r .= $sub_r[1];
danielebarchiesi@4 837 $sub_v = $sub_r[2];
danielebarchiesi@4 838 }
danielebarchiesi@4 839 if ((list($sub_r, $sub_v) = $this->xPN_CHARS($sub_v)) && $sub_r) {
danielebarchiesi@4 840 $r .= $sub_r;
danielebarchiesi@4 841 $proceed = 1;
danielebarchiesi@4 842 }
danielebarchiesi@4 843 }
danielebarchiesi@4 844 } while ($proceed);
danielebarchiesi@4 845 return array($r, $sub_v);
danielebarchiesi@4 846 }
danielebarchiesi@4 847
danielebarchiesi@4 848 /* */
danielebarchiesi@4 849
danielebarchiesi@4 850 function unescapeNtripleUTF($v) {
danielebarchiesi@4 851 if (strpos($v, '\\') === false) return $v;
danielebarchiesi@4 852 $mappings = array('t' => "\t", 'n' => "\n", 'r' => "\r", '\"' => '"', '\'' => "'");
danielebarchiesi@4 853 foreach ($mappings as $in => $out) {
danielebarchiesi@4 854 $v = preg_replace('/\x5c([' . $in . '])/', $out, $v);
danielebarchiesi@4 855 }
danielebarchiesi@4 856 if (strpos(strtolower($v), '\u') === false) return $v;
danielebarchiesi@4 857 while (preg_match('/\\\(U)([0-9A-F]{8})/', $v, $m) || preg_match('/\\\(u)([0-9A-F]{4})/', $v, $m)) {
danielebarchiesi@4 858 $no = hexdec($m[2]);
danielebarchiesi@4 859 if ($no < 128) $char = chr($no);
danielebarchiesi@4 860 else if ($no < 2048) $char = chr(($no >> 6) + 192) . chr(($no & 63) + 128);
danielebarchiesi@4 861 else if ($no < 65536) $char = chr(($no >> 12) + 224) . chr((($no >> 6) & 63) + 128) . chr(($no & 63) + 128);
danielebarchiesi@4 862 else if ($no < 2097152) $char = chr(($no >> 18) + 240) . chr((($no >> 12) & 63) + 128) . chr((($no >> 6) & 63) + 128) . chr(($no & 63) + 128);
danielebarchiesi@4 863 else $char= '';
danielebarchiesi@4 864 $v = str_replace('\\' . $m[1] . $m[2], $char, $v);
danielebarchiesi@4 865 }
danielebarchiesi@4 866 return $v;
danielebarchiesi@4 867 }
danielebarchiesi@4 868
danielebarchiesi@4 869 /* */
danielebarchiesi@4 870
danielebarchiesi@4 871 function xPlaceholder($v) {
danielebarchiesi@4 872 //if ($r = $this->x('(\?|\$)\{([^\}]+)\}', $v)) {
danielebarchiesi@4 873 if ($r = $this->x('(\?|\$)', $v)) {
danielebarchiesi@4 874 if (preg_match('/(\{(?:[^{}]+|(?R))*\})/', $r[2], $m) && strpos(trim($r[2]), $m[1]) === 0) {
danielebarchiesi@4 875 $ph = substr($m[1], 1, -1);
danielebarchiesi@4 876 $rest = substr(trim($r[2]), strlen($m[1]));
danielebarchiesi@4 877 if (!isset($this->r['placeholders'])) $this->r['placeholders'] = array();
danielebarchiesi@4 878 if (!in_array($ph, $this->r['placeholders'])) $this->r['placeholders'][] = $ph;
danielebarchiesi@4 879 return array(array('value' => $ph, 'type' => 'placeholder'), $rest);
danielebarchiesi@4 880 }
danielebarchiesi@4 881 }
danielebarchiesi@4 882 return array(0, $v);
danielebarchiesi@4 883 }
danielebarchiesi@4 884
danielebarchiesi@4 885 /* */
danielebarchiesi@4 886 }