Chapter 15. Seam Text

面向协作的网站需要一个友好的标记语言来简化对论坛帖子、Wiki页面、博客(Blog)、评论等等格式化文本的处理。 Seam提供了 <s:formattedText/> 控件来显示符合 Seam Text 语言的格式化文本。 Seam Text是用一个基于ANTLR的语法分析器来实现的。但你不需要知道ANTLR就能方便地使用它了。

15.1. 基本格式化

下面是个简单的例子:

It's easy to make *bold text*, /italic text/, |monospace|,
~deleted text~, super^scripts^ or _underlines_.

如果我们用 <s:formattedText/> 来显示它,会产生下面的HTML:

<p>
It's easy to make <b>bold text</b>, <i>italic text</i>, <tt>monospace</tt>
<del>deleted text</del>, super<sup>scripts</sup> or <u>underlines</u>.
</p>

可以用一个空行来表示新的段落,用 + 来表示一个标题:

+This is a big heading
You /must/ have some text following a heading!

++This is a smaller heading
This is the first paragraph. We can split it across multiple
lines, but we must end it with a blank line.

This is the second paragraph.

(请注意简单的换行是被忽略的,你需要一个额外的空行把文本换行到一个新的段落中。)下面就是HTML的结果:

<h1>This is a big heading</h1>
<p>
You <i>must</i> have some text following a heading!
</p>

<h2>This is a smaller heading</h2>
<p>
This is the first paragraph. We can split it across multiple
lines, but we must end it with a blank line.
</p>

<p>
This is the second paragraph.
</p>

# 字符来建立有序的列表。至于无序的列表就用 = 字符:

An ordered list:

#first item
#second item
#and even the /third/ item

An unordered list:

=an item
=another item
<p>
An ordered list:
</p>

<ol>
<li>first item</li>
<li>second item</li>
<li>and even the <i>third</i> item</li>
</ol>

<p>
An unordered list:
</p>

<ul>
<li>an item</li>
<li>another item</li>
</ul>

引用的部分应该用双引号括起来:

The other guy said:

"Nyeah nyeah-nee
/nyeah/ nyeah!"

But what do you think he means by "nyeah-nee"?
<p>
The other guy said:
</p>

<q>Nyeah nyeah-nee
<i>nyeah</i> nyeah!</q>

<p>
But what do you think he means by <q>nyeah-nee</q>?
</p>

15.2. 输入代码和有特殊字符的文本

*|# 这样的特殊字符, 和诸如 <>& 之类的HTML字符可以用来 \ 来转义:

You can write down equations like 2\*3\=6 and HTML tags
like \<body\> using the escape character: \\.
<p>
You can write down equations like 2*3=6 and HTML tags
like &lt;body&gt; using the escape character: \.
</p>

代码段可以用倒单引号(`)括起来:

My code doesn't work:

`for (int i=0; i<100; i--)
{
    doSomething();
}`

Any ideas?
<p>
My code doesn't work:
</p>

<pre>for (int i=0; i&lt;100; i--)
{
    doSomething();
}</pre>

<p>
Any ideas?
</p>

请注意行间的空格会转码(大部分的空格都会被格式化成文本形式,实际上有很多的特定字符都是代码或者标签)。因此你可以写成:

This is a |<tag attribute="value"/>| example.

在这里面的空格没有转换成任何的字符。下面你不能通过任何方式来格式化行间的空格文本(斜体字,下划线等等)。

15.3. 链接

可以用下面的语法来建立一个链接:

Go to the Seam website at [=>http://jboss.com/products/seam].

如果你想指定链接的文本,也可以这样:

Go to [the Seam website=>http://jboss.com/products/seam].

对于高级用户,甚至可以自定义Seam Text解析器,让它诠释这个语法书写的Wiki词汇。

15.4. 输入HTML

文本可能会包含一个HTML的有限子集(不用担心,这个子集可以抵御跨站脚本攻击)。这在建立链接时很有用:

You might want to link to <a href="http://jboss.com/products/seam">something
cool</a>, or even include an image: <img src="/logo.jpg"/>

建立表格时也一样:

<table>
    <tr><td>First name:</td><td>Gavin</td></tr>
    <tr><td>Last name:</td><td>King</td></tr>
</table>

如果你想的话你还能做得更多!