package parser

import (
	
	

	
	
	
)

type rawHTMLParser struct {
}

var defaultRawHTMLParser = &rawHTMLParser{}
NewRawHTMLParser return a new InlineParser that can parse inline htmls
func () InlineParser {
	return defaultRawHTMLParser
}

func ( *rawHTMLParser) () []byte {
	return []byte{'<'}
}

func ( *rawHTMLParser) ( ast.Node,  text.Reader,  Context) ast.Node {
	,  := .PeekLine()
	if len() > 1 && util.IsAlphaNumeric([1]) {
		return .parseMultiLineRegexp(openTagRegexp, , )
	}
	if len() > 2 && [1] == '/' && util.IsAlphaNumeric([2]) {
		return .parseMultiLineRegexp(closeTagRegexp, , )
	}
	if bytes.HasPrefix(, []byte("<!--")) {
		return .parseMultiLineRegexp(commentRegexp, , )
	}
	if bytes.HasPrefix(, []byte("<?")) {
		return .parseSingleLineRegexp(processingInstructionRegexp, , )
	}
	if len() > 2 && [1] == '!' && [2] >= 'A' && [2] <= 'Z' {
		return .parseSingleLineRegexp(declRegexp, , )
	}
	if bytes.HasPrefix(, []byte("<![CDATA[")) {
		return .parseMultiLineRegexp(cdataRegexp, , )
	}
	return nil
}

var tagnamePattern = `([A-Za-z][A-Za-z0-9-]*)`
var attributePattern = `(?:\s+[a-zA-Z_:][a-zA-Z0-9:._-]*(?:\s*=\s*(?:[^\"'=<>` + "`" + `\x00-\x20]+|'[^']*'|"[^"]*"))?)`
var openTagRegexp = regexp.MustCompile("^<" + tagnamePattern + attributePattern + `*\s*/?>`)
var closeTagRegexp = regexp.MustCompile("^</" + tagnamePattern + `\s*>`)
var commentRegexp = regexp.MustCompile(`^<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->`)
var processingInstructionRegexp = regexp.MustCompile(`^(?:<\?).*?(?:\?>)`)
var declRegexp = regexp.MustCompile(`^<![A-Z]+\s+[^>]*>`)
var cdataRegexp = regexp.MustCompile(`<!\[CDATA\[[\s\S]*?\]\]>`)

func ( *rawHTMLParser) ( *regexp.Regexp,  text.Reader,  Context) ast.Node {
	,  := .PeekLine()
	 := .FindSubmatchIndex()
	if  == nil {
		return nil
	}
	 := ast.NewRawHTML()
	.Segments.Append(.WithStop(.Start + [1]))
	.Advance([1])
	return 
}

func ( *rawHTMLParser) ( *regexp.Regexp,  text.Reader,  Context) ast.Node {
	,  := .Position()
	if .Match() {
		 := ast.NewRawHTML()
		,  := .Position()
		.SetPosition(, )
		for {
			,  := .PeekLine()
			if  == nil {
				break
			}
			,  := .Position()
			 := .Start
			if  ==  {
				 = .Start
			}
			 := .Stop
			if  ==  {
				 = .Start
			}

			.Segments.Append(text.NewSegment(, ))
			if  ==  {
				.Advance( - )
				break
			} else {
				.AdvanceLine()
			}
		}
		return 
	}
	return nil