danielebarchiesi@4
|
1 <?php
|
danielebarchiesi@4
|
2 /**
|
danielebarchiesi@4
|
3 * ARC2 RDF/JSON Serializer
|
danielebarchiesi@4
|
4 *
|
danielebarchiesi@4
|
5 * @author Benjamin Nowack <bnowack@semsol.com>
|
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 */
|
danielebarchiesi@4
|
10
|
danielebarchiesi@4
|
11 ARC2::inc('RDFSerializer');
|
danielebarchiesi@4
|
12
|
danielebarchiesi@4
|
13 class ARC2_RDFJSONSerializer extends ARC2_RDFSerializer {
|
danielebarchiesi@4
|
14
|
danielebarchiesi@4
|
15 function __construct($a, &$caller) {
|
danielebarchiesi@4
|
16 parent::__construct($a, $caller);
|
danielebarchiesi@4
|
17 }
|
danielebarchiesi@4
|
18
|
danielebarchiesi@4
|
19 function __init() {
|
danielebarchiesi@4
|
20 parent::__init();
|
danielebarchiesi@4
|
21 $this->content_header = 'application/json';
|
danielebarchiesi@4
|
22 }
|
danielebarchiesi@4
|
23
|
danielebarchiesi@4
|
24 /* */
|
danielebarchiesi@4
|
25
|
danielebarchiesi@4
|
26 function getTerm($v, $term = 's') {
|
danielebarchiesi@4
|
27 if (!is_array($v)) {
|
danielebarchiesi@4
|
28 if (preg_match('/^\_\:/', $v)) {
|
danielebarchiesi@4
|
29 return ($term == 'o') ? $this->getTerm(array('value' => $v, 'type' => 'bnode'), 'o') : '"' . $v . '"';
|
danielebarchiesi@4
|
30 }
|
danielebarchiesi@4
|
31 return ($term == 'o') ? $this->getTerm(array('value' => $v, 'type' => 'uri'), 'o') : '"' . $v . '"';
|
danielebarchiesi@4
|
32 }
|
danielebarchiesi@4
|
33 if (!isset($v['type']) || ($v['type'] != 'literal')) {
|
danielebarchiesi@4
|
34 if ($term != 'o') {
|
danielebarchiesi@4
|
35 return $this->getTerm($v['value'], $term);
|
danielebarchiesi@4
|
36 }
|
danielebarchiesi@4
|
37 if (preg_match('/^\_\:/', $v['value'])) {
|
danielebarchiesi@4
|
38 return '{ "value" : "' . $this->jsonEscape($v['value']) . '", "type" : "bnode" }';
|
danielebarchiesi@4
|
39 }
|
danielebarchiesi@4
|
40 return '{ "value" : "' . $this->jsonEscape($v['value']) . '", "type" : "uri" }';
|
danielebarchiesi@4
|
41 }
|
danielebarchiesi@4
|
42 /* literal */
|
danielebarchiesi@4
|
43 $r = '{ "value" : "' . $this->jsonEscape($v['value']) . '", "type" : "literal"';
|
danielebarchiesi@4
|
44 $suffix = isset($v['datatype']) ? ', "datatype" : "' . $v['datatype'] . '"' : '';
|
danielebarchiesi@4
|
45 $suffix = isset($v['lang']) ? ', "lang" : "' . $v['lang'] . '"' : $suffix;
|
danielebarchiesi@4
|
46 $r .= $suffix . ' }';
|
danielebarchiesi@4
|
47 return $r;
|
danielebarchiesi@4
|
48 }
|
danielebarchiesi@4
|
49
|
danielebarchiesi@4
|
50 function jsonEscape($v) {
|
danielebarchiesi@4
|
51 if (function_exists('json_encode')) {
|
danielebarchiesi@4
|
52 return preg_replace('/^"(.*)"$/', '\\1', str_replace("\/","/",json_encode($v)));
|
danielebarchiesi@4
|
53 }
|
danielebarchiesi@4
|
54 $from = array("\\", "\r", "\t", "\n", '"', "\b", "\f");
|
danielebarchiesi@4
|
55 $to = array('\\\\', '\r', '\t', '\n', '\"', '\b', '\f');
|
danielebarchiesi@4
|
56 return str_replace($from, $to, $v);
|
danielebarchiesi@4
|
57 }
|
danielebarchiesi@4
|
58
|
danielebarchiesi@4
|
59 function getSerializedIndex($index, $raw = 0) {
|
danielebarchiesi@4
|
60 $r = '';
|
danielebarchiesi@4
|
61 $nl = "\n";
|
danielebarchiesi@4
|
62 foreach ($index as $s => $ps) {
|
danielebarchiesi@4
|
63 $r .= $r ? ',' . $nl . $nl : '';
|
danielebarchiesi@4
|
64 $r .= ' ' . $this->getTerm($s). ' : {';
|
danielebarchiesi@4
|
65 $first_p = 1;
|
danielebarchiesi@4
|
66 foreach ($ps as $p => $os) {
|
danielebarchiesi@4
|
67 $r .= $first_p ? $nl : ',' . $nl;
|
danielebarchiesi@4
|
68 $r .= ' ' . $this->getTerm($p). ' : [';
|
danielebarchiesi@4
|
69 $first_o = 1;
|
danielebarchiesi@4
|
70 if (!is_array($os)) {/* single literal o */
|
danielebarchiesi@4
|
71 $os = array(array('value' => $os, 'type' => 'literal'));
|
danielebarchiesi@4
|
72 }
|
danielebarchiesi@4
|
73 foreach ($os as $o) {
|
danielebarchiesi@4
|
74 $r .= $first_o ? $nl : ',' . $nl;
|
danielebarchiesi@4
|
75 $r .= ' ' . $this->getTerm($o, 'o');
|
danielebarchiesi@4
|
76 $first_o = 0;
|
danielebarchiesi@4
|
77 }
|
danielebarchiesi@4
|
78 $first_p = 0;
|
danielebarchiesi@4
|
79 $r .= $nl . ' ]';
|
danielebarchiesi@4
|
80 }
|
danielebarchiesi@4
|
81 $r .= $nl . ' }';
|
danielebarchiesi@4
|
82 }
|
danielebarchiesi@4
|
83 $r .= $r ? ' ' : '';
|
danielebarchiesi@4
|
84 return '{' . $nl . $r . $nl . '}';
|
danielebarchiesi@4
|
85 }
|
danielebarchiesi@4
|
86
|
danielebarchiesi@4
|
87 /* */
|
danielebarchiesi@4
|
88
|
danielebarchiesi@4
|
89 }
|