localName.' element', $econf->log); $include_success = FALSE; } elseif ($src === '') { $include_success = include_uri($econf, $in_elm, $out_elm, $econf->doc->uri()); } else { $include_success = include_src($econf, $in_elm, $out_elm, $src); } if (!$include_success) { process_node($econf, $in_elm, $out_elm); } } function include_src($econf, $in_elm, $out_elm, $src) { $included_uri = resolve_include_uri($econf, $src); if ($included_uri === FALSE) { return FALSE; } return include_uri($econf, $in_elm, $out_elm, $included_uri); } function resolve_include_uri($econf, $uri_str) { $uri = parse_w2ml_uri($uri_str); if ($uri === FALSE) { log_error('Bad URI format: "'.$uri_str.'"', $econf->log); return FALSE; } $base_uri = $econf->doc_base(); $base_scheme = $base_uri['scheme']; if ($uri['scheme'] === NULL && !is_hierarchical_uri_scheme($base_scheme)) { log_error('Cannot combine partial URI "'.unparse_uri($uri). '" with URI of scheme "'.$base_scheme.'"', $econf->log); return FALSE; } return combine_uris($base_uri, $uri); } function include_uri($econf, $in_elm, $out_elm, $uri) { $type = get_w2ml_attribute_value($in_elm, 'type'); if ($type === NULL || $type === 'application/x-w2ml+xml') { return include_w2ml($econf, $in_elm, $out_elm, $uri); } elseif ($in_elm->localName === 'include' && $type === 'text/plain') { return include_text($econf, $out_elm, $uri); } else { log_error($in_elm->localName.' type="'.$type.'" not supported', $econf->log); } } function include_w2ml($econf, $in_elm, $out_elm, $uri) { if (is_recursive_include($econf, $uri)) { log_error('Recursive inclusion of "'.unparse_uri($uri).'"', $econf->log, LOG_DEBUG); return FALSE; } log_error($in_elm->localName.' "'.unparse_uri($uri).'"', $econf->log, LOG_DEBUG); try { $included_doc = document_factory($econf->req, $uri, $econf->work_directory()); } catch (Exception $e) { log_error($e->getMessage(), $econf->log, LOG_DEBUG); return FALSE; } $included_doc->including_doc = $econf->doc; if ($in_elm->localName === 'outclude') { $included_doc->outcluding_doc = $econf->doc; $included_doc->outcluding_elm = $in_elm; } else { $included_doc->outcluding_doc = $econf->doc->outcluding_doc; $included_doc->outcluding_elm = $econf->doc->outcluding_elm; } $econf->doc = $included_doc; process_node($econf, $econf->doc->dom, $out_elm); if ($econf->doc->need_save()) { save_document($econf->doc); } $econf->doc = $included_doc->including_doc; log_error('Done '.$in_elm->localName.' "'.unparse_uri($uri).'"', $econf->log, LOG_DEBUG); return TRUE; } function is_recursive_include($econf, $uri) { $d = $econf->doc; do { if ($d->uri() == $uri) { // Object comparison return TRUE; } $d = $d->including_doc; } while ($d !== NULL); return FALSE; } function include_text($econf, $out_elm, $uri) { try { $included_resource = resource_factory($uri, $econf->work_directory(), FALSE); $text = $included_resource->content(); } catch (Exception $e) { log_error('include_text() '.$e->getMessage(), $econf->log, LOG_DEBUG); return FALSE; } $text_node = $out_elm->ownerDocument->createTextNode($text); $out_elm->appendChild($text_node); return TRUE; } function process_backclude_element($econf, $in_elm, $out_elm) { $outclude = $econf->doc->outcluding_elm; if ($outclude !== NULL) { $old_doc = $econf->doc; $econf->doc = $econf->doc->outcluding_doc; process_node($econf, $outclude, $out_elm); $econf->doc = $old_doc; } else { process_node($econf, $in_elm, $out_elm); } } ?>