Mscgen文档翻译:Mscgen
Mscgen 是一个小小的程序,它解析消息流图(Message Sequence Chart)说明代码,然后生成对应的PNG、SVG、EPS或服务器端图片映射(ismaps)。消息流图(Message Sequence Charts (MSCs)),是一种,表示实体及实体间在某段时间内的交互情况的手段,经常与SDL配套使用。MSCs在通信行业狠流行,被用来说明协议是如何工作的,但是,MSCs本身并不复杂,狠容易创建及使用。Mscgen致力于提供一种简单的文本语言,易于创建、编辑、理解,并且能够被转换成通用的图片格式,以便显示或打印。
这个程序,和它所解析的语言, 是受 Graphviz Dot 的启发而设计的,后者提供 了一种非常好的手段来表达状态迁移图(State Transition Diagrams)、数据结构和有向图。 与 Graphviz 不同的是, 这个程序 不会进行智能的布局,也不会进行线条绑束(spline routing),因为对于MSCs 来说不需要这些东西,于是 呢,实现起来就简单得多了。 Doxygen ( 自版本 1.5.2之后) 也允许像加入dot 图那样向文档中直接嵌入MSCs , 这样,就可以狠容易地利用消息 流图(message sequence charts)来提升Doxygen 生成的文档的可读性了。
以下是一些示例,展示了原始输入代码和生成的对应的图片,图片格式都是PNG。
# MSC,表示某种想像中的进程 msc { hscale = "2"; a,b,c; a->b [ label = "ab()" ] ; b->c [ label = "bc(TRUE)"]; c=>c [ label = "process(1)" ]; c=>c [ label = "process(2)" ]; ...; c=>c [ label = "process(n)" ]; c=>c [ label = "process(END)" ]; a<<=c [ label = "callback()"]; --- [ label = "If more to run", ID="*" ]; a->a [ label = "next()"]; a->c [ label = "ac1()\nac2()"]; b<-c [ label = "cb(TRUE)"]; b->b [ label = "stalled(...)"]; a<-b [ label = "ab() = FALSE"]; } |
# 想像中的客户端/服务器协议 msc { arcgradient = 8; a [label="Client"],b [label="Server"]; a=>b [label="data1"]; a-xb [label="data2"]; a=>b [label="data3"]; a<=b [label="ack1, nack2"]; a=>b [label="data2", arcskip="1"]; |||; a<=b [label="ack3"]; |||; } |
一个消息流图(message sequence chart)的一般格式,由以下带注释的示例来说明。注意,空白字符和换行符会被输入解析器忽略掉。
输入代码片断 |
意义 |
# MSC,表示某种想像中的进程 |
注释。以 # 或 //开头的代码行会被忽略,类似于以 /* 和 */ 表示的C语言风格的注释 |
msc { |
表达MSC的开始 |
width = "800"; |
输出的控制选项,具体对于这一行代码,会将输出图片的宽度设置为800像素。注意,可以使用 hscale 选项来 指定宽度的缩放因子,而不用设置一个绝对值。 |
a, b, "c"; |
列出要在该消息流图(message sequence chart)中使用的实体,它们会按照代码中出现的先后顺序在水平方向上从左向右出现在输出图片里。注意,每个实体的名字都可以用引号包围,也可不用,除非,名字中包含着空白字符,那种情况下必须使用引号。 |
a->b |
表示,从a 向b 传递一条消息。两个命名实体,也即这个例子中的 a 和 b ,必须已经在消息流图(message sequence chart)的开头声明过。再次说明,如果实体名字中包含空白字符,则,应当使用双引号。 |
a<-c [label="return"]; |
表示,从c向a传递一条消息。在这句代码中,通过方括号设置了一些属性。 label属性,指定的是,在消息弧上方显示的文字。 |
} |
表示消息流图(Message Sequence Chart)结束。 |
语法狠简单。要注意的是,开头的几行用来指定消息流图(message sequence chart)中的各个选项和实体,后续的代码,都是表示消息弧。下面的表格中,列出了所有可能的消息弧类型,包括那些所谓的“特殊”弧,它们显示的不是实体之间的关系,而是,在图表上以水平方式描述某个整体的东西。
图形 |
源代码表示 |
意义 |
|
-> 或 <- |
消息 |
|
=> 或 <= |
方法或函数调用 |
|
>> 或 << |
方法或函数的返回值 |
|
=>> 或 <<= |
回调 |
|
:> 或 <: |
强调消息 |
|
-x 或 x- |
丢失的消息 |
|
... |
表示,该msc 中的某些信号被省略,或者,已经过去了狠长一段时间。 |
|
--- |
用来向一砣信号加上注释,或者,表示发生了某个动作或进入了某个状态。 |
|
||| |
在不同的行之间加入额外的空间。 |
|
->* 或 *<- |
广播弧,该弧会延伸到除源实体之外的所有实体。弧的说明文字会以整个图表为参考进行水平居中。 |
|
box |
框状弧,原来的弧会被替换成选中的实体之间的一个框框。弧的说明文字会在框中居中显示,并且会发生必要的自动换行。 |
|
rbox |
圆角框状弧,原来的弧会被替换成选中的实体之间的一个框框。弧的说明文字会在框中居中显示,并且会发生必要的自动换行。 |
|
abox |
六角框状弧,原来的弧会被替换成选中的实体之间的一个框框。弧的说明文字会在框中居中显示,并且会发生必要的自动换行。 |
|
note |
注释框状弧,原来的弧会被替换成选中的实体之间的一个框框。弧的说明文字会在框中居中显示,并且会发生必要的自动换行。 |
利用框框类型,可以添加状态及条件框。在源代码中,写法仍然是,不同实体之间的一个关系,但是,在输出的图片中,框框会被拉伸以涵盖源实体和目的实体。
# 带框框的示例MSC msc { # 实体 A, B, C, D; # 在框框之前加入一砣小的空白 |||; # 下面 4个框位于同一行,因为行尾是 ',' A box A [label="box"], B rbox B [label="rbox"], C abox C [label="abox"], D note D [label="note"]; # 带背景色的框框示例 A abox B [label="abox", textbgcolour="#ff7f7f"]; B rbox C [label="rbox", textbgcolour="#7fff7f"]; C note D [label="note", textbgcolour="#7f7fff"]; } |
除了这些弧类型之外,还可以向每条消息弧或实体添加若干属性。这些属性是以方括号包围,紧跟在实体名或消息弧之后的,不同属性之间以逗号分隔:
a->b [label="A to B", textcolour="red", linecolour="#ffb011"];
下表列出了所有可能的属性及它们的意义,注意,每个属性,都可以用于特殊的'...'和'---'弧类型,当然也可以用于其它弧或用于实体。
源代码属性 |
意义 |
label |
放置于消息弧上方的文字标签,或者用于实体的文字标签。它会被原样显示在消息弧上方或实体名字所在的位置。如果被用作消息弧的文字标签,那么,其内容中还可以包含参数和引用文字。如果出现了 \n ,那么,它会被解释成换行,于是,使得,弧的上方和下方都会有文字,或者,拉伸实体的图形以容纳更多行。 |
URL |
在生成图片的时候,将文字内容染成蓝色。如果生成的是一张图片映射,则,为该文字标签创建一个指向特定 URL 的条目。如果该消息流图(message sequence chart)是要嵌入到Doxygen文档中去的,那么,URL可指定为 \ref xxx ,其中, xxx 是某个已有文档的元素的名字;在这种情况下,会自动创建一个指向该元素的链接。 |
ID |
为该文本标签加上一个上标标识符。一般来说,应当是一个数字,这样,能够标识出特定的元素,以在周围的说明文字中引用。 |
IDURL |
类似于URL属性,但链接是从ID文字发出的,而不是消息文本标签。它的语言与URL属性相同,但是,仅仅当该弧中有一个ID 的情况下才有用。 |
arcskip |
这个选项,会使得,该弧与目标实体序列线相交的竖直位置向下偏移。 |
linecolour, linecolor |
将弧或实体的线条颜色设置成指定颜色。 |
textcolour, textcolor |
将弧或实体的文字颜色设置成指定颜色。 |
textbgcolour, textbgcolor |
将弧或实体的文字背景颜色设置成指定颜色。设置'box'、'abox'、'rbox'和'note'形状的填充颜色。 |
arclinecolour, arclinecolor |
只对实体有意义,设置所有由该实体发出的弧的默认线条颜色。按照设计,对于具体的弧,可使用linecolour 属性来覆盖掉。 |
arctextcolour, arctextcolor |
只对实体有意义,设置所有由该实体发出的弧的默认文字颜色。按照设计,对于具体的弧,可使用 textcolour 属性来覆盖掉。 |
arctextbgcolour, arctextbgcolor |
只对实体有意义,设置所有由该实体发出的弧的默认文字背景颜色。按照设计,对于具体的弧,可使用 textbgcolour 属性来覆盖掉。 |
颜色,可像一样HTML 以#前缀加上RGB 颜色代码来表示,或者,也可使用下面示例中列出的预定义颜色名来表示。
Name |
Code |
Block |
white |
#ffffff |
|
silver |
#c0c0c0 |
|
gray |
#808080 |
|
black |
#000000 |
|
maroon |
#800000 |
|
red |
#ff0000 |
|
orange |
#ffb000 |
|
yellow |
#ffff00 |
|
olive |
#808000 |
|
green/lime |
#00ff00 |
|
aqua |
#00ffff |
|
teal |
#008080 |
|
blue |
#0000ff |
|
navy |
#000080 |
|
indigo |
#440088 |
|
purple |
#800080 |
|
violet |
#d02090 |
|
fuchsia |
#ff00ff |
最后,可向输入文件中加入一些选项,以控制所生成的图片的各个方面的东西。目前,只支持少数几个选项,并且,这些选项必须在输入文件的顶部指定,就像下面的示例中这样。表格中列出了所有可用的选项。
msc {
# 选项区域
hscale="1.5", arcgradient="5";
# 实 体
A, B;
# 弧
A -> B;
}
选项 |
意义 |
hscale |
按照这个因子对图片的宽度进行缩放,这个值必须是一个非零值。一般情况下,对于PNG,输出图片的宽度是600像素,但是,利用缩放因子,可缩放到任意宽度值。例如,将这个值指定为1.5,则,宽度会是600 x 1.5 = 900像素。 |
width |
将图片的宽度设置为这个值,必须是一个非零值,单位是像素。这个选项可以代替hscale选项,适合于妳想优先使用显式的图片宽度而不是缩放因子的情况。 |
arcgradient |
这个参数,将导致,弧不再是水平的,而是有一个向下的坡度。这个值的具体意义是,弧与目的实体的序列线相交的那个点,相对于弧的起点,向下偏移的像素个数。 |
wordwraparcs |
如果设置为'true'、'on'或'1',则,会导致,弧上所附带的狠长的文字被自动换行。默认情况下,只会针对'box'、'abox'、'rbox'和'note'类型的弧启用自动换行。 |
mscgen 语言 的语法 在 这里 。
当前版本 是 0.20 ( 变更记录 ) 。最新版本 可在以下链接下载:
文件 |
MD5 |
说明 |
Linux动态链接的二进制程序(46KB) |
||
Linux静态链接的二进制程序(437KB) |
||
源代码(201KB) |
开发 源代码可在 谷歌代码 获取, 也可在线 浏览 ,或使用匿名 SVN 获取。
最初 ,我对 Doxygen 做了些修改, 这样,它就可以调用其它 的命令行工具了。作为响应 , Doxygen版本1.5.2 ( 于 4-4-2007 发布 ) 由Dimitri 做了一些改进,开始支持 \msc 和 \endmsc 命令 。 这就意味着, 可利用以下代码来向Doxygen 文档中加入MSCs:
/** Request a fandango on core.
* Sending this signal to the Iberian dance task will cause it to create a
* wild pointer which is then used to corrupt the malloc arena leading to
* mysterious failures later on in the program execution.
*
*\msc
* T,"Iberian Dance Task";
*
* T->"Iberian Dance Task" [label="IbFandangoReq", URL="\ref IbFandangoReq"];
* T<<"Iberian Dance Task" [label="IbFandangoCnf", URL="\ref IbFandangoCnf", ID="1"];
*\endmsc
*
* <OL>
* <LI>In some cases, the system may have failed before this signal is sent
* or received, in which case the confirm maybe lost.
* </OL>
*/
typedef struct IbFandangoReqTag
{
TaskId reqTaskId;
}
IbFandangoReq;
Your opinionsHxLauncher: Launch Android applications by voice commands