sábado, 8 de agosto de 2009

Como adaptar texto a distintos tamaños de terminal bash

EXPERIMENTO IV

bien estuve un poco ocupado con un proyecto y por ello no publicava desde hace unas semanas en el blog pero este distanciamiento trajo buenas nuevas.

Por partes dijo Jack

El asunto que me mantuvo ocupado es un proyecto que hace un tiempo ya me trae de desvelos se trata de un guión en bash que tiene el objetivo de exzplicar los comandos de bash y mostrar su funcionamiento.Pero no es ese el motivo de esta entrada el asunto es que cuando ya casi lo tenia pronto me di cuenta que el script se desconfigurava al ejecuterlo en otro pc con otro monitor, es decir al cambier el monitor cambia la resolución y es alli que la la cantidad de lineas y de columnas que tienen las terminales son diferentes.
Esto lo comprobe cuando lleve el script a casa de un colega para mostrarlo y pedirle opiñon y allí huuuuuuuy se veia espantoso imprecionantemente espantoso las palabras todas cortadas, ni una frace legible, y para peor corria el guión y se perdia la mitad del texto ( igual que cuando ejecutamos el comando ls sin "less"en un directorio extenso )

He aqui la hora de la verdad

Luego de tanto googlear y googlear buscando sin saber que buscar fui a dar a mi refugio faborito EL donde me guiaron por buen camino.

Al grano!!!

Bueno vamos.. la solucion al dilema de la presentacion del script y la portabilidad la encontre por el lado de el glorioso comando tput pero claro todo en gringo y tengo que admitir que no es mi fuerte, pues lo traduge con google traductor y a lo tarzan fui trasteando con el comando haciendo pruebas, herrando, acertando.
para el caso tambien utilice una guia de bash que esta entre la documantación de tuquito.org /distribución linux de argentina/ de la cual saque buena información con respecto a la comparación de cadenas y otras yervas.

Todo muy lindo y el resultado???

Ya, ya, una mas, el script que les presento no tiene utilidad en si mismo es solo una función de mi guión prinsipal que pronto publicare.
Esta función es para evitar que el rescalado del terminal desvirtue el texto impreso por pantalla y es útil como función de un guión que contenga mucho texto, pero en si mismo no hace mas que sacar un texto por pantalla de forma ordenada y por que no mas agadable.
Lo llame Función_EL en agradecimiento a los cumpas de Espacio Linux ya que fue gracias a ellos que pude allar la solución. El code es de licencia GNU asi que puedes hacer con ello lo que quieras menos apropiartelo jajaj ( este chiste ya lo hize).

Ta el code



#!/bin/bash -x

# Autor besa32bits este script es de
# licencia GNU v 3 o posterior
# vea http://www.gnu.org/licenses
# Créditos: A los cumpas de Espacio Linux
# http://www.espaciolinux.com
# Nombre: FUNCIÓN_EL v 0.5 beta
# Fecha: 7/8/2009

# Este script toma como parámetros el
# tamaño el terminal y ajusta el texto
# para que el re escalado de terminal
# no corte las palabras que se
# imprimen en pantalla. útil para menús
# o para cualquier guión que
# imprima textos por pantalla,
# sobretodo si son extensos.

# Nota: este script debería funcionar
# bien con tamaños  de terminal donde
# el min de lineas es 12 y
# el max es 21 y el min de
# columnas es 65 y el max es 120
# aunque la cantidad max de columnas
# no pude probarlas por que mi monitor
# no llega
# el script funciona pero en este
# caso es con fines pedagógicos

#################################
#                                                                                       
#             FUNCIÓN_EL                                           
#                                                                                        
################################
# Limpio la pantalla
clear
################################

# Comienza el " if lineas"

# En "l1" almaceno la salida del
# comando "tput lines"
# Vea "man tput"
l1=`tput lines`

# Defino las constantes para evaluar
#  con l1 mediante if
lno=12
l2=15
l3=18
l4=21
l5=24
# Nota: si alguien tiene un monitor
# panorámico de 22" como yoyofv
# agreguele lineas hasta la 58

# Comienza el if que transformara
# la evaluación de variable y
# constantes en una nueva constante
# En Google busca
#"Estructuras condicionales"
#" Comparación de valores numéricos"
# en bash claro

if [ $l1 -lt $lno ];
then
echo " Debe maximizar la terminal"
elif [ $l1 -ge $lno ] && [ $l1 -lt $l2 ];
then
linvar=12
elif [ $l1 -ge $l2 ] && [ $l1 -lt $l3 ];
then
linvar=15
elif [ $l1 -ge $l3 ] && [ $l1 -lt $l4 ];
then
linvar=18
elif [ $l1 -ge $l4 ] && [ $l1 -lt $l5 ];
then
linvar=21
fi

###################################
# Comienza el if columnas
###################################

# En c1 almaceno la salida del comando
# "tput cols" Vea "man tput"
c1=`tput cols`

# Defino constantes para evaluar con
# la variable c1 mediante if
cno=65
c2=95
c3=135
c4=170

# Comienza el if que transformara la
# evaluación de variable y
# constantes en una nueva constante
# En Google busca
#"Estructuras condicionales" ,
#" Comparación de valores numéricos"
# en bash claro

if [ $c1 -lt $cno ];
then
echo " Debe maximizar la terminal"
elif [ $c1 -ge $cno ] && [ $c1 -lt $c2 ];
then
colvar=2
elif [ $c1 -ge $c2 ] && [ $c1 -lt $c3 ];
then
colvar=3
elif [ $c1 -ge $c3 ] && [ $c1 -lt $c4 ];
then
colvar=4
fi

