nutools/utempl

121 lines
3.6 KiB
Plaintext
Raw Normal View History

2013-08-27 15:14:44 +04:00
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
2013-08-27 15:14:44 +04:00
function display_help() {
uecho "$scriptname: Créer un nouveau fichier à partir d'un modèle
USAGE
$scriptname [options] file [template options]
OPTIONS
Avant le nom du nouveau fichier, les options suivantes peuvent être utilisées:
-t TEMPLATE
Spécifier le modèle de fichier à utiliser. Par défaut, le modèle
à utiliser est déduit de l'extension ou du nom du fichier.
-e, --edit
Editer le fichier après l'avoir créé
-g, --no-edit
Ne pas éditer le fichier après l'avoir créé
--no-fndate
Désactiver le support du marqueur ~~ pour dater le fichier.
Par défaut, utiliser 'fndate -c $scriptname' si le nom du fichier
contient le marqueur ~~
2013-08-27 15:14:44 +04:00
Après le nom du fichier, toutes les options sont spécifiques au modèle
utilisé pour créer le nouveau fichier. Utiliser l'option --help pour
avoir une description des options disponibles."
}
template=
edit=auto
fndate=1
2013-08-27 15:14:44 +04:00
overwrite=
encoding=auto
executable=auto
opts=() # options non reconnues passées au template
parse_opts + "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-t:,--template: template= \
-e,--edit edit=1 \
--no-fndate fndate= \
-g,--no-edit edit= \
2013-08-27 15:14:44 +04:00
-f,--overwrite overwrite=1 \
-E:,--encoding: encoding= \
-x,--executable executable=1 \
-n,--no-executable executable= \
-a,-b,-c,-d,-h,-i,-j,-k,-l,-m,-o,-p,-q,-r,-s,-u,-v,-w,-y,-z,-A,-B,-C,-D,-F,-G,-H,-I,-J,-K,-L,-M,-N,-O,-P,-Q,-R,-S,-T,-U,-V,-W,-X,-Y,-Z '$array_add opts "$option_"' \
2013-08-27 15:14:44 +04:00
@ args -- "$@" && set -- "${args[@]}" || die "$args"
[ -n "$template" ] || template=auto
TEMPLATES=()
TEMPLS=()
templdir="$scriptdir/lib/templates"
if [ -f "$templdir/templates.conf" ]; then
source "$templdir/templates.conf"
for at in "${TEMPLATES[@]}"; do
splitpair "$at" a t
if [ "$template" == "$a" ]; then
template="$t"
break
fi
done
fi
array_lsfiles templs "$templdir"
file="$1"; shift
found=1
templ="$templdir/$template"
if [ ! -f "$templ" ]; then
found=
for at in "${TEMPLS[@]}"; do
splitpair "$at" a t
if [ "$template" == "$a" ]; then
templ="$templdir/$t"
found=1
break
fi
[ -n "$found" ] || templ=
done
if [ -z "$found" ]; then
for templ in "${templs[@]}"; do
if [ -x "$templ" ] && "$templ" --matches-template "$template"; then
found=1
break
fi
done
[ -n "$found" ] || templ=
fi
fi
[ -n "$found" -a -x "$templ" ] || die "$file: Impossible de trouver le template $template${templ:+ ($(basename "$templ"))}"
if [ -n "$fndate" ]; then
# n'utiliser fndate que si le marqueur est présent
setx filename=basename -- "$file"
[[ "$filename" == *~~* ]] || fndate=
fi
2013-08-27 15:14:44 +04:00
args=()
[ "$template" != "auto" ] && args=("${args[@]}" --template "$template")
if [ "$edit" != "auto" ]; then
if [ -n "$edit" ]; then
args=("${args[@]}" --edit)
else
args=("${args[@]}" --no-edit)
fi
fi
args=("${args[@]}" ${overwrite:+--overwrite})
2013-08-27 15:14:44 +04:00
[ "$encoding" != "auto" ] && args=("${args[@]}" --encoding "$encoding")
if [ "$executable" != "auto" ]; then
if [ -n "$executable" ]; then
args=("${args[@]}" --executable)
else
args=("${args[@]}" --no-executable)
fi
fi
cmd=("$templ" "$file" "${args[@]}" "${opts[@]}" "$@")
[ -n "$fndate" ] && cmd=("$scriptdir/fndate" -c --cmd-quiet -- "${cmd[@]}")
exec "${cmd[@]}"