Hola todos :
Me parece que hay un detalle más que habría que tener en cuenta. Seguramente todos los participantes en este tema viven en sitios donde nadie se va a ensuciar por una palabra de 20¢, pero no todo el mundo es así.
Como me interesaba el proyecto, lo abrí y lo probé. Por supuesto, lo primero que hice fue escribir un texto. Y lo segundo tratar de crackearlo.
Si separamos las palabras con guiones, puntos, comas ... las toma como una sola; y de esa forma puedo escribir el Quijote pagando un par de centavos.
Si no te ofendes,
KarlanKas, agrego un par de líneas; y tampoco se puede agregar mucho más, porque el código está excelente.
Código HTML:
<html>
<head>
<title>Untitled</title>
<style>
*{font:normal 10px/15px verdana;}
textarea{
overflow:auto;
text-align:justify;
}
input{text-align:right;}
input,textarea{
border:solid 1px black;
color:navy;
}
</style>
<script>
var minimoLetras=1;//Cuantas letras tiene que tener como mínimo la palabra para ser contabilizada
var precioPorPalabra=0.2;
var contarPalabrasTrasEspacio=false;//Ponlo en true si quieres que cuente las palabras sólo después de poner un espacio.
function contar(esto){
if(contarPalabrasTrasEspacio && esto.value.charAt(esto.value.length-1)!=" "){return false;}
numeroDePalabras=0;
textos=esto.value;
//textos=textos.split(/(\r\n)| (-)| (\.)| (\,)| (\_)| (\;)| (\u00a0)/).join(" ");
textos=textos.replace(/(ñ)| (á)| (é)| (í)| (ó)| (ú)| (ü)| (_)/gi , "x");
textos=textos.split( /(\W)/).join(" ");
palabras=textos.split(" ");
for(a=0;a<palabras.length;a++){
if(palabras[a].length>=minimoLetras){
numeroDePalabras+=1;
}
}
document.forms['pepe']['palabras'].value=numeroDePalabras;
document.forms['pepe']['precio'].value = parseInt(numeroDePalabras * precioPorPalabra * 100)/100;
}
</script>
</head>
<body onLoad="document.forms['pepe']['porPalabra'].value=precioPorPalabra;">
<form name="pepe">
<textarea onkeyup="contar(this)" cols="50" rows="10" name="texto" id="texto"></textarea> <input type="text" name="palabras" id="palabras" size="3" maxlength="3" readonly> palabras x <input type="text" name="porPalabra" id="porPalabra" size="5" maxlength="5"> = <input type="text" name="precio" id="precio" size="8" maxlength="8" readonly>
</form>
</body>
</html>
Aprovecho para explicar un poco las expresiones regulares
/(uno)|(otro)/ : las barras "/" encierran la expresión, y en este caso va a buscar en una cadena si existen los textos "uno" u "otro", ya que "|" es un operador OR.
g : es por "global". Busca en toda la cadena en vez de devuelver solamente la primera coincidencia.
i : es por "insensitive". No diferencia entre mayúsculas o minúsculas.
\W : vale como cualquier caracter que no sea alfanumérico, excepto el guión bajo ("_").
Por supuesto que los caracteres "ñ", "Á", "ü"... son alfabéticos para el español, pero no para javascript. Por eso hay un paso anterior al
split().join(), y es reemplazar cada uno de esos caracteres por otro válido ( es este caso una "x" ) antes de cambiarlos con
/(\W)/ .
Existen también "Ö", "ø", "ù", "ý", "þ"... pero no las incluyo porque supongo que no las van a usar.
Dejé en el código una línea anulada que fue mi primer intento, solo como un ejemplo más de patrones literales. Por supuesto, se borra.
saludos
furoya
P.D. : Ups!. Acabo de darme cuenta de que hay otra manera más de crackearlo. No la comento porque aún no sé cómo arreglarla.
Digamos que además de
minimoLetras habría que agregar un
maximoLetras