about summary refs log tree commit diff
path: root/Completion/Unix/Command/_xmlstarlet
blob: 4c825704653e39695c2d76e5aeecd02c1b53991a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#compdef xmlstarlet xml

local curcontext="$curcontext" ret=1
local -a args state line suf

args=( '(- *)--help[display usage information]' )
_arguments -C -A "-*" $args \
  '(-q --quiet)'{-q,--quiet}'[no error output]' \
  "--no-doc-namespace[don't extract namespace bindings from input doc]" \
  '!(--no-doc-namespace)--doc-namespace' \
  '(-)--version[display version information]' \
  '1:command:((
    ed{,it}\:edit\ or\ update\ documents
    sel{,ect}\:select\ date\ or\ query\ documents
    tr{,ransform}\:transform\ documents\ using\ XSLT
    val{,idate}\:validate\ documents
    fo{,rmat}\:format\ documents
    el{,ements}\:display\ element\ structure
    {c14n,canonic}\:XML\ canonicalization
    l{s,ist}\:list\ directory\ as\ XML
    esc{,ape}\:escape\ special\ XML\ characters
    unesc{,ape}\:unescape\ special\ XML\ characters
    {pyx,xmln}\:convert\ XML\ into\ the\ line-oriented\ PYX\ format
    {p2x,depyx}\:convert\ PYX\ into\ XML
  ))' \
  '*: :->args' && ret=0

