| OLD | NEW |
| (Empty) |
| 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@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" | |
| OLD | NEW |