// Copyright 2015 The 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 markdown

type Token interface {
	Tag() string
	Opening() bool
	Closing() bool
	Block() bool
	Level() int
	SetLevel(lvl int)
}

type BlockquoteOpen struct {
	Map [2]int
	Lvl int
}

type BlockquoteClose struct {
	Lvl int
}

type BulletListOpen struct {
	Map [2]int
	Lvl int
}

type BulletListClose struct {
	Lvl int
}

type OrderedListOpen struct {
	Order int
	Map   [2]int
	Lvl   int
}

type OrderedListClose struct {
	Lvl int
}

type ListItemOpen struct {
	Map [2]int
	Lvl int
}

type ListItemClose struct {
	Lvl int
}

type CodeBlock struct {
	Content string
	Map     [2]int
	Lvl     int
}

type CodeInline struct {
	Content string
	Lvl     int
}

type EmphasisOpen struct {
	Lvl int
}

type EmphasisClose struct {
	Lvl int
}

type StrongOpen struct {
	Lvl int
}

type StrongClose struct {
	Lvl int
}

type StrikethroughOpen struct {
	Lvl int
}

type StrikethroughClose struct {
	Lvl int
}

type Fence struct {
	Params  string
	Content string
	Map     [2]int
	Lvl     int
}

type Softbreak struct {
	Lvl int
}

type Hardbreak struct {
	Lvl int
}

type HeadingOpen struct {
	HLevel int
	Map    [2]int
	Lvl    int
}

type HeadingClose struct {
	HLevel int
	Lvl    int
}

type HTMLBlock struct {
	Content string
	Map     [2]int
	Lvl     int
}

type HTMLInline struct {
	Content string
	Lvl     int
}

type Hr struct {
	Map [2]int
	Lvl int
}

type Image struct {
	Src    string
	Title  string
	Tokens []Token
	Lvl    int
}

type Inline struct {
	Content  string
	Map      [2]int
	Children []Token
	Lvl      int
}

type LinkOpen struct {
	Href   string
	Title  string
	Target string
	Lvl    int
}

type LinkClose struct {
	Lvl int
}

type ParagraphOpen struct {
	Tight  bool
	Hidden bool
	Map    [2]int
	Lvl    int
}

type ParagraphClose struct {
	Tight  bool
	Hidden bool
	Lvl    int
}

type TableOpen struct {
	Map [2]int
	Lvl int
}

type TableClose struct {
	Lvl int
}

type TheadOpen struct {
	Map [2]int
	Lvl int
}

type TheadClose struct {
	Lvl int
}

type TrOpen struct {
	Map [2]int
	Lvl int
}

type TrClose struct {
	Lvl int
}

type ThOpen struct {
	Align Align
	Map   [2]int
	Lvl   int
}

type ThClose struct {
	Lvl int
}

type TbodyOpen struct {
	Map [2]int
	Lvl int
}

type TbodyClose struct {
	Lvl int
}

type TdOpen struct {
	Align Align
	Map   [2]int
	Lvl   int
}

type TdClose struct {
	Lvl int
}

type Text struct {
	Content string
	Lvl     int
}

var htags = []string{
	"",
	"h1",
	"h2",
	"h3",
	"h4",
	"h5",
	"h6",
}

func (t *BlockquoteOpen) Level() int { return t.Lvl }

func (t *BlockquoteClose) Level() int { return t.Lvl }

func (t *BulletListOpen) Level() int { return t.Lvl }

func (t *BulletListClose) Level() int { return t.Lvl }

func (t *OrderedListOpen) Level() int { return t.Lvl }

func (t *OrderedListClose) Level() int { return t.Lvl }

func (t *ListItemOpen) Level() int { return t.Lvl }

func (t *ListItemClose) Level() int { return t.Lvl }

func (t *CodeBlock) Level() int { return t.Lvl }

func (t *CodeInline) Level() int { return t.Lvl }

func (t *EmphasisOpen) Level() int { return t.Lvl }

func (t *EmphasisClose) Level() int { return t.Lvl }

func (t *StrongOpen) Level() int { return t.Lvl }

func (t *StrongClose) Level() int { return t.Lvl }

func (t *StrikethroughOpen) Level() int { return t.Lvl }

func (t *StrikethroughClose) Level() int { return t.Lvl }

func (t *Fence) Level() int { return t.Lvl }

func (t *Softbreak) Level() int { return t.Lvl }

func (t *Hardbreak) Level() int { return t.Lvl }

func (t *HeadingOpen) Level() int { return t.Lvl }

func (t *HeadingClose) Level() int { return t.Lvl }

func (t *HTMLBlock) Level() int { return t.Lvl }

func (t *HTMLInline) Level() int { return t.Lvl }

func (t *Hr) Level() int { return t.Lvl }

