JTidyServletプロジェクト(さまざまな回答で言及されてい ます)は、多かれ少なかれ機能していないようです-閲覧可能なソース、メインのJTidyダウンロード(サーブレットまたはフィルターを含まない)以外のSourceForgeプロジェクトページからリンクされたダウンロード、Mavenはありません私が見つけたリポジトリのアーティファクト。誰かがより最新の代替案をお勧めできますか?
3 に答える
ここにいくつかのソースコードがあるようです。https://github.com/vnc-biz/zcs-lib-jtidy/
美学のために-確かに無意味ですが-私は最近、JSF(PrimeFacesと一緒に)Faceletsから発信された視覚的に魅力的なHTML5ソースをユーザーエージェントに提供しようと努力しました。
JTidyとそれに付随するutilsは、実際には役に立ちませんでした。たとえば、DTDを切り替えたり、さまざまな要素を変更したりすることで、「壊れた」マークアップを根本的に「修正」しようとしました(とにかく、現実の世界に有効なHTMLなどがあるかのように)。XSLTapplication/xhtml+xml
は、(理想的な世界でも同様に)使用されるContent-Typeであれば、満足のいく代替手段になります。それから私はjsoupに出くわし、そのAPIを[3]、[4]、[5]、[6]、[7]から得られた例と組み合わせて数回試みた後、結果は非常に驚きでした。
JSF出力
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"><head><link type="text/css" rel="stylesheet" href="/javax.faces.resource/theme.css.xhtml?ln=primefaces-bootstrap" /><link type="text/css" rel="stylesheet" href="/javax.faces.resource/primefaces.css.xhtml?ln=primefaces&v=5.0" /><script type="text/javascript" src="/javax.faces.resource/jquery/jquery.js.xhtml?ln=primefaces&v=5.0"></script><!-- ... -->
<title>Some Page</title></head><body>
<form id="j_idt5" name="j_idt5" method="post" action="/somePage.xhtml" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="j_idt5" value="j_idt5" />
<table id="j_idt5:j_idt6" class="ui-panelgrid ui-widget" role="grid"><tbody><tr class="ui-widget-content" role="row"><td role="gridcell" class="ui-panelgrid-cell"><label>Title : </label></td><td role="gridcell" class="ui-panelgrid-cell"><input id="j_idt5:j_idt8" name="j_idt5:j_idt8" type="text" class="ui-inputfield ui-inputtext ui-widget ui-state-default ui-corner-all" /><script id="j_idt5:j_idt8_s" type="text/javascript">PrimeFaces.cw("InputText","widget_j_idt5_j_idt8",{id:"j_idt5:j_idt8",widgetVar:"widget_j_idt5_j_idt8"});</script></td></tr><!-- ... --><tr class="ui-widget-content" role="row"><td role="gridcell" class="ui-panelgrid-cell"><button id="j_idt5:j_idt13" name="j_idt5:j_idt13" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-icon-left" onclick="PrimeFaces.ab({s:'j_idt5:j_idt13'});return false;" type="submit"><span class="ui-button-icon-left ui-icon ui-c ui-icon-cancel"></span><span class="ui-button-text ui-c">Submit Item</span></button><script id="j_idt5:j_idt13_s" type="text/javascript">PrimeFaces.cw("CommandButton","widget_j_idt5_j_idt13",{id:"j_idt5:j_idt13",widgetVar:"widget_j_idt5_j_idt13"});</script></td></tbody></table><input type="hidden" name="javax.faces.ViewState" id="j_id1:javax.faces.ViewState:0" value="328014904185199862:2925470649195950066" autocomplete="off" />
</form></body>
</html>
jsoupの後
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<link type="text/css" rel="stylesheet" href="/javax.faces.resource/theme.css.xhtml?ln=primefaces-bootstrap" />
<link type="text/css" rel="stylesheet" href="/javax.faces.resource/primefaces.css.xhtml?ln=primefaces&v=5.0" />
<script type="text/javascript" src="/javax.faces.resource/jquery/jquery.js.xhtml?ln=primefaces&v=5.0"></script>
<!-- ... -->
<title>Some Page</title>
</head>
<body>
<form id="j_idt5" name="j_idt5" method="post" action="/somePage.xhtml" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="j_idt5" value="j_idt5" />
<table id="j_idt5:j_idt6" class="ui-panelgrid ui-widget" role="grid">
<tbody>
<tr class="ui-widget-content" role="row">
<td role="gridcell" class="ui-panelgrid-cell">
<label>Title : </label>
</td>
<td role="gridcell" class="ui-panelgrid-cell">
<input id="j_idt5:j_idt8" name="j_idt5:j_idt8" type="text" class="ui-inputfield ui-inputtext ui-widget ui-state-default ui-corner-all" />
<script id="j_idt5:j_idt8_s" type="text/javascript">PrimeFaces.cw("InputText","widget_j_idt5_j_idt8",{id:"j_idt5:j_idt8",widgetVar:"widget_j_idt5_j_idt8"});
</script>
</td>
</tr>
<!-- ... -->
<tr class="ui-widget-content" role="row">
<td role="gridcell" class="ui-panelgrid-cell">
<button id="j_idt5:j_idt13" name="j_idt5:j_idt13" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-icon-left" onclick="PrimeFaces.ab({s:'j_idt5:j_idt13'});return false;" type="submit">
<span class="ui-button-icon-left ui-icon ui-c ui-icon-cancel"></span>
<span class="ui-button-text ui-c">Submit Item</span>
</button>
<script id="j_idt5:j_idt13_s" type="text/javascript">PrimeFaces.cw("CommandButton","widget_j_idt5_j_idt13",{id:"j_idt5:j_idt13",widgetVar:"widget_j_idt5_j_idt13"});
</script>
</td>
</tr>
</tbody>
</table>
<input type="hidden" name="javax.faces.ViewState" id="j_id1:javax.faces.ViewState:0" value="328014904185199862:2925470649195950066" autocomplete="off" />
</form>
</body>
</html>
「よく考えられたXML化」は何も変更せず(自己終了<script>
のs、<![CDATA[
sなど)、改行とインデントだけを変更します。もちろん、出力はXHTML無効のままですが、平均的なブラウザーでは問題にはなりません。最後に、本格的なフェイスレットの場合、結果が同じくらいポジティブになるかどうかはわかりません。
参照(2つ以上のリンクを投稿することはできません)
[3]: http://stackoverflow.com/questions/3604248/jsf-prettify-beautify-html-output
[4]: http://angelborroy.wordpress.com/2009/03/04/dump-request-and-response-using-javaxservletfilter/
[5]: http://www.java2s.com/Tutorial/Java/0400__Servlet/Filterthatusesaresponsewrappertoconvertalloutputtouppercase.htm
[6]: http://www.oracle.com/technetwork/java/filters-137243.html
[7]: http://stackoverflow.com/questions/14736328/looking-for-an-example-for-inserting-content-into-the-response-using-a-servlet-f
次の場所でJTidyServletが見つかりました