Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement --invert to remove tags matching selector. #81

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
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
4 changes: 4 additions & 0 deletions parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ var (
pupPreformatted bool = false
pupPrintColor bool = false
pupEscapeHTML bool = true
pupInvertSelect bool = false
pupIndentString string = " "
pupDisplayer Displayer = TreeDisplayer{}
)
Expand Down Expand Up @@ -56,6 +57,7 @@ Flags
-n --number print number of elements selected
-l --limit restrict number of levels printed
-p --plain don't escape html
-v --invert invert selection (remove matching elements)
--pre preserve preformatted text
--charset specify the charset for pup to use
--version display version
Expand Down Expand Up @@ -89,6 +91,8 @@ func ProcessFlags(cmds []string) (nonFlagCmds []string, err error) {
pupPrintColor = true
case "-p", "--plain":
pupEscapeHTML = false
case "-v", "--invert":
pupInvertSelect = true
case "--pre":
pupPreformatted = true
case "-f", "--file":
Expand Down
30 changes: 29 additions & 1 deletion pup.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,5 +76,33 @@ func main() {
}
}
selectedNodes = append(selectedNodes, currNodes...)
pupDisplayer.Display(selectedNodes)
if pupInvertSelect {
RemoveInverseMatches(root, selectedNodes)
pupDisplayer.Display([]*html.Node{root})
} else {
pupDisplayer.Display(selectedNodes)
}
}

func RemoveInverseMatches(root *html.Node, selectedNodes []*html.Node) {
var remove []*html.Node
for node := root.FirstChild; node != nil; node = node.NextSibling {
if HtmlNodeInList(node, selectedNodes) {
remove = append(remove, node)
} else {
RemoveInverseMatches(node, selectedNodes)
}
}
for _, rm := range remove {
root.RemoveChild(rm)
}
}

func HtmlNodeInList(a *html.Node, list []*html.Node) bool {
for _, b := range list {
if b == a {
return true
}
}
return false
}
5 changes: 3 additions & 2 deletions tests/cmds.txt
Original file line number Diff line number Diff line change
Expand Up @@ -45,5 +45,6 @@ link , a
link , a sup
link , a:parent-of(sup)
link , a:parent-of(sup) sup
li --number
li -n
li --number
li -n
li a --invert
9 changes: 5 additions & 4 deletions tests/expected_output.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ a92e50c09cd56970625ac3b74efbddb83b2731bb table li
66950e746590d7f4e9cfe3d1adef42cd0addcf1d table li:last-of-type
0a37d612cd4c67a42bd147b1edc5a1128456b017 table a[title="The Practice of Programming"]
0d3918d54f868f13110262ffbb88cbb0b083057d table a[title="The Practice of Programming"] text{}
ecb542a30fc75c71a0c6380692cbbc4266ccbce4 json{}
199188dc8f1522426a628e41d96264bffb8beb0f json{}
95ef88ded9dab22ee3206cca47b9c3a376274bda text{}
e4f7358fbb7bb1748a296fa2a7e815fa7de0a08b .after-portlet
da39a3ee5e6b4b0d3255bfef95601890afd80709 .after
Expand All @@ -34,7 +34,7 @@ d314e83b059bb876b0e5ee76aa92d54987961f9a .navbox-list li:nth-last-child(1)
613bf65ac4042b6ee0a7a47f08732fdbe1b5b06b #toc
da39a3ee5e6b4b0d3255bfef95601890afd80709 #toc li + a
da39a3ee5e6b4b0d3255bfef95601890afd80709 #toc li + a text{}
97d170e1550eee4afc0af065b78cda302a97674c #toc li + a json{}
cd0d4cc32346750408f7d4f5e78ec9a6e5b79a0d #toc li + a json{}
da39a3ee5e6b4b0d3255bfef95601890afd80709 #toc li + a + span
da39a3ee5e6b4b0d3255bfef95601890afd80709 #toc li + span
da39a3ee5e6b4b0d3255bfef95601890afd80709 #toc li > li
Expand All @@ -45,5 +45,6 @@ da39a3ee5e6b4b0d3255bfef95601890afd80709 #toc li > li
0d1f66765d1632c70f8608947890524e78459362 link , a sup
b6a3d6cccd305fcc3e8bf2743c443743bdaaa02b link , a:parent-of(sup)
0d1f66765d1632c70f8608947890524e78459362 link , a:parent-of(sup) sup
da39a3ee5e6b4b0d3255bfef95601890afd80709 li --number
da39a3ee5e6b4b0d3255bfef95601890afd80709 li -n
d200756078ef79d77fb17848c5f15b85bcea7e00 li --number
d200756078ef79d77fb17848c5f15b85bcea7e00 li -n
1fa074385374bcd613394678b5e08ed1ad4d5d9d li a --invert
2 changes: 1 addition & 1 deletion tests/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

for line in open("cmds.txt", "r"):
line = line.strip()
p = Popen(['pup', line], stdout=PIPE, stdin=PIPE, stderr=PIPE)
p = Popen(['pup']+line.split('\t'), stdout=PIPE, stdin=PIPE, stderr=PIPE)
h = sha1()
h.update(p.communicate(input=data)[0])
print("%s %s" % (h.hexdigest(), line))