var URL_PREFIX = 'url(';
var URL_SUFFIX = ')';
+var lineBreak = require('os').EOL;
-var UrlsProcessor = function UrlsProcessor(context) {
+var UrlsProcessor = function UrlsProcessor(context, saveWaypoints) {
this.urls = new EscapeStore('URL');
this.context = context;
+ this.saveWaypoints = saveWaypoints;
};
// Strip urls by replacing them by a special
var nextEnd = 0;
var cursor = 0;
var tempData = [];
+ var breaksCount;
+ var lastBreakAt;
+ var indent;
+ var saveWaypoints = this.saveWaypoints;
for (; nextEnd < data.length;) {
nextStart = data.indexOf(URL_PREFIX, nextEnd);
}
var url = data.substring(nextStart, nextEnd + 1);
- var placeholder = this.urls.store(url);
+
+ 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 = this.urls.store(url, saveWaypoints ? [breaksCount, indent] : null);
tempData.push(data.substring(cursor, nextStart));
tempData.push(placeholder);
var assert = require('assert');
var UrlsProcessor = require('../../lib/text/urls-processor');
-function processorContext(context) {
+var lineBreak = require('os').EOL;
+
+function processorContext(name, context, saveWaypoints) {
var vowContext = {};
function escaped (targetCSS) {
return function (sourceCSS) {
- var result = new UrlsProcessor().escape(sourceCSS);
+ var result = new UrlsProcessor(null, saveWaypoints).escape(sourceCSS);
assert.equal(result, targetCSS);
};
}
function restored (targetCSS) {
return function (sourceCSS) {
- var processor = new UrlsProcessor();
+ var processor = new UrlsProcessor(null, saveWaypoints);
var result = processor.restore(processor.escape(sourceCSS));
assert.equal(result, targetCSS);
};
}
for (var key in context) {
- vowContext[key] = {
+ vowContext[name + ' - ' + key] = {
topic: context[key][0],
escaped: escaped(context[key][1]),
restored: restored(context[key][2])
vows.describe(UrlsProcessor)
.addBatch(
- processorContext({
+ processorContext('basic', {
'no urls': [
'a{color:red}',
'a{color:red}',
]
})
)
+ .addBatch(
+ processorContext('waypoints', {
+ 'no urls': [
+ 'a{color:red}',
+ 'a{color:red}',
+ 'a{color:red}'
+ ],
+ 'unquoted': [
+ 'div{background:url(some/file.png) repeat}',
+ 'div{background:__ESCAPED_URL_CLEAN_CSS0(0,18)__ repeat}',
+ 'div{background:url(some/file.png) repeat}'
+ ],
+ 'single quoted': [
+ 'div{background:url(\'some/file.png\') repeat}',
+ 'div{background:__ESCAPED_URL_CLEAN_CSS0(0,20)__ repeat}',
+ 'div{background:url(some/file.png) repeat}'
+ ],
+ 'double quoted': [
+ 'div{background:url("some/file.png") repeat}',
+ 'div{background:__ESCAPED_URL_CLEAN_CSS0(0,20)__ repeat}',
+ 'div{background:url(some/file.png) repeat}'
+ ],
+ 'with line breaks': [
+ 'div{background:url("' + lineBreak + 'some/' + lineBreak + 'file.png") repeat}',
+ 'div{background:__ESCAPED_URL_CLEAN_CSS0(2,10)__ repeat}',
+ 'div{background:url(some/file.png) repeat}'
+ ],
+ 'multiple': [
+ 'div{background:url(one/file.png) repeat}p{background:url(second/file.png)}',
+ 'div{background:__ESCAPED_URL_CLEAN_CSS0(0,17)__ repeat}p{background:__ESCAPED_URL_CLEAN_CSS1(0,20)__}',
+ 'div{background:url(one/file.png) repeat}p{background:url(second/file.png)}'
+ ]
+ }, true)
+ )
.export(module);