1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- 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, '');
- });
- }
- };
- };
|