package d2latex

import (
	_ 
	
	
	
	
	

	
	
)

var pxPerEx = 8

//go:embed polyfills.js
var polyfillsJS string

//go:embed setup.js
var setupJS string

//go:embed mathjax.js
var mathjaxJS string

// Matches this
// <svg style="background: white;" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="563" height="326" viewBox="-100 -100 563 326"><style type="text/css">
var svgRe = regexp.MustCompile(`<svg[^>]+width="([0-9\.]+)ex" height="([0-9\.]+)ex"[^>]+>`)

func ( string) ( string,  error) {
	defer xdefer.Errorf(&, "latex failed to parse")
	 = doubleBackslashes()
	 := jsrunner.NewJSRunner()

	if ,  := .RunString(polyfillsJS);  != nil {
		return "", 
	}

	if ,  := .RunString(mathjaxJS);  != nil {
		// Known issue that a harmless error occurs in JS: https://github.com/mathjax/MathJax/issues/3289
		if .Engine() == jsrunner.Goja {
			return "", 
		}
	}

	if ,  := .RunString(setupJS);  != nil {
		return "", 
	}

	,  := .RunString(fmt.Sprintf(`adaptor.innerHTML(html.convert(`+"`"+"%s`"+`, {
  em: %d,
  ex: %d,
}))`, , pxPerEx*2, pxPerEx))
	if  != nil {
		return "", 
	}

	return .String(), nil
}

func ( string) (,  int,  error) {
	defer xdefer.Errorf(&, "latex failed to parse")
	,  := Render()
	if  != nil {
		return 0, 0, 
	}

	 := svgRe.FindAllStringSubmatch(, -1)
	if len() != 1 || len([0]) != 3 {
		return 0, 0, fmt.Errorf("svg parsing failed for latex: %v", )
	}

	 := [0][1]
	 := [0][2]

	,  := strconv.ParseFloat(, 64)
	if  != nil {
		return 0, 0, fmt.Errorf("svg parsing failed for latex: %v", )
	}
	,  := strconv.ParseFloat(, 64)
	if  != nil {
		return 0, 0, fmt.Errorf("svg parsing failed for latex: %v", )
	}

	return int(math.Ceil( * float64(pxPerEx))), int(math.Ceil( * float64(pxPerEx))), nil
}

func doubleBackslashes( string) string {
	var  strings.Builder
	for  := 0;  < len(); ++ {
		if [] == '\\' {
			.WriteString("\\\\")
		} else {
			.WriteByte([])
		}
	}
	return .String()
}