You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
4.5 KiB
183 lines
4.5 KiB
/* |
|
* xlink.c : implementation of the hyperlinks detection module |
|
* This version supports both XML XLinks and HTML simple links |
|
* |
|
* See Copyright for the status of this software. |
|
* |
|
* daniel@veillard.com |
|
*/ |
|
|
|
|
|
#define IN_LIBXML |
|
#include "libxml.h" |
|
|
|
#ifdef LIBXML_XPTR_ENABLED |
|
#include <string.h> /* for memset() only */ |
|
#ifdef HAVE_CTYPE_H |
|
#include <ctype.h> |
|
#endif |
|
#ifdef HAVE_STDLIB_H |
|
#include <stdlib.h> |
|
#endif |
|
#ifdef HAVE_SYS_STAT_H |
|
#include <sys/stat.h> |
|
#endif |
|
#ifdef HAVE_FCNTL_H |
|
#include <fcntl.h> |
|
#endif |
|
#ifdef HAVE_UNISTD_H |
|
#include <unistd.h> |
|
#endif |
|
#ifdef LIBXML_ZLIB_ENABLED |
|
#include <zlib.h> |
|
#endif |
|
|
|
#include <libxml/xmlmemory.h> |
|
#include <libxml/tree.h> |
|
#include <libxml/parser.h> |
|
#include <libxml/valid.h> |
|
#include <libxml/xlink.h> |
|
#include <libxml/globals.h> |
|
|
|
#define XLINK_NAMESPACE (BAD_CAST "http://www.w3.org/1999/xlink/namespace/") |
|
#define XHTML_NAMESPACE (BAD_CAST "http://www.w3.org/1999/xhtml/") |
|
|
|
/**************************************************************** |
|
* * |
|
* Default setting and related functions * |
|
* * |
|
****************************************************************/ |
|
|
|
static xlinkHandlerPtr xlinkDefaultHandler = NULL; |
|
static xlinkNodeDetectFunc xlinkDefaultDetect = NULL; |
|
|
|
/** |
|
* xlinkGetDefaultHandler: |
|
* |
|
* Get the default xlink handler. |
|
* |
|
* Returns the current xlinkHandlerPtr value. |
|
*/ |
|
xlinkHandlerPtr |
|
xlinkGetDefaultHandler(void) { |
|
return(xlinkDefaultHandler); |
|
} |
|
|
|
|
|
/** |
|
* xlinkSetDefaultHandler: |
|
* @handler: the new value for the xlink handler block |
|
* |
|
* Set the default xlink handlers |
|
*/ |
|
void |
|
xlinkSetDefaultHandler(xlinkHandlerPtr handler) { |
|
xlinkDefaultHandler = handler; |
|
} |
|
|
|
/** |
|
* xlinkGetDefaultDetect: |
|
* |
|
* Get the default xlink detection routine |
|
* |
|
* Returns the current function or NULL; |
|
*/ |
|
xlinkNodeDetectFunc |
|
xlinkGetDefaultDetect (void) { |
|
return(xlinkDefaultDetect); |
|
} |
|
|
|
/** |
|
* xlinkSetDefaultDetect: |
|
* @func: pointer to the new detection routine. |
|
* |
|
* Set the default xlink detection routine |
|
*/ |
|
void |
|
xlinkSetDefaultDetect (xlinkNodeDetectFunc func) { |
|
xlinkDefaultDetect = func; |
|
} |
|
|
|
/**************************************************************** |
|
* * |
|
* The detection routines * |
|
* * |
|
****************************************************************/ |
|
|
|
|
|
/** |
|
* xlinkIsLink: |
|
* @doc: the document containing the node |
|
* @node: the node pointer itself |
|
* |
|
* Check whether the given node carries the attributes needed |
|
* to be a link element (or is one of the linking elements issued |
|
* from the (X)HTML DtDs). |
|
* This routine don't try to do full checking of the link validity |
|
* but tries to detect and return the appropriate link type. |
|
* |
|
* Returns the xlinkType of the node (XLINK_TYPE_NONE if there is no |
|
* link detected. |
|
*/ |
|
xlinkType |
|
xlinkIsLink (xmlDocPtr doc, xmlNodePtr node) { |
|
xmlChar *type = NULL, *role = NULL; |
|
xlinkType ret = XLINK_TYPE_NONE; |
|
|
|
if (node == NULL) return(XLINK_TYPE_NONE); |
|
if (doc == NULL) doc = node->doc; |
|
if ((doc != NULL) && (doc->type == XML_HTML_DOCUMENT_NODE)) { |
|
/* |
|
* This is an HTML document. |
|
*/ |
|
} else if ((node->ns != NULL) && |
|
(xmlStrEqual(node->ns->href, XHTML_NAMESPACE))) { |
|
/* |
|
* !!!! We really need an IS_XHTML_ELEMENT function from HTMLtree.h @@@ |
|
*/ |
|
/* |
|
* This is an XHTML element within an XML document |
|
* Check whether it's one of the element able to carry links |
|
* and in that case if it holds the attributes. |
|
*/ |
|
} |
|
|
|
/* |
|
* We don't prevent a-priori having XML Linking constructs on |
|
* XHTML elements |
|
*/ |
|
type = xmlGetNsProp(node, BAD_CAST"type", XLINK_NAMESPACE); |
|
if (type != NULL) { |
|
if (xmlStrEqual(type, BAD_CAST "simple")) { |
|
ret = XLINK_TYPE_SIMPLE; |
|
} else if (xmlStrEqual(type, BAD_CAST "extended")) { |
|
role = xmlGetNsProp(node, BAD_CAST "role", XLINK_NAMESPACE); |
|
if (role != NULL) { |
|
xmlNsPtr xlink; |
|
xlink = xmlSearchNs(doc, node, XLINK_NAMESPACE); |
|
if (xlink == NULL) { |
|
/* Humm, fallback method */ |
|
if (xmlStrEqual(role, BAD_CAST"xlink:external-linkset")) |
|
ret = XLINK_TYPE_EXTENDED_SET; |
|
} else { |
|
xmlChar buf[200]; |
|
snprintf((char *) buf, sizeof(buf), "%s:external-linkset", |
|
(char *) xlink->prefix); |
|
buf[sizeof(buf) - 1] = 0; |
|
if (xmlStrEqual(role, buf)) |
|
ret = XLINK_TYPE_EXTENDED_SET; |
|
|
|
} |
|
|
|
} |
|
ret = XLINK_TYPE_EXTENDED; |
|
} |
|
} |
|
|
|
if (type != NULL) xmlFree(type); |
|
if (role != NULL) xmlFree(role); |
|
return(ret); |
|
} |
|
#endif /* LIBXML_XPTR_ENABLED */ |
|
#define bottom_xlink |
|
#include "elfgcchack.h"
|
|
|