浏览 2750 次
锁定老帖子 主题:阿九文本(a9text v3.1)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-07-11
作者:: 史荣久 授权:: 共同创作 声明:: 无担保无保证:) 创建:: 2007-07-07 修改:: 2007-07-11 ================================================================================ 目录 1. 功能介绍 2. 基本约定 2.1. 字符(char) 2.1.1. 字符:空白(char_blank) 2.1.2. 字符:换行(char_line) 2.1.3. 字符:转义(char_escape) 2.2. 模式(mode) 2.2.1. 模式:修饰(mode_trig) 2.2.2. 模式:链入(mode_join) 2.2.3. 模式:链出(mode_link) 2.2.4. 模式:文本(mode_text) 2.3. 区域(area) 2.4. 段落(para/paragraph) 2.4.1. 段落:空行(para_blank) 2.4.2. 段落:横线(para_line) 2.5. 字典(dict) 2.6. 列表(list) 2.7. 章节(sect/section) 2.8. 根(root) 3. 区域扩展 3.1. 区域:文本 3.2. 区域:加密(area_secret) 3.3. 区域:表格 3.4. 区域:*HTML 4. 约定图谱 4.1. 约定包含图 4.2. 约定结构图 5. 文本处理 5.1. 段落 5.2. 空白 5.3. 缩进 -------------------------------------------------------------------------------- 1. 功能介绍 a9text是一组文本格式的约定. 用来提高文本文档的可读性和转换性. 2. 基本约定 为表达方便,这里为ABNF范式(RFC2234)扩展了个正则表达式(regexp)模式, 完全类似字符串(strings)模式,即,允许在双"/"间直接使用正则表达式. 例如: rule1 = /^a*$/ rule2 = /^/ *"a" /$/ 通用规则: head_blank = /^[\u0009\u0020\u3000]+/ ;行首空白(/^/ *char_blank) digit = /[0-9]+/ hexdig = /[0-9a-fA-F]+/ 2.1. 字符(char) char = /./ ; any char "字符",是指任意unicode字符集,除以下特殊用途外,所有字符无差别对待. 2.1.1. 字符:空白(char_blank) char_blank = %x09 / %x20 / %x3000 "字符:空白",是指"水平制表符(u0009)","半角空格(u0020)","全角空格(u3000)". a9text的空白处理是基于"半角空格(u0020)"的. 其中,"全角空格"等效于2个"半角空格","水平制表符"等效于4个"半角空格". 行首空白的等效"半角空格"数量称为以一个"缩进量(indent)" 2.1.2. 字符:换行(char_line) char_line = %x0A / %x0D / %x0D.0A "字符:换行",是指 "\r","\r\n","\n",也称"换行符". "物理行(physical_line)",是指文本显示上的行. "逻辑行(logical_line)",是指语法或语义上的行(也称为"段落"). "软换行(soft_line)",是指在"物理行(physical_line)"行尾,使用" "或"\" 把多个"物理行(physical_line)"合并成为一个"物理行(physical_line)", 并忽略相邻行间的"空白". a9text的处理是基于"逻辑行(logical_line)"的. 2.1.3. 字符:转义(char_escape) char_escape = "\" a9text在大多数情况下不需要也不考虑转义, 但为了描述a9text约定本身,有时需要使用转义. 2.2. 模式(mode) mode = 1*char "模式",是a9text语法上的分组,由至少一个字符组成,是组成a9text的原子单位. 2.2.1. 模式:修饰(mode_trig) mode_trig = "[" 1*mode_token "[" 1*char "]]" mode_token = "!" / "/" / "_" / "-" / "'" / "," / ("%" 1*digit) / ("#" 6hexdig) / ("&" 6hexdig) "模式:修饰",实现文本的修饰功能. "模式:修饰"内的"物理行(physical_line)",视为"软换行(soft_line)". "模式:修饰"内可以包含其他"模式",包括自身. 例如: 加粗 [![文字]] 倾斜 [/[文字]] 下划 [_[文字]] 删除 [-[文字]] 上标 ['[文字]] 下标 [,[文字]] 前色 [#FFFFF[文字]] 背色 [&FFFFF[文字]] 大小 [%50[文字]] 加粗倾斜红色50%的字 [!/#FF0000%50[文字]] 2.2.2. 模式:链入(mode_join) mode_join = "[[<=" 0*1"$" 1*char "]]" "模式:链入",可以在指定位置上导入其他文本或变量. "模式:链入"内的"物理行(physical_line)",视为"软换行(soft_line)". "模式:链入"内不可以包含其他"模式". 例如: [[<=include.txt]] 载入的文本. [[<=$自定义变量]] 显示自定义变量 2.2.3. 模式:链出(mode_link) mode_link = "[[" /[^(=>)]*/ "=>" 1*char "]]" "模式:链出",可以页面跳转和显示多媒体内容. "模式:链出"内的"物理行(physical_line)",视为"软换行(soft_line)". "模式:链出"内不可以包含其他"模式". 例如: [[显示名=>]] 作为锚点 [[=>链接地址]] 以链接地址显示 [[=>sample.png]] [[=>sample.swf]] [[=>www.trydofor.com]] [[=>admin@trydofor.com]] [[显示名=>链接地址]] 2.2.4. 模式:文本(mode_text) 一组不满足以上"模式" 特征的连续字符,都视为"文本(mode_text)". "模式:文本"内不可以包含其他"模式". 2.3. 区域(area) area = area_head area_body area_foot area_head = head_blank 9*"=" area_type ":" area_info 9*"=" char_line area_type = /\*?[^=:\r\n]+/ area_info = /[^\r\n]+/ area_body = 1*char area_foot = head_blank 9*"=" char_line "区域",是一块特殊的文字,需要特别处理. 例如: "========= *html:info =========" '*'开头表示功能性模块 "========= text:info =========" "========= java:info =========" "========= html:info =========" "========= des:info =========" 其中"area_type"如果以"*"开头,这表示是功能区域(不显示),否则为文本区域. 区域不可以自包含. 区域内的文字如何解析需要进一步定义和扩展. 2.4. 段落(para/paragraph) para = head_blank *(mode_text / mode_trig / mode_join / mode_link / char_line) "段落",是指一个"逻辑行(logical_line)",是最小的处理单元. 由行首"空白(char_blank)",各种"模式(mode)"构成和"换行(char_line)"组成. "段落"内不可以内嵌其他"段落". 2.4.1. 段落:空行(para_blank) para_blank = head_blank char_line "段落:空行",是一种特殊的"段落(para)",自成一段,结束上段,开启下段, 但不属于上下任何一段. 2.4.2. 段落:横线(para_line) para_line = head_blank 1*(9*"-" / 9*"=" / 9*"#" ) char_line "段落:横线",完全类似于"空行(para_blank)",不同的是,他会画一条水平线. "-","=","#" 代表着线的宽度,分别为,1,2,4个宽度 2.5. 字典(dict) dict = head_blank dict_key *char_blank "::" para dict_key = /[^(::)\r\n]+/ "字典",由行首"空白(char_blank)","::"和"段落(para)"组成. 用来定义用户变量和说明,可以在"模式:链入(mode_join)"中引用. "字典"内只能有一个"段落(para)",不可以包含"字典". "字典键(dict_key)",是不含首尾"空白"的连续字符串. "键"必须和"::"在同一"物理行(physical_line)", "值"可以不在同一"物理行(physical_line)". "字典"的转义,只需使用"\::"来代替"::"即可. 2.6. 列表(list) list = head_blank (list_item / list_step) *char_blank ")" (para / lsit) list_item = "*" list_step = /[0-9a-zA-Z]/ *("-" /[0-9a-zA-Z]/) "列表",由行首"空白",列表类型,")"和"段落(para)"组成. "列表"内只能有一个"段落(para)",可以包含其他"列表". 一组连续的列表,"缩进量(indent)"相同的列表视为同一组. "缩进量(indent)"的多少,体现列表间的包含关系(少的包含多的). "列表" 细分为 "列表:条目(list_item)" 和 "列表:步骤(list_step)" "列表:条目(list_item)" 是无序列表. "列表:步骤(list_step)" 是有序列表,可以使用"a-1","a-2"这样的组合. 2.7. 章节(sect/section) sect = /^/ sect_level sect_title char_line sect_text sect_level = 1*(digit ".") sect_title = /[^\r\n]+/ sect_text = 1*(area / list / dict / para) "章节",内可包含之前所以"约定","章节"内不可包含"章节". "章节"不可以有前置"空白". 2.8. 根(root) root = 1*(area / list / dict / para / sect) "根",是a9text的最高约定,领起其他约定,是一个a9text的开始. 一个a9text中"根(root)"只能有一个,可以包含任何其他"约定". 3. 区域扩展 "区域(area)" 的内容是需要进一步定义的.a9text预定义了如下简单"区域(area)". 3.1. 区域:文本 "区域:文本"内的文本,不做任何解析,保留原样显示. 格式如下: "========= text:info =========" 3.2. 区域:加密(area_secret) "区域:加密"内的文本是加密的密文(des算法). 格式如下: "========= secret:des,info =========" 3.3. 区域:表格 "区域:表格",实现最粗糙的表格. 格式如下: "========= table:表格名 =========" ! r1-c1 | r1-c2! r1-c3| +-------------------------------- |r2-c1 |r2-c2 |r2-c3 | +-------------------------------- || r3-c1&2 |+ r3&4-c3 | +-------------------------------- |r4-c1 | r4-c2 |+ r4&4-c3 | "================================" '!'表示加粗,'|'表一般显示,r1-c1,r1-c3加粗显示 空格表对齐:r1-c1中对齐,r1-c2右对齐,r1-c3左对齐,默认左对齐. 连续'|'为列合并,左起 '|+'为行合并,上起 3.4. 区域:*HTML "区域:*HTML",内的文本,做为html代码使用. 格式如下: "========= *html: info =========" 4. 约定图谱 4.1. 约定包含图 root | +--------------------------------------------- sect | | +---------------------------------- dict +-- area | | | +------------------------ list +-- para +-- list | | | +------------ para +-- list +-- dict | | | | +-- area +-- mode +-- para +-- para | | | | +-- char +-- mode_trig | | | +-- mode_join | | | +-- mode_link | | | +-- mode_text 在a9text的约定中,除了"区域(area)"和"模式(mode)"直接与"字符(char)"包含外, 其他约定都是以"段落(para)"为最小处理单元. 4.2. 约定结构图 a9text = root root = 1*(sect / dict / list / para / area) sect = 1*(dict / list / para / area) dict = para list = 1*(list / para) 一个a9text有且只有一个"根(root)"构成. "根(root)"中至少包含(无序)(sect/dict/list/para/area)中的一个. "章节(sect)"中至少包含(无序)(dict/list/para/area)中的一个. "字典(dict)"中必须包含一个para. "列表(list)"中至少包含(无序)(list/para)中的一个. "段落(para)"中至少包含一个"模式(mode)". "模式(mode)"中至少包含一个字符. "区域(area)"中至少包含一个字符. 5. 文本处理 5.1. 段落 "段落(para)"在语法上讲,就是一个"逻辑行(logical_line)".而a9text是基于 "逻辑行(logical_line)"的,因此"段落(para)"是a9text的最小处理单元. 除了"区域(area)"是自定义解析规则外,段落划分遵循这样的原则,即: 1) 一个"物理行"就是视为一个"逻辑行",也就是"段落(para)". 2) "软换行"可以把多个"物理行"连接成一个"物理行". 3) 除"模式:文本"外的"模式"内部的"物理行",自动视为"软换行". 5.2. 空白 为了统一和方便,a9text中的"空白"都会转换成"半角空格"处理, "全角空格"等效于2个"半角空格","水平制表符"等效于4个"半角空格". "软换行",会自动去掉相邻"物理行"间的"空白". 5.3. 缩进 "物理行"行首"空白"的等效"半角空格"数,称作"缩进量",用来表示层次或缩进. "区域"的缩进,表示位置. "段落"的缩进,表示段落的位置. "列表"的缩进,即表示位置,也表示层次. "字典"的缩进,表示位置. "章节"和"跟",没有缩进. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-07-11
经过反复琢磨,敲定了3.1版,可以进一步编码了.
论坛页面对空格的处理不是很理想,因此版式出现了变形.对a9text和a9engine关注的同学,请到http://a9engine.sf.net 同步cvs最新版. 希望大家多提宝贵建议和意见和分享经验. |
|
返回顶楼 | |