Move parsing methods to their own files (separates manipulation dependency from core)

This commit is contained in:
Timmy Willison 2013-09-08 21:05:07 -04:00
parent eb9cbfcaf6
commit 99c123b159
7 changed files with 82 additions and 58 deletions

View File

@ -3,6 +3,8 @@ define([
"./var/rnotwhite", "./var/rnotwhite",
"./ajax/var/nonce", "./ajax/var/nonce",
"./ajax/var/rquery", "./ajax/var/rquery",
"./ajax/parseJSON",
"./ajax/parseXML",
"./deferred" "./deferred"
], function( jQuery, rnotwhite, nonce, rquery ) { ], function( jQuery, rnotwhite, nonce, rquery ) {

View File

@ -1,5 +1,6 @@
define([ define([
"../core", "../core",
"../core/parseHTML",
"../ajax", "../ajax",
"../traversing", "../traversing",
"../manipulation", "../manipulation",

8
src/ajax/parseJSON.js Normal file
View File

@ -0,0 +1,8 @@
define([
"../core"
], function( jQuery ) {
jQuery.parseJSON = JSON.parse;
return jQuery.parseJSON;
});

26
src/ajax/parseXML.js Normal file
View File

@ -0,0 +1,26 @@
define([
"../core"
], function( jQuery ) {
// Cross-browser xml parsing
jQuery.parseXML = function( data ) {
var xml, tmp;
if ( !data || typeof data !== "string" ) {
return null;
}
// Support: IE9
try {
tmp = new DOMParser();
xml = tmp.parseFromString( data , "text/xml" );
} catch ( e ) {
xml = undefined;
}
if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
jQuery.error( "Invalid XML: " + data );
}
return xml;
};
return jQuery.parseXML;
});

View File

@ -10,9 +10,10 @@ define([
"./var/toString", "./var/toString",
"./var/hasOwn", "./var/hasOwn",
"./var/trim", "./var/trim",
"./var/rsingleTag",
"./var/support" "./var/support"
], function( strundefined, arr, slice, concat, push, indexOf, ], function( strundefined, arr, slice, concat, push, indexOf,
class2type, toString, hasOwn, trim, support ) { class2type, toString, hasOwn, trim, rsingleTag, support ) {
var var
// A central reference to the root jQuery(document) // A central reference to the root jQuery(document)
@ -40,9 +41,6 @@ var
// Strict HTML recognition (#11290: must start with <) // Strict HTML recognition (#11290: must start with <)
rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
// Match a standalone tag
rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
// Matches dashed string for camelizing // Matches dashed string for camelizing
rmsPrefix = /^-ms-/, rmsPrefix = /^-ms-/,
rdashAlpha = /-([\da-z])/gi, rdashAlpha = /-([\da-z])/gi,
@ -84,6 +82,7 @@ jQuery.fn = jQuery.prototype = {
context = context instanceof jQuery ? context[0] : context; context = context instanceof jQuery ? context[0] : context;
// scripts is true for back-compat // scripts is true for back-compat
// Intentionally let the error be thrown if parseHTML is not present
jQuery.merge( this, jQuery.parseHTML( jQuery.merge( this, jQuery.parseHTML(
match[1], match[1],
context && context.nodeType ? context.ownerDocument || context : document, context && context.nodeType ? context.ownerDocument || context : document,
@ -387,60 +386,6 @@ jQuery.extend({
throw new Error( msg ); throw new Error( msg );
}, },
// data: string of html
// context (optional): If specified, the fragment will be created in this context, defaults to document
// keepScripts (optional): If true, will include scripts passed in the html string
// TODO: Circular reference core -> manipulation -> core
parseHTML: function( data, context, keepScripts ) {
if ( !data || typeof data !== "string" ) {
return null;
}
if ( typeof context === "boolean" ) {
keepScripts = context;
context = false;
}
context = context || document;
var parsed = rsingleTag.exec( data ),
scripts = !keepScripts && [];
// Single tag
if ( parsed ) {
return [ context.createElement( parsed[1] ) ];
}
parsed = jQuery.buildFragment( [ data ], context, scripts );
if ( scripts && scripts.length ) {
jQuery( scripts ).remove();
}
return jQuery.merge( [], parsed.childNodes );
},
parseJSON: JSON.parse,
// Cross-browser xml parsing
parseXML: function( data ) {
var xml, tmp;
if ( !data || typeof data !== "string" ) {
return null;
}
// Support: IE9
try {
tmp = new DOMParser();
xml = tmp.parseFromString( data , "text/xml" );
} catch ( e ) {
xml = undefined;
}
if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
jQuery.error( "Invalid XML: " + data );
}
return xml;
},
noop: function() {}, noop: function() {},
// Evaluates a script in a global context // Evaluates a script in a global context

38
src/core/parseHTML.js Normal file
View File

@ -0,0 +1,38 @@
define([
"../core",
"../var/rsingleTag",
"../manipulation" // buildFragment
], function( jQuery, rsingleTag ) {
// data: string of html
// context (optional): If specified, the fragment will be created in this context, defaults to document
// keepScripts (optional): If true, will include scripts passed in the html string
jQuery.parseHTML = function( data, context, keepScripts ) {
if ( !data || typeof data !== "string" ) {
return null;
}
if ( typeof context === "boolean" ) {
keepScripts = context;
context = false;
}
context = context || document;
var parsed = rsingleTag.exec( data ),
scripts = !keepScripts && [];
// Single tag
if ( parsed ) {
return [ context.createElement( parsed[1] ) ];
}
parsed = jQuery.buildFragment( [ data ], context, scripts );
if ( scripts && scripts.length ) {
jQuery( scripts ).remove();
}
return jQuery.merge( [], parsed.childNodes );
};
return jQuery.parseHTML;
});

4
src/var/rsingleTag.js Normal file
View File

@ -0,0 +1,4 @@
define(function() {
// Match a standalone tag
return (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
});