summaryrefslogtreecommitdiff
path: root/Functions/MIME
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2004-06-22 14:35:05 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2004-06-22 14:35:05 +0000
commit08bd15e2823d5be249b3cb2ab7de1ffd55924ca4 (patch)
tree604df69d18382617d7a495b47e0972a87f6c0093 /Functions/MIME
parentd591334e9d616830fbd24909db2e21ac4b959742 (diff)
downloadzsh-08bd15e2823d5be249b3cb2ab7de1ffd55924ca4.tar.gz
zsh-08bd15e2823d5be249b3cb2ab7de1ffd55924ca4.zip
20076: improved function using always
Diffstat (limited to 'Functions/MIME')
-rw-r--r--Functions/MIME/zsh-mime-setup197
1 files changed, 99 insertions, 98 deletions
diff --git a/Functions/MIME/zsh-mime-setup b/Functions/MIME/zsh-mime-setup
index 5f9168341..fee3237f7 100644
--- a/Functions/MIME/zsh-mime-setup
+++ b/Functions/MIME/zsh-mime-setup
@@ -62,9 +62,8 @@ zstyle -a :mime: mime-types type_files ||
zstyle -a :mime: mailcap cap_files ||
cap_files=(~/.mailcap /etc/mailcap)
-TRAPEXIT() { unfunction mime-setup-add-type >&/dev/null; return 0; }
-
-mime-setup-add-type() {
+{
+ mime-setup-add-type() {
local type suffix
local -a array
@@ -90,115 +89,117 @@ mime-setup-add-type() {
fi
fi
done
-}
+ }
-# Loop through files to find suffixes for MIME types.
-# Earlier entries take precedence, so the files need to be listed
-# with the user's own first. This also means pre-existing
-# values in suffix_type_map are respected.
-for file in $type_files; do
+ # Loop through files to find suffixes for MIME types.
+ # Earlier entries take precedence, so the files need to be listed
+ # with the user's own first. This also means pre-existing
+ # values in suffix_type_map are respected.
+ for file in $type_files; do
[[ -r $file ]] || continue
# For once we rely on the fact that read handles continuation
# lines ending in backslashes, i.e. there's no -r.
while read line; do
- # Skip blank or comment lines.
- [[ $line = [[:space:]]#(\#*|) ]] && continue
-
- # There are two types of line you find in MIME type files.
- # The original simple sort contains the type name then suffixes
- # separated by whitespace. However, Netscape insists
- # on adding lines with backslash continuation with
- # key="value" pairs. So we'd better handle both.
- if [[ $line = *=* ]]; then
- # Gory.
- # This relies on the fact that a typical entry:
- # type=video/x-mpeg2 desc="MPEG2 Video" exts="mpv2,mp2v"
- # looks like a parameter assignment. However, we really
- # don't want to be screwed up by future extensions,
- # so we split the elements to an array and pick out the
- # ones we're interested in.
- type= exts=
-
- # Syntactically split line to preserve quoted words.
- array=(${(z)line})
- for elt in $array; do
- if [[ $elt = (type|exts)=* ]]; then
- eval $elt
- fi
- done
-
- # Get extensions by splitting on comma
- array=(${(s.,.)exts})
-
- [[ -n $type ]] && mime-setup-add-type $type $array
- else
- # Simple.
- mime-setup-add-type ${=line}
- fi
+ # Skip blank or comment lines.
+ [[ $line = [[:space:]]#(\#*|) ]] && continue
+
+ # There are two types of line you find in MIME type files.
+ # The original simple sort contains the type name then suffixes
+ # separated by whitespace. However, Netscape insists
+ # on adding lines with backslash continuation with
+ # key="value" pairs. So we'd better handle both.
+ if [[ $line = *=* ]]; then
+ # Gory.
+ # This relies on the fact that a typical entry:
+ # type=video/x-mpeg2 desc="MPEG2 Video" exts="mpv2,mp2v"
+ # looks like a parameter assignment. However, we really
+ # don't want to be screwed up by future extensions,
+ # so we split the elements to an array and pick out the
+ # ones we're interested in.
+ type= exts=
+
+ # Syntactically split line to preserve quoted words.
+ array=(${(z)line})
+ for elt in $array; do
+ if [[ $elt = (type|exts)=* ]]; then
+ eval $elt
+ fi
+ done
+
+ # Get extensions by splitting on comma
+ array=(${(s.,.)exts})
+
+ [[ -n $type ]] && mime-setup-add-type $type $array
+ else
+ # Simple.
+ mime-setup-add-type ${=line}
+ fi
done <$file
-done
-
+ done
+} always {
+ unfunction mime-setup-add-type >&/dev/null
+}
# Loop through files to find handlers for types.
for file in $cap_files; do
- [[ -r $file ]] || continue
+ [[ -r $file ]] || continue
+
+ # Oh, great. We need to preserve backslashes inside the line,
+ # but need to manage continuation lines.
+ while read -r line; do
+ # Skip blank or comment lines.
+ [[ $line = [[:space:]]#(\#*|) ]] && continue
+
+ while [[ $line = (#b)(*)\\ ]]; do
+ line=$match[1]
+ read -r line2 || break
+ line+=$line2
+ done
- # Oh, great. We need to preserve backslashes inside the line,
- # but need to manage continuation lines.
- while read -r line; do
- # Skip blank or comment lines.
- [[ $line = [[:space:]]#(\#*|) ]] && continue
-
- while [[ $line = (#b)(*)\\ ]]; do
- line=$match[1]
- read -r line2 || break
- line+=$line2
- done
-
- # Guess what, this file has a completely different format.
- # See mailcap(4).
- # The biggest unpleasantness here is that the fields are
- # delimited by semicolons, but the command field, which
- # is the one we want to extract, may itself contain backslashed
- # semicolons.
- if [[ $line = (#b)[[:space:]]#([^[:space:]\;]##)[[:space:]]#\;(*) ]]
- then
- # this is the only form we can handle, but there's no point
- # issuing a warning for other forms.
- type=$match[1]
- line=$match[2]
- # See if it has flags after the command.
- if [[ $line = (#b)(([^\;\\]|\\\;|\\[^\;])#)\;(*) ]]; then
- line=$match[1]
- flags=$match[3]
- else
- flags=
- fi
- # Remove quotes from semicolons
- line=${line//\\\;/\;}
- # and remove any surrounding white space --- this might
- # make the handler empty.
- line=${${line##[[:space:]]#}%%[[:space:]]}
- if [[ -z $type_handler_map[$type] ]]; then
- if [[ -n $o_verbose ]]; then
- print -r "Adding handler for type $type:
+ # Guess what, this file has a completely different format.
+ # See mailcap(4).
+ # The biggest unpleasantness here is that the fields are
+ # delimited by semicolons, but the command field, which
+ # is the one we want to extract, may itself contain backslashed
+ # semicolons.
+ if [[ $line = (#b)[[:space:]]#([^[:space:]\;]##)[[:space:]]#\;(*) ]]
+ then
+ # this is the only form we can handle, but there's no point
+ # issuing a warning for other forms.
+ type=$match[1]
+ line=$match[2]
+ # See if it has flags after the command.
+ if [[ $line = (#b)(([^\;\\]|\\\;|\\[^\;])#)\;(*) ]]; then
+ line=$match[1]
+ flags=$match[3]
+ else
+ flags=
+ fi
+ # Remove quotes from semicolons
+ line=${line//\\\;/\;}
+ # and remove any surrounding white space --- this might
+ # make the handler empty.
+ line=${${line##[[:space:]]#}%%[[:space:]]}
+ if [[ -z $type_handler_map[$type] ]]; then
+ if [[ -n $o_verbose ]]; then
+ print -r "Adding handler for type $type:
$line" >&2
- fi
- type_handler_map[$type]=$line
- type_flags_map[$type]=$flags
- if [[ -n $flags && -n $o_verbose ]]; then
- print -r " with flags $flags" >&2
- fi
- elif [[ -n $o_verbose ]]; then
- print -r "Skipping handler for already defined type $type:
+ fi
+ type_handler_map[$type]=$line
+ type_flags_map[$type]=$flags
+ if [[ -n $flags && -n $o_verbose ]]; then
+ print -r " with flags $flags" >&2
+ fi
+ elif [[ -n $o_verbose ]]; then
+ print -r "Skipping handler for already defined type $type:
$line" >&2
- if [[ -n $flags ]]; then
- print -r " with flags $flags" >&2
- fi
- fi
+ if [[ -n $flags ]]; then
+ print -r " with flags $flags" >&2
fi
- done <$file
+ fi
+ fi
+ done <$file
done