diff --git a/tests/syntax-tests/highlighted/Stylus/gradients.styl b/tests/syntax-tests/highlighted/Stylus/gradients.styl new file mode 100644 index 00000000..b9a083a1 --- /dev/null +++ b/tests/syntax-tests/highlighted/Stylus/gradients.styl @@ -0,0 +1,90 @@ +@import 'config' + +/* + * Implicit color stop position. + */ + +pos-in-stops(i, stops) + len = length(stops) + if len - 1 == i + 100% + else if i + unit(i / len * 100, '%') + else + 0 + +/* + * Normalize color stops: + * + * - (color pos) -> (pos color) + * - (color) -> (implied-pos color) + * + */ + +normalize-stops(stops) + stops = clone(stops) + for stop, i in stops + if length(stop) == 1 + color = stop[0] + stop[0] = pos-in-stops(i, stops) + stop[1] = color + else if typeof(stop[1]) == 'unit' + pos = stop[1] + stop[1] = stop[0] + stop[0] = pos + stops + +/* + * Join color stops with the given translation function. + */ + +join-stops(stops, translate) + str = '' + len = length(stops) + for stop, i in stops + str += ', ' if i + pos = stop[0] + color = stop[1] + str += translate(color, pos) + unquote(str) + +/* + * Standard color stop. + */ + +std-stop(color, pos) + '%s %s' % (color pos) + +/* + * Create a linear gradient with the given start position + * and variable number of color stops. + * + * Examples: + * + * background: linear-gradient(top, red, green, blue) + * background: linear-gradient(bottom, red, green 50%, blue) + * background: linear-gradient(bottom, red, 50% green, blue) + * background: linear-gradient(bottom, red, 50% green, 90% white, blue) + * + */ + +linear-gradient(start, stops...) + error('color stops required') unless length(stops) + + unquote('linear-gradient(' + join(', ',arguments) + ')') + +/* + * Create a linear gradient image with the given start position + * and variable number of color stops. + */ + +linear-gradient-image(start, stops...) + error('node-canvas is required for linear-gradient-image()') unless has-canvas + stops = stops[0] if length(stops) == 1 + error('gradient image size required') unless start[0] is a 'unit' + size = start[0] + start = start[1] or 'top' + grad = create-gradient-image(size, start) + stops = normalize-stops(stops) + add-color-stop(grad, stop[0], stop[1]) for stop in stops + 'url(%s)' % gradient-data-uri(grad) diff --git a/tests/syntax-tests/source/Stylus/LICENSE.md b/tests/syntax-tests/source/Stylus/LICENSE.md new file mode 100644 index 00000000..6b067382 --- /dev/null +++ b/tests/syntax-tests/source/Stylus/LICENSE.md @@ -0,0 +1,24 @@ +The `gradients.styl` file has been added from https://github.com/stylus/nib under the following license: + +```text +The MIT License (MIT) + +Copyright (c) 2014 TJ Holowaychuk + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` diff --git a/tests/syntax-tests/source/Stylus/gradients.styl b/tests/syntax-tests/source/Stylus/gradients.styl new file mode 100644 index 00000000..9f39610b --- /dev/null +++ b/tests/syntax-tests/source/Stylus/gradients.styl @@ -0,0 +1,90 @@ +@import 'config' + +/* + * Implicit color stop position. + */ + +pos-in-stops(i, stops) + len = length(stops) + if len - 1 == i + 100% + else if i + unit(i / len * 100, '%') + else + 0 + +/* + * Normalize color stops: + * + * - (color pos) -> (pos color) + * - (color) -> (implied-pos color) + * + */ + +normalize-stops(stops) + stops = clone(stops) + for stop, i in stops + if length(stop) == 1 + color = stop[0] + stop[0] = pos-in-stops(i, stops) + stop[1] = color + else if typeof(stop[1]) == 'unit' + pos = stop[1] + stop[1] = stop[0] + stop[0] = pos + stops + +/* + * Join color stops with the given translation function. + */ + +join-stops(stops, translate) + str = '' + len = length(stops) + for stop, i in stops + str += ', ' if i + pos = stop[0] + color = stop[1] + str += translate(color, pos) + unquote(str) + +/* + * Standard color stop. + */ + +std-stop(color, pos) + '%s %s' % (color pos) + +/* + * Create a linear gradient with the given start position + * and variable number of color stops. + * + * Examples: + * + * background: linear-gradient(top, red, green, blue) + * background: linear-gradient(bottom, red, green 50%, blue) + * background: linear-gradient(bottom, red, 50% green, blue) + * background: linear-gradient(bottom, red, 50% green, 90% white, blue) + * + */ + +linear-gradient(start, stops...) + error('color stops required') unless length(stops) + + unquote('linear-gradient(' + join(', ',arguments) + ')') + +/* + * Create a linear gradient image with the given start position + * and variable number of color stops. + */ + +linear-gradient-image(start, stops...) + error('node-canvas is required for linear-gradient-image()') unless has-canvas + stops = stops[0] if length(stops) == 1 + error('gradient image size required') unless start[0] is a 'unit' + size = start[0] + start = start[1] or 'top' + grad = create-gradient-image(size, start) + stops = normalize-stops(stops) + add-color-stop(grad, stop[0], stop[1]) for stop in stops + 'url(%s)' % gradient-data-uri(grad)