From 7c18e7fbea8bf9ef49d990ff3f4884fd649c290f Mon Sep 17 00:00:00 2001 From: Gavin Carothers Date: Wed, 21 Dec 2016 08:24:31 -0800 Subject: [PATCH 1/6] Add failing test for @page rules Haven't updated the AST yet but fails to parse already. --- test/cases/paged-media/input.css | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/cases/paged-media/input.css b/test/cases/paged-media/input.css index 68b8e0f3..65f0098b 100644 --- a/test/cases/paged-media/input.css +++ b/test/cases/paged-media/input.css @@ -11,3 +11,15 @@ @page :left { margin-left: 5cm; } + +@page named-page { + size: A4 landscape; +} + +@page { + size: 210mm 279mm; + + @top-left { + padding-top: 0; + } +} From cad0a4937af57a418c832e8eb021968f69dc4933 Mon Sep 17 00:00:00 2001 From: Gavin Carothers Date: Wed, 21 Dec 2016 08:50:05 -0800 Subject: [PATCH 2/6] Parsing of margin boxes Tests failing from assertion errors not parse errors --- lib/parse/index.js | 33 +++++++++++++++++++++++++++++++- lib/stringify/identity.js | 13 +++++++++++++ test/cases/paged-media/input.css | 4 ++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/lib/parse/index.js b/lib/parse/index.js index 053f0596..93f656dc 100644 --- a/lib/parse/index.js +++ b/lib/parse/index.js @@ -422,7 +422,7 @@ module.exports = function(css, options){ // declarations var decl; - while (decl = declaration()) { + while (decl = declaration() || atmarginbox()) { decls.push(decl); decls = decls.concat(comments()); } @@ -436,6 +436,37 @@ module.exports = function(css, options){ }); } + /** + * Parse margin boxes + */ + + function atmarginbox() { + var pos = position(); + var m = match(/^@((top|bottom|left|right)-(center|right|top|middle|left|bottom)(-corner)?) */); + if (!m) return; + + var name = m[1]; + + if (!open()) return error("@margin-box missing '{'"); + var decls = comments(); + + // declarations + var decl; + while (decl = declaration()) { + decls.push(decl); + decls = decls.concat(comments()); + } + + if (!close()) return error("@margin-box missing '}'"); + + return pos({ + type: 'margin-box', + name: name, + declarations: decls + }); + + } + /** * Parse document. */ diff --git a/lib/stringify/identity.js b/lib/stringify/identity.js index b390c91e..eced701c 100644 --- a/lib/stringify/identity.js +++ b/lib/stringify/identity.js @@ -175,6 +175,19 @@ Compiler.prototype.page = function(node){ + this.emit('\n}'); }; +/** + * Visit margin-box node. + */ + +Compiler.prototype['margin-box'] = function(node){ + return this.emit('@' + node.name, node.position) + + this.emit('{\n') + + this.emit(this.indent(1)) + + this.mapVisit(node.declarations, '\n') + + this.emit(this.indent(-1)) + + this.emit('\n}'); +}; + /** * Visit font-face node. */ diff --git a/test/cases/paged-media/input.css b/test/cases/paged-media/input.css index 65f0098b..99ac5fd0 100644 --- a/test/cases/paged-media/input.css +++ b/test/cases/paged-media/input.css @@ -22,4 +22,8 @@ @top-left { padding-top: 0; } + + @top-right { + content: "foo"; + } } From 95d52ad5749902da3ecae3466c886987a6afb0e3 Mon Sep 17 00:00:00 2001 From: Gavin Carothers Date: Wed, 21 Dec 2016 09:17:09 -0800 Subject: [PATCH 3/6] Tests passing Which is in fact horrifying since I haven't updated the expect AST yet so that checking works really well clearly :( --- lib/stringify/compress.js | 11 +++++++++++ lib/stringify/identity.js | 5 +++-- test/cases/paged-media/compressed.css | 2 +- test/cases/paged-media/input.css | 14 +++++++------- test/cases/paged-media/output.css | 14 ++++++++++++++ 5 files changed, 36 insertions(+), 10 deletions(-) diff --git a/lib/stringify/compress.js b/lib/stringify/compress.js index 929b4a21..f3dc5212 100644 --- a/lib/stringify/compress.js +++ b/lib/stringify/compress.js @@ -145,6 +145,17 @@ Compiler.prototype.page = function(node){ + this.emit('}'); }; +/** + * Visit margin-box node. + */ + +Compiler.prototype['margin-box'] = function(node){ + return this.emit('@' + node.name + ' ', node.position) + + this.emit('{') + + this.mapVisit(node.declarations) + + this.emit('}'); +}; + /** * Visit font-face node. */ diff --git a/lib/stringify/identity.js b/lib/stringify/identity.js index eced701c..2ca7c789 100644 --- a/lib/stringify/identity.js +++ b/lib/stringify/identity.js @@ -180,12 +180,13 @@ Compiler.prototype.page = function(node){ */ Compiler.prototype['margin-box'] = function(node){ - return this.emit('@' + node.name, node.position) + return this.emit(this.indent()) + + this.emit('@' + node.name + ' ', node.position) + this.emit('{\n') + this.emit(this.indent(1)) + this.mapVisit(node.declarations, '\n') + this.emit(this.indent(-1)) - + this.emit('\n}'); + + this.emit('\n' + this.indent() + '}'); }; /** diff --git a/test/cases/paged-media/compressed.css b/test/cases/paged-media/compressed.css index 13113164..84934bca 100644 --- a/test/cases/paged-media/compressed.css +++ b/test/cases/paged-media/compressed.css @@ -1 +1 @@ -@page toc, index:blank{color:green;}@page {font-size:16pt;}@page :left{margin-left:5cm;} +@page toc, index:blank{color:green;}@page {font-size:16pt;}@page :left{margin-left:5cm;}@page named-page{size:A4 landscape;}@page {size:210mm 279mm;@top-left {padding-top:0;}@top-right {content:"foo";}} diff --git a/test/cases/paged-media/input.css b/test/cases/paged-media/input.css index 99ac5fd0..fd1725d2 100644 --- a/test/cases/paged-media/input.css +++ b/test/cases/paged-media/input.css @@ -17,13 +17,13 @@ } @page { - size: 210mm 279mm; + size: 210mm 279mm; - @top-left { - padding-top: 0; - } + @top-left { + padding-top: 0; + } - @top-right { - content: "foo"; - } + @top-right { + content: "foo"; + } } diff --git a/test/cases/paged-media/output.css b/test/cases/paged-media/output.css index 583fcc9d..49896f3d 100644 --- a/test/cases/paged-media/output.css +++ b/test/cases/paged-media/output.css @@ -12,3 +12,17 @@ @page :left { margin-left: 5cm; } + +@page named-page { + size: A4 landscape; +} + +@page { + size: 210mm 279mm; + @top-left { + padding-top: 0; + } + @top-right { + content: "foo"; + } +} \ No newline at end of file From d6af9a9cbc134e79af33692442c082fbea62d03a Mon Sep 17 00:00:00 2001 From: Gavin Carothers Date: Wed, 21 Dec 2016 09:33:23 -0800 Subject: [PATCH 4/6] Add regenerated ast for paged-media test --- test/cases/paged-media/ast.json | 140 +++++++++++++++++++++++++++++++- 1 file changed, 138 insertions(+), 2 deletions(-) diff --git a/test/cases/paged-media/ast.json b/test/cases/paged-media/ast.json index 12333876..c8efd2a0 100644 --- a/test/cases/paged-media/ast.json +++ b/test/cases/paged-media/ast.json @@ -1,6 +1,7 @@ { "type": "stylesheet", "stylesheet": { + "source": "input.css", "rules": [ { "type": "comment", @@ -135,7 +136,142 @@ }, "source": "input.css" } + }, + { + "type": "page", + "selectors": [ + "named-page" + ], + "declarations": [ + { + "type": "declaration", + "property": "size", + "value": "A4 landscape", + "position": { + "start": { + "line": 16, + "column": 3 + }, + "end": { + "line": 16, + "column": 21 + }, + "source": "input.css" + } + } + ], + "position": { + "start": { + "line": 15, + "column": 1 + }, + "end": { + "line": 17, + "column": 2 + }, + "source": "input.css" + } + }, + { + "type": "page", + "selectors": [], + "declarations": [ + { + "type": "declaration", + "property": "size", + "value": "210mm 279mm", + "position": { + "start": { + "line": 20, + "column": 3 + }, + "end": { + "line": 20, + "column": 20 + }, + "source": "input.css" + } + }, + { + "type": "margin-box", + "name": "top-left", + "declarations": [ + { + "type": "declaration", + "property": "padding-top", + "value": "0", + "position": { + "start": { + "line": 23, + "column": 5 + }, + "end": { + "line": 23, + "column": 19 + }, + "source": "input.css" + } + } + ], + "position": { + "start": { + "line": 22, + "column": 3 + }, + "end": { + "line": 24, + "column": 4 + }, + "source": "input.css" + } + }, + { + "type": "margin-box", + "name": "top-right", + "declarations": [ + { + "type": "declaration", + "property": "content", + "value": "\"foo\"", + "position": { + "start": { + "line": 27, + "column": 5 + }, + "end": { + "line": 27, + "column": 19 + }, + "source": "input.css" + } + } + ], + "position": { + "start": { + "line": 26, + "column": 3 + }, + "end": { + "line": 28, + "column": 4 + }, + "source": "input.css" + } + } + ], + "position": { + "start": { + "line": 19, + "column": 1 + }, + "end": { + "line": 29, + "column": 2 + }, + "source": "input.css" + } } - ] + ], + "parsingErrors": [] } -} +} \ No newline at end of file From 581e2a3303571931a220e5eb25237d1dc9da8d01 Mon Sep 17 00:00:00 2001 From: Gavin Carothers Date: Wed, 21 Dec 2016 09:55:24 -0800 Subject: [PATCH 5/6] Bump version number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 93bb8910..b716893d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "css", - "version": "2.2.1", + "version": "2.2.2-beta.0", "description": "CSS parser / stringifier", "main": "index", "files": [ From eb51d19071a6bcd57d68568405af54e923c6e910 Mon Sep 17 00:00:00 2001 From: Gavin Carothers Date: Fri, 23 Dec 2016 15:52:56 -0800 Subject: [PATCH 6/6] Avoid being a pre-release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b716893d..67e8c284 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "css", - "version": "2.2.2-beta.0", + "version": "2.2.2", "description": "CSS parser / stringifier", "main": "index", "files": [