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