//parser HTML分析
namespace web;
class parser{
ctor( html ){
this.head = html ? ..string.match(html,"<@@
@>(.*?)<@@@>")
if(!this.head ){
this.head = html ? ..string.match(html,"<@@@>(.*?)<@@")
}
this.html = html;
};
eachMeta = function(){
var f = function(){
for meta in ..string.gmatch( this.head:"","<@@\s+.*?\>") {
..fiber.yield (parseProperties(meta))
}
}
return ..fiber.generator(f);
};
getMetaTable = function(){
if( this.metaTable ) return this.metaTable;
var meta = { name ={} ; equiv = {} };
for(m in this.eachMeta() ){
if( m.name ){
meta.name[ ..string.lower(m.name) ] = m.content;
}
elseif( m.equiv ){
meta.equiv[ ..string.lower(m.equiv) ] = m.content;
}
}
this.metaTable = meta;
return meta;
};
getMetaContent = function(name){
return this.getMetaTable().name[[name]];
};
getKeywords = function(){
return this.getMetaContent("keywords");
};
getDescription = function(){
return this.getMetaContent("description");
};
getCharset = function(){
for(m in this.eachMeta() ){
if( m.equiv ? ..string.cmp(m.equiv,"Content-Type") == 0 ){
var charset = ..string.match(m.content,"!\w<@@charset@>\s*\=\s*([^;]+)")
return ..string.lower(charset);
}
elseif( !m.name && m.charset ) {
return ..string.lower(m.charset);
}
}
};
isUtf8 = function(){
return this.getCharset() == "utf-8";
};
local = function(){
if( !this.isUtf8() ){
this.head = this.head ? ..string.fromto(this.head,0,65001);
this.html = this.html ? ..string.fromto(this.html,0,65001);
this.metaTable = null;
}
return this;
};
getTitle = function(){
return this.head ? ..string.match( this.head , "<@@@>(.*?)<@@@>")
}
}
namespace parser{
parseProperties = function(tagHtml) {
var ele = {};
if(!tagHtml) return ele;
var tagName,tagBody= ..string.match(tagHtml,"\<([\w_:]+)(.+)");
if( tagName ){
ele.tagName = ..string.lower( tagName );
tagHtml = tagBody;
}
..string.replace(
tagHtml + " ",
"([\w_:]+)\s*(<=\s*""[^""]+"">|<=\s*'[^']+'>|<=\s*\S+>|\s)",
function (w, a, b){
a = ..string.trimleft(a,"=");
a = ..string.trimleft(a);
if( a[1] == '"'# ) a = ..string.trim(a,'"');
elseif( a[1] == '\''# ) a = ..string.trim(a,'\'');
ele[..string.lower(w)] = a
}
)
return ele;
};
isUtf8 = function(html){
return ..web.parser(html).isUtf8();
};
getTitle = function(html){
return ..web.parser(html).getTitle();
}
}
/**intellisense()
web.parser = HTML简单解析\n如果要解析HTML全部节点请使用string.xml
web.parser(.("HTML") = 创建HTML简单解析器\n如果要解析HTML全部节点请使用string.xml
web.parser() = !stdweb_parser.
!stdweb_parser.head = HEAD部分HTML
!stdweb_parser.isUtf8() = 是否UTF-8编码
!stdweb_parser.getCharset() = 获取页面编码,返回值一律小写
!stdweb_parser.getTitle() = 获取页面标题
!stdweb_parser.getKeywords() = 获取页面描述
!stdweb_parser.getDescription() = 获取页面描述
!stdweb_parser.getMetaContent(.(name) = 获取页面META节点指定name值对应的content值\nname忽略大小写
!stdweb_parser.getMetaTable() = 返回META信息\n!stdweb_parser_meta.
!stdweb_parser_meta.name = 所有指定NAME属性的content值\n键名一律小写
!stdweb_parser_meta.equiv = 所有指定EQUIV属性的content值\n键名一律小写
!stdweb_parser.eachMeta() = @for(meta in ??.eachMeta() ){
__/*meta属性名一律小写*/
}
!stdweb_parser.local() = 如果不是UTF8编码转换为UTF8,返回对象自身\n!stdweb_parser.
web.parser.parseProperties(__/*节点HTML*/) = 提取HTML开始标记中的属性对
end intellisense**/