-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
323 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,139 @@ | ||
var homunculus = require('../'); | ||
|
||
var expect = require('expect.js'); | ||
var path = require('path'); | ||
var fs = require('fs'); | ||
|
||
var Token = homunculus.getClass('token', 'axml'); | ||
|
||
function join(tokens) { | ||
var arr = tokens.map(function(token) { | ||
return token.content(); | ||
}); | ||
return arr; | ||
} | ||
function type(tokens, tag) { | ||
var arr = tokens.map(function(token) { | ||
return tag ? Token.type(token.type()) : token.type(); | ||
}); | ||
return arr; | ||
} | ||
|
||
describe('htmllexer', function() { | ||
describe('simple test', function() { | ||
describe('commnet', function() { | ||
it('normal', function () { | ||
var lexer = homunculus.getLexer('axml'); | ||
var tokens = lexer.parse('<!--comment-->'); | ||
expect(join(tokens)).to.eql(['<!--comment-->']); | ||
expect(type(tokens)).to.eql([6]); | ||
}); | ||
}); | ||
describe('doctype', function() { | ||
it('normal', function () { | ||
var lexer = homunculus.getLexer('axml'); | ||
var tokens = lexer.parse('<!DOCTYPE>'); | ||
expect(join(tokens)).to.eql(['<', '!DOCTYPE', '>']); | ||
expect(type(tokens)).to.eql([26, 27, 26]); | ||
}); | ||
it('ignore case', function () { | ||
var lexer = homunculus.getLexer('axml'); | ||
var tokens = lexer.parse('<!doctype>'); | ||
expect(join(tokens)).to.eql(['<', '!doctype', '>']); | ||
expect(type(tokens)).to.eql([26, 27, 26]); | ||
}); | ||
}); | ||
describe('markdown', function() { | ||
it('normal', function () { | ||
var lexer = homunculus.getLexer('axml'); | ||
var tokens = lexer.parse('<html></html>'); | ||
expect(join(tokens)).to.eql(['<', 'html', '>', '</', 'html', '>']); | ||
expect(type(tokens)).to.eql([26, 24, 26, 26, 24, 26]); | ||
}); | ||
it('selfclose', function() { | ||
var lexer = homunculus.getLexer('axml'); | ||
var tokens = lexer.parse('<img/>'); | ||
expect(join(tokens)).to.eql(['<', 'img', '/>']); | ||
expect(type(tokens)).to.eql([26, 24, 26]); | ||
}); | ||
it('without />', function() { | ||
var lexer = homunculus.getLexer('axml'); | ||
var tokens = lexer.parse('<img>'); | ||
expect(join(tokens)).to.eql(['<', 'img', '>']); | ||
expect(type(tokens)).to.eql([26, 24, 26]); | ||
}); | ||
it('custom mark', function() { | ||
var lexer = homunculus.getLexer('axml'); | ||
var tokens = lexer.parse('<custom>'); | ||
expect(join(tokens)).to.eql(['<', 'custom', '>']); | ||
expect(type(tokens)).to.eql([26, 24, 26]); | ||
}); | ||
it('attribute', function() { | ||
var lexer = homunculus.getLexer('axml'); | ||
var tokens = lexer.parse('<a href="#">'); | ||
expect(join(tokens)).to.eql(['<', 'a', ' ', 'href', '=', '"#"', '>']); | ||
expect(type(tokens)).to.eql([26, 24, 1, 15, 8, 7, 26]); | ||
}); | ||
it('custom attribute', function() { | ||
var lexer = homunculus.getLexer('axml'); | ||
var tokens = lexer.parse('<a custom=1>'); | ||
expect(join(tokens)).to.eql(['<', 'a', ' ', 'custom', '=', '1', '>']); | ||
expect(type(tokens)).to.eql([26, 24, 1, 15, 8, 4, 26]); | ||
}); | ||
it('data attribute', function() { | ||
var lexer = homunculus.getLexer('axml'); | ||
var tokens = lexer.parse('<a data-b=1>'); | ||
expect(join(tokens)).to.eql(['<', 'a', ' ', 'data-b', '=', '1', '>']); | ||
expect(type(tokens)).to.eql([26, 24, 1, 15, 8, 4, 26]); | ||
}); | ||
it('attr without quote', function() { | ||
var lexer = homunculus.getLexer('axml'); | ||
var tokens = lexer.parse('<input checked=checked>'); | ||
expect(join(tokens)).to.eql(['<', 'input', ' ', 'checked', '=', 'checked', '>']); | ||
expect(type(tokens)).to.eql([26, 24, 1, 15, 8, 15, 26]); | ||
}); | ||
it('attr without value', function() { | ||
var lexer = homunculus.getLexer('axml'); | ||
var tokens = lexer.parse('<input checked>'); | ||
expect(join(tokens)).to.eql(['<', 'input', ' ', 'checked', '>']); | ||
expect(type(tokens)).to.eql([26, 24, 1, 15, 26]); | ||
}); | ||
it('text', function() { | ||
var lexer = homunculus.getLexer('axml'); | ||
var tokens = lexer.parse('<div>text</div> <p/>'); | ||
expect(join(tokens)).to.eql(['<', 'div', '>', 'text', '</', 'div', '>', ' ', '<', 'p', '/>']); | ||
expect(type(tokens)).to.eql([26, 24, 26, 25, 26, 24, 26, 25, 26, 24, 26]); | ||
}); | ||
it('error', function() { | ||
var lexer = homunculus.getLexer('axml'); | ||
expect(function() { | ||
lexer.parse('<div |>'); | ||
}).to.throwError(); | ||
}); | ||
it('style with mark as text', function () { | ||
var lexer = homunculus.getLexer('axml'); | ||
var tokens = lexer.parse('<style><div></style>'); | ||
expect(join(tokens)).to.eql(['<', 'style', '>', '<div>', '</', 'style', '>']); | ||
expect(type(tokens)).to.eql([26, 24, 26, 25, 26, 24, 26]); | ||
}); | ||
it('script no end', function () { | ||
var lexer = homunculus.getLexer('axml'); | ||
var tokens = lexer.parse('<script>'); | ||
expect(join(tokens)).to.eql(['<', 'script', '>']); | ||
expect(type(tokens)).to.eql([26, 24, 26]); | ||
}); | ||
it('script with text no end', function () { | ||
var lexer = homunculus.getLexer('axml'); | ||
var tokens = lexer.parse('<script>var a'); | ||
expect(join(tokens)).to.eql(['<', 'script', '>', 'var a']); | ||
expect(type(tokens)).to.eql([26, 24, 26, 25]); | ||
}); | ||
it('a:if', function () { | ||
var lexer = homunculus.getLexer('axml'); | ||
var tokens = lexer.parse('<block a:if="{{v}}"></block>'); | ||
expect(join(tokens)).to.eql(['<', 'block', ' ', 'a:if', '=', '"{{v}}"', '>', '</', 'block', '>']); | ||
expect(type(tokens)).to.eql([26, 24, 1, 15, 8, 7, 26, 26, 24, 26]); | ||
}); | ||
}); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,170 @@ | ||
var homunculus = require('../'); | ||
|
||
var expect = require('expect.js'); | ||
var fs = require('fs'); | ||
var path = require('path'); | ||
|
||
var Token = homunculus.getClass('token', 'axml'); | ||
var Parser = homunculus.getClass('parser', 'axml'); | ||
var AxmlNode = homunculus.getClass('node', 'axml'); | ||
|
||
var res; | ||
var index; | ||
|
||
function jion(node, ignore) { | ||
res = ''; | ||
index = 0; | ||
while(ignore[index]) { | ||
res += ignore[index++].content(); | ||
} | ||
recursion(node, ignore); | ||
return res; | ||
} | ||
function recursion(node, ignore) { | ||
var isToken = node.isToken(); | ||
if(isToken) { | ||
var isVirtual = node.token().isVirtual(); | ||
if(!isVirtual) { | ||
var token = node.token(); | ||
res += token.content(); | ||
while(ignore[++index]) { | ||
res += ignore[index].content(); | ||
} | ||
} | ||
} | ||
else { | ||
node.leaves().forEach(function(leaf, i) { | ||
recursion(leaf, ignore); | ||
}); | ||
} | ||
} | ||
|
||
function tree(node, arr) { | ||
arr = arr || []; | ||
var isToken = node.name() == AxmlNode.TOKEN; | ||
var isVirtual = isToken && node.token().type() == Token.VIRTUAL; | ||
if(isToken) { | ||
if(!isVirtual) { | ||
var token = node.token(); | ||
arr.push(token.content()); | ||
} | ||
} | ||
else { | ||
arr.push(node.name()); | ||
var childs = []; | ||
arr.push(childs); | ||
node.leaves().forEach(function(leaf, i) { | ||
tree(leaf, childs); | ||
}); | ||
} | ||
return arr; | ||
} | ||
|
||
describe('htmlparser', function() { | ||
describe('simple test', function() { | ||
it('!doctype', function() { | ||
var parser = homunculus.getParser('axml'); | ||
var node = parser.parse('<!doctype html>'); | ||
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","!doctype",AxmlNode.Attribute,["html"],">"]]]); | ||
}); | ||
it('single mark', function() { | ||
var parser = homunculus.getParser('axml'); | ||
var node = parser.parse('<img src="about:blank">'); | ||
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","img",AxmlNode.Attribute,["src","=","\"about:blank\""],">"]]]); | ||
}); | ||
it('single mark closed', function() { | ||
var parser = homunculus.getParser('axml'); | ||
var node = parser.parse('<img src="about:blank"/>'); | ||
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","img",AxmlNode.Attribute,["src","=","\"about:blank\""],"/>"]]]); | ||
}); | ||
it('couple mark', function() { | ||
var parser = homunculus.getParser('axml'); | ||
var node = parser.parse('<div><span></span></div>'); | ||
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.ELEMENT,[AxmlNode.OpeningElement,["<","div",">"],AxmlNode.ELEMENT,[AxmlNode.OpeningElement,["<","span",">"],AxmlNode.ClosingElement,["</","span",">"]],AxmlNode.ClosingElement,["</","div",">"]]]]); | ||
}); | ||
it('text node', function() { | ||
var parser = homunculus.getParser('axml'); | ||
var node = parser.parse('<div>\n<span>123<b>456</b></span> </div>'); | ||
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.ELEMENT,[AxmlNode.OpeningElement,["<","div",">"],"\n",AxmlNode.ELEMENT,[AxmlNode.OpeningElement,["<","span",">"],"123",AxmlNode.ELEMENT,[AxmlNode.OpeningElement,["<","b",">"],"456",AxmlNode.ClosingElement,["</","b",">"]],AxmlNode.ClosingElement,["</","span",">"]]," ",AxmlNode.ClosingElement,["</","div",">"]]]]); | ||
}); | ||
it('custom node', function() { | ||
var parser = homunculus.getParser('axml'); | ||
var node = parser.parse('<custom/>'); | ||
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","custom","/>"]]]); | ||
}); | ||
it('custom attr', function() { | ||
var parser = homunculus.getParser('axml'); | ||
var node = parser.parse('<custom custom="123"></custom>'); | ||
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.ELEMENT,[AxmlNode.OpeningElement,["<","custom",AxmlNode.Attribute,["custom","=","\"123\""],">"],AxmlNode.ClosingElement,["</","custom",">"]]]]); | ||
}); | ||
it('data attr', function() { | ||
var parser = homunculus.getParser('axml'); | ||
var node = parser.parse('<img data-name="1">'); | ||
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","img",AxmlNode.Attribute,["data-name","=","\"1\""],">"]]]); | ||
}); | ||
it('comment', function() { | ||
var parser = homunculus.getParser('axml'); | ||
var node = parser.parse('<!--comment--><img/>'); | ||
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","img","/>"]]]); | ||
}); | ||
it('comment complex', function() { | ||
var parser = homunculus.getParser('axml'); | ||
var node = parser.parse('<!--comment--><img/><!--comment--><!--comment-->211<div><!--comment--></div>'); | ||
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","img","/>"],"211",AxmlNode.ELEMENT,[AxmlNode.OpeningElement,["<","div",">"],AxmlNode.ClosingElement,["</","div",">"]]]]); | ||
}); | ||
it('single attr', function() { | ||
var parser = homunculus.getParser('axml'); | ||
var node = parser.parse('<input checked>'); | ||
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","input",AxmlNode.Attribute,["checked"],">"]]]); | ||
}); | ||
it('attr no quote', function() { | ||
var parser = homunculus.getParser('axml'); | ||
var node = parser.parse('<input checked=checked>'); | ||
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","input",AxmlNode.Attribute,["checked","=","checked"],">"]]]); | ||
}); | ||
it('attr number', function() { | ||
var parser = homunculus.getParser('axml'); | ||
var node = parser.parse('<input num=3>'); | ||
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","input",AxmlNode.Attribute,["num","=","3"],">"]]]); | ||
}); | ||
it('single before couple', function() { | ||
var parser = homunculus.getParser('axml'); | ||
var node = parser.parse('<img/><div></div>'); | ||
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","img","/>"],AxmlNode.ELEMENT,[AxmlNode.OpeningElement,["<","div",">"],AxmlNode.ClosingElement,["</","div",">"]]]]); | ||
}); | ||
it('!doctype must be the first', function() { | ||
var parser = homunculus.getParser('axml'); | ||
expect(function() { | ||
parser.parse('<img/><!doctype html>'); | ||
}).to.throwError(); | ||
}); | ||
it('couple mark must be closed', function() { | ||
var parser = homunculus.getParser('axml'); | ||
expect(function() { | ||
parser.parse('<div>'); | ||
}).to.throwError(); | ||
}); | ||
it('not suit', function() { | ||
var parser = homunculus.getParser('axml'); | ||
expect(function() { | ||
parser.parse('<div>123</p>'); | ||
}).to.throwError(); | ||
}); | ||
it('script autoclose', function() { | ||
var parser = homunculus.getParser('axml'); | ||
var node = parser.parse('<script/>'); | ||
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.SelfClosingElement,["<","script","/>"]]]); | ||
}); | ||
it('script not close', function() { | ||
var parser = homunculus.getParser('axml'); | ||
expect(function() { | ||
parser.parse('<script>var a'); | ||
}).to.throwError(); | ||
}); | ||
it('style contain others', function() { | ||
var parser = homunculus.getParser('axml'); | ||
var node = parser.parse('<style><div>123</div></style>'); | ||
expect(tree(node)).to.eql([AxmlNode.DOCUMENT,[AxmlNode.ELEMENT,[AxmlNode.OpeningElement,["<","style",">"],"<div>123</div>",AxmlNode.ClosingElement,["</","style",">"]]]]); | ||
}); | ||
}); | ||
}); |