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 }
|