// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package html

import (
	"strings"
)

func adjustAttributeNames(aa []Attribute, nameMap map[string]string) {
	for i := range aa {
		if newName, ok := nameMap[aa[i].Key]; ok {
			aa[i].Key = newName
		}
	}
}

func adjustForeignAttributes(aa []Attribute) {
	for i, a := range aa {
		if a.Key == "" || a.Key[0] != 'x' {
			continue
		}
		switch a.Key {
		case "xlink:actuate", "xlink:arcrole", "xlink:href", "xlink:role", "xlink:show",
			"xlink:title", "xlink:type", "xml:base", "xml:lang", "xml:space", "xmlns:xlink":
			j := strings.Index(a.Key, ":")
			aa[i].Namespace = a.Key[:j]
			aa[i].Key = a.Key[j+1:]
		}
	}
}

func htmlIntegrationPoint(n *Node) bool {
	if n.Type != ElementNode {
		return false
	}
	switch n.Namespace {
	case "math":
		if n.Data == "annotation-xml" {
			for _, a := range n.Attr {
				if a.Key == "encoding" {
					val := strings.ToLower(a.Val)
					if val == "text/html" || val == "application/xhtml+xml" {
						return true
					}
				}
			}
		}
	case "svg":
		switch n.Data {
		case "desc", "foreignObject", "title":
			return true
		}
	}
	return false
}

func mathMLTextIntegrationPoint(n *Node) bool {
	if n.Namespace != "math" {
		return false
	}
	switch n.Data {
	case "mi", "mo", "mn", "ms", "mtext":
		return true
	}
	return false
}

// Section 12.2.6.5.
var breakout = map[string]bool{
	"b":          true,
	"big":        true,
	"blockquote": true,
	"body":       true,
	"br":         true,
	"center":     true,
	"code":       true,
	"dd":         true,
	"div":        true,
	"dl":         true,
	"dt":         true,
	"em":         true,
	"embed":      true,
	"h1":         true,
	"h2":         true,
	"h3":         true,
	"h4":         true,
	"h5":         true,
	"h6":         true,
	"head":       true,
	"hr":         true,
	"i":          true,
	"img":        true,
	"li":         true,
	"listing":    true,
	"menu":       true,
	"meta":       true,
	"nobr":       true,
	"ol":         true,
	"p":          true,
	"pre":        true,
	"ruby":       true,
	"s":          true,
	"small":      true,
	"span":       true,
	"strong":     true,
	"strike":     true,
	"sub":        true,
	"sup":        true,
	"table":      true,
	"tt":         true,
	"u":          true,
	"ul":         true,
	"var":        true,
}

// Section 12.2.6.5.
var svgTagNameAdjustments = map[string]string{
	"altglyph":            "altGlyph",
	"altglyphdef":         "altGlyphDef",
	"altglyphitem":        "altGlyphItem",
	"animatecolor":        "animateColor",
	"animatemotion":       "animateMotion",
	"animatetransform":    "animateTransform",
	"clippath":            "clipPath",
	"feblend":             "feBlend",
	"fecolormatrix":       "feColorMatrix",
	"fecomponenttransfer": "feComponentTransfer",
	"fecomposite":         "feComposite",
	"feconvolvematrix":    "feConvolveMatrix",
	"fediffuselighting":   "feDiffuseLighting",
	"fedisplacementmap":   "feDisplacementMap",
	"fedistantlight":      "feDistantLight",
	"feflood":             "feFlood",
	"fefunca":             "feFuncA",
	"fefuncb":             "feFuncB",
	"fefuncg":             "feFuncG",
	"fefuncr":             "feFuncR",
	"fegaussianblur":      "feGaussianBlur",
	"feimage":             "feImage",
	"femerge":             "feMerge",
	"femergenode":         "feMergeNode",
	"femorphology":        "feMorphology",
	"feoffset":            "feOffset",
	"fepointlight":        "fePointLight",
	"fespecularlighting":  "feSpecularLighting",
	"fespotlight":         "feSpotLight",
	"fetile":              "feTile",
	"feturbulence":        "feTurbulence",
	"foreignobject":       "foreignObject",
	"glyphref":            "glyphRef",
	"lineargradient":      "linearGradient",
	"radialgradient":      "radialGradient",
	"textpath":            "textPath",
}

// Section 12.2.6.1
var mathMLAttributeAdjustments = map[string]string{
	"definitionurl": "definitionURL",
}

var svgAttributeAdjustments = map[string]string{
	"attributename":             "attributeName",
	"attributetype":             "attributeType",
	"basefrequency":             "baseFrequency",
	"baseprofile":               "baseProfile",
	"calcmode":                  "calcMode",
	"clippathunits":             "clipPathUnits",
	"contentscripttype":         "contentScriptType",
	"contentstyletype":          "contentStyleType",
	"diffuseconstant":           "diffuseConstant",
	"edgemode":                  "edgeMode",
	"externalresourcesrequired": "externalResourcesRequired",
	"filterunits":               "filterUnits",
	"glyphref":                  "glyphRef",
	"gradienttransform":         "gradientTransform",
	"gradientunits":             "gradientUnits",
	"kernelmatrix":              "kernelMatrix",
	"kernelunitlength":          "kernelUnitLength",
	"keypoints":                 "keyPoints",
	"keysplines":                "keySplines",
	"keytimes":                  "keyTimes",
	"lengthadjust":              "lengthAdjust",
	"limitingconeangle":         "limitingConeAngle",
	"markerheight":              "markerHeight",
	"markerunits":               "markerUnits",
	"markerwidth":               "markerWidth",
	"maskcontentunits":          "maskContentUnits",
	"maskunits":                 "maskUnits",
	"numoctaves":                "numOctaves",
	"pathlength":                "pathLength",
	"patterncontentunits":       "patternContentUnits",
	"patterntransform":          "patternTransform",
	"patternunits":              "patternUnits",
	"pointsatx":                 "pointsAtX",
	"pointsaty":                 "pointsAtY",
	"pointsatz":                 "pointsAtZ",
	"preservealpha":             "preserveAlpha",
	"preserveaspectratio":       "preserveAspectRatio",
	"primitiveunits":            "primitiveUnits",
	"refx":                      "refX",
	"refy":                      "refY",
	"repeatcount":               "repeatCount",
	"repeatdur":                 "repeatDur",
	"requiredextensions":        "requiredExtensions",
	"requiredfeatures":          "requiredFeatures",
	"specularconstant":          "specularConstant",
	"specularexponent":          "specularExponent",
	"spreadmethod":              "spreadMethod",
	"startoffset":               "startOffset",
	"stddeviation":              "stdDeviation",
	"stitchtiles":               "stitchTiles",
	"surfacescale":              "surfaceScale",
	"systemlanguage":            "systemLanguage",
	"tablevalues":               "tableValues",
	"targetx":                   "targetX",
	"targety":                   "targetY",
	"textlength":                "textLength",
	"viewbox":                   "viewBox",
	"viewtarget":                "viewTarget",
	"xchannelselector":          "xChannelSelector",
	"ychannelselector":          "yChannelSelector",
	"zoomandpan":                "zoomAndPan",
}
