nutools/lib/ulib/modeline

170 lines
4.7 KiB
Bash

##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Fonctions pour gérer les modelines dans les fichiers
##@cooked nocomments
##@require base
uprovide modeline
urequire base
MODELINE="@prefix@-*- coding: utf-8 @mode@-*- vim:sw=@tabsize@:sts=@tabsize@:et:ai:si:sta:fenc=utf-8"
# modèles de modes à copier dans les fonctions __ml_* ci-dessous
#CSS=.css|css
#JS=.js|js|javascript
#JAVA=.java|java
#HTML=.html|.htm|html|html4|html5
#XML=.xml|xml
#PHP=.php|.phps|php|php4|php5
#SH=.sh|sh|shell
#PYTHON=.py|.pyw|py|python
#TEXT=.txt|txt|text
#CONF=.conf|conf
#MARKDOWN=.mdt|.mdwn|.md|.text|.twp|markdown
#PUML=.puml|puml|plantuml
#IUML=.iuml|iuml|plantumlinc
#SQL=.sql|sql
function __ml_getprefix() {
case "$1" in
.css|css|.js|js|javascript|.java|java) echo "/* ";;
.html|.htm|html|html4|html5) echo "<!-- ";;
.php|.phps|php|php4|php5) echo "<?php # ";;
.sh|sh|shell|.py|.pyw|py|python|.txt|txt|text|.conf|conf) echo "# ";;
.mdt|.mdwn|.md|.text|.twp|markdown|.puml|puml|plantuml) echo "# ";;
.iuml|iuml|plantumlinc) echo "'' ";;
.sql|sql) echo "-- ";;
*) # par défaut, utiliser le préfixe '# ', même si ce n'est pas forcément
# approprié
echo "# "
;;
esac
}
function __ml_getmode() {
case "$1" in
.html|.htm|html|html4|html5) echo html;;
.php|.phps|php|php5) echo php;;
.sh|sh|shell) echo sh;;
.py|.pyw|py|python) echo python;;
.txt|txt|text) echo text;;
.conf|conf) echo conf;;
.mdt|.mdwn|.md|.text|.twp|markdown) echo markdown;;
.puml|puml|plantuml|.iuml|iuml|plantumlinc) echo text;;
.sql|sql) echo sql;;
esac
}
function __ml_gettabsize() {
case "$1" in
.php|.phps|php|php5) echo 2;;
*) echo 4;;
esac
}
function __ml_getmodeline() {
local prefix="$(__ml_getprefix "$1")"
local mode="$(__ml_getmode "$1")"
local tabsize="$(__ml_gettabsize "$1")"
[ -n "$mode" ] && mode="mode: $mode "
local modeline="$MODELINE"
modeline="${modeline//@prefix@/$prefix}"
modeline="${modeline//@mode@/$mode}"
modeline="${modeline//@tabsize@/$tabsize}"
echo "$modeline"
}
function __ml_getsuffix() {
case "$1" in
.css|css|.js|js|javascript|.java|java) echo "*/";;
.html|.htm|html|html4|html5) echo "-->";;
.php|.phps|php|php4|php5) echo "?>";;
esac
}
function printml() {
local atype=auto
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-t:,--type: atype= \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
local mode modeline suffix type
if [ "$atype" == "auto" ]; then
local basename ext
splitname "$(basename "$1")" basename ext
type="${ext:+.$ext}"
type="${type:-shell}"
else
type="$atype"
fi
modeline="$(__ml_getmodeline "$type")"
suffix="$(__ml_getsuffix "$type")"
echo "$modeline${suffix:+
$suffix}"
}
function addml() {
local atype=auto
local edit=auto
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-t:,--type: atype= \
-e,--edit edit=1 \
-n,--noedit edit= \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
if [ "$edit" == "auto" ]; then
[ $# -eq 1 ] && edit=1 || edit=
fi
local mode modeline suffix type
local -a edits
for file in "$@"; do
if [ "$atype" == "auto" ]; then
local basename ext
splitname "$(basename "$file")" basename ext
type="${ext:+.$ext}"
type="${type:-shell}"
else
type="$atype"
fi
mode="$(__ml_getmode "$type")"
modeline="$(__ml_getmodeline "$type")"
suffix="$(__ml_getsuffix "$type")"
if [ ! -e "$file" ]; then
ask_yesno "Le fichier $file n'existe pas. Faut-il le créer?" O || continue
touch "$file"
fi
array_add edits "$file"
doinplacef "$file" awkrun mode="$mode" modeline="$modeline" suffix="$suffix" '
BEGIN { run = 1; done = 0; nextline = 0 }
run == 1 {
if (substr($0, length($0) - length(modeline) + 1) == modeline) {
run = 0; done = 1; nextline = 0
} else if (nextline) {
print modeline
if (suffix != "") print suffix
run = 0; done = 1; nextline = 0
} else if (mode == "shell" && $0 ~ /^#!/) {
nextline = 1
} else if (mode == "shell" && $0 ~ /^#/) {
print modeline
if (suffix != "") print suffix
done = 1; run = 0
} else if (!done) {
print modeline
if (suffix != "") print suffix
done = 1; run = 0
} else {
run = 0
}
}
{ print }
END {
if (run || nextline) {
print modeline
if (suffix != "") print suffix
}
}
'
done
[ -n "$edit" ] && "${EDITOR:-vi}" "${edits[@]}"
}