server/src/app/Helpers/RdfHelper.php
changeset 386 c731ab9b934d
equal deleted inserted replaced
385:f8200c5482ec 386:c731ab9b934d
       
     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\">&lt;</span><a class=\"corpus-rdf-resource-link\" href=\"$resourceIri\" target=\"_blank\">".htmlentities($escapedIri)."</a><span class=\"corpus-rdf-resource-delimiter\">&gt;</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 }