@@ -64,11 +64,11 @@ func printNodeSet(n []dom.Node) {
64
64
}
65
65
}
66
66
67
- func printNodeSetTree (n []dom.Node ) {
67
+ func printNodeSetTree (n []dom.Node , unique bool ) {
68
68
var str string
69
69
l := len (n )
70
70
for i , e := range n {
71
- str += printTreeNode (e , 0 )
71
+ str += printTreeNode (e , 0 , unique )
72
72
if i + 1 < l {
73
73
str += "\n "
74
74
}
@@ -98,13 +98,13 @@ func printName(n *dom.Name) string {
98
98
// Use of this source code is governed by a BSD-style
99
99
// license that can be found in the LICENSE file.
100
100
//
101
- func printTreeNode (n dom.Node , level int ) string {
101
+ func printTreeNode (n dom.Node , level int , unique bool ) string {
102
102
var str string
103
103
switch n := n .(type ) {
104
104
case * dom.Document :
105
105
log .Printf ("Document. Children %d\n " , len (n .Children ()))
106
106
for _ , c := range n .Children () {
107
- str += printTreeNode (c , level + 1 )
107
+ str += printTreeNode (c , level + 1 , unique )
108
108
}
109
109
case * dom.Element :
110
110
str += "/"
@@ -123,21 +123,31 @@ func printTreeNode(n dom.Node, level int) string {
123
123
}
124
124
if len (n .Children ()) != 0 {
125
125
log .Printf ("Element '%s' Children %d\n " , n .Name , len (n .ChildNodes ))
126
- unique := make (map [string ]int )
126
+ uniqueMap := make (map [string ]int )
127
127
for _ , c := range n .Children () {
128
- tmpStr := printTreeNode (c , level + 1 )
128
+ tmpStr := printTreeNode (c , level + 1 , unique )
129
129
// Skip empty results
130
130
if tmpStr == "" {
131
131
continue
132
132
}
133
- if v , ok := unique [tmpStr ]; ok {
133
+ if ! unique {
134
+ if strings .HasPrefix (tmpStr , "/" ) {
135
+ str += "\n "
136
+ str += strings .Repeat (" " , level + 1 )
137
+ }
138
+ str += tmpStr
139
+ }
140
+ if v , ok := uniqueMap [tmpStr ]; ok {
134
141
count := v + 1
135
- unique [tmpStr ] = count
142
+ uniqueMap [tmpStr ] = count
136
143
} else {
137
- unique [tmpStr ] = 1
144
+ uniqueMap [tmpStr ] = 1
138
145
}
139
146
}
140
- for k , v := range unique {
147
+ if ! unique {
148
+ return str
149
+ }
150
+ for k , v := range uniqueMap {
141
151
if strings .HasPrefix (k , "/" ) {
142
152
str += "\n "
143
153
str += strings .Repeat (" " , level + 1 )
@@ -169,19 +179,21 @@ func printDoc(doc *dom.Document) {
169
179
170
180
func synopsis () {
171
181
synopsis := `# USAGE:
172
- xsect <file> [<xpath>] [<relative_xpath>] [--tree]
182
+ xsect <file> [<xpath>] [<relative_xpath>] [--tree [--unique] ]
173
183
174
184
xsect [--help]
175
185
`
176
186
fmt .Fprintln (os .Stderr , synopsis )
177
187
}
178
188
179
189
func main () {
190
+ var unique bool
180
191
opt := getoptions .New ()
181
192
opt .Bool ("help" , false )
182
193
opt .Bool ("debug" , false )
183
194
opt .Bool ("version" , false )
184
195
opt .Bool ("tree" , false )
196
+ opt .BoolVar (& unique , "unique" , false )
185
197
remaining , err := opt .Parse (os .Args [1 :])
186
198
if err != nil {
187
199
fmt .Fprintf (os .Stderr , "ERROR: %s\n " , err )
@@ -247,7 +259,7 @@ func main() {
247
259
}
248
260
log .Printf ("results: %d\n " , len (nodeSet ))
249
261
if opt .Called ("tree" ) {
250
- printNodeSetTree (nodeSet )
262
+ printNodeSetTree (nodeSet , unique )
251
263
os .Exit (0 )
252
264
}
253
265
printNodeSet (nodeSet )
0 commit comments