Pregunta

En primer lugar quiero explicar lo que estoy haciendo y entonces mi problema. Necesito escanear un archivo CSS y obtener todos sus enlaces internos (imágenes principalmente), pero necesito para obtener el número de línea donde se encuentran los enlaces.

En este momento estoy de análisis de los archivos usando la biblioteca flauta y funciona muy bien también estoy usando LineNumberReader con el fin de obtener el número de línea donde se encontró un vínculo, pero esta clase arroja un número de línea incorrecta.

Por ejemplo:. El enlace ../../image/bg.gif está en el número de línea 350, pero el GetLineNumber método en la clase LineNumberReader dice 490

Así que voy a apreciar si alguno de ustedes me puede conducir por el camino correcto y me da una posible explicación de por qué la clase LineNumberReader lo hace.

pd:. Otra solución será muy apreciar

  • lo siento los possibles errores tipográficos, Inglés no es mi lengua materna.
¿Fue útil?

Solución 2

HI y @eakbas @Favonius Gracias por su respuesta.
Finalmente conseguí una solución, tal vez no es el mejor pero al menos funciona para mí.
Como he mencionado antes he utilizado la biblioteca de la flauta para implementar la clase DocumentHandler del paquete org.w3c.sac paquete con el fin de analizar el archivo css.
Así que he implementado el método de 'propiedad', este método tiene 3 parámetro, el nombre de la propiedad, un objeto LexicalUnit y un booleano que indica que la propiedad tiene la importante declaración o no.

public void property(String property, LexicalUnit lexicalUnit, boolean important)

Como necesito el número de línea donde se encuentra una propiedad específica, hice una búsqueda y pude ver que la clase que utiliza la flauta para implementar la interfaz LexicalUnit mantiene el número de línea (es LexicalUnitImp), por lo que utiliza la reflexión de hacer una colada de interfaz LexicalUnit a un objeto LexicalUnitImp.

Class<?> clazz = ClassUtils.getClass("org.w3c.flute.parser.LexicalUnitImpl");
Object lexicalObject = clazz.cast(lexicalUnit);
Integer line = (Integer)MethodUtils.invokeMethod(lexicalObject, "getLineNumber", null, null);

Lo hice de esa manera porque la clase LexicalUnitImpl está 'protegido' y no puede lanzar de una manera tradicional.

class LexicalUnitImpl implements LexicalUnit

Nota:. Los ClassUtils clase y MethodUtils son parte de los bienes comunes-BeanUtils librería Apache

Otros consejos

Otro solución - Echar un vistazo a estas herramientas de generación de analizador ...

  1. Antlr - http://www.antlr.org/grammar/1240941192304/css21. g
  2. JavaCC - http://sourceforge.net/projects/cssparser/

El JavaCC y Antlr proporcionan una manera de obtener el número de línea y el número de columna.

La posible razón de la su problema ... el número de línea uno ... podría ser debido a la generación de herramientas de manera analizador trabajo ... Ellos tratan de encontrar la mejor combinación posible ... para que en algún momento tienen a trackback / rebobinar la corriente .... y debido a esta instancia LineNumberReader que está pasando fuera de sincronización ....

La forma ideal para obtener la línea o el número de la columna es el uso de los métodos proporcionados por la propia herramienta ..

Como alternativa, puede usar ph-css como una biblioteca de análisis. Por favor, véase el ejemplo "Visita todas las direcciones URL contenidas en un CSS" en https://github.com / Phax / ph-css # de código-ejemplos para un ejemplo de cómo extraer URLs y determinar la posición de la fuente correcta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top