FWMacro 方文宏

FWMacro 是企顺公司开发的一个独立的工具,用来实现文件包含与字符串替换功能。
在FWScripts中使用了FWMacro(方文宏),FWMacro与C语言的宏定义类似,可以定义一个宏,然后在代码中进行替换。(C#中的宏仅仅用于编译条件的开关),FWScript的宏语句比较简单,所有的宏定义以行为单位进行处理,以字符#开头。

 Note: FWMacro是一个独立的工具,可以被灵活应用,FWScript通过调用该工具实现了宏的功能。
  • 注释
  • 宏标识符的替换
  • 包含
  • 条件处理
  • 辅助特性
  • 宏开关

注释

参见 FWScript 基础语法

宏标识符的替换

通过定义一个宏标识符,可以在程序的任何非字符串常量的地方进行替换。

Type代码描述
不带参数的宏标识符#define BizSmooth Let’s……后面代码中有#BizSmooth的的地方替换成Let’s……
带参数的宏标识符#define client(company, country, employee) #company is an important client of ours, it came from #country, and #company has #employee employee all over the world”;后面代码中有#client(DELL, America, 200000)的的地方替换成DELL is an important client of ours, it came from America, and DELL has 200000 employee all over the world

注意,宏定义名称忽略大小写


目前宏标识符的替换可以嵌套使用。如:

#d  capital   the capital is #city
#d  city		 Beijing
后面若出现了“#capital”,将会替换成 “the capital is Beijing”

包含

有时一个定义的文件需要在很多地方去用,从而达到一致性。如:

#include  c:\bizat\txt\common.h		指定本文件包含“common.h”中的定义
在FWMacro处理到包含语句时,将读取这个文件,然后将记录这个文件中的所有宏定义。

注意,FWMacro目前对被包含的文件只是处理宏定义,也就是说只是处理以“#”开头的行,其它所有的行都被忽略。

(依据此特性,可以在公共宏定义文件随意写注释)

条件处理

FWMacro中宏条件处理加强了C#的做法,使用如下语句:

宏语句描述
#if identifier[=value]如果定义了identifier的值为value则为真true,表示要执行后面的, 如果没有=value,则只要定义过identifier就为真true,没有定义过则为假false
#else如果与该else对应的if条件为false而且判断该条件的语句也执行了,则执行该else后面的
#elif identifier[=value]如果前面的if条件为false而且判断该条件的语句也执行了,则执行这个判断, 如果这个判断为true则执行后面的,否则执行对应的else的后面的。
#endif对应的#if 宏语句块结束

注意: 宏条件语句#if 不允许嵌套使用!

多语言支持举例1: 执行的时候进行选择


## 注意在bizrunner的调用中,可以在命令行使用 -d "lang en" 或者 -d "lang cn" 
## 下面的宏实现 “如果没有定义lang,则缺省为英文 en”
#if lang 
#else
#d lang en
#endif

#if lang=en

// 设置英文的宏
#d setting "settings"
#d system = "system"

#elif  lang=cn

//  设置中文的宏
#d setting "设置"
#d system  "系统"

#else
show  The language version of #lang has not been implemeted
exit

#endif

/Window[@name = #setting  and @classname = 'ApplicationFrameWindow' ]/?/List[@automationid = 'PageGroupsListView'  and @classname = 'GridView' ]/?/Text[@name = #system  and @classname = 'TextBlock' ]


多语言支持举例2:安装的时候选择

## 在执行代码文件中,使用如下代码

#include keywords.h

:/Window[@name = #setting  and @classname = 'ApplicationFrameWindow' ]/?/List[@automationid = 'PageGroupsListView'  and @classname = 'GridView' ]/?/Text[@name = #system  and @classname = 'TextBlock' ]


## 而针对不同的语言环境,安装程序放置不同的keywords.h文件

## 针对中文环境,keywords.h文件的内容为

#d setting "设置"
#d system  "系统"


## 针对英文的环境,keywords.h文件的内容为

#d setting "settings"
#d system = "system"

使用上述办法,只需一个统一的方文脚本文件,针对不同的语言环境,使用不同的宏定义文件就可以了。

注意如果使用 #if indentifier=value,则判断是否identifier的定义与值相同,比较时忽略大小写。
【注意,等号 = 前后不能有空格】

辅助特性

批量定义:有时一批宏标识符其定义的值不重要,只要不重复就行,FWMacro为此制定了批量定义的机制
“#(i,j” 表示后面的宏定义若没有指定替代的内容,则按从i开始,每次加j的方式自动进行定义,直到遇到 “#)”。

举例:

#(3,2
#d  TheFirst
#d  TheSecond
#d  TheThird
#)
效果:#TheFirst 将替换成 3; #TheSecond 将替换成 5;#TheThird将替换成7

宏开关

鉴于有很多语言需要支持以#开头的行,如Powershell, Python等语言,而在方文脚本里面,可以嵌入这些代码,这些代码必须按原样被方文脚本启动的Powershell或Python解析。
FWMacro为此特别设计了“宏开关”, 宏开关语句为:“#&”,第一次遇到该语句行时,将关闭FWMacro的处理,第二次遇到这一行时,再重新打开。
也就是说,方文宏针对在两个“#&”之间的所有行,将按原样输出。

注意:不能使用宏注释将 “#&”之间的代码注释掉,因为FWMacro遇到“#&”会直接跳过。
如:
	#/*
	...
	#&
		sentences of scripts in other language
	#&
	...
	#*/
上述代码中,中间的代码将不会注释掉,这样会导致出错

如果要注释掉这些代码,建议使用程序注释,如下所示:
	/*
	...
	#&
		sentences of scripts in other language
	#&
	...
	*/
这样,在/*与*/之间的代码都会注释掉。

<< FWScript 调用外部进程FWScript 结构组织 >>