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