Cita:Un poco picadito por el comentario de que Focuswriter sí cuenta bien las palabras y Soprano no
Noooooo, no nos piqueeeeemos, que era una sola mención a un problema que puede ser peliagudo
Verás, yo escribía bastante microficción y, cuando en un concurso entras en 50, 40, 20 o 10 palabras, desde luego, ya no se trata de «entre 1.000 y 3.000 palabras», como por ejemplo «
El Polidori». Cada palabra cuenta. Y, como los jueces suelen contar «a mano» —yo también lo haría, sobre todo con textos con efectos especiales, que haberlos, haylos—, ha habido varias desgracias por usar Google Docs y que no dé la contabilidad adecuado. De hecho, en su día en una página de éstas precisamente de microficción presenté una tabla con pruebas que había hecho con editores de todo tipo:
Añadiendo «Soprano» a esta tabla, puedo decir que... sigue contando muy bien de manera aproximada. Pero tampoco hayq ue volverse loco con el asunto. Por cierto, los tres patrones que uso son:
Código:
Sueños
―Ya no me quieres...―musita.
―No es eso, Sasha ―contesto sabiéndole el rey del chantaje emocional―.Necesito otros horizontes.
―Quimeras, Laika –dice.
―Está en mi sangre. Mi bisabuelo colaboró con Pavlov, mis padres fueron artistas de circo...
Sasha enmudece y yo, abatida, abandono la granja.
Su postrer aullido no me detiene.
Código:
Después
— ¿Te ha gustado? —pregunto él.
—¿Qué si me ha gustado? ¡Has estado fabuloso! Tienes que volver a hacerme eso de… —ella se sorprendió degollando de un tajo a su amante.
La frustración invadió.
su ser.
—Espera al segundo, Cloti. Contrólate —se repitió, a modo de mantra, la mantis religiosa.
Código:
Mi última bala
Estoy sobre la cabina oxidada de un camión; él, a unos metros, sobre una cisterna.
Sin munición, sin salida. Rodeados de no vivos.
—Tírame tu pistola —me grita.— ¡Confía en mí!
—¡¿Qué?!
—Hay un depósito de propano. Moriremos matando.
Se la lancé. El muy cabrón se suicidó.
—El último es mío, ahí lo dejo
.—
Como ves, no es nada sencillo, yo empleo una miniaplicación que me hice yo mismo con mi mecanismo en html5 y js, y que funciona fenomenal. El problema es que al pasarlo a Gambas3, resulta que las RegExp no funcionan bien con UTF-8, tal cual señalas:
Código:
<!--
SOFTWARE LIBRE
-->
<div class="crqt" id="Pral">
<form class="crqt" id="Escrito" "Estadisticas()">
<textarea onkeyup="Estadisticas()" id="Texto" class="crqt">Componente en pruebas. Escribe cualquier texto.</textarea>
</form>
<form class="crqt" id="Etiquetas">
<label>Palabras :<input id="Palabras" readonly="" /></label>
<label>Matrices :<input id="Matrices" readonly="" /></label>
<label>Caracteres :<input id="Caracteres" readonly="" /></label>
<label>Letras :<input id="Letras" readonly="" /></label>
<label>Párrafos :<input id="Parrafos" readonly="" /></label>
<label>Sílabas :<input id="Silabas" readonly="" /></label>
<label>Frases :<input id="Frases" readonly="" /></label>
<label style="border-top: solid thin">Szigriszt1993:<input id="Szigriszt1993" readonly="" style="border-top: solid thin"/></label>
<label>Perspicuidad :<input id="Perspicuidad" readonly="" /></label>
</form>
<script>
function Estadisticas() {
var strTexto = Texto.value;
var Resultado = 0
var pttPalabras = /([A-Za-z0-9\u00C0-\u02B8\-])[A-Za-z0-9\u00C0-\u02B8\-]*/g;
var pttMatrices = /./g;
var pttCaracteres= /\S/g;
var pttLetras = /[A-Za-z0-9\u00C0-\u02B8]/g;
var pttParrafos = /[\n][^\n]/g;
var pttSilabas = /[aeo]h[iu]|[iu]h[aeo]|[aeo][iu]|[aeo][y]|[y]|[íú]|[iu][^aeo]|[aeo]|[áéíóú]|[q|g]ui[aeo]/gi
var pttFrases = /[.?!][^.?!]/g;
var INFLESZ = "";
try {
Resultado = strTexto.match(pttPalabras).length;
var P = Resultado;
}
catch(err) {
Resultado = 0;
}
document.getElementById("Palabras").value = Resultado.toLocaleString();
try {
Resultado = strTexto.match(pttMatrices).length;
}
catch(err) {
Resultado = 0;
}
document.getElementById("Matrices").value = Resultado.toLocaleString();
try {
Resultado = strTexto.match(pttCaracteres).length;
}
catch(err) {
Resultado = 0;
}
document.getElementById("Caracteres").value= Resultado.toLocaleString();
try {
Resultado = strTexto.match(pttLetras).length;
var L = Resultado;
}
catch(err) {
Resultado = 0;
}
document.getElementById("Letras").value = Resultado.toLocaleString();
try {
Resultado = 1 + strTexto.match(pttParrafos).length;
}
catch(err) {
Resultado = 0;
}
document.getElementById("Parrafos").value = Resultado.toLocaleString();
try {
Resultado = strTexto.match(pttSilabas).length;
var S = Resultado;
}
catch(err) {
Resultado = 0;
}
document.getElementById("Silabas").value = Resultado.toLocaleString();
try {
Resultado = strTexto.match(pttFrases).length;
var F = Resultado;
}
catch(err) {
Resultado = 0;
}
document.getElementById("Frases").value = Resultado.toLocaleString();
Resultado = 206.835-62.3*S/P-P/F;
Resultado = Math.round(Resultado);
if (isNaN(Resultado)) {
Resultado = 0;
}
document.getElementById("Szigriszt1993").value = Resultado.toLocaleString();
if (Resultado<40) {
INFLESZ="Muy difícil";
}else if (Resultado<55) {
INFLESZ="Algo difícil";
}else if (Resultado<65) {
INFLESZ="Normal";
}else if (Resultado<80) {
INFLESZ="Bastante fácil";
}else {
INFLESZ="Muy fácil";
}
document.getElementById("Perspicuidad").value = INFLESZ;
}
</script>
<style type="text/css">
.crqt {
background-color: black;
color: rgb(0, 255, 0);
font-family: monospace;
font-size: 14px;
border-style: solid;
border-width: thin;
border-color: rgb(0, 255, 00);
}
form label {
display: inline;
width: 100px;
}
form input {
display: inline-block;
background-color: black;
color: rgb(0, 255, 0);
font-family: monospace;
font-size: 14px;
border-style: none;
width: 100px;
text-align: right;
}
textarea {
width: 98%;
height: 98%;
}
#Pral {
width: 670px;
height: 190px;
margin-right: auto;
margin-left: auto;
}
#Escrito {
width: 65%;
height: 99%;
float: left;
}
#Etiquetas {
width: 33%;
float: right;
}
</style>
</div>
Si supiese C, lo mismo montaba una librería para poder usar la función directamente en Gambas3.
PS.—Ésta es mi función de Gambas3, que no funciona todo lo bien que debiera:
Código:
' **** Estadísiticas de un texto.
' <<<< Devuelve una matriz de enteros:
' [0]: Número de palabras
' [1]: Número de tipos
' [2]: Número de caracteres
' [3]: Perspicuidad de Szgrizt 1993
' >>>> Texto plano para obtener estadísticas.
'
'' ╔═════════════════════════════════════════════════════════════╗
'' ║ Atención: PCRE sólo admite texto ASCII extendido, no UTF-8. ║
'' ║ Los valores obtenidos son aproximados. ║
'' ╚═════════════════════════════════════════════════════════════╝
Dim iPaso As New Integer[4] ' Variable de paso para almacenar resultados
Dim sEse As String ' Cadena de trabajo
Dim iPal As Integer ' Nº Palabras para cálculo perspicuidad
Dim iSil As Integer ' Nº Sílabas " "
Dim iLet As Integer ' Nº Letras " "
Dim iFrs As Integer ' Nº Frases " "
Dim SCAM As String = Chr(7) ' El símbolo «campanita» que ya no se usa
' Si no hay texto, no hay resultados
If Not Texto Then Return [0, 0, 0, 0]
' Palabras
sEse = RegExp.Replace(Texto, "([A-Za-zÁÉÍÓÚáéíóúÜüñÑ0-9])[A-Za-zÁÉÍÓÚáéíóúÜüñÑ0-9]*", SCAM, RegExp.Greedy)
iPal = Split(sEse, SCAM).Max
iPaso[0] = iPal
' Tipos
sEse = RegExp.Replace(Texto, ".", SCAM, RegExp.Greedy)
iPaso[1] = Split(sEse, SCAM).Max
' Caracteres
sEse = RegExp.Replace(Texto, "\\S", SCAM, RegExp.Greedy)
iPaso[2] = Split(sEse, SCAM).Max
' Sílabas
sEse = RegExp.Replace(Texto, "[aeo]h[iu]|[iu]h[aeo]|[aeo][iu]|[aeo][y]|[y]|[íú]|[iu][^aeo]|[aeo]|[áéíóú]|[q|g]ui[aeo]", SCAM, RegExp.Greedy + RegExp.Caseless)
iSil = Split(sEse, SCAM).Max
' Letras
sEse = RegExp.Replace(Texto, "[A-Za-zÁÉÍÓÚáéíóúÜüñÑ0-9]", SCAM, RegExp.Greedy)
iLet = Split(sEse, SCAM).Max
' Frases
sEse = RegExp.Replace(Texto, "[.?!][^.?!]", SCAM, RegExp.Greedy)
iFrs = Split(sEse, SCAM).Max
' Perspicuidad
If iPal > 0 And iFrs > 0 Then
iPaso[3] = 206.835 - 62.3 * iSil / iPal - iPal / iFrs
Else
iPaso[3] = 0
Endif
Return iPaso
End