rdf_parser["xml_parser"] = $parser;
xml_set_object($this->rdf_parser["xml_parser"], $this);
xml_set_element_handler($this->rdf_parser["xml_parser"], "_start_element_handler", "_end_element_handler");
xml_set_character_data_handler($this->rdf_parser["xml_parser"], "_character_data_handler");
return $this->rdf_parser;
}
public function rdf_parser_free() {
$z = 3;
// xml_parser_free( $this->rdf_parser["xml_parser"] );
$this->rdf_parser["base_uri"] = self::EMPTY_STRING;
$this->_delete_elements($this->rdf_parser);
unset($this->rdf_parser);
}
public function rdf_set_user_data(&$user_data) {
$this->rdf_parser["user_data"] = & $user_data;
}
public function rdf_get_user_data() {
return ($this->rdf_parser["$user_data"]);
}
public function rdf_set_statement_handler($handler) {
$this->rdf_parser["statement_handler"] = $handler;
}
public function rdf_set_parse_type_literal_handler($start, $end) {
$this->rdf_parser["start_parse_type_literal_handler"] = $start;
$this->rdf_parser["end_parse_type_literal_handler"] = $end;
}
public function rdf_set_element_handler($start, $end) {
$this->rdf_parser["_start_element_handler"] = $start;
$this->rdf_parser["_end_element_handler"] = $end;
}
public function rdf_set_character_data_handler($handler) {
$this->rdf_parser["_character_data_handler"] = $handler;
}
public function rdf_set_warning_handler($handler) {
$this->rdf_parser["warning_handler"] = $handler;
}
public function rdf_parse($s, $len, $is_final) {
return XML_Parse($this->rdf_parser["xml_parser"], $s, $is_final);
}
public function rdf_get_xml_parser() {
return ($this->rdf_parser["xml_parser"]);
}
public function rdf_set_base($base) {
/* check for out of memory */
$this->rdf_parser["base_uri"] = $base;
return 0;
}
public function rdf_get_base() {
return $this->rdf_parser["base_uri"];
}
public function rdf_resolve_uri($uri_reference, &$buffer) {
_resolve_uri_reference($this->rdf_parser["base_uri"], $uri_reference, $buffer, strlen($buffer));
}
// --------------------------------------------------------------------------
private function _new_element() {
$e["parent"] = Array(); // Parent is a blank Array
//$this->clear_element($e["parent"]);
$e["state"] = 0;
$e["has_property_atributes"] = 0;
$e["has_member_attributes"] = 0;
$e["subject_type"] = 0;
$e["subject"] = self::EMPTY_STRING;
$e["predicate"] = self::EMPTY_STRING;
$e["ordinal"] = 0;
$e["members"] = 0;
$e["data"] = self::EMPTY_STRING;
$e["xml_lang"] = self::EMPTY_STRING;
$e["bag_id"] = self::EMPTY_STRING;
$e["statements"] = 0;
$e["statement_id"] = self::EMPTY_STRING;
return $e;
}
private function _copy_element($source, &$destination) {
if ($source) {
$destination["parent"] = $source;
$destination["state"] = $source["state"];
$destination["xml_lang"] = $source["xml_lang"];
}
}
private function _clear_element(&$e) {
$e["subject"] = self::EMPTY_STRING;
$e["predicate"] = self::EMPTY_STRING;
$e["data"] = self::EMPTY_STRING;
$e["bag_id"] = self::EMPTY_STRING;
$e["statement_id"] = self::EMPTY_STRING;
if (isset($e["parent"])) {
if ($e["parent"]) {
if ($e["parent"]["xml_lang"] != $e["xml_lang"]) {
$e["xml_lang"] = self::EMPTY_STRING;
}
}
else {
$e["xml_lang"] = self::EMPTY_STRING;
}
}
else {
$e["xml_lang"] = self::EMPTY_STRING;
}
//memset( e, 0, strlen( _rdf_element ) );
$e["parent"] = Array();
$e["state"] = 0;
$e["has_property_attributes"] = 0;
$e["has_member_attributes"] = 0;
$e["subject_type"] = 0;
$e["subject"] = self::EMPTY_STRING;
$e["predicate"] = self::EMPTY_STRING;
$e["ordinal"] = 0;
$e["members"] = 0;
$e["data"] = self::EMPTY_STRING;
$e["xml_lang"] = self::EMPTY_STRING;
$e["bag_id"] = self::EMPTY_STRING;
$e["statements"] = 0;
$e["statement_id"] = self::EMPTY_STRING;
}
private function _push_element() {
if (!isset($this->rdf_parser["free"])) {
$this->rdf_parser["free"] = Array();
}
if (count($this->rdf_parser["free"]) > 0) {
$e = $this->rdf_parser["free"];
if (isset($e["parent"])) {
$this->rdf_parser["free"] = $e["parent"];
}
else {
$this->rdf_parser["free"] = $this->_new_element();
}
}
else {
$e = $this->_new_element();
}
if (!isset($this->rdf_parser["top"])) {
$this->rdf_parser["top"] = Array();
}
$this->_copy_element($this->rdf_parser["top"], $e);
$this->rdf_parser["top"] = $e;
}
private function _pop_element() {
$e = $this->rdf_parser["top"];
$this->rdf_parser["top"] = $e["parent"];
$this->_clear_element($e);
$this->rdf_parser["free"] = $e;
}
private function _delete_elements() {
}
private function _is_rdf_property_attribute_resource($local_name) {
return ($local_name == self::RDF_TYPE);
}
private function _is_rdf_property_attribute_literal($local_name) {
return ($local_name == self::RDF_VALUE);
}
private function _is_rdf_ordinal($local_name) {
$ordinal = - 1;
if ($local_name[0] == self::UNDERSCORE) {
$ordinal = substr($local_name, 1) + 1;
}
return ($ordinal > 0) ? $ordinal : 0;
}
private function _is_rdf_property_attribute($local_name) {
return $this->_is_rdf_property_attribute_resource($local_name) || $this->_is_rdf_property_attribute_literal($local_name);
}
private function _is_rdf_property_element($local_name) {
return
($local_name == self::RDF_TYPE) || ($local_name == self::RDF_SUBJECT) || ($local_name == self::RDF_PREDICATE) ||
($local_name == self::RDF_OBJECT) || ($local_name == self::RDF_VALUE) || ($local_name == self::RDF_LI) ||
($local_name[0] == self::UNDERSCORE);
}
private function _istalnum($val) {
return preg_match("/[A-Za-z0-9]/", $val);
}
private function _istalpha($val) {
return preg_match("/[A-Za-z]/", $val);
}
private function _is_absolute_uri($uri) {
$result = false;
$uri_p = 0;
if ($uri && $this->_istalpha($uri[$uri_p])) {
++$uri_p;
while (($uri_p < strlen($uri)) && ($this->_istalnum($uri[$uri_p]) || ($uri[$uri_p] == '+') || ($uri[$uri_p] == self::DASH) || ($uri[$uri_p] == self::DOT))) {
++$uri_p;
}
$result = ($uri[$uri_p] == self::COLON);
}
return $result;
}
/*
This function returns an associative array returning any of the various components of the URL that are present. This includes the
$arr=parse_url($url)
scheme - e.g. http
host
port
user
pass
path
query - after the question mark ?
fragment - after the hashmark #
*/
private function _parse_uri($uri, $buffer, $len, &$scheme, &$authority, &$path, &$query, &$fragment) {
$parsed = parse_url($uri);
if (isset($parsed["scheme"])) {
$scheme = $parsed["scheme"];
}
else {
$scheme = self::EMPTY_STRING;
}
if (isset($parsed["host"])) {
$host = $parsed["host"];
}
else {
$host = self::EMPTY_STRING;
}
if (isset($parsed["host"])) {
$authority = $parsed["host"];
}
else {
$authority = self::EMPTY_STRING;
}
if (isset($parsed["path"])) {
$path = $parsed["path"];
}
else {
$path = self::EMPTY_STRING;
}
if (isset($parsed["query"])) {
$query = $parsed["query"];
}
else {
$query = self::EMPTY_STRING;
}
if (isset($parsed["fragment"])) {
$fragment = $parsed["fragment"];
}
else {
$fragment = self::EMPTY_STRING;
}
}
private function _resolve_uri_reference($base_uri, $reference_uri, &$buffer, $length) {
$base_buffer = self::EMPTY_STRING;
$reference_buffer = self::EMPTY_STRING;
$path_buffer = self::EMPTY_STRING;
$buffer = self::EMPTY_STRING;
$this->_parse_uri($reference_uri, $reference_buffer, strlen($reference_buffer) , $reference_scheme, $reference_authority, $reference_path, $reference_query, $reference_fragment);
if ($reference_scheme == self::EMPTY_STRING && $reference_authority == self::EMPTY_STRING && $reference_path == self::EMPTY_STRING && $reference_query == self::EMPTY_STRING) {
$buffer = $base_uri;
if ($reference_fragment != self::EMPTY_STRING) {
$buffer .= "#";
$buffer .= $reference_fragment;
}
}
elseif ($reference_scheme != self::EMPTY_STRING) {
$buffer = $reference_uri;
}
else {
$this->_parse_uri($base_uri, $base_buffer, strlen($base_buffer) , $base_scheme, $base_authority, $base_path, $base_query, $base_fragment);
$result_scheme = $base_scheme;
if ($reference_authority != self::EMPTY_STRING) {
$result_authority = $reference_authority;
}
else {
$result_authority = $base_authority;
if ($reference_path != self::EMPTY_STRING && (($reference_path[0] == '/') || ($reference_path[0] == '\\'))) {
$result_path = $reference_path;
}
else {
$p = self::EMPTY_STRING;
$result_path = $path_buffer;
$path_buffer = self::EMPTY_STRING;
$p = strstr($base_path, '/');
if (!$p) {
$p = strstr($base_path, '\\');
}
if ($p) {
$path_buffer .= $base_path;
//while( s <= p )
//{
// *d++ = *s++;
//}
//*d++ = 0;
}
if ($reference_path != self::EMPTY_STRING) {
$path_buffer .= $reference_path;
}
//remove all occurrences of "./"
//print($path_buffer);
$path_buffer = preg_replace("/\/\.\//", "/", $path_buffer);
$path_buffer = preg_replace("/\/([^\/\.])*\/..$/", "/", $path_buffer);
while (preg_match("/\.\./", $path_buffer)) {
$path_buffer = preg_replace("/\/([^\/\.]*)\/..\//", "/", $path_buffer);
}
$path_buffer = preg_replace("/\.$/", "", $path_buffer);
}
}
// This replaces the C pointer assignament
$result_path = $path_buffer;
if ($result_scheme != self::EMPTY_STRING) {
$buffer = $result_scheme;
$buffer .= ":";
}
if ($result_authority != self::EMPTY_STRING) {
$buffer .= "//";
$buffer .= $result_authority;
}
if ($result_path != self::EMPTY_STRING) {
$buffer .= $result_path;
}
if ($reference_query != self::EMPTY_STRING) {
$buffer .= "?";
$buffer .= $reference_query;
}
if ($reference_fragment != self::EMPTY_STRING) {
$buffer .= "#";
$buffer .= $reference_fragment;
}
}
}
private function is_valid_id($id) {
$result = false;
$p = $id;
$p_p = 0;
if ($id != self::EMPTY_STRING) {
if ($this->_istalpha($p) || $p[0] == self::UNDERSCORE || $p[0] == self::COLON) {
$result = true;
while ($result != false && ($p[++$p_p] != 0)) {
if (!($this->_istalnum($p[$p_p]) || $p[$p_p] == self::DOT || $p[$p_p] == self::DASH || $p[$p_p] == self::UNDERSCORE || $p[$p_p] == self::COLON)) {
$result = false;
}
}
}
}
return $result;
}
private function _resolve_id($id, &$buffer, $length) {
$id_buffer = self::EMPTY_STRING;
if ($this->is_valid_id($id) == true) {
$id_buffer = "#$id";
}
else {
$this->report_warning("bad ID attribute: " . $id_buffer . "#_bad_ID_attribute_");
}
$this->_resolve_uri_reference($this->rdf_parser["base_uri"], $id_buffer, $buffer, $length);
}
private function _split_name($name, &$buffer, $len, &$namespace_uri, &$local_name) {
static $nul = 0;
$buffer = $name;
if (strstr($buffer, self::NAMESPACE_SEPARATOR_CHAR)) {
$cosas = explode(self::NAMESPACE_SEPARATOR_CHAR, $buffer);
$namespace_uri = $cosas[0];
$local_name = $cosas[1];
}
else {
if (($buffer[0] == 'x') && ($buffer[1] == 'm') && ($buffer[2] == 'l') && ($buffer[3] == self::COLON)) {
$namespace_uri = self::XML_NAMESPACE_URI;
$local_name = substr($buffer, 4);
}
else {
$namespace_uri = self::EMPTY_STRING;
$local_name = $buffer;
}
}
}
private function _generate_anonymous_uri(&$buf, $len) {
$id = self::EMPTY_STRING;
if (!isset($this->rdf_parser["anonymous_id"])) {
$this->rdf_parser["anonymous_id"] = 0;
}
$this->rdf_parser["anonymous_id"]++;
$id = "#genid" . $this->rdf_parser["anonymous_id"];
$this->_resolve_uri_reference($this->rdf_parser["base_uri"], $id, $buf, $len);
}
private function _report_statement($subject_type, $subject, $predicate, $ordinal, $object_type, $object, $xml_lang, $bag_id, $statements, $statement_id) {
$statement_id_type = self::RDF_SUBJECT_TYPE_URI;
$statement_id_buffer = self::EMPTY_STRING;
$predicate_buffer = self::EMPTY_STRING;
if ($this->rdf_parser["statement_handler"]) {
$this->rdf_parser["user_data"] = call_user_func_array($this->rdf_parser["statement_handler"], array(&$this->rdf_parser["user_data"], $subject_type, $subject, $predicate, $ordinal, $object_type, $object, $xml_lang));
// $this->rdf_parser["statement_handler"]($this->rdf_parser["user_data"],$subject_type,$subject,$predicate,$ordinal,$object_type,$object,$xml_lang )
if ($bag_id) {
if ($statements == self::EMPTY_STRING) {
$this->_report_statement(self::RDF_SUBJECT_TYPE_URI, $bag_id, self::RDF_NAMESPACE_URI . self::RDF_TYPE, 0, self::RDF_OBJECT_TYPE_RESOURCE, self::RDF_NAMESPACE_URI . self::RDF_BAG, self::EMPTY_STRING, self::EMPTY_STRING, self::EMPTY_STRING, self::EMPTY_STRING);
}
if (!$statement_id) {
$statement_id_type = self::RDF_SUBJECT_TYPE_ANONYMOUS;
$this->_generate_anonymous_uri($statement_id_buffer, strlen($statement_id_buffer));
$statement_id = $statement_id_buffer;
}
$statements++;
$predicate_buffer = "self::RDF_NAMESPACE_URI_" . $statements;
$this->_report_statement(self::RDF_SUBJECT_TYPE_URI, $bag_id, $predicate_buffer, $statements, self::RDF_OBJECT_TYPE_RESOURCE, $statement_id, self::EMPTY_STRING, self::EMPTY_STRING, self::EMPTY_STRING, self::EMPTY_STRING);
}
if ($statement_id) {
// rdf:type = rdf:Statement
$this->_report_statement(
$statement_id_type,
$statement_id,
self::RDF_NAMESPACE_URI . self::RDF_TYPE,
0,
self::RDF_OBJECT_TYPE_RESOURCE,
self::RDF_NAMESPACE_URI . self::RDF_STATEMENT,
self::EMPTY_STRING, self::EMPTY_STRING, self::EMPTY_STRING, self::EMPTY_STRING
);
// rdf:subject
$this->_report_statement(
$statement_id_type,
$statement_id,
self::RDF_NAMESPACE_URI . self::RDF_SUBJECT,
0,
self::RDF_OBJECT_TYPE_RESOURCE,
$subject,
self::EMPTY_STRING, self::EMPTY_STRING, self::EMPTY_STRING, self::EMPTY_STRING
);
// rdf:predicate
$this->_report_statement(
$statement_id_type,
$statement_id,
self::RDF_NAMESPACE_URI . self::RDF_PREDICATE,
0,
self::RDF_OBJECT_TYPE_RESOURCE,
$predicate,
self::EMPTY_STRING, self::EMPTY_STRING, self::EMPTY_STRING, self::EMPTY_STRING
);
// rdf:object
$this->_report_statement(
$statement_id_type,
$statement_id,
self::RDF_NAMESPACE_URI . self::RDF_OBJECT,
0,
$object_type,
$object,
self::EMPTY_STRING, self::EMPTY_STRING, self::EMPTY_STRING, self::EMPTY_STRING
);
}
}
}
private function _report_start_parse_type_literal() {
if ($this->rdf_parser["start_parse_type_literal_handler"]) {
$this->rdf_parser["start_parse_type_literal_handler"]($this->rdf_parser["user_data"]);
}
}
private function _report_end_parse_type_literal() {
if ($this->rdf_parser["end_parse_type_literal_handler"]) {
$this->rdf_parser["end_parse_type_literal_handler"]($this->rdf_parser["user_data"]);
}
}
private function _handle_property_attributes($subject_type, $subject, $attributes, $xml_lang, $bag_id, $statements) {
$i = 0;
$attribute = self::EMPTY_STRING;
$predicate = self::EMPTY_STRING;
$attribute_namespace_uri = self::EMPTY_STRING;
$attribute_local_name = self::EMPTY_STRING;
$attribute_value = self::EMPTY_STRING;
$ordinal = 0;
for ($i = 0;isset($attributes[$i]);$i += 2) {
$this->_split_name($attributes[$i], $attribute, strlen($attribute) , $attribute_namespace_uri, $attribute_local_name);
$attribute_value = $attributes[$i + 1];
$predicate = $attribute_namespace_uri;
$predicate .= $attribute_local_name;
if (self::RDF_NAMESPACE_URI == $attribute_namespace_uri) {
if ($this->_is_rdf_property_attribute_literal($attribute_local_name)) {
$this->_report_statement($subject_type, $subject, $predicate, 0, self::RDF_OBJECT_TYPE_LITERAL, $attribute_value, $xml_lang, $bag_id, $statements, self::EMPTY_STRING);
}
elseif ($this->_is_rdf_property_attribute_resource($attribute_local_name)) {
$this->_report_statement($subject_type, $subject, $predicate, 0, self::RDF_OBJECT_TYPE_RESOURCE, $attribute_value, self::EMPTY_STRING, $bag_id, $statements, self::EMPTY_STRING);
}
elseif (($ordinal = $this->_is_rdf_ordinal($attribute_local_name)) != 0) {
$this->_report_statement($subject_type, $subject, $predicate, $ordinal, self::RDF_OBJECT_TYPE_LITERAL, $attribute_value, $xml_lang, $bag_id, $statements, self::EMPTY_STRING);
}
}
elseif (self::XML_NAMESPACE_URI == $attribute_namespace_uri) {
//do nothing
}
elseif ($attribute_namespace_uri) {
// is it required that property attributes be in an explicit namespace?
$this->_report_statement($subject_type, $subject, $predicate, 0, self::RDF_OBJECT_TYPE_LITERAL, $attribute_value, $xml_lang, $bag_id, $statements, self::EMPTY_STRING);
}
}
}
private function _report_start_element($name, $attributes) {
if (isset($this->rdf_parser["start_element_handler"])) {
$this->rdf_parser["start_element_handler"]($this->rdf_parser["user_data"], $name, $attributes);
}
}
private function _report_end_element($name) {
if (isset($this->rdf_parser["end_element_handler"])) {
$this->rdf_parser["end_element_handler"]($this->rdf_parser["user_data"], $name);
}
}
private function _report_character_data($s, $len) {
if (isset($this->rdf_parser["character_data_handler"])) {
$this->rdf_parser["character_data_handler"]($this->rdf_parser["user_data"], $s, $len);
}
}
private function _report_warning($warning) {
// rdf_parser->top->state = self::IN_UNKNOWN;
if (isset($this->rdf_parser["warning_handler"])) {
$this->rdf_parser["warning_handler"]($warning);
}
}
private function _handle_resource_element($namespace_uri, $local_name, $attributes, $parent) {
$subjects_found = 0;
$aux = $attributes;
$aux2 = Array();
foreach ($attributes as $atkey => $atvalue) {
$aux2[] = $atkey;
$aux2[] = $atvalue;
}
$attributes = $aux2;
$id = self::EMPTY_STRING;
$about = self::EMPTY_STRING;
$about_each = self::EMPTY_STRING;
$about_each_prefix = self::EMPTY_STRING;
$bag_id = self::EMPTY_STRING;
$i = 0;
$attribute = self::EMPTY_STRING;
$attribute_namespace_uri = self::EMPTY_STRING;
$attribute_local_name = self::EMPTY_STRING;
$attribute_value = self::EMPTY_STRING;
$id_buffer = self::EMPTY_STRING;
$type = self::EMPTY_STRING;
$this->rdf_parser["top"]["has_property_attributes"] = false;
$this->rdf_parser["top"]["has_member_attributes"] = false;
// examine each attribute for the standard RDF "keywords"
for ($i = 0;isset($attributes[$i]);$i += 2) {
$this->_split_name($attributes[$i], $attribute, strlen($attribute) , $attribute_namespace_uri, $attribute_local_name);
$attribute_value = $attributes[$i + 1];
// if the attribute is not in any namespace
// or the attribute is in the RDF namespace
if (($attribute_namespace_uri == self::EMPTY_STRING) || ($attribute_namespace_uri == self::RDF_NAMESPACE_URI)) {
if ($attribute_local_name == self::RDF_ID) {
$id = $attribute_value;
++$subjects_found;
}
elseif ($attribute_local_name == self::RDF_ABOUT) {
$about = $attribute_value;
++$subjects_found;
}
elseif ($attribute_local_name == self::RDF_ABOUT_EACH) {
$about_each = $attribute_value;
++$subjects_found;
}
elseif ($attribute_local_name == self::RDF_ABOUT_EACH_PREFIX) {
$about_each_prefix = $attribute_value;
++$subjects_found;
}
elseif ($attribute_local_name == self::RDF_BAG_ID) {
$bag_id = $attribute_value;
}
elseif ($this->_is_rdf_property_attribute($attribute_local_name)) {
$this->rdf_parser["top"]["has_property_attributes"] = true;
}
elseif ($this->_is_rdf_ordinal($attribute_local_name)) {
$this->rdf_parser["top"]["has_property_attributes"] = true;
$this->rdf_parser["top"]["has_member_attributes"] = true;
}
else {
$this->_report_warning("unknown or out of context rdf attribute:" . $attribute_local_name);
}
}
elseif ($attribute_namespace_uri == self::XML_NAMESPACE_URI) {
if ($attribute_local_name == self::XML_LANG) {
$this->rdf_parser["top"]["xml_lang"] = $attribute_value;
}
}
elseif ($attribute_namespace_uri) {
$this->rdf_parser["top"]["has_property_attributes"] = true;
}
}
// if no subjects were found, generate one.
if ($subjects_found == 0) {
$this->_generate_anonymous_uri($id_buffer, strlen($id_buffer));
$this->rdf_parser["top"]["subject"] = $id_buffer;
$this->rdf_parser["top"]["subject_type"] = self::RDF_SUBJECT_TYPE_ANONYMOUS;
}
elseif ($subjects_found > 1) {
$this->_report_warning("ID, about, aboutEach, and aboutEachPrefix are mutually exclusive");
return;
}
elseif ($id) {
$this->_resolve_id($id, $id_buffer, strlen($id_buffer));
$this->rdf_parser["top"]["subject_type"] = self::RDF_SUBJECT_TYPE_URI;
$this->rdf_parser["top"]["subject"] = $id_buffer;
}
elseif ($about) {
$this->_resolve_uri_reference($this->rdf_parser["base_uri"], $about, $id_buffer, strlen($id_buffer));
$this->rdf_parser["top"]["subject_type"] = self::RDF_SUBJECT_TYPE_URI;
$this->rdf_parser["top"]["subject"] = $id_buffer;
}
elseif ($about_each) {
$this->rdf_parser["top"]["subject_type"] = self::RDF_SUBJECT_TYPE_DISTRIBUTED;
$this->rdf_parser["top"]["subject"] = $about_each;
}
elseif ($about_each_prefix) {
$this->rdf_parser["top"]["subject_type"] = self::RDF_SUBJECT_TYPE_PREFIX;
$this->rdf_parser["top"]["subject"] = $about_each_prefix;
}
// if the subject is empty, assign it the document uri
if ($this->rdf_parser["top"]["subject"] == self::EMPTY_STRING) {
$len = 0;
$this->rdf_parser["top"]["subject"] = $this->rdf_parser["base_uri"];
// now remove the trailing '#'
$len = strlen($this->rdf_parser["top"]["subject"]);
}
if ($bag_id) {
$this->_resolve_id($bag_id, $id_buffer, strlen($id_buffer));
$this->rdf_parser["top"]["bag_id"] = $id_buffer;
}
// only report the type for non-rdf:Description elements.
if (($local_name != self::RDF_DESCRIPTION) || ($namespace_uri != self::RDF_NAMESPACE_URI)) {
$type = $namespace_uri;
$type .= $local_name;
$this->_report_statement(
$this->rdf_parser["top"]["subject_type"],
$this->rdf_parser["top"]["subject"],
self::RDF_NAMESPACE_URI . self::RDF_TYPE,
0,
self::RDF_OBJECT_TYPE_RESOURCE,
$type,
self::EMPTY_STRING,
$this->rdf_parser["top"]["bag_id"],
$this->rdf_parser["top"]["statements"],
self::EMPTY_STRING
);
}
// if this element is the child of some property,
// report the appropriate statement.
if ($parent) {
$this->_report_statement(
$parent["parent"]["subject_type"],
$parent["parent"]["subject"],
$parent["predicate"],
$parent["ordinal"],
self::RDF_OBJECT_TYPE_RESOURCE,
$this->rdf_parser["top"]["subject"],
self::EMPTY_STRING,
$parent["parent"]["bag_id"],
$parent["parent"]["statements"],
$parent["statement_id"]
);
}
if ($this->rdf_parser["top"]["has_property_attributes"]) {
$this->_handle_property_attributes(
$this->rdf_parser["top"]["subject_type"],
$this->rdf_parser["top"]["subject"],
$attributes,
$this->rdf_parser["top"]["xml_lang"],
$this->rdf_parser["top"]["bag_id"],
$this->rdf_parser["top"]["statements"]
);
}
}
private function _handle_property_element(&$namespace_uri, &$local_name, &$attributes) {
$buffer = self::EMPTY_STRING;
$i = 0;
$aux = $attributes;
$aux2 = Array();
foreach ($attributes as $atkey => $atvalue) {
$aux2[] = $atkey;
$aux2[] = $atvalue;
}
$attributes = $aux2;
$attribute_namespace_uri = self::EMPTY_STRING;
$attribute_local_name = self::EMPTY_STRING;
$attribute_value = self::EMPTY_STRING;
$resource = self::EMPTY_STRING;
$statement_id = self::EMPTY_STRING;
$bag_id = self::EMPTY_STRING;
$parse_type = self::EMPTY_STRING;
$this->rdf_parser["top"]["ordinal"] = 0;
if ($namespace_uri == self::RDF_NAMESPACE_URI) {
if (($this->rdf_parser["top"]["ordinal"] = ($this->_is_rdf_ordinal($local_name)) != 0)) {
if ($this->rdf_parser["top"]["ordinal"] > $this->rdf_parser["top"]["parent"]["members"]) {
$this->rdf_parser["top"]["parent"]["members"] = $this->rdf_parser["top"]["ordinal"];
}
}
elseif (!$this->_is_rdf_property_element($local_name)) {
$this->_report_warning("unknown or out of context rdf property element: " . $local_name);
return;
}
}
$buffer = $namespace_uri;
if (($namespace_uri == self::RDF_NAMESPACE_URI) && ($local_name == self::RDF_LI)) {
//$ordinal=self::EMPTY_STRING;
$this->rdf_parser["top"]["parent"]["members"]++;
$this->rdf_parser["top"]["ordinal"] = $this->rdf_parser["top"]["parent"]["members"];
$this->rdf_parser["top"]["ordinal"] = $this->rdf_parser["top"]["ordinal"];
//$ordinal{ 0 } = self::UNDERSCORE ;
$buffer .= self::UNDERSCORE . $this->rdf_parser["top"]["ordinal"];
}
else {
$buffer .= $local_name;
}
$this->rdf_parser["top"]["predicate"] = $buffer;
$this->rdf_parser["top"]["has_property_attributes"] = false;
$this->rdf_parser["top"]["has_member_attributes"] = false;
for ($i = 0;isset($attributes[$i]);$i += 2) {
$this->_split_name($attributes[$i], $buffer, strlen($buffer) , $attribute_namespace_uri, $attribute_local_name);
$attribute_value = $attributes[$i + 1];
// if the attribute is not in any namespace
// or the attribute is in the RDF namespace
if (($attribute_namespace_uri == self::EMPTY_STRING) || ($attribute_namespace_uri == self::RDF_NAMESPACE_URI)) {
if (($attribute_local_name == self::RDF_ID)) {
$statement_id = $attribute_value;
}
elseif ($attribute_local_name == self::RDF_PARSE_TYPE) {
$parse_type = $attribute_value;
}
elseif ($attribute_local_name == self::RDF_RESOURCE) {
$resource = $attribute_value;
}
elseif ($attribute_local_name == self::RDF_BAG_ID) {
$bag_id = $attribute_value;
}
elseif ($this->_is_rdf_property_attribute($attribute_local_name)) {
$this->rdf_parser["top"]["has_property_attributes"] = true;
}
else {
$this->_report_warning("unknown rdf attribute: " . $attribute_local_name);
return;
}
}
elseif ($attribute_namespace_uri == self::XML_NAMESPACE_URI) {
if ($attribute_local_name == self::XML_LANG) {
$this->rdf_parser["top"]["xml_lang"] = $attribute_value;
}
}
elseif ($attribute_namespace_uri) {
$this->rdf_parser["top"]["has_property_attributes"] = true;
}
}
// this isn't allowed by the M&S but I think it should be
if ($statement_id && $resource) {
$this->_report_warning("rdf:ID and rdf:resource are mutually exclusive");
return;
}
if ($statement_id) {
$this->_resolve_id($statement_id, $buffer, strlen($buffer));
$this->rdf_parser["top"]["statement_id"] = $buffer;
}
if ($parse_type) {
if ($resource) {
$this->_report_warning("property elements with rdf:parseType do not allow rdf:resource");
return;
}
if ($bag_id) {
$this->_report_warning("property elements with rdf:parseType do not allow rdf:bagID");
return;
}
if ($this->rdf_parser["top"]["has_property_attributes"]) {
$this->_report_warning("property elements with rdf:parseType do not allow property attributes");
return;
}
if ($attribute_value == self::RDF_PARSE_TYPE_RESOURCE) {
$this->_generate_anonymous_uri($buffer, strlen($buffer));
// since we are sure that this is now a resource property we can report it
$this->_report_statement(
$this->rdf_parser["top"]["parent"]["subject_type"],
$this->rdf_parser["top"]["parent"]["subject"],
$this->rdf_parser["top"]["predicate"],
0,
self::RDF_OBJECT_TYPE_RESOURCE,
$buffer,
self::EMPTY_STRING,
$this->rdf_parser["top"]["parent"]["bag_id"],
$this->rdf_parser["top"]["parent"]["statements"],
$statement_id
);
$this->_push_element();
$this->rdf_parser["top"]["state"] = self::IN_PROPERTY_PARSE_TYPE_RESOURCE;
$this->rdf_parser["top"]["subject_type"] = self::RDF_SUBJECT_TYPE_ANONYMOUS;
$this->rdf_parser["top"]["subject"] = $buffer;
$this->rdf_parser["top"]["bag_id"] = self::EMPTY_STRING;
}
else {
$this->_report_statement(
$this->rdf_parser["top"]["parent"]["subject_type"],
$this->rdf_parser["top"]["parent"]["subject"],
$this->rdf_parser["top"]["predicate"],
0,
self::RDF_OBJECT_TYPE_XML,
self::EMPTY_STRING,
self::EMPTY_STRING,
$this->rdf_parser["top"]["parent"]["bag_id"],
$this->rdf_parser["top"]["parent"]["statements"],
$statement_id
);
$this->rdf_parser["top"]["state"] = self::IN_PROPERTY_PARSE_TYPE_LITERAL;
$this->_report_start_parse_type_literal();
}
}
elseif ($resource || $bag_id || $this->rdf_parser["top"]["has_property_attributes"]) {
if ($resource != self::EMPTY_STRING) {
$subject_type = self::RDF_SUBJECT_TYPE_URI;
$this->_resolve_uri_reference($this->rdf_parser["base_uri"], $resource, $buffer, strlen($buffer));
}
else {
$subject_type = self::RDF_SUBJECT_TYPE_ANONYMOUS;
$this->_generate_anonymous_uri($buffer, strlen($buffer));
}
$this->rdf_parser["top"]["state"] = self::IN_PROPERTY_EMPTY_RESOURCE;
// since we are sure that this is now a resource property we can report it.
$this->_report_statement(
$this->rdf_parser["top"]["parent"]["subject_type"],
$this->rdf_parser["top"]["parent"]["subject"],
$this->rdf_parser["top"]["predicate"],
$this->rdf_parser["top"]["ordinal"],
self::RDF_OBJECT_TYPE_RESOURCE,
$buffer,
self::EMPTY_STRING,
$this->rdf_parser["top"]["parent"]["bag_id"],
$this->rdf_parser["top"]["parent"]["statements"],
self::EMPTY_STRING
); // should we allow IDs?
if ($bag_id) {
$this->_resolve_id($bag_id, $buffer, strlen($buffer));
$this->rdf_parser["top"]["bag_id"] = $buffer;
}
if ($this->rdf_parser["top"]["has_property_attributes"]) {
$this->_handle_property_attributes(
$subject_type,
$buffer,
$attributes,
$this->rdf_parser["top"]["xml_lang"],
$this->rdf_parser["top"]["bag_id"],
$this->rdf_parser["top"]["statements"]
);
}
}
}
private function _start_element_handler($parser, $name, $attributes) {
$buffer = self::EMPTY_STRING;
$namespace_uri = self::EMPTY_STRING;
$local_name = self::EMPTY_STRING;
$this->_push_element();
$this->_split_name($name, $buffer, strlen($buffer) , $namespace_uri, $local_name);
switch ($this->rdf_parser["top"]["state"]) {
case self::IN_TOP_LEVEL:
if (self::RDF_NAMESPACE_URI . self::NAMESPACE_SEPARATOR_STRING . self::RDF_RDF == $name) {
$this->rdf_parser["top"]["state"] = self::IN_RDF;
}
else {
$this->_report_start_element($name, $attributes);
}
break;
case self::IN_RDF:
$this->rdf_parser["top"]["state"] = self::IN_DESCRIPTION;
$this->_handle_resource_element($namespace_uri, $local_name, $attributes, self::EMPTY_STRING);
break;
case self::IN_DESCRIPTION:
case self::IN_PROPERTY_PARSE_TYPE_RESOURCE:
$this->rdf_parser["top"]["state"] = self::IN_PROPERTY_UNKNOWN_OBJECT;
$this->_handle_property_element($namespace_uri, $local_name, $attributes);
break;
case self::IN_PROPERTY_UNKNOWN_OBJECT:
/* if we're in a property with an unknown object type and we encounter
an element, the object must be a resource, */
$this->rdf_parser["top"]["data"] = self::EMPTY_STRING;
$this->rdf_parser["top"]["parent"]["state"] = self::IN_PROPERTY_RESOURCE;
$this->rdf_parser["top"]["state"] = self::IN_DESCRIPTION;
$this->_handle_resource_element(
$namespace_uri,
$local_name,
$attributes,
$this->rdf_parser["top"]["parent"]
);
break;
case self::IN_PROPERTY_LITERAL:
$this->_report_warning("no markup allowed in literals");
break;
case self::IN_PROPERTY_PARSE_TYPE_LITERAL:
$this->rdf_parser["top"]["state"] = self::IN_XML;
/* fall through */
case self::IN_XML:
$this->_report_start_element($name, $attributes);
break;
case self::IN_PROPERTY_RESOURCE:
$this->_report_warning("only one element allowed inside a property element");
break;
case self::IN_PROPERTY_EMPTY_RESOURCE:
$this->_report_warning("no content allowed in property with rdf:resource, rdf:bagID, or property attributes");
break;
case self::IN_UNKNOWN:
break;
}
}
/*
this is only called when we're in the self::IN_PROPERTY_UNKNOWN_OBJECT state.
the only time we won't know what type of object a statement has is
when we encounter property statements without property attributes or
content:
notice that the state doesn't switch to self::IN_PROPERTY_LITERAL when
there is only whitespace between the start and end tags. this isn't
a very useful statement since the object is anonymous and can't
have any statements with it as the subject but it is allowed.
*/
private function _end_empty_resource_property() {
$buffer = self::EMPTY_STRING;
$this->_generate_anonymous_uri($buffer, strlen($buffer));
$this->_report_statement(
$this->rdf_parser["top"]["parent"]["subject_type"],
$this->rdf_parser["top"]["parent"]["subject"],
$this->rdf_parser["top"]["predicate"],
$this->rdf_parser["top"]["ordinal"],
self::RDF_OBJECT_TYPE_RESOURCE,
$buffer, $this->rdf_parser["top"]["xml_lang"],
$this->rdf_parser["top"]["parent"]["bag_id"],
$this->rdf_parser["top"]["parent"]["statements"],
$this->rdf_parser["top"]["statement_id"]
);
}
/*
property elements with text only as content set the state to
self::IN_PROPERTY_LITERAL. as character data is received from expat,
it is saved in a buffer and reported when the end tag is
received.
*/
private function _end_literal_property() {
if (!isset($this->rdf_parser["top"]["statement_id"])) {
$this->rdf_parser["top"]["statement_id"] = self::EMPTY_STRING;
}
if (!isset($this->rdf_parser["top"]["parent"]["subject_type"])) {
$this->rdf_parser["top"]["parent"]["subject_type"] = self::EMPTY_STRING;
}
if (!isset($this->rdf_parser["top"]["parent"]["subject"])) {
$this->rdf_parser["top"]["parent"]["subject"] = self::EMPTY_STRING;
}
if (!isset($this->rdf_parser["top"]["parent"]["bag_id"])) {
$this->rdf_parser["top"]["parent"]["bag_id"] = self::EMPTY_STRING;
}
if (!isset($this->rdf_parser["top"]["parent"]["statements"])) {
$this->rdf_parser["top"]["parent"]["statements"] = 0;
}
if (!isset($this->rdf_parser["top"]["predicate"])) {
$this->rdf_parser["top"]["predicate"] = self::EMPTY_STRING;
}
if (!isset($this->rdf_parser["top"]["ordinal"])) {
$this->rdf_parser["top"]["ordinal"] = 0;
}
$this->_report_statement(
$this->rdf_parser["top"]["parent"]["subject_type"],
$this->rdf_parser["top"]["parent"]["subject"],
$this->rdf_parser["top"]["predicate"],
$this->rdf_parser["top"]["ordinal"],
self::RDF_OBJECT_TYPE_LITERAL,
$this->rdf_parser["top"]["data"],
$this->rdf_parser["top"]["xml_lang"],
$this->rdf_parser["top"]["parent"]["bag_id"],
$this->rdf_parser["top"]["parent"]["statements"],
$this->rdf_parser["top"]["statement_id"]
);
}
private function _end_element_handler($parser, $name) {
switch ($this->rdf_parser["top"]["state"]) {
case self::IN_TOP_LEVEL:
/* fall through */
case self::IN_XML:
$this->_report_end_element($name);
break;
case self::IN_PROPERTY_UNKNOWN_OBJECT:
$this->_end_empty_resource_property();
break;
case self::IN_PROPERTY_LITERAL:
$this->_end_literal_property();
break;
case self::IN_PROPERTY_PARSE_TYPE_RESOURCE:
$this->_pop_element();
break;
case self::IN_PROPERTY_PARSE_TYPE_LITERAL:
$this->_report_end_parse_type_literal();
break;
case self::IN_RDF:
case self::IN_DESCRIPTION:
case self::IN_PROPERTY_RESOURCE:
case self::IN_PROPERTY_EMPTY_RESOURCE:
case self::IN_UNKNOWN:
break;
}
$this->_pop_element();
}
private function _character_data_handler($parser, $s) {
$len = strlen($s);
switch ($this->rdf_parser["top"]["state"]) {
case self::IN_PROPERTY_LITERAL:
case self::IN_PROPERTY_UNKNOWN_OBJECT:
if (isset($this->rdf_parser["top"]["data"])) {
$n = strlen($this->rdf_parser["top"]["data"]);
$this->rdf_parser["top"]["data"] .= $s;
}
else {
$this->rdf_parser["top"]["data"] = $s;
}
if ($this->rdf_parser["top"]["state"] == self::IN_PROPERTY_UNKNOWN_OBJECT) {
/* look for non-whitespace */
for ($i = 0;(($i < $len) && (preg_match("/ |\n|\t/", $s[$i])));$i++);
$i++;
/* if we found non-whitespace, this is a literal */
if ($i <= $len) {
$this->rdf_parser["top"]["state"] = self::IN_PROPERTY_LITERAL;
}
}
break;
case self::IN_TOP_LEVEL:
case self::IN_PROPERTY_PARSE_TYPE_LITERAL:
case self::IN_XML:
$this->_report_character_data($s, strlen($s));
break;
case self::IN_RDF:
case self::IN_DESCRIPTION:
case self::IN_PROPERTY_RESOURCE:
case self::IN_PROPERTY_EMPTY_RESOURCE:
case self::IN_PROPERTY_PARSE_TYPE_RESOURCE:
case self::IN_UNKNOWN:
break;
}
}
}
?>