Esempio n. 1
0
		/// <summary>
		/// Create a XmlElement. This is typically called by the base class when creating a DOM tree
		/// </summary>
		/// <param name="prefix"></param>
		/// <param name="localname"></param>
		/// <param name="nsURI"></param>
		/// <returns></returns>
		public override XmlElement CreateElement(string prefix, string localname, string nsURI)
		{
			XmlElement result = null;
			switch(localname)
			{
				case "math":
					result = new MathMLMathElement(prefix, localname, nsURI, this);
					break;
				case "mi":
				case "mn":
				case "mtext":
					result = new MathMLPresentationToken(prefix, localname, nsURI, this);
					break;
				case "mo":			
					result = new MathMLOperatorElement(prefix, localname, nsURI, this);
					break;
				case "mspace":			
					result = new MathMLSpaceElement(prefix, localname, nsURI, this);
					break;
				case "ms":			
					result = new MathMLStringLitElement(prefix, localname, nsURI, this);
					break;
				case "mglyph":			
					result = new MathMLGlyphElement(prefix, localname, nsURI, this);
					break;
				case "mrow":
				case "merror":
				case "mphantom":			
					result = new MathMLPresentationContainer(prefix, localname, nsURI, this);
					break;
				case "mfrac":			
					result = new MathMLFractionElement(prefix, localname, nsURI, this);
					break;
				case "msqrt":			
				case "mroot":			
					result = new MathMLRadicalElement(prefix, localname, nsURI, this);
					break;
				case "mstyle":			
					result = new MathMLStyleElement(prefix, localname, nsURI, this);
					break;
				case "mpadded":			
					result = new MathMLPaddedElement(prefix, localname, nsURI, this);
					break;
				case "mfenced":			
					result = new MathMLFencedElement(prefix, localname, nsURI, this);
					break;
				case "menclose":			
					result = new MathMLEncloseElement(prefix, localname, nsURI, this);
					break;
				case "msub":
				case "msup":
				case "msubsup":			
					result = new MathMLScriptElement(prefix, localname, nsURI, this);
					break;
				case "munder":			
				case "mover":			
				case "munderover":			
					result = new MathMLUnderOverElement(prefix, localname, nsURI, this);
					break;
				case "mmultiscripts":			
					result = new MathMLMultiScriptsElement(prefix, localname, nsURI, this);
					break;
				case "mtable":			
					result = new MathMLTableElement(prefix, localname, nsURI, this);
					break;
				case "mlabeledtr":			
					result = new MathMLLabeledRowElement(prefix, localname, nsURI, this);
					break;
				case "mtr":			
					result = new MathMLTableRowElement(prefix, localname, nsURI, this);
					break;
				case "mtd":			
					result = new MathMLTableCellElement(prefix, localname, nsURI, this);
					break;
				case "maligngroup":			
					result = new MathMLAlignGroupElement(prefix, localname, nsURI, this);
					break;
				case "malignmark":			
					result = new MathMLAlignMarkElement(prefix, localname, nsURI, this);
					break;
				case "maction":			
					result = new MathMLActionElement(prefix, localname, nsURI, this);
					break;
				case "cn":			
					result = new MathMLCnElement(prefix, localname, nsURI, this);
					break;
				case "ci":			
					result = new MathMLCiElement(prefix, localname, nsURI, this);
					break;
				case "csymbol":			
					result = new MathMLCsymbolElement(prefix, localname, nsURI, this);
					break;
				case "apply":			
					result = new MathMLApplyElement(prefix, localname, nsURI, this);
					break;
				case "fn":			
					result = new MathMLFnElement(prefix, localname, nsURI, this);
					break;
				case "interval":			
					result = new MathMLIntervalElement(prefix, localname, nsURI, this);
					break;
				case "inverse":			
				case "compose":	
				case "ident":		
				case "domain":			
				case "codomain":		
				case "image":		
				case "quotient":			
				case "exp":			
				case "factorial":			
				case "divide":			
				case "max":			
				case "min":			
				case "minus":			
				case "plus":			
				case "power":			
				case "rem":			
				case "times":			
				case "root":			
				case "gcd":			
				case "and":			
				case "or":			
				case "xor":			
				case "not":			
				case "implies":			
				case "forall":			
				case "exists":			
				case "abs":			
				case "conjugate":			
				case "arg":			
				case "real":			
				case "imaginary":			
				case "lcm":			
				case "floor":			
				case "ceiling":			
				case "eq":			
				case "neq":			
				case "gt":			
				case "lt":			
				case "geq":			
				case "leq":			
				case "equivalent":			
				case "approx":			
				case "factorof":			
				case "int":			
				case "diff":			
				case "partialdiff":		
				case "divergence":			
				case "grad":			
				case "curl":			
				case "laplacian":	
				case "union":			
				case "intersect":			
				case "in":			
				case "notin":			
				case "subset":			
				case "prsubset":			
				case "notsubset":			
				case "notprsubset":			
				case "setdiff":
				case "card":			
				case "cartesianproduct":			
				case "sum":			
				case "product":			
				case "limit":			
				case "tendsto":			
				case "ln":			
				case "log":			
				case "sin":			
				case "cos":			
				case "tan":			
				case "sec":			
				case "csc":			
				case "cot":			
				case "sinh":			
				case "cosh":			
				case "tanh":			
				case "sech":			
				case "csch":			
				case "coth":			
				case "arcsin":			
				case "arccos":			
				case "arctan":			
				case "arccosh":			
				case "arccot":			
				case "arccoth":			
				case "arccsc":			
				case "arccsch":			
				case "arcsec":			
				case "arcsech":			
				case "arcsinh":			
				case "arctanh":			
				case "mean":			
				case "sdev":			
				case "variance":			
				case "median":			
				case "mode":			
				case "moment":		
				case "determinant":			
				case "transpose":			
				case "selector":			
				case "vectorproduct":			
				case "scalarproduct":
				case "outerproduct":	
				case "integers":		
				case "reals":	
				case "rationals":	
				case "naturalnumbers":	
				case "complexes":	
				case "primes":	
				case "exponentiale":	
				case "imaginaryi":		
				case "notanumber":
				case "true":	
				case "false":			
				case "emptyset":			
				case "pi":			
				case "eulergamma":			
				case "infinity":			
					result = new MathMLPredefinedSymbol(prefix, localname, nsURI, this);
					break;
				case "condition":			
					result = new MathMLConditionElement(prefix, localname, nsURI, this);
					break;
				case "declare":			
					result = new MathMLDeclareElement(prefix, localname, nsURI, this);
					break;
				case "lambda":			
					result = new MathMLLambdaElement(prefix, localname, nsURI, this);
					break;
				case "piecewise":			
					result = new MathMLPiecewiseElement(prefix, localname, nsURI, this);
					break;
				case "piecev":			
					result = new MathMLCaseElement(prefix, localname, nsURI, this);
					break;
				case "reln":
				case "domainofapplication":	
				case "otherwise":			
				case "lowlimit":			
				case "uplimit":	
				case "degree":	
				case "momentabout":		
				case "logbase": // TODO is this correct, 'logbase' not specified in mathml docs????
					result = new MathMLContentContainer(prefix, localname, nsURI, this);
					break;
				case "bvar":			
					result = new MathMLBvarElement(prefix, localname, nsURI, this);
					break;
				case "set":			
					result = new MathMLSetElement(prefix, localname, nsURI, this);
					break;
				case "list":			
					result = new MathMLListElement(prefix, localname, nsURI, this);
					break;				
				case "vector":			
					result = new MathMLVectorElement(prefix, localname, nsURI, this);
					break;
				case "matrix":			
					result = new MathMLMatrixElement(prefix, localname, nsURI, this);
					break;
				case "matrixrow":			
					result = new MathMLMatrixRowElement(prefix, localname, nsURI, this);
					break;
				case "annotation":			
					result = new MathMLAnnotationElement(prefix, localname, nsURI, this);
					break;
				case "semantics":			
					result = new MathMLSemanticsElement(prefix, localname, nsURI, this);
					break;
				case "annotation-xml":			
					result = new MathMLXMLAnnotationElement(prefix, localname, nsURI, this);
					break;
				case "sep":
					result = new MathMLSeparator(prefix, localname, nsURI, this);
					break;
				case "placeholder":
					result = new MathMLPlaceholderElement(prefix, localname, nsURI, this);
					break;
				default:
					result = base.CreateElement(prefix, localname, nsURI);
					break;
			}
			return result;
		}
