54 lines
1.6 KiB
JavaScript
54 lines
1.6 KiB
JavaScript
var EscapeStore = require('./escape-store');
|
|
|
|
module.exports = function Urls(context) {
|
|
var urls = new EscapeStore('URL');
|
|
|
|
return {
|
|
// Strip urls by replacing them by a special
|
|
// marker for further restoring. It's done via string scanning
|
|
// instead of regexps to speed up the process.
|
|
escape: function(data) {
|
|
var nextStart = 0;
|
|
var nextEnd = 0;
|
|
var cursor = 0;
|
|
var tempData = [];
|
|
|
|
for (; nextEnd < data.length;) {
|
|
nextStart = data.indexOf('url(', nextEnd);
|
|
if (nextStart == -1)
|
|
break;
|
|
|
|
nextEnd = data.indexOf(')', nextStart);
|
|
// Following lines are a safety mechanism to ensure
|
|
// incorrectly terminated urls are processed correctly.
|
|
if (nextEnd == -1) {
|
|
nextEnd = data.indexOf('}', nextStart);
|
|
|
|
if (nextEnd == -1)
|
|
nextEnd = data.length;
|
|
else
|
|
nextEnd--;
|
|
|
|
context.warnings.push('Broken URL declaration: \'' + data.substring(nextStart, nextEnd + 1) + '\'.');
|
|
}
|
|
|
|
var url = data.substring(nextStart, nextEnd + 1);
|
|
var placeholder = urls.store(url);
|
|
tempData.push(data.substring(cursor, nextStart));
|
|
tempData.push(placeholder);
|
|
cursor = nextEnd + 1;
|
|
}
|
|
|
|
return tempData.length > 0 ?
|
|
tempData.join('') + data.substring(cursor, data.length) :
|
|
data;
|
|
},
|
|
|
|
restore: function(data) {
|
|
return data.replace(urls.placeholderRegExp, function(placeholder) {
|
|
return urls.restore(placeholder).replace(/\s/g, '');
|
|
});
|
|
}
|
|
};
|
|
};
|