@related: [[xml]] [[msvc]] [[cmake]] * https://sourceforge.net/projects/xmlresume/forums/forum/92731/topic/1307309/index/page/1 ArpalHands's #!/usr/bin/env bash g_decimal_symbol="," g_target_dimension="185/60 R15" g_website="http://www.pneus-online.fr/pneu-ete.html" cleanup() { rm -f "${tmp_container[@]}" } generate_header() { header_container=( "marque" "lien" "modele" "moyenne" "qualite_prix" "indice_rachat" "sol_sec" "sol_humide" "sol_enneige" "aquaplanning" "stabilite_virage" "confort_conduite" "confort_bruit" "tenue_route" "usure" "dimension" "charge" "vitesse" "consommation" "adherence" "bruit" "prix" $'\n' ) } generate_stylesheet() { cat << "EOF" > "${stylesheet1}" xsl_marque_container=() xsl_lien_container=() xsl_modele_container=() xsl_moyenne_container=() xsl_qualite_prix_container=() xsl_indice_rachat_container=() xsl_sol_sec_container=() xsl_sol_humide_container=() xsl_sol_enneige_container=() xsl_aquaplanning_container=() xsl_stabilite_virage_container=() xsl_confort_conduite_container=() xsl_confort_bruit_container=() xsl_tenue_route_container=() xsl_usure_container=() xsl_marque_container+=(" ") xsl_lien_container+=("http://www.pneus-online.fr ") xsl_modele_container+=(" ") xsl_moyenne_container+=(" ") xsl_qualite_prix_container+=(" ") xsl_indice_rachat_container+=(" ") xsl_sol_sec_container+=(" ") xsl_sol_humide_container+=(" ") xsl_sol_enneige_container+=(" ") xsl_aquaplanning_container+=(" ") xsl_stabilite_virage_container+=(" ") xsl_confort_conduite_container+=(" ") xsl_confort_bruit_container+=(" ") xsl_tenue_route_container+=(" ") xsl_usure_container+=(" ") EOF cat << "EOF" > "${stylesheet2}" xsl_description_container=() xsl_consommation_container=() xsl_adherence_container=() xsl_bruit_container=() xsl_prix_container=() xsl_description_container+=(" ") xsl_consommation_container+=(" ") xsl_adherence_container+=(" ") xsl_bruit_container+=(" ") xsl_prix_container+=(" ") EOF } apply_decimal_symbol_rule() { local tmp_container=( xsl_moyenne_container xsl_qualite_prix_container xsl_indice_rachat_container xsl_sol_sec_container xsl_sol_humide_container xsl_sol_enneige_container xsl_aquaplanning_container xsl_stabilite_virage_container xsl_confort_conduite_container xsl_confort_bruit_container xsl_tenue_route_container xsl_usure_container ) local container for container in "${tmp_container[@]}" do eval "${container}"'=("${'"${container}"'[@]/./${g_decimal_symbol}}")' eval "${container}"'=("${'"${container}"'[@]/,/${g_decimal_symbol}}")' done } display() { local consommation="${xsl_consommation_container[idx2]%.*}" consommation="${consommation#*-}" consommation="${consommation:= }" local adherence="${xsl_adherence_container[idx2]%.*}" adherence="${adherence#*-}" adherence="${adherence:= }" local bruit="${xsl_bruit_container[idx2]%.*}" bruit="${bruit#*-}" bruit="${bruit:= }" local prix="$(echo "${xsl_prix_container[idx2]}" | awk '{print $1}' | tr '.,' "${g_decimal_symbol}${g_decimal_symbol}")" local tmp_container=( "${xsl_marque_container[idx1]}" "${xsl_lien_container[idx1]}" "${xsl_modele_container[idx1]}" "${xsl_moyenne_container[idx1]}" "${xsl_qualite_prix_container[idx1]}" "${xsl_indice_rachat_container[idx1]}" "${xsl_sol_sec_container[idx1]}" "${xsl_sol_humide_container[idx1]}" "${xsl_sol_enneige_container[idx1]}" "${xsl_aquaplanning_container[idx1]}" "${xsl_stabilite_virage_container[idx1]}" "${xsl_confort_conduite_container[idx1]}" "${xsl_confort_bruit_container[idx1]}" "${xsl_tenue_route_container[idx1]}" "${xsl_usure_container[idx1]}" "${dimension}" "${charge}" "${vitesse}" "${consommation}" "${adherence}" "${bruit}" "${prix}" ) IFS=$'\t' echo -n -e "${header_container[*]}" unset header_container echo -e "${tmp_container[*]}" unset IFS } main() { trap cleanup EXIT local header_container=() generate_header tmp_container+=("$(mktemp -u)") local stylesheet1="${tmp_container[${#tmp_container[@]}-1]}" tmp_container+=("$(mktemp -u)") local stylesheet2="${tmp_container[${#tmp_container[@]}-1]}" generate_stylesheet source <(xsltproc --html "${stylesheet1}" "${g_website}" 2> /dev/null) source <( local is_valid=$( local container for container in "${!xsl_@}" do eval echo '"${#'"${container}"'[@]}"' done | sort -u | wc -l ) [ "${is_valid}" = "1" ] is_valid="$?" declare -p is_valid ) [ "${is_valid}" = "0" ] || { echo "nok"; return; } apply_decimal_symbol_rule local idx1 for ((idx1=0; idx1<"${#xsl_lien_container[@]}"; ++idx1)) do source <( local url="${xsl_lien_container[idx1]}" unset "${!xsl_@}" source <(xsltproc --html "${stylesheet2}" "${url}" 2> /dev/null) source <( local is_valid=$( local container for container in "${!xsl_@}" do eval echo '"${#'"${container}"'[@]}"' done | sort -u | wc -l ) [ "${is_valid}" = "1" ] is_valid="$?" declare -p is_valid ) if [ "${is_valid}" = "0" ] then declare -p "${!xsl_@}" fi declare -p is_valid ) [ "${is_valid}" = "0" ] || { echo "nok"; continue; } local idx2 for ((idx2=0; idx2<"${#xsl_description_container[@]}"; ++idx2)) do local dimension="$(echo "${xsl_description_container[idx2]}" | grep -o '[[:digit:]]\{3\}/[[:digit:]]\{2\} R[[:digit:]]\{2\}')" if [ "${dimension}" = "${g_target_dimension}" ] then local charge="$(echo "${xsl_description_container[idx2]}" | grep -o 'Charge : [[:digit:]]\+ ' | grep -o '[[:digit:]]\+')" local vitesse="$(echo "${xsl_description_container[idx2]}" | grep -o 'Vitesse : .' | sed 's/Vitesse : //')" display fi done done } main "$@"