Esempio n. 2
0
        /// <summary>
        /// Create a XmlElement. This is typically called by the base class when creating a DOM tree
        /// </summary>
        /// <param name="prefix"></param>
        /// <param name="localname"></param>
        /// <param name="nsURI"></param>
        /// <returns></returns>
        public override XmlElement CreateElement(string prefix, string localname, string nsURI)
        {
            XmlElement result = null;

            switch (localname)
            {
            case "math":
                result = new MathMLMathElement(prefix, localname, nsURI, this);
                break;

            case "mi":
            case "mn":
            case "mtext":
                result = new MathMLPresentationToken(prefix, localname, nsURI, this);
                break;

            case "mo":
                result = new MathMLOperatorElement(prefix, localname, nsURI, this);
                break;

            case "mspace":
                result = new MathMLSpaceElement(prefix, localname, nsURI, this);
                break;

            case "ms":
                result = new MathMLStringLitElement(prefix, localname, nsURI, this);
                break;

            case "mglyph":
                result = new MathMLGlyphElement(prefix, localname, nsURI, this);
                break;

            case "mrow":
            case "merror":
            case "mphantom":
                result = new MathMLPresentationContainer(prefix, localname, nsURI, this);
                break;

            case "mfrac":
                result = new MathMLFractionElement(prefix, localname, nsURI, this);
                break;

            case "msqrt":
            case "mroot":
                result = new MathMLRadicalElement(prefix, localname, nsURI, this);
                break;

            case "mstyle":
                result = new MathMLStyleElement(prefix, localname, nsURI, this);
                break;

            case "mpadded":
                result = new MathMLPaddedElement(prefix, localname, nsURI, this);
                break;

            case "mfenced":
                result = new MathMLFencedElement(prefix, localname, nsURI, this);
                break;

            case "menclose":
                result = new MathMLEncloseElement(prefix, localname, nsURI, this);
                break;

            case "msub":
            case "msup":
            case "msubsup":
                result = new MathMLScriptElement(prefix, localname, nsURI, this);
                break;

            case "munder":
            case "mover":
            case "munderover":
                result = new MathMLUnderOverElement(prefix, localname, nsURI, this);
                break;

            case "mmultiscripts":
                result = new MathMLMultiScriptsElement(prefix, localname, nsURI, this);
                break;

            case "mtable":
                result = new MathMLTableElement(prefix, localname, nsURI, this);
                break;

            case "mlabeledtr":
                result = new MathMLLabeledRowElement(prefix, localname, nsURI, this);
                break;

            case "mtr":
                result = new MathMLTableRowElement(prefix, localname, nsURI, this);
                break;

            case "mtd":
                result = new MathMLTableCellElement(prefix, localname, nsURI, this);
                break;

            case "maligngroup":
                result = new MathMLAlignGroupElement(prefix, localname, nsURI, this);
                break;

            case "malignmark":
                result = new MathMLAlignMarkElement(prefix, localname, nsURI, this);
                break;

            case "maction":
                result = new MathMLActionElement(prefix, localname, nsURI, this);
                break;

            case "cn":
                result = new MathMLCnElement(prefix, localname, nsURI, this);
                break;

            case "ci":
                result = new MathMLCiElement(prefix, localname, nsURI, this);
                break;

            case "csymbol":
                result = new MathMLCsymbolElement(prefix, localname, nsURI, this);
                break;

            case "apply":
                result = new MathMLApplyElement(prefix, localname, nsURI, this);
                break;

            case "fn":
                result = new MathMLFnElement(prefix, localname, nsURI, this);
                break;

            case "interval":
                result = new MathMLIntervalElement(prefix, localname, nsURI, this);
                break;

            case "inverse":
            case "compose":
            case "ident":
            case "domain":
            case "codomain":
            case "image":
            case "quotient":
            case "exp":
            case "factorial":
            case "divide":
            case "max":
            case "min":
            case "minus":
            case "plus":
            case "power":
            case "rem":
            case "times":
            case "root":
            case "gcd":
            case "and":
            case "or":
            case "xor":
            case "not":
            case "implies":
            case "forall":
            case "exists":
            case "abs":
            case "conjugate":
            case "arg":
            case "real":
            case "imaginary":
            case "lcm":
            case "floor":
            case "ceiling":
            case "eq":
            case "neq":
            case "gt":
            case "lt":
            case "geq":
            case "leq":
            case "equivalent":
            case "approx":
            case "factorof":
            case "int":
            case "diff":
            case "partialdiff":
            case "divergence":
            case "grad":
            case "curl":
            case "laplacian":
            case "union":
            case "intersect":
            case "in":
            case "notin":
            case "subset":
            case "prsubset":
            case "notsubset":
            case "notprsubset":
            case "setdiff":
            case "card":
            case "cartesianproduct":
            case "sum":
            case "product":
            case "limit":
            case "tendsto":
            case "ln":
            case "log":
            case "sin":
            case "cos":
            case "tan":
            case "sec":
            case "csc":
            case "cot":
            case "sinh":
            case "cosh":
            case "tanh":
            case "sech":
            case "csch":
            case "coth":
            case "arcsin":
            case "arccos":
            case "arctan":
            case "arccosh":
            case "arccot":
            case "arccoth":
            case "arccsc":
            case "arccsch":
            case "arcsec":
            case "arcsech":
            case "arcsinh":
            case "arctanh":
            case "mean":
            case "sdev":
            case "variance":
            case "median":
            case "mode":
            case "moment":
            case "determinant":
            case "transpose":
            case "selector":
            case "vectorproduct":
            case "scalarproduct":
            case "outerproduct":
            case "integers":
            case "reals":
            case "rationals":
            case "naturalnumbers":
            case "complexes":
            case "primes":
            case "exponentiale":
            case "imaginaryi":
            case "notanumber":
            case "true":
            case "false":
            case "emptyset":
            case "pi":
            case "eulergamma":
            case "infinity":
                result = new MathMLPredefinedSymbol(prefix, localname, nsURI, this);
                break;

            case "condition":
                result = new MathMLConditionElement(prefix, localname, nsURI, this);
                break;

            case "declare":
                result = new MathMLDeclareElement(prefix, localname, nsURI, this);
                break;

            case "lambda":
                result = new MathMLLambdaElement(prefix, localname, nsURI, this);
                break;

            case "piecewise":
                result = new MathMLPiecewiseElement(prefix, localname, nsURI, this);
                break;

            case "piecev":
                result = new MathMLCaseElement(prefix, localname, nsURI, this);
                break;

            case "reln":
            case "domainofapplication":
            case "otherwise":
            case "lowlimit":
            case "uplimit":
            case "degree":
            case "momentabout":
            case "logbase":                     // TODO is this correct, 'logbase' not specified in mathml docs????
                result = new MathMLContentContainer(prefix, localname, nsURI, this);
                break;

            case "bvar":
                result = new MathMLBvarElement(prefix, localname, nsURI, this);
                break;

            case "set":
                result = new MathMLSetElement(prefix, localname, nsURI, this);
                break;

            case "list":
                result = new MathMLListElement(prefix, localname, nsURI, this);
                break;

            case "vector":
                result = new MathMLVectorElement(prefix, localname, nsURI, this);
                break;

            case "matrix":
                result = new MathMLMatrixElement(prefix, localname, nsURI, this);
                break;

            case "matrixrow":
                result = new MathMLMatrixRowElement(prefix, localname, nsURI, this);
                break;

            case "annotation":
                result = new MathMLAnnotationElement(prefix, localname, nsURI, this);
                break;

            case "semantics":
                result = new MathMLSemanticsElement(prefix, localname, nsURI, this);
                break;

            case "annotation-xml":
                result = new MathMLXMLAnnotationElement(prefix, localname, nsURI, this);
                break;

            case "sep":
                result = new MathMLSeparator(prefix, localname, nsURI, this);
                break;

            case "placeholder":
                result = new MathMLPlaceholderElement(prefix, localname, nsURI, this);
                break;

            default:
                result = base.CreateElement(prefix, localname, nsURI);
                break;
            }
            return(result);
        }
