From fb2219a5844f8cf4df422378cd43ac262da64cc6 Mon Sep 17 00:00:00 2001 From: ericchiang Date: Tue, 2 Sep 2014 22:23:02 -0400 Subject: [PATCH] attribute function added --- README.md | 19 ++++++++++++++++++- funcs/display.go | 24 ++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e1cb584..8e1c1cc 100644 --- a/README.md +++ b/README.md @@ -164,6 +164,24 @@ References External links ``` +#### `attr{attrkey}` + +Print the values of all attributes with a given key from all selected nodes. + +```bash +$ pup < robots.html a attr{href} | head +#mw-navigation +#p-search +/wiki/MediaWiki:Robots.txt +//en.wikipedia.org/robots.txt +/wiki/Wikipedia:What_Wikipedia_is_not#NOTHOWTO +//en.wikipedia.org/w/index.php?title=Robots_exclusion_standard&action=edit +//meta.wikimedia.org/wiki/Help:Transwiki +//en.wikiversity.org/wiki/ +//en.wikibooks.org/wiki/ +//en.wikivoyage.org/wiki/ +``` + ## Flags ```bash @@ -178,6 +196,5 @@ External links ## TODO: -* Print attribute function `attr{attr1, attr2}` * Print as json function `json{}` * Switch `-n` from a flag to a function diff --git a/funcs/display.go b/funcs/display.go index 053b4b6..a014bf8 100644 --- a/funcs/display.go +++ b/funcs/display.go @@ -28,11 +28,26 @@ func (t TextDisplayer) Display(nodes []*html.Node) { } } +type AttrDisplayer struct { + Attr string +} + +func (a AttrDisplayer) Display(nodes []*html.Node) { + for _, node := range nodes { + attributes := node.Attr + for _, attr := range attributes { + if attr.Key == a.Attr { + fmt.Println(attr.Val) + } + } + } +} + var ( // Display function helpers displayMatcher *regexp.Regexp = regexp.MustCompile(`\{[^\}]*\}$`) textFuncMatcher = regexp.MustCompile(`^text\{\}$`) - attrFuncMatcher = regexp.MustCompile(`^attr\{[^\}]*\}$`) + attrFuncMatcher = regexp.MustCompile(`^attr\{([^\}]*)\}$`) ) func NewDisplayFunc(text string) (Displayer, error) { @@ -43,7 +58,12 @@ func NewDisplayFunc(text string) (Displayer, error) { case textFuncMatcher.MatchString(text): return TextDisplayer{}, nil case attrFuncMatcher.MatchString(text): - return nil, fmt.Errorf("attr") + matches := attrFuncMatcher.FindStringSubmatch(text) + if len(matches) != 2 { + return nil, fmt.Errorf("") + } else { + return AttrDisplayer{matches[1]}, nil + } } return nil, fmt.Errorf("Not a display function") }