nutools/fconv

134 lines
3.6 KiB
Bash
Executable File

#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
function display_help() {
uecho "$scriptname: convertir des fichiers dans un autre encoding
USAGE
$scriptname [-f src_enc] [ -t dest_enc] [/path/to/file]
OPTIONS
-f from
Encoding source. Si n'est pas spécifié ou vaut 'detect', l'encoding est
autodétecté.
-t to
Encoding destination. Doit être spécifié.
Cas particulier: si to vaut 'lf' ou 'crlf', from est ignoré, et seuls
les caractères de fin de lignes sont convertis.
-N Ne pas optimiser le calcul de l'encoding. Cette option n'est valide que
si -f n'est pas spécifié. On assume que tous les noms de fichiers n'ont
pas le même encoding. L'encoding from est donc recalculé à chaque fois.
-r inverser from et to, qui doivent être tous les deux spécifiés."
}
if [ "$#" -eq 1 -a "$1" == --nutools-makelinks ]; then
# créer les liens
scriptname="$(basename "$0")"
for destenc in latin1 utf8 lf crlf cr; do
ln -s "$scriptname" "${scriptname}2$destenc"
done
exit 0
fi
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS
from=detect
case "${scriptname#fconv2}" in
utf8) to=utf-8;;
latin1) to=iso-8859-1;;
lf) to=lf;;
crlf) to=crlf;;
cr) to=cr;;
*) to=;;
esac
optimize=1
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-f: from= \
-t: to= \
-N optimize= \
-r reverse \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
function dfconv() {
# $1 = répertoire dont les fichiers doivent être convertis
local srcdir="$1" files file
array_lsall files "$srcdir"
for file in "${files[@]}"; do
fconv "$file"
done
}
function ffconv() {
# $1 = fichier à renommer
local lfrom="$from" lto="$to"
local src="$1"
if [ "$to" == "lf" ]; then
ebegin "$src" nl2lf "$src"
elif [ "$to" == "crlf" ]; then
ebegin "$src" nl2crlf "$src"
elif [ "$to" == "cr" ]; then
ebegin "$src" nl2cr "$src"
else
if [ "$lfrom" == "detect" ]; then
lfrom="$("$scriptdir/lib/pywrapper" uencdetect.py -f "$src")"
if [ "$lfrom" == "Unknown" ]; then
eerror "$(ppath "$src"): Impossible de déterminer l'encoding"
return 1
fi
if [ -n "$optimize" ]; then
from="$(__norm_encoding "$lfrom")"
[ "$from" != "$to" ] && enote "Conversion $from --> $to"
fi
fi
if [ -n "$optimize" -a "$from" == "$to" ]; then
die "Une conversion de $from à $to n'a pas de sens.
Veuillez re-essayer avec -N si nécessaire."
fi
if [ -n "$reverse" ]; then
local tmp="$lto"
lto="$lfrom"
lfrom="$tmp"
fi
local tmp="$src.tmp.$$"
autoclean "$tmp"
ebegin "$src"
iconv -f "$lfrom" -t "$lto" "$src" >"$tmp" &&
(cat "$tmp" >"$src"; edot) &&
(rm "$tmp"; edot)
eend
fi
}
function fconv() {
if [ -d "$1" ]; then
etitle "$(ppath "$1")" dfconv "$1"
elif [ -f "$1" ]; then
ffconv "$1"
else
eerror "$1: fichier introuvable ou invalide"
fi
}
[ -n "$to" ] || die "Il faut spécifier l'encoding de destination"
to="$(__norm_encoding "$to")"
if [ -n "$*" ]; then
if [ "$to" == "lf" -o "$to" == "crlf" -o "$to" == "cr" ]; then
enote "Conversion [cr]lf --> $to"
fi
for src in "$@"; do
fconv "$src"
done
elif [ "$to" == "lf" ]; then
nl2lf
elif [ "$to" == "crlf" ]; then
nl2crlf
elif [ "$to" == "cr" ]; then
nl2cr
fi