Esempio n. 3
0
		/// <summary>
		/// process a mrow element.
		/// a mrow is a horizontal array of areas. many of these areas may need
		/// to be stretched, but we need to know what size to stretch them first, 
		/// so, we first create areas for all child nodes of this node that are 
		/// not stretchable glyphs, and calculate the extents of these areas 
		/// to find the min and max sizes, then we go back and create areas
		/// for the stretchable glyphs.
		/// </summary>
		/// <remarks>
		/// There is no way of knowing exactly how far to stretch glyphs in the
		/// width direction, so we calculate the avalilble width (total extent -
		/// width of non stretchy areas), and for each stretchy operator we create, 
		/// we subtract the new op's width from the avail width to get the new avail
		/// width for the next op. This does have the nasty side effect of stretching
		/// the first horizontally stretchy glyph to fill up all of the horizontal
		/// space.
		/// </remarks>		
		public object Visit(MathMLPresentationContainer e, object args)
		{
			Area cache = Area.GetArea(e);
			if(cache != null) return cache;

			// moved logic to FormatContainer so that it can be shared with apply element
			MathMLNodeList arguments = e.Arguments;
			ArrayList argList = new ArrayList(arguments.Count);
			foreach(object o in e.Arguments)
			{
				argList.Add(o);
			}
			Area area = FormatContainer(e, (IFormattingContext)args, argList);

			// table cell areas elemetns area a special case, they get 'Completed'
			// in the MathMLTableCellElement method
			return e is MathMLTableCellElement ? area : CompleteArea((IFormattingContext)args, e, area);
		}