You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.1 KiB
85 lines
2.1 KiB
/** |
|
* 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; |
|
};
|
|
|