aboutsummaryrefslogtreecommitdiff
path: root/node_modules/stylus/lib/functions/resolver.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/stylus/lib/functions/resolver.js')
-rw-r--r--node_modules/stylus/lib/functions/resolver.js85
1 files changed, 85 insertions, 0 deletions
diff --git a/node_modules/stylus/lib/functions/resolver.js b/node_modules/stylus/lib/functions/resolver.js
new file mode 100644
index 00000000..e2ce4d01
--- /dev/null
+++ b/node_modules/stylus/lib/functions/resolver.js
@@ -0,0 +1,85 @@
+/**
+ * Module dependencies.
+ */
+
+var Compiler = require('../visitor/compiler')
+ , nodes = require('../nodes')
+ , parse = require('url').parse
+ , relative = require('path').relative
+ , join = require('path').join
+ , dirname = require('path').dirname
+ , extname = require('path').extname
+ , sep = require('path').sep;
+
+/**
+ * Return a url() function which resolves urls.
+ *
+ * Options:
+ *
+ * - `paths` resolution path(s), merged with general lookup paths
+ * - `nocheck` don't check file existence
+ *
+ * Examples:
+ *
+ * stylus(str)
+ * .set('filename', __dirname + '/css/test.styl')
+ * .define('url', stylus.resolver({ nocheck: true }))
+ * .render(function(err, css){ ... })
+ *
+ * @param {Object} [options]
+ * @return {Function}
+ * @api public
+ */
+
+module.exports = function(options) {
+ options = options || {};
+
+ function resolver(url) {
+ // Compile the url
+ var compiler = new Compiler(url)
+ , filename = url.filename;
+ compiler.isURL = true;
+ url = parse(url.nodes.map(function(node){
+ return compiler.visit(node);
+ }).join(''));
+
+ // Parse literal
+ var literal = new nodes.Literal('url("' + url.href + '")')
+ , path = url.pathname
+ , dest = this.options.dest
+ , tail = ''
+ , res;
+
+ // Absolute or hash
+ if (url.protocol || !path || '/' == path[0]) return literal;
+
+ // Check that file exists
+ if (!options.nocheck) {
+ var _paths = options.paths || [];
+ path = require('../utils').lookup(path, _paths.concat(this.paths));
+ if (!path) return literal;
+ }
+
+ if (this.includeCSS && extname(path) == '.css')
+ return new nodes.Literal(url.href);
+
+ if (url.search) tail += url.search;
+ if (url.hash) tail += url.hash;
+
+ if (dest && extname(dest) == '.css')
+ dest = dirname(dest);
+
+ res = relative(dest || dirname(this.filename), options.nocheck
+ ? join(dirname(filename), path)
+ : path) + tail;
+
+ if ('\\' == sep) res = res.replace(/\\/g, '/');
+
+ return new nodes.Literal('url("' + res + '")');
+ };
+
+ // Expose options to Evaluator
+ resolver.options = options;
+ resolver.raw = true;
+ return resolver;
+};