func (t *Image) Level() int { return t.Lvl }

func (t *Inline) Level() int { return t.Lvl }

func (t *LinkOpen) Level() int { return t.Lvl }

func (t *LinkClose) Level() int { return t.Lvl }

func (t *ParagraphOpen) Level() int { return t.Lvl }

func (t *ParagraphClose) Level() int { return t.Lvl }

func (t *TableOpen) Level() int { return t.Lvl }

func (t *TableClose) Level() int { return t.Lvl }

func (t *TheadOpen) Level() int { return t.Lvl }

func (t *TheadClose) Level() int { return t.Lvl }

func (t *TrOpen) Level() int { return t.Lvl }

func (t *TrClose) Level() int { return t.Lvl }

func (t *ThOpen) Level() int { return t.Lvl }

func (t *ThClose) Level() int { return t.Lvl }

func (t *TbodyOpen) Level() int { return t.Lvl }

func (t *TbodyClose) Level() int { return t.Lvl }

func (t *TdOpen) Level() int { return t.Lvl }

func (t *TdClose) Level() int { return t.Lvl }

func (t *Text) Level() int { return t.Lvl }

func (t *BlockquoteOpen) SetLevel(lvl int) { t.Lvl = lvl }

func (t *BlockquoteClose) SetLevel(lvl int) { t.Lvl = lvl }

func (t *BulletListOpen) SetLevel(lvl int) { t.Lvl = lvl }

func (t *BulletListClose) SetLevel(lvl int) { t.Lvl = lvl }

func (t *OrderedListOpen) SetLevel(lvl int) { t.Lvl = lvl }

func (t *OrderedListClose) SetLevel(lvl int) { t.Lvl = lvl }

func (t *ListItemOpen) SetLevel(lvl int) { t.Lvl = lvl }

func (t *ListItemClose) SetLevel(lvl int) { t.Lvl = lvl }

func (t *CodeBlock) SetLevel(lvl int) { t.Lvl = lvl }

func (t *CodeInline) SetLevel(lvl int) { t.Lvl = lvl }

func (t *EmphasisOpen) SetLevel(lvl int) { t.Lvl = lvl }

func (t *EmphasisClose) SetLevel(lvl int) { t.Lvl = lvl }

func (t *StrongOpen) SetLevel(lvl int) { t.Lvl = lvl }

func (t *StrongClose) SetLevel(lvl int) { t.Lvl = lvl }

func (t *StrikethroughOpen) SetLevel(lvl int) { t.Lvl = lvl }

func (t *StrikethroughClose) SetLevel(lvl int) { t.Lvl = lvl }

func (t *Fence) SetLevel(lvl int) { t.Lvl = lvl }

func (t *Softbreak) SetLevel(lvl int) { t.Lvl = lvl }

func (t *Hardbreak) SetLevel(lvl int) { t.Lvl = lvl }

func (t *HeadingOpen) SetLevel(lvl int) { t.Lvl = lvl }

func (t *HeadingClose) SetLevel(lvl int) { t.Lvl = lvl }

func (t *HTMLBlock) SetLevel(lvl int) { t.Lvl = lvl }

func (t *HTMLInline) SetLevel(lvl int) { t.Lvl = lvl }

func (t *Hr) SetLevel(lvl int) { t.Lvl = lvl }

func (t *Image) SetLevel(lvl int) { t.Lvl = lvl }

func (t *Inline) SetLevel(lvl int) { t.Lvl = lvl }

func (t *LinkOpen) SetLevel(lvl int) { t.Lvl = lvl }

func (t *LinkClose) SetLevel(lvl int) { t.Lvl = lvl }

func (t *ParagraphOpen) SetLevel(lvl int) { t.Lvl = lvl }

func (t *ParagraphClose) SetLevel(lvl int) { t.Lvl = lvl }

func (t *TableOpen) SetLevel(lvl int) { t.Lvl = lvl }

func (t *TableClose) SetLevel(lvl int) { t.Lvl = lvl }

func (t *TheadOpen) SetLevel(lvl int) { t.Lvl = lvl }

func (t *TheadClose) SetLevel(lvl int) { t.Lvl = lvl }

func (t *TrOpen) SetLevel(lvl int) { t.Lvl = lvl }

func (t *TrClose) SetLevel(lvl int) { t.Lvl = lvl }

func (t *ThOpen) SetLevel(lvl int) { t.Lvl = lvl }

func (t *ThClose) SetLevel(lvl int) { t.Lvl = lvl }

func (t *TbodyOpen) SetLevel(lvl int) { t.Lvl = lvl }

func (t *TbodyClose) SetLevel(lvl int) { t.Lvl = lvl }

func (t *TdOpen) SetLevel(lvl int) { t.Lvl = lvl }

func (t *TdClose) SetLevel(lvl int) { t.Lvl = lvl }

