日期:2014-05-17  浏览次数:20629 次

Html标签属性语法外套
CommonTemplate( http://www.commontemplate.org )的Html标签属性语法外套是项目比较重要的Feature.
如:
<table ct:if="users != null && users.size > 0" border="1">
    <tr ct:for="user : users">
	<td><span ct:out="for.index + 1">1</span></td>
	<td><span ct:out="user.name">james</span></td>
	<td><span ct:out="user.coins">2.00</span></td>
    </tr>
</table>

过滤后:
$if{users != null && users.size > 0}
<table border="1">
    $for{user : users}
    <tr>
	<td>$out{for.index + 1}<span>1</span>$end</td>
	<td>$out{user.name}}<span>james</span>$end</td>
	<td>$out{user.coins}}<span>2.00</span>$end</td>
    </tr>
    $end
</table>
$end


当前版本是自行解析的, 对非法的Html格式容错性较弱, 只作了些自动关闭未结束标签之类的简单处理. 为了尽快稳定功能, 准备借助其它Html容错解析工具包进行解析, 比较成熟的是HtmlParser(http://htmlparser.sourceforge.net), 但发现它实现此功能并不方便. 而需求是很简的, 就是将特殊名称空间的属性转换为tag两端的内容.

考虑到此功能不只是CommonTemplate能用到, 其它模板引擎(如:Velocity/FreeMaker)一样可以用, 所以发了一个请求给htmlparser, 并给出了我期望的API:
// Tag外套内容封装
public final class Coat {

	private final String before;

	private final String after;

	public Coat(String before, String after) {
		this.before = before;
		this.after = after;
	}

	public String getBefore() {
		return before;
	}

	public String getAfter() {
		return after;
	}

}

public interface AttributeCoatHandler {

	// 解析器在遇到相应属性时, 回调此接口
	// 并将返回的Coat中的before和after内容添加到Tag两端
	Coat handleAttribute(String attrName, String attrValue);

}

// 注册指定名称空间的属性处理器
TagCoatContext.registerAttributeCoatHandler(String namespace, AttributeCoatHandler handler);



希望他们能实现, 如果不行, 可能要自己写了, 先加入延迟计划中.