通过配置XML,使用TpiSyntaxAnalyzer语法分析,快速生成网页

 

组件TpiSyntaxAnalyzer配置语法

源代码下载和示例分析 C# 2.0
    本语法是一种高度定制化的配置显示内容的解决方案,可以在普通HTML中嵌入多种高级配置节点。配置节点可以实现读取并处理数据库字段,各种运行时数据的配置标识化,以及基于内置函数的一定程度的可编程化。

以下是对本配置语法的详细说明。本语法分为四部分:字段配置语法自定义宏标识语法自定义函数语法流程控制语句语法

1          字段配置节点

1.1         语法:<%[字段名]<属性1:值1><属性2:值2>%>

1.2         说明:本节点表示一个(或多个)数据库字段,同时可以配置各种属性,以对此字段进行各种处理。“属性”是指:设置各种行为,来指示以何种方式处理本字段内容,来满足我们实际的需要。
所有的字段配置节点均包含在边界符<%%>之中,以区分于其它的节点标记。
所有的属性均为并列关系,并被完全包含在“<>”(尖括号)之中,属性设置以“属性名:属性值”的形式表示。在设置属性值时还可以继续使用某个字段,用“[字段名]”来表示。示例
所有的属性值都支持Unicode编码直接表示某个字符,例如:“中华”与“中"u534E”是一样的。另外,尖括号是特殊字符,任何属性值中均不得出现尖括号。如果确实需要使用尖括号,请用Unicode编码代替。
<("u003c)”、“>("u003e)”。

1.3         字段节点属性列表:

1.3.1    Length属性。限制字段内容的长度。
语法:Length:数字。表示此字段最多显示多少字。
示例:[摘要]<Length:500>。

1.3.2    Count属性。对于包含多个值的字段,限制单个值的个数,例如 [作者] 字段。
语法:Count:数字。表示最多显示指定数目的字段值。
示例:[作者] <Count:3> 。

1.3.3    Count和Length同时配置,则Length意义变为限制每个拆分项的字符长度。

1.3.4    Split属性。是否拆分字段。
语法:Split:True。表示此字段要根据分隔符进行拆分显示。

1.3.5    SplitChar属性。指定字段拆分字符。
语法:SplitChar:(分隔字符串列表)
示例: [摘要]<SplitChar:(,;,;)>。表示以逗号和分号作为分隔字符进行拆分。
而拆分后的多个结果之间使用<JoinChar>来作为分隔符

1.3.6    Link属性。给字段加上链接。如果本字段需要拆分,则先进行拆分,再给每个拆分后的项分别加链接。
语法:Link:链接Url。
示例:Link:/appName/detail.aspx? FileName=[文件名]&JourName=[中文刊名-英文刊名],其中[文件名]表示读取数据库的“文件名”字段。
注意:1. 自定义属性中不要出现“<”、“>”、“<%”或“%>”等特殊字符。
2. 如果此字段是拆分字段而且在属性中要使用本字段拆分后的单个值,则属性中的数据库字段必须设置为与此配置节字段完全相同,例如[中文关键词-英文关键词],不完全相同的字段会读取整个字段的值。例如:<%[中文关键词-英文关键词]<Link:/Kns50/ Keyword.aspx?sField=Keyword&sValue=[中文关键词-英文关键词]> <Split:True>%>,因为中文关键词被拆分为了多个值并且每个值都加链接,此时属性中的[中文关键词-英文关键词]就变成了拆分后的某一项的值,此过程是自动转化的。如果确实需要获取整个字段的值,请在字段或前或后加空格,比如 [中文关键词-英文关键词]。

1.3.7    LinkAttribute属性。链接自定义属性。此属性可以为链接设置各种附加属性。
语法:LinkAttribute:链接的html属性。
本属性的注意事项同“Link”属性,请注意遵守。

1.3.8    RemoveMarkRedFlag属性。 去掉字段内容中的标红标记(如果有的话)。
语法:RemoveMarkRedFlag:true|false
说明:如果对检索得到的记录集设置了标红标记,则所有参与检索的字段,均会加上标红标记。但如果是ID之类的字段的话,我们虽然用 ID 检索了,但我们并不希望ID也被标红。因为ID不会参与显示,但加上标红标记反而会让程序出错。通过设置此属性为“true”,来移除本字段中的标红标记。

1.3.9    ExcludeChars属性。从字段内容中排除某些字符(或字符串)。
语法:ExcludeChars:(分隔字符列表)。
说明:一般情况下,对“摘要”或“全文”等字段设置 Length 属性后,页面上显示的结果经常少于设置的字符数,这是因为里面包含了一些不可见的换行符等符号。本属性就可以移除数据库字段内容中的某些字符(或字符串),比如移除多余的换行符、空格等等。
示例:[摘要]<ExcludeChars:("r,[Some Strings here]"n"["].)>,表示移除下列所有的字符:换行符、半角逗号、换行符、左右方括号、半角句号以及用方括号包含的整个字符串。
对于这里的字符串有几点需要说明:1.字符串支持正则表达式,如果要使用正则表达式,请在字符串的起始和结尾加上“/”符号,并且要符合正则的规则。 2.因为字符串形式使用了方括号作为标识字符,因此如果字符串内包含方括号,请使用“"[”“"]” 来进行转义。请注意:如果使用正则表达式的方式,则方括号又是正则表达式的特殊字符,因此这时正则的操作符方括号需要用“"[”“"]”表示,而表示正则表达式中转义的方括号,请用“""[”“""]”来表示,切记! 3.组件不会移除字符串两端的空格,除非确定字符串的两端确实需要空格,否则请不要在字符串的两端保留空格符。4.如果字符串包含尖括号,请使用它们的Unicode编码来代替。但是,用Unicode编码方式表示的字符只能配置为字符串的形式,即请用方括号包含。 5.如果有多个字符串的话,请将每个字符串各自用方括号包含,并列写在本属性之中。

