Pergunta

Primeiro, quero explicar o que estou fazendo e depois meu problema. Preciso digitalizar um arquivo CSS e obter todos os seus links internos (principalmente imagens), mas preciso obter o número da linha onde os links foram encontrados.

No momento, estou analisando os arquivos usando a biblioteca de flauta e funciona muito bem também estou usando o linenumberreader para obter o número da linha em que um link foi encontrado, mas essa classe lança um número de linha incorreto.

Por exemplo: o link ../../image/bg.gif está na linha número 350, mas o método getlineNumber no linenumberreader de classe diz 490.

Por isso, aprecio se alguns de vocês podem me levar pela maneira correta e me dar uma explicação possível por que a classe LinenumberReader faz isso.

PD: Outra solução será muito apreciada.

  • Desculpe os digitação dos possíveis, o inglês não é minha língua materna.
Foi útil?

Solução 2

Olá @eakbas e @favonius obrigado pela sua resposta.
Finalmente consegui uma solução, talvez não seja a melhor, mas pelo menos funciona para mim.
Como mencionei antes de usar a biblioteca de flautas para implementar a classe DocumentHandler do pacote pacote org.w3c.sac para analisar o arquivo CSS.
Por isso, implementei o método 'Propriedade', esse método possui 3 parâmetro, o nome da propriedade, um objeto lexicalunit e um booleano indicando que a propriedade tem a instrução importante ou não.

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

Como eu preciso do número da linha em que uma propriedade específica é encontrada, fiz uma pesquisa e pude ver que a classe que a flauta usa para implementar a interface lexicalunit segura o número da linha (é lexicalunitimp), então usei a reflexão para fazer uma fundição da interface lexicalUnit a um 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);

Eu fiz isso dessa maneira porque a classe lexicalunitimpl está 'protegida' e não posso lançá -la de maneira tradicional.

class LexicalUnitImpl implements LexicalUnit

Nota: As clássicas e métodos de classe fazem parte da biblioteca Apache do Commons-Beanutils.

Outras dicas

Outro Solução - dê uma olhada nessas ferramentas de geração de analisador ...

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

O JAVACC e o ANTLR fornecem uma maneira de obter o número da linha e o número da coluna.

A possível razão para o seu problema ... a linha número um ... pode ser por causa da maneira como as ferramentas de geração de analisador funcionam ... elas tentam descobrir a melhor combinação possível ... para isso, em algum momento, eles precisam rastrear/ Rebobine o fluxo .... e devido a este, sua instância do linenumberReader está saindo de sincronização ....

A maneira ideal de obter o número de linha ou coluna é usar os métodos fornecidos pela própria ferramenta.

Alternativamente, você pode usar ph-css como uma biblioteca de análise. Por favor, veja o exemplo "Visite todos os URLs contidos em um CSS" em https://github.com/phax/ph-css#code-examples Para um exemplo de como extrair URLs e determinar a posição correta da fonte.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top