From 99c123b159e85ab9d97bea65a5ec4fff62023bf9 Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Sun, 8 Sep 2013 21:05:07 -0400 Subject: [PATCH] Move parsing methods to their own files (separates manipulation dependency from core) --- src/ajax.js | 2 ++ src/ajax/load.js | 1 + src/ajax/parseJSON.js | 8 ++++++ src/ajax/parseXML.js | 26 ++++++++++++++++++ src/core.js | 61 +++---------------------------------------- src/core/parseHTML.js | 38 +++++++++++++++++++++++++++ src/var/rsingleTag.js | 4 +++ 7 files changed, 82 insertions(+), 58 deletions(-) create mode 100644 src/ajax/parseJSON.js create mode 100644 src/ajax/parseXML.js create mode 100644 src/core/parseHTML.js create mode 100644 src/var/rsingleTag.js diff --git a/src/ajax.js b/src/ajax.js index 3fd882a2f..7310b5e15 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -3,6 +3,8 @@ define([ "./var/rnotwhite", "./ajax/var/nonce", "./ajax/var/rquery", + "./ajax/parseJSON", + "./ajax/parseXML", "./deferred" ], function( jQuery, rnotwhite, nonce, rquery ) { diff --git a/src/ajax/load.js b/src/ajax/load.js index 167031697..3c345a027 100644 --- a/src/ajax/load.js +++ b/src/ajax/load.js @@ -1,5 +1,6 @@ define([ "../core", + "../core/parseHTML", "../ajax", "../traversing", "../manipulation", diff --git a/src/ajax/parseJSON.js b/src/ajax/parseJSON.js new file mode 100644 index 000000000..9d2ada95b --- /dev/null +++ b/src/ajax/parseJSON.js @@ -0,0 +1,8 @@ +define([ + "../core" +], function( jQuery ) { + + jQuery.parseJSON = JSON.parse; + + return jQuery.parseJSON; +}); diff --git a/src/ajax/parseXML.js b/src/ajax/parseXML.js new file mode 100644 index 000000000..9103c3d6f --- /dev/null +++ b/src/ajax/parseXML.js @@ -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; +}); diff --git a/src/core.js b/src/core.js index 175208c2d..ef5df4f65 100644 --- a/src/core.js +++ b/src/core.js @@ -10,9 +10,10 @@ define([ "./var/toString", "./var/hasOwn", "./var/trim", + "./var/rsingleTag", "./var/support" ], function( strundefined, arr, slice, concat, push, indexOf, - class2type, toString, hasOwn, trim, support ) { + class2type, toString, hasOwn, trim, rsingleTag, support ) { var // A central reference to the root jQuery(document) @@ -40,9 +41,6 @@ var // Strict HTML recognition (#11290: must start with <) rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, - // Matches dashed string for camelizing rmsPrefix = /^-ms-/, rdashAlpha = /-([\da-z])/gi, @@ -84,6 +82,7 @@ jQuery.fn = jQuery.prototype = { context = context instanceof jQuery ? context[0] : context; // scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present jQuery.merge( this, jQuery.parseHTML( match[1], context && context.nodeType ? context.ownerDocument || context : document, @@ -387,60 +386,6 @@ jQuery.extend({ 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() {}, // Evaluates a script in a global context diff --git a/src/core/parseHTML.js b/src/core/parseHTML.js new file mode 100644 index 000000000..b097bfcc5 --- /dev/null +++ b/src/core/parseHTML.js @@ -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; +}); diff --git a/src/var/rsingleTag.js b/src/var/rsingleTag.js new file mode 100644 index 000000000..7e7090b77 --- /dev/null +++ b/src/var/rsingleTag.js @@ -0,0 +1,4 @@ +define(function() { + // Match a standalone tag + return (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); +});