### vim:ft=zsh:foldmethod=marker ## RFC backend for lookup ## Copyright: 2009, Frank Terbeck # TODO: This is currently just a real lookup. rfc-editor.com supports searching. # ...would be nice... LOOKUP_guard || return 1 [[ -n ${lookup_describe} ]] && printf '%s' 'RFC lookup' && return 0 local lookup_context local -a comp_args lookup_context="$(LOOKUP_context)" LOOKUP_guard -fd LOOKUP_help_${backend} || function LOOKUP_help_${backend}() { LOOKUP_guard || return 1 #-80characters-----------------------------------------------------------------# printf 'usage: %s [-{d,w}] \n' ${backend} printf ' -d ask to download RFC before reading\n' printf ' -w just watch. do not ask to download\n' printf '\n Read RFCs by number.\n' printf ' Supports local files and remote files (via rfc-editor.com).\n' printf '\n First, it looks for a local version of the RFC (within a given path, see\n' printf ' Styles below); if a local version is found, it is opened in a browser. If it\n' printf ' cannot be found (per default) the user is asked if we should try to download\n' printf ' the RFC in question via FTP from rfc-editor.com (only works if the zsh/zftp\n' printf ' module can be loaded). If the answer is yes, the file is downloaded. If that\n' printf ' was successful the *local* file is viewed. If the answer is no, the remote\n' printf ' URL is opened in a browser.\n' printf '\nStyles:\n' printf ' The context in which styles are looked up is:\n' printf ' %s\n' ${lookup_context} LOOKUP_context -l local-files lookup_context="$(LOOKUP_context)" printf ' If a local file is viewed, that changes to:\n' printf ' %s\n\n' ${lookup_context} printf ' search-path: a list style, defining where to look for local RFCs\n' printf ' (Default: one entry: $HOME - "%s")\n' ${HOME} printf ' save-path: when downloading RFCs, save them to this directory\n' printf ' (Default: $HOME - "%s")\n' ${HOME} printf ' download: boolean; changes the default downloading behaviour\n' printf ' (Default: true: always ask to download non-local RFCs)\n' printf '\n When looking for local RFCs, this backend looks for files named like this:\n' printf ' rfc<->.txt(|.gz|.bz2) (eg: rfc123.txt, rfc234.txt.gz or rfc345.txt.bz2)\n' printf '\nExamples:\n' printf ' %% zstyle '\'':lookup:*:%s:*'\'' search-path /usr/share/doc/RFC/links ~/myrfcs\n' ${backend} printf ' %% zstyle '\'':lookup:*:%s:*'\'' save-path ~/myrfcs\n' ${backend} printf ' %% zstyle '\'':lookup:*:%s:*'\'' download false\n' ${backend} printf ' %% lookup %s 881\n' ${backend} printf ' %% lookup %s -w 881\n\n' ${backend} } LOOKUP_help && return 0 if [[ -n ${lookup_complete} ]] ; then comp_args=( '-d[attempt do download RFCs]:' '-w[never attempt do download RFCs]:' '*:RFC number:true' ) _arguments -s -w -A '-*' ${comp_args} && return 0 _message 'RFC number' return 0 fi local dir file save_path search_path yesno local -i justwatch local -A opts local -x QUERY zstyle -s "${lookup_context}" save-path save_path || save_path=${HOME} zstyle -a "${lookup_context}" search-path search_path || search_path=(${HOME}) if zstyle -t "${lookup_context}" download ; then justwatch='0' else justwatch='1' fi lu_parseopts_args=( d bool w bool ) LOOKUP_parseopts "$@" || return 1 [[ ${opts[-d]} == 'yes' ]] && justwatch=0 [[ ${opts[-w]} == 'yes' ]] && justwatch=1 QUERY="${args[*]}" LOOKUP_query_handler || return 1 if [[ -z ${QUERY} ]] ; then LOOKUP_help -f return 1 fi for dir in ${search_path} ; do file="${dir}/rfc${QUERY}.txt" if [[ -r ${file} ]] ; then LOOKUP_browser ${file} return $? elif [[ -r ${file}.gz ]] ; then LOOKUP_context -l local-files LOOKUP_browser ${file}.gz return $? elif [[ -r ${file}.bz2 ]] ; then LOOKUP_context -l local-files LOOKUP_browser ${file}.bz2 return $? fi done if (( lookup_printout == 0 )) && (( justwatch == 0 )) && [[ -n ${save_path} ]] ; then if [[ -z ${builtins[zftp]} ]] ; then if ! zmodload zsh/zftp ; then printf 'Module zsh/zftp could not be loaded, cannot download.\n' return 1 fi fi printf 'RFC: %s, save-path: %s\n' ${QUERY} ${save_path} printf 'Shall I download the rfc in question? [y/n] ' read -q yesno if [[ ${yesno} == 'y' ]] ; then LOOKUP_context -l local-files file="${save_path}/rfc${QUERY}.txt" zftp open ftp.rfc-editor.org "anonymous" "zsh_lookup@somewhere.tld" zftp cd "/in-notes" zftp binary zftp get "rfc${QUERY}.txt" > ${file} quit LOOKUP_browser ${file} return $? fi fi LOOKUP_browser "ftp://ftp.rfc-editor.org/in-notes/rfc${QUERY}.txt" return $?