一个用于格式化/统计文本的可扩展框架
2006-07-20 11:43:59 来源:WEB开发网FormatHandler
抽象类,所有格式化输出过程中所使用的handler都应派生自该类,它定义了此类handler(s)的基本行为。主要是一个format方法,功能是将传入其中的解析后的字串,按特定方式处理。至于具体方式,则是subclass的事情。处理后的结果直接影响传入其中的字串,所以,当多个handler对同一个字串进行处理时,要注意处理的先后顺序,不同的顺序可能得到不同的结果。
作为FormatHandler的一个附带功能,通过和LineFormator的配合,你可以实现某些代码/文本的分析统计功能。事实上,你只要在handler内部不对传入其中的字串做任何修改动作,而只对其内容进行分析,就可以实现一些很有价值的功能了。比如:统计代码中的注释行,统计某些关键字的出现频率,统计函数个数及长函数的出现频率等等。统计的结果可以放在各自的handler内,extend部分的Count::KeywordCountHandler,Count::CommentCountHandler,以及Count.cpp演示了某些简单的统计功能。
LineFormator
对解析后的文本逐行逐字进行格式化处理,处理完成后可以通过getFormattedLines方法获取处理结果。你可以通过registFormatHandler方法和unreigistFormatHandler方法在run-time阶段动态的设置各种具体的format handler,以适时的调整LineFormator的行为。比如,你可以将一个原本对c++程序进行缩格排版处理的LineFormator定制成产生Html输出的LineFormator。而实际上,前后是同一个Formator对象。
与LineParser不同的一点是,LineFormator允许对同一类解析后的字串注册多个format handler(s),亦即你可以对同一串字符进行多次处理,当然每次处理之后都会影响原有字串的面貌。比如,针对注释,你可以为LineFormator注册一个Indent::NormalFormatHandler,然后再注册一个Htmlize::BodyFormatHandler,这样的结果是,原有文本在经过缩格排版之后才产生html文本,你可以添加任意多的handler,任意组合这些handler,只要这种添加和组合有实际意义。这一特性,给实际应用带来了便利和灵活性。要注意的一点是,框架调用handler(s)的顺序是和你注册它们的先后顺序一致的。extend部分的Htmlize::BodyFormatHandler,Indent::NormalFormatHandler,Indent::WhitespaceFormatHandler,Indent::OperatorFormatHandler,以及Htmilze.cpp,Indent.cpp,IndentHtmilze.cpp演示了上面所述的内容。
更多精彩
赞助商链接