Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions cmd/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package main

import (
"fmt"

"github.com/bangumi/wiki-parser-go"
)

func main() {
_, err := wiki.Parse(`{{Infobox animanga/Manga
|中文名= 坐在旁边的家伙用这种眼神看着我
|别名={邻座的家伙用瑟瑟的眼神盯着我的故事
}
|作者= mmk
|作画=
}}`)
if err == nil {
panic("expecting error")
}

fmt.Println(err.Error())

se := err.(*wiki.SyntaxError)

fmt.Println(se.ReadableError())
}
41 changes: 33 additions & 8 deletions error.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,41 @@

package wiki

import "strconv"
import (
"fmt"
"strconv"
"strings"
)

var _ interface {
Error() string
Unwrap() error
} = (*SyntaxError)(nil)

type SyntaxError struct {
Err error
Line string
Lino int
Err error
Line string
Lino int
infobox string
}

func (w *SyntaxError) ReadableError() string {
fmt.Println(w.Lino)

lines := strings.Split(w.infobox, "\n")
show := lines[max(w.Lino-3, 0) : w.Lino-1]

var buf strings.Builder
for _, line := range show {
buf.WriteString(line)
buf.WriteRune('\n')
}

buf.WriteString(strings.Repeat("^", len(lines[w.Lino-1])))
buf.WriteRune('\n')

buf.WriteString(w.Err.Error())
return buf.String()
}

func (p *SyntaxError) Error() string {
Expand All @@ -35,10 +59,11 @@ func (p *SyntaxError) Unwrap() error {
return p.Err
}

func wrapError(err error, lino int, line string) error {
func wrapError(err error, lino int, line string, infobox string) error {
return &SyntaxError{
Line: line,
Lino: lino,
Err: err,
Line: line,
Lino: lino,
Err: err,
infobox: infobox,
}
}
23 changes: 16 additions & 7 deletions parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,20 +46,29 @@ const suffix = "}}"

//nolint:funlen,gocognit,gocyclo
func Parse(s string) (Wiki, error) {
var originalInput = s
var w = Wiki{}
s, lineOffset := processInput(s)
if s == "" {
return w, nil
}

if !strings.HasPrefix(s, prefix) {
return Wiki{}, ErrGlobalPrefix
return Wiki{}, &SyntaxError{
Err: ErrGlobalPrefix,
Lino: lineOffset,
infobox: originalInput,
}
}

eolCount := strings.Count(s, "\n")

if !strings.HasSuffix(s, suffix) {
return Wiki{}, ErrGlobalSuffix
return Wiki{}, &SyntaxError{
Err: ErrGlobalSuffix,
Lino: lineOffset + eolCount,
infobox: originalInput,
}
}

w.Type = readType(s)
Expand Down Expand Up @@ -96,7 +105,7 @@ func Parse(s string) (Wiki, error) {
// can't find next line
if inArray {
// array should be close have read all contents
return Wiki{}, wrapError(ErrArrayNoClose, lino+1, s[secondLastEOL:lastEOL])
return Wiki{}, wrapError(ErrArrayNoClose, lino+1, s[secondLastEOL:lastEOL], originalInput)
}

break
Expand All @@ -112,12 +121,12 @@ func Parse(s string) (Wiki, error) {
// new field
currentField = Field{}
if inArray {
return Wiki{}, wrapError(ErrArrayNoClose, lino, line)
return Wiki{}, wrapError(ErrArrayNoClose, lino, line, originalInput)
}

key, value, err := readStartLine(trimLeftSpace(line[1:])) // read "key = value"
if err != nil {
return Wiki{}, wrapError(err, lino, line)
return Wiki{}, wrapError(err, lino, line, originalInput)
}

switch value {
Expand Down Expand Up @@ -150,7 +159,7 @@ func Parse(s string) (Wiki, error) {
// array item
key, value, err := readArrayItem(line)
if err != nil {
return Wiki{}, wrapError(err, lino, line)
return Wiki{}, wrapError(err, lino, line, originalInput)
}
itemContainer = append(itemContainer, Item{
Key: key,
Expand All @@ -159,7 +168,7 @@ func Parse(s string) (Wiki, error) {
}

if !inArray {
return Wiki{}, wrapError(ErrExpectingNewField, lino, line)
return Wiki{}, wrapError(ErrExpectingNewField, lino, line, originalInput)
}
}

Expand Down