File:
[Public] /
Amaya /
amaya /
fetchXMLname.c
Revision
1.50:
download - view:
text,
annotated -
select for diffs
Mon Sep 17 13:19:40 2001 UTC (22 years, 9 months ago) by
cvs
Branches:
MAIN
CVS tags:
HEAD
- Progress on the generic-XML support in Amaya (generation of the default presentation rules for the structure view and the formatted view).
- While amaya doesn't support completely generic-XML, we create an "unknown element/attribute" for each elem/attr that belongs to a not-supported namespace. The unknown elem/attr are shown in the structure view (with a different color) and saved with their original name. As a result, Amaya no longer stops the parsing processus when a not-supported namespace is found in a document.
Laurent
/*
*
* (c) COPYRIGHT MIT and INRIA, 1996-2001
* Please first read the full copyright statement in file COPYRIGHT.
*
*/
/*
*
* fetchXMLname
*
* Authors: I. Vatton
* L. Carcone
*
*/
#define THOT_EXPORT extern
#include "amaya.h"
#include "parser.h"
#include "HTMLnames.h"
#include "MathMLnames.h"
#include "SVGnames.h"
#include "XLinknames.h"
/* define some pointers to let other parser functions access the local table */
int HTML_ENTRIES = (sizeof(XHTMLElemMappingTable) / sizeof(ElemMapping));
ElemMapping *pHTMLGIMapping = XHTMLElemMappingTable;
AttributeMapping *pHTMLAttributeMapping = XHTMLAttributeMappingTable;
XmlEntity *pXhtmlEntityTable = XhtmlEntityTable;
XmlEntity *pMathEntityTable = MathEntityTable;
#include "fetchXMLname_f.h"
/* Global variables used by the entity mapping */
static int XHTMLSup = 0;
static int MathSup = 0;
/*----------------------------------------------------------------------
GetXHTMLSSchema returns the XHTML Thot schema for document doc.
----------------------------------------------------------------------*/
SSchema GetXHTMLSSchema (Document doc)
{
SSchema XHTMLSSchema;
XHTMLSSchema = TtaGetSSchema ("HTML", doc);
if (XHTMLSSchema == NULL)
XHTMLSSchema = TtaNewNature(doc, TtaGetDocumentSSchema(doc),
"HTML", "HTMLP");
return (XHTMLSSchema);
}
/*----------------------------------------------------------------------charName
GetMathMLSSchema returns the MathML Thot schema for document doc.
----------------------------------------------------------------------*/
SSchema GetMathMLSSchema (Document doc)
{
SSchema MathMLSSchema;
MathMLSSchema = TtaGetSSchema ("MathML", doc);
if (MathMLSSchema == NULL)
MathMLSSchema = TtaNewNature(doc,
TtaGetDocumentSSchema(doc),
"MathML", "MathMLP");
return (MathMLSSchema);
}
/*----------------------------------------------------------------------
GetSVGSSchema returns the SVG Thot schema for document doc.
----------------------------------------------------------------------*/
SSchema GetSVGSSchema (Document doc)
{
SSchema SVGSSchema;
SVGSSchema = TtaGetSSchema ("SVG", doc);
if (SVGSSchema == NULL)
SVGSSchema = TtaNewNature(doc,
TtaGetDocumentSSchema(doc),
"SVG", "SVGP");
return (SVGSSchema);
}
/*----------------------------------------------------------------------
GetXLinkSSchema returns the XLink Thot schema for document doc.
----------------------------------------------------------------------*/
SSchema GetXLinkSSchema (Document doc)
{
SSchema XLinkSSchema;
XLinkSSchema = TtaGetSSchema ("XLink", doc);
if (XLinkSSchema == NULL)
XLinkSSchema = TtaNewNature(doc, TtaGetDocumentSSchema(doc),
"XLink", "XLinkP");
return (XLinkSSchema);
}
/*----------------------------------------------------------------------
GetGenericXMLSSchema returns the XML Thot schema for the document doc.
----------------------------------------------------------------------*/
SSchema GetGenericXMLSSchema (Document doc)
{
SSchema XMLSSchema;
XMLSSchema = TtaGetSSchema ("XML", doc);
if (XMLSSchema == NULL)
XMLSSchema = TtaNewNature(doc, TtaGetDocumentSSchema(doc),
"XML", "XMLP");
return (XMLSSchema);
}
/*----------------------------------------------------------------------
GetGenericXMLSSchemaByUri returns the XML Thot schema for the document doc.
----------------------------------------------------------------------*/
SSchema GetGenericXMLSSchemaByUri (char *uriName, Document doc, ThotBool *isnew)
{
SSchema XMLSSchema;
XMLSSchema = TtaGetSSchemaByUri (uriName, doc);
if (XMLSSchema == NULL)
{
XMLSSchema = TtaNewNature(doc, TtaGetDocumentSSchema(doc),
"XML", "XMLP");
*isnew = TRUE;
}
return (XMLSSchema);
}
/*----------------------------------------------------------------------
GetXMLSSchema returns the XML Thot schema for document doc.
----------------------------------------------------------------------*/
SSchema GetXMLSSchema (int XMLtype, Document doc)
{
if (XMLtype == XHTML_TYPE)
return GetXHTMLSSchema (doc);
else if (XMLtype == MATH_TYPE)
return GetMathMLSSchema (doc);
else if (XMLtype == GRAPH_TYPE)
return GetSVGSSchema (doc);
else if (XMLtype == XLINK_TYPE)
return GetXLinkSSchema (doc);
else
return NULL;
}
/*----------------------------------------------------------------------
MapXMLElementType
Generic function which searchs in the Element Mapping table, selected
by the parameter XMLtype, the entry XMLname and returns the corresponding
Thot element type.
Returns:
- ElTypeNum and ElSSchema into elType ElTypeNum = 0 if not found.
- content
----------------------------------------------------------------------*/
void MapXMLElementType (int XMLtype,
char *XMLname,
ElementType *elType,
char **mappedName,
char *content,
ThotBool *highEnoughLevel,
Document doc)
{
int i;
ElemMapping *ptr;
/* Initialize variables */
*mappedName = NULL;
*highEnoughLevel = TRUE;
elType->ElTypeNum = 0;
/* Select the right table */
if (XMLtype == XHTML_TYPE)
ptr = XHTMLElemMappingTable;
else if (XMLtype == MATH_TYPE)
{
if (ParsingLevel[doc] == L_Basic && DocumentTypes[doc] == docHTML)
{
/* Maths are not allowed in this document */
ptr = NULL;
*highEnoughLevel = FALSE;
}
else
ptr = MathMLElemMappingTable;
}
else if (XMLtype == GRAPH_TYPE)
{
if (ParsingLevel[doc] == L_Basic && DocumentTypes[doc] == docHTML)
{
/* Graphics are not allowed in this document */
ptr = NULL;
*highEnoughLevel = FALSE;
}
else
ptr = SVGElemMappingTable;
}
else
ptr = NULL;
if (ptr != NULL)
{
/* search in the ElemMappingTable */
i = 0;
/* look for the first concerned entry in the table */
while (ptr[i].XMLname[0] < XMLname[0] && ptr[i].XMLname[0] != EOS)
i++;
/* look at all entries starting with the right character */
do
if (strcmp (ptr[i].XMLname, XMLname))
/* it's not the tag */
i++;
else if (ParsingLevel[doc] != L_Other &&
!(ptr[i].Level & ParsingLevel[doc]))
{
/* this tag is not valid for the current parsing level */
*highEnoughLevel = FALSE;
i++;
}
else
{
elType->ElTypeNum = ptr[i].ThotType;
if (elType->ElSSchema == NULL)
elType->ElSSchema = GetXMLSSchema (XMLtype, doc);
*mappedName = ptr[i].XMLname;
*content = ptr[i].XMLcontents;
}
while (elType->ElTypeNum <= 0 && ptr[i].XMLname[0] == XMLname[0]);
}
}
/*----------------------------------------------------------------------
GetXMLElementName
Generic function which searchs in the mapping table the XML name for
a given Thot type.
----------------------------------------------------------------------*/
char* GetXMLElementName (ElementType elType, Document doc)
{
ElemMapping *ptr;
char *name;
int i;
ThotBool invalid = FALSE;
if (elType.ElTypeNum > 0)
{
i = 0;
/* Select the table which matches with the element schema */
name = TtaGetSSchemaName (elType.ElSSchema);
if (strcmp ("MathML", name) == 0)
ptr = MathMLElemMappingTable;
else if (strcmp ("SVG", name) == 0)
ptr = SVGElemMappingTable;
else
ptr = XHTMLElemMappingTable;
if (ptr)
do
{
if (ptr[i].ThotType == elType.ElTypeNum)
{
if (doc == 0 ||
ParsingLevel[doc] == L_Other ||
(ptr[i].Level & ParsingLevel[doc]))
return ptr[i].XMLname;
else
invalid = TRUE;
}
i++;
}
while (ptr[i].XMLname[0] != EOS);
}
if (invalid)
return "";
else
return "???";
}
/*----------------------------------------------------------------------
IsXMLElementInline
Generic function which searchs in the mapping table if a given
Thot type is an inline character or not
----------------------------------------------------------------------*/
ThotBool IsXMLElementInline (ElementType elType)
{
int i;
ThotBool ret = FALSE;
char *name;
ElemMapping *ptr;
if (elType.ElTypeNum > 0)
{
i = 0;
/* Select the table which matches with the element schema */
name = TtaGetSSchemaName (elType.ElSSchema);
if (strcmp ("MathML", name) == 0)
ptr = MathMLElemMappingTable;
else if (strcmp ("SVG", name) == 0)
ptr = SVGElemMappingTable;
else
ptr = XHTMLElemMappingTable;
if (ptr)
{
while (ptr[i].XMLname[0] != EOS &&
ptr[i].ThotType != elType.ElTypeNum)
i++;
if (ptr[i].ThotType == elType.ElTypeNum)
ret = ptr[i].Inline;
}
}
return ret;
}
/*----------------------------------------------------------------------
MapXMLAttribute
Generic function which searchs in the Attribute Mapping Table (table)
the entry attrName associated to the element elementName.
Returns the corresponding entry or -1.
----------------------------------------------------------------------*/
int MapXMLAttribute (int XMLtype, char *attrName,
char *elementName, ThotBool *highEnoughLevel,
Document doc, int *thotType)
{
int i;
AttributeMapping *ptr;
/* Initialization */
*highEnoughLevel = TRUE;
i = 1;
*thotType = 0;
/* Select the right table */
if (XMLtype == XHTML_TYPE)
ptr = XHTMLAttributeMappingTable;
else if (XMLtype == MATH_TYPE)
ptr = MathMLAttributeMappingTable;
else if (XMLtype == GRAPH_TYPE)
ptr = SVGAttributeMappingTable;
else if (XMLtype == XLINK_TYPE)
ptr = XLinkAttributeMappingTable;
else
ptr = NULL;
if (ptr == NULL)
return -1;
if (strcmp (attrName, "unknown_attr") == 0)
{
*thotType = ptr[0].ThotAttribute;
return 0;
}
/* look for the first concerned entry in the table */
while (ptr[i].XMLattribute[0] < attrName[0] &&
ptr[i].XMLattribute[0] != EOS)
i++;
while (ptr[i].XMLattribute[0] == attrName[0])
{
if (strcmp (ptr[i].XMLattribute, attrName) ||
(ptr[i].XMLelement[0] != EOS &&
strcmp (ptr[i].XMLelement, elementName)))
i++;
else if (ParsingLevel[doc] != L_Other &&
!(ptr[i].Level & ParsingLevel[doc]))
{
*highEnoughLevel = FALSE;
i++;
}
else
{
*thotType = ptr[i].ThotAttribute;
return (i);
}
}
return (-1);
}
/*----------------------------------------------------------------------
GetXMLAttributeName
Generic function which searchs in the mapping table the XML name for
a given Thot type.
----------------------------------------------------------------------*/
char* GetXMLAttributeName (AttributeType attrType,
ElementType elType,
Document doc)
{
AttributeMapping *ptr;
char *name, *tag;
int i;
ThotBool invalid = FALSE;
if (attrType.AttrTypeNum > 0)
{
/* get the specific element tag */
if (elType.ElTypeNum > 0)
tag = GetXMLElementName (elType, doc);
else
tag = "";
i = 0;
/* Select the table which matches with the element schema */
name = TtaGetSSchemaName (attrType.AttrSSchema);
if (strcmp ("MathML", name) == 0)
ptr = MathMLAttributeMappingTable;
else if (strcmp ("SVG", name) == 0)
ptr = SVGAttributeMappingTable;
else if (strcmp ("XLink", name) == 0)
ptr = XLinkAttributeMappingTable;
else
ptr = XHTMLAttributeMappingTable;
if (ptr)
do
{
if (ptr[i].ThotAttribute == attrType.AttrTypeNum &&
(ptr[i].XMLelement[0] == EOS ||
!strcmp (ptr[i].XMLelement, tag)))
{
if (doc != 0 &&
ParsingLevel[doc] != L_Other &&
!(ptr[i].Level & ParsingLevel[doc]))
invalid = TRUE;
else
return ptr[i].XMLattribute;
}
i++;
}
while (ptr[i].XMLattribute[0] != EOS);
}
if (invalid)
return "";
else
return "???";
}
/*----------------------------------------------------------------------
MapXMLEntity
Generic function which searchs in the Entity Mapping Table (table)
the entry entityName and give the corresponding decimal value.
Returns FALSE if entityName is not found.
----------------------------------------------------------------------*/
ThotBool MapXMLEntity (int XMLtype, char *entityName, int *entityValue)
{
XmlEntity *ptr;
ThotBool found;
int inf, sup, med, rescomp;
/* Initialization */
found = FALSE;
sup = 0;
/* Select the right table */
if (XMLtype == XHTML_TYPE)
{
ptr = XhtmlEntityTable;
if (XHTMLSup == 0)
for (XHTMLSup = 0; ptr[XHTMLSup].charCode > 0; XHTMLSup++);
sup = XHTMLSup;
}
else if (XMLtype == MATH_TYPE)
{
ptr = MathEntityTable;
if (MathSup == 0)
for (MathSup = 0; ptr[MathSup].charCode > 0; MathSup++);
sup = MathSup;
}
else
ptr = NULL;
if (ptr == NULL)
return found;
inf = 0;
while (sup >= inf && !found)
/* Dichotomic research */
{
med = (sup + inf) / 2;
rescomp = strcmp (ptr[med].charName, entityName);
if (rescomp == 0)
{
/* entity found */
*entityValue = ptr[med].charCode;
found = TRUE;
}
else
{
if (rescomp > 0)
sup = med - 1;
else
inf = med + 1;
}
}
return found;
}
/*----------------------------------------------------------------------
MapEntityByCode
Generic function which searchs in the Entity Mapping Table (table)
the entry with code entityValue and give the corresponding name.
Returns FALSE if entityValue is not found.
----------------------------------------------------------------------*/
void MapEntityByCode (int entityValue, char **entityName)
{
XmlEntity *ptr;
ThotBool found;
int i;
/* Select the right table */
ptr = XhtmlEntityTable;
if (ptr)
{
/* look for in the HTML entities table */
found = FALSE;
while (ptr && !found)
{
for (i = 0; ptr[i].charCode >= 0 && !found; i++)
found = (ptr[i].charCode == entityValue);
if (found)
{
/* entity value found */
i--;
*entityName = (char *) (ptr[i].charName);
}
else if (ptr != MathEntityTable)
/* look for in the Math entities table */
ptr = MathEntityTable;
else
{
*entityName = NULL;
ptr = NULL;
}
}
}
else
*entityName = NULL;
}
Webmaster