func (t *Text) SetLevel(lvl int) { t.Lvl = lvl }

func (t *BlockquoteOpen) Opening() bool { return true }

func (t *BlockquoteClose) Opening() bool { return false }

func (t *BulletListOpen) Opening() bool { return true }

func (t *BulletListClose) Opening() bool { return false }

func (t *OrderedListOpen) Opening() bool { return true }

func (t *OrderedListClose) Opening() bool { return false }

func (t *ListItemOpen) Opening() bool { return true }

func (t *ListItemClose) Opening() bool { return false }

func (t *CodeBlock) Opening() bool { return false }

func (t *CodeInline) Opening() bool { return false }

func (t *EmphasisOpen) Opening() bool { return true }

func (t *EmphasisClose) Opening() bool { return false }

func (t *StrongOpen) Opening() bool { return true }

func (t *StrongClose) Opening() bool { return false }

func (t *StrikethroughOpen) Opening() bool { return true }

func (t *StrikethroughClose) Opening() bool { return false }

func (t *Fence) Opening() bool { return false }

func (t *Softbreak) Opening() bool { return false }

func (t *Hardbreak) Opening() bool { return false }

func (t *HeadingOpen) Opening() bool { return true }

func (t *HeadingClose) Opening() bool { return false }

func (t *HTMLBlock) Opening() bool { return false }

func (t *HTMLInline) Opening() bool { return false }

func (t *Hr) Opening() bool { return false }

func (t *Image) Opening() bool { return false }

func (t *Inline) Opening() bool { return false }

func (t *LinkOpen) Opening() bool { return true }

func (t *LinkClose) Opening() bool { return false }

func (t *ParagraphOpen) Opening() bool { return true }

func (t *ParagraphClose) Opening() bool { return false }

func (t *TableOpen) Opening() bool { return true }

func (t *TableClose) Opening() bool { return false }

func (t *TheadOpen) Opening() bool { return true }

func (t *TheadClose) Opening() bool { return false }

func (t *TrOpen) Opening() bool { return true }

func (t *TrClose) Opening() bool { return false }

func (t *ThOpen) Opening() bool { return true }

func (t *ThClose) Opening() bool { return false }

func (t *TbodyOpen) Opening() bool { return true }

func (t *TbodyClose) Opening() bool { return false }

func (t *TdOpen) Opening() bool { return true }

func (t *TdClose) Opening() bool { return false }

func (t *Text) Opening() bool { return false }

func (t *BlockquoteOpen) Closing() bool { return false }

func (t *BlockquoteClose) Closing() bool { return true }

func (t *BulletListOpen) Closing() bool { return false }

func (t *BulletListClose) Closing() bool { return true }

func (t *OrderedListOpen) Closing() bool { return false }

func (t *OrderedListClose) Closing() bool { return true }

func (t *ListItemOpen) Closing() bool { return false }

func (t *ListItemClose) Closing() bool { return true }

func (t *CodeBlock) Closing() bool { return false }

func (t *CodeInline) Closing() bool { return false }

func (t *EmphasisOpen) Closing() bool { return false }

func (t *EmphasisClose) Closing() bool { return true }

func (t *StrongOpen) Closing() bool { return false }

func (t *StrongClose) Closing() bool { return true }

func (t *StrikethroughOpen) Closing() bool { return false }

func (t *StrikethroughClose) Closing() bool { return true }

func (t *Fence) Closing() bool { return false }

func (t *Softbreak) Closing() bool { return false }

func (t *Hardbreak) Closing() bool { return false }

func (t *HeadingOpen) Closing() bool { return false }

func (t *HeadingClose) Closing() bool { return true }

func (t *HTMLBlock) Closing() bool { return false }

func (t *HTMLInline) Closing() bool { return false }

func (t *Hr) Closing() bool { return false }

func (t *Image) Closing() bool { return false }

func (t *Inline) Closing() bool { return false }

func (t *LinkOpen) Closing() bool { return false }

func (t *LinkClose) Closing() bool { return true }

func (t *ParagraphOpen) Closing() bool { return false }

func (t *ParagraphClose) Closing() bool { return true }

func (t *TableOpen) Closing() bool { return false }

func (t *TableClose) Closing() bool { return true }

func (t *TheadOpen) Closing() bool { return false }

func (t *TheadClose) Closing() bool { return true }

func (t *TrOpen) Closing() bool { return false }

func (t *TrClose) Closing() bool { return true }

func (t *ThOpen) Closing() bool { return false }

func (t *ThClose) Closing() bool { return true }

func (t *TbodyOpen) Closing() bool { return false }

func (t *TbodyClose) Closing() bool { return true }

func (t *TdOpen) Closing() bool { return false }

func (t *TdClose) Closing() bool { return true }

func (t *Text) Closing() bool { return false }

