|
1 <?php |
|
2 namespace CorpusParole\Helpers; |
|
3 |
|
4 use EasyRdf\Resource; |
|
5 use EasyRdf\Literal; |
|
6 use EasyRdf\RdfNamespace; |
|
7 |
|
8 use EasyRdf\Serialiser\Turtle; |
|
9 |
|
10 /** |
|
11 * Globally Inspired by EasyRdf\Serialiser\Turtle::serialiseResource |
|
12 */ |
|
13 class RdfHelper { |
|
14 |
|
15 private $prefixes = []; |
|
16 |
|
17 public function getPrefixes() { |
|
18 return $this->prefixes; |
|
19 } |
|
20 |
|
21 /** |
|
22 * Keep track of the prefixes used while serialising |
|
23 * @ignore |
|
24 */ |
|
25 public function addPrefix($qname) |
|
26 { |
|
27 list ($prefix) = explode(':', $qname); |
|
28 $this->prefixes[$prefix] = true; |
|
29 return $prefix; |
|
30 } |
|
31 |
|
32 |
|
33 /** |
|
34 * Given a IRI string, escape and enclose in angle brackets. |
|
35 * |
|
36 * @param string $resourceIri |
|
37 * |
|
38 * @return string |
|
39 */ |
|
40 public function escapeIri($resourceIri) { |
|
41 $escapedIri = str_replace('>', '\\>', $resourceIri); |
|
42 return "<span class=\"corpus-rdf-resource\"><span class=\"corpus-rdf-resource-delimiter\"><</span><a class=\"corpus-rdf-resource-link\" href=\"$resourceIri\" target=\"_blank\">".htmlentities($escapedIri)."</a><span class=\"corpus-rdf-resource-delimiter\">></span></span>"; |
|
43 } |
|
44 |
|
45 /** |
|
46 * Insprired by EasyRdf\Serialiser\Turtle::serialiseLiteral |
|
47 * Given a string, enclose in quotes and escape any quotes in the string. |
|
48 * Strings containing tabs, linefeeds or carriage returns will be |
|
49 * enclosed in three double quotes ("""). |
|
50 * |
|
51 * @param string $value |
|
52 * |
|
53 * @return string |
|
54 */ |
|
55 public function serialiseLiteral($literal) |
|
56 { |
|
57 $value = strval($literal); |
|
58 $quoted = Turtle::quotedString($value); |
|
59 |
|
60 if ($datatype = $literal->getDatatypeUri()) { |
|
61 if ($datatype == 'http://www.w3.org/2001/XMLSchema#integer') { |
|
62 return sprintf('<span class="corpus-rdf-literal corpus-rdf-literal-value">%d</span>', $value); |
|
63 } elseif ($datatype == 'http://www.w3.org/2001/XMLSchema#decimal') { |
|
64 return sprintf('<span class="corpus-rdf-literal corpus-rdf-literal-value">%s</span>', $value); |
|
65 } elseif ($datatype == 'http://www.w3.org/2001/XMLSchema#double') { |
|
66 return sprintf('<span class="corpus-rdf-literal corpus-rdf-literal-value">%e</span>', $value); |
|
67 } elseif ($datatype == 'http://www.w3.org/2001/XMLSchema#boolean') { |
|
68 return sprintf('<span class="corpus-rdf-literal corpus-rdf-literal-value">%s</span>', $value); |
|
69 } else { |
|
70 $escaped = $this->serialiseResource($datatype, false); |
|
71 return sprintf('<span class="corpus-rdf-literal"><span class="corpus-rdf-literal-value corpus-rdf-literal-value-str">%s</span><span class="corpus-rdf-literal-type-separator">^^</span><span class="corpus-rdf-literal-type">%s</span></span>', $quoted, $escaped); |
|
72 } |
|
73 } elseif ($lang = $literal->getLang()) { |
|
74 return sprintf('<span class="corpus-rdf-literal"><span class="corpus-rdf-literal-value corpus-rdf-literal-value-str">%s</span><span class="corpus-rdf-literal-lang-separator">@</span><span class="corpus-rdf-literal-lang">%s</span></span>',$quoted, $lang); |
|
75 } else { |
|
76 return "<span class=\"corpus-rdf-literal corpus-rdf-literal-value\">$quoted</span>"; |
|
77 } |
|
78 } |
|
79 |
|
80 /** |
|
81 * Given a an EasyRdf\Resource or URI, convert it into a string, suitable to |
|
82 * be written to a Turtle document. URIs will be shortened into CURIES |
|
83 * where possible. |
|
84 * |
|
85 * @param Resource|string $resource The resource to convert to a Turtle string |
|
86 * @param boolean $createNamespace If true, a new namespace may be created |
|
87 * |
|
88 * @return string |
|
89 */ |
|
90 public function serialiseResource($resource, $createNamespace = false) |
|
91 { |
|
92 if (is_object($resource)) { |
|
93 if ($resource->isBNode()) { |
|
94 $uri = preg_replace("/^_\:/", "", $resource->getUri(), 1); |
|
95 return "<span class=\"corpus-rdf-blank-node\"><span class=\"corpus-rdf-blank-node-prefix\">_:</span>".htmlentities($uri)."</span>"; |
|
96 } |
|
97 |
|
98 $resource = $resource->getUri(); |
|
99 } |
|
100 |
|
101 $short = RdfNamespace::shorten($resource, $createNamespace); |
|
102 |
|
103 if ($short) { |
|
104 $prefix = $this->addPrefix($short); |
|
105 $shortVal = substr($short, strlen($prefix)+1); |
|
106 $namespaceVal = RdfNamespace::namespaces()[$prefix]; |
|
107 |
|
108 return "<span class=\"corpus-rdf-resource\"><span class=\"corpus-rdf-resource-prefix\" title=\"$namespaceVal\">$prefix</span><span class=\"corpus-rdf-resource-short-separator\">:</span><a class=\"corpus-rdf-resource-link\" href=\"$resource\" target=\"_blank\" title=\"$resource\">".htmlentities($shortVal)."</a></span>"; |
|
109 } |
|
110 |
|
111 return $this->escapeIri($resource); |
|
112 } |
|
113 |
|
114 |
|
115 public function serialiseValue($val) { |
|
116 |
|
117 if($val instanceof Resource) { |
|
118 return $this->serialiseResource($val, false); |
|
119 } elseif($val instanceof Literal) { |
|
120 return $this->serialiseLiteral($val); |
|
121 } else { |
|
122 throw new \InvalidArgumentException( |
|
123 "serialiseObject() requires \$object to be ". |
|
124 'of type EasyRdf\Resource or EasyRdf\Literal' |
|
125 ); |
|
126 } |
|
127 |
|
128 } |
|
129 |
|
130 } |