escChars[$c])) { $this->escChars[$c] = $this->escapedChar($c); } $result .= $this->escChars[$c]; } return $result; } /** * @ignore */ protected function unicodeCharNo($c) { $cUtf = utf8_encode($c); $bl = strlen($cUtf); /* binary length */ $r = 0; switch ($bl) { case 1: /* 0####### (0-127) */ $r = ord($cUtf); break; case 2: /* 110##### 10###### = 192+x 128+x */ $r = ((ord($cUtf[0]) - 192) * 64) + (ord($cUtf[1]) - 128); break; case 3: /* 1110#### 10###### 10###### = 224+x 128+x 128+x */ $r = ((ord($cUtf[0]) - 224) * 4096) + ((ord($cUtf[1]) - 128) * 64) + (ord($cUtf[2]) - 128); break; case 4: /* 1111#### 10###### 10###### 10###### = 240+x 128+x 128+x 128+x */ $r = ((ord($cUtf[0]) - 240) * 262144) + ((ord($cUtf[1]) - 128) * 4096) + ((ord($cUtf[2]) - 128) * 64) + (ord($cUtf[3]) - 128); break; } return $r; } /** * @ignore */ protected function escapedChar($c) { $no = $this->unicodeCharNo($c); /* see http://www.w3.org/TR/rdf-testcases/#ntrip_strings */ if ($no < 9) { return "\\u" . sprintf('%04X', $no); /* #x0-#x8 (0-8) */ } elseif ($no == 9) { return '\t'; /* #x9 (9) */ } elseif ($no == 10) { return '\n'; /* #xA (10) */ } elseif ($no < 13) { return "\\u" . sprintf('%04X', $no); /* #xB-#xC (11-12) */ } elseif ($no == 13) { return '\r'; /* #xD (13) */ } elseif ($no < 32) { return "\\u" . sprintf('%04X', $no); /* #xE-#x1F (14-31) */ } elseif ($no < 34) { return $c; /* #x20-#x21 (32-33) */ } elseif ($no == 34) { return '\"'; /* #x22 (34) */ } elseif ($no < 92) { return $c; /* #x23-#x5B (35-91) */ } elseif ($no == 92) { return '\\'; /* #x5C (92) */ } elseif ($no < 127) { return $c; /* #x5D-#x7E (93-126) */ } elseif ($no < 65536) { return "\\u" . sprintf('%04X', $no); /* #x7F-#xFFFF (128-65535) */ } elseif ($no < 1114112) { return "\\U" . sprintf('%08X', $no); /* #x10000-#x10FFFF (65536-1114111) */ } else { return ''; /* not defined => ignore */ } } /** * @ignore */ protected function serialiseResource($res) { $escaped = $this->escapeString($res); if (substr($res, 0, 2) == '_:') { return $escaped; } else { return "<$escaped>"; } } /** * Serialise an RDF value into N-Triples * * The value can either be an array in RDF/PHP form, or * an EasyRdf_Literal or EasyRdf_Resource object. * * @param array|object $value An associative array or an object * @throws EasyRdf_Exception * @return string The RDF value serialised to N-Triples */ public function serialiseValue($value) { if (is_object($value)) { $value = $value->toRdfPhp(); } if ($value['type'] == 'uri' or $value['type'] == 'bnode') { return $this->serialiseResource($value['value']); } elseif ($value['type'] == 'literal') { $escaped = $this->escapeString($value['value']); if (isset($value['lang'])) { $lang = $this->escapeString($value['lang']); return '"' . $escaped . '"' . '@' . $lang; } elseif (isset($value['datatype'])) { $datatype = $this->escapeString($value['datatype']); return '"' . $escaped . '"' . "^^<$datatype>"; } else { return '"' . $escaped . '"'; } } else { throw new EasyRdf_Exception( "Unable to serialise object of type '".$value['type']."' to ntriples: " ); } } /** * Serialise an EasyRdf_Graph into N-Triples * * @param EasyRdf_Graph $graph An EasyRdf_Graph object. * @param string $format The name of the format to convert to. * @param array $options * @throws EasyRdf_Exception * @return string The RDF in the new desired format. */ public function serialise($graph, $format, array $options = array()) { parent::checkSerialiseParams($graph, $format); if ($format == 'ntriples') { $nt = ''; foreach ($graph->toRdfPhp() as $resource => $properties) { foreach ($properties as $property => $values) { foreach ($values as $value) { $nt .= $this->serialiseResource($resource)." "; $nt .= "<" . $this->escapeString($property) . "> "; $nt .= $this->serialiseValue($value)." .\n"; } } } return $nt; } else { throw new EasyRdf_Exception( "EasyRdf_Serialiser_Ntriples does not support: $format" ); } } }