| Index: node_modules/vulcanize/node_modules/whacko/lib/static.js
 | 
| diff --git a/node_modules/vulcanize/node_modules/whacko/lib/static.js b/node_modules/vulcanize/node_modules/whacko/lib/static.js
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..41ab5c2db1541650c2d990acd9ab83672ee8f0bc
 | 
| --- /dev/null
 | 
| +++ b/node_modules/vulcanize/node_modules/whacko/lib/static.js
 | 
| @@ -0,0 +1,160 @@
 | 
| +/**
 | 
| + * Module dependencies
 | 
| + */
 | 
| +
 | 
| +var select = require('CSSselect'),
 | 
| +    parse = require('./parse'),
 | 
| +    render = require('./render'),
 | 
| +    _ = require('lodash');
 | 
| +
 | 
| +/**
 | 
| + * $.load(str)
 | 
| + */
 | 
| +
 | 
| +exports.load = function (content, options, isFragment) {
 | 
| +    var Cheerio = require('./cheerio');
 | 
| +
 | 
| +    options = _.defaults(options || {}, Cheerio.prototype.options);
 | 
| +
 | 
| +    var root = parse(content, options, !isFragment);
 | 
| +
 | 
| +    var initialize = function (selector, context, r, opts) {
 | 
| +        opts = _.defaults(opts || {}, options);
 | 
| +        return Cheerio.call(this, selector, context, r || root, opts);
 | 
| +    };
 | 
| +
 | 
| +    // Ensure that selections created by the "loaded" `initialize` function are
 | 
| +    // true Cheerio instances.
 | 
| +    initialize.prototype = Cheerio.prototype;
 | 
| +
 | 
| +    // Add in the static methods
 | 
| +    _.merge(initialize, exports);
 | 
| +
 | 
| +    // Add in the root
 | 
| +    initialize._root = root;
 | 
| +    // store options
 | 
| +    initialize._options = options;
 | 
| +
 | 
| +    return initialize;
 | 
| +};
 | 
| +
 | 
| +/**
 | 
| + * $.html([selector | dom])
 | 
| + */
 | 
| +
 | 
| +exports.html = function (dom, options) {
 | 
| +    var Cheerio = require('./cheerio');
 | 
| +
 | 
| +    // be flexible about parameters, sometimes we call html(),
 | 
| +    // with options as only parameter
 | 
| +    // check dom argument for dom element specific properties
 | 
| +    // assume there is no 'length' or 'type' properties in the options object
 | 
| +    if (Object.prototype.toString.call(dom) === '[object Object]' && !options && !('length' in dom) &&
 | 
| +        !('type' in dom)) {
 | 
| +        options = dom;
 | 
| +        dom = undefined;
 | 
| +    }
 | 
| +
 | 
| +    // sometimes $.html() used without preloading html
 | 
| +    // so fallback non existing options to the default ones
 | 
| +    options = _.defaults(options || {}, this._options, Cheerio.prototype.options);
 | 
| +
 | 
| +    if (dom) {
 | 
| +        dom = (typeof dom === 'string') ? select(dom, this._root, options) : dom;
 | 
| +        return render(dom, options);
 | 
| +    } else if (this._root && this._root.children) {
 | 
| +        return render(this._root.children, options);
 | 
| +    } else {
 | 
| +        return '';
 | 
| +    }
 | 
| +};
 | 
| +
 | 
| +/**
 | 
| + * $.xml([selector | dom])
 | 
| + */
 | 
| +
 | 
| +exports.xml = function (dom) {
 | 
| +    if (dom) {
 | 
| +        dom = (typeof dom === 'string') ? select(dom, this._root, this.options) : dom;
 | 
| +        return render(dom, { xmlMode: true });
 | 
| +    } else if (this._root && this._root.children) {
 | 
| +        return render(this._root.children, { xmlMode: true });
 | 
| +    } else {
 | 
| +        return '';
 | 
| +    }
 | 
| +};
 | 
| +
 | 
| +/**
 | 
| + * $.text(dom)
 | 
| + */
 | 
| +
 | 
| +exports.text = function (elems) {
 | 
| +    if (!elems) return '';
 | 
| +
 | 
| +    var ret = '',
 | 
| +        len = elems.length,
 | 
| +        elem;
 | 
| +
 | 
| +    for (var i = 0; i < len; i++) {
 | 
| +        elem = elems[i];
 | 
| +        if (elem.type === 'text') ret += elem.data;
 | 
| +        else if (elem.children && elem.type !== 'comment') {
 | 
| +            ret += exports.text(elem.children);
 | 
| +        }
 | 
| +    }
 | 
| +
 | 
| +    return ret;
 | 
| +};
 | 
| +
 | 
| +/**
 | 
| + * $.parseHTML(data [, context ] [, keepScripts ])
 | 
| + * Parses a string into an array of DOM nodes. The `context` argument has no
 | 
| + * meaning for Cheerio, but it is maintained for API compatibility with jQuery.
 | 
| + */
 | 
| +exports.parseHTML = function (data, context, keepScripts) {
 | 
| +    var parsed;
 | 
| +
 | 
| +    if (!data || typeof data !== 'string') {
 | 
| +        return null;
 | 
| +    }
 | 
| +
 | 
| +    if (typeof context === 'boolean') {
 | 
| +        keepScripts = context;
 | 
| +    }
 | 
| +
 | 
| +    parsed = this.load(data, null, true);
 | 
| +    if (!keepScripts) {
 | 
| +        parsed('script').remove();
 | 
| +    }
 | 
| +
 | 
| +    return parsed.root()[0].children;
 | 
| +};
 | 
| +
 | 
| +/**
 | 
| + * $.root()
 | 
| + */
 | 
| +exports.root = function () {
 | 
| +    return this(this._root);
 | 
| +};
 | 
| +
 | 
| +/**
 | 
| + * $.contains()
 | 
| + */
 | 
| +exports.contains = function (container, contained) {
 | 
| +
 | 
| +    // According to the jQuery API, an element does not "contain" itself
 | 
| +    if (contained === container) {
 | 
| +        return false;
 | 
| +    }
 | 
| +
 | 
| +    // Step up the descendants, stopping when the root element is reached
 | 
| +    // (signaled by `.parent` returning a reference to the same object)
 | 
| +    while (contained && contained !== contained.parent) {
 | 
| +        contained = contained.parent;
 | 
| +        if (contained === container) {
 | 
| +            return true;
 | 
| +        }
 | 
| +    }
 | 
| +
 | 
| +    return false;
 | 
| +};
 | 
| 
 |