if [[ -n $state ]]; then
  shift words
  (( CURRENT-- ))
  curcontext="${curcontext%:*:*}:$service-${words[1]}:"
  case $words[1] in
    el(|ements)|fo(|rmat)|sel(|ect)|c14n|canonic|xmln|pyx)
      args+=( '1:file:_files -g "(#i)*.xml(-.)"' )
    ;|
    ed(|it)|sel(|ect))
      args+=( '*-N[predefine namespaces]:namespace' )
    ;|
    c14n|canonic|ed(|it)|fo(|rmat)|sel(|ect)|tr(|ansform)|val(|idate))
      args+=( '--net[allow fetching of DTDs or entities over network]' )
    ;|
    fo(|rmat)|tr(|ansform))
      args+=( '(-o --omit-decl)'{-o,--omit-decl}'[omit XML declaration]' )
    ;|

    ed(|it))
      args=(
	'(opt)*'{-d,--delete}'[remove element]:xpath expression'
	'(opt)*'{-i,--insert}'[add element before node matched by expression]:xpath expression - insert before matched node'
	'(opt)*'{-a,--append}'[add element after node matched by expression]:xpath expression - insert after matched node'
	'(opt)*'{-s,--subnode}'[add element as a child of node matched by expression]:xpath expression for parent modes'
	'(opt)*'{-m,--move}'[move element]:xpath expression: :xpath expression'
	'(opt)*'{-r,--rename}'[rename element]:xpath expression'
	'(opt)*'{-u,--update}'[update element]:xpath expression'
	'*:file:_files -g "(#i)*.xml(-.)"'
	+ opt $args
	'(-P -S --pf --ps)'{-P,-S,--pf,--ps}'[preserve whitespace nodes]'
	'(-O --omit-decl)'{-O,--omit-decl}'[omit XML declaration]'
	'(-L --inplace)'{-L,--inplace}'[edit file inplace]'
      )
      if [[ -n ${${words[2,CURRENT-1]}[(r)-([ias]|-insert|-append|-subnode)]} ]]; then
	args=(
	  '(opt)*'{-t,--type}'[specify type of node to add]:type:(elem text attr)'
	  '(opt)*'{-n,--name}'[specify name of node to add]:name'
	  $args
	)
      fi
      if [[ -n ${${words[2,CURRENT-1]}[(r)-([iasru]|-insert|-append|-subnode|-rename|-update)]} ]]; then
	args=( '(opt)*'{-v,--value}'[specify value of node to add or name of renamed node]:value' $args )
      fi
    ;;
    el(|ements))
      args+=(
	'(-)-a[show attributes as well]'
	'(-)-v[show attributes and their values]'
	'(-)-u[print out sorted unique lines]'
	'(-)-d-[print out sorted unique lines up to specified depth]:depth'
      )
    ;;
    fo(|rmat))
      args+=(
	'(-t --indent-tab -s --indent-spaces -n --noindent)'{-n,--noindent}"[don't indent]"
	'(-t --indent-tab -s --indent-spaces -n --noindent)'{-t,--indent-tab}'[indent output with tabs]'
	'(-t --indent-tab -s --indent-spaces -n --noindent)'{-s,--indent-spaces}'[indent output with specified number of spaces]:spaces'
	'(-R --recover)'{-R,--recover}'[try to recover what is parsable]'
	'(-D --dropdtd)'{-D,--dropdtd}'[remove the DOCTYPE of the input docs]'
	'(-C --nocdata)'{-C,--nocdata}'[replace cdata section with text nodes]'
	'(-N --nsclean)'{-N,--nsclean}'[remove redundant namespace declarations]'
	'(-e --encode)'{-e,--encode}'[output in the specified encoding]:encoding'
	'(-H --html)'{-H,--html}'[input is HTML]'
      )
    ;;
    sel(|ect))
      [[ -n ${${words[2,CURRENT-1]}[(r)-t]} ]] && args+=(
	\*{-c,--copy-of}'[print copy of XPath expression]:xpath expression'
	\*{-v,--value-of}'[print value of XPath expression]:xpath expression'
	\*{-o,--output}'[output string literal]:string'
	\*{-n,--nl}'[print new line]'
	\*{-f,--inp-name}'[print input file name (or URL)]'
	\*{-m,--match}'[match XPath expression]:xpath expression'
	\*{-v,--var}'[declare a variable]:variable'
	\*{-i,--if,--elif}'[check condition]:condition'
	'*--else[check if previous conditions failed]'
	\*{-e,--elem}'[print out specified element]:element'
	\*{-b,--break}'[break nesting]'
	\*{-s,--sort}'[specify sort order]:order:->ordering:xpath expression'
      )
      args+=(
	'(opt)*-t[start query template]'
	+ opt
	'(-Q --quiet)'{-Q,--quiet}"[don't write anything to standard output]"
	'(-C --comp)'{-C,--comp}'[display generated XSLT]'
	'(-R --root)'{-R,--root}'[print root element]'
	'(-T --text -e --elem)'{-T,--text}'[output is text]'
	'(-I --indent)'{-I,--indent}'[indent output]'
	'(-D --xml-decl)'{-D,--xml-decl}"[don't omit xml declaration line]"
	'(-B --noblanks)'{-B,--noblanks}'[remove insignificant spaces from XML tree]'
	'(-E --encode)'{-E,--encode}'[output in the specified encoding]:encoding'
      )
    ;;
    tr(|ansform))
      args+=(
	'(--embed -E)'{--embed,-E}'[allow applying embedded stylesheet]'
	'(1 * -)--show-ext[show list of extensions]'
	'--val[allow validation against DTD or schema]'
	'--xinclude[do XInclude processing on document input]'
	'--maxdepth[increase the maximum depth]:val'
	'--html[input is HTML]'
	'1:xsl file:_files -g "(#i)*.xsl(|t)(-.)"'
	'*:xml file:_files'
      )
    ;;
    val(|idate))
      args+=(
	'!(-d --dtd -s --xsd -r --relaxng)'{-w,--well-formed}
	'(-d --dtd -s --xsd -r --relaxng)'{-d,--dtd}'[validate against DTD]:file:_files -g "(#i)*.dtd(-.)"'
	'(-d --dtd -s --xsd -r --relaxng)'{-s,--xsd}'[validate against XSD schema]:schema file:_files -g "(#i)*.xsd(-.)"'
	'(-E --embed)'{-E,--embed}'[validate using embedded DTD]'
	'(-d --dtd -s --xsd -r --relaxng)'{-r,--relaxng}'[validate against schema]:schema file:_files -g "(#i)*.rng(-.)"'
	'(-e --err)'{-e,--err}'[print verbose error messages on stderr]'
	'(-S --stop)'{-S,--stop}'[stop on first error]'
	'(-b --list-bad -g --list-good)'{-b,--list-bad}"[list only files that don't validate]"
	'(-b --list-bad -g --list-good -q --quiet)'{-g,--list-good}'[list only files that validate]'
	'(-b --list-bad -g --list-good -q --quiet)'{-q,--quiet}"[don't list files (return result code only)]"
	'*:file:_files -g "(#i)*.xml(-.)"'
      )
    ;;
    c14n|canonic)
      args+=(
	'!(-)--with-comments'
	'(-)--without-comments[XML file canonicalization without comments]'
	'(-)--exc-with-comments[exclusive XML file canonicalization with comments]'
	'(-)--exc-without-comments[exclusive XML file canonicalization without comments]'
	'2:xpath file:_files'
	'3:namespace prefix list'
      )
    ;;
    (un|)esc(|ape)) args+=( '1: :_guard "^-*" string' ) ;;
    ls|list) args+=( '1:path:_directories' ) ;;
    depyx|p2x) args+=( '1:pyx file:_files' ) ;;
  esac
  _arguments -C -A "-*" $args && ret=0
  case $state in
    ordering)
      compset -S ':*' || suf=( -S : )
      if compset -P 2 '*:'; then
	_describe -t case-order case-order '(U:upper-first L:lower-first)' && ret=0
      elif compset -P 1 '*:'; then
	_describe -t data-type data-type '(N:numeric T:text)' $suf && ret=0
      else
	_describe -t order order '(A:ascending D:descending)' $suf && ret=0
      fi
    ;;
  esac
fi

return ret