2010-02-26 19 views
6

Me gustaría resaltar oraciones largas (digamos, 50 palabras o más) contenidas en una matriz de objetos de párrafo en una página, es decir, $("#content p"). No estoy seguro de cómo abordar esto.Resaltar oraciones largas usando jQuery

Intenté originalmente resaltar todas las oraciones, pero tuve problemas cuando contenían etiquetas HTML (por ejemplo, el código de resaltado en la red parece ser solo para palabras individuales, por lo que no tienen en cuenta los nodos secundarios). Soy consciente de que dividir oraciones es difícil; Me gustaría usar.!? seguido por un espacio, luego una letra mayúscula o nada en absoluto (es decir, el final del párrafo).

Gracias de antemano por cualquier ayuda/consejo.

Respuesta

2

Como usted ha dicho que va a ser difícil de hacerlo bien, dado el hecho de que; re no va a coger a todos ellos, me quedo con algo tan simple como:

var regex = \[^.!?]{50,}[.!?]\; 

Tomar muy inteligente y terminará gastando más tiempo codificando casos extremos que lo que razonablemente querría.

+0

Supongo que aquí tienes tu jQuery para hacer el resaltado básico? –

+0

Si estos párrafos tienen enlaces, entonces no producirán lo que espera. Y ahora hay un camino en el futuro para lidiar con el código html que abarca oraciones. Pero si los párrafos son simples y el texto es perfecto. –

0

No estoy seguro de que lo mejor sea hacerlo en el lado del cliente. Consideraría enviar los párrafos nuevamente al servidor para hacer el trabajo. Pero el trabajo debe ser el mismo de cualquier manera.

Primero tome todo el contenido de un párrafo, asegúrese de obtenerlo todo lo que podría estar en unos pocos nodos en el DOM. (Read This) Luego necesitarás hacer un analizador sintáctico que busque tus caracteres divididos mientras aún los ignoras mientras están en entidades HTML.

Como ejemplo, el. en un atributo href se debe ignorar y no dividir. Mientras realiza el análisis, puede mantener un recuento de palabras y romper el trabajo en los espacios. Haga que cada oración sea un objeto que contenga la oración completa y el recuento de palabras. Entonces puede insertar esos objetos en una matriz que represente el párrafo. Una vez hecho esto, puede iterar a través de la matriz y ajustar cualquier oración en un lapso para resaltar con CSS si el conteo de palabras alcanza su umbral.

El problema principal son las etiquetas que pueden ser partes de dos oraciones, como la siguiente.

I'm typing <b> in bold. NOW!</b> 

lo que he hablado de hacer no trata de eso, sino que podría hacer que el programa de análisis más complejo después para apoyar eso.

Así que una visión general rápida de mi análisis laberíntico a través de todos los personajes con una máquina de estado que se ocupa de contar palabras y dividir en el lugar correcto. En split, agregue los datos que ha recopilado a una matriz. Cuando termine, itere a través de la matriz generando las frases recién ajustadas.

0

Esta es probablemente una solución más bien lento, y feo también, pero debe ser bastante simple de código:

Leer todo el texto en una cadena, y luego analizar a través de ella, contando caracteres y encontrar todas.! ?-personaje. En el ciclo de análisis, también busca < y>, donde < significa "ignorar todo.!? Hasta encontrar otro>". Luego, cada vez que encuentre un carácter.!?, Verifique la longitud desde la última, y ​​si es lo suficientemente larga, guarde el índice de inicio y fin en una matriz o algo.

Cuando todo está hecho, haga otro ciclo, que mueva las subcadenas de la primera cadena a una nueva cadena, anteponiendo cada "oración larga" con una etiqueta resaltada, y agregando una etiqueta resaltada al final de eso, antes de continuar.

Al terminar, coloque la nueva cadena de vuelta donde lo obtuvo de un ...

0

Para ello, tiene que obtener el código HTML de cada párrafo (node.html()) y luego vuelva a colocar todas las etiquetas HTML con el mismo número de espacios. Esto debería ser bastante directo y, como puede ver, simplemente abra los soportes en ángulo y el primer soporte de cierre. Primero debe hacer esto para evitar que las palabras y las paradas completas de la etiqueta confundan el resto del algoritmo, pero también para evitar que una etiqueta se cuente como una palabra.

Divida el texto basado en un punto final seguido de nada o cualquier cantidad de espacios en blanco para obtener sus oraciones. Debe realizar esta división manualmente usando una expresión regular correspondiente para que pueda hacer un seguimiento de las posiciones de inicio y final de la oración en la cadena original.

A continuación divide cada oración en espacios en blanco y elimina cualquier 'palabra' de la matriz que solo consista en espacios en blanco. Esto te da la duración de la oración. Si supera su límite, inserte el HTML apropiado en las posiciones inicial y final de la oración en su cadena HTML original. Tendrá que hacer un seguimiento de la cantidad de HTML adicional que ha agregado para que pueda encontrar las posiciones correctas de inicio y final de las oraciones largas posteriores.

Cuestiones relacionadas