package markup

import ()

const maxRecursionLevel = 3

type GemParserState struct {
	recursionLevel int
}

func Parse(ast []Line, from, to int, state GemParserState) (html string) {
	if state.recursionLevel > maxRecursionLevel {
		return "Transclusion depth limit"
	}
	for _, line := range ast {
		if line.id >= from && (line.id <= to || to == 0) || line.id == -1 {
			switch v := line.contents.(type) {
			case Transclusion:
				html += Transclude(v, state)
			case Img:
				html += v.ToHtml()
			case string:
				html += v
			default:
				html += "Unknown"
			}
		}
	}
	return html
}

func ToHtml(name, text string) string {
	state := GemParserState{}
	return Parse(lex(name, text), 0, 0, state)
}