RE: Hledám JSP parser

2009-10-19 Thread Polak Michal
Tak si odpovidam sam.

Zkousim "Jericho HTML Parser" (http://sourceforge.net/projects/jerichohtml/)

A na prvni pohled to splnuje moje pozadavky (tj. vypise i tagy, ktere jsou v 
attributu jineho tagu).

Prikladam kus kodu, ktery z JSP souboru produkuje zhruba tento vystup:

[1,1]->[1,90]: <%@ page language="java" contentType="text/html; charset=CP1250" 
pageEncoding="CP1250" %>
[2,1]->[2,80]: <%@ taglib uri="http://jakarta.apache.org/struts/tags-html-tc"; 
prefix="html" %>
[3,1]->[3,77]: <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean"; 
prefix="bean" %>
[5,1]->[5,10]: 
[6,1]->[6,12]: 
[8,1]->[8,22]: 
[10,1]->[10,5]: 
[10,5]->[10,93]: 
[10,93]->[10,121]: 
[10,121]->[10,126]: 
...
[28,1]->[28,7]: 
[30,1]->[30,13]: 
[31,1]->[31,11]: 

Je to doopravdy pouze na ukazku:

import net.htmlparser.jericho.CharacterReference;
import net.htmlparser.jericho.Segment;
import net.htmlparser.jericho.Source;
import net.htmlparser.jericho.StartTag;
import net.htmlparser.jericho.StartTagType;
import net.htmlparser.jericho.Tag;

private static void _trace(Source aParser, Segment aTag) {

int beginOffset = aTag.getBegin();
int beginRow = aParser.getRow(beginOffset);
int beginColumn = aParser.getColumn(beginOffset);
int endOffset = aTag.getEnd();
int endRow = aParser.getRow(endOffset);
int endColumn = aParser.getColumn(endOffset);

String content = 
CharacterReference.decodeCollapseWhiteSpace(aTag.toString());
System.out.println(String.format("[%d,%d]->[%d,%d]: %s"
, beginRow, beginColumn, endRow, endColumn, content));
  }
  private void _doIt(File aFile) throws IOException {

Reader r = new BufferedReader(new FileReader(aFile));
Source source=new Source(r);

//Tags: <% ... %>
List jspSpecificTags = 
source.getAllStartTags(StartTagType.SERVER_COMMON);
for (StartTag tag : jspSpecificTags) {
 
  _trace(source, tag);
}

//All Start/End tags but <% ... %>
Tag[] allTags = source.fullSequentialParse();
for (Tag tag : allTags) {

  if (!StartTagType.SERVER_COMMON.equals(tag.getTagType())) {
_trace(source, tag);
  }
}
  }

Tagy ctu dvema zpusoby:

- Bud pouze startovaci (trida StartTag) u tagu <% ... %>
- Anebo vsechny (trida Tag - startovaci i koncove) s tim, ze si <% ... %> 
odfiltruju.

V tomto pripade je to neoptimalni, protoze parseruju 2x 
(source.getAllStartTags, source.fullSequentialParse).
Klidne bych vystacil s source.fullSequentialParse(), ale chtel jsem ukazat i tu 
prvni moznost

Doufam sem za par dni nebudu vykrikovat, jaky jsou s parserem potize. :-)
--
Michal Polák

> -Původní zpráva-
> Od: konference-boun...@java.cz [mailto:konference-boun...@java.cz] za
> uživatele Polak Michal
> Odesláno: 19. června 2008 14:00
> Komu: javacz (konference@java.cz)
> Předmět: Hledám JSP parser
> 
> Zdravím,
> 
> Potřeboval bych umět v JSP vyhledat obsah některých mých (daného .tld)
> tagů a jejich attributů.
> 
> Tedy např. pro
> 
> <%@ taglib uri="http://mojeurl/moje.tld"; prefix="trdlo" %>
> 
> tagy , , . I počet bytů/znaků
> od začátku dokumentu, řádek a sloupec výskytu.
> 
> JSP podle mne nic nepředepisuje, tagy mohou ležet prakticky libovolně
> (i třeba v attributech jiných tagů, že ano). Resp. v již
> existujících JSP je mám obsažené a JSP zobrazují co chtěno, tj. obsah
> JSP je "správný".
> 
> JSP jsou psána v xhtml (ale není to zaručeno, tedy hledaný parser by se
> měl umět vyrovnat i s HTML a XML).
> 
> Zatím jsem si (už před lety) zbastlil takovou naivní implementaci
> pomocí regulárních výrazů. Ale to se nedokážu vyrovnat např. s
> komentáři, a stejně tak mám problém určit pozici, řádek a sloupec.
> Netvrdím, že by to nešlo, ale hledám jednodušší už hotové řešení.
> 
> Abych si psal celý lexer a parser sám, tak to se mi opravdu nechce.
> 
> Máte třeba někdo pozitivní zkušenosti s
> javax.swing.text.html.HTMLEditorKit?
> Před lety mi v HTML zatloukal některé attributy a od té doby se jej
> bojím použít.
> 
> Anebo neumíte někdo použít JSP parser třeba z Tomcatu? Tuším se jmenuje
> Jasper (bohužel stejně jako tiskový framework).
> 
> Webových kontejnerů je přece mraky, někdo snad zveřejní svůj parser.
> 
> Budu vděčen za jakékoliv rady.
> 
> Děkuji.
> 
> --
> Michal Polák


