Skip to content

Commit 866e3ed

Browse files
committed
first commit
1 parent 3e45186 commit 866e3ed

File tree

10 files changed

+2572
-0
lines changed

10 files changed

+2572
-0
lines changed

LICENSE 2

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
You can choose any one of those:
2+
3+
The MIT License (MIT):
4+
5+
link:http://opensource.org/licenses/MIT
6+
7+
LGPL:
8+
http://www.gnu.org/licenses/lgpl.html

__package__.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
this.addScript('dom.js',['DOMImplementation','XMLSerializer']);
2+
this.addScript('dom-parser.js',['DOMHandler','DOMParser'],
3+
['DOMImplementation','XMLReader']);
4+
this.addScript('sax.js','XMLReader');

changelog

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
### Version 0.0.1
2+
* Add: add getElementsByClassName, getElementsByAttribute, querySelect etc..

component.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"name": "react-native-html-parser",
3+
"version": "0.0.1",
4+
"main": "dom-parser.js",
5+
"ignore": [
6+
"**/.*",
7+
"node_modules",
8+
"components"
9+
]
10+
}

dom-parser.js

Lines changed: 249 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,249 @@
1+
function DOMParser(options){
2+
this.options = options ||{locator:{}};
3+
4+
}
5+
DOMParser.prototype.parseFromString = function(source,mimeType){
6+
var options = this.options;
7+
var sax = new XMLReader();
8+
var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
9+
var errorHandler = options.errorHandler;
10+
var locator = options.locator;
11+
var defaultNSMap = options.xmlns||{};
12+
var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"}
13+
if(locator){
14+
domBuilder.setDocumentLocator(locator)
15+
}
16+
17+
sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
18+
sax.domBuilder = options.domBuilder || domBuilder;
19+
if(/\/x?html?$/.test(mimeType)){
20+
entityMap.nbsp = '\xa0';
21+
entityMap.copy = '\xa9';
22+
defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
23+
}
24+
defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
25+
if(source){
26+
sax.parse(source,defaultNSMap,entityMap);
27+
}else{
28+
sax.errorHandler.error("invalid document source");
29+
}
30+
return domBuilder.document;
31+
}
32+
function buildErrorHandler(errorImpl,domBuilder,locator){
33+
if(!errorImpl){
34+
if(domBuilder instanceof DOMHandler){
35+
return domBuilder;
36+
}
37+
errorImpl = domBuilder ;
38+
}
39+
var errorHandler = {}
40+
var isCallback = errorImpl instanceof Function;
41+
locator = locator||{}
42+
function build(key){
43+
var fn = errorImpl[key];
44+
if(!fn && isCallback){
45+
fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;
46+
}
47+
errorHandler[key] = fn && function(msg){
48+
fn('[xmldom '+key+']\t'+msg+_locator(locator));
49+
}||function(){};
50+
}
51+
build('warning');
52+
build('error');
53+
build('fatalError');
54+
return errorHandler;
55+
}
56+
57+
//console.log('#\n\n\n\n\n\n\n####')
58+
/**
59+
* +ContentHandler+ErrorHandler
60+
* +LexicalHandler+EntityResolver2
61+
* -DeclHandler-DTDHandler
62+
*
63+
* DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
64+
* DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
65+
* @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
66+
*/
67+
function DOMHandler() {
68+
this.cdata = false;
69+
}
70+
function position(locator,node){
71+
node.lineNumber = locator.lineNumber;
72+
node.columnNumber = locator.columnNumber;
73+
}
74+
/**
75+
* @see org.xml.sax.ContentHandler#startDocument
76+
* @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
77+
*/
78+
DOMHandler.prototype = {
79+
startDocument : function() {
80+
this.document = new DOMImplementation().createDocument(null, null, null);
81+
if (this.locator) {
82+
this.document.documentURI = this.locator.systemId;
83+
}
84+
},
85+
startElement:function(namespaceURI, localName, qName, attrs) {
86+
var doc = this.document;
87+
var el = doc.createElementNS(namespaceURI, qName||localName);
88+
var len = attrs.length;
89+
appendElement(this, el);
90+
this.currentElement = el;
91+
92+
this.locator && position(this.locator,el)
93+
for (var i = 0 ; i < len; i++) {
94+
var namespaceURI = attrs.getURI(i);
95+
var value = attrs.getValue(i);
96+
var qName = attrs.getQName(i);
97+
var attr = doc.createAttributeNS(namespaceURI, qName);
98+
if( attr.getOffset){
99+
position(attr.getOffset(1),attr)
100+
}
101+
attr.value = attr.nodeValue = value;
102+
el.setAttributeNode(attr)
103+
}
104+
},
105+
endElement:function(namespaceURI, localName, qName) {
106+
var current = this.currentElement
107+
var tagName = current.tagName;
108+
this.currentElement = current.parentNode;
109+
},
110+
startPrefixMapping:function(prefix, uri) {
111+
},
112+
endPrefixMapping:function(prefix) {
113+
},
114+
processingInstruction:function(target, data) {
115+
var ins = this.document.createProcessingInstruction(target, data);
116+
this.locator && position(this.locator,ins)
117+
appendElement(this, ins);
118+
},
119+
ignorableWhitespace:function(ch, start, length) {
120+
},
121+
characters:function(chars, start, length) {
122+
chars = _toString.apply(this,arguments)
123+
//console.log(chars)
124+
if(this.currentElement && chars){
125+
if (this.cdata) {
126+
var charNode = this.document.createCDATASection(chars);
127+
this.currentElement.appendChild(charNode);
128+
} else {
129+
var charNode = this.document.createTextNode(chars);
130+
this.currentElement.appendChild(charNode);
131+
}
132+
this.locator && position(this.locator,charNode)
133+
}
134+
},
135+
skippedEntity:function(name) {
136+
},
137+
endDocument:function() {
138+
this.document.normalize();
139+
},
140+
setDocumentLocator:function (locator) {
141+
if(this.locator = locator){// && !('lineNumber' in locator)){
142+
locator.lineNumber = 0;
143+
}
144+
},
145+
//LexicalHandler
146+
comment:function(chars, start, length) {
147+
chars = _toString.apply(this,arguments)
148+
var comm = this.document.createComment(chars);
149+
this.locator && position(this.locator,comm)
150+
appendElement(this, comm);
151+
},
152+
153+
startCDATA:function() {
154+
//used in characters() methods
155+
this.cdata = true;
156+
},
157+
endCDATA:function() {
158+
this.cdata = false;
159+
},
160+
161+
startDTD:function(name, publicId, systemId) {
162+
var impl = this.document.implementation;
163+
if (impl && impl.createDocumentType) {
164+
var dt = impl.createDocumentType(name, publicId, systemId);
165+
this.locator && position(this.locator,dt)
166+
appendElement(this, dt);
167+
}
168+
},
169+
/**
170+
* @see org.xml.sax.ErrorHandler
171+
* @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
172+
*/
173+
warning:function(error) {
174+
console.warn('[xmldom warning]\t'+error,_locator(this.locator));
175+
},
176+
error:function(error) {
177+
console.error('[xmldom error]\t'+error,_locator(this.locator));
178+
},
179+
fatalError:function(error) {
180+
console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
181+
throw error;
182+
}
183+
}
184+
function _locator(l){
185+
if(l){
186+
return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
187+
}
188+
}
189+
function _toString(chars,start,length){
190+
if(typeof chars == 'string'){
191+
return chars.substr(start,length)
192+
}else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
193+
if(chars.length >= start+length || start){
194+
return new java.lang.String(chars,start,length)+'';
195+
}
196+
return chars;
197+
}
198+
}
199+
200+
/*
201+
* @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
202+
* used method of org.xml.sax.ext.LexicalHandler:
203+
* #comment(chars, start, length)
204+
* #startCDATA()
205+
* #endCDATA()
206+
* #startDTD(name, publicId, systemId)
207+
*
208+
*
209+
* IGNORED method of org.xml.sax.ext.LexicalHandler:
210+
* #endDTD()
211+
* #startEntity(name)
212+
* #endEntity(name)
213+
*
214+
*
215+
* @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
216+
* IGNORED method of org.xml.sax.ext.DeclHandler
217+
* #attributeDecl(eName, aName, type, mode, value)
218+
* #elementDecl(name, model)
219+
* #externalEntityDecl(name, publicId, systemId)
220+
* #internalEntityDecl(name, value)
221+
* @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
222+
* IGNORED method of org.xml.sax.EntityResolver2
223+
* #resolveEntity(String name,String publicId,String baseURI,String systemId)
224+
* #resolveEntity(publicId, systemId)
225+
* #getExternalSubset(name, baseURI)
226+
* @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
227+
* IGNORED method of org.xml.sax.DTDHandler
228+
* #notationDecl(name, publicId, systemId) {};
229+
* #unparsedEntityDecl(name, publicId, systemId, notationName) {};
230+
*/
231+
"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
232+
DOMHandler.prototype[key] = function(){return null}
233+
})
234+
235+
/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
236+
function appendElement (hander,node) {
237+
if (!hander.currentElement) {
238+
hander.document.appendChild(node);
239+
} else {
240+
hander.currentElement.appendChild(node);
241+
}
242+
}//appendChild and setAttributeNS are preformance key
243+
244+
if(typeof require == 'function'){
245+
var XMLReader = require('./sax').XMLReader;
246+
var DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation;
247+
exports.XMLSerializer = require('./dom').XMLSerializer ;
248+
exports.DOMParser = DOMParser;
249+
}

0 commit comments

Comments
 (0)