File:  [Public] / Amaya / amaya / fetchXMLname.c
Revision 1.11: download - view: text, annotated - select for diffs
Fri Mar 17 12:24:36 2000 UTC (24 years, 3 months ago) by cvs
Branches: MAIN
CVS tags: HEAD
New features: Browsing and saving HTML files according to the charset.
              Charset may be given by the http header or the http-equiv
              element.

Ramzi.

/*
 *
 *  (c) COPYRIGHT MIT and INRIA, 1996.
 *  Please first read the full copyright statement in file COPYRIGHT.
 *
 */
 
/*
 *
 * fetchXMLname
 *
 * Author: I. Vatton
 *
 */

#define THOT_EXPORT extern
#include "amaya.h"
#include "parser.h"
 
/* mapping table of MathML elements */
#include "MathML.h"
static ElemMapping    MathMLElemMappingTable[] =
{
   /* This table MUST be in alphabetical order */
   {TEXT("XMLcomment"), SPACE, MathML_EL_XMLcomment},
   {TEXT("XMLcomment_line"), SPACE, MathML_EL_XMLcomment_line},
   {TEXT("maligngroup"), 'E', MathML_EL_MALIGNGROUP},
   {TEXT("malignmark"), 'E', MathML_EL_MALIGNMARK},
   {TEXT("mchar"), 'E', MathML_EL_MCHAR},
   {TEXT("menclose"), SPACE, MathML_EL_MENCLOSE},
   {TEXT("merror"), SPACE, MathML_EL_MERROR},
   {TEXT("mf"), SPACE, MathML_EL_MF},  /* for compatibility with an old version of
				    MathML: WD-math-970704 */
   {TEXT("mfenced"), SPACE, MathML_EL_MFENCED},
   {TEXT("mfrac"), SPACE, MathML_EL_MFRAC},
   {TEXT("mglyph"), 'E', MathML_EL_MGLYPH},
   {TEXT("mi"), SPACE, MathML_EL_MI},
   {TEXT("mlabeledtr"), SPACE, MathML_EL_MLABELEDTR},
   {TEXT("mmultiscripts"), SPACE, MathML_EL_MMULTISCRIPTS},
   {TEXT("mn"), SPACE, MathML_EL_MN},
   {TEXT("mo"), SPACE, MathML_EL_MO},
   {TEXT("mover"), SPACE, MathML_EL_MOVER},
   {TEXT("mpadded"), SPACE, MathML_EL_MPADDED},
   {TEXT("mphantom"), SPACE, MathML_EL_MPHANTOM},
   {TEXT("mprescripts"), SPACE, MathML_EL_PrescriptPairs},
   {TEXT("mroot"), SPACE, MathML_EL_MROOT},
   {TEXT("mrow"), SPACE, MathML_EL_MROW},
   {TEXT("ms"), SPACE, MathML_EL_MS},
   {TEXT("mspace"), 'E', MathML_EL_MSPACE},
   {TEXT("msqrt"), SPACE, MathML_EL_MSQRT},
   {TEXT("mstyle"), SPACE, MathML_EL_MSTYLE},
   {TEXT("msub"), SPACE, MathML_EL_MSUB},
   {TEXT("msubsup"), SPACE, MathML_EL_MSUBSUP},
   {TEXT("msup"), SPACE, MathML_EL_MSUP},
   {TEXT("mtable"), SPACE, MathML_EL_MTABLE},
   {TEXT("mtd"), SPACE, MathML_EL_MTD},
   {TEXT("mtext"), SPACE, MathML_EL_MTEXT},
   {TEXT("mtr"), SPACE, MathML_EL_MTR},
   {TEXT("munder"), SPACE, MathML_EL_MUNDER},
   {TEXT("munderover"), SPACE, MathML_EL_MUNDEROVER},
   {TEXT("none"), SPACE, MathML_EL_Construct},
   {TEXT("sep"), 'E', MathML_EL_SEP},
   {TEXT(""), SPACE, 0}	/* Last entry. Mandatory */
};

#ifdef GRAPHML
/* mapping table of GraphML elements */
#include "GraphML.h"
static ElemMapping    GraphMLElemMappingTable[] =
{
   /* This table MUST be in alphabetical order */
   {TEXT("XMLcomment"), SPACE, GraphML_EL_XMLcomment},
   {TEXT("XMLcomment_line"), SPACE, GraphML_EL_XMLcomment_line},
   {TEXT("circle"), SPACE, GraphML_EL_Circle},
   {TEXT("closedspline"), SPACE, GraphML_EL_ClosedSpline},
   {TEXT("group"), SPACE, GraphML_EL_Group},
   {TEXT("label"), 'X', GraphML_EL_Label},	/* see function GraphMLGetDTDName */
   {TEXT("line"), 'E', GraphML_EL_Line_},
   {TEXT("math"), 'X', GraphML_EL_Math},	/* see function GraphMLGetDTDName */
   {TEXT("oval"), SPACE, GraphML_EL_Oval},
   {TEXT("polygon"), SPACE, GraphML_EL_Polygon},
   {TEXT("polyline"), 'E', GraphML_EL_Polyline},
   {TEXT("rect"), SPACE, GraphML_EL_Rectangle},
   {TEXT("roundrect"), SPACE, GraphML_EL_RoundRect},
   {TEXT("spline"), 'E', GraphML_EL_Spline},
   {TEXT("text"), 'X', GraphML_EL_Text_},      /* see function GraphMLGetDTDName */
   {TEXT(""), SPACE, 0}	/* Last entry. Mandatory */
};
#else /* GRAPHML */
/* there is no mapping table of GraphML elements */

