diff options
author | Silvio Rhatto <rhatto@riseup.net> | 2014-03-15 14:42:42 -0300 |
---|---|---|
committer | Silvio Rhatto <rhatto@riseup.net> | 2014-03-15 14:42:42 -0300 |
commit | 551497ef94f6239b109316d8fab32f0909b13f73 (patch) | |
tree | 236615e9881988ce05f40583ff891bf0fcef2c14 /vendors/lessphp/tests | |
download | elgg-551497ef94f6239b109316d8fab32f0909b13f73.tar.gz elgg-551497ef94f6239b109316d8fab32f0909b13f73.tar.bz2 |
Squashed 'mod/less/' content from commit 380edad
git-subtree-dir: mod/less
git-subtree-split: 380edadb3a5e524a8e6ef6df063b678f2f00516f
Diffstat (limited to 'vendors/lessphp/tests')
55 files changed, 2565 insertions, 0 deletions
diff --git a/vendors/lessphp/tests/README.md b/vendors/lessphp/tests/README.md new file mode 100644 index 000000000..edb8f7be3 --- /dev/null +++ b/vendors/lessphp/tests/README.md @@ -0,0 +1,24 @@ +## test.php + +To run: + + php test.php [flags] [test-name-glob] + + +Runs through all files in `inputs`, compiles them, then compares to respective +file in `outputs`. If there are any differences then the test will fail. + +Add the `-d` flag to show the differences of failed tests. Defaults to showing +differences with `diff` but you can set the tool by doing `-d=toolname`. + +Pass the `-C` flag to save the output of the inputs to the appropriate file. This +will overwrite any existing outputs. Use this when you want to save verified +test results. Combine with a *test-name-glob* to selectively compile. + +You can also run specific tests by passing in an argument that contains any +part of the test name. + +## bootstrap.sh + +It's a syntetic test comparing lessc and lessphp output compiling twitter bootstrap; +see bootstrap.sh for details.
\ No newline at end of file diff --git a/vendors/lessphp/tests/bootstrap.sh b/vendors/lessphp/tests/bootstrap.sh new file mode 100755 index 000000000..b49f7cec3 --- /dev/null +++ b/vendors/lessphp/tests/bootstrap.sh @@ -0,0 +1,49 @@ +echo "This script clones twitter bootsrap, compiles it with lessc and lessphp," +echo "cleans up results with csstidy, and outputs diff. To run it, you need to" +echo "have git, csstidy and lessc installed." +echo "" + +csstidy_params="--allow_html_in_templates=false --compress_colors=false +--compress_font-weight=false --discard_invalid_properties=false +--lowercase_s=false --preserve_css=true --remove_bslash=false +--remove_last_;=false --sort-properties=true --sort-selectors=true +--timestamp=false --silent=true --merge_selectors=0 --case-properties=0 +--optimize-shorthands=0 --template=high" + +if [ -z "$@" ]; then + diff_tool="diff -b -u -t -B" +else + diff_tool=$@ +fi + +mkdir -p tmp + +if [ ! -d 'bootstrap/' ]; then + echo ">> Cloning bootstrap to bootstrap/" + git clone https://github.com/twitter/bootstrap +fi + +echo ">> Lessc compilation" +lessc bootstrap/less/bootstrap.less tmp/bootstrap.lessc.css + +echo ">> Lessphp compilation" +../plessc bootstrap/less/bootstrap.less tmp/bootstrap.lessphp.css +echo ">> Cleanup and convert" + +# csstidy tmp/bootstrap.lessc.css $csstidy_params tmp/bootstrap.lessc.clean.css +# csstidy tmp/bootstrap.lessphp.css $csstidy_params tmp/bootstrap.lessphp.clean.css +# +# # put a newline after { and : +# function split() { +# sed 's/\(;\|{\)/\1\n/g' +# } +# +# # csstidy is messed up and wont output to stdout when there are a bunch of options +# cat tmp/bootstrap.lessc.clean.css | split | tee tmp/bootstrap.lessc.clean.css +# cat tmp/bootstrap.lessphp.clean.css | split | tee tmp/bootstrap.lessphp.clean.css + +php sort.php tmp/bootstrap.lessc.css > tmp/bootstrap.lessc.clean.css +php sort.php tmp/bootstrap.lessphp.css > tmp/bootstrap.lessphp.clean.css + +echo ">> Doing diff" +$diff_tool tmp/bootstrap.lessc.clean.css tmp/bootstrap.lessphp.clean.css diff --git a/vendors/lessphp/tests/inputs/accessors.less.disable b/vendors/lessphp/tests/inputs/accessors.less.disable new file mode 100644 index 000000000..37f5c8e8b --- /dev/null +++ b/vendors/lessphp/tests/inputs/accessors.less.disable @@ -0,0 +1,36 @@ +/* accessors */ + +#defaults { + @width: 960px; + @color: black; + .something { + @space: 10px; + @hello { + color: green; + } + } +} + +.article { color: #294366; } + +.comment { + width: #defaults[@width]; + color: .article['color']; + padding: #defaults > .something[@space]; +} + +.wow { + height: .comment['width']; + background-color: .comment['color']; + color: #defaults > .something > @hello['color']; + + padding: #defaults > non-existant['padding']; + margin: #defaults > .something['non-existant']; +} + +.mix { + #defaults; + font-size: .something[@space]; +} + + diff --git a/vendors/lessphp/tests/inputs/arity.less b/vendors/lessphp/tests/inputs/arity.less new file mode 100644 index 000000000..a3adad612 --- /dev/null +++ b/vendors/lessphp/tests/inputs/arity.less @@ -0,0 +1,77 @@ + +// simple arity + +.hello(@a) { + color: one; +} + +.hello(@a, @b) { + color: two; +} + +.hello(@a, @b, @c) { + color: three; +} + + +.world(@a, @b, @c) { + color: three; +} + +.world(@a, @b) { + color: two; +} + +.world(@a) { + color: one; +} + +.one { + .hello(1); + .world(1); +} + +.two { + .hello(1, 1); + .world(1, 1); +} + +.three { + .hello(1, 1, 1); + .world(1, 1, 1); +} + + +// arity with default values + +.foo(@a, @b: cool) { + color: two; +} + +.foo(@a, @b: cool, @c: yeah) { + color: three; +} + + +.baz(@a, @b, @c: yeah) { + color: three; +} + +.baz(@a, @b: cool) { + color: two; +} + + +.multi-foo { + .foo(1); + .foo(1, 1); + .foo(1,1,1); +} + +.multi-baz { + .baz(1); + .baz(1, 1); + .baz(1,1,1); +} + + diff --git a/vendors/lessphp/tests/inputs/attributes.less b/vendors/lessphp/tests/inputs/attributes.less new file mode 100644 index 000000000..7ede4fc4e --- /dev/null +++ b/vendors/lessphp/tests/inputs/attributes.less @@ -0,0 +1,41 @@ +* { color: blue; } +E { color: blue; } +E[foo] { color: blue; } +[foo] { color: blue; } +[foo] .helloWorld { color: blue; } +[foo].helloWorld { color: blue; } +E[foo="barbar"] { color: blue; } +E[foo~="hello#$@%@$#^"] { color: blue; } +E[foo^="color: green;"] { color: blue; } +E[foo$="239023"] { color: blue; } +E[foo*="29302"] { color: blue; } +E[foo|="239032"] { color: blue; } +E:root { color: blue; } + +E:nth-child(odd) { color: blue; } +E:nth-child(2n+1) { color: blue; } +E:nth-child(5) { color: blue; } +E:nth-last-child(-n+2) { color: blue; } +E:nth-of-type(2n) { color: blue; } +E:nth-last-of-type(n) { color: blue; } + +E:first-child { color: blue; } +E:last-child { color: blue; } +E:first-of-type { color: blue; } +E:last-of-type { color: blue; } +E:only-child { color: blue; } +E:only-of-type { color: blue; } +E:empty { color: blue; } + +E:lang(en) { color: blue; } +E::first-line { color: blue; } +E::before { color: blue; } + +E#id { color: blue; } +E:not(:link) { color: blue; } + +E F { color: blue; } +E > F { color: blue; } +E + F { color: blue; } +E ~ F { color: blue; } + diff --git a/vendors/lessphp/tests/inputs/builtins.less b/vendors/lessphp/tests/inputs/builtins.less new file mode 100644 index 000000000..ae2c4ef6e --- /dev/null +++ b/vendors/lessphp/tests/inputs/builtins.less @@ -0,0 +1,36 @@ +// builtin + +@something: "hello world"; +@color: #112233; +@color2: rgba(44,55,66, .6); + +body { + color: @something; + + @num: 7 / 6; + height: @num + 4; + height: floor(@num) + 4px; + height: ceil(@num) + 4px; + + @num2: 2 / 3; + width: @num2; + width: round(@num2); + width: floor(@num2); + width: ceil(@num2); + width: round(10px / 3); + + color: rgbahex(@color); + color: rgbahex(@color2); +} + + +format { + @r: 32; + format: %("rgb(%d, %d, %d)", @r, 128, 64); + format-string: %("hello %s", "world"); + format-multiple: %("hello %s %d", "earth", 2); + format-url-encode: %('red is %A', #ff0000); + eformat: e(%("rgb(%d, %d, %d)", @r, 128, 64)); +} + + diff --git a/vendors/lessphp/tests/inputs/colors.less b/vendors/lessphp/tests/inputs/colors.less new file mode 100644 index 000000000..d407a74f3 --- /dev/null +++ b/vendors/lessphp/tests/inputs/colors.less @@ -0,0 +1,122 @@ + +body { + color: hsl(34, 50%, 40%); + color: hsla(34, 50%, 40%, 0.3); + + lighten: lighten(#efefef, 10%); + lighten: lighten(rgb(23, 53, 231), 22%); + lighten: lighten(rgba(212, 103, 88, 0.5), 10%); + + darken: darken(#efefef, 10%); + darken: darken(rgb(23, 53, 231), 22%); + darken: darken(rgba(23, 53, 231, 0.5), 10%); + + saturate: saturate(#efefef, 10%); + saturate: saturate(rgb(23, 53, 231), 22%); + saturate: saturate(rgba(23, 53, 231, 0.5), 10%); + + desaturate: desaturate(#efefef, 10%); + desaturate: desaturate(rgb(23, 53, 231), 22%); + desaturate: desaturate(rgba(23, 53, 231, 0.5), 10%); + + spin: spin(#efefef, 12); + spin: spin(rgb(23, 53, 231), 15); + spin: spin(rgba(23, 53, 231, 0.5), 19); + + spin: spin(#efefef, -12); + spin: spin(rgb(23, 53, 231), -15); + spin: spin(rgba(23, 53, 231, 0.5), -19); + + one: fadein(#abcdef, 10%); + one: fadeout(#abcdef, -10%); + + two: fadeout(#029f23, 10%); + two: fadein(#029f23, -10%); + + + three: fadein(rgba(1,2,3, 0.5), 10%); + three: fadeout(rgba(1,2,3, 0.5), -10%); + + four: fadeout(rgba(1,2,3, 0), 10%); + four: fadein(rgba(1,2,3, 0), -10%); + + hue: hue(rgb(34,20,40)); + sat: saturation(rgb(34,20,40)); + lit: lightness(rgb(34,20,40)); + + @old: #34fa03; + @new: hsl(hue(@old), 45%, 90%); + what: @new; + + zero: saturate(#123456, -100%); + zero: saturate(#123456, 100%); + zero: saturate(#000000, 100%); + zero: saturate(#ffffff, 100%); + + zero: lighten(#123456, -100%); + zero: lighten(#123456, 100%); + zero: lighten(#000000, 100%); + zero: lighten(#ffffff, 100%); + + zero: spin(#123456, -100); + zero: spin(#123456, 100); + zero: spin(#000000, 100); + zero: spin(#ffffff, 100); +} + + +alpha { + // g: alpha(red); + g: alpha(rgba(0,0,0,0)); + g: alpha(rgb(155,55,0)); +} + +fade { + f: fade(red, 50%); + f: fade(#fff, 20%); + f: fade(rgba(34,23,64,0.4), 50%); +} + +@a: rgb(255,255,255); +@b: rgb(0,0,0); + +.mix { + color: mix(@a, @b, 50%); +} + +.percent { + per: percentage(0.5); +} + +// color keywords + +.colorz { + color: whitesmoke - 10; + color: spin(red, 34); +} + + + +// purposfuly whacky to match less.js + +@color: #fcf8e3; + +body { + start: @color; + spin: spin(@color, -10); // #fcf4e3 + chained: darken(spin(@color, -10), 3%); // gives #fbeed5, should be #fbefd5 + direct: darken(#fcf4e3, 3%); // #fbefd5 +} + +// spin around +pre { + @errorBackground: #f2dede; + spin: spin(@errorBackground, -10); +} + +dd { + @white: #fff; + background-color: mix(@white, darken(@white, 10%), 60%); +} + + diff --git a/vendors/lessphp/tests/inputs/compile_on_mixin.less b/vendors/lessphp/tests/inputs/compile_on_mixin.less new file mode 100644 index 000000000..79d628f49 --- /dev/null +++ b/vendors/lessphp/tests/inputs/compile_on_mixin.less @@ -0,0 +1,39 @@ + +@mixin { + height: 22px; + ul { + height: 20px; + li { + @color: red; + height: 10px; + div span, link { + margin: 10px; + color: @color; + } + } + + div, p { + border: 1px; + &.hello { + color: green; + } + + :what { + color: blue; + } + } + + + a { + b { + color: blue; + } + } + } +} + + + +body { + @mixin; +} diff --git a/vendors/lessphp/tests/inputs/escape.less b/vendors/lessphp/tests/inputs/escape.less new file mode 100644 index 000000000..02d92d6f0 --- /dev/null +++ b/vendors/lessphp/tests/inputs/escape.less @@ -0,0 +1,20 @@ + +body { + @hello: "world"; + border: e("this is simple"); + border: e(this is simple); // bug in lessjs + border: e("this is simple", "cool lad"); + border: e(1232); + border: e(@hello); + border: e("one" + 'more'); // no string addition lessjs + border: e(); // syntax error lessjs + + line-height: ~"eating rice"; + line-height: ~"string cheese"; + line-height: a b c ~"string me" d e f; + line-height: ~"string @{hello}"; +} + +.class { + filter: ~"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image.png')"; +} diff --git a/vendors/lessphp/tests/inputs/font_family.less b/vendors/lessphp/tests/inputs/font_family.less new file mode 100644 index 000000000..c7186b57b --- /dev/null +++ b/vendors/lessphp/tests/inputs/font_family.less @@ -0,0 +1,28 @@ + +@font-directory: 'fonts/'; +@some-family: Gentium; + +@font-face: maroon; // won't collide with @font-face { } + +@font-face { + font-family: Graublau Sans Web; + src: url(@{font-directory}GraublauWeb.otf) format("opentype"); +} + +@font-face { + font-family: @some-family; + src: url('@{font-directory}Gentium.ttf'); +} + +@font-face { + font-family: @some-family; + src: url("@{font-directory}GentiumItalic.ttf"); + font-style: italic; +} + +h2 { + font-family: @some-family; + crazy: @font-face; +} + + diff --git a/vendors/lessphp/tests/inputs/guards.less b/vendors/lessphp/tests/inputs/guards.less new file mode 100644 index 000000000..20bdf240e --- /dev/null +++ b/vendors/lessphp/tests/inputs/guards.less @@ -0,0 +1,88 @@ + +.simple(@hi) when (@hi) { + color: yellow; +} + + +.something(@hi) when (@hi = cool) { + color: red; +} + +.another(@x) when (@x > 10) { + color: green; +} + + +.flipped(@x) when (@x =< 10) { + color: teal; +} + +.yeah(@arg) when (isnumber(@arg)) { + color: purple; +} + + +.yeah(@arg) when (ispixel(@arg)) { + color: silver; +} + + +.hello(@arg) when not (@arg) { + color: orange; +} + +dd { + .simple(true); + .simple(2344px); +} + +b { + .something(cool); + .something(birthday); +} + +img { + .another(12); + .another(2); + + .flipped(12); + .flipped(2); +} + +body { + .yeah("world"); + .yeah(232px); + .yeah(232); + + .hello(true); +} + +.something(@x) when (@x) and (@y), not (@x = what) { + color: blue; +} + +div { + @y: true; + .something(true); + +} + +pre { + .something(what); +} + + +.coloras(@g) when (iscolor(@g)) { + color: true @g; +} + +link { + .coloras(red); + .coloras(10px); + .coloras(ffjref); + .coloras(#fff); + .coloras(#fffddd); + .coloras(rgb(0,0,0)); + .coloras(rgba(0,0,0, .34)); +} + diff --git a/vendors/lessphp/tests/inputs/hacks.less b/vendors/lessphp/tests/inputs/hacks.less new file mode 100644 index 000000000..e69b7bf98 --- /dev/null +++ b/vendors/lessphp/tests/inputs/hacks.less @@ -0,0 +1,6 @@ +// css hacks + +:root .alert-message, :root .btn { + border-radius: 0 \0; +} + diff --git a/vendors/lessphp/tests/inputs/import.less b/vendors/lessphp/tests/inputs/import.less new file mode 100644 index 000000000..250d1a3f3 --- /dev/null +++ b/vendors/lessphp/tests/inputs/import.less @@ -0,0 +1,21 @@ + +@import 'file1.less'; // file found and imported + +@import "something.css" media; +@import url("something.css") media; +@import url(something.css) media, screen, print; + +@color: maroon; + +@import url(file2); // found and imported + +body { + line-height: 10em; + @colors; +} + +div { + @color: fuchsia; + @import "file2"; +} + diff --git a/vendors/lessphp/tests/inputs/keyframes.less b/vendors/lessphp/tests/inputs/keyframes.less new file mode 100644 index 000000000..e65a38b95 --- /dev/null +++ b/vendors/lessphp/tests/inputs/keyframes.less @@ -0,0 +1,52 @@ +@keyframes 'bounce' { + from { + top: 100px; + animation-timing-function: ease-out; + } + + 25% { + top: 50px; + animation-timing-function: ease-in; + } + + 50% { + top: 100px; + animation-timing-function: ease-out; + } + + 75% { + top: 75px; + animation-timing-function: ease-in; + } + + to { + top: 100px; + } +} + +@-webkit-keyframes flowouttoleft { + 0% { -webkit-transform: translateX(0) scale(1); } + 60%, 70% { -webkit-transform: translateX(0) scale(.7); } + 100% { -webkit-transform: translateX(-100%) scale(.7); } +} + +div { + animation-name: 'diagonal-slide'; + animation-duration: 5s; + animation-iteration-count: 10; +} + +@keyframes 'diagonal-slide' { + + from { + left: 0; + top: 0; + } + + to { + left: 100px; + top: 100px; + } + +} + diff --git a/vendors/lessphp/tests/inputs/math.less b/vendors/lessphp/tests/inputs/math.less new file mode 100644 index 000000000..3f4af2c7d --- /dev/null +++ b/vendors/lessphp/tests/inputs/math.less @@ -0,0 +1,116 @@ + +.unary { + // all operators are parsable as unary operators, anything + // but - throws an error right now though, + + // this gives two numbers + sub: 10 -5; + // add: 10 +5; // error + // div: 10 /5; // error + // mul: 10 *5; // error +} + +.spaces { + // we can make the parser do math by leaving out the + // space after the first value, or putting spaces on both sides + + sub: 10-5; + sub: 10 - 5; + + add: 10+5; + add: 10 + 5; + + // div: 10/5; // this wont work, read on + div: 10 / 5; + + mul: 10*5; + mul: 10 * 5; +} + +// these properties have divison not in parenthases +.supress-division { + border-radius: 10px / 10px; + border-radius: 10px/10px; + border-radius: hello (10px/10px) world; + @x: 10px; + font: @x/30 sans-serif; + font: 10px / 20px sans-serif; + font: 10px/20px sans-serif; + border-radius:0 15px 15px 15px / 0 50% 50% 50%; +} + + +.parens { + // if you are unsure, then just wrap the expression in parentheses and it will + // always evaluate. + + // notice we no longer have unary operators, and these will evaluate + sub: (10 -5); + add: (10 +5); + div: (10 /5); + div: (10/5); // no longer interpreted as the shorthand + mul: (10 *5); +} + +.keyword-names { + // watch out when doing math with keywords, - is a valid keyword character + @a: 100; + @b: 25; + @a-: "hello"; + height: @a-@b; // here we get "hello" 25, not 75 +} + + +.negation { + hello: -(1px); + hello: 0-(1px); + + @something: 10; + hello: -@something; +} + + +// and now here are the tests + +.test { + single: (5); + single: 5+(5); + single: (5)+((5)); + + parens: (5 +(5)) -2; + // parens: ((5 +(5)) -2); // FAILS - fixme + + math: (5 + 5)*(2 / 1); + math: (5+5)*(2/1); + + width: 2 * (4 * (2 + (1 + 6))) - 1; + height: ((2+3)*(2+3) / (9-4)) + 1; + padding: (2px + 4px) 1em 2px 2; + + @var: (2 * 2); + padding: (2 * @var) 4 4 (@var * 1px); + width: (@var * @var) * 6; + height: (7 * 7) + (8 * 8); + margin: 4 * (5 + 5) / 2 - (@var * 2); +} + +.percents { + color: 100 * 10%; + color: 10% * 100; + color: 10% * 10%; + + color: 100px * 10%; // lessjs makes this px + color: 10% * 100px; // lessjs makes this % + + color: 20% + 10%; + color: 20% - 10%; + + color: 20% / 10%; +} + +.misc { + x: 10px * 4em; + y: 10 * 4em; + +} + diff --git a/vendors/lessphp/tests/inputs/media.less b/vendors/lessphp/tests/inputs/media.less new file mode 100644 index 000000000..0e65d942f --- /dev/null +++ b/vendors/lessphp/tests/inputs/media.less @@ -0,0 +1,38 @@ +@media screen, 3D { + P { color: green; } +} +@media print { + body { font-size: 10pt } +} +@media screen { + body { font-size: 13px } +} +@media screen, print { + body { line-height: 1.2 } +} + +@media all and (min-width: 0px) { + body { line-height: 1.2 } +} + +@media all and (min-width: 0) { + body { line-height: 1.2 } +} + +@media + screen and (min-width: 102.5em) and (max-width: 117.9375em), + screen and (min-width: 150em) { + body { color: blue } +} + + +@media screen and (min-height: 100px + 10px) { + body { color: red; } +} + +@cool: 100px; + +@media screen and (height: @cool) and (width: @cool + 10), (size: @cool + 20) { + body { color: red; } +} + diff --git a/vendors/lessphp/tests/inputs/misc.less b/vendors/lessphp/tests/inputs/misc.less new file mode 100644 index 000000000..86bd8f706 --- /dev/null +++ b/vendors/lessphp/tests/inputs/misc.less @@ -0,0 +1,84 @@ + +@hello: "utf-8"; +@charset @hello; + +@color: #fff; +@base_path: "/assets/images/"; +@images: @base_path + "test/"; +.topbar { background: url(@{images}topbar.png); } +.hello { test: empty-function(@images, 40%, to(@color)); } + +.css3 { + background-image: -webkit-gradient(linear, 0% 0%, 0% 90%, + from(#E9A000), to(#A37000)); +} + + +/** + +Here is a block comment + +**/ + + +// this is a comment + +.test, /*hello*/.world { + border: 1px solid red; // world + /* another property */ + color: url(http://mage-page.com); + string: "hello /* this is not a comment */"; + world: "// neither is this"; + string: 'hello /* this is not a comment */' /*what if this is a comment */; + world: '// neither is this' // hell world; + ; + what-/*something?*/ever: 100px; + background: url(/*no comment here*/); +} + + +.urls { + @var: "http://google.com"; + background: url(@var); + background: url(@{var}); + background: url("@{var}"); +} + +.mix(@arg) { color: @arg; } +@aaa: aaa; +@bbb: bbb; +// make sure the opening selector isn't too greedy +.cool {.mix("@{aaa}, @{bbb}")} +.cool(); + +.cool("{hello"); +.cool('{hello'); + + +// merging of mixins +.span-17 { float: left; } +.span-17 { width: 660px; } + +.x {.span-17;} + +.hi { + pre { + color: red; + } +} + +.hi { + pre { + color: blue; + } +} + +.rad { + .hi; +} + + +@page :left { margin-left: 4cm; } +@page :right { margin-left: 3cm; } +@page { margin: 2cm } + diff --git a/vendors/lessphp/tests/inputs/mixin_functions.less b/vendors/lessphp/tests/inputs/mixin_functions.less new file mode 100644 index 000000000..fc9d57901 --- /dev/null +++ b/vendors/lessphp/tests/inputs/mixin_functions.less @@ -0,0 +1,40 @@ + +@outer: 10px; +@class(@var:22px, @car: 400px + @outer) { + margin: @var; + height: @car; +} + +@group { + @f(@color) { + color: @color; + } + .cool { + border-bottom: 1px solid green; + } +} + +.class(@width:200px) { + padding: @width; +} + +body { + .class(2.0em); + @group > @f(red); + @class(10px, 10px + 2); + @group > .cool; +} + + +@lots(@a: 10px, @b: 20px, @c: 30px, @d: 40px, @e: 4px, @f:3px, @g:2px, @h: 1px) { + padding: @a @b @c @d; + margin: @e @f @g @h; +} + +.skip_args { + @class(,12px); + @lots(,,,88px,,12px); + @group > @f(red,,,,); + @group > @f(red); +} + diff --git a/vendors/lessphp/tests/inputs/mixin_merging.less.disable b/vendors/lessphp/tests/inputs/mixin_merging.less.disable new file mode 100644 index 000000000..6b25e421f --- /dev/null +++ b/vendors/lessphp/tests/inputs/mixin_merging.less.disable @@ -0,0 +1,100 @@ + +@tester { + p, div { height: 10px; } +} + +#test1 { + div { color: red; } + @tester; +} + + +@cool { + a,b,i { width: 1px; } +} + +#test2 { + b { color: red; } + @cool; +} + +#test3 { + @cool; + b { color: red; } +} + +@cooler { + a { margin: 1px; } +} + +#test4 { + a, div, html { color: blue; } + @cooler; +} + +@hi { + img, strong { float: right; } +} + +#test5 { + img, strong { padding: 2px; } + @hi; +} + +@nested { + div, span { + a { + color: red; + } + } +} + +#test6 { + div, span { + a { + line-height: 10px; + } + } + @nested; +} + +@broken-nesting { + div, span { + strong, b { + color: red; + } + } + +} + +#test7 { + div { + strong { + margin: 1px; + } + } + @broken-nesting; +} + + +@another-nest { + a,b { + i { + color: red; + } + + s { + color: blue; + } + } +} + +#test8 { + a, b { + i,s { + background: red; + } + } + @another-nest; +} + diff --git a/vendors/lessphp/tests/inputs/mixins.less b/vendors/lessphp/tests/inputs/mixins.less new file mode 100644 index 000000000..259db3def --- /dev/null +++ b/vendors/lessphp/tests/inputs/mixins.less @@ -0,0 +1,126 @@ + +@rounded-corners { + border-radius: 10px; +} + +.bold { + @font-size: 20px; + font-size: @font-size; + font-weight: bold; +} + +body #window { + @rounded-corners; + .bold; + line-height: @font-size * 1.5; +} + +#bundle { + .button { + display: block; + border: 1px solid black; + background-color: grey; + &:hover { background-color: white } + } +} +#header a { + color: orange; + #bundle > .button; // mixin the button class +} + +div { + @abstract { + hello: world; + b { + color: blue; + } + } + + @abstract > b; + @abstract; +} + +@poop { + big: baby; +} + +body { + div; +} + +// not using > to list mixins + +.hello { + .world { + color: blue; + } +} + +.foobar { + .hello .world; +} + + +.butter { + .this .one .isnt .found; +} + + +// arguments + +.spam(@something: 100, @dad: land) { + @wow: 23434; + foo: @arguments; + bar: @arguments; +} + +.eggs { + .spam(1px, 2px); + .spam(); +} + +.first(@one, @two, @three, @four: cool) { + cool: @arguments; +} + +#hello { + .first(one, two, three); +} + +#hello-important { + .first(one, two, three) !important; +} + +.rad(@name) { + cool: @arguments; +} + +#world { + @hello: "world"; + .rad("@{hello}"); +} + +.second(@x, @y:skip, @z: me) { + things: @arguments; +} + +#another { + .second(red, blue, green); + .second(red blue green); +} + + +.another(@x, @y:skip, @z:me) { + .cool { + color: @arguments; + } +} + +#day { + .another(one,two, three); + .another(one two three); +} + + + + diff --git a/vendors/lessphp/tests/inputs/nested.less b/vendors/lessphp/tests/inputs/nested.less new file mode 100644 index 000000000..0b62ea19b --- /dev/null +++ b/vendors/lessphp/tests/inputs/nested.less @@ -0,0 +1,60 @@ +#header { + color: black; + + .navigation { + font-size: 12px; + .border { + .outside { + color: blue; + } + } + } + .logo { + width: 300px; + &:hover { text-decoration: none } + } +} + +a { b { ul { li { color: green; } } } } + +this { will { not { show { } } } } + +.cool { + div & { color: green; } + p & span { color: yellow; } +} + +another { + .cool; +} + +b { + & .something { + color: blue; + } + + &.something { + color: blue; + } +} + +.foo { + .bar, .baz { + & .qux { + display: block; + } + .qux & { + display: inline; + } + .qux & .biz { + display: none; + } + } +} + +b { + hello [x="&yeah"] { + color: red; + } +} + diff --git a/vendors/lessphp/tests/inputs/pattern_matching.less b/vendors/lessphp/tests/inputs/pattern_matching.less new file mode 100644 index 000000000..e875473d3 --- /dev/null +++ b/vendors/lessphp/tests/inputs/pattern_matching.less @@ -0,0 +1,167 @@ + +.demo (light, @color) { + color: lighten(@color, 10%); +} +.demo (@_, @color) { + display: block; +} + +@switch: light; + +.class { + .demo(@switch, #888); +} + +// by arity + +.mixin () { + zero: 0; +} +.mixin (@a: 1px) { + one: 1; +} +.mixin (@a) { + one-req: 1; +} +.mixin (@a: 1px, @b: 2px) { + two: 2; +} + +.mixin (@a, @b, @c) { + three-req: 3; +} + +.mixin (@a: 1px, @b: 2px, @c: 3px) { + three: 3; +} + +.zero { + .mixin(); +} + +.one { + .mixin(1); +} + +.two { + .mixin(1, 2); +} + +.three { + .mixin(1, 2, 3); +} + +// + +.mixout ('left') { + left: 1; +} + +.mixout ('right') { + right: 1; +} + +.left { + .mixout('left'); +} +.right { + .mixout('right'); +} + +// + +.border (@side, @width) { + color: black; + .border-side(@side, @width); +} +.border-side (left, @w) { + border-left: @w; +} +.border-side (right, @w) { + border-right: @w; +} + +.border-right { + .border(right, 4px); +} +.border-left { + .border(left, 4px); +} + +// + + +.border-radius (@r) { + both: @r * 10; +} +.border-radius (@r, left) { + left: @r; +} +.border-radius (@r, right) { + right: @r; +} + +.only-right { + .border-radius(33, right); +} +.only-left { + .border-radius(33, left); +} +.left-right { + .border-radius(33); +} + +.hola(hello, @hello...) { + color: blue; +} + +#hola { + .hola(hello, world); + .hola(jello, world); +} + +.resty(@hello, @world, @the_rest...) { + padding: @hello @world; + rest: @the_rest; +} + +#nnn { + .body(10, 10, 10, 10, 10); + .body(10, 10, 10); + .body(10, 10); + .body(10); + .body(); +} + +.defaults(@aa, @bb:e343, @cc: "heah", ...) { + height: @aa; +} + +#defaults_1 { + .defaults(); + .defaults(one); + .defaults(two, one); + .defaults(three, two, one); + .defaults(four, three, two, one); +} + + +.thing() { color: green; } +.thing(...) { color: blue; } +.thing { color: red; } + +#aa { + .thing(); +} + +#bb { + .thing; +} + + +#cc { + .thing(1); +} + + + diff --git a/vendors/lessphp/tests/inputs/scopes.less b/vendors/lessphp/tests/inputs/scopes.less new file mode 100644 index 000000000..0ddbfac20 --- /dev/null +++ b/vendors/lessphp/tests/inputs/scopes.less @@ -0,0 +1,40 @@ + + +@a: 10; +@some { + @b: @a + 10; + div { + @c: @b + 10; + other { + @d: @c + 10; + world { + @e: @d + 10; + height: @e; + } + } + } +} + + +body { + @some; +} + +@some; + +.test(@x: 10) { + height: @x; + .test(@y: 11) { + height: @y; + .test(@z: 12) { + height: @z; + } + .test; + } + .test; +} + +pre { + .test; +} + diff --git a/vendors/lessphp/tests/inputs/selector_expressions.less b/vendors/lessphp/tests/inputs/selector_expressions.less new file mode 100644 index 000000000..a16c1d23a --- /dev/null +++ b/vendors/lessphp/tests/inputs/selector_expressions.less @@ -0,0 +1,29 @@ + +@color: blue; + +(~"something @{color}"), world { + color: blue; +} + +.div { + @color: red; + (3434) { + height: 100px; + } + + (~"cool @{color}") { + height: 4000px; + } +} + +.heck(@a) { color: @a+10 } + +.spanX (@index) when (@index > 0) { + (~".span@{index}") { .heck(@index) } + .spanX(@index - 1); +} +.spanX (0) {} + +.spanX (5); + + diff --git a/vendors/lessphp/tests/inputs/site_demos.less b/vendors/lessphp/tests/inputs/site_demos.less new file mode 100644 index 000000000..136a99ac8 --- /dev/null +++ b/vendors/lessphp/tests/inputs/site_demos.less @@ -0,0 +1,120 @@ +// these are the demos from the lessphp homepage + +default { + @base: 24px; + @border-color: #B2B; + + .underline { border-bottom: 1px solid green } + + #header { + color: black; + border: 1px solid @border-color + #222222; + + .navigation { + font-size: @base / 2; + a { + .underline; + } + } + .logo { + width: 300px; + &:hover { text-decoration: none } + } + } +} + +variables { + @a: 2; + @x: @a * @a; + @y: @x + 1; + @z: @x * 2 + @y; + + @nice-blue: #5B83AD; + @light-blue: @nice-blue + #111; + + @b: @a * 10; + @c: #888; + @fonts: "Trebuchet MS", Verdana, sans-serif; + + .variables { + width: @z + 1cm; // 14cm + height: @b + @x + 0px; // 24px + color: @c; + background: @light-blue; + font-family: @fonts; + } +} + +mixins { + .bordered { + border-top: dotted 1px black; + border-bottom: solid 2px black; + } + #menu a { + color: #111; + .bordered; + } + + .post a { + color: red; + .bordered; + } +} + +nested-rules { + #header { + color: black; + + .navigation { + font-size: 12px; + } + .logo { + width: 300px; + &:hover { text-decoration: none } + } + } +} + +namespaces { + #bundle { + .button { + display: block; + border: 1px solid black; + background-color: grey; + &:hover { background-color: white } + } + } + #header a { + color: orange; + #bundle > .button; // mixin the button class + } +} + +mixin-functions { + @outer: 10px; + @class(@var:22px, @car: 400px + @outer) { + margin: @var; + height: @car; + } + + @group { + @f(@color) { + color: @color; + } + .cool { + border-bottom: 1px solid green; + } + } + + .class(@width:200px) { + padding: @width; + } + + body { + .class(2.0em); + @group > @f(red); + @class(10px, 10px + 2); + @group > .cool; + } +} + diff --git a/vendors/lessphp/tests/inputs/test-imports/file1.less b/vendors/lessphp/tests/inputs/test-imports/file1.less new file mode 100644 index 000000000..658de0c53 --- /dev/null +++ b/vendors/lessphp/tests/inputs/test-imports/file1.less @@ -0,0 +1,16 @@ + + +/** + * This is a test import file + */ + +@colors { + div.bright { + color: red; + } + + div.sad { + color: blue; + } +} + diff --git a/vendors/lessphp/tests/inputs/test-imports/file2.less b/vendors/lessphp/tests/inputs/test-imports/file2.less new file mode 100644 index 000000000..2cae8dce0 --- /dev/null +++ b/vendors/lessphp/tests/inputs/test-imports/file2.less @@ -0,0 +1,6 @@ + +b { + color: @color; + padding: 16px; +} + diff --git a/vendors/lessphp/tests/inputs/variables.less b/vendors/lessphp/tests/inputs/variables.less new file mode 100644 index 000000000..6c4ef8fb4 --- /dev/null +++ b/vendors/lessphp/tests/inputs/variables.less @@ -0,0 +1,45 @@ +@a: 2; +@x: @a * @a; +@y: @x + 1; +@z: @y + @x * 2; +@m: @z % @y; + +@nice-blue: #5B83AD; +@light-blue: @nice-blue + #111; + +@rgb-color: rgb(20%, 15%, 80%); +@rgba-color: rgba(23,68,149,0.5); + +@b: @a * 10px; +@c: #888; +@fonts: "Trebuchet MS", Verdana, sans-serif; + +.variables { + width: @z + 1cm; // 14cm + height: @b + @x + 0px; // 24px + margin-top: -@b; // -20px + margin-bottom: 10 - -@b; // 30px + @d: @c + #001; + color: @d; + background: @light-blue; + font-family: @fonts; + margin: @m + 0px; // 3px + font: 10px/12px serif; + font: 120%/120% serif; +} + +.external { + color: @c; + border: 1px solid @rgb-color; + background: @rgba-color; + padding: @nonexistant + 4px; +} + +@hello: 44px; +@something: "hello"; +@cool: something; + +color: @@something; +color: @@@cool; + + diff --git a/vendors/lessphp/tests/outputs/accessors.css b/vendors/lessphp/tests/outputs/accessors.css new file mode 100644 index 000000000..e6c01a72c --- /dev/null +++ b/vendors/lessphp/tests/outputs/accessors.css @@ -0,0 +1,14 @@ +.article { color:#294366; } +.comment { + width:960px; + color:#294366; + padding:10px; +} +.wow { + height:960px; + background-color:#294366; + color:green; + padding:; + margin:; +} +.mix { font-size:10px; }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/arity.css b/vendors/lessphp/tests/outputs/arity.css new file mode 100644 index 000000000..7900e4087 --- /dev/null +++ b/vendors/lessphp/tests/outputs/arity.css @@ -0,0 +1,25 @@ +.one { + color:one; + color:one; +} +.two { + color:two; + color:two; +} +.three { + color:three; + color:three; +} +.multi-foo { + color:two; + color:three; + color:two; + color:three; + color:three; +} +.multi-baz { + color:two; + color:three; + color:two; + color:three; +}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/attributes.css b/vendors/lessphp/tests/outputs/attributes.css new file mode 100644 index 000000000..229f7cf36 --- /dev/null +++ b/vendors/lessphp/tests/outputs/attributes.css @@ -0,0 +1,35 @@ +* { color:blue; } +E { color:blue; } +E[foo] { color:blue; } +[foo] { color:blue; } +[foo] .helloWorld { color:blue; } +[foo].helloWorld { color:blue; } +E[foo="barbar"] { color:blue; } +E[foo~="hello#$@%@$#^"] { color:blue; } +E[foo^="color: green;"] { color:blue; } +E[foo$="239023"] { color:blue; } +E[foo*="29302"] { color:blue; } +E[foo|="239032"] { color:blue; } +E:root { color:blue; } +E:nth-child(odd) { color:blue; } +E:nth-child(2n+1) { color:blue; } +E:nth-child(5) { color:blue; } +E:nth-last-child(-n+2) { color:blue; } +E:nth-of-type(2n) { color:blue; } +E:nth-last-of-type(n) { color:blue; } +E:first-child { color:blue; } +E:last-child { color:blue; } +E:first-of-type { color:blue; } +E:last-of-type { color:blue; } +E:only-child { color:blue; } +E:only-of-type { color:blue; } +E:empty { color:blue; } +E:lang(en) { color:blue; } +E::first-line { color:blue; } +E::before { color:blue; } +E#id { color:blue; } +E:not(:link) { color:blue; } +E F { color:blue; } +E > F { color:blue; } +E + F { color:blue; } +E ~ F { color:blue; }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/builtins.css b/vendors/lessphp/tests/outputs/builtins.css new file mode 100644 index 000000000..1787e0ba3 --- /dev/null +++ b/vendors/lessphp/tests/outputs/builtins.css @@ -0,0 +1,20 @@ +body { + color:"hello world"; + height:5.1666666666667; + height:5px; + height:6px; + width:0.66666666666667; + width:1; + width:0; + width:1; + width:3px; + color:#00112233; + color:#992c3742; +} +format { + format:"rgb(32, 128, 64)"; + format-string:"hello world"; + format-multiple:"hello earth 2"; + format-url-encode:'red is %A'; + eformat:rgb(32, 128, 64); +}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/colors.css b/vendors/lessphp/tests/outputs/colors.css new file mode 100644 index 000000000..51eb152b5 --- /dev/null +++ b/vendors/lessphp/tests/outputs/colors.css @@ -0,0 +1,69 @@ +body { + color:#996d33; + color:rgba(153,109,51,0.3); + lighten:#fff; + lighten:#7c8df2; + lighten:rgba(222,140,129,0.5); + darken:#d6d6d6; + darken:#0d1e81; + darken:rgba(18,42,185,0.5); + saturate:#f1eded; + saturate:#0025fe; + saturate:rgba(10,44,244,0.5); + desaturate:#efefef; + desaturate:#3349cb; + desaturate:rgba(36,62,218,0.5); + spin:#efefef; + spin:#2d17e7; + spin:rgba(59,23,231,0.5); + spin:#efefef; + spin:#1769e7; + spin:rgba(23,119,231,0.5); + one:#abcdef; + one:#abcdef; + two:rgba(2,159,35,0.9); + two:rgba(2,159,35,0.9); + three:rgba(1,2,3,0.6); + three:rgba(1,2,3,0.6); + four:rgba(1,2,3,0); + four:rgba(1,2,3,0); + hue:282; + sat:33; + lit:12; + what:#dff1da; + zero:#343434; + zero:#003468; + zero:#000; + zero:#fff; + zero:#000; + zero:#fff; + zero:#fff; + zero:#fff; + zero:#1d5612; + zero:#56124b; + zero:#000; + zero:#fff; +} +alpha { + g:0; + g:1; +} +fade { + f:rgba(255,0,0,0.5); + f:rgba(255,255,255,0.2); + f:rgba(34,23,64,0.5); +} +.mix { color:#808080; } +.percent { per:50%; } +.colorz { + color:#ebebeb; + color:#ff9100; +} +body { + start:#fcf8e3; + spin:#fcf4e3; + chained:#fbeed5; + direct:#fbefd5; +} +pre { spin:#f2dee1; } +dd { background-color:#f5f5f5; }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/compile_on_mixin.css b/vendors/lessphp/tests/outputs/compile_on_mixin.css new file mode 100644 index 000000000..b1a3d7fcc --- /dev/null +++ b/vendors/lessphp/tests/outputs/compile_on_mixin.css @@ -0,0 +1,11 @@ +body { height:22px; } +body ul { height:20px; } +body ul li { height:10px; } +body ul li div span, body ul li link { + margin:10px; + color:red; +} +body ul div, body ul p { border:1px; } +body ul div.hello, body ul p.hello { color:green; } +body ul div :what, body ul p :what { color:blue; } +body ul a b { color:blue; }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/escape.css b/vendors/lessphp/tests/outputs/escape.css new file mode 100644 index 000000000..a310fe009 --- /dev/null +++ b/vendors/lessphp/tests/outputs/escape.css @@ -0,0 +1,14 @@ +body { + border:this is simple; + border:this; + border:this is simple; + border:1232; + border:world; + border:onemore; + border:; + line-height:eating rice; + line-height:string cheese; + line-height:a b c string me d e f; + line-height:string world; +} +.class { filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image.png'); }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/font_family.css b/vendors/lessphp/tests/outputs/font_family.css new file mode 100644 index 000000000..afbc996d3 --- /dev/null +++ b/vendors/lessphp/tests/outputs/font_family.css @@ -0,0 +1,17 @@ +@font-face { + font-family:Graublau Sans Web; + src:url(fonts/GraublauWeb.otf) format("opentype"); +} +@font-face { + font-family:Gentium; + src:url('fonts/Gentium.ttf'); +} +@font-face { + font-family:Gentium; + src:url("fonts/GentiumItalic.ttf"); + font-style:italic; +} +h2 { + font-family:Gentium; + crazy:maroon; +}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/guards.css b/vendors/lessphp/tests/outputs/guards.css new file mode 100644 index 000000000..db110aa9d --- /dev/null +++ b/vendors/lessphp/tests/outputs/guards.css @@ -0,0 +1,23 @@ +dd { color:yellow; } +b { + color:red; + color:blue; + color:blue; +} +img { + color:green; + color:teal; +} +body { + color:purple; + color:silver; + color:purple; +} +div { color:blue; } +link { + color:true red; + color:true #fff; + color:true #fffddd; + color:true #000; + color:true rgba(0,0,0,0.34); +}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/hacks.css b/vendors/lessphp/tests/outputs/hacks.css new file mode 100644 index 000000000..984faa6e5 --- /dev/null +++ b/vendors/lessphp/tests/outputs/hacks.css @@ -0,0 +1 @@ +:root .alert-message, :root .btn { border-radius:0 \0; }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/import.css b/vendors/lessphp/tests/outputs/import.css new file mode 100644 index 000000000..4d50ba598 --- /dev/null +++ b/vendors/lessphp/tests/outputs/import.css @@ -0,0 +1,14 @@ +@import url("something.css") media; +@import url("something.css") media; +@import url("something.css") media, screen, print; +b { + color:maroon; + padding:16px; +} +body { line-height:10em; } +body div.bright { color:red; } +body div.sad { color:blue; } +div b { + color:fuchsia; + padding:16px; +}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/keyframes.css b/vendors/lessphp/tests/outputs/keyframes.css new file mode 100644 index 000000000..d01f05b77 --- /dev/null +++ b/vendors/lessphp/tests/outputs/keyframes.css @@ -0,0 +1,47 @@ +@keyframes 'bounce' { + from { + top:100px; + animation-timing-function:ease-out; + } + 25% { + top:50px; + animation-timing-function:ease-in; + } + 50% { + top:100px; + animation-timing-function:ease-out; + } + 75% { + top:75px; + animation-timing-function:ease-in; + } + to { + top:100px; + } +} +@-webkit-keyframes flowouttoleft { + 0% { + -webkit-transform:translateX(0) scale(1); + } + 60%, 70% { + -webkit-transform:translateX(0) scale(.7); + } + 100% { + -webkit-transform:translateX(-100%) scale(.7); + } +} +div { + animation-name:'diagonal-slide'; + animation-duration:5s; + animation-iteration-count:10; +} +@keyframes 'diagonal-slide' { + from { + left:0; + top:0; + } + to { + left:100px; + top:100px; + } +}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/math.css b/vendors/lessphp/tests/outputs/math.css new file mode 100644 index 000000000..bcd66839e --- /dev/null +++ b/vendors/lessphp/tests/outputs/math.css @@ -0,0 +1,61 @@ +.unary { sub:10 -5; } +.spaces { + sub:5; + sub:5; + add:15; + add:15; + div:2; + mul:50; + mul:50; +} +.supress-division { + border-radius:10px/10px; + border-radius:10px/10px; + border-radius:hello(10px/10px) world; + font:10px/30 sans-serif; + font:10px/20px sans-serif; + font:10px/20px sans-serif; + border-radius:0 15px 15px 15px/0 50% 50% 50%; +} +.parens { + sub:5; + add:15; + div:2; + div:2; + mul:50; +} +.keyword-names { height:"hello" 25; } +.negation { + hello:-1px; + hello:-1px; + hello:-10; +} +.test { + single:5; + single:10; + single:10; + parens:10 -2; + math:20; + math:20; + width:71; + height:6; + padding:6px 1em 2px 2; + padding:8 4 4 4px; + width:96; + height:113; + margin:12; +} +.percents { + color:1000%; + color:1000%; + color:100%; + color:1000px; + color:1000%; + color:30%; + color:10%; + color:2%; +} +.misc { + x:40px; + y:40em; +}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/media.css b/vendors/lessphp/tests/outputs/media.css new file mode 100644 index 000000000..cb5683fd4 --- /dev/null +++ b/vendors/lessphp/tests/outputs/media.css @@ -0,0 +1,28 @@ +@media screen, 3D { + P { color:green; } +} +@media print { + body { font-size:10pt; } +} +@media screen { + body { font-size:13px; } +} +@media screen, print { + body { line-height:1.2; } +} +@media all and (min-width: 0px) { + body { line-height:1.2; } +} +@media all and (min-width: 0) { + body { line-height:1.2; } +} +@media screen and (min-width: 102.5em) and (max-width: 117.9375em), + screen and (min-width: 150em) { + body { color:blue; } +} +@media screen and (min-height: 110px) { + body { color:red; } +} +@media screen and (height: 100px) and (width: 110px), (size: 120px) { + body { color:red; } +}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/misc.css b/vendors/lessphp/tests/outputs/misc.css new file mode 100644 index 000000000..8d85268c8 --- /dev/null +++ b/vendors/lessphp/tests/outputs/misc.css @@ -0,0 +1,40 @@ +@charset "utf-8"; +color:"aaa, bbb"; +.topbar { background:url(/assets/images/test/topbar.png); } +.hello { test:empty-function("/assets/images/test/",40%,to(#fff)); } +.css3 { background-image:-webkit-gradient(linear,0% 0%,0% 90%,from(#e9a000),to(#a37000)); } +.test, .world { + border:1px solid red; + color:url(http://mage-page.com); + string:"hello /* this is not a comment */"; + world:"// neither is this"; + string:'hello /* this is not a comment */'; + world:'// neither is this'; + what-ever:100px; + background:url(/*no comment here*/); +} +.urls { + background:url("http://google.com"); + background:url(http://google.com); + background:url("http://google.com"); +} +.cool { color:"aaa, bbb"; } +.span-17 { float:left; } +.span-17 { width:660px; } +.x { + float:left; + width:660px; +} +.hi pre { color:red; } +.hi pre { color:blue; } +.rad pre { color:red; } +.rad pre { color:blue; } +@page :left { + margin-left:4cm; +} +@page :right { + margin-left:3cm; +} +@page { + margin:2cm; +}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/mixin_functions.css b/vendors/lessphp/tests/outputs/mixin_functions.css new file mode 100644 index 000000000..91b61492e --- /dev/null +++ b/vendors/lessphp/tests/outputs/mixin_functions.css @@ -0,0 +1,14 @@ +body { + padding:2.0em; + color:red; + margin:10px; + height:12px; + border-bottom:1px solid green; +} +.skip_args { + margin:22px; + height:12px; + padding:10px 20px 30px 88px; + margin:4px 12px 2px 1px; + color:red; +}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/mixin_merging.css b/vendors/lessphp/tests/outputs/mixin_merging.css new file mode 100644 index 000000000..9ec360c21 --- /dev/null +++ b/vendors/lessphp/tests/outputs/mixin_merging.css @@ -0,0 +1,42 @@ +#test1 div { + color:red; + height:10px; +} +#test1 p { height:10px; } +#test2 b { + color:red; + width:1px; +} +#test2 a, #test2 i { width:1px; } +#test3 a, #test3 i { width:1px; } +#test3 b { + width:1px; + color:red; +} +#test4 a { + color:blue; + margin:1px; +} +#test4 div, #test4 html { color:blue; } +#test5 img, #test5 strong { + padding:2px; + float:right; +} +#test6 div a, #test6 span a { + line-height:10px; + color:red; +} +#test7 div strong { + margin:1px; + color:red; +} +#test7 div b { color:red; } +#test7 span strong, #test7 span b { color:red; } +#test8 a i, #test8 b i { + background:red; + color:red; +} +#test8 a s, #test8 b s { + background:red; + color:blue; +}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/mixins.css b/vendors/lessphp/tests/outputs/mixins.css new file mode 100644 index 000000000..70a99003d --- /dev/null +++ b/vendors/lessphp/tests/outputs/mixins.css @@ -0,0 +1,50 @@ +.bold { + font-size:20px; + font-weight:bold; +} +body #window { + line-height:0; + border-radius:10px; + font-size:20px; + font-weight:bold; +} +#bundle .button { + display:block; + border:1px solid black; + background-color:grey; +} +#bundle .button:hover { background-color:white; } +#header a { + color:orange; + display:block; + border:1px solid black; + background-color:grey; +} +#header a:hover { background-color:white; } +div { + color:blue; + hello:world; +} +div b { color:blue; } +body { + color:blue; + hello:world; +} +body b { color:blue; } +.hello .world { color:blue; } +.foobar { color:blue; } +.eggs { + foo:1px 2px; + bar:1px 2px; + foo:100 land; + bar:100 land; +} +#hello { cool:one two three cool; } +#hello-important { cool:one two three cool !important; } +#world { cool:"world"; } +#another { + things:red blue green; + things:red blue green skip me; +} +#day .cool { color:one two three; } +#day .cool { color:one two three skip me; }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/nested.css b/vendors/lessphp/tests/outputs/nested.css new file mode 100644 index 000000000..0845fb6ff --- /dev/null +++ b/vendors/lessphp/tests/outputs/nested.css @@ -0,0 +1,16 @@ +#header { color:black; } +#header .navigation { font-size:12px; } +#header .navigation .border .outside { color:blue; } +#header .logo { width:300px; } +#header .logo:hover { text-decoration:none; } +a b ul li { color:green; } +div .cool { color:green; } +p .cool span { color:yellow; } +div another { color:green; } +p another span { color:yellow; } +b .something { color:blue; } +b.something { color:blue; } +.foo .bar .qux, .foo .baz .qux { display:block; } +.qux .foo .bar, .qux .foo .baz { display:inline; } +.qux .foo .bar .biz, .qux .foo .baz .biz { display:none; } +b hello [x="&yeah"] { color:red; }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/nesting.css b/vendors/lessphp/tests/outputs/nesting.css new file mode 100644 index 000000000..908c1d814 --- /dev/null +++ b/vendors/lessphp/tests/outputs/nesting.css @@ -0,0 +1,6 @@ +#header .navigation .border .outside { color:blue; } +#header .navigation { font-size:12px; } +#header .logo:hover { text-decoration:none; } +#header .logo { width:300px; } +#header { color:black; } +a b ul li { color:green; }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/pattern_matching.css b/vendors/lessphp/tests/outputs/pattern_matching.css new file mode 100644 index 000000000..f83ace15f --- /dev/null +++ b/vendors/lessphp/tests/outputs/pattern_matching.css @@ -0,0 +1,56 @@ +.class { + color:#a2a2a2; + display:block; +} +.zero { + zero:0; + one:1; + two:2; + three:3; +} +.one { + one:1; + one-req:1; + two:2; + three:3; +} +.two { + two:2; + three:3; +} +.three { + three-req:3; + three:3; +} +.left { left:1; } +.right { right:1; } +.border-right { + color:black; + border-right:4px; +} +.border-left { + color:black; + border-left:4px; +} +.only-right { right:33; } +.only-left { left:33; } +.left-right { both:330; } +#hola { color:blue; } +#defaults_1 { + height:one; + height:two; + height:three; + height:four; +} +.thing { color:red; } +#aa { + color:green; + color:blue; + color:red; +} +#bb { + color:green; + color:blue; + color:red; +} +#cc { color:blue; }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/scopes.css b/vendors/lessphp/tests/outputs/scopes.css new file mode 100644 index 000000000..23d1551ca --- /dev/null +++ b/vendors/lessphp/tests/outputs/scopes.css @@ -0,0 +1,7 @@ +body div other world { height:50; } +div other world { height:50; } +pre { + height:10; + height:11; + height:12; +}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/selector_expressions.css b/vendors/lessphp/tests/outputs/selector_expressions.css new file mode 100644 index 000000000..78dc4bb92 --- /dev/null +++ b/vendors/lessphp/tests/outputs/selector_expressions.css @@ -0,0 +1,8 @@ +something blue, world { color:blue; } +.div 3434 { height:100px; } +.div cool red { height:4000px; } +.span5 { color:15; } +.span4 { color:14; } +.span3 { color:13; } +.span2 { color:12; } +.span1 { color:11; }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/site_demos.css b/vendors/lessphp/tests/outputs/site_demos.css new file mode 100644 index 000000000..2c853af4c --- /dev/null +++ b/vendors/lessphp/tests/outputs/site_demos.css @@ -0,0 +1,54 @@ +default .underline { border-bottom:1px solid green; } +default #header { + color:black; + border:1px solid #d4d; +} +default #header .navigation { font-size:12px; } +default #header .navigation a { border-bottom:1px solid green; } +default #header .logo { width:300px; } +default #header .logo:hover { text-decoration:none; } +variables .variables { + width:14cm; + height:24px; + color:#888; + background:#6c94be; + font-family:"Trebuchet MS", Verdana, sans-serif; +} +mixins .bordered { + border-top:dotted 1px black; + border-bottom:solid 2px black; +} +mixins #menu a { + color:#111; + border-top:dotted 1px black; + border-bottom:solid 2px black; +} +mixins .post a { + color:red; + border-top:dotted 1px black; + border-bottom:solid 2px black; +} +nested-rules #header { color:black; } +nested-rules #header .navigation { font-size:12px; } +nested-rules #header .logo { width:300px; } +nested-rules #header .logo:hover { text-decoration:none; } +namespaces #bundle .button { + display:block; + border:1px solid black; + background-color:grey; +} +namespaces #bundle .button:hover { background-color:white; } +namespaces #header a { + color:orange; + display:block; + border:1px solid black; + background-color:grey; +} +namespaces #header a:hover { background-color:white; } +mixin-functions body { + padding:2.0em; + color:red; + margin:10px; + height:12px; + border-bottom:1px solid green; +}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/variables.css b/vendors/lessphp/tests/outputs/variables.css new file mode 100644 index 000000000..4c7e5e669 --- /dev/null +++ b/vendors/lessphp/tests/outputs/variables.css @@ -0,0 +1,20 @@ +color:44px; +color:44px; +.variables { + width:14cm; + height:24px; + margin-top:-20px; + margin-bottom:30px; + color:#889; + background:#6c94be; + font-family:"Trebuchet MS", Verdana, sans-serif; + margin:3px; + font:10px/12px serif; + font:120%/120% serif; +} +.external { + color:#888; + border:1px solid #3326cc; + background:rgba(23,68,149,0.5); + padding:4px; +}
\ No newline at end of file diff --git a/vendors/lessphp/tests/sort.php b/vendors/lessphp/tests/sort.php new file mode 100644 index 000000000..38662cb24 --- /dev/null +++ b/vendors/lessphp/tests/sort.php @@ -0,0 +1,57 @@ +<?php +error_reporting(E_ALL); + +require realpath(dirname(__FILE__)).'/../lessc.inc.php'; + +// sorts the selectors in stylesheet in order to normalize it for comparison + +$exe = array_shift($argv); // remove filename + +if (!$fname = array_shift($argv)) { + $fname = "php://stdin"; +} + +// also sorts the tags in the block +function sort_key($block) { + if (!isset($block->sort_key)) { + sort($block->tags, SORT_STRING); + $block->sort_key = implode(",", $block->tags); + } + + return $block->sort_key; +} + +class sort_css extends lessc { + function __construct() { + parent::__construct(); + } + + // normalize numbers + function compileValue($value) { + $ignore = array('list', 'keyword', 'string', 'color', 'function'); + if ($value[0] == 'number' || !in_array($value[0], $ignore)) { + $value[1] = $value[1] + 0; // convert to either double or int + } + + return parent::compileValue($value); + } + + function parse_and_sort($str) { + $root = $this->parseTree($str); + + $less = $this; + usort($root->props, function($a, $b) use ($less) { + + $sort = strcmp(sort_key($a[1]), sort_key($b[1])); + if ($sort == 0) + return strcmp($less->compileBlock($a[1]), $less->compileBlock($b[1])); + return $sort; + }); + + return $this->compileBlock($root); + } +} + +$sorter = new sort_css; +echo $sorter->parse_and_sort(file_get_contents($fname)); + diff --git a/vendors/lessphp/tests/test.php b/vendors/lessphp/tests/test.php new file mode 100644 index 000000000..629fe0153 --- /dev/null +++ b/vendors/lessphp/tests/test.php @@ -0,0 +1,190 @@ +#!/usr/bin/env php +<?php +error_reporting(E_ALL); + +/** + * Go through all files matching pattern in input directory + * and compile them, then compare them to paired file in + * output directory. + */ +$difftool = 'diff -b -B -t -u'; +$input = array( + 'dir' => 'inputs', + 'glob' => '*.less', +); + +$output = array( + 'dir' => 'outputs', + 'filename' => '%s.css', +); + + +$prefix = strtr(realpath(dirname(__FILE__)), '\\', '/'); +require $prefix.'/../lessc.inc.php'; + +$compiler = new lessc(); +$compiler->importDir = array($input['dir'].'/test-imports'); + +$fa = 'Fatal Error: '; +if (php_sapi_name() != 'cli') { + exit($fa.$argv[0].' must be run in the command line.'); +} + +$opts = getopt('hCd::g'); + +if ($opts === false || isset($opts['h'])) { + echo <<<EOT +Usage: ./test.php [options] [searchstring] + +where [options] can be a mix of these: + + -h Show this help message and exit. + + -d=[difftool] Show the diff of the actual output vs. the reference when a + test fails; uses 'diff -b -B -t -u' by default. + + The test is aborted after the first failure report, unless + you also specify the '-g' option ('go on'). + + -g Continue executing the other tests when a test fails and + option '-d' is active. + + -C Regenerate ('compile') the reference output files from the + given inputs. + + WARNING: ONLY USE THIS OPTION WHEN YOU HAVE ASCERTAINED + THAT lessphp PROCESSES ALL TESTS CORRECTLY! + +The optional [searchstring] is used to filter the input files: only tests +which have filename(s) containing the specified searchstring will be +executed. I.e. the corresponding glob pattern is '*[searchstring]*.less'. + +The script EXIT CODE is the number of failed tests (with a maximum of 255), +0 on success and 1 when this help message is shown. This aids in integrating +this script in larger (user defined) shell test scripts. + + +Examples of use: + +- Test the full test set: + ./test.php + +- Run only the mixin tests: + ./test.php mixin + +- Use a custom diff tool to show diffs for failing tests + ./test.php -d=meld + +EOT; + exit(1); +} + +$input['dir'] = $prefix.'/'.$input['dir']; +$output['dir'] = $prefix.'/'.$output['dir']; +if (!is_dir($input['dir']) || !is_dir($output['dir'])) + exit($fa." both input and output directories must exist\n"); + +$exe = array_shift($argv); // remove filename +// get the first non flag as search string +$searchString = null; +foreach ($argv as $a) { + if (strlen($a) > 0 && $a{0} != '-') { + $searchString = $a; + break; + } +} + +$tests = array(); +$matches = glob($input['dir'].'/'.(!is_null($searchString) ? '*'.$searchString : '' ).$input['glob']); +if ($matches) { + foreach ($matches as $fname) { + extract(pathinfo($fname)); // for $filename, from php 5.2 + $tests[] = array( + 'in' => $fname, + 'out' => $output['dir'].'/'.sprintf($output['filename'], $filename), + ); + } +} + +$count = count($tests); +$compiling = isset($opts["C"]); +$continue_when_test_fails = isset($opts["g"]); +$showDiff = isset($opts["d"]); +if ($showDiff && !empty($opts["d"])) { + $difftool = $opts["d"]; +} + +echo ($compiling ? "Compiling" : "Running")." $count test".($count == 1 ? '' : 's').":\n"; + +function dump($msgs, $depth = 1, $prefix=" ") { + if (!is_array($msgs)) $msgs = array($msgs); + foreach ($msgs as $m) { + echo str_repeat($prefix, $depth).' - '.$m."\n"; + } +} + +$fail_prefix = " ** "; + +$fail_count = 0; +$i = 1; +foreach ($tests as $test) { + printf(" [Test %04d/%04d] %s -> %s\n", $i, $count, basename($test['in']), basename($test['out'])); + + try { + ob_start(); + $parsed = trim($compiler->parse(file_get_contents($test['in']))); + ob_end_clean(); + } catch (exception $e) { + dump(array( + "Failed to compile input, reason:", + $e->getMessage(), + "Aborting" + ), 1, $fail_prefix); + break; + } + + if ($compiling) { + file_put_contents($test['out'], $parsed); + } else { + if (!is_file($test['out'])) { + dump(array( + "Failed to find output file: $test[out]", + "Maybe you forgot to compile tests?", + "Aborting" + ), 1, $fail_prefix); + break; + } + $expected = trim(file_get_contents($test['out'])); + + // don't care about CRLF vs LF change (DOS/Win vs. UNIX): + $expected = trim(str_replace("\r\n", "\n", $expected)); + $parsed = trim(str_replace("\r\n", "\n", $parsed)); + + if ($expected != $parsed) { + $fail_count++; + if ($showDiff) { + dump("Failed:", 1, $fail_prefix); + $tmp = $test['out'].".tmp"; + file_put_contents($tmp, $parsed); + system($difftool.' '.$test['out'].' '.$tmp); + unlink($tmp); + + if (!$continue_when_test_fails) { + dump("Aborting"); + break; + } else { + echo "===========================================================================\n"; + } + } else { + dump("Failed, run with -d flag to view diff", 1, $fail_prefix); + } + } else { + dump("Passed"); + } + } + + $i++; +} + +exit($fail_count > 255 ? 255 : $fail_count); +?> |