通过配置XML,使用TpiSyntaxAnalyzer语法分析,快速生成网页
组件TpiSyntaxAnalyzer配置语法
源代码下载和示例分析 C# 2.0
本语法是一种高度定制化的配置显示内容的解决方案,可以在普通HTML中嵌入多种高级配置节点。配置节点可以实现读取并处理数据库字段,各种运行时数据的配置标识化,以及基于内置函数的一定程度的可编程化。
以下是对本配置语法的详细说明。本语法分为四部分:字段配置语法、自定义宏标识语法、自定义函数语法、流程控制语句语法。
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.1 语法:<%#宏名称#%>。
2.2 说明:用户在调用本组件之前,可以预先对某些标记名称(宏)设定一个特定的值,然后在本组件的配置文件中,用这个标记来表示他们所设定的值。这里的“宏名称”就是用户事先设计好的标记名称。
之所以会有这类节点,是因为我们在用静态配置来表示我们的动态UI时,除了用到数据库字段数据外,还有很多地方是需要用到页面处理过程中的某些过程值。这些值是动态存在于页面处理过程中的,我们要在静态配置中体现这些动态变量,就需要为每个需要的变量设定一个标记名称,然后把这个名称和动态值进行关联,最后传递给本组件。本组件就会如实的把标记名称替换为对应的动态值,这样才能实现更高层次的配置化。
要使用自定义宏,需要先实例化一个UserMacro对象,然后把所有的自定义宏标记及其值均添加到此对象中,最后在本组件Render的时候传递进来,这样就可以实现宏替换了。
2.3 本组件内置如下宏:
2.3.1 当前页面 Url中所有的页面参数。
例如:page.aspx?type=TableView&…,可以直接用 <%#type#%> 来表示 “TableView” 。
2.3.2 Encoding : 当前语言代码( ‘gb‘、‘en‘、或 ‘bg‘ )
2.3.3 AppName : 当前Web项目的项目名。
首先读取WebConfig中的SiteSkin配置项,如果没有,则从Url中获取当前项目名,如:
http://www.cnki.net/kns50/test.aspx的 AppName就是Kns50。
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.1 说明:本组件支持与其它编程语言意义一致的流程控制语句,以实现配置的分支化,以适应多种不同的运行时情况。
4.2 #IF … #ELSE … #ENDIF单分支语句
4.2.1 语法:
#IF(布尔表达式)
……
#ELSE
……
#ENDIF
4.2.2 语法说明:本语句语法规则类似自定义函数语法,关键字前需加 ”#” 以作标记。省略号处可以放置各种配置文本,没有任何配置内容限制。
4.2.3 布尔表达式是一个包含二元运算符的比较表达式,二元运算符限制在“<”、“<=“、“>“、“>=“、“==“和“!=”中的一种,其中“==”表示两侧变量相等,而“!=”表示两侧不相等。
布尔表达式也可以是一个布尔值,即 ”true” 或 ”false” 字符串。
4.2.4 此表达式中可以嵌套自定义函数,甚至字段配置节点。如果包含字段配置节点,则先计算此节点的结果,然后进行表达式计算。
4.2.5 关于布尔表达式的比较规则:运算符两侧的变量默认作为字符串按ASCII进行比较大小,如果两个变量都为数字的话,则优先按照数字进行比较大小。如果希望强制按字符串进行比较,请用半角单引号包含两个变量。比如:’XYZ’>’ABC’
5 关于节点嵌套规则
5.1 自定义宏是单位节点,无法嵌套任何节点。
5.2 字段配置节点可以嵌套“自定义宏”节点和“自定义函数”节点。
5.3 自定义函数节点可以嵌套“自定义宏”节点和“字段配置”节点。
5.4 流程控制语句节点可以嵌套以上所有节点。
5.5 以上所有类型的节点均不允许嵌套本类型的节点。
5.6 “字段配置”节点和“自定义函数”节点虽然可以相互嵌套,但仅限于嵌套一层,不允许反复嵌套。
6 处理顺序
以上所有规则的处理顺序为:自定义宏 à字段配置节点 à自定义函数 à流程控制语句。
非常感谢同事李前期工作和对我的指导和帮助