summaryrefslogtreecommitdiffstats
path: root/Completion/Unix
diff options
context:
space:
mode:
authorJun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>2021-04-28 22:35:51 +0900
committerJun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>2021-04-28 22:35:51 +0900
commitccc9cff9e244725ed604fd1ac20e4958339e3885 (patch)
treeea227943809997ca091dc9a9fd11be554c440dc1 /Completion/Unix
parent48606 + 48607 + unposted test: zmathfunc: Force arguments to be numbers and c... (diff)
downloadzsh-ccc9cff9e244725ed604fd1ac20e4958339e3885.tar
zsh-ccc9cff9e244725ed604fd1ac20e4958339e3885.tar.gz
zsh-ccc9cff9e244725ed604fd1ac20e4958339e3885.tar.bz2
zsh-ccc9cff9e244725ed604fd1ac20e4958339e3885.tar.lz
zsh-ccc9cff9e244725ed604fd1ac20e4958339e3885.tar.xz
zsh-ccc9cff9e244725ed604fd1ac20e4958339e3885.tar.zst
zsh-ccc9cff9e244725ed604fd1ac20e4958339e3885.zip
48702: _pandoc: don't use cache, multiple extensions of format, etc.
Diffstat (limited to 'Completion/Unix')
-rw-r--r--Completion/Unix/Command/_pandoc375
1 files changed, 114 insertions, 261 deletions
diff --git a/Completion/Unix/Command/_pandoc b/Completion/Unix/Command/_pandoc
index 0c0672aaa..2ff481e32 100644
--- a/Completion/Unix/Command/_pandoc
+++ b/Completion/Unix/Command/_pandoc
@@ -1,127 +1,37 @@
#compdef pandoc
-# {{{ helper: cache policy for available formats and other variables
-(( $+functions[__pandoc_cache_policy] )) ||
-__pandoc_cache_policy(){
- local cache_file="$1"
- if [[ -f "${commands[pandoc]}" && -f "${cache_file}" ]]; then
- # if the manifest file is newer then the cache:
- if [[ "${commands[pandoc]}" -nt "${cache_file}" ]]; then
- return 0
- else
- return 1
- fi
+# {{{ input or output formats with optional extensions
+# required option: -T (input|output)
+(( $+functions[_pandoc_format] )) ||
+_pandoc_format() {
+ local -a inout expl
+ zparseopts -D -E - T:=inout
+ local format=${PREFIX%%(+|-)*}
+ if compset -P '*(+|-)'; then
+ local pm=${IPREFIX[-1]} # '+' or '-'
+ local -a extensions=(${${$(pandoc --list-extensions=$format):#$pm*}#(+|-)})
+ _wanted extensions expl 'extension' compadd -S '+' -r '-+ ' -a extensions
else
- return 0
+ local -a formats=( $(pandoc --list-$inout[2]-formats) )
+ _wanted formats expl 'format' compadd -S '+' -r '-+ ' -a formats
fi
}
# }}}
-# {{{ choose a format among supported output format
-(( $+functions[_pandoc_output_format] )) ||
-_pandoc_output_format(){
- local update_policy
- zstyle -s ":completion:${curcontext}:" cache-policy update_policy
- if [[ -z "$update_policy" ]]; then
- zstyle ":completion:${curcontext}:" cache-policy __pandoc_cache_policy
- fi
- if _cache_invalid pandoc_output_formats_simple; then
- output_formats_simple=($(pandoc --list-output-formats))
- _store_cache pandoc_output_formats_simple output_formats_simple
- else
- _retrieve_cache pandoc_output_formats_simple
- fi
- if _cache_invalid pandoc_output_formats_plus_extensible || _cache_invalid pandoc_output_formats_minus_extensible; then
- for f in ${output_formats_simple[*]}; do
- for e in $(pandoc --list-extensions=${f}); do
- if [[ "${e}" =~ '^\+' ]]; then
- output_formats_plus_extensible+=("${f}${e}")
- elif [[ "${e}" =~ '^\-' ]]; then
- output_formats_minus_extensible+=("${f}${e}")
- fi
- done
- done
- _store_cache pandoc_output_formats_minus_extensible output_formats_minus_extensible
- _store_cache pandoc_output_formats_plus_extensible output_formats_plus_extensible
- else
- _retrieve_cache pandoc_output_formats_minus_extensible
- _retrieve_cache pandoc_output_formats_plus_extensible
- fi
- _alternative \
- 'formats_plus:format:{_multi_parts "+" output_formats_plus_extensible}' \
- 'formats_minus:format:{_multi_parts -- "-" output_formats_minus_extensible}'
-}
-# }}}
-# {{{ choose a format among supported input format
-(( $+functions[_pandoc_input_format] )) ||
-_pandoc_input_format(){
- local update_policy
- zstyle -s ":completion:${curcontext}:" cache-policy update_policy
- if [[ -z "$update_policy" ]]; then
- zstyle ":completion:${curcontext}:" cache-policy __pandoc_cache_policy
- fi
- if _cache_invalid pandoc_input_formats_simple; then
- input_formats_simple=($(pandoc --list-input-formats))
- _store_cache pandoc_input_formats_simple input_formats_simple
- else
- _retrieve_cache pandoc_input_formats_simple
- fi
- if _cache_invalid pandoc_input_formats_plus_extensible || _cache_invalid pandoc_input_formats_minus_extensible; then
- for f in ${input_formats_simple[*]}; do
- for e in $(pandoc --list-extensions=${f}); do
- if [[ "${e}" =~ '^\+' ]]; then
- input_formats_plus_extensible+=("${f}${e}")
- elif [[ "${e}" =~ '^\-' ]]; then
- input_formats_minus_extensible+=("${f}${e}")
- fi
- done
- done
- _store_cache pandoc_input_formats_minus_extensible input_formats_minus_extensible
- _store_cache pandoc_input_formats_plus_extensible input_formats_plus_extensible
- else
- _retrieve_cache pandoc_input_formats_minus_extensible
- _retrieve_cache pandoc_input_formats_plus_extensible
- fi
- _alternative \
- 'formats_plus:format:{_multi_parts "+" input_formats_plus_extensible}' \
- 'formats_minus:format:{_multi_parts -- "-" input_formats_minus_extensible}'
-}
-# }}}
-# {{{ choose a format among all supported formats
+# {{{ all supported formats
(( $+functions[_pandoc_all_formats] )) ||
_pandoc_all_formats(){
- local update_policy
- zstyle -s ":completion:${curcontext}:" cache-policy update_policy
- if [[ -z "$update_policy" ]]; then
- zstyle ":completion:${curcontext}:" cache-policy __pandoc_cache_policy
- fi
- if _cache_invalid pandoc_input_formats_simple; then
- input_formats_simple=($(pandoc --list-input-formats))
- _store_cache pandoc_input_formats_simple input_formats_simple
- else
- _retrieve_cache pandoc_input_formats_simple
- fi
- if _cache_invalid pandoc_output_formats_simple; then
- output_formats_simple=($(pandoc --list-output-formats))
- _store_cache pandoc_output_formats_simple output_formats_simple
- else
- _retrieve_cache pandoc_output_formats_simple
- fi
- if _cache_invalid pandoc_all_formats; then
- all_formats=(${output_formats_simple} ${input_formats_simple})
- all_formats=($(sort -u <<<"${all_formats[*]}"))
- _store_cache pandoc_all_formats all_formats
- else
- _retrieve_cache pandoc_all_formats
- fi
- _describe "format" all_formats
+ local -a expl
+ local -aU formats
+ formats=( $(pandoc --list-input-formats) $(pandoc --list-output-formats) )
+ _wanted formats expl 'format' compadd -a formats
}
# }}}
# {{{ pdf engine choice
(( $+functions[_pandoc_pdf_engine] )) ||
_pandoc_pdf_engine(){
_alternative \
- 'engines:engine:{_values "engine" pdflatex lualatex xelatex wkhtmltopdf weasyprint prince context pdfroff}' \
- 'engine_files:engine:_files'
+ 'engines:engine:(pdflatex lualatex xelatex latexmk tectonic wkhtmltopdf weasyprint prince context pdfroff)' \
+ 'engine-executables:engine executable:_files -g "*(#q*)"'
}
# }}}
# {{{ options to pass to --pdf-engine command
@@ -133,121 +43,72 @@ _pandoc_pdf_engine_opts(){
_tex
;;
*)
- type _${pdf_engine} > /dev/null
- if [[ $? == 1 ]]; then
- _message "Options for ${pdf_engine}"
- fi
+ _message "Options for ${pdf_engine}"
;;
esac
}
# }}}
-# {{{ choose data-dir
-(( $+functions[_pandoc_data_dir] )) ||
-_pandoc_data_dir(){
- _files -/
+# {{{ data-dir specified by --data-dir option, or the default dir
+_pandoc_default_dir() {
+ if (( $+opt_args[--data-dir] )); then
+ echo ${opt_args[--data-dir]:a}
+ else
+ # XXX Some versions of pandoc may output two user data directories:
+ # ~/.local/share/pandoc or ~/.pandoc
+ # Here we use only the first one.
+ pandoc --version | sed -ne 's/.*[Uu]ser data directory: \([^ ]*\).*/\1/p'
+ fi
}
-# }}}
-# {{{ choose template from data-dir
+# {{{ template file in $PWD or data-dir/templates/, or URL
(( $+functions[_pandoc_template] )) ||
_pandoc_template(){
- local update_policy
- zstyle -s ":completion:${curcontext}:" cache-policy update_policy
- if [[ -z "$update_policy" ]]; then
- zstyle ":completion:${curcontext}:" cache-policy __pandoc_cache_policy
- fi
- if _cache_invalid pandoc_output_formats_simple; then
- output_formats_simple=($(pandoc --list-output-formats))
- _store_cache pandoc_output_formats_simple output_formats_simple
- else
- _retrieve_cache pandoc_output_formats_simple
- fi
- local data_dir=${opt_args[--data-dir]}
- if [[ -z $data_dir ]]; then
- if _cache_invalid pandoc_default_data_dir; then
- default_data_dir=$(pandoc --version | sed -ne 's/Default user data directory: \(.*\)/\1/p')
- _store_cache pandoc_default_data_dir default_data_dir
- else
- _retrieve_cache pandoc_default_data_dir
- fi
- data_dir=${default_data_dir}
- fi
- _pandoc_template_find_args="-name '*.'${output_formats_simple[1]}"
- for ((i = 2; i < ${#output_formats_simple[@]}; i++ )); do
- _pandoc_template_find_args=$_pandoc_template_find_args" -or -name '*.'${output_formats_simple[$i]}"
- done
- templates=($(eval find -L ${data_dir}/templates ${_pandoc_template_find_args} 2>/dev/null | sed -e 's/.*\///' -e 's/\.[^.]*$//'))
- if [[ -z "${templates}" ]]; then
- templates=default
- fi
- _describe 'templates from default data-dir' templates
+ # find output format from '-t format' or '-o xxx.format'
+ local format=${${(v)opt_args[(i)(-t|--to|-w|--write)]}%%(+|-)*}
+ [[ -z $format ]] && format=${(v)opt_args[(i)(-o|--output)]:e}
+ local pat="'*'" # or '*.*' ?
+ [[ -n $format ]] && pat="'*.$format'"
+ local template_dir=$(_pandoc_default_dir)/templates
+ _alternative \
+ "local-templates:local template:_files -g $pat" \
+ "data-dir-templates:template in data-dir:_files -W $template_dir -g $pat" \
+ 'urls: :_urls'
}
# }}}
# {{{ choose highlight-style
(( $+functions[_pandoc_highlight_style] )) ||
_pandoc_highlight_style(){
- local update_policy
- zstyle -s ":completion:${curcontext}:" cache-policy update_policy
- if [[ -z "$update_policy" ]]; then
- zstyle ":completion:${curcontext}:" cache-policy __pandoc_cache_policy
- fi
- if _cache_invalid pandoc_highlighting_styles; then
- highlighting_styles=($(pandoc --list-highlight-styles))
- _store_cache pandoc_highlighting_styles highlighting_styles
- else
- _retrieve_cache pandoc_highlighting_styles
- fi
_alternative \
- 'styles:style:{_values "syntax builting style" ${highlighting_styles[*]}}' \
- 'style_files_here:style:{_files -g "*.theme"}'
+ 'styles:style:( $(pandoc --list-highlight-styles) )' \
+ 'style-files:style file:_files -g "*.theme"'
}
# }}}
-# {{{ choose filter from specified or default data-dir
+# {{{ filter file in $PWD, data-dir/filters/ or $PATH
(( $+functions[_pandoc_filter] )) ||
_pandoc_filter(){
- local update_policy
- zstyle -s ":completion:${curcontext}:" cache-policy update_policy
- if [[ -z "$update_policy" ]]; then
- zstyle ":completion:${curcontext}:" cache-policy __pandoc_cache_policy
- fi
- local data_dir=${opt_args[--data-dir]}
- if [[ -z $data_dir ]]; then
- if _cache_invalid pandoc_default_data_dir; then
- default_data_dir=$(pandoc --version | sed -ne 's/Default user data directory: \(.*\)/\1/p')
- _store_cache pandoc_default_data_dir default_data_dir
- else
- _retrieve_cache pandoc_default_data_dir
- fi
- data_dir=${default_data_dir}
- fi
- local filters_dir=$data_dir"/filters"
+ local filters_dir=$(_pandoc_default_dir)/filters
_alternative \
- 'local_filter:filter:{_files -g "*.lua"}' \
- 'data_dir_filter:filter:{_files -W filters_dir -g "*.lua"}'
+ 'local-filters:local filter:_files' \
+ 'data-dir-filters:filter in data-dir:_files -W filters_dir' \
+ 'commands: : _command_names -e'
}
# }}}
-# {{{ choose lua filter from specified or default data-dir
+# {{{ lua filter in $PWD or data-dir/filters/
(( $+functions[_pandoc_lua_filter] )) ||
_pandoc_lua_filter(){
- local update_policy
- zstyle -s ":completion:${curcontext}:" cache-policy update_policy
- if [[ -z "$update_policy" ]]; then
- zstyle ":completion:${curcontext}:" cache-policy __pandoc_cache_policy
- fi
- local data_dir=${opt_args[--data-dir]}
- if [[ -z $data_dir ]]; then
- if _cache_invalid pandoc_default_data_dir; then
- default_data_dir=$(pandoc --version | sed -ne 's/Default user data directory: \(.*\)/\1/p')
- _store_cache pandoc_default_data_dir default_data_dir
- else
- _retrieve_cache pandoc_default_data_dir
- fi
- data_dir=${default_data_dir}
- fi
- local filters_dir=$data_dir"/filters"
+ local filters_dir=$(_pandoc_default_dir)/filters
_alternative \
- 'local_filter:filter:{_files -g "(#q*)(.)"}' \
- 'data_dir_filter:filter:{_files -W filters_dir -g "(#q*)(.)"}'
- }
+ 'local-filters:local filter:_files -g "*.lua"' \
+ 'data-dir-filters:filter in data-dir:_files -W filters_dir -g "*.lua"'
+}
+# }}}
+# {{{ default file in $PWD or data-dir/defaults/
+(( $+functions[_pandoc_defaults_file] )) ||
+_pandoc_defaults_file() {
+ local defaults_dir=$(_pandoc_default_dir)/defaults
+ _alternative \
+ 'local-defaults:default file:_files -g "*.yaml"' \
+ 'data-dir-defaults:default in data-dir:_files -W defaults_dir -g "*.yaml"'
+}
# }}}
# {{{ choose reference location
(( $+functions[_pandoc_reference_location] )) ||
@@ -261,23 +122,12 @@ _pandoc_reference_location(){
_describe 'location' policies
}
# }}}
-# --base-header-level must be 1-5: https://github.com/jgm/pandoc/blob/34d8ffbcfc33b86766ff7229be4d8a0d1fbffb50/src/Text/Pandoc/App.hs#L867
# {{{ choose top level division
(( $+functions[_pandoc_top_level_division] )) ||
_pandoc_top_level_division(){
_values 'top level division' default section chapter part
}
# }}}
-# {{{ choose header levels
-(( $+functions[_pandoc_header_levels] )) ||
-_pandoc_header_levels(){
- _values -s , "number" 1 2 3 4 5 6
-}
-(( $+functions[_pandoc_header_level] )) ||
-_pandoc_header_level(){
- _values "number" 1 2 3 4 5 6
-}
-# }}}
# {{{ choose email obfusication
(( $+functions[_pandoc_email_obfusication] )) ||
_pandoc_email_obfusication(){
@@ -328,67 +178,74 @@ _pandoc_track_changes() {
# }}}
# The real thing
-_arguments -C \
- {-f,-r,--from=,--read=}'[specify input format]:format:_pandoc_input_format' \
- {-t,-w,--to=,--write=}'[specify output format]:format:_pandoc_output_format' \
- {-o,--output=}'[write output to FILE instead of stdout]:file:_files' \
- '--data-dir=[specify the user data directory to search for pandoc data files]:dir:_pandoc_data_dir' \
- '--base-header-level=[specify the base level for headers (defaults to 1)]:number:_pandoc_header_level' \
- '--strip-empty-paragraphs[deprecated. Use the +empty_paragraphs extension instead]: :' \
+_arguments -s \
+ {-f+,-r+,--from=,--read=}'[specify input format]: :_pandoc_format -T input' \
+ {-t+,-w+,--to=,--write=}'[specify output format]: :_pandoc_format -T output' \
+ {-o+,--output=}'[write output to FILE instead of stdout]:file:_files' \
+ '--data-dir=[specify the user data directory to search for pandoc data files]:data directory:_files -/' \
+ {-d+,--defauls=}'[read default from YAMAL file]: :_pandoc_defaults_file' \
+ '--shift-heading-level-by=[shift heading levels by specified number]:positive or negative integer: ' \
+ '!--base-header-level=[(deprecated) specify the base level for headers]:number (default 1):(1 2 3 4 5)' \
+ '!--strip-empty-paragraphs[deprecated. Use the +empty_paragraphs extension instead]' \
'--indented-code-classes=[classes to use for indented code blocks]:class:{_message "Classes separated with ,"}' \
- '*--filter=[specify an executable to be used as a filter transforming the pandoc AST after the input is parsed and before the output is written]:file:_pandoc_filter' \
- '*--lua-filter=[transform the document in a similar fashion as JSON filters (see --filter), but use pandoc'"'"'s built-in lua filtering system]:file:_pandoc_lua_filter' \
- {-p,--preserve-tabs}'[preserve tabs instead of converting them to spaces]: :' \
+ '--default-image-extension=[specify a default extension to use when image paths/URLs have no extension]:extension: ' \
+ '--file-scope[parse each file individually before combining for multifile documents]' \
+ {\*-F+,\*--filter=}'[specify an executable to be used as a filter transforming the pandoc AST after the input is parsed and before the output is written]: :_pandoc_filter' \
+ {\*-L+,\*--lua-filter=}"[transform the document by using pandoc's built-in lua filtering system]: :_pandoc_lua_filter" \
+ {\*-M+,\*--metadata=}'[set the metadata field KEY to the value VALUE]:key\:value: ' \
+ '*--metadata_file=[read metadata from file]:YAML or JSON file:_files' \