iTracker确实是个好东西,但对一个东西过熟了,难免期望值就更高了。如果你用 iTracker 作过 Code Review 的话,你就会发现,你贴上去的代码,浏览显示出来的是代码中的空格少了,尤其是没了退格规范显示了。例如,你贴的代码是:
int len = input.length();
for(int i = 0; i < len; i++)
{
char c = input.charAt(i);
if(c == '\'')
sb.append("''");
else
sb.append(c);
}
结果显示出来的却成如下样子
int len = input.length();
for(int i = 0; i < len; i++)
{
char c = input.charAt(i);
if(c == '\'')
sb.append("''");
else
sb.append(c);
}
对于现像的准确描述是:
1、每行行首的空格(或者Tab),不论多少个都被去除
2、每行行间的多个空格(或者Tab),只会显示一个空格
如果提的恰好是关于代码规范的问题,那就没办法用来说明问题了。
这是有赖于HTML给我们的处理结果,记得最早我们使用HTML的时候大多都会产生这样一个迷惑,网页中如何输入空格?因为无论我们在HTML源文件输入多少个空格,浏览器总是对我们爱理不理,后来有大哥哥大姐姐告诉我们说,输入法切换到全角时,在HTML源文件中输入空格,浏览器中能正常显示,我们照做了,果然行,再后来我们知识进步了,知道 和<pre></pre>的功用,也可能体验到了全角空格可能在不同字符集下造成乱码。(有些题外话了)
下面就来说如何能让贴的代码显示时是它的原本样式,以及需作何修改。首先假设你下载的是 iTracker Express 版,并解压缩在 C:\itracker_2.4.2\,那么你的应用的包就是 C:\itracker_2.4.2\jboss-3.2.5\server\default\deploy\itracker.ear 包,我们下面就是要对这个包动手术了。
无论是 jar、war 还是 ear 文件,它们都是标准的 zip 文件,如果你的 winrar/winzip 没有关联与它们关联,那就用手动 Open With 吧。
刚开始我也没有意识到是上面的原因,翻了一下代码没发现有对输入文本每行行首去空格处理,在数据库表 issuehistorybean 中保存着完好格式。
我们先从页面显示数起,好看个端倪,用 winrar/winzip 解开 itracker.ear\web-app.war 看到 view_issue.jsp 中显示描述的代码是:
<it:formatHistoryEntry projectOptions="<%= project.getOptions() %>"><%= history[i].getDescription() %>it:formatHistoryEntry>
由此我们需要追踪到formatHistoryEntry标签实现,代码是itracker.ear\web-app.war\WEB-INF\lib\itracker_taglib.jar\cowsultants\itracker\web\taglib\FormatHistoryEntryTag.class,反编译这个代码,可以看到在 doEndTag()方法中有
if(ProjectUtilities.hasOption(1, projectOptions))
text = HTMLUtilities.removeMarkup(text);
else
if(ProjectUtilities.hasOption(64, projectOptions))
text = HTMLUtilities.escapeTags(text);
else
text = HTMLUtilities.newlinesToBreaks(text);
最后一行,是对文本框中输入的回车转换成正确换行用的,进入这个方法吧,在 itracker.ear\ejb-app.jar\cowsultants\itracker\ejb\client\util\HTMLUtilities.class 中 newlinesToBreaks(String input) 代码如下:
public static String newlinesToBreaks(String input)
{
if(input == null || "".equals(input) || input.indexOf('\n') == -1)
return input;
StringBuffer buf = new StringBuffer();
char chars[] = input.toCharArray();
for(int i = 0; i < chars.length; i++)
{
if(chars[i] == '\r')
continue;
if(chars[i] == '\n')
buf.append("<br>");
else
buf.append(chars[i]);
}
return buf.toString();
}
(我们要注意在itracker.ear\web-app.war\WEB-INF\lib\itrackerClient.jar\cowsultants\itracker\ejb\client\util也有 HTMLUtilities 类,但页面标签并非调用这个类)
它忽略掉了行首空格和行间多个空格的显示,那么我们在这里要处理的就是把空格原本转换为 ,把Tab显示为四个或八个 ,我这里有四个 表示一个Tab吧,所以把上面的 newlinesToBreaks(String input)代码改写成:
public static String newlinesToBreaks(String input)
{
if(input == null || "".equals(input) || input.indexOf('\n') == -1)

