package ast

import (
	
	

	gast 
)

// Alignment is a text alignment of table cells.
type Alignment int

const (
	// AlignLeft indicates text should be left justified.
	AlignLeft Alignment = iota + 1

	// AlignRight indicates text should be right justified.
	AlignRight

	// AlignCenter indicates text should be centered.
	AlignCenter

	// AlignNone indicates text should be aligned by default manner.
	AlignNone
)

func ( Alignment) () string {
	switch  {
	case AlignLeft:
		return "left"
	case AlignRight:
		return "right"
	case AlignCenter:
		return "center"
	case AlignNone:
		return "none"
	}
	return ""
}

// A Table struct represents a table of Markdown(GFM) text.
type Table struct {
	gast.BaseBlock

	// Alignments returns alignments of the columns.
	Alignments []Alignment
}

// Dump implements Node.Dump.
func ( *Table) ( []byte,  int) {
	gast.DumpHelper(, , , nil, func( int) {
		 := strings.Repeat("    ", )
		fmt.Printf("%sAlignments {\n", )
		for ,  := range .Alignments {
			 := strings.Repeat("    ", +1)
			fmt.Printf("%s%s", , .String())
			if  != len(.Alignments)-1 {
				fmt.Println("")
			}
		}
		fmt.Printf("\n%s}\n", )
	})
}

// KindTable is a NodeKind of the Table node.
var KindTable = gast.NewNodeKind("Table")

// Kind implements Node.Kind.
func ( *Table) () gast.NodeKind {
	return KindTable
}

// NewTable returns a new Table node.
func () *Table {
	return &Table{
		Alignments: []Alignment{},
	}
}

// A TableRow struct represents a table row of Markdown(GFM) text.
type TableRow struct {
	gast.BaseBlock
	Alignments []Alignment
}

// Dump implements Node.Dump.
func ( *TableRow) ( []byte,  int) {
	gast.DumpHelper(, , , nil, nil)
}

// KindTableRow is a NodeKind of the TableRow node.
var KindTableRow = gast.NewNodeKind("TableRow")

// Kind implements Node.Kind.
func ( *TableRow) () gast.NodeKind {
	return KindTableRow
}

// NewTableRow returns a new TableRow node.
func ( []Alignment) *TableRow {
	return &TableRow{Alignments: }
}

// A TableHeader struct represents a table header of Markdown(GFM) text.
type TableHeader struct {
	gast.BaseBlock
	Alignments []Alignment
}

// KindTableHeader is a NodeKind of the TableHeader node.
var KindTableHeader = gast.NewNodeKind("TableHeader")

// Kind implements Node.Kind.
func ( *TableHeader) () gast.NodeKind {
	return KindTableHeader
}

// Dump implements Node.Dump.
func ( *TableHeader) ( []byte,  int) {
	gast.DumpHelper(, , , nil, nil)
}

// NewTableHeader returns a new TableHeader node.
func ( *TableRow) *TableHeader {
	 := &TableHeader{}
	for  := .FirstChild();  != nil; {
		 := .NextSibling()
		.AppendChild(, )
		 = 
	}
	return 
}

// A TableCell struct represents a table cell of a Markdown(GFM) text.
type TableCell struct {
	gast.BaseBlock
	Alignment Alignment
}

// Dump implements Node.Dump.
func ( *TableCell) ( []byte,  int) {
	gast.DumpHelper(, , , nil, nil)
}

// KindTableCell is a NodeKind of the TableCell node.
var KindTableCell = gast.NewNodeKind("TableCell")

// Kind implements Node.Kind.
func ( *TableCell) () gast.NodeKind {
	return KindTableCell
}

// NewTableCell returns a new TableCell node.
func () *TableCell {
	return &TableCell{
		Alignment: AlignNone,
	}
}