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
|