Annotation of embedaddon/libxml2/xlink.c, revision 1.1
1.1 ! misho 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: } 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"
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>