Ver Mensaje Individual
  #21 (permalink)  
Antiguo 10/05/2011, 13:13
Avatar de stramin
stramin
 
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 1 mes
Puntos: 336
Respuesta: Justificacion con silabeo

1. tendriamos que sacarle a la cadena las etiquetas html
aca tenemos algo que puede ayudar:
[URL="http://ar2.php.net/manual/es/function.wordwrap.php"]http://ar2.php.net/manual/es/function.wordwrap.php[/URL]


Te dejo esa parte XD, lo interesante sería sacar los links y marcar en que partes estaba de modo de volver a ponerlo después de separar las silabas

2. habría que calcular a mano en la medida que definimos cuantos son los carateres que mas presisamente entran (esto habria que hacerlo a mano ya que eso va a depender del estilo del texto) ... entonces, digamos, si el div mide 200px, sabemos que entran ej. 70 caracteres por linea como máximo.

para eso tenemos la función imageftbox() y imagettfbbox() que calculan el tamaño de las palabras dependiendo del tipo de fuente.

3. habria que detectar la ultima palabra, mejor dicho el espacio mas cercano al caracter 70
tenemos algo de ayuda con eso aca:
[URL="http://foros.cristalab.com/php-como-recortar-un-texto-sin-cortar-la-ultima-palabra-t12854/"]http://foros.cristalab.com/php-como-recortar-un-texto-sin-cortar-la-ultima-palabra-t12854/[/URL]. De este modo sabemos ya cual es la ultima palabra.


para eso también usamos las funciones bbox ya mencionadas.

4. separarla en silabas (he aqui el gran kilombo)

Esto ya lo hice :)

5,6,7. ir sumando silabas hasta llegar lo mas cerca posible de 70 caracteres.
cortar la cadena por esa silaba, agregarle "-<br />"
volver a ponerle las etiquetas html


si logramos todo eso nevará XD

Bueno esta es la función que hice para separar silabas, puede que tenga errores y estoy seguro que abimaelrc lo habría hecho mejor XD

Código PHP:
<?php
function escons($char){
    
$char=strtolower($char);
    if(
$char=="a" or $char=="e" or $char=="i" or $char=="o" or $char=="u" or $char=="" or $char==" ")return false;
    else return 
true;
}
function 
esvoc($char){
    
$char=strtolower($char);
    if(
$char=="a" or $char=="e" or $char=="i" or $char=="o" or $char=="u")return true;
    else return 
false;
}
function 
juntas($chars){
    
$chars=strtolower($chars);
    
$char1=substr($chars,0,1);
    
$char2=substr($chars,1,1);
    if(
$char1=="h") return true;
    if(
$char1=="b" or $char1=="c" or $char1=="d" or $char1=="f" or $char1=="g" or $char1=="j" or $char1=="k" or $char1=="p" or $char1=="q" or $char1=="t" or $char1=="v" or $char1=="x")
        if(
$char2=="h" or $char2=="l" or $char2=="r" or $char2=="s" or $char2=="w" or $char2=="y" or $char2=="z")return true;
    if(
$char1==$char2)
        if(
$char1=="l" or $char1=="r")return true;
    return 
false;
}
$texto="esto es un texto de prueba: Llamenme cagon pero se lo que pasa con estas funciones arranca de un bosquejo ordenado y llamativo y termina siendo un nido de if  excepsiones y demas jaja yo paso ^^ suerte";
$prev="";$reprev="";
for(
$f=0;$f<strlen($texto);$f++){
    
$current=substr($texto,$f,1);
    
$next=substr($texto,$f+1,1);
    if((
esvoc($prev) and escons($current) and $next!=" " and !escons($next)) or (escons($prev) and escons($current) and!juntas($prev.$current))){
        
$texto=substr($texto,0,$f)."-".substr($texto,$f);
        
$f++;
    }elseif(
esvoc($reprev) and escons($prev) and escons($current)){
        
$texto=substr($texto,0,$f-1)."-".substr($texto,$f-1);
        
$f++;
    }
    
$reprev=$prev;
    
$prev=$current;
}
echo 
$texto;
?>
no funciona con tildes y puede dar problemas si hay comas (,), puntos (.), guiones(-) y otros símbolos, así como esta devuelve:

es-to es un tex-to de prue-ba: Lla-men-me ca-gon pe-ro se lo que pa-sa con es-tas fun-cio-nes a-rran-ca de un bos-que-jo or-de-na-do y lla-ma-ti-vo y ter-mi-na sien-do un ni-do de if ex-ce-psio-nes y de-mas ja-ja yo pa-so ^-^ suer-te

lo cual me parece excelente!

(el texto elegido para la prueba fué al azar, nada personal)
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D