RE: Hledám JSP parser
Polak Michal
Michal.Polak na turboconsult.cz
Pondělí Říjen 19 16:34:13 CEST 2009
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]: <cb:body>
[6,1]->[6,12]: <cb:errors>
[8,1]->[8,22]: <div class="content">
[10,1]->[10,5]: <h2>
[10,5]->[10,93]: <cb:message key="hlaska007" text="Informace o produktu" />
[10,93]->[10,121]: <cb:hlp key="HLPPROD123"/>
[10,121]->[10,126]: </h2>
...
[28,1]->[28,7]: </div>
[30,1]->[30,13]: </cb:errors>
[31,1]->[31,11]: </cb:body>
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<StartTag> 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-bounces na java.cz [mailto:konference-bounces na java.cz] za
> uživatele Polak Michal
> Odesláno: 19. června 2008 14:00
> Komu: javacz (konference na 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 <trdlo:info>, <trdlo:error>, <trdlo:message>. 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
Další informace o konferenci Konference