1.3.10       过滤“作者机构”、“英文关键词”等字段的杂乱字符。

1.3.10.1    语法:FilterInvalidWord:True。表示要对字段进行杂乱字符过滤,设为False表示不过滤。

1.3.10.2    InvalidWordSplitChar: (分隔字符串列表) 指定本字段所用的分隔字符,意义同细览库的“SplitFlag”字段。如果不设置此属性,默认使用“,;,;.”这些分隔符

1.3.10.3    FilterWordMinLength:数字。指示过滤后的结果,如果少于此字数时被丢弃。例如:如果机构名称少于两个字符的话,一般为无效机构,因此此机构被丢弃。

1.4       复合字段及联合字段的配置。

1.4.1    复合字段。
减号(-)或者(|)连接多个字段表示多字段复合。意义为:依次读取每个字段直至某个字段内容不为空。
语法:[字段1-字段2-字段3]。

1.4.2    联合字段。
加号(+)连接多个字段表示字段联合。意义为:同时处理所有的字段,最后使用JoinChar属性指定的联合符,来联合各个字段处理结果。
语法:[字段1+字段2]。

1.4.3    JoinChar属性。联合字段的连接字符(串)。
语法:[字段1+字段2]<JoinChar:(-)>。
示例:JoinChar:(-)。表示各个联合字段的处理结果之间用减号连接。

1.4.4    如果配置为联合字段,同时又配置了某个或多个属性,则对每个字段均做同样的处理,最后再把各个字段的处理结果用 JoinChar 来连接。

1.5         节点嵌套说明:
字段配置节点间不允许嵌套,但可以嵌套用户自定义宏节点自定义函数节点

1.6         完整示例:
一个完整的字段配置示例为

<%[中文关键词-英文关键词]<Count:5><Split:True><Link:info.aspx?dbcode=<%#dbCode#%>&w=[中文关键词-英文关键词]&author=[作者]>%>

2          用户自定义宏

2.1         语法:<%#宏名称#%>

2.2         说明:用户在调用本组件之前,可以预先对某些标记名称(宏)设定一个特定的值,然后在本组件的配置文件中,用这个标记来表示他们所设定的值。这里的“宏名称”就是用户事先设计好的标记名称。
之所以会有这类节点,是因为我们在用静态配置来表示我们的动态UI时,除了用到数据库字段数据外,还有很多地方是需要用到页面处理过程中的某些过程值。这些值是动态存在于页面处理过程中的,我们要在静态配置中体现这些动态变量,就需要为每个需要的变量设定一个标记名称,然后把这个名称和动态值进行关联,最后传递给本组件。本组件就会如实的把标记名称替换为对应的动态值,这样才能实现更高层次的配置化。
要使用自定义宏,需要先实例化一个UserMacro对象,然后把所有的自定义宏标记及其值均添加到此对象中,最后在本组件Render的时候传递进来,这样就可以实现宏替换了。

2.3       本组件内置如下宏:

2.3.1    当前页面 Url中所有的页面参数。
例如:page.aspx?type=TableView&…,可以直接用 <%#type#%> 来表示
TableView

2.3.2    Encoding : 当前语言代码( gbenbg‘ )

2.3.3    AppName : 当前Web项目的项目名。
首先读取WebConfig中的SiteSkin配置项,如果没有,则从Url中获取当前项目名,如:
http://www.cnki.net/kns50/test.aspx的 AppName就是Kns50。

3          内置自定义函数

3.1         语法:#函数名(参数1,参数2,…,参数n)

3.2         说明:本组件提供与其它编程语言意义一致的自定义函数功能,通过本功能可以在配置中实现更多、更复杂的功能,进一步增加了配置的灵活性。
函数名只能由字母、下划线、数字或汉字组成,且必须以#开头。
所有参数包含在
()之中,请注意还有双引号。(之所以同时使用括号和双引号,是为了防止参数之中出现括号,而导致本节点整体提取失败。)
多个参数之间用逗号分隔。如果参数中出现逗号、双引号、左右单括号之中的任何一个字符,需要在字符前加“"”进行转义。

3.3         请注意:如果要使用某个数据库字段的内容作为参数,强烈建议直接使用「字段名」来表示,组件会读取字段的内容来进行处理,效果是一样的,但效率会提高很明显。
例如:#Count(作者),而不要使用 #Count(<%[作者]%>)