Re: Hledám JSP parser

2008-06-19 Thread Oto Buchta
On Thu, Jun 19, 2008 at 03:08:36PM +0200, Polak Michal wrote:
> > Oto Buchta napsal:
> > Bojim se bojim.
> > Podle mne je mozne standardnimi nastroji BUD hledat radky a sloupce
> > NEBO
> > nachazet tagy v zavislosti na strukture.
> 
> Dovedu si představit parser, který při stavbě stromu zvládne určovat pozici. 
> Stačí, aby tuto informaci lexer poslal spolu s tokenem.
> Přesněji řečeno dva takové parsery mám k dispozici (jeden na Informix SQL a 
> druhý na Javu). Ale napsat je bylo celkem hodně práce. Na Javu bych už dnes 
> použil např. Eclipse JDT. :-)

Ja si ho taky dokazu predstavit. Jenom si nemyslim, ze to nektery z nich dela.
Ale muzu se mylit, pouze predpokladam. Nevidim totiz duvod, PROC by to delal.
je ale mozne, ze to pred tebou uz nekdo chtel a je to pridane ve originalu.

Samozrejme je mozne zasahovat treba do Jasperu a pri cteni tokenu cpat nekam do 
staticke ThreadLocal promenne aktualni hodnoty. Ale mne osobne by se do toho
nechtelo.

Az to budes mit hotove, dej vedet tvurcum Jasperu, mohlo by to byt chovani
distribucni verze (pri nastaveni nejake property).

tapik


RE: Hledám JSP parser

2008-06-19 Thread Polak Michal
> Oto Buchta napsal:
> Bojim se bojim.
> Podle mne je mozne standardnimi nastroji BUD hledat radky a sloupce
> NEBO
> nachazet tagy v zavislosti na strukture.

Dovedu si představit parser, který při stavbě stromu zvládne určovat pozici. 
Stačí, aby tuto informaci lexer poslal spolu s tokenem.
Přesněji řečeno dva takové parsery mám k dispozici (jeden na Informix SQL a 
druhý na Javu). Ale napsat je bylo celkem hodně práce. Na Javu bych už dnes 
použil např. Eclipse JDT. :-)

> Ja osobne bych to delal cestou nejmensiho odporu, a to perlem.
> IMHO to nebude na vic jak dvacet rakdu...
> Nevim ale, co ma presne delat, tak ti ho nenapisu ;-)

Moc děkuji za snahu.
Ještě než přestal být perl mým oblíbencem, tak bych použil strict a např. 
"while(my $radek = ) {".
;-)

> Principialne to ale IMHO nebude nic jineho nez cist text radek po
> radku,
> kdyz najdes definici prefixu tveho taglibu, tak si ho zapamatujes,
> pokusis se na kazdem radku rekurzivne najit vsechny vyskyty tagu.
> ... zdroják v Perlu ...

Ano, zhruba takto vypadá moje naivní implementace.
Bohužel to neřeší ignorování komentářů. Ani si teď nemůžu vzpomenout, zda v 
HTML/JSP lze komentáře vnořovat.

Jak říkám, teoreticky vím jak JSP lexer/parser napsat (vylepšování mojí naivní 
implementace přes regulární výrazy mi vhodné nepřijde), jen se mi do toho 
nechce a hledám něco již hotového.

Díky.
--
Michal Polák


Re: Hledám JSP parser

