~shulhan/asciidoctor-go

2a51183943b29f9011d2ffa439a1cce502ce36cb — Shulhan 9 months ago 3465002
all: comply with linter recommendations
M Makefile => Makefile +3 -1
@@ 6,9 6,11 @@
all: test lint

lint:
	-revive ./...
	-fieldalignment ./...
	-shadow ./...
	-golangci-lint run \
		--presets bugs,metalinter,performance,unused \
		./...

test:
	go test -coverprofile=cover.out ./...

M attribute_entry.go => attribute_entry.go +4 -3
@@ 22,11 22,12 @@ func newAttributeEntry() AttributeEntry {
}

func (entry *AttributeEntry) apply(key, val string) {
	if key[0] == '!' {
	switch {
	case key[0] == '!':
		delete(*entry, strings.TrimSpace(key[1:]))
	} else if key[len(key)-1] == '!' {
	case key[len(key)-1] == '!':
		delete(*entry, strings.TrimSpace(key[:len(key)-1]))
	} else {
	default:
		(*entry)[key] = val
	}
}

M cell_format.go => cell_format.go +5 -4
@@ 37,13 37,14 @@ func parseCellFormat(raw string) (cf *cellFormat) {
		if len(raw) == 0 {
			return nil
		}
		if raw[0] == '*' {
		switch raw[0] {
		case '*':
			cf.ndupCol = n
			x = 1
		} else if raw[0] == '+' {
		case '+':
			cf.nspanCol = n
			x = 1
		} else if raw[0] == '.' {
		case '.':
			cf.nspanCol = n
			n, raw = parseCellFormatDigits(raw[1:])
			if n == 0 {


@@ 56,7 57,7 @@ func parseCellFormat(raw string) (cf *cellFormat) {
			}
			x = 1
			cf.nspanRow = n
		} else {
		default:
			return nil
		}
	}

M element.go => element.go +39 -32
@@ 101,7 101,8 @@ func (el *element) getVideoSource() string {
		isVimeo = true
	}

	if isYoutube {
	switch {
	case isYoutube:
		u.Scheme = `https`
		u.Host = `www.youtube.com`
		u.Path = `/embed/` + src


@@ 143,7 144,7 @@ func (el *element) getVideoSource() string {
			q = append(q, attrNameYoutubeLang+`=`+vstr)
		}

	} else if isVimeo {
	case isVimeo:
		u.Scheme = `https`
		u.Host = `player.vimeo.com`
		u.Path = `/video/` + src


@@ 159,7 160,7 @@ func (el *element) getVideoSource() string {
			fragment = `at=` + vstr
		}

	} else {
	default:
		for _, vstr = range el.options {
			switch vstr {
			case optNameAutoplay, optNameLoop:


@@ 729,15 730,16 @@ func (el *element) postParseParagraphAsQuote(lines [][]byte) bool {
	secondLastIdx = len(lines) - 2

	for x, line = range lines[:len(lines)-1] {
		if x == 0 {
		switch x {
		case 0:
			if x == secondLastIdx {
				el.Write(line[1 : len(line)-1])
			} else {
				el.Write(line[1:])
			}
		} else if x == secondLastIdx {
		case secondLastIdx:
			el.Write(line[:len(line)-1])
		} else {
		default:
			el.Write(line)
		}
		el.WriteByte('\n')


@@ 828,10 830,8 @@ func (el *element) toHTML(doc *Document, w io.Writer) {
					label = href
				}
			}
		} else {
			if len(label) == 0 {
				label = anchor.label
			}
		} else if len(label) == 0 {
			label = anchor.label
		}
		fmt.Fprintf(w, `<a href="#%s">%s</a>`, href, label)



@@ 851,13 851,14 @@ func (el *element) toHTML(doc *Document, w io.Writer) {
		htmlWriteSection(doc, el, w)

	case elKindParagraph:
		if el.isStyleAdmonition() {
		switch {
		case el.isStyleAdmonition():
			htmlWriteBlockAdmonition(el, w)
		} else if el.isStyleQuote() {
		case el.isStyleQuote():
			htmlWriteBlockQuote(el, w)
		} else if el.isStyleVerse() {
		case el.isStyleVerse():
			htmlWriteBlockVerse(el, w)
		} else {
		default:
			htmlWriteParagraphBegin(el, w)
		}



@@ 893,11 894,12 @@ func (el *element) toHTML(doc *Document, w io.Writer) {
			label.Write(el.rawLabel.Bytes())
		}

		if el.isStyleQandA() {
		switch {
		case el.isStyleQandA():
			format = _htmlListDescriptionItemQandABegin
		} else if el.isStyleHorizontal() {
		case el.isStyleHorizontal():
			format = _htmlListDescriptionItemHorizontalBegin
		} else {
		default:
			format = _htmlListDescriptionItemBegin
		}
		fmt.Fprintf(w, format, label.String())


@@ 919,13 921,14 @@ func (el *element) toHTML(doc *Document, w io.Writer) {
		htmlWriteBlockImage(doc, el, w)

	case elKindBlockOpen:
		if el.isStyleAdmonition() {
		switch {
		case el.isStyleAdmonition():
			htmlWriteBlockAdmonition(el, w)
		} else if el.isStyleQuote() {
		case el.isStyleQuote():
			htmlWriteBlockQuote(el, w)
		} else if el.isStyleVerse() {
		case el.isStyleVerse():
			htmlWriteBlockVerse(el, w)
		} else {
		default:
			htmlWriteBlockOpenBegin(el, w)
		}



@@ 1054,13 1057,14 @@ func (el *element) toHTML(doc *Document, w io.Writer) {
		fmt.Fprint(w, "\n</div>")

	case elKindParagraph:
		if el.isStyleAdmonition() {
		switch {
		case el.isStyleAdmonition():
			fmt.Fprint(w, _htmlAdmonitionEnd)
		} else if el.isStyleQuote() {
		case el.isStyleQuote():
			htmlWriteBlockQuoteEnd(el, w)
		} else if el.isStyleVerse() {
		case el.isStyleVerse():
			htmlWriteBlockVerseEnd(el, w)
		} else {
		default:
			fmt.Fprint(w, "</p>\n</div>")
		}



@@ 1069,11 1073,13 @@ func (el *element) toHTML(doc *Document, w io.Writer) {

	case elKindListDescriptionItem:
		var format string
		if el.isStyleQandA() {

		switch {
		case el.isStyleQandA():
			format = "\n</li>"
		} else if el.isStyleHorizontal() {
		case el.isStyleHorizontal():
			format = "\n</td>\n</tr>"
		} else {
		default:
			format = "\n</dd>"
		}
		fmt.Fprint(w, format)


@@ 1093,13 1099,14 @@ func (el *element) toHTML(doc *Document, w io.Writer) {
		}

	case elKindBlockOpen:
		if el.isStyleAdmonition() {
		switch {
		case el.isStyleAdmonition():
			fmt.Fprint(w, _htmlAdmonitionEnd)
		} else if el.isStyleQuote() {
		case el.isStyleQuote():
			htmlWriteBlockQuoteEnd(el, w)
		} else if el.isStyleVerse() {
		case el.isStyleVerse():
			htmlWriteBlockVerseEnd(el, w)
		} else {
		default:
			fmt.Fprint(w, "\n</div>\n</div>")
		}
	case elKindBlockExcerpts:

M element_table.go => element_table.go +1 -2
@@ 174,8 174,7 @@ func (table *elementTable) initializeClassAndStyles(ea *elementAttribute) {
		}
	}
	for _, k = range ea.options {
		switch k {
		case optNameAutowidth:
		if k == optNameAutowidth {
			withWidth = true
			table.classes.add(classNameFitContent)


M html_backend.go => html_backend.go +16 -12
@@ 819,7 819,8 @@ func htmlWriteBlockVideo(el *element, out io.Writer) {

	fmt.Fprintf(out, "\n<div class=%q>", attrValueContent)

	if isYoutube {
	switch {
	case isYoutube:
		var (
			optFullscreen string
			noFullscreen  bool


@@ 830,9 831,9 @@ func htmlWriteBlockVideo(el *element, out io.Writer) {
			optFullscreen = ` allowfullscreen`
		}
		fmt.Fprintf(out, _htmlBlockVideoYoutube, width, height, src, optFullscreen)
	} else if isVimeo {
	case isVimeo:
		fmt.Fprintf(out, _htmlBlockVideoVimeo, width, height, src)
	} else {
	default:
		var (
			optControls = ` controls`



@@ 932,16 933,17 @@ func htmlWriteFooter(doc *Document, out io.Writer) {
// htmlWriteFootnote generate HTML content for footnote.
// Each unique footnote will have its id, so it can be referenced at footer.
func htmlWriteFootnote(el *element, out io.Writer) {
	if len(el.ID) != 0 {
	switch {
	case len(el.ID) != 0:
		// The first footnote with explicit ID.
		fmt.Fprintf(out, `<sup class="footnote" id="_footnote_%s">[<a id="_footnoteref_%d" class="footnote" href="#_footnotedef_%d" title="View footnote.">%d</a>]</sup>`,
			el.ID, el.level, el.level, el.level)

	} else if len(el.key) != 0 {
	case len(el.key) != 0:
		// The first footnote without ID.
		fmt.Fprintf(out, `<sup class="footnote">[<a id="_footnoteref_%d" class="footnote" href="#_footnotedef_%d" title="View footnote.">%d</a>]</sup>`,
			el.level, el.level, el.level)
	} else {
	default:
		// The next footnote with same ID.
		fmt.Fprintf(out, `<sup class="footnoteref">[<a class="footnote" href="#_footnotedef_%d" title="View footnote.">%d</a>]</sup>`,
			el.level, el.level)


@@ 1110,13 1112,14 @@ func htmlWriteInlinePass(doc *Document, el *element, out io.Writer) {

func htmlWriteListDescription(el *element, out io.Writer) {
	var openTag string
	if el.isStyleQandA() {
	switch {
	case el.isStyleQandA() == true:
		htmlWriteBlockBegin(el, out, `qlist qanda`)
		openTag = "\n<ol>"
	} else if el.isStyleHorizontal() {
	case el.isStyleHorizontal() == true:
		htmlWriteBlockBegin(el, out, `hdlist`)
		openTag = "\n<table>"
	} else {
	default:
		htmlWriteBlockBegin(el, out, `dlist`)
		openTag = "\n<dl>"
	}


@@ 1125,11 1128,12 @@ func htmlWriteListDescription(el *element, out io.Writer) {
}

func htmlWriteListDescriptionEnd(el *element, out io.Writer) {
	if el.isStyleQandA() {
	switch {
	case el.isStyleQandA() == true:
		fmt.Fprintf(out, "\n</ol>\n</div>")
	} else if el.isStyleHorizontal() {
	case el.isStyleHorizontal() == true:
		fmt.Fprintf(out, "\n</table>\n</div>")
	} else {
	default:
		fmt.Fprintf(out, "\n</dl>\n</div>")
	}
}

M inline_parser.go => inline_parser.go +12 -0
@@ 73,6 73,12 @@ func (pi *inlineParser) do() {
			pi.prev = pi.c
			continue
		}

		// We use if-condition with "continue" to break and continue
		// the for-loop, so it is not possible to use switch-case
		// here.
		//
		//nolint:gocritic
		if pi.c == '+' {
			if pi.isEscaped {
				pi.escape()


@@ 250,6 256,12 @@ func (pi *inlineParser) do() {
				pi.escape()
				continue
			}

			// We use if-condition with "continue" to break and
			// continue the for-loop, so it is not possible
			// to use switch-case here.
			//
			//nolint:gocritic
			if pi.nextc == '<' {
				if pi.parseCrossRef() {
					continue

M parser.go => parser.go +41 -27
@@ 375,6 375,12 @@ func applySubstitutions(doc *Document, content []byte) []byte {
	)
	for x < len(raw) {
		c = raw[x]

		// We use if-condition with "continue" to break and continue
		// the for-loop, so it is not possible to use switch-case
		// here.
		//
		//nolint:gocritic
		if c == '{' {
			newRaw, ok = parseAttrRef(doc, raw, x)
			if ok {


@@ 462,7 468,7 @@ func generateID(doc *Document, str string) string {
		bout = append(bout, '_')
	} else if !ascii.IsAlpha(bout[0]) && bout[0] != '_' {
		bout = append(bout, '_')
		copy(bout[1:], bout[:])
		copy(bout[1:], bout)
		bout[0] = '_'
	}



@@ 471,17 477,18 @@ func generateID(doc *Document, str string) string {

func isAdmonition(line []byte) bool {
	var x int
	if bytes.HasPrefix(line, []byte(admonitionCaution)) {
	switch {
	case bytes.HasPrefix(line, []byte(admonitionCaution)):
		x = len(admonitionCaution)
	} else if bytes.HasPrefix(line, []byte(admonitionImportant)) {
	case bytes.HasPrefix(line, []byte(admonitionImportant)):
		x = len(admonitionImportant)
	} else if bytes.HasPrefix(line, []byte(admonitionNote)) {
	case bytes.HasPrefix(line, []byte(admonitionNote)):
		x = len(admonitionNote)
	} else if bytes.HasPrefix(line, []byte(admonitionTip)) {
	case bytes.HasPrefix(line, []byte(admonitionTip)):
		x = len(admonitionTip)
	} else if bytes.HasPrefix(line, []byte(admonitionWarning)) {
	case bytes.HasPrefix(line, []byte(admonitionWarning)):
		x = len(admonitionWarning)
	} else {
	default:
		return false
	}
	if x >= len(line) {


@@ 810,9 817,10 @@ func whatKindOfLine(line []byte) (kind int, spaces, got []byte) {
		}
	}

	if line[0] == ':' {
	switch line[0] {
	case ':':
		kind = lineKindAttribute
	} else if line[0] == '[' {
	case '[':
		var (
			newline = bytes.TrimRight(line, " \t")
			l       = len(newline)


@@ 838,26 846,28 @@ func whatKindOfLine(line []byte) (kind int, spaces, got []byte) {
			}
		}
		return lineKindAttributeElement, spaces, line
	} else if line[0] == '=' {
	case '=':
		var subs = bytes.Fields(line)

		if bytes.Equal(subs[0], []byte(`==`)) {
		switch string(subs[0]) {
		case `==`:
			kind = elKindSectionL1
		} else if bytes.Equal(subs[0], []byte(`===`)) {
		case `===`:
			kind = elKindSectionL2
		} else if bytes.Equal(subs[0], []byte(`====`)) {
		case `====`:
			kind = elKindSectionL3
		} else if bytes.Equal(subs[0], []byte(`=====`)) {
		case `=====`:
			kind = elKindSectionL4
		} else if bytes.Equal(subs[0], []byte(`======`)) {
		case `======`:
			kind = elKindSectionL5
		}
	} else if line[0] == '.' {
		if len(line) <= 1 {
	case '.':
		switch {
		case len(line) <= 1:
			kind = lineKindText
		} else if ascii.IsAlnum(line[1]) {
		case ascii.IsAlnum(line[1]):
			kind = lineKindBlockTitle
		} else {
		default:
			x = 0
			for ; x < len(line); x++ {
				if line[x] == '.' {


@@ 869,7 879,7 @@ func whatKindOfLine(line []byte) (kind int, spaces, got []byte) {
				}
			}
		}
	} else if line[0] == '*' || line[0] == '-' {
	case '*', '-':
		if len(line) <= 1 {
			kind = lineKindText
			return kind, spaces, line


@@ 904,13 914,17 @@ func whatKindOfLine(line []byte) (kind int, spaces, got []byte) {
			kind = lineKindText
		}
		return kind, spaces, line

	} else if bytes.Equal(line, []byte(`+`)) {
		kind = lineKindListContinue
	} else if bytes.Equal(line, []byte(`----`)) {
		kind = elKindBlockListing
	} else if isLineDescriptionItem(line) {
		kind = elKindListDescriptionItem
	default:
		switch string(line) {
		case `+`:
			kind = lineKindListContinue
		case `----`:
			kind = elKindBlockListing
		default:
			if isLineDescriptionItem(line) {
				kind = elKindListDescriptionItem
			}
		}
	}
	return kind, spaces, line
}

M section_counters.go => section_counters.go +4 -3
@@ 16,16 16,17 @@ type sectionCounters struct {
}

func (sec *sectionCounters) set(level int) *sectionCounters {
	if level == sec.curr {
	switch {
	case level == sec.curr:
		sec.nums[level]++
	} else if level > sec.curr {
	case level > sec.curr:
		// Check if the section level out of sequence.
		if level > sec.curr+1 {
			level = sec.curr + 1
		}
		sec.nums[level] = 1
		sec.curr = level
	} else {
	default:
		var x int
		for x = sec.curr; x > level; x-- {
			sec.nums[x] = 0

M table_parser.go => table_parser.go +5 -0
@@ 79,6 79,11 @@ func (pt *tableParser) toCells() {
	tokenTrim = strings.TrimSpace(token)
	l = len(tokenTrim)
	for {
		// We use if-condition with "continue" to break and continue
		// the for-loop, so it is not possible to use switch-case
		// here.
		//
		//nolint:gocritic
		if c == '\n' {
			if l > 0 {
				cell.writeString(token)