134 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			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
 | 
