Home | History | Annotate | Download | only in libxml2
      1 /*
      2  * xlink.c : implementation of the hyperlinks detection module
      3  *           This version supports both XML XLinks and HTML simple links
      4  *
      5  * See Copyright for the status of this software.
      6  *
      7  * daniel (at) veillard.com
      8  */
      9 
     10 
     11 #define IN_LIBXML
     12 #include "libxml.h"
     13 
     14 #ifdef LIBXML_XPTR_ENABLED
     15 #include <string.h> /* for memset() only */
     16 #ifdef HAVE_CTYPE_H
     17 #include <ctype.h>
     18 #endif
     19 #ifdef HAVE_STDLIB_H
     20 #include <stdlib.h>
     21 #endif
     22 #ifdef HAVE_SYS_STAT_H
     23 #include <sys/stat.h>
     24 #endif
     25 #ifdef HAVE_FCNTL_H
     26 #include <fcntl.h>
     27 #endif
     28 #ifdef HAVE_UNISTD_H
     29 #include <unistd.h>
     30 #endif
     31 #ifdef HAVE_ZLIB_H
     32 #include <zlib.h>
     33 #endif
     34 
     35 #include <libxml/xmlmemory.h>
     36 #include <libxml/tree.h>
     37 #include <libxml/parser.h>
     38 #include <libxml/valid.h>
     39 #include <libxml/xlink.h>
     40 #include <libxml/globals.h>
     41 
     42 #define XLINK_NAMESPACE (BAD_CAST "http://www.w3.org/1999/xlink/namespace/")
     43 #define XHTML_NAMESPACE (BAD_CAST "http://www.w3.org/1999/xhtml/")
     44 
     45 /****************************************************************
     46  *								*
     47  *           Default setting and related functions		*
     48  *								*
     49  ****************************************************************/
     50 
     51 static xlinkHandlerPtr xlinkDefaultHandler = NULL;
     52 static xlinkNodeDetectFunc	xlinkDefaultDetect = NULL;
     53 
     54 /**
     55  * xlinkGetDefaultHandler:
     56  *
     57  * Get the default xlink handler.
     58  *
     59  * Returns the current xlinkHandlerPtr value.
     60  */
     61 xlinkHandlerPtr
     62 xlinkGetDefaultHandler(void) {
     63     return(xlinkDefaultHandler);
     64 }
     65 
     66 
     67 /**
     68  * xlinkSetDefaultHandler:
     69  * @handler:  the new value for the xlink handler block
     70  *
     71  * Set the default xlink handlers
     72  */
     73 void
     74 xlinkSetDefaultHandler(xlinkHandlerPtr handler) {
     75     xlinkDefaultHandler = handler;
     76 }
     77 
     78 /**
     79  * xlinkGetDefaultDetect:
     80  *
     81  * Get the default xlink detection routine
     82  *
     83  * Returns the current function or NULL;
     84  */
     85 xlinkNodeDetectFunc
     86 xlinkGetDefaultDetect	(void) {
     87     return(xlinkDefaultDetect);
     88 }
     89 
     90 /**
     91  * xlinkSetDefaultDetect:
     92  * @func: pointer to the new detection routine.
     93  *
     94  * Set the default xlink detection routine
     95  */
     96 void
     97 xlinkSetDefaultDetect	(xlinkNodeDetectFunc func) {
     98     xlinkDefaultDetect = func;
     99 }
    100 
    101 /****************************************************************
    102  *								*
    103  *                  The detection routines			*
    104  *								*
    105  ****************************************************************/
    106 
    107 
    108 /**
    109  * xlinkIsLink:
    110  * @doc:  the document containing the node
    111  * @node:  the node pointer itself
    112  *
    113  * Check whether the given node carries the attributes needed
    114  * to be a link element (or is one of the linking elements issued
    115  * from the (X)HTML DtDs).
    116  * This routine don't try to do full checking of the link validity
    117  * but tries to detect and return the appropriate link type.
    118  *
    119  * Returns the xlinkType of the node (XLINK_TYPE_NONE if there is no
    120  *         link detected.
    121  */
    122 xlinkType
    123 xlinkIsLink	(xmlDocPtr doc, xmlNodePtr node) {
    124     xmlChar *type = NULL, *role = NULL;
    125     xlinkType ret = XLINK_TYPE_NONE;
    126 
    127     if (node == NULL) return(XLINK_TYPE_NONE);
    128     if (doc == NULL) doc = node->doc;
    129     if ((doc != NULL) && (doc->type == XML_HTML_DOCUMENT_NODE)) {
    130         /*
    131 	 * This is an HTML document.
    132 	 */
    133     } else if ((node->ns != NULL) &&
    134                (xmlStrEqual(node->ns->href, XHTML_NAMESPACE))) {
    135 	/*
    136 	 * !!!! We really need an IS_XHTML_ELEMENT function from HTMLtree.h @@@
    137 	 */
    138         /*
    139 	 * This is an XHTML element within an XML document
    140 	 * Check whether it's one of the element able to carry links
    141 	 * and in that case if it holds the attributes.
    142 	 */
    143     }
    144 
    145     /*
    146      * We don't prevent a-priori having XML Linking constructs on
    147      * XHTML elements
    148      */
    149     type = xmlGetNsProp(node, BAD_CAST"type", XLINK_NAMESPACE);
    150     if (type != NULL) {
    151 	if (xmlStrEqual(type, BAD_CAST "simple")) {
    152             ret = XLINK_TYPE_SIMPLE;
    153 	} else if (xmlStrEqual(type, BAD_CAST "extended")) {
    154 	    role = xmlGetNsProp(node, BAD_CAST "role", XLINK_NAMESPACE);
    155 	    if (role != NULL) {
    156 		xmlNsPtr xlink;
    157 		xlink = xmlSearchNs(doc, node, XLINK_NAMESPACE);
    158 		if (xlink == NULL) {
    159 		    /* Humm, fallback method */
    160 		    if (xmlStrEqual(role, BAD_CAST"xlink:external-linkset"))
    161 			ret = XLINK_TYPE_EXTENDED_SET;
    162 		} else {
    163 		    xmlChar buf[200];
    164 		    snprintf((char *) buf, sizeof(buf), "%s:external-linkset",
    165 			     (char *) xlink->prefix);
    166                     buf[sizeof(buf) - 1] = 0;
    167 		    if (xmlStrEqual(role, buf))
    168 			ret = XLINK_TYPE_EXTENDED_SET;
    169 
    170 		}
    171 
    172 	    }
    173 	    ret = XLINK_TYPE_EXTENDED;
    174 	}
    175     }
    176 
    177     if (type != NULL) xmlFree(type);
    178     if (role != NULL) xmlFree(role);
    179     return(ret);
    180 }
    181 #endif /* LIBXML_XPTR_ENABLED */
    182 #define bottom_xlink
    183 #include "elfgcchack.h"
    184