# Acá defino las cadenas con el texto que
#  imprimiré en pantalla
# Le doy un color al texto
tput setf 4
a1="Este programa es software"
a2="libre:usted puede redistribuirlo"
a3="y/o modificarlo conforme a"
a4="los términos de la Licencia"
a5="publica General de GNU"
a6="publicada por la Fundación para "
a7="el Software Libre, ya sea la"
a8="versión 3 de esta Licencia o"
a9="cualquier versión posterior."

a10="Este programa se distribuye"
a11="con el deseo de que le resulte"
a12="útil, pero SIN GARANTÍAS DE"
a13="NINGÚN TIPO; ni siquiera con"
a14=" las garantías implícitas de"

a15="COMERCIABILIDAD o APTITUD PARA"
a16="UN PROPÓSITO DETERMINADO."
a17="Para mas información, consulte"
a18="la Licencia Publica General"
a19="de GNU"
a20="http://www.gnu.org/licenses"
a21="usted deberá haber recibido una"
a22=" copia de la licencia junto con"
a23="los binarios y el código fuente "

# Sumo las constantes definidas en
# los "if lineas"
# e "if columnas" parámetro a la
# variable "colYlin"
colYlin=`expr $linvar + $colvar`
# Defino nuevas constantes para evaluar
# con la variable "colYlin" mediante if
v122=14
v123=15
v124=16
v152=17
v153=18
v154=19
v182=20
v183=21
v184=22

###############################
# Comienza el if que dara el
# resultado definitivo

# 12 lineas y 2 columnas
if [ $colYlin = $v122 ];
then
echo $a1 $a2
echo $a3 $a4
echo $a5 $a6
echo $a7 $a8
echo $a9 $a10
echo $a11 $a12
echo $a13 $a14
echo $a15 $a16
echo $a17 $a18
echo $a19 $a20
echo $a21 $a22
echo $a23
# 12 lineas y 3 columnas
elif  [ $colYlin = $v123 ];
then
echo $a1 $a2 $a3
echo $a4 $a5 $a6
echo $a7 $a8 $a9
echo $a10 $a11 $a12
echo $a13 $a14 $a15
echo $a16 $a17 $a18
echo $a19 $a20 $a21
echo $a22 $a23
echo
echo
echo
echo "puede llegar hasta aquí "
# 12 lineas y 4 columnas
elif  [ $colYlin = $v124 ];
then
echo $a1 $a2 $a3 $a4
echo $a5 $a6 $a7 $a8
echo $a9 $a10 $a11 $a12
echo $a13 $a14 $a15 $a16
echo $a17 $a18 $a19 $a20
echo $a21 $a22 $a23
echo
echo
echo
echo
echo
echo "puede llegar hasta aquí  "

# 15 lineas y 2 columnas
elif [ $colYlin = $v152 ];
then
echo $a1 $a2
echo $a3 $a4
echo $a5 $a6
echo $a7 $a8
echo $a9 $a10
echo $a11 $a12
echo $a13 $a14
echo $a15 $a16
echo $a17 $a18
echo $a19 $a20
echo $a21 $a22
echo $a23
echo ""
echo ""
echo "puede llegar hasta aquí  "
# 15 lineas y 3 columnas
elif  [ $colYlin = $v153 ];
then
echo $a1 $a2 $a3
echo $a4 $a5 $a6
echo $a7 $a8 $a9
echo $a10 $a11 $a12
echo $a13 $a14 $a15
echo $a16 $a17 $a18
echo $a19 $a20 $a21
echo $a22 $a23
echo ""
echo ""
echo ""
echo ""
echo ""
echo "puede llegar hasta aquí  "
# 15 lineas y 4 columnas
elif  [ $colYlin = $v124 ];
then
echo $a1 $a2 $a3 $a4
echo $a5 $a6 $a7 $a8
echo $a9 $a10 $a11 $a12
echo $a13 $a14 $a15 $a16
echo $a17 $a18 $a19 $a20
echo $a21 $a22 $a23
echo  ""
echo ""
echo ""
echo ""
echo ""
echo ""
echo ""
echo ""
echo "puede llegar hasta aquí "

# 18 lineas y 2 columnas
elif [ $colYlin = $v182 ];
then
echo $a1 $a2
echo $a3 $a4
echo $a5 $a6
echo $a7 $a8
echo $a9 $a10
echo $a11 $a12
echo $a13 $a14
echo $a15 $a16
echo $a17 $a18
echo $a19 $a20
echo $a21 $a22
echo $a23
echo ""
echo ""
echo ""
echo ""
echo ""
echo " hasta 18 lineas"
# 18 lineas y 3 columnas
elif  [ $colYlin = $v183 ];
then
echo $a1 $a2 $a3
echo $a4 $a5 $a6
echo $a7 $a8 $a9
echo $a10 $a11 $a12
echo $a13 $a14 $a15
echo $a16 $a17 $a18
echo $a19 $a20 $a21
echo $a22 $a23
echo ""
echo ""
echo ""
echo ""
echo ""
echo ""
echo ""
echo ""
echo ""
echo " puede llegar hasta aquí "
# 18 lineas y 4 columnas
elif  [ $colYlin = $v184 ];
then
echo $a1 $a2 $a3 $a4
echo $a5 $a6 $a7 $a8
echo $a9 $a10 $a11 $a12
echo $a13 $a14 $a15 $a16
echo $a17 $a18 $a19 $a20
echo $a21 $a22 $a23
echo ""
echo ""
echo ""
echo ""
echo ""
echo ""
echo ""
echo ""
echo ""
echo ""
echo ""
echo "puede llegar hasta aquí  "

fi
# Reestablesco la terminal
tput sgr0
###################################
# listo es todo salute besa32bits

1 comentario:

Comenta a gusto el tema recuerda no ser ofencivo y trata de escrivir de forma legible gracias por participar!!!!!!