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