static ElemMapping *GraphMLElemMappingTable = NULL;
#endif /* GRAPHML */

#include "fetchXMLname_f.h"

/*----------------------------------------------------------------------
   GetMathMLSSchema returns the MathML Thot schema for document doc.
  ----------------------------------------------------------------------*/
#ifdef __STDC__
SSchema            GetMathMLSSchema (Document doc)
#else
SSchema            GetMathMLSSchema (doc)
Document	   doc;

#endif
{
  SSchema	MathMLSSchema;

   MathMLSSchema = TtaGetSSchema (TEXT("MathML"), doc);
   if (MathMLSSchema == NULL)
      MathMLSSchema = TtaNewNature(TtaGetDocumentSSchema(doc), TEXT("MathML"), TEXT("MathMLP"));
   return (MathMLSSchema);
}

/*----------------------------------------------------------------------
   GetGraphMLSSchema returns the GraphML Thot schema for document doc.
  ----------------------------------------------------------------------*/
#ifdef __STDC__
SSchema            GetGraphMLSSchema (Document doc)
#else
SSchema            GetGraphMLSSchema (doc)
Document	   doc;

#endif
{
  SSchema	GraphMLSSchema;

  GraphMLSSchema = TtaGetSSchema (TEXT("GraphML"), doc);
  if (GraphMLSSchema == NULL)
    GraphMLSSchema = TtaNewNature(TtaGetDocumentSSchema(doc), TEXT("GraphML"), TEXT("GraphMLP"));
  return (GraphMLSSchema);
}

/*----------------------------------------------------------------------
   GetXMLSSchema returns the XMLML Thot schema for document doc.
  ----------------------------------------------------------------------*/
#ifdef __STDC__
SSchema            GetXMLSSchema (int XMLtype, Document doc)
#else
SSchema            GetXMLSSchema (XMLtype, doc)
Document	   doc;
int                XMLtype;
#endif
{
   if (XMLtype == MATH_TYPE)
     return GetMathMLSSchema (doc);
   else if (XMLtype == GRAPH_TYPE)
     return GetGraphMLSSchema (doc);
   else
     return NULL;
}


/*----------------------------------------------------------------------
   MapXMLElementType
   search in the mapping tables the entry for the element type of name
   XMLname and returns the corresponding Thot element type.
   Returns:
    - ElTypeNum and ElSSchema inelType  ElTypeNum = 0 if not found.
    - content 
  ----------------------------------------------------------------------*/
#ifdef __STDC__
void               MapXMLElementType (int XMLtype, CHAR_T* XMLname, ElementType *elType, CHAR_T** mappedName, CHAR_T* content, Document doc)
#else
void               MapXMLElementType (XMLtype, XMLname, elType, mappedName, content, doc)
int                XMLtype;
CHAR_T*            XMLname;
ElementType*       elType;
CHAR_T**           mappedName;
CHAR_T* 	       content;
Document           doc;
#endif
{
   int                 i;
   ElemMapping        *ptr;

   /* Select the right table */
   if (XMLtype == MATH_TYPE)
     ptr = MathMLElemMappingTable;
   else if (XMLtype == GRAPH_TYPE)
     ptr = GraphMLElemMappingTable;
   else
     ptr = NULL;

   elType->ElTypeNum = 0;
   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 (ustrcmp (ptr[i].XMLname, XMLname))
	   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
   search in the mapping tables the XML name for a given Thot type
  ----------------------------------------------------------------------*/
#ifdef __STDC__
void              GetXMLElementName (ElementType elType, CHAR_T** buffer)
#else
void              GetXMLElementName (elType, buffer)
ElementType       elType;
CHAR_T**          buffer;
#endif
{
   int                 i;
   ElemMapping        *ptr;
   STRING              name;

   if (elType.ElTypeNum > 0)
     {
	i = 0;
	/* Select the table which matches with the element schema */
	name = TtaGetSSchemaName (elType.ElSSchema);
	if (ustrcmp (TEXT("MathML"), name) == 0)
	  ptr = MathMLElemMappingTable;
	else if (ustrcmp (TEXT("GraphML"), name) == 0)
	  ptr = GraphMLElemMappingTable;
        else
	  ptr = NULL;

	if (ptr)
	  do
	    {
	    if (ptr[i].ThotType == elType.ElTypeNum)
	      {
		*buffer = ptr[i].XMLname;
		return;
	      }
	    i++;
	    }
	  while (ptr[i].XMLname[0] != EOS);	  
     }
   *buffer = TEXT("???");
   return;
}

Webmaster