3.4         函数参数可以嵌套“字段配置节点”,组件会先解析此节点,然后把它的处理结果作为此函数的参数。

3.5         COUNT函数

3.5.1    完整语法:#COUNT(文本,分隔字符)

3.5.2    作用:计算指定文本(或字段)被指定的分隔符分隔后的个数。如果未指定第二个参数,则使用半角分号作为默认分隔符。

3.6         LENGTH函数

3.6.1    完整语法:#LENGTH (文本)

3.6.2    作用:计算指定文本(或字段)的字符个数。

3.7         CUT函数

3.7.1    完整语法:#CUT (文本,数字)

3.7.2    作用:截断指定文本(或字段)使不超过指定数目的字符长度。此方法只支持从右侧截断,保留左侧文本。如果不配置第二个参数,则此函数会原样输出,不会有任何变化。

3.8         Replace函数

3.8.1    完整语法:#Replace(文本,旧字符串,新字符串)

3.8.2    作用:把指定文本(或字段)中的旧字符串替换为新字符串。

3.8.3    补充说明:
如果是处理数据库字段,第一个参数请使用字段名。
第二个参数是要替换掉的字符串,支持正则表达式。如果要使用正则表达式,在字符串前后加 /即可。例如,/<span>(.*?)</span>/。若不使用正则表达式,则按照原始字符串进行匹配。
第三个参数是可选的,如果忽略的话,则使用空串替换匹配项,相当于移除匹配项。如果第二个参数使用正则表达式,本参数可以使用必要的正则标记,例如分组项标记,$1,$2,$&等。

3.9         HasField函数

3.9.1    完整语法:#HASFIELD (文本)

3.9.2    作用:判断指定数据库字段是否存在内容。存在返回true,否则返回false(均为小写字母)

3.10     UrlEncode函数

3.10.1完整语法:#URLENCODE (文本[,true])

3.10.2作用:对指定文本(或字段)进行 Url 编码。第二个参数为一个布尔值,指示是否对第一个参数进行字段替换。如果为true,则如果第一个参数为数据库字段,则会把参数1转换为字段内容。配置为false或不配置,会把参数1原样编码返回。默认为False。

3.11     GetUrlParam函数

3.11.1完整语法:#GetUrlParam(文本)

3.11.2作用:返回Url中文本指定的参数的值(已解码)。

3.12     GetEncodeUrlParam函数

3.12.1完整语法:#GetEncodeUrlParam(文本)

3.12.2作用:返回Url中文本指定的参数的值,此值仍然是经过Url编码的。

3.13     FilterInvalidWord函数

3.13.1完整语法:#FilterInvalidWord(文本,拆分字符列表,单个拆分项最小长度, 需要返回的拆分项的个数,返回结果是否进行Url编码)

3.13.2作用:过滤文本中的杂乱字符,并拆分为指定的个数,多个拆分项之间半角分号连接。

3.14     其它扩展自定义函数, 用UserFunctionDelegae 来扩展

4          内置流程控制语句

4.1         说明:本组件支持与其它编程语言意义一致的流程控制语句­­­­­­­­,以实现配置的分支化,以适应多种不同的运行时情况。

4.2         #IF … #ELSE … #ENDIF单分支语句

4.2.1    语法:

#IF(布尔表达式)

……

#ELSE

……

#ENDIF

4.2.2    语法说明:本语句语法规则类似自定义函数语法,关键字前需加 #以作标记。省略号处可以放置各种配置文本,没有任何配置内容限制。

4.2.3    布尔表达式是一个包含二元运算符的比较表达式,二元运算符限制在<<=>>===和“!=”中的一种,其中“==”表示两侧变量相等,而“!=”表示两侧不相等。
布尔表达式也可以是一个布尔值,即
truefalse字符串。

4.2.4    此表达式中可以嵌套自定义函数,甚至字段配置节点。如果包含字段配置节点,则先计算此节点的结果,然后进行表达式计算。

4.2.5    关于布尔表达式的比较规则:运算符两侧的变量默认作为字符串按ASCII进行比较大小,如果两个变量都为数字的话,则优先按照数字进行比较大小。如果希望强制按字符串进行比较,请用半角单引号包含两个变量。比如:XYZ>ABC

5          关于节点嵌套规则

5.1         自定义宏是单位节点,无法嵌套任何节点。

5.2         字段配置节点可以嵌套“自定义宏”节点和“自定义函数”节点。

5.3         自定义函数节点可以嵌套“自定义宏”节点和“字段配置”节点。

5.4         流程控制语句节点可以嵌套以上所有节点。

5.5         以上所有类型的节点均不允许嵌套本类型的节点。

5.6         字段配置”节点和“自定义函数”节点虽然可以相互嵌套,但仅限于嵌套一层,不允许反复嵌套。

6          处理顺序
以上所有规则的处理顺序为:自定义宏 à字段配置节点 à自定义函数 à流程控制语句。

非常感谢同事李前期工作和对我的指导和帮助

 

posted @ 2008-07-08 13:24  EricWen  阅读(756)  评论(0编辑  收藏  举报