<?php
# Content-type negotiation for LV2 specification bundles

$rdfxml      = accepts("application\/rdf\+xml");
$turtle      = accepts("application\/turtle");
$x_turtle    = accepts("application\/x-turtle");
$text_turtle = accepts("text\/turtle");
$json        = accepts("application\/json");
$html        = accepts("text\/html");
$xhtml       = accepts("application\/xhtml\+xml");
$text_plain  = accepts("text\/plain");

$name = basename($_SERVER['REQUEST_URI']);

# Return Turtle ontology
if ($turtle or $x_turtle or $text_turtle) {
	header("Content-Type: application/x-turtle");
	passthru("cat ./$name.ttl");

# Return ontology translated into rdf+xml
} else if ($rdfxml) {
	header("Content-Type: application/rdf+xml");
	passthru("~/bin/rapper -q -i turtle -o rdfxml-abbrev ./$name.ttl");

} else if ($json) {
	header("Content-Type: application/json");
	passthru("~/bin/rapper -q -i turtle -o json ./$name.ttl");

# Return HTML documentation
} else if ($html or $xhtml) {
	if ($html) {
		header("Content-Type: text/html");
	} else {
		header("Content-Type: application/xhtml+xml");
	}
	$name = basename($_SERVER['REQUEST_URI']); 
	passthru("cat ./$name.html | sed '
s/<\/body>/<div style=\"font-size: smaller; color: gray; text-align: right; margin: 1ex;\">This document is content-negotiated.  If you request it with <code>Accept: application\/x-turtle<\/code> you will get the description in Turtle.  Also supported: <code>application\/rdf+xml<\/code>, <code>application\/json<\/code>, <code>text\/plain<\/code><\/div><\/body>/'");

# Return NTriples (text/plain)
} else if ($text_plain) {
	header("Content-Type: text/plain");
	passthru("~/bin/rapper -q -i turtle -o ntriples ./$name.ttl");

# Return Turtle ontology by default
} else {
	header("Content-Type: application/x-turtle");
	passthru("cat ./$name.ttl");
}

function accepts($type) {
	global $_SERVER;
	if (preg_match("/$type(;q=(\d+\.\d+))?/i", $_SERVER['HTTP_ACCEPT'], $matches)) {
		return isset($matches[2]) ? $matches[2] : 1;
	} else {
		return 0;
	}
}

?>