# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@cooked nocomments
module: base.str base_ "Fonctions de base: gestion des valeurs chaines"

function: base_strmid "Afficher la plage \$1 de la valeur \$2..*

La plage peut être d'une des formes 'start', '[start]:length'. Si start est
négatif, le compte est effectué à partir de la fin de la chaine. Si length est
négatif, il est rajouté à la longueur de la chaine à partir de start"
function base_strmid() {
    local range="$1"; shift
    local str="$*"
    if [[ "$range" == *:-* ]]; then
        local max=${#str}
        [ $max -eq 0 ] && return
        local start="${range%%:*}"
        [ -n "$start" ] || start=0
        while [ "$start" -lt 0 ]; do
            start=$(($max$start))
        done
        max=$(($max-$start))
        local length="${range#*:}"
        while [ "$length" -lt 0 ]; do
            length=$(($max$length))
        done
        range="$start:$length"
    fi
    eval 'echo "${str:'" $range"'}"'
}

function: base_strrepl "Remplacer dans la valeur \$3..* le motif \$1 par la chaine \$2

\$1 peut commencer par l'un des caractères /, #, % pour indiquer le type de recherche"
function base_strrepl() {
    local pattern="$1"; shift
    local repl="$1"; shift
    local str="$*"
    local cmd='echo "${str/'
    if [ "${pattern#/}" != "$pattern" ]; then
        pattern="${pattern#/}"
        cmd="$cmd/"
    elif [ "${pattern#\#}" != "$pattern" ]; then
        pattern="${pattern#\#}"
        cmd="$cmd#"
    elif [ "${pattern#%}" != "$pattern" ]; then
        pattern="${pattern#%}"
        cmd="$cmd%"
    fi
    cmd="$cmd"'$pattern/$repl}"'
    eval "$cmd"
}

function: base_strlcomp "transformer dans le flux en entrée en  UTF-8 certains caractères en leur équivalent transformable en latin1.

si cette fonction est appelée avec des arguments, prendre \$* comme valeur du flux en entrée."
function base_strlcomp() {
    if [ $# -gt 0 ]; then base_strlcomp <<<"$*"
    else LANG=fr_FR.UTF-8 sed $'
s/[\xE2\x80\x90\xE2\x80\x91\xE2\x80\x92\xE2\x80\x93\xE2\x80\x94\xE2\x80\x95]/-/g
s/[‘’]/\x27/g
s/[«»“”]/"/g
s/[\xC2\xA0\xE2\x80\x87\xE2\x80\xAF\xE2\x81\xA0]/ /g
s/[œ]/oe/g
s/[Œ]/OE/g
s/[æ]/ae/g
s/[Æ]/AE/g
s/a\xCC\x80/à/g
s/e\xCC\x81/é/g; s/e\xCC\x80/è/g; s/e\xCC\x82/ê/g; s/e\xCC\x88/ë/g
s/i\xCC\x88/ï/g; s/i\xCC\x82/î/g
s/o\xCC\x82/ô/g; s/o\xCC\x88/ö/g
s/u\xCC\x88/ü/g; s/u\xCC\x82/û/g
s/c\xCC\xA7/ç/g
s/A\xCC\x80/À/g
s/E\xCC\x81/É/g; s/E\xCC\x80/È/g; s/E\xCC\x82/Ê/g; s/E\xCC\x88/Ë/g
s/I\xCC\x88/Ï/g; s/I\xCC\x82/Î/g
s/O\xCC\x82/Ô/g; s/O\xCC\x88/Ö/g
s/U\xCC\x88/Ü/g; s/U\xCC\x82/Û/g
s/C\xCC\xA7/Ç/g
'
    fi
}

function: base_strnacc "supprimer les accents dans le flux en entrée en UTF-8

si cette fonction est appelée avec des arguments, prendre \$* comme valeur du flux en entrée."
function base_strnacc() {
    if [ $# -gt 0 ]; then base_strnacc <<<"$*"
    else LANG=fr_FR.UTF-8 sed '
s/[à]/a/g
s/[éèêë]/e/g
s/[ïî]/i/g
s/[ôö]/o/g
s/[üû]/u/g
s/[ç]/c/g
s/[À]/A/g
s/[ÉÈÊË]/E/g
s/[ÏÎ]/I/g
s/[ÔÖ]/O/g
s/[ÜÛ]/U/g
s/[Ç]/C/g
'
    fi
}

function: base_stripnl "Supprimer dans le flux en entrée les caractères de fin de ligne

si cette fonction est appelée avec des arguments, prendre \$* comme valeur du flux en entrée."
function base_stripnl() {
    if [ $# -gt 0 ]; then base_stripnl <<<"$*"
    else tr -d '\r\n'
    fi
}

function: base_nl2lf "transformer dans le flux en entrée les fins de ligne en LF

si cette fonction est appelée avec des arguments, prendre \$* comme valeur du flux en entrée."
function base_nl2lf() {
    if [ $# -gt 0 ]; then base_nl2lf <<<"$*"
    else lawk 'BEGIN {RS="\r|\r\n|\n"} {print}'
    fi
}

function: base_nl2crlf "transformer dans le flux en entrée les fins de ligne en CRLF

si cette fonction est appelée avec des arguments, prendre \$* comme valeur du flux en entrée."
function base_nl2crlf() {
    if [ $# -gt 0 ]; then base_nl2crlf <<<"$*"
    else lawk 'BEGIN {RS="\r|\r\n|\n"} {print $0 "\r"}'
    fi
}

function: base_nl2cr "transformer dans le flux en entrée les fins de ligne en CR

si cette fonction est appelée avec des arguments, prendre \$* comme valeur du flux en entrée."
function base_nl2cr() {
    if [ $# -gt 0 ]; then base_nl2cr <<<"$*"
    else lawk 'BEGIN {RS="\r|\r\n|\n"; ORS=""} {print $0 "\r"}'
    fi
}