Skip to content

NGA-webapp/nga-ubb

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

84 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ubb for nga-webapp

nga的ubb设计较为杂乱,其本身的代码不便于移植,与一般的ubb规则也有所不同,所以需要重新设计一套可维护的nga-ubb解析器。以主要用于nga-webapp项目。

Build Status Built with Grunt Codeship

Dependencies

业务环境

除了环境中默认包含的seajs以外,不依赖任何第三方类库。

开发环境

测试依赖于mocha + chai (bdd) + sinon
以及自动化工具依赖于Grunt

Usage

在业务中可以直接使用require('./index')调用,该文件会返回一个已经设置好的ubb对象。

Example:

var ubb = require('utils/ubb/index');
var content = '[h]foobar[/h]......';
...
content = ubb.toHtml(content);
...

Test

镜像测试或者使用

npm test

具体参考可/test

API

Ubb

Ubb对象位于/libs/Ubb.js,使用require('./libs/Ubb').Ubb调用, 并对外部提供三个方法,分别是add,addExtra,toHtml。

添加普通标签

以下几种形式的标签为标准的ubb标签,可以用add方法进行添加。

  • [tagName attr=val attr2=val2]content[/tagName]
  • [tagName attr=val]content[/tagName]
  • [tagName val val2]content[/tagName]
  • [tagName val]content[/tagName]
  • [tagName=val]content[/tagName]
  • [tagName]content[/tagName]
  • [tagName attr=val attr2=val2]
  • [tagName attr=val]
  • [tagName val val2]
  • [tagName val]
  • [tagName=val]
  • [tagName]

add方法接受一个tag配置对象,包含以下参数

tagName: 标签名  
isPair: 标签是否成对出现  
parser: 解析该标签的方法,成对标签将传入参数(content, attrs, settings),而非成对标签则传入参数(attrs, settings)  
priority: 标签处理优先级,值越大越先处理,可以不填,默认为`1`  

其中parser传入的attrs参数为以下形式

{
  nop: false, // 没有任何属性值
  value: '',  // 当标签格式为[tagName=val]时代表val,否则该值为undefined
  arr: [], // 当标签有属性值且格式不为[tagName=val]时,属性将按顺序存入该数组
  dict: {} // 当标签有属性值且格式不为[tagName=val]时,有属性名的属性将以键值的形式存入该对象
}

Example:

var ubb = new Ubb();
ubb.add({
  tagName: 'test',
  isPair: true,
  parser: function (content, attrs) {
    var data = '';
    if (!attrs.nop && ('foo' in attrs.dict)) {
      data = ' data-foo="' + attrs.dict.foo + '"';
    }
    return '<div class="test"' + data + '>' + content + '</div>';
  },
  priority: 2,
});

在parser中,另外一个参数settings,由最顶级的接口Ubb.protoype.toHtml传入,一般情景下可忽略。 其主要可用于显示/隐藏图片等情景。 关于该参数,更详细的说明将在后续补上。

添加特殊标签

非标准格式的标签,可以用addExtra方法进行添加。如以下例子:

  • ===head===
  • [s:4]
  • [@yelo]
  • <br />

是的,<br/>也需要使用该方法进行解析。由于在内部执行解析之前,会对内容进行一次编码,过滤危险的字符串,如<br />会被转换为&gt;br /&lt;,因此需要对原内容中的<br />另行处理。

addExtra方法也接受一个tag配置对象,但与add方法,其包含以下参数

regExp: 匹配解析的正则表达式  
replacement: 替换内容  
priority: 标签处理优先级,此处与add方法的priority相同,值越大越先处理,可以不填,默认为1  

addExtra传入的regExp和replacement可以按String.prototype.replace的参数理解。但与String.prototype.replace不同的是addExtra会对内容进行递归处理,从而解析嵌套形式出现的标签。

Example:

var ubb = new Ubb();
ubb.add({
  regExp: new RegExp(/-=test:(.*?)=-/gi),
  replacement: '<div class="test">$1</div>',
  priority: 2,
});

输出解析后的文本

在添加一系列的标签以后,可以通过toHtml方法输出解析后的文本。

Example:

var ubb = new Ubb();
var result;
... some add or addExtra function
result = ubb.toHtml('[test]sth here.[/test]');

toHtml会按设置的优先级进行排序,并将排序后的标签进行缓存,然后依次进行解析。在下一次调用toHtml时,则直接从缓存中取出按优先级排序的标签,减少排序造成的消耗。
若在toHtml执行之后再次执行add或者addExtra操作,则会在下一次解析的时候重新排序。

标签补全计划

nga标签类型繁多,但实际使用覆盖率低,因此优先处理常用部分。

  • 所有标签
    • [b] 粗体文字
      • 基本解析
    • [u] 下划线文字
      • 基本解析
    • [i] 斜体文字
      • 基本解析
    • [align] 左/中/右对齐
      • 基本解析
    • [color] 文字颜色
      • 基本解析
      • 重写样式表
    • [size] 文字大小
      • 基本解析
      • 重写样式表
      • 限制最大值
    • [font] 文字字体
      • 基本解析
      • 重写样式表
    • [del] 删除线
      • 基本解析
      • 重写样式表
    • [h] 段落标题
      • 基本解析
    • ===h=== 段落标题
      • 基本解析
    • [l/r] 左/右浮动
      • 基本解析
    • [list] 列表条目
      • 基本解析
      • 重写样式表
    • [img] 插入图片
      • 基本解析
      • 重写样式表
      • 处理异常
    • [s:] 插入官方表情
      • 基本解析
      • 重写文件地址,使用缓存处理
    • [img] 插入额外表情图片
      • 基本解析
      • 重写文件地址,使用缓存处理
    • [quote] 引用文字
      • 基本解析
      • 重写样式表
    • [code] 程序代码
      • 基本解析
      • 重写样式表
    • [url] 插入链接
      • 基本解析
      • 重写样式表
    • [url] 插入链接
    • [tid/pid] 主题/回复
    • [crypt] 插入加密的内容
    • [dice] 投骰子
    • [collapse] 插入折叠的内容
    • [@用户名] 发送提醒
    • [flash] 插入flash(视频)
    • [table] 插入表格
    • [randomblock] 插入随机段落
    • [t.178.com] 引用178尾巴
    • [album] 插入相册
    • [customachieve] 自定义成就
    • [[]] 游戏数据库
    • [armory] 魔兽世界人物信息
    • [url] Diablo3人物信息

Bitdeli Badge

Releases

No releases published

Packages

No packages published

Languages