| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- var EscapeStore = require('./escape-store');
- var reduceUrls = require('../urls/reduce');
- var lineBreak = require('os').EOL;
- function UrlsProcessor(context, saveWaypoints, keepUrlQuotes) {
- this.urls = new EscapeStore('URL');
- this.context = context;
- this.saveWaypoints = saveWaypoints;
- this.keepUrlQuotes = keepUrlQuotes;
- }
- // 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.
- UrlsProcessor.prototype.escape = function (data) {
- var breaksCount;
- var lastBreakAt;
- var indent;
- var saveWaypoints = this.saveWaypoints;
- var self = this;
- return reduceUrls(data, this.context, function (url, tempData) {
- if (saveWaypoints) {
- breaksCount = url.split(lineBreak).length - 1;
- lastBreakAt = url.lastIndexOf(lineBreak);
- indent = lastBreakAt > 0 ?
- url.substring(lastBreakAt + lineBreak.length).length :
- url.length;
- }
- var placeholder = self.urls.store(url, saveWaypoints ? [breaksCount, indent] : null);
- tempData.push(placeholder);
- });
- };
- function normalize(url, keepUrlQuotes) {
- url = url
- .replace(/^url/gi, 'url')
- .replace(/\\?\n|\\?\r\n/g, '')
- .replace(/(\s{2,}|\s)/g, ' ')
- .replace(/^url\((['"])? /, 'url($1')
- .replace(/ (['"])?\)$/, '$1)');
- if (/url\(".*'.*"\)/.test(url) || /url\('.*".*'\)/.test(url))
- return url;
- if (!keepUrlQuotes && !/^['"].+['"]$/.test(url) && !/url\(.*[\s\(\)].*\)/.test(url) && !/url\(['"]data:[^;]+;charset/.test(url))
- url = url.replace(/["']/g, '');
- return url;
- }
- UrlsProcessor.prototype.restore = function (data) {
- var tempData = [];
- var cursor = 0;
- for (; cursor < data.length;) {
- var nextMatch = this.urls.nextMatch(data, cursor);
- if (nextMatch.start < 0)
- break;
- tempData.push(data.substring(cursor, nextMatch.start));
- var url = normalize(this.urls.restore(nextMatch.match), this.keepUrlQuotes);
- tempData.push(url);
- cursor = nextMatch.end;
- }
- return tempData.length > 0 ?
- tempData.join('') + data.substring(cursor, data.length) :
- data;
- };
- module.exports = UrlsProcessor;
|