mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 06:00:54 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			177 lines
		
	
	
	
		
			7.3 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			177 lines
		
	
	
	
		
			7.3 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| #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
 |