// Copyright 2017-2022 The MathJax Consortium
// SPDX-License-Identifier: Apache-2.0
//
// This file is a Go translation and modification of MathJax 3.2.2.
// Sources: ts/core/MmlTree/{MML,MmlNode,MmlFactory}.ts and all 30
// ts/core/MmlTree/MmlNodes/*.ts definitions.

package mml

import (
	
)

// UnboundedArity is the integer representation used by the Go tree for
// MathJax's JavaScript Infinity arity.  Negative one remains reserved for the
// inferred-mrow content model.
const UnboundedArity = int(^uint(0) >> 1)

func propertyMap( ...any) *ordered.Map[Property] {
	 := ordered.New[Property]()
	for  := 0;  < len();  += 2 {
		 := [+1]
		if  == "_inherit_" {
			 = Inherit
		}
		.Set([].(string), )
	}
	return 
}

func extendDefaults( *ordered.Map[Property],  ...any) *ordered.Map[Property] {
	 := .Clone()
	for  := 0;  < len();  += 2 {
		 := [+1]
		if  == "_inherit_" {
			 = Inherit
		}
		.Set([].(string), )
	}
	return 
}

// NewMathJaxFactory returns the complete pinned MathJax 3.2.2 registry.
// Each factory owns immutable definitions; Create clones their attribute maps.
func () *Factory {
	 := NewFactory()
	 := propertyMap(
		"mathbackground", "_inherit_",
		"mathcolor", "_inherit_",
		"mathsize", "_inherit_",
		"dir", "_inherit_",
	)
	 := extendDefaults(, "mathvariant", "normal", "mathsize", "_inherit_")
	 := extendDefaults(,
		"mathvariant", "normal",
		"mathsize", "normal",
		"mathcolor", "",
		"mathbackground", "transparent",
		"dir", "ltr",
		"scriptlevel", 0,
		"displaystyle", false,
		"display", "inline",
		"maxwidth", "",
		"overflow", "linebreak",
		"altimg", "",
		"altimg-width", "",
		"altimg-height", "",
		"altimg-valign", "",
		"alttext", "",
		"cdgroup", "",
		"scriptsizemultiplier", 0.7071067811865475,
		"scriptminsize", "8px",
		"infixlinebreakstyle", "before",
		"lineleading", "1ex",
		"linebreakmultchar", "\u2062",
		"indentshift", "auto",
		"indentalign", "auto",
		"indenttarget", "",
		"indentalignfirst", "indentalign",
		"indentshiftfirst", "indentshift",
		"indentalignlast", "indentalign",
		"indentshiftlast", "indentshift",
	)
	.Range(func( string,  Property) bool {
		.Globals().Set(, )
		return true
	})

	 := func( string,  *ordered.Map[Property],  Flags) {
		.Register(, Definition{Defaults: , Flags: })
	}
	 := Flags{Arity: UnboundedArity}
	 := Flags{Token: true, Arity: UnboundedArity}

	("math", , Flags{Arity: -1, LinebreakContainer: true})
	("mi", , )
	("mn", , )
	("mo", extendDefaults(,
		"form", "infix", "fence", false, "separator", false,
		"lspace", "thickmathspace", "rspace", "thickmathspace",
		"stretchy", false, "symmetric", false,
		"maxsize", "infinity", "minsize", "0em",
		"largeop", false, "movablelimits", false, "accent", false,
		"linebreak", "auto", "lineleading", "1ex", "linebreakstyle", "before",
		"indentalign", "auto", "indentshift", "0", "indenttarget", "",
		"indentalignfirst", "indentalign", "indentshiftfirst", "indentshift",
		"indentalignlast", "indentalign", "indentshiftlast", "indentshift",
	), Flags{Token: true, Embellished: true, Arity: UnboundedArity})
	("mtext", , Flags{Token: true, Spacelike: true, Arity: UnboundedArity})
	("mspace", extendDefaults(,
		"width", "0em", "height", "0ex", "depth", "0ex", "linebreak", "auto",
	), Flags{Token: true, Spacelike: true, Arity: 0})
	("ms", extendDefaults(, "lquote", "\"", "rquote", "\""), )

	("mrow", , )
	("inferredMrow", , Flags{Arity: UnboundedArity, Spacelike: true, Inferred: true, NotParent: true})
	("mfrac", extendDefaults(,
		"linethickness", "medium", "numalign", "center", "denomalign", "center", "bevelled", false,
	), Flags{Arity: 2, LinebreakContainer: true})
	("msqrt", , Flags{Arity: -1, LinebreakContainer: true})
	("mroot", , Flags{Arity: 2})
	("mstyle", extendDefaults(,
		"scriptlevel", "_inherit_", "displaystyle", "_inherit_",
		// V8's 1 / Math.sqrt(2) is one ULP below Go's 1 / math.Sqrt2
		// constant.  The value is observable in MathJax's default layer.
		"scriptsizemultiplier", 0.7071067811865475, "scriptminsize", "8px",
		"mathbackground", "_inherit_", "mathcolor", "_inherit_", "dir", "_inherit_",
		"infixlinebreakstyle", "before",
	), Flags{Arity: -1})
	("merror", , Flags{Arity: -1, LinebreakContainer: true})
	("mpadded", extendDefaults(,
		"width", "", "height", "", "depth", "", "lspace", 0, "voffset", 0,
	), Flags{Arity: -1})
	("mphantom", , Flags{Arity: -1})
	("mfenced", extendDefaults(, "open", "(", "close", ")", "separators", ","), )
	("menclose", extendDefaults(, "notation", "longdiv"), Flags{Arity: -1})
	("maction", extendDefaults(, "actiontype", "toggle", "selection", 1), Flags{Arity: 1})

	 := extendDefaults(, "subscriptshift", "", "superscriptshift", "")
	("msub", , Flags{Arity: 2})
	("msup", , Flags{Arity: 2})
	("msubsup", , Flags{Arity: 3})
	 := extendDefaults(, "accent", false, "accentunder", false, "align", "center")
	("munder", , Flags{Arity: 2, LinebreakContainer: true})
	("mover", , Flags{Arity: 2, LinebreakContainer: true})
	("munderover", , Flags{Arity: 3, LinebreakContainer: true})
	("mmultiscripts", , Flags{Arity: 1})
	("mprescripts", , Flags{Arity: 0})
	("none", , Flags{Arity: 0})

	("mtable", extendDefaults(,
		"align", "axis", "rowalign", "baseline", "columnalign", "center", "groupalign", "{left}",
		"alignmentscope", true, "columnwidth", "auto", "width", "auto",
		"rowspacing", "1ex", "columnspacing", ".8em", "rowlines", "none", "columnlines", "none",
		"frame", "none", "framespacing", "0.4em 0.5ex", "equalrows", false, "equalcolumns", false,
		"displaystyle", false, "side", "right", "minlabelspacing", "0.8em",
	), Flags{Arity: UnboundedArity, LinebreakContainer: true})
	 := extendDefaults(,
		"rowalign", "_inherit_", "columnalign", "_inherit_", "groupalign", "_inherit_",
	)
	("mlabeledtr", , Flags{Arity: 1, LinebreakContainer: true})
	("mtr", , Flags{Arity: UnboundedArity, LinebreakContainer: true})
	("mtd", extendDefaults(,
		"rowspan", 1, "columnspan", 1, "rowalign", "_inherit_", "columnalign", "_inherit_", "groupalign", "_inherit_",
	), Flags{Arity: -1, LinebreakContainer: true})
	("maligngroup", extendDefaults(, "groupalign", "_inherit_"), Flags{Arity: -1, Spacelike: true})
	("malignmark", extendDefaults(, "edge", "left"), Flags{Arity: 0, Spacelike: true})

	("mglyph", extendDefaults(,
		"alt", "", "src", "", "index", "", "width", "auto", "height", "auto", "valign", "0em",
	), )
	("semantics", extendDefaults(, "definitionUrl", nil, "encoding", nil), Flags{Arity: 1, NotParent: true})
	 := extendDefaults(,
		"definitionUrl", nil, "encoding", nil, "cd", "mathmlkeys", "name", "", "src", nil,
	)
	("annotation", , )
	("annotation-xml", , )
	("TeXAtom", , Flags{Arity: -1})
	("MathChoice", , Flags{Arity: 4, NotParent: true})
	("text", ordered.New[Property](), Flags{Arity: 0})
	("XML", ordered.New[Property](), Flags{Arity: 0})
	return 
}