2008-06-19 Thread Oto Buchta
On Thu, Jun 19, 2008 at 02:28:48PM +0200, Oto Buchta wrote:
> 
> while () {
> 
> No a samozrejme spustis pres 
> 
> $ perl tapikuvskript.pl `find -name "*.jsp"`
 
No dobre, ja vim, jsem tukan, musi si samozrejme otevirat soubory a nikoli
STDIN a ty pak jeste vypisovat, ale to je snad jasne, ne?

ted by to musel spustit pres find -name "*.jsp"|xargs -r -i ts.sh {}

pri 

$ cat ts.sh
#!/bin/sh
echo $1
perl tapikuvskript.pl <$1


tapik


Re: Hledám JSP parser

2008-06-19 Thread Ján Valkovič




Zdravim,
JSP editory maju tiez kontrolu syntaxe a vela z nich ma otvoreny kod a
mozno aj pouzitelnu licenciu. Aj ked, vrtat sa v takom WTP z Eclipse
... no neviem, v kazdom pripade, mozno by to stalo za to

ya

Polak Michal  wrote / napísal(a):

  Zdravím,

Potřeboval bych umět v JSP vyhledat obsah některých mých (daného .tld) tagů a jejich attributů.

Tedy např. pro

<%@ taglib uri="http://mojeurl/moje.tld" prefix="trdlo" %>

tagy , , . I počet bytů/znaků od začátku dokumentu, řádek a sloupec výskytu.

JSP podle mne nic nepředepisuje, tagy mohou ležet prakticky libovolně (i třeba v attributech jiných tagů, že ano). Resp. v již existujících JSP je mám obsažené a JSP zobrazují co chtěno, tj. obsah JSP je "správný".

JSP jsou psána v xhtml (ale není to zaručeno, tedy hledaný parser by se měl umět vyrovnat i s HTML a XML).

Zatím jsem si (už před lety) zbastlil takovou naivní implementaci pomocí regulárních výrazů. Ale to se nedokážu vyrovnat např. s komentáři, a stejně tak mám problém určit pozici, řádek a sloupec. Netvrdím, že by to nešlo, ale hledám jednodušší už hotové řešení.

Abych si psal celý lexer a parser sám, tak to se mi opravdu nechce.

Máte třeba někdo pozitivní zkušenosti s javax.swing.text.html.HTMLEditorKit?
Před lety mi v HTML zatloukal některé attributy a od té doby se jej bojím použít.

Anebo neumíte někdo použít JSP parser třeba z Tomcatu? Tuším se jmenuje Jasper (bohužel stejně jako tiskový framework).

Webových kontejnerů je přece mraky, někdo snad zveřejní svůj parser.

Budu vděčen za jakékoliv rady.

Děkuji.

--
Michal Polák
  







Re: Hledám JSP parser

2008-06-19 Thread Oto Buchta
Bojim se bojim.
Podle mne je mozne standardnimi nastroji BUD hledat radky a sloupce NEBO
nachazet tagy v zavislosti na strukture.

Ja osobne bych to delal cestou nejmensiho odporu, a to perlem.
IMHO to nebude na vic jak dvacet rakdu...

Nevim ale, co ma presne delat, tak ti ho nenapisu ;-)
Principialne to ale IMHO nebude nic jineho nez cist text radek po radku,
kdyz najdes definici prefixu tveho taglibu, tak si ho zapamatujes,
pokusis se na kazdem radku rekurzivne najit vsechny vyskyty tagu.

No dobre, tak co treba:

#!/usr/bin/perl

@tagNames=('error','message','info');
$counter=0;
$prefix='trdlo';
while() {
$radek=$_;
#tadykdyztaktestnaprefix
$counter++;
foreach $tagname (@tagNames){
$_=$radek;
while (/(.*)\<${prefix}\:${tagname}\>(.*)/) {
$pozice=length($1);
$_=$2;
print "$counter $pozice $tagname\n";
} } }

No a samozrejme spustis pres 

$ perl tapikuvskript.pl `find -name "*.jsp"`

V Jave to pujde napsat taky, ikdyz to bude kapku delsi...

On Thu, Jun 19, 2008 at 01:59:50PM +0200, Polak Michal wrote:
> Zdravím,
> 
> Potřeboval bych umět v JSP vyhledat obsah některých mých (daného .tld) tagů a 
> jejich attributů.
> 
> Tedy např. pro
> 
> <%@ taglib uri="http://mojeurl/moje.tld"; prefix="trdlo" %>
> 
> tagy , , . I počet bytů/znaků od 
> začátku dokumentu, řádek a sloupec výskytu.
> 
> JSP podle mne nic nepředepisuje, tagy mohou ležet prakticky libovolně (i 
> třeba v attributech jiných tagů, že ano). Resp. v již existujících JSP je 
> mám obsažené a JSP zobrazují co chtěno, tj. obsah JSP je "správný".
> 
> JSP jsou psána v xhtml (ale není to zaručeno, tedy hledaný parser by se měl 
> umět vyrovnat i s HTML a XML).
> 
> Zatím jsem si (už před lety) zbastlil takovou naivní implementaci pomocí 
> regulárních výrazů. Ale to se nedokážu vyrovnat např. s komentáři, a stejně 
> tak mám problém určit pozici, řádek a sloupec. Netvrdím, že by to nešlo, ale 
> hledám jednodušší už hotové řešení.
> 
> Abych si psal celý lexer a parser sám, tak to se mi opravdu nechce.
> 
> Máte třeba někdo pozitivní zkušenosti s javax.swing.text.html.HTMLEditorKit?
> Před lety mi v HTML zatloukal některé attributy a od té doby se jej bojím 
> použít.
> 
> Anebo neumíte někdo použít JSP parser třeba z Tomcatu? Tuším se jmenuje 
> Jasper (bohužel stejně jako tiskový framework).
> 
> Webových kontejnerů je přece mraky, někdo snad zveřejní svůj parser.
> 
> Budu vděčen za jakékoliv rady.
> 
> Děkuji.
> 
> --
> Michal Polák