import {Fatal} from '../lang/Fatal';
import {ObjectBase} from '../lang/ObjectBase';
import {Objects} from '../lang/Objects';
import {ResultEnum} from '../lang/ResultEnum';
import {StringBuffer} from '../lang/StringBuffer';
import {StringUtil} from '../lang/StringUtil';
import {ClassUtil} from '../reflect/ClassUtil';
//==========================================================
// 标签类。
//
// @class
// @author maocy
// @version 150114
//==========================================================
export class Tag extends ObjectBase {
//..........................................................
// @attribute
protected _name: string;
protected _children: Objects;
protected _trimLeft: boolean;
protected _trimRight: boolean;
//==========================================================
// 构建处理。
//==========================================================
public constructor() {
super();
this._name = 'Tag';
}
//==========================================================
// 开始处理。
//
// @param context 环境
// @return 处理结果
//==========================================================
public onBegin(context) {
return ResultEnum.Continue;
}
//==========================================================
// 结束处理。
//
// @param context 环境
// @return 处理结果
//==========================================================
public onEnd(context) {
return ResultEnum.Continue;
}
//==========================================================
// 获得名称。
//
// @return 名称
//==========================================================
public name() {
return this._name;
}
//==========================================================
// 设置属性值。
//
// @param name 名称
// @param value 内容
//==========================================================
public set(name, value) {
throw new Fatal(this, 'Unknown attribute name. (name={1}, value={2})', name, value);
}
//==========================================================
// 增加一个子标签。
//
// @method
// @param tag 子标签
//==========================================================
public push(tag) {
var children = this._children;
if (!children) {
children = this._children = new Objects();
}
children.push(tag);
}
//==========================================================
// 解析处理。
//
// @param context 环境
//==========================================================
public parse(context) {
// 开始处理
var resultCd = this.onBegin(context);
if (resultCd == ResultEnum.Continue) {
// 子标签处理
var children = this._children;
if (children) {
var count = children.count();
for (var i = 0; i < count; i++) {
var child = children.get(i);
resultCd = child.parse(context);
if (resultCd == ResultEnum.Cancel) {
return resultCd;
}
context._trimLeft = child._trimLeft;
context._trimRight = child._trimRight;
}
}
return this.onEnd(context);
}
return resultCd;
}
//==========================================================
//获得字符串。
//
// @return 字符串
//==========================================================
public toString(): string {
return null;
}
//==========================================================
//获取运行时信息。
//
// @method
// @param ps:source:TString 信息
// @param pt:tag:FTag 标签
// @param pl:level:Integer 级别
//==========================================================
public innerDump(ps, pt, pl) {
ps.appendRepeat(' ', pl);
ps.append(ClassUtil.dump(pt));
// 追加属性
var s = pt.toString();
if (!StringUtil.isEmpty(s)) {
ps.append(' [', s, ']');
}
// 追加子标签
var children = pt._children;
if (children) {
ps.append('\n');
var count = children.count();
for (var i = 0; i < count; i++) {
var child = children.get(i);
this.innerDump(ps, child, pl + 1);
if (i < count - 1) {
ps.append('\n');
}
}
}
}
//==========================================================
//获取运行时信息。
//
// @method
// @return String 运行信息
//==========================================================
public dump() {
var result = new StringBuffer();
this.innerDump(result, this, 0);
return result.flush();
}
}