Se podría automatizar límite citas anidadas?

Buenas,

He buscado algún hilo relacionado pero solo he encontrado uno de 2008, ya cerrado. El asunto es que me preguntaba si sería posible que de manera automática se detectaran citas anidadas en exceso y se eliminaran automáticamente las que excendan de un número tope (por mí una cantidad correcta sería 2, ó 3 como está ahora).

Lo comento porque observo que, sobre todo usuarios relativamente nuevos pero también veteranos, encadenan conversaciones citando la respuesta que quieren comentar y se entra en un bucle de respectivas citas anidadas con las que al llegar al tope de 3, se pierde el formato coherente y queda un mensaje confuso la mayoría de las veces, mostrando como "parte" de la respuesta el contenido de la última cita.

No sé hasta qué punto sería complejo que al enviar el mensaje, se eliminaran automáticamente esas citas de más (las más antiguas) y quedara siempre legible.

Un saludo.
Poder poder debería poderse, pero nunca se me ha ocurrido una forma sencilla pero sobre todo fiable en el 100% de los casos. La gente hace unas pirulas con el bbcode que ni te imaginas (quizás te has encontrado alguna vez con el error de bbcode mal anidado), y si aún encima editamos esos churros al vuelo...

Además, no podemos eliminar una cita cualquiera automáticamente: puede que haya varios candidatos y solo sea prescindible uno de ellos.

Si alguien quiere demostrar que estoy equivocado y que soy un inútil, estaré encantado de ser ridiculizado en público [carcajad]
melado escribió:Si alguien quiere demostrar que estoy equivocado y que soy un inútil, estaré encantado de ser ridiculizado en público

Trato hecho [sati]

Creo que lo lógico, es eliminar la cita más antigua. La función sería algo como esto (JAVASCRIPT):

/*
*** Recibe el texto del mensaje
*** Devuelve el mensaje con los quotes sobrantes eliminados
*/

function procesarMensaje(texto) {
    var limit_anidamiento = 3;
    var index_abierto;
    var index_cerrado;
    var aninados = 0;
    var resultado = "";
    var start = 0;
    var new_start;

    var infinito = texto.length+1
    var abierto = "[quote";
    var cerrado = "[/quote]";
    do
    {
         index_abierto = infinito;
         index_cerrado = infinito;

         index_abierto = texto.indexOf(abierto,start);
         if (anidados > 0)
             index_cerrado = texto.indexOf(cerrado,start);

         index_abierto = normaliza(index_abierto,infinito);
         index_cerrado = normaliza(index_cerrado,infinito);

         if (index_abierto > index_cerrado)
         {
               new_start = index_abierto;
               aninados++;
         }
         else
         {
               new_start  = index_cerrado + cerrado.length; // hay que saltarse la etiqueta [/quote]
               anidados--;
         }
       
         if (anidados <= limit_anidamiento)
         {
                 resultado.concat(texto.substring(start,new_start));
         }
         start = new_start;
    } while(start < texto.length);
   
    return resultado;
}

function normaliza(index,tam){
    return index == -1 ? tam : index;
}
No he mirado mucho el tema pero además de haber algún errorcillo que impide su ejecución ("aninados" vs "anidados") creo que fallaría en un caso como por ejemplo:
[quote="usuario"][quote[/quote]


Si de verdad te animas a hacer algo funcional te animo a que pruebes a montarlo en jsfiddle.
Value pues, diferenciando los dos casos en un if :-?

/*
*** Recibe el texto del mensaje
*** Devuelve el mensaje con los quotes sobrantes eliminados
*/

function procesarMensaje(texto) {
    var limit_anidamiento = 3;
    var index_abierto;
    var index_cerrado;
    var anidados = 0;
    var resultado = "";
    var start = 0;
    var new_start;

    var infinito = texto.length+1
    var abierto = "[quote\"";
    var abierto_simple = "[quote]"
    var cerrado = "[/quote]";
    do
    {
         index_abierto = infinito;
         index_cerrado = infinito;

         index_abierto = texto.indexOf(abierto_simple,start);
         var abierto_incompleto = texto.indexOf(abierto,start);

         if (abierto_incompleto != -1 && abierto_incompleto < index_abierto)
         {
               var fin_comillas = texto.indexOf("\"]",abierto_incompleto);
               if (fin_comilas != -1)
               {
                   index_abierto = abierto_incompleto;
               }
         }

         if (anidados > 0)
             index_cerrado = texto.indexOf(cerrado,start);

         index_abierto = normaliza(index_abierto,infinito);
         index_cerrado = normaliza(index_cerrado,infinito);

         if (index_abierto > index_cerrado)
         {
               new_start = index_abierto;
               aninados++;
         }
         else
         {
               new_start  = index_cerrado + cerrado.length; // hay que saltarse la etiqueta [/quote]
               anidados--;
         }
       
         if (anidados <= limit_anidamiento)
         {
                 resultado.concat(texto.substring(start,new_start));
         }
         start = new_start;
    } while(start < texto.length);
   
    return resultado;
}

function normaliza(index,tam){
    return index == -1 ? tam : index;
}


Si de verdad te animas a hacer algo funcional te animo a que pruebes a montarlo en jsfiddle.

Ni idea como va, apenas manejo de javascript como para mezclarlo con todo el despliegue en HTML y tal.
Sigue sin funcionar, ahora ejecuta pero parece devolver siempre una cadena vacía :-?

Pero tampoco te rompas mucho más la cabeza, me has dado una buena idea que sí puede funcionar, voy a probar a ver :P
Me ha dado muchos más problemas de los que esperaba pero al final le encontré las cosquillas :D

Intentad citar este mensaje para ver cómo funciona (si funciona xD).

uno
dos
tres
melado escribió:Me ha dado muchos más problemas de los que esperaba pero al final le encontré las cosquillas :D

Intentad citar este mensaje para ver cómo funciona (si funciona xD).

uno
dos


Volando voy, volando vengo... [beer]

pd/ Al intentar enviarlo aparece el mensaje "No puedes anidar más de 3 citas así que hemos eliminado de tu mensaje las más antiguas"

Edito: Genial, un millón de gracias.
Deschamps escribió:
melado escribió:Me ha dado muchos más problemas de los que esperaba pero al final le encontré las cosquillas :D

Intentad citar este mensaje para ver cómo funciona (si funciona xD).

uno


Volando voy, volando vengo... [beer]

pd/ Al intentar enviarlo aparece el mensaje "No puedes anidar más de 3 citas así que hemos eliminado de tu mensaje las más antiguas"

Edito: Genial, un millón de gracias.


IN MELADO WE TRUST
Ostias mola mucho, toca intentar romperlo [burla2]
Ashdown está baneado por "faltas de respeto"
Good job! Como dice machacon, vamos a hacerte de jeta testers hasta que lo humillemos.
Senegio escribió:
Deschamps escribió:
Volando voy, volando vengo... [beer]

pd/ Al intentar enviarlo aparece el mensaje "No puedes anidar más de 3 citas así que hemos eliminado de tu mensaje las más antiguas"

Edito: Genial, un millón de gracias.


IN MELADO WE TRUST
Deschamps escribió:
melado escribió:Me ha dado muchos más problemas de los que esperaba pero al final le encontré las cosquillas :D

Intentad citar este mensaje para ver cómo funciona (si funciona xD).



Volando voy, volando vengo... [beer]

pd/ Al intentar enviarlo aparece el mensaje "No puedes anidar más de 3 citas así que hemos eliminado de tu mensaje las más antiguas"

Edito: Genial, un millón de gracias.


Todos los intentos de romperlo están siendo en vano [carcajad]
11 respuestas