func (t *BlockquoteOpen) Block() bool { return true }

func (t *BlockquoteClose) Block() bool { return true }

func (t *BulletListOpen) Block() bool { return true }

func (t *BulletListClose) Block() bool { return true }

func (t *OrderedListOpen) Block() bool { return true }

func (t *OrderedListClose) Block() bool { return true }

func (t *ListItemOpen) Block() bool { return true }

func (t *ListItemClose) Block() bool { return true }

func (t *CodeBlock) Block() bool { return true }

func (t *CodeInline) Block() bool { return false }

func (t *EmphasisOpen) Block() bool { return false }

func (t *EmphasisClose) Block() bool { return false }

func (t *StrongOpen) Block() bool { return false }

func (t *StrongClose) Block() bool { return false }

func (t *StrikethroughOpen) Block() bool { return false }

func (t *StrikethroughClose) Block() bool { return false }

func (t *Fence) Block() bool { return true }

func (t *Softbreak) Block() bool { return false }

func (t *Hardbreak) Block() bool { return false }

func (t *HeadingOpen) Block() bool { return true }

func (t *HeadingClose) Block() bool { return true }

func (t *HTMLBlock) Block() bool { return true }

func (t *HTMLInline) Block() bool { return false }

func (t *Hr) Block() bool { return true }

func (t *Image) Block() bool { return false }

func (t *Inline) Block() bool { return false }

func (t *LinkOpen) Block() bool { return false }

func (t *LinkClose) Block() bool { return false }

func (t *ParagraphOpen) Block() bool { return true }

func (t *ParagraphClose) Block() bool { return true }

func (t *TableOpen) Block() bool { return true }

func (t *TableClose) Block() bool { return true }

func (t *TheadOpen) Block() bool { return true }

func (t *TheadClose) Block() bool { return true }

func (t *TrOpen) Block() bool { return true }

func (t *TrClose) Block() bool { return true }

func (t *ThOpen) Block() bool { return true }

func (t *ThClose) Block() bool { return true }

func (t *TbodyOpen) Block() bool { return true }

func (t *TbodyClose) Block() bool { return true }

func (t *TdOpen) Block() bool { return true }

func (t *TdClose) Block() bool { return true }

func (t *Text) Block() bool { return false }

func (t *BlockquoteOpen) Tag() string { return "blockquote" }

func (t *BlockquoteClose) Tag() string { return "blockquote" }

func (t *BulletListOpen) Tag() string { return "ul" }

func (t *BulletListClose) Tag() string { return "ul" }

func (t *OrderedListOpen) Tag() string { return "ol" }

func (t *OrderedListClose) Tag() string { return "ol" }

func (t *ListItemOpen) Tag() string { return "li" }

func (t *ListItemClose) Tag() string { return "li" }

func (t *CodeBlock) Tag() string { return "code" }

func (t *CodeInline) Tag() string { return "code" }

func (t *EmphasisOpen) Tag() string { return "em" }

func (t *EmphasisClose) Tag() string { return "em" }

func (t *StrongOpen) Tag() string { return "strong" }

func (t *StrongClose) Tag() string { return "strong" }

func (t *StrikethroughOpen) Tag() string { return "s" }

func (t *StrikethroughClose) Tag() string { return "s" }

func (t *Fence) Tag() string { return "code" }

func (t *Softbreak) Tag() string { return "br" }

func (t *Hardbreak) Tag() string { return "br" }

func (t *HeadingOpen) Tag() string { return htags[t.HLevel] }

func (t *HeadingClose) Tag() string { return htags[t.HLevel] }

func (t *HTMLBlock) Tag() string { return "" }

func (t *HTMLInline) Tag() string { return "" }

func (t *Hr) Tag() string { return "hr" }

func (t *Image) Tag() string { return "img" }

func (t *Inline) Tag() string { return "" }

func (t *LinkOpen) Tag() string { return "a" }

func (t *LinkClose) Tag() string { return "a" }

func (t *ParagraphOpen) Tag() string { return "p" }

func (t *ParagraphClose) Tag() string { return "p" }

func (t *TableOpen) Tag() string { return "table" }

func (t *TableClose) Tag() string { return "table" }

func (t *TheadOpen) Tag() string { return "thead" }

func (t *TheadClose) Tag() string { return "thead" }

func (t *TrOpen) Tag() string { return "tr" }

func (t *TrClose) Tag() string { return "tr" }

func (t *ThOpen) Tag() string { return "th" }

func (t *ThClose) Tag() string { return "th" }

func (t *TbodyOpen) Tag() string { return "tbody" }

func (t *TbodyClose) Tag() string { return "tbody" }

func (t *TdOpen) Tag() string { return "td" }

func (t *TdClose) Tag() string { return "td" }

func (t *Text) Tag() string { return "" }