Skip to content

Commit

Permalink
change Tager -> parseTag
Browse files Browse the repository at this point in the history
  • Loading branch information
foolin committed Apr 23, 2020
1 parent 18cded6 commit 6dfff73
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 33 deletions.
2 changes: 1 addition & 1 deletion function.go
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,6 @@ func (builtin BuiltinFunctions) EqAndOutHtml(node *goquery.Selection, args ...st

// RegisterFunc register function for parse
func (p *Pagser) RegisterFunc(name string, fn CallFunc) error {
p.funcs[name] = fn
p.ctxFuncs[name] = fn
return nil
}
12 changes: 6 additions & 6 deletions pagser.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ import "errors"

// Pagser the page parser
type Pagser struct {
config Config
tagers map[string]*Tager // tager value => Tager
funcs map[string]CallFunc // name => func
config Config
ctxTags map[string]*parseTag // tag value => parseTag
ctxFuncs map[string]CallFunc // name => func
}

// New create client
Expand All @@ -35,9 +35,9 @@ func NewWithConfig(cfg Config) (*Pagser, error) {
return nil, errors.New("IgnoreSymbol must not empty")
}
return &Pagser{
config: cfg,
tagers: make(map[string]*Tager, 0),
funcs: builtinFuncMap,
config: cfg,
ctxTags: make(map[string]*parseTag, 0),
ctxFuncs: builtinFuncMap,
}, nil
}

Expand Down
30 changes: 15 additions & 15 deletions parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ func (p *Pagser) doParse(v interface{}, stackRefValues []reflect.Value, selectio
tagValue, tagOk := fieldType.Tag.Lookup(p.config.TagerName)
if !tagOk {
if p.config.Debug {
fmt.Printf("[WARN] not found tager name=[%v] in field: %v, eg: `%v:\".navlink a->attr(href)\"`\n",
fmt.Printf("[WARN] not found tag name=[%v] in field: %v, eg: `%v:\".navlink a->attr(href)\"`\n",
p.config.TagerName, fieldType.Name, p.config.TagerName)
}
continue
Expand All @@ -69,21 +69,21 @@ func (p *Pagser) doParse(v interface{}, stackRefValues []reflect.Value, selectio
continue
}

tager, ok := p.tagers[tagValue]
if !ok || tager == nil {
tager = p.newTager(tagValue)
p.tagers[tagValue] = tager
tag, ok := p.ctxTags[tagValue]
if !ok || tag == nil {
tag = p.newTag(tagValue)
p.ctxTags[tagValue] = tag
}

node := selection
if tager.Selector != "" {
node = selection.Find(tager.Selector)
if tag.Selector != "" {
node = selection.Find(tag.Selector)
}

var callOutValue interface{}
var callErr error
if tager.FuncName != "" {
callOutValue, callErr = p.findAndExecFunc(objRefValue, stackRefValues, tager, node)
if tag.FuncName != "" {
callOutValue, callErr = p.findAndExecFunc(objRefValue, stackRefValues, tag, node)
if callErr != nil {
return fmt.Errorf("tag=`%v` parse func error: %v", tagValue, callErr)
}
Expand Down Expand Up @@ -137,9 +137,9 @@ func (p *Pagser) doParse(v interface{}, stackRefValues []reflect.Value, selectio
}
default:
//slice.Index(i).Set(itemValue)
if tager.FuncName != "" {
itemOutValue, itemErr := p.findAndExecFunc(objRefValue, stackRefValues, tager, subNode)
//fmt.Printf("call slice func %v value: %v\n", tager.FuncName, itemOutValue)
if tag.FuncName != "" {
itemOutValue, itemErr := p.findAndExecFunc(objRefValue, stackRefValues, tag, subNode)
//fmt.Printf("call slice func %v value: %v\n", tag.FuncName, itemOutValue)
if itemErr != nil {
err = fmt.Errorf("tag=`%v` parse slice item error: %v", tagValue, itemErr)
return false
Expand Down Expand Up @@ -184,7 +184,7 @@ func (p *Pagser) doParse(v interface{}, stackRefValues []reflect.Value, selectio
fieldType := refTypeElem.Field(i)
fieldValue := refValueElem.Field(i)
*/
func (p *Pagser) findAndExecFunc(objRefValue reflect.Value, stackRefValues []reflect.Value, selTag *Tager, node *goquery.Selection) (interface{}, error) {
func (p *Pagser) findAndExecFunc(objRefValue reflect.Value, stackRefValues []reflect.Value, selTag *parseTag, node *goquery.Selection) (interface{}, error) {
if selTag.FuncName != "" {

//call object method
Expand All @@ -207,7 +207,7 @@ func (p *Pagser) findAndExecFunc(objRefValue reflect.Value, stackRefValues []ref
}

//global function
if fn, ok := p.funcs[selTag.FuncName]; ok {
if fn, ok := p.ctxFuncs[selTag.FuncName]; ok {
outValue, err := fn(node, selTag.FuncParams...)
if err != nil {
return nil, fmt.Errorf("call registered func %v error: %v", selTag.FuncName, err)
Expand All @@ -230,7 +230,7 @@ func findMethod(objRefValue reflect.Value, funcName string) reflect.Value {
return objRefValue.Elem().MethodByName(funcName)
}

func execMethod(callMethod reflect.Value, selTag *Tager, node *goquery.Selection) (interface{}, error) {
func execMethod(callMethod reflect.Value, selTag *parseTag, node *goquery.Selection) (interface{}, error) {
callParams := make([]reflect.Value, 0)
callParams = append(callParams, reflect.ValueOf(node))

Expand Down
21 changes: 19 additions & 2 deletions pagser_test.go → parse_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ import (
type PageData struct {
Title string `pagser:"title"`
Keywords []string `pagser:"meta[name='keywords']->attrSplit(content)"`
H1 string `pagser:"h1->text()"`
H1 string `pagser:"h1"`
H1Text string `pagser:"h1->text()"`
H1Html string `pagser:"h1->html()"`
H1OutHtml string `pagser:"h1->outerHtml()"`
MyGlobalFuncValue string `pagser:"h1->MyGlobFunc()"`
Expand All @@ -19,7 +20,7 @@ type PageData struct {
FillFieldOtherValue string //Set value by FillFieldFunc()
NavList []struct {
ID int `pagser:"a->attrInt(id, -1)"`
Name string `pagser:"a"`
Name string `pagser:"a->text()"`
Url string `pagser:"a->attr(href)"`
ParentFuncName string `pagser:"a->ParentFunc()"`
} `pagser:".navlink li"`
Expand All @@ -35,6 +36,7 @@ type PageData struct {
NavEqOutHtml string `pagser:".navlink li->eqAndOutHtml(1)"`
WordsSplitArray []string `pagser:".words->split(|)"`
Value string `pagser:"input[name='feedback']->value()"`
SameFuncValue string `pagser:"h1->SameFunc()"`
SubPageData *SubPageData `pagser:".navlink li:last-child"`
}

Expand All @@ -43,6 +45,11 @@ func MyGlobalFunc(selection *goquery.Selection, args ...string) (out interface{}
return "Global-" + selection.Text(), nil
}

// this method will auto call, not need register.
func SameFunc(selection *goquery.Selection, args ...string) (out interface{}, err error) {
return "Global-Same-Func-" + selection.Text(), nil
}

// this method will auto call, not need register.
func (pd PageData) MyStructFunc(selection *goquery.Selection, args ...string) (out interface{}, err error) {
return "Struct-" + selection.Text(), nil
Expand All @@ -59,16 +66,25 @@ func (pd *PageData) FillFieldFunc(selection *goquery.Selection, args ...string)
return "FillFieldFunc-" + text, nil
}

func (pd *PageData) SameFunc(selection *goquery.Selection, args ...string) (out interface{}, err error) {
return "Struct-Same-Func-" + selection.Text(), nil
}

type SubPageData struct {
Text string `pagser:"->text()"`
SubFuncValue string `pagser:"->SubFunc()"`
ParentFuncValue string `pagser:"->ParentFunc()"`
SameFuncValue string `pagser:"->SameFunc()"`
}

func (spd SubPageData) SubFunc(selection *goquery.Selection, args ...string) (out interface{}, err error) {
return "SubFunc-" + selection.Text(), nil
}

func (spd SubPageData) SameFunc(selection *goquery.Selection, args ...string) (out interface{}, err error) {
return "Sub-Struct-Same-Func-" + selection.Text(), nil
}

const rawPpageHtml = `
<!doctype html>
<html>
Expand Down Expand Up @@ -106,6 +122,7 @@ func TestParse(t *testing.T) {

//register global function
p.RegisterFunc("MyGlobFunc", MyGlobalFunc)
p.RegisterFunc("SameFunc", SameFunc)

var data PageData
err = p.Parse(&data, rawPpageHtml)
Expand Down
18 changes: 9 additions & 9 deletions tager.go → tag.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,16 @@ var rxFunc = regexp.MustCompile("^\\s*([a-zA-Z]+)\\s*(\\(([^\\)]*)\\))?\\s*$")
// ignoreTagSymbol = "-"
//)

// Tager struct tag info
type Tager struct {
// parseTag struct tag info
type parseTag struct {
Selector string
FuncName string
FuncParams []string
}

func (p *Pagser) newTager(tagValue string) *Tager {
func (p *Pagser) newTag(tagValue string) *parseTag {
//fmt.Println("tag value: ", tagValue)
cssParser := &Tager{}
cssParser := &parseTag{}
if tagValue == "" {
return cssParser
}
Expand All @@ -43,13 +43,13 @@ func (p *Pagser) newTager(tagValue string) *Tager {
funcValue = selectors[i]
}
}
matchs := rxFunc.FindStringSubmatch(funcValue)
if len(matchs) < 3 {
matches := rxFunc.FindStringSubmatch(funcValue)
if len(matches) < 3 {
return cssParser
}
cssParser.FuncName = strings.TrimSpace(matchs[1])
//cssParser.FuncParams = strings.Split(matchs[2], ",")
cssParser.FuncParams = parseFuncParams(matchs[3])
cssParser.FuncName = strings.TrimSpace(matches[1])
//cssParser.FuncParams = strings.Split(matches[2], ",")
cssParser.FuncParams = parseFuncParams(matches[3])
if p.config.Debug {
fmt.Printf("----- debug -----\n`%v`\n%v\n", tagValue, prettyJson(cssParser))
}
Expand Down
File renamed without changes.

0 comments on commit 6dfff73

Please sign in to comment.