From a1789ddde42033f1b05cc4929491214ee6e79383 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Thu, 17 Dec 2015 09:15:42 +0100 Subject: Update to MediaWiki 1.26.0 --- vendor/leafo/lessphp/LICENSE | 660 ---- vendor/leafo/lessphp/Makefile | 7 - vendor/leafo/lessphp/README.md | 96 - vendor/leafo/lessphp/composer.json | 25 - vendor/leafo/lessphp/docs/docs.md | 1400 -------- vendor/leafo/lessphp/lessc.inc.php | 3768 -------------------- vendor/leafo/lessphp/lessify | 23 - vendor/leafo/lessphp/lessify.inc.php | 447 --- vendor/leafo/lessphp/package.sh | 35 - vendor/leafo/lessphp/plessc | 250 -- vendor/leafo/lessphp/tests/ApiTest.php | 196 - vendor/leafo/lessphp/tests/ErrorHandlingTest.php | 81 - vendor/leafo/lessphp/tests/InputTest.php | 89 - vendor/leafo/lessphp/tests/README.md | 24 - vendor/leafo/lessphp/tests/bootstrap.sh | 38 - .../lessphp/tests/inputs/accessors.less.disable | 36 - vendor/leafo/lessphp/tests/inputs/arity.less | 77 - vendor/leafo/lessphp/tests/inputs/attributes.less | 41 - vendor/leafo/lessphp/tests/inputs/builtins.less | 96 - vendor/leafo/lessphp/tests/inputs/colors.less | 154 - .../lessphp/tests/inputs/compile_on_mixin.less | 39 - vendor/leafo/lessphp/tests/inputs/data-uri.less | 7 - vendor/leafo/lessphp/tests/inputs/directives.less | 28 - vendor/leafo/lessphp/tests/inputs/escape.less | 18 - vendor/leafo/lessphp/tests/inputs/font_family.less | 28 - vendor/leafo/lessphp/tests/inputs/guards.less | 74 - vendor/leafo/lessphp/tests/inputs/hacks.less | 6 - vendor/leafo/lessphp/tests/inputs/hi.less | 5 - vendor/leafo/lessphp/tests/inputs/ie.less | 12 - vendor/leafo/lessphp/tests/inputs/import.less | 56 - .../leafo/lessphp/tests/inputs/interpolation.less | 47 - vendor/leafo/lessphp/tests/inputs/keyframes.less | 52 - vendor/leafo/lessphp/tests/inputs/math.less | 122 - vendor/leafo/lessphp/tests/inputs/media.less | 68 - vendor/leafo/lessphp/tests/inputs/misc.less | 100 - .../lessphp/tests/inputs/mixin_functions.less | 33 - .../tests/inputs/mixin_merging.less.disable | 100 - vendor/leafo/lessphp/tests/inputs/mixins.less | 197 - vendor/leafo/lessphp/tests/inputs/nested.less | 60 - .../lessphp/tests/inputs/pattern_matching.less | 157 - vendor/leafo/lessphp/tests/inputs/scopes.less | 40 - .../lessphp/tests/inputs/selector_expressions.less | 29 - vendor/leafo/lessphp/tests/inputs/site_demos.less | 120 - .../leafo/lessphp/tests/inputs/test-imports/a.less | 6 - .../leafo/lessphp/tests/inputs/test-imports/b.less | 12 - .../lessphp/tests/inputs/test-imports/file1.less | 16 - .../lessphp/tests/inputs/test-imports/file2.less | 6 - .../lessphp/tests/inputs/test-imports/file3.less | 7 - .../tests/inputs/test-imports/inner/file1.less | 6 - .../tests/inputs/test-imports/inner/file2.less | 4 - vendor/leafo/lessphp/tests/inputs/variables.less | 44 - .../lessphp/tests/inputs_lessjs/mixins-args.less | 205 -- .../tests/inputs_lessjs/mixins-named-args.less | 36 - .../leafo/lessphp/tests/inputs_lessjs/strings.less | 51 - vendor/leafo/lessphp/tests/outputs/accessors.css | 14 - vendor/leafo/lessphp/tests/outputs/arity.css | 25 - vendor/leafo/lessphp/tests/outputs/attributes.css | 105 - vendor/leafo/lessphp/tests/outputs/builtins.css | 61 - vendor/leafo/lessphp/tests/outputs/colors.css | 103 - .../lessphp/tests/outputs/compile_on_mixin.css | 29 - vendor/leafo/lessphp/tests/outputs/data-uri.css | 6 - vendor/leafo/lessphp/tests/outputs/directives.css | 27 - vendor/leafo/lessphp/tests/outputs/escape.css | 14 - vendor/leafo/lessphp/tests/outputs/font_family.css | 17 - vendor/leafo/lessphp/tests/outputs/guards.css | 27 - vendor/leafo/lessphp/tests/outputs/hacks.css | 4 - vendor/leafo/lessphp/tests/outputs/hi.css | 3 - vendor/leafo/lessphp/tests/outputs/ie.css | 9 - vendor/leafo/lessphp/tests/outputs/import.css | 51 - .../leafo/lessphp/tests/outputs/interpolation.css | 28 - vendor/leafo/lessphp/tests/outputs/keyframes.css | 48 - vendor/leafo/lessphp/tests/outputs/math.css | 69 - vendor/leafo/lessphp/tests/outputs/media.css | 70 - vendor/leafo/lessphp/tests/outputs/misc.css | 68 - .../lessphp/tests/outputs/mixin_functions.css | 7 - .../leafo/lessphp/tests/outputs/mixin_merging.css | 42 - vendor/leafo/lessphp/tests/outputs/mixins.css | 92 - vendor/leafo/lessphp/tests/outputs/nested.css | 51 - vendor/leafo/lessphp/tests/outputs/nesting.css | 6 - .../lessphp/tests/outputs/pattern_matching.css | 72 - vendor/leafo/lessphp/tests/outputs/scopes.css | 11 - .../lessphp/tests/outputs/selector_expressions.css | 25 - vendor/leafo/lessphp/tests/outputs/site_demos.css | 76 - vendor/leafo/lessphp/tests/outputs/variables.css | 19 - .../lessphp/tests/outputs_lessjs/mixins-args.css | 113 - .../tests/outputs_lessjs/mixins-named-args.css | 27 - .../leafo/lessphp/tests/outputs_lessjs/strings.css | 40 - vendor/leafo/lessphp/tests/sort.php | 57 - 88 files changed, 10750 deletions(-) delete mode 100644 vendor/leafo/lessphp/LICENSE delete mode 100644 vendor/leafo/lessphp/Makefile delete mode 100644 vendor/leafo/lessphp/README.md delete mode 100644 vendor/leafo/lessphp/composer.json delete mode 100644 vendor/leafo/lessphp/docs/docs.md delete mode 100644 vendor/leafo/lessphp/lessc.inc.php delete mode 100644 vendor/leafo/lessphp/lessify delete mode 100644 vendor/leafo/lessphp/lessify.inc.php delete mode 100644 vendor/leafo/lessphp/package.sh delete mode 100644 vendor/leafo/lessphp/plessc delete mode 100644 vendor/leafo/lessphp/tests/ApiTest.php delete mode 100644 vendor/leafo/lessphp/tests/ErrorHandlingTest.php delete mode 100644 vendor/leafo/lessphp/tests/InputTest.php delete mode 100644 vendor/leafo/lessphp/tests/README.md delete mode 100644 vendor/leafo/lessphp/tests/bootstrap.sh delete mode 100644 vendor/leafo/lessphp/tests/inputs/accessors.less.disable delete mode 100644 vendor/leafo/lessphp/tests/inputs/arity.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/attributes.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/builtins.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/colors.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/compile_on_mixin.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/data-uri.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/directives.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/escape.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/font_family.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/guards.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/hacks.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/hi.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/ie.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/import.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/interpolation.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/keyframes.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/math.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/media.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/misc.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/mixin_functions.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/mixin_merging.less.disable delete mode 100644 vendor/leafo/lessphp/tests/inputs/mixins.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/nested.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/pattern_matching.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/scopes.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/selector_expressions.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/site_demos.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/test-imports/a.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/test-imports/b.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/test-imports/file1.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/test-imports/file2.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/test-imports/file3.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/test-imports/inner/file1.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/test-imports/inner/file2.less delete mode 100644 vendor/leafo/lessphp/tests/inputs/variables.less delete mode 100644 vendor/leafo/lessphp/tests/inputs_lessjs/mixins-args.less delete mode 100644 vendor/leafo/lessphp/tests/inputs_lessjs/mixins-named-args.less delete mode 100644 vendor/leafo/lessphp/tests/inputs_lessjs/strings.less delete mode 100644 vendor/leafo/lessphp/tests/outputs/accessors.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/arity.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/attributes.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/builtins.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/colors.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/compile_on_mixin.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/data-uri.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/directives.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/escape.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/font_family.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/guards.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/hacks.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/hi.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/ie.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/import.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/interpolation.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/keyframes.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/math.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/media.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/misc.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/mixin_functions.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/mixin_merging.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/mixins.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/nested.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/nesting.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/pattern_matching.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/scopes.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/selector_expressions.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/site_demos.css delete mode 100644 vendor/leafo/lessphp/tests/outputs/variables.css delete mode 100644 vendor/leafo/lessphp/tests/outputs_lessjs/mixins-args.css delete mode 100644 vendor/leafo/lessphp/tests/outputs_lessjs/mixins-named-args.css delete mode 100644 vendor/leafo/lessphp/tests/outputs_lessjs/strings.css delete mode 100644 vendor/leafo/lessphp/tests/sort.php (limited to 'vendor/leafo/lessphp') diff --git a/vendor/leafo/lessphp/LICENSE b/vendor/leafo/lessphp/LICENSE deleted file mode 100644 index 49c9ea41..00000000 --- a/vendor/leafo/lessphp/LICENSE +++ /dev/null @@ -1,660 +0,0 @@ -For ease of distribution, lessphp 0.4.0 is under a dual license. -You are free to pick which one suits your needs. - - - - -MIT LICENSE - - - - -Copyright (c) 2013 Leaf Corcoran, http://leafo.net/lessphp - -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. - - - - -GPL VERSION 3 - - - - - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - diff --git a/vendor/leafo/lessphp/Makefile b/vendor/leafo/lessphp/Makefile deleted file mode 100644 index a5d262cd..00000000 --- a/vendor/leafo/lessphp/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -test: - phpunit --colors tests - -release: - ./package.sh - diff --git a/vendor/leafo/lessphp/README.md b/vendor/leafo/lessphp/README.md deleted file mode 100644 index 1379ddce..00000000 --- a/vendor/leafo/lessphp/README.md +++ /dev/null @@ -1,96 +0,0 @@ -[![Build Status](https://travis-ci.org/leafo/lessphp.svg?branch=master)](https://travis-ci.org/leafo/lessphp) - -# lessphp v0.5.0 -### - -`lessphp` is a compiler for LESS written in PHP. The documentation is great, -so check it out: . - -Here's a quick tutorial: - -### How to use in your PHP project - -The only file required is `lessc.inc.php`, so copy that to your include directory. - -The typical flow of **lessphp** is to create a new instance of `lessc`, -configure it how you like, then tell it to compile something using one built in -compile methods. - -The `compile` method compiles a string of LESS code to CSS. - -```php -compile(".block { padding: 3 + 4px }"); -``` - -The `compileFile` method reads and compiles a file. It will either return the -result or write it to the path specified by an optional second argument. - -```php -compileFile("input.less"); -``` - -The `compileChecked` method is like `compileFile`, but it only compiles if the output -file doesn't exist or it's older than the input file: - -```php -checkedCompile("input.less", "output.css"); -``` - -If there any problem compiling your code, an exception is thrown with a helpful message: - -```php -compile("invalid LESS } {"); -} catch (exception $e) { - echo "fatal error: " . $e->getMessage(); -} -``` - -The `lessc` object can be configured through an assortment of instance methods. -Some possible configuration options include [changing the output format][1], -[setting variables from PHP][2], and [controlling the preservation of -comments][3], writing [custom functions][4] and much more. It's all described -in [the documentation][0]. - - - [0]: http://leafo.net/lessphp/docs/ - [1]: http://leafo.net/lessphp/docs/#output_formatting - [2]: http://leafo.net/lessphp/docs/#setting_variables_from_php - [3]: http://leafo.net/lessphp/docs/#preserving_comments - [4]: http://leafo.net/lessphp/docs/#custom_functions - - -### How to use from the command line - -An additional script has been included to use the compiler from the command -line. In the simplest invocation, you specify an input file and the compiled -css is written to standard out: - - $ plessc input.less > output.css - -Using the -r flag, you can specify LESS code directly as an argument or, if -the argument is left off, from standard in: - - $ plessc -r "my less code here" - -Finally, by using the -w flag you can watch a specified input file and have it -compile as needed to the output file: - - $ plessc -w input-file output-file - -Errors from watch mode are written to standard out. - -The -f flag sets the [output formatter][1]. For example, to compress the -output run this: - - $ plessc -f=compressed myfile.less - -For more help, run `plessc --help` - diff --git a/vendor/leafo/lessphp/composer.json b/vendor/leafo/lessphp/composer.json deleted file mode 100644 index 0f06ba09..00000000 --- a/vendor/leafo/lessphp/composer.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "leafo/lessphp", - "type": "library", - "description": "lessphp is a compiler for LESS written in PHP.", - "homepage": "http://leafo.net/lessphp/", - "license": [ - "MIT", - "GPL-3.0" - ], - "authors": [ - { - "name": "Leaf Corcoran", - "email": "leafot@gmail.com", - "homepage": "http://leafo.net" - } - ], - "autoload": { - "classmap": ["lessc.inc.php"] - }, - "extra": { - "branch-alias": { - "dev-master": "0.4.x-dev" - } - } -} diff --git a/vendor/leafo/lessphp/docs/docs.md b/vendor/leafo/lessphp/docs/docs.md deleted file mode 100644 index 112dc2ee..00000000 --- a/vendor/leafo/lessphp/docs/docs.md +++ /dev/null @@ -1,1400 +0,0 @@ - title: v0.5.0 documentation - link_to_home: true --- - -

Documentation v0.5.0

- -
$index
- -**lessphp** is a compiler that generates CSS from a superset language which -adds a collection of convenient features often seen in other languages. All CSS -is compatible with LESS, so you can start using new features with your existing CSS. - -It is designed to be compatible with [less.js](http://lesscss.org), and suitable -as a drop in replacement for PHP projects. - -## Getting Started - -The homepage for **lessphp** can be found at [http://leafo.net/lessphp/][1]. - -You can follow development at the project's [GitHub][2]. - -Including **lessphp** in your project is as simple as dropping the single -include file into your code base and running the appropriate compile method as -described in the [PHP Interface](#php_interface). - - [1]: http://leafo.net/lessphp "lessphp homepage" - [2]: https://github.com/leafo/lessphp "lessphp GitHub page" - -## Installation - -**lessphp** is distributed entirely in a single stand-alone file. Download the -latest version from either [the homepage][1] or [GitHub][2]. - -Development versions can also be downloading from GitHub. - -Place `lessphp.inc.php` in a location available to your PHP scripts, and -include it. That's it! you're ready to begin. - -## The Language - -**lessphp** is very easy to learn because it generally functions how you would -expect it to. If you feel something is challenging or missing, feel free to -open an issue on the [bug tracker](https://github.com/leafo/lessphp/issues). - -It is also easy to learn because any standards-compliant CSS code is valid LESS -code. You are free to gradually enhance your existing CSS code base with LESS -features without having to worry about rewriting anything. - -The following is a description of the new languages features provided by LESS. - -### Line Comments - -Simple but very useful; line comments are started with `//`: - - ```less - // this is a comment - body { - color: red; // as is this - /* block comments still work also */ - } - ``` - -### Variables - -Variables are identified with a name that starts with `@`. To declare a -variable, you create an appropriately named CSS property and assign it a value: - - ```less - @family: "verdana"; - @color: red; - body { - @mycolor: red; - font-family: @family; - color: @color; - border-bottom: 1px solid @color; - } - ``` - -Variable declarations will not appear in the output. Variables can be declared -in the outer most scope of the file, or anywhere else a CSS property may -appear. They can hold any CSS property value. - -Variables are only visible for use from their current scope, or any enclosed -scopes. - -If you have a string or keyword in a variable, you can reference another -variable by that name by repeating the `@`: - - ```less - @value: 20px; - @value_name: "value"; - - width: @@value_name; - ``` - -### Expressions - -Expressions let you combine values and variables in meaningful ways. For -example you can add to a color to make it a different shade. Or divide up the -width of your layout logically. You can even concatenate strings. - -Use the mathematical operators to evaluate an expression: - - ```less - @width: 960px; - .nav { - width: @width / 3; - color: #001 + #abc; - } - .body { - width: 2 * @width / 3; - font-family: "hel" + "vetica"; - } - ``` - -Parentheses can be used to control the order of evaluation. They can also be -used to force an evaluation for cases where CSS's syntax makes the expression -ambiguous. - -The following property will produce two numbers, instead of doing the -subtraction: - - ```less - margin: 10px -5px; - ``` - -To force the subtraction: - - ```less - margin: (10px -5px); - ``` - -It is also safe to surround mathematical operators by spaces to ensure that -they are evaluated: - - ```less - margin: 10px - 5px; - ``` - -Division has a special quirk. There are certain CSS properties that use the `/` -operator as part of their value's syntax. Namely, the [font][4] shorthand and -[border-radius][3]. - - [3]: https://developer.mozilla.org/en/CSS/border-radius - [4]: https://developer.mozilla.org/en/CSS/font - - -Thus, **lessphp** will ignore any division in these properties unless it is -wrapped in parentheses. For example, no division will take place here: - - ```less - .font { - font: 20px/80px "Times New Roman"; - } - ``` - -In order to force division we must wrap the expression in parentheses: - - ```less - .font { - font: (20px/80px) "Times New Roman"; - } - ``` - -If you want to write a literal `/` expression without dividing in another -property (or a variable), you can use [string unquoting](#string_unquoting): - - ```less - .var { - @size: ~"20px/80px"; - font: @size sans-serif; - } - ``` - -### Nested Blocks - -By nesting blocks we can build up a chain of CSS selectors through scope -instead of repeating them. In addition to reducing repetition, this also helps -logically organize the structure of our CSS. - - ```less - ol.list { - li.special { - border: 1px solid red; - } - - li.plain { - font-weight: bold; - } - } - ``` - - -This will produce two blocks, a `ol.list li.special` and `ol.list li.plain`. - -Blocks can be nested as deep as required in order to build a hierarchy of -relationships. - -The `&` operator can be used in a selector to represent its parent's selector. -If the `&` operator is used, then the default action of appending the parent to -the front of the child selector separated by space is not performed. - - ```less - b { - a & { - color: red; - } - - // the following have the same effect - - & i { - color: blue; - } - - i { - color: blue; - } - } - ``` - - -Because the `&` operator respects the whitespace around it, we can use it to -control how the child blocks are joined. Consider the differences between the -following: - - ```less - div { - .child-class { color: purple; } - - &.isa-class { color: green; } - - #child-id { height: 200px; } - - &#div-id { height: 400px; } - - &:hover { color: red; } - - :link { color: blue; } - } - ``` - -The `&` operator also works with [mixins](#mixins), which produces interesting results: - - ```less - .within_box_style() { - .box & { - color: blue; - } - } - - #menu { - .within_box_style; - } - ``` - -### Mixins - -Any block can be mixed in just by naming it: - - ```less - .mymixin { - color: blue; - border: 1px solid red; - - .special { - font-weight: bold; - } - } - - - h1 { - font-size: 200px; - .mymixin; - } - ``` - -All properties and child blocks are mixed in. - -Mixins can be made parametric, meaning they can take arguments, in order to -enhance their utility. A parametric mixin all by itself is not outputted when -compiled. Its properties will only appear when mixed into another block. - -The canonical example is to create a rounded corners mixin that works across -browsers: - - ```less - .rounded-corners(@radius: 5px) { - border-radius: @radius; - -webkit-border-radius: @radius; - -moz-border-radius: @radius; - } - - .header { - .rounded-corners(); - } - - .info { - background: red; - .rounded-corners(14px); - } - ``` - -If you have a mixin that doesn't have any arguments, but you don't want it to -show up in the output, give it a blank argument list: - - ```less - .secret() { - font-size: 6000px; - } - - .div { - .secret; - } - ``` - -If the mixin doesn't need any arguments, you can leave off the parentheses when -mixing it in, as seen above. - -You can also mixin a block that is nested inside other blocks. You can think of -the outer block as a way of making a scope for your mixins. You just list the -names of the mixins separated by spaces, which describes the path to the mixin -you want to include. Optionally you can separate them by `>`. - - ```less - .my_scope { - .some_color { - color: red; - .inner_block { - text-decoration: underline; - } - } - .bold { - font-weight: bold; - color: blue; - } - } - - .a_block { - .my_scope .some_color; - .my_scope .some_color .inner_block; - } - - .another_block { - // the alternative syntax - .my_scope > .bold; - } - ``` - - -#### Mixin Arguments - -When declaring a mixin you can specify default values for each argument. Any -argument left out will be given the default value specified. Here's the -syntax: - -```less -.mix(@color: red, @height: 20px, @pad: 12px) { - border: 1px solid @color; - height: @height - @pad; - padding: @pad; -} - -.default1 { - .mix(); -} - -.default2 { - .mix(blue); -} - -.default3 { - .mix(blue, 40px, 5px); -} -``` - -Additionally, you can also call a mixin using the argument names, this is -useful if you want to replace a specific argument while having all the others -take the default regardless of what position the argument appears in. The -syntax looks something like this: - - -```lessbasic -div { - .my_mixin(@paddding: 4px); // @color and @height get default values - .my_mixin(@paddding: 4px, @height: 50px); // you can specify them in any order -} -``` - -You can also combine the ordered arguments with the named ones: - -```lessbasic -div { - // @color is blue, @padding is 4px, @height is default - .my_mixin(blue, @padding: 4px); -} -``` - -Mixin arguments can be delimited with either a `,` or `;`, but only one can be -active at once. This means that each argument is separated by either `,` or -`;`. By default `,` is the delimiter, in all the above examples we used a `,`. - -A problem arises though, sometimes CSS value lists are made up with commas. In -order to be able to pass a comma separated list literal we need to use `;` as -the delimiter. (You don't need to worry about this if your list is stored in a -variable) - -If a `;` appears anywhere in the argument list, then it will be used as the -argument delimiter, and all commas we be used as part of the argument values. - -Here's a basic example: - -```less -.fancy_mixin(@box_shadow, @color: blue) { - border: 1px solid @color; - box-shadow: @box_shadow; -} - - -div { - // two arguments passed separated by ; - .fancy_mixin(2px 2px, -2px -2px; red); -} - -pre { - // one argument passed, ends in ; - .fancy_mixin(inset 4px 4px, -2px 2px;); -} - -``` - -If we only want to pass a single comma separated value we still need to use -`;`, to do this we stick it on the end as demonstrated above. - - -#### `@arguments` Variable - -Within an mixin there is a special variable named `@arguments` that contains -all the arguments passed to the mixin along with any remaining arguments that -have default values. The value of the variable has all the values separated by -spaces. - -This useful for quickly assigning all the arguments: - - ```less - .box-shadow(@x, @y, @blur, @color) { - box-shadow: @arguments; - -webkit-box-shadow: @arguments; - -moz-box-shadow: @arguments; - } - .menu { - .box-shadow(1px, 1px, 5px, #aaa); - } - ``` - -In addition to the arguments passed to the mixin, `@arguments` will also include -remaining default values assigned by the mixin: - - - ```less - .border-mixin(@width, @style: solid, @color: black) { - border: @arguments; - } - - pre { - .border-mixin(4px, dotted); - } - - ``` - - -#### Pattern Matching - -When you *mix in* a mixin, all the available mixins of that name in the current -scope are checked to see if they match based on what was passed to the mixin -and how it was declared. - -The simplest case is matching by number of arguments. Only the mixins that -match the number of arguments passed in are used. - - ```less - .simple() { // matches no arguments - height: 10px; - } - - .simple(@a, @b) { // matches two arguments - color: red; - } - - .simple(@a) { // matches one argument - color: blue; - } - - div { - .simple(10); - } - - span { - .simple(10, 20); - } - ``` - -Whether an argument has default values is also taken into account when matching -based on number of arguments: - - ```less - // matches one or two arguments - .hello(@a, @b: blue) { - height: @a; - color: @b; - } - - .hello(@a, @b) { // matches only two - width: @a; - border-color: @b; - } - - .hello(@a) { // matches only one - padding: 1em; - } - - div { - .hello(10px); - } - - pre { - .hello(10px, yellow); - } - ``` - -Additionally, a *vararg* value can be used to further control how things are -matched. A mixin's argument list can optionally end in the special argument -named `...`. The `...` may match any number of arguments, including 0. - - ```less - // this will match any number of arguments - .first(...) { - color: blue; - } - - // matches at least 1 argument - .second(@arg, ...) { - height: 200px + @arg; - } - - div { .first("some", "args"); } - pre { .second(10px); } - ``` - -If you want to capture the values that get captured by the *vararg* you can -give it a variable name by putting it directly before the `...`. This variable -must be the last argument defined. It's value is just like the special -[`@arguments` variable](#arguments_variable), a space separated list. - - - ```less - .hello(@first, @rest...) { - color: @first; - text-shadow: @rest; - } - - span { - .hello(red, 1px, 1px, 0px, white); - } - - ``` - -Another way of controlling whether a mixin matches is by specifying a value in -place of an argument name when declaring the mixin: - - ```less - .style(old, @size) { - font: @size serif; - } - - .style(new, @size) { - font: @size sans-serif; - } - - .style(@_, @size) { - letter-spacing: floor(@size / 6px); - } - - em { - @switch: old; - .style(@switch, 15px); - } - ``` - -Notice that two of the three mixins were matched. The mixin with a matching -first argument, and the generic mixin that matches two arguments. It's common -to use `@_` as the name of a variable we intend to not use. It has no special -meaning to LESS, just to the reader of the code. - -#### Guards - -Another way of restricting when a mixin is mixed in is by using guards. A guard -is a special expression that is associated with a mixin declaration that is -evaluated during the mixin process. It must evaluate to true before the mixin -can be used. - -We use the `when` keyword to begin describing a list of guard expressions. - -Here's a simple example: - - ```less - .guarded(@arg) when (@arg = hello) { - color: blue; - } - - div { - .guarded(hello); // match - } - - span { - .guarded(world); // no match - } - ``` -Only the `div`'s mixin will match in this case, because the guard expression -requires that `@arg` is equal to `hello`. - -We can include many different guard expressions by separating them by commas. -Only one of them needs to match to trigger the mixin: - - ```less - .x(@a, @b) when (@a = hello), (@b = world) { - width: 960px; - } - - div { - .x(hello, bar); // match - } - - span { - .x(foo, world); // match - } - - pre { - .x(foo, bar); // no match - } - ``` - -Instead of a comma, we can use `and` keyword to make it so all of the guards -must match in order to trigger the mixin. `and` has higher precedence than the -comma. - - ```less - .y(@a, @b) when (@a = hello) and (@b = world) { - height: 600px; - } - - div { - .y(hello, world); // match - } - - span { - .y(hello, bar); // no match - } - ``` - -Commas and `and`s can be mixed and matched. - -You can also negate a guard expression by using `not` in from of the parentheses: - - ```less - .x(@a) when not (@a = hello) { - color: blue; - } - - div { - .x(hello); // no match - } - ``` - -The `=` operator is used to check equality between any two values. For numbers -the following comparison operators are also defined: - -`<`, `>`, `=<`, `>=` - -There is also a collection of predicate functions that can be used to test the -type of a value. - -These are `isnumber`, `iscolor`, `iskeyword`, `isstring`, `ispixel`, -`ispercentage` and `isem`. - - ```less - .mix(@a) when (ispercentage(@a)) { - height: 500px * @a; - } - .mix(@a) when (ispixel(@a)) { - height: @a; - } - - div.a { - .mix(50%); - } - - div.a { - .mix(350px); - } - ``` - -#### !important - -If you want to apply the `!important` suffix to every property when mixing in a -mixin, just append `!important` to the end of the call to the mixin: - - ```less - .make_bright { - color: red; - font-weight: bold; - } - - .color { - color: green; - } - - body { - .make_bright() !important; - .color(); - } - - ``` - -### Selector Expressions - -Sometimes we want to dynamically generate the selector of a block based on some -variable or expression. We can do this by using *selector expressions*. Selector -expressions are CSS selectors that are evaluated in the current scope before -being written out. - -A simple example is a mixin that dynamically creates a selector named after the -mixin's argument: - - ```less - .create-selector(@name) { - @{name} { - color: red; - } - } - - .create-selector(hello); - .create-selector(world); - ``` - -The string interpolation syntax works inside of selectors, letting you insert varaibles. - -Here's an interesting example adapted from Twitter Bootstrap. A couple advanced -things are going on. We are using [Guards](#guards) along with a recursive -mixin to work like a loop to generate a series of CSS blocks. - - - ```less - // create our recursive mixin: - .spanX (@index) when (@index > 0) { - .span@{index} { - width: @index * 100px; - } - .spanX(@index - 1); - } - .spanX (0) {} - - // mix it into the global scopee: - .spanX(4); - ``` - -### Import - -Multiple LESS files can be compiled into a single CSS file by using the -`@import` statement. Be careful, the LESS import statement shares syntax with -the CSS import statement. If the file being imported ends in a `.less` -extension, or no extension, then it is treated as a LESS import. Otherwise it -is left alone and outputted directly: - - ```lessbasic - // my_file.less - .some-mixin(@height) { - height: @height; - } - - // main.less - @import "main.less" // will import the file if it can be found - @import "main.css" // will be left alone - - body { - .some-mixin(400px); - } - ``` - -All of the following lines are valid ways to import the same file: - - ```lessbasic - @import "file"; - @import 'file.less'; - @import url("file"); - @import url('file'); - @import url(file); - ``` - -When importing, the `importDir` is searched for files. This can be configured, -see [PHP Interface](#php_interface). - -A file is only imported once. If you try to include the same file multiple -times all the import statements after the first produce no output. - -### String Interpolation - -String interpolation is a convenient way to insert the value of a variable -right into a string literal. Given some variable named `@var_name`, you just -need to write it as `@{var_name}` from within the string to have its value -inserted: - - ```less - @symbol: ">"; - h1:before { - content: "@{symbol}: "; - } - - h2:before { - content: "@{symbol}@{symbol}: "; - } - ``` - -There are two kinds of strings, implicit and explicit strings. Explicit strings -are wrapped by double quotes, `"hello I am a string"`, or single quotes `'I am -another string'`. Implicit strings only appear when using `url()`. The text -between the parentheses is considered a string and thus string interpolation is -possible: - - ```less - @path: "files/"; - body { - background: url(@{path}my_background.png); - } - ``` - -### String Format Function - -The `%` function can be used to insert values into strings using a *format -string*. It works similar to `printf` seen in other languages. It has the -same purpose as string interpolation above, but gives explicit control over -the output format. - - ```less - @symbol: ">"; - h1:before { - content: %("%s: ", @symbol); - } - ``` - -The `%` function takes as its first argument the format string, following any -number of addition arguments that are inserted in place of the format -directives. - -A format directive starts with a `%` and is followed by a single character that -is either `a`, `d`, or `s`: - - ```less - strings: %("%a %d %s %a", hi, 1, 'ok', 'cool'); - ``` - -`%a` and `%d` format the value the same way: they compile the argument to its -CSS value and insert it directly. When used with a string, the quotes are -included in the output. This typically isn't what we want, so we have the `%s` -format directive which strips quotes from strings before inserting them. - -The `%d` directive functions the same as `%a`, but is typically used for numbers -assuming the output format of numbers might change in the future. - -### String Unquoting - -Sometimes you will need to write proprietary CSS syntax that is unable to be -parsed. As a workaround you can place the code into a string and unquote it. -Unquoting is the process of outputting a string without its surrounding quotes. -There are two ways to unquote a string. - -The `~` operator in front of a string will unquote that string: - - ```less - .class { - // a made up, but problematic vendor specific CSS - filter: ~"Microsoft.AlphaImage(src='image.png')"; - } - ``` - -If you are working with other types, such as variables, there is a built in -function that let's you unquote any value. It is called `e`. - - ```less - @color: "red"; - .class { - color: e(@color); - } - ``` - -### Built In Functions - -**lessphp** has a collection of built in functions: - -* `e(str)` -- returns a string without the surrounding quotes. - See [String Unquoting](#string_unquoting) - -* `floor(number)` -- returns the floor of a numerical input -* `round(number, [precision])` -- returns the rounded value of numerical input with optional precision - -* `lighten(color, percent)` -- lightens `color` by `percent` and returns it -* `darken(color, percent)` -- darkens `color` by `percent` and returns it - -* `saturate(color, percent)` -- saturates `color` by `percent` and returns it -* `desaturate(color, percent)` -- desaturates `color` by `percent` and returns it - -* `fadein(color, percent)` -- makes `color` less transparent by `percent` and returns it -* `fadeout(color, percent)` -- makes `color` more transparent by `percent` and returns it - -* `spin(color, amount)` -- returns a color with `amount` degrees added to hue - -* `fade(color, amount)` -- returns a color with the alpha set to `amount` - -* `hue(color)` -- returns the hue of `color` - -* `saturation(color)` -- returns the saturation of `color` - -* `lightness(color)` -- returns the lightness of `color` - -* `alpha(color)` -- returns the alpha value of `color` or 1.0 if it doesn't have an alpha - -* `percentage(number)` -- converts a floating point number to a percentage, e.g. `0.65` -> `65%` - -* `mix(color1, color1, percent)` -- mixes two colors by percentage where 100% - keeps all of `color1`, and 0% keeps all of `color2`. Will take into account - the alpha of the colors if it exists. See - . - -* `contrast(color, dark, light)` -- if `color` has a lightness value greater - than 50% then `dark` is returned, otherwise return `light`. - -* `extract(list, index)` -- returns the `index`th item from `list`. The list is - `1` indexed, meaning the first item's index is 1, the second is 2, and etc. - -* `pow(base, exp)` -- returns `base` raised to the power of `exp` - -* `pi()` -- returns pi - -* `mod(a,b)` -- returns `a` modulus `b` - -* `tan(a)` -- returns tangent of `a` where `a` is in radians - -* `cos(a)` -- returns cosine of `a` where `a` is in radians - -* `sin(a)` -- returns sine of `a` where `a` is in radians - -* `atan(a)` -- returns arc tangent of `a` - -* `acos(a)` -- returns arc cosine of `a` - -* `asin(a)` -- returns arc sine of `a` - -* `sqrt(a)` -- returns square root of `a` - -* `rgbahex(color)` -- returns a string containing 4 part hex color. - - This is used to convert a CSS color into the hex format that IE's filter - method expects when working with an alpha component. - - ```less - .class { - @start: rgbahex(rgba(25, 34, 23, .5)); - @end: rgbahex(rgba(85, 74, 103, .6)); - // abridged example - -ms-filter: - e("gradient(start=@{start},end=@{end})"); - } - ``` - -## PHP Interface - -When working with **lessphp** from PHP, the typical flow is to create a new -instance of `lessc`, configure it how you like, then tell it to compile -something using one built in compile methods. - -Methods: - -* [`compile($string)`](#compiling[) -- Compile a string - -* [`compileFile($inFile, [$outFile])`](#compiling) -- Compile a file to another or return it - -* [`checkedCompile($inFile, $outFile)`](#compiling) -- Compile a file only if it's newer - -* [`cachedCompile($cacheOrFile, [$force])`](#compiling_automatically) -- Conditionally compile while tracking imports - -* [`setFormatter($formatterName)`](#output_formatting) -- Change how CSS output looks - -* [`setPreserveComments($keepComments)`](#preserving_comments) -- Change if comments are kept in output - -* [`registerFunction($name, $callable)`](#custom_functions) -- Add a custom function - -* [`unregisterFunction($name)`](#custom_functions) -- Remove a registered function - -* [`setVariables($vars)`](#setting_variables_from_php) -- Set a variable from PHP - -* [`unsetVariable($name)`](#setting_variables_from_php) -- Remove a PHP variable - -* [`setImportDir($dirs)`](#import_directory) -- Set the search path for imports - -* [`addImportDir($dir)`](#import_directory) -- Append directory to search path for imports - - -### Compiling - -The `compile` method compiles a string of LESS code to CSS. - - ```php - compile(".block { padding: 3 + 4px }"); - ``` - -The `compileFile` method reads and compiles a file. It will either return the -result or write it to the path specified by an optional second argument. - - ```php - echo $less->compileFile("input.less"); - ``` - -The `compileChecked` method is like `compileFile`, but it only compiles if the output -file doesn't exist or it's older than the input file: - - ```php - $less->checkedCompile("input.less", "output.css"); - ``` - -See [Compiling Automatically](#compiling_automatically) for a description of -the more advanced `cachedCompile` method. - -### Output Formatting - -Output formatting controls the indentation of the output CSS. Besides the -default formatter, two additional ones are included and it's also easy to make -your own. - -To use a formatter, the method `setFormatter` is used. Just -pass the name of the formatter: - - ```php - $less = new lessc; - - $less->setFormatter("compressed"); - echo $less->compile("div { color: lighten(blue, 10%) }"); - ``` - -In this example, the `compressed` formatter is used. The formatters are: - - * `lessjs` *(default)* -- Same style used in LESS for JavaScript - - * `compressed` -- Compresses all the unrequired whitespace - - * `classic` -- **lessphp**'s original formatter - -To revert to the default formatter, call `setFormatter` with a value of `null`. - -#### Custom Formatter - -The easiest way to customize the formatter is to create your own instance of an -existing formatter and alter its public properties before passing it off to -**lessphp**. The `setFormatter` method can also take an instance of a -formatter. - -Each of the formatter names corresponds to a class with `lessc_formatter_` -prepended in front of it. Here the classic formatter is customized to use tabs -instead of spaces: - - - ```php - $formatter = new lessc_formatter_classic; - $formatter->indentChar = "\t"; - - $less = new lessc; - $less->setFormatter($formatter); - echo $less->compileFile("myfile.less"); - ``` - -For more information about what can be configured with the formatter consult -the source code. - -### Preserving Comments - -By default, all comments in the source LESS file are stripped when compiling. -You might want to keep the `/* */` comments in the output though. For -example, bundling a license in the file. - -Enable or disable comment preservation by calling `setPreserveComments`: - - ```php - $less = new lessc; - $less->setPreserveComments(true); - echo $less->compile("/* hello! */"); - ``` - -Comments are disabled by default because there is additional overhead, and more -often than not they aren't needed. - - -### Compiling Automatically - -Often, you want to only compile a LESS file only if it has been modified since -last compile. This is very important because compiling is performance intensive -and you should avoid a recompile if it possible. - -The `checkedCompile` compile method will do just that. It will check if the -input file is newer than the output file, or if the output file doesn't exist -yet, and compile only then. - - ```php - $less->checkedCompile("input.less", "output.css"); - ``` - -There's a problem though. `checkedCompile` is very basic, it only checks the -input file's modification time. It is unaware of any files from `@import`. - - -For this reason we also have `cachedCompile`. It's slightly more complex, but -gives us the ability to check changes to all files including those imported. It -takes one argument, either the name of the file we want to compile, or an -existing *cache object*. Its return value is an updated cache object. - -If we don't have a cache object, then we call the function with the name of the -file to get the initial cache object. If we do have a cache object, then we -call the function with it. In both cases, an updated cache object is returned. - -The cache object keeps track of all the files that must be checked in order to -determine if a rebuild is required. - -The cache object is a plain PHP `array`. It stores the last time it compiled in -`$cache["updated"]` and output of the compile in `$cache["compiled"]`. - -Here we demonstrate creating an new cache object, then using it to see if we -have a recompiled version available to be written: - - - ```php - $inputFile = "myfile.less"; - $outputFile = "myfile.css"; - - $less = new lessc; - - // create a new cache object, and compile - $cache = $less->cachedCompile($inputFile); - - file_put_contents($outputFile, $cache["compiled"]); - - // the next time we run, write only if it has updated - $last_updated = $cache["updated"]; - $cache = $less->cachedCompile($cache); - if ($cache["updated"] > $last_updated) { - file_put_contents($outputFile, $cache["compiled"]); - } - - ``` - -In order for the system to fully work, we must save cache object between -requests. Because it's a plain PHP `array`, it's sufficient to -[`serialize`](http://php.net/serialize) it and save it the string somewhere -like a file or in persistent memory. - -An example with saving cache object to a file: - - ```php - function autoCompileLess($inputFile, $outputFile) { - // load the cache - $cacheFile = $inputFile.".cache"; - - if (file_exists($cacheFile)) { - $cache = unserialize(file_get_contents($cacheFile)); - } else { - $cache = $inputFile; - } - - $less = new lessc; - $newCache = $less->cachedCompile($cache); - - if (!is_array($cache) || $newCache["updated"] > $cache["updated"]) { - file_put_contents($cacheFile, serialize($newCache)); - file_put_contents($outputFile, $newCache['compiled']); - } - } - - autoCompileLess('myfile.less', 'myfile.css'); - ``` - -`cachedCompile` method takes an optional second argument, `$force`. Passing in -true will cause the input to always be recompiled. - -### Error Handling - -All of the compile methods will throw an `Exception` if the parsing fails or -there is a compile time error. Compile time errors include things like passing -incorrectly typed values for functions that expect specific things, like the -color manipulation functions. - - ```php - $less = new lessc; - try { - $less->compile("} invalid LESS }}}"); - } catch (Exception $ex) { - echo "lessphp fatal error: ".$ex->getMessage(); - } - ``` -### Setting Variables From PHP - -Before compiling any code you can set initial LESS variables from PHP. The -`setVariables` method lets us do this. It takes an associative array of names -to values. The values must be strings, and will be parsed into correct CSS -values. - - - ```php - $less = new lessc; - - $less->setVariables(array( - "color" => "red", - "base" => "960px" - )); - - echo $less->compile(".magic { color: @color; width: @base - 200; }"); - ``` - -If you need to unset a variable, the `unsetVariable` method is available. It -takes the name of the variable to unset. - - ```php - $less->unsetVariable("color"); - ``` - -Be aware that the value of the variable is a string containing a CSS value. So -if you want to pass a LESS string in, you're going to need two sets of quotes. -One for PHP and one for LESS. - - - ```php - $less->setVariables(array( - "url" => "'http://example.com.com/'" - )); - - echo $less->compile("body { background: url("@{url}/bg.png"); }"); - ``` - -### Import Directory - -When running the `@import` directive, an array of directories called the import -search path is searched through to find the file being asked for. - -By default, when using `compile`, the import search path just contains `""`, -which is equivalent to the current directory of the script. If `compileFile` is -used, then the directory of the file being compiled is used as the starting -import search path. - -Two methods are available for configuring the search path. - -`setImportDir` will overwrite the search path with its argument. If the value -isn't an array it will be converted to one. - - -In this example, `@import "colors";` will look for either -`assets/less/colors.less` or `assets/bootstrap/colors.less` in that order: - - ```php - $less->setImportDir(array("assets/less/", "assets/bootstrap")); - - echo $less->compile('@import "colors";'); - ``` - -`addImportDir` will append a single path to the import search path instead of -overwriting the whole thing. - - ```php - $less->addImportDir("public/stylesheets"); - ``` - -### Custom Functions - -**lessphp** has a simple extension interface where you can implement user -functions that will be exposed in LESS code during the compile. They can be a -little tricky though because you need to work with the **lessphp** type system. - -The two methods we are interested in are `registerFunction` and -`unregisterFunction`. `registerFunction` takes two arguments, a name and a -callable value. `unregisterFunction` just takes the name of an existing -function to remove. - -Here's an example that adds a function called `double` that doubles any numeric -argument: - - ```php - registerFunction("double", "lessphp_double"); - - // gives us a width of 800px - echo $less->compile("div { width: double(400px); }"); - ``` - -The second argument to `registerFunction` is any *callable value* that is -understood by [`call_user_func`](http://php.net/call_user_func). - -If we are using PHP 5.3 or above then we are free to pass a function literal -like so: - - ```php - $less->registerFunction("double", function($arg) { - list($type, $value, $unit) = $arg; - return array($type, $value*2, $unit); - }); - ``` - -Now let's talk about the `double` function itself. - -Although a little verbose, the implementation gives us some insight on the type -system. All values in **lessphp** are stored in an array where the 0th element -is a string representing the type, and the other elements make up the -associated data for that value. - -The best way to get an understanding of the system is to register is dummy -function which does a `var_dump` on the argument. Try passing the function -different values from LESS and see what the results are. - -The return value of the registered function must also be a **lessphp** type, -but if it is a string or numeric value, it will automatically be coerced into -an appropriate typed value. In our example, we reconstruct the value with our -modifications while making sure that we preserve the original type. - -The instance of **lessphp** itself is sent to the registered function as the -second argument in addition to the arguments array. - -## Command Line Interface - -**lessphp** comes with a command line script written in PHP that can be used to -invoke the compiler from the terminal. On Linux and OSX, all you need to do is -place `plessc` and `lessc.inc.php` somewhere in your PATH (or you can run it in -the current directory as well). On windows you'll need a copy of `php.exe` to -run the file. To compile a file, `input.less` to CSS, run: - - ```bash - $ plessc input.less - ``` - -To write to a file, redirect standard out: - - ```bash - $ plessc input.less > output.css - ``` - -To compile code directly on the command line: - - ```bash - $ plessc -r "@color: red; body { color: @color; }" - ``` - -To watch a file for changes, and compile it as needed, use the `-w` flag: - - ```bash - $ plessc -w input-file output-file - ``` - -Errors from watch mode are written to standard out. - - -## License - -Copyright (c) 2012 Leaf Corcoran, - -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. - - -*Also under GPL3 if required, see `LICENSE` file* - diff --git a/vendor/leafo/lessphp/lessc.inc.php b/vendor/leafo/lessphp/lessc.inc.php deleted file mode 100644 index 2292f219..00000000 --- a/vendor/leafo/lessphp/lessc.inc.php +++ /dev/null @@ -1,3768 +0,0 @@ - - * Licensed under MIT or GPLv3, see LICENSE - */ - - -/** - * The LESS compiler and parser. - * - * Converting LESS to CSS is a three stage process. The incoming file is parsed - * by `lessc_parser` into a syntax tree, then it is compiled into another tree - * representing the CSS structure by `lessc`. The CSS tree is fed into a - * formatter, like `lessc_formatter` which then outputs CSS as a string. - * - * During the first compile, all values are *reduced*, which means that their - * types are brought to the lowest form before being dump as strings. This - * handles math equations, variable dereferences, and the like. - * - * The `parse` function of `lessc` is the entry point. - * - * In summary: - * - * The `lessc` class creates an instance of the parser, feeds it LESS code, - * then transforms the resulting tree to a CSS tree. This class also holds the - * evaluation context, such as all available mixins and variables at any given - * time. - * - * The `lessc_parser` class is only concerned with parsing its input. - * - * The `lessc_formatter` takes a CSS tree, and dumps it to a formatted string, - * handling things like indentation. - */ -class lessc { - static public $VERSION = "v0.5.0"; - - static public $TRUE = array("keyword", "true"); - static public $FALSE = array("keyword", "false"); - - protected $libFunctions = array(); - protected $registeredVars = array(); - protected $preserveComments = false; - - public $vPrefix = '@'; // prefix of abstract properties - public $mPrefix = '$'; // prefix of abstract blocks - public $parentSelector = '&'; - - public $importDisabled = false; - public $importDir = ''; - - protected $numberPrecision = null; - - protected $allParsedFiles = array(); - - // set to the parser that generated the current line when compiling - // so we know how to create error messages - protected $sourceParser = null; - protected $sourceLoc = null; - - static protected $nextImportId = 0; // uniquely identify imports - - // attempts to find the path of an import url, returns null for css files - protected function findImport($url) { - foreach ((array)$this->importDir as $dir) { - $full = $dir.(substr($dir, -1) != '/' ? '/' : '').$url; - if ($this->fileExists($file = $full.'.less') || $this->fileExists($file = $full)) { - return $file; - } - } - - return null; - } - - protected function fileExists($name) { - return is_file($name); - } - - static public function compressList($items, $delim) { - if (!isset($items[1]) && isset($items[0])) return $items[0]; - else return array('list', $delim, $items); - } - - static public function preg_quote($what) { - return preg_quote($what, '/'); - } - - protected function tryImport($importPath, $parentBlock, $out) { - if ($importPath[0] == "function" && $importPath[1] == "url") { - $importPath = $this->flattenList($importPath[2]); - } - - $str = $this->coerceString($importPath); - if ($str === null) return false; - - $url = $this->compileValue($this->lib_e($str)); - - // don't import if it ends in css - if (substr_compare($url, '.css', -4, 4) === 0) return false; - - $realPath = $this->findImport($url); - - if ($realPath === null) return false; - - if ($this->importDisabled) { - return array(false, "/* import disabled */"); - } - - if (isset($this->allParsedFiles[realpath($realPath)])) { - return array(false, null); - } - - $this->addParsedFile($realPath); - $parser = $this->makeParser($realPath); - $root = $parser->parse(file_get_contents($realPath)); - - // set the parents of all the block props - foreach ($root->props as $prop) { - if ($prop[0] == "block") { - $prop[1]->parent = $parentBlock; - } - } - - // copy mixins into scope, set their parents - // bring blocks from import into current block - // TODO: need to mark the source parser these came from this file - foreach ($root->children as $childName => $child) { - if (isset($parentBlock->children[$childName])) { - $parentBlock->children[$childName] = array_merge( - $parentBlock->children[$childName], - $child); - } else { - $parentBlock->children[$childName] = $child; - } - } - - $pi = pathinfo($realPath); - $dir = $pi["dirname"]; - - list($top, $bottom) = $this->sortProps($root->props, true); - $this->compileImportedProps($top, $parentBlock, $out, $parser, $dir); - - return array(true, $bottom, $parser, $dir); - } - - protected function compileImportedProps($props, $block, $out, $sourceParser, $importDir) { - $oldSourceParser = $this->sourceParser; - - $oldImport = $this->importDir; - - // TODO: this is because the importDir api is stupid - $this->importDir = (array)$this->importDir; - array_unshift($this->importDir, $importDir); - - foreach ($props as $prop) { - $this->compileProp($prop, $block, $out); - } - - $this->importDir = $oldImport; - $this->sourceParser = $oldSourceParser; - } - - /** - * Recursively compiles a block. - * - * A block is analogous to a CSS block in most cases. A single LESS document - * is encapsulated in a block when parsed, but it does not have parent tags - * so all of it's children appear on the root level when compiled. - * - * Blocks are made up of props and children. - * - * Props are property instructions, array tuples which describe an action - * to be taken, eg. write a property, set a variable, mixin a block. - * - * The children of a block are just all the blocks that are defined within. - * This is used to look up mixins when performing a mixin. - * - * Compiling the block involves pushing a fresh environment on the stack, - * and iterating through the props, compiling each one. - * - * See lessc::compileProp() - * - */ - protected function compileBlock($block) { - switch ($block->type) { - case "root": - $this->compileRoot($block); - break; - case null: - $this->compileCSSBlock($block); - break; - case "media": - $this->compileMedia($block); - break; - case "directive": - $name = "@" . $block->name; - if (!empty($block->value)) { - $name .= " " . $this->compileValue($this->reduce($block->value)); - } - - $this->compileNestedBlock($block, array($name)); - break; - default: - $this->throwError("unknown block type: $block->type\n"); - } - } - - protected function compileCSSBlock($block) { - $env = $this->pushEnv(); - - $selectors = $this->compileSelectors($block->tags); - $env->selectors = $this->multiplySelectors($selectors); - $out = $this->makeOutputBlock(null, $env->selectors); - - $this->scope->children[] = $out; - $this->compileProps($block, $out); - - $block->scope = $env; // mixins carry scope with them! - $this->popEnv(); - } - - protected function compileMedia($media) { - $env = $this->pushEnv($media); - $parentScope = $this->mediaParent($this->scope); - - $query = $this->compileMediaQuery($this->multiplyMedia($env)); - - $this->scope = $this->makeOutputBlock($media->type, array($query)); - $parentScope->children[] = $this->scope; - - $this->compileProps($media, $this->scope); - - if (count($this->scope->lines) > 0) { - $orphanSelelectors = $this->findClosestSelectors(); - if (!is_null($orphanSelelectors)) { - $orphan = $this->makeOutputBlock(null, $orphanSelelectors); - $orphan->lines = $this->scope->lines; - array_unshift($this->scope->children, $orphan); - $this->scope->lines = array(); - } - } - - $this->scope = $this->scope->parent; - $this->popEnv(); - } - - protected function mediaParent($scope) { - while (!empty($scope->parent)) { - if (!empty($scope->type) && $scope->type != "media") { - break; - } - $scope = $scope->parent; - } - - return $scope; - } - - protected function compileNestedBlock($block, $selectors) { - $this->pushEnv($block); - $this->scope = $this->makeOutputBlock($block->type, $selectors); - $this->scope->parent->children[] = $this->scope; - - $this->compileProps($block, $this->scope); - - $this->scope = $this->scope->parent; - $this->popEnv(); - } - - protected function compileRoot($root) { - $this->pushEnv(); - $this->scope = $this->makeOutputBlock($root->type); - $this->compileProps($root, $this->scope); - $this->popEnv(); - } - - protected function compileProps($block, $out) { - foreach ($this->sortProps($block->props) as $prop) { - $this->compileProp($prop, $block, $out); - } - $out->lines = $this->deduplicate($out->lines); - } - - /** - * Deduplicate lines in a block. Comments are not deduplicated. If a - * duplicate rule is detected, the comments immediately preceding each - * occurence are consolidated. - */ - protected function deduplicate($lines) { - $unique = array(); - $comments = array(); - - foreach($lines as $line) { - if (strpos($line, '/*') === 0) { - $comments[] = $line; - continue; - } - if (!in_array($line, $unique)) { - $unique[] = $line; - } - array_splice($unique, array_search($line, $unique), 0, $comments); - $comments = array(); - } - return array_merge($unique, $comments); - } - - protected function sortProps($props, $split = false) { - $vars = array(); - $imports = array(); - $other = array(); - $stack = array(); - - foreach ($props as $prop) { - switch ($prop[0]) { - case "comment": - $stack[] = $prop; - break; - case "assign": - $stack[] = $prop; - if (isset($prop[1][0]) && $prop[1][0] == $this->vPrefix) { - $vars = array_merge($vars, $stack); - } else { - $other = array_merge($other, $stack); - } - $stack = array(); - break; - case "import": - $id = self::$nextImportId++; - $prop[] = $id; - $stack[] = $prop; - $imports = array_merge($imports, $stack); - $other[] = array("import_mixin", $id); - $stack = array(); - break; - default: - $stack[] = $prop; - $other = array_merge($other, $stack); - $stack = array(); - break; - } - } - $other = array_merge($other, $stack); - - if ($split) { - return array(array_merge($imports, $vars), $other); - } else { - return array_merge($imports, $vars, $other); - } - } - - protected function compileMediaQuery($queries) { - $compiledQueries = array(); - foreach ($queries as $query) { - $parts = array(); - foreach ($query as $q) { - switch ($q[0]) { - case "mediaType": - $parts[] = implode(" ", array_slice($q, 1)); - break; - case "mediaExp": - if (isset($q[2])) { - $parts[] = "($q[1]: " . - $this->compileValue($this->reduce($q[2])) . ")"; - } else { - $parts[] = "($q[1])"; - } - break; - case "variable": - $parts[] = $this->compileValue($this->reduce($q)); - break; - } - } - - if (count($parts) > 0) { - $compiledQueries[] = implode(" and ", $parts); - } - } - - $out = "@media"; - if (!empty($parts)) { - $out .= " " . - implode($this->formatter->selectorSeparator, $compiledQueries); - } - return $out; - } - - protected function multiplyMedia($env, $childQueries = null) { - if (is_null($env) || - !empty($env->block->type) && $env->block->type != "media") - { - return $childQueries; - } - - // plain old block, skip - if (empty($env->block->type)) { - return $this->multiplyMedia($env->parent, $childQueries); - } - - $out = array(); - $queries = $env->block->queries; - if (is_null($childQueries)) { - $out = $queries; - } else { - foreach ($queries as $parent) { - foreach ($childQueries as $child) { - $out[] = array_merge($parent, $child); - } - } - } - - return $this->multiplyMedia($env->parent, $out); - } - - protected function expandParentSelectors(&$tag, $replace) { - $parts = explode("$&$", $tag); - $count = 0; - foreach ($parts as &$part) { - $part = str_replace($this->parentSelector, $replace, $part, $c); - $count += $c; - } - $tag = implode($this->parentSelector, $parts); - return $count; - } - - protected function findClosestSelectors() { - $env = $this->env; - $selectors = null; - while ($env !== null) { - if (isset($env->selectors)) { - $selectors = $env->selectors; - break; - } - $env = $env->parent; - } - - return $selectors; - } - - - // multiply $selectors against the nearest selectors in env - protected function multiplySelectors($selectors) { - // find parent selectors - - $parentSelectors = $this->findClosestSelectors(); - if (is_null($parentSelectors)) { - // kill parent reference in top level selector - foreach ($selectors as &$s) { - $this->expandParentSelectors($s, ""); - } - - return $selectors; - } - - $out = array(); - foreach ($parentSelectors as $parent) { - foreach ($selectors as $child) { - $count = $this->expandParentSelectors($child, $parent); - - // don't prepend the parent tag if & was used - if ($count > 0) { - $out[] = trim($child); - } else { - $out[] = trim($parent . ' ' . $child); - } - } - } - - return $out; - } - - // reduces selector expressions - protected function compileSelectors($selectors) { - $out = array(); - - foreach ($selectors as $s) { - if (is_array($s)) { - list(, $value) = $s; - $out[] = trim($this->compileValue($this->reduce($value))); - } else { - $out[] = $s; - } - } - - return $out; - } - - protected function eq($left, $right) { - return $left == $right; - } - - protected function patternMatch($block, $orderedArgs, $keywordArgs) { - // match the guards if it has them - // any one of the groups must have all its guards pass for a match - if (!empty($block->guards)) { - $groupPassed = false; - foreach ($block->guards as $guardGroup) { - foreach ($guardGroup as $guard) { - $this->pushEnv(); - $this->zipSetArgs($block->args, $orderedArgs, $keywordArgs); - - $negate = false; - if ($guard[0] == "negate") { - $guard = $guard[1]; - $negate = true; - } - - $passed = $this->reduce($guard) == self::$TRUE; - if ($negate) $passed = !$passed; - - $this->popEnv(); - - if ($passed) { - $groupPassed = true; - } else { - $groupPassed = false; - break; - } - } - - if ($groupPassed) break; - } - - if (!$groupPassed) { - return false; - } - } - - if (empty($block->args)) { - return $block->isVararg || empty($orderedArgs) && empty($keywordArgs); - } - - $remainingArgs = $block->args; - if ($keywordArgs) { - $remainingArgs = array(); - foreach ($block->args as $arg) { - if ($arg[0] == "arg" && isset($keywordArgs[$arg[1]])) { - continue; - } - - $remainingArgs[] = $arg; - } - } - - $i = -1; // no args - // try to match by arity or by argument literal - foreach ($remainingArgs as $i => $arg) { - switch ($arg[0]) { - case "lit": - if (empty($orderedArgs[$i]) || !$this->eq($arg[1], $orderedArgs[$i])) { - return false; - } - break; - case "arg": - // no arg and no default value - if (!isset($orderedArgs[$i]) && !isset($arg[2])) { - return false; - } - break; - case "rest": - $i--; // rest can be empty - break 2; - } - } - - if ($block->isVararg) { - return true; // not having enough is handled above - } else { - $numMatched = $i + 1; - // greater than becuase default values always match - return $numMatched >= count($orderedArgs); - } - } - - protected function patternMatchAll($blocks, $orderedArgs, $keywordArgs, $skip=array()) { - $matches = null; - foreach ($blocks as $block) { - // skip seen blocks that don't have arguments - if (isset($skip[$block->id]) && !isset($block->args)) { - continue; - } - - if ($this->patternMatch($block, $orderedArgs, $keywordArgs)) { - $matches[] = $block; - } - } - - return $matches; - } - - // attempt to find blocks matched by path and args - protected function findBlocks($searchIn, $path, $orderedArgs, $keywordArgs, $seen=array()) { - if ($searchIn == null) return null; - if (isset($seen[$searchIn->id])) return null; - $seen[$searchIn->id] = true; - - $name = $path[0]; - - if (isset($searchIn->children[$name])) { - $blocks = $searchIn->children[$name]; - if (count($path) == 1) { - $matches = $this->patternMatchAll($blocks, $orderedArgs, $keywordArgs, $seen); - if (!empty($matches)) { - // This will return all blocks that match in the closest - // scope that has any matching block, like lessjs - return $matches; - } - } else { - $matches = array(); - foreach ($blocks as $subBlock) { - $subMatches = $this->findBlocks($subBlock, - array_slice($path, 1), $orderedArgs, $keywordArgs, $seen); - - if (!is_null($subMatches)) { - foreach ($subMatches as $sm) { - $matches[] = $sm; - } - } - } - - return count($matches) > 0 ? $matches : null; - } - } - if ($searchIn->parent === $searchIn) return null; - return $this->findBlocks($searchIn->parent, $path, $orderedArgs, $keywordArgs, $seen); - } - - // sets all argument names in $args to either the default value - // or the one passed in through $values - protected function zipSetArgs($args, $orderedValues, $keywordValues) { - $assignedValues = array(); - - $i = 0; - foreach ($args as $a) { - if ($a[0] == "arg") { - if (isset($keywordValues[$a[1]])) { - // has keyword arg - $value = $keywordValues[$a[1]]; - } elseif (isset($orderedValues[$i])) { - // has ordered arg - $value = $orderedValues[$i]; - $i++; - } elseif (isset($a[2])) { - // has default value - $value = $a[2]; - } else { - $this->throwError("Failed to assign arg " . $a[1]); - $value = null; // :( - } - - $value = $this->reduce($value); - $this->set($a[1], $value); - $assignedValues[] = $value; - } else { - // a lit - $i++; - } - } - - // check for a rest - $last = end($args); - if ($last[0] == "rest") { - $rest = array_slice($orderedValues, count($args) - 1); - $this->set($last[1], $this->reduce(array("list", " ", $rest))); - } - - // wow is this the only true use of PHP's + operator for arrays? - $this->env->arguments = $assignedValues + $orderedValues; - } - - // compile a prop and update $lines or $blocks appropriately - protected function compileProp($prop, $block, $out) { - // set error position context - $this->sourceLoc = isset($prop[-1]) ? $prop[-1] : -1; - - switch ($prop[0]) { - case 'assign': - list(, $name, $value) = $prop; - if ($name[0] == $this->vPrefix) { - $this->set($name, $value); - } else { - $out->lines[] = $this->formatter->property($name, - $this->compileValue($this->reduce($value))); - } - break; - case 'block': - list(, $child) = $prop; - $this->compileBlock($child); - break; - case 'mixin': - list(, $path, $args, $suffix) = $prop; - - $orderedArgs = array(); - $keywordArgs = array(); - foreach ((array)$args as $arg) { - $argval = null; - switch ($arg[0]) { - case "arg": - if (!isset($arg[2])) { - $orderedArgs[] = $this->reduce(array("variable", $arg[1])); - } else { - $keywordArgs[$arg[1]] = $this->reduce($arg[2]); - } - break; - - case "lit": - $orderedArgs[] = $this->reduce($arg[1]); - break; - default: - $this->throwError("Unknown arg type: " . $arg[0]); - } - } - - $mixins = $this->findBlocks($block, $path, $orderedArgs, $keywordArgs); - - if ($mixins === null) { - $this->throwError("{$prop[1][0]} is undefined"); - } - - foreach ($mixins as $mixin) { - if ($mixin === $block && !$orderedArgs) { - continue; - } - - $haveScope = false; - if (isset($mixin->parent->scope)) { - $haveScope = true; - $mixinParentEnv = $this->pushEnv(); - $mixinParentEnv->storeParent = $mixin->parent->scope; - } - - $haveArgs = false; - if (isset($mixin->args)) { - $haveArgs = true; - $this->pushEnv(); - $this->zipSetArgs($mixin->args, $orderedArgs, $keywordArgs); - } - - $oldParent = $mixin->parent; - if ($mixin != $block) $mixin->parent = $block; - - foreach ($this->sortProps($mixin->props) as $subProp) { - if ($suffix !== null && - $subProp[0] == "assign" && - is_string($subProp[1]) && - $subProp[1]{0} != $this->vPrefix) - { - $subProp[2] = array( - 'list', ' ', - array($subProp[2], array('keyword', $suffix)) - ); - } - - $this->compileProp($subProp, $mixin, $out); - } - - $mixin->parent = $oldParent; - - if ($haveArgs) $this->popEnv(); - if ($haveScope) $this->popEnv(); - } - - break; - case 'raw': - $out->lines[] = $prop[1]; - break; - case "directive": - list(, $name, $value) = $prop; - $out->lines[] = "@$name " . $this->compileValue($this->reduce($value)).';'; - break; - case "comment": - $out->lines[] = $prop[1]; - break; - case "import"; - list(, $importPath, $importId) = $prop; - $importPath = $this->reduce($importPath); - - if (!isset($this->env->imports)) { - $this->env->imports = array(); - } - - $result = $this->tryImport($importPath, $block, $out); - - $this->env->imports[$importId] = $result === false ? - array(false, "@import " . $this->compileValue($importPath).";") : - $result; - - break; - case "import_mixin": - list(,$importId) = $prop; - $import = $this->env->imports[$importId]; - if ($import[0] === false) { - if (isset($import[1])) { - $out->lines[] = $import[1]; - } - } else { - list(, $bottom, $parser, $importDir) = $import; - $this->compileImportedProps($bottom, $block, $out, $parser, $importDir); - } - - break; - default: - $this->throwError("unknown op: {$prop[0]}\n"); - } - } - - - /** - * Compiles a primitive value into a CSS property value. - * - * Values in lessphp are typed by being wrapped in arrays, their format is - * typically: - * - * array(type, contents [, additional_contents]*) - * - * The input is expected to be reduced. This function will not work on - * things like expressions and variables. - */ - public function compileValue($value) { - switch ($value[0]) { - case 'list': - // [1] - delimiter - // [2] - array of values - return implode($value[1], array_map(array($this, 'compileValue'), $value[2])); - case 'raw_color': - if (!empty($this->formatter->compressColors)) { - return $this->compileValue($this->coerceColor($value)); - } - return $value[1]; - case 'keyword': - // [1] - the keyword - return $value[1]; - case 'number': - list(, $num, $unit) = $value; - // [1] - the number - // [2] - the unit - if ($this->numberPrecision !== null) { - $num = round($num, $this->numberPrecision); - } - return $num . $unit; - case 'string': - // [1] - contents of string (includes quotes) - list(, $delim, $content) = $value; - foreach ($content as &$part) { - if (is_array($part)) { - $part = $this->compileValue($part); - } - } - return $delim . implode($content) . $delim; - case 'color': - // [1] - red component (either number or a %) - // [2] - green component - // [3] - blue component - // [4] - optional alpha component - list(, $r, $g, $b) = $value; - $r = round($r); - $g = round($g); - $b = round($b); - - if (count($value) == 5 && $value[4] != 1) { // rgba - return 'rgba('.$r.','.$g.','.$b.','.$value[4].')'; - } - - $h = sprintf("#%02x%02x%02x", $r, $g, $b); - - if (!empty($this->formatter->compressColors)) { - // Converting hex color to short notation (e.g. #003399 to #039) - if ($h[1] === $h[2] && $h[3] === $h[4] && $h[5] === $h[6]) { - $h = '#' . $h[1] . $h[3] . $h[5]; - } - } - - return $h; - - case 'function': - list(, $name, $args) = $value; - return $name.'('.$this->compileValue($args).')'; - default: // assumed to be unit - $this->throwError("unknown value type: $value[0]"); - } - } - - protected function lib_pow($args) { - list($base, $exp) = $this->assertArgs($args, 2, "pow"); - return pow($this->assertNumber($base), $this->assertNumber($exp)); - } - - protected function lib_pi() { - return pi(); - } - - protected function lib_mod($args) { - list($a, $b) = $this->assertArgs($args, 2, "mod"); - return $this->assertNumber($a) % $this->assertNumber($b); - } - - protected function lib_tan($num) { - return tan($this->assertNumber($num)); - } - - protected function lib_sin($num) { - return sin($this->assertNumber($num)); - } - - protected function lib_cos($num) { - return cos($this->assertNumber($num)); - } - - protected function lib_atan($num) { - $num = atan($this->assertNumber($num)); - return array("number", $num, "rad"); - } - - protected function lib_asin($num) { - $num = asin($this->assertNumber($num)); - return array("number", $num, "rad"); - } - - protected function lib_acos($num) { - $num = acos($this->assertNumber($num)); - return array("number", $num, "rad"); - } - - protected function lib_sqrt($num) { - return sqrt($this->assertNumber($num)); - } - - protected function lib_extract($value) { - list($list, $idx) = $this->assertArgs($value, 2, "extract"); - $idx = $this->assertNumber($idx); - // 1 indexed - if ($list[0] == "list" && isset($list[2][$idx - 1])) { - return $list[2][$idx - 1]; - } - } - - protected function lib_isnumber($value) { - return $this->toBool($value[0] == "number"); - } - - protected function lib_isstring($value) { - return $this->toBool($value[0] == "string"); - } - - protected function lib_iscolor($value) { - return $this->toBool($this->coerceColor($value)); - } - - protected function lib_iskeyword($value) { - return $this->toBool($value[0] == "keyword"); - } - - protected function lib_ispixel($value) { - return $this->toBool($value[0] == "number" && $value[2] == "px"); - } - - protected function lib_ispercentage($value) { - return $this->toBool($value[0] == "number" && $value[2] == "%"); - } - - protected function lib_isem($value) { - return $this->toBool($value[0] == "number" && $value[2] == "em"); - } - - protected function lib_isrem($value) { - return $this->toBool($value[0] == "number" && $value[2] == "rem"); - } - - protected function lib_rgbahex($color) { - $color = $this->coerceColor($color); - if (is_null($color)) - $this->throwError("color expected for rgbahex"); - - return sprintf("#%02x%02x%02x%02x", - isset($color[4]) ? $color[4]*255 : 255, - $color[1],$color[2], $color[3]); - } - - protected function lib_argb($color){ - return $this->lib_rgbahex($color); - } - - /** - * Given an url, decide whether to output a regular link or the base64-encoded contents of the file - * - * @param array $value either an argument list (two strings) or a single string - * @return string formatted url(), either as a link or base64-encoded - */ - protected function lib_data_uri($value) { - $mime = ($value[0] === 'list') ? $value[2][0][2] : null; - $url = ($value[0] === 'list') ? $value[2][1][2][0] : $value[2][0]; - - $fullpath = $this->findImport($url); - - if($fullpath && ($fsize = filesize($fullpath)) !== false) { - // IE8 can't handle data uris larger than 32KB - if($fsize/1024 < 32) { - if(is_null($mime)) { - if(class_exists('finfo')) { // php 5.3+ - $finfo = new finfo(FILEINFO_MIME); - $mime = explode('; ', $finfo->file($fullpath)); - $mime = $mime[0]; - } elseif(function_exists('mime_content_type')) { // PHP 5.2 - $mime = mime_content_type($fullpath); - } - } - - if(!is_null($mime)) // fallback if the mime type is still unknown - $url = sprintf('data:%s;base64,%s', $mime, base64_encode(file_get_contents($fullpath))); - } - } - - return 'url("'.$url.'")'; - } - - // utility func to unquote a string - protected function lib_e($arg) { - switch ($arg[0]) { - case "list": - $items = $arg[2]; - if (isset($items[0])) { - return $this->lib_e($items[0]); - } - $this->throwError("unrecognised input"); - case "string": - $arg[1] = ""; - return $arg; - case "keyword": - return $arg; - default: - return array("keyword", $this->compileValue($arg)); - } - } - - protected function lib__sprintf($args) { - if ($args[0] != "list") return $args; - $values = $args[2]; - $string = array_shift($values); - $template = $this->compileValue($this->lib_e($string)); - - $i = 0; - if (preg_match_all('/%[dsa]/', $template, $m)) { - foreach ($m[0] as $match) { - $val = isset($values[$i]) ? - $this->reduce($values[$i]) : array('keyword', ''); - - // lessjs compat, renders fully expanded color, not raw color - if ($color = $this->coerceColor($val)) { - $val = $color; - } - - $i++; - $rep = $this->compileValue($this->lib_e($val)); - $template = preg_replace('/'.self::preg_quote($match).'/', - $rep, $template, 1); - } - } - - $d = $string[0] == "string" ? $string[1] : '"'; - return array("string", $d, array($template)); - } - - protected function lib_floor($arg) { - $value = $this->assertNumber($arg); - return array("number", floor($value), $arg[2]); - } - - protected function lib_ceil($arg) { - $value = $this->assertNumber($arg); - return array("number", ceil($value), $arg[2]); - } - - protected function lib_round($arg) { - if($arg[0] != "list") { - $value = $this->assertNumber($arg); - return array("number", round($value), $arg[2]); - } else { - $value = $this->assertNumber($arg[2][0]); - $precision = $this->assertNumber($arg[2][1]); - return array("number", round($value, $precision), $arg[2][0][2]); - } - } - - protected function lib_unit($arg) { - if ($arg[0] == "list") { - list($number, $newUnit) = $arg[2]; - return array("number", $this->assertNumber($number), - $this->compileValue($this->lib_e($newUnit))); - } else { - return array("number", $this->assertNumber($arg), ""); - } - } - - /** - * Helper function to get arguments for color manipulation functions. - * takes a list that contains a color like thing and a percentage - */ - public function colorArgs($args) { - if ($args[0] != 'list' || count($args[2]) < 2) { - return array(array('color', 0, 0, 0), 0); - } - list($color, $delta) = $args[2]; - $color = $this->assertColor($color); - $delta = floatval($delta[1]); - - return array($color, $delta); - } - - protected function lib_darken($args) { - list($color, $delta) = $this->colorArgs($args); - - $hsl = $this->toHSL($color); - $hsl[3] = $this->clamp($hsl[3] - $delta, 100); - return $this->toRGB($hsl); - } - - protected function lib_lighten($args) { - list($color, $delta) = $this->colorArgs($args); - - $hsl = $this->toHSL($color); - $hsl[3] = $this->clamp($hsl[3] + $delta, 100); - return $this->toRGB($hsl); - } - - protected function lib_saturate($args) { - list($color, $delta) = $this->colorArgs($args); - - $hsl = $this->toHSL($color); - $hsl[2] = $this->clamp($hsl[2] + $delta, 100); - return $this->toRGB($hsl); - } - - protected function lib_desaturate($args) { - list($color, $delta) = $this->colorArgs($args); - - $hsl = $this->toHSL($color); - $hsl[2] = $this->clamp($hsl[2] - $delta, 100); - return $this->toRGB($hsl); - } - - protected function lib_spin($args) { - list($color, $delta) = $this->colorArgs($args); - - $hsl = $this->toHSL($color); - - $hsl[1] = $hsl[1] + $delta % 360; - if ($hsl[1] < 0) $hsl[1] += 360; - - return $this->toRGB($hsl); - } - - protected function lib_fadeout($args) { - list($color, $delta) = $this->colorArgs($args); - $color[4] = $this->clamp((isset($color[4]) ? $color[4] : 1) - $delta/100); - return $color; - } - - protected function lib_fadein($args) { - list($color, $delta) = $this->colorArgs($args); - $color[4] = $this->clamp((isset($color[4]) ? $color[4] : 1) + $delta/100); - return $color; - } - - protected function lib_hue($color) { - $hsl = $this->toHSL($this->assertColor($color)); - return round($hsl[1]); - } - - protected function lib_saturation($color) { - $hsl = $this->toHSL($this->assertColor($color)); - return round($hsl[2]); - } - - protected function lib_lightness($color) { - $hsl = $this->toHSL($this->assertColor($color)); - return round($hsl[3]); - } - - // get the alpha of a color - // defaults to 1 for non-colors or colors without an alpha - protected function lib_alpha($value) { - if (!is_null($color = $this->coerceColor($value))) { - return isset($color[4]) ? $color[4] : 1; - } - } - - // set the alpha of the color - protected function lib_fade($args) { - list($color, $alpha) = $this->colorArgs($args); - $color[4] = $this->clamp($alpha / 100.0); - return $color; - } - - protected function lib_percentage($arg) { - $num = $this->assertNumber($arg); - return array("number", $num*100, "%"); - } - - // mixes two colors by weight - // mix(@color1, @color2, [@weight: 50%]); - // http://sass-lang.com/docs/yardoc/Sass/Script/Functions.html#mix-instance_method - protected function lib_mix($args) { - if ($args[0] != "list" || count($args[2]) < 2) - $this->throwError("mix expects (color1, color2, weight)"); - - list($first, $second) = $args[2]; - $first = $this->assertColor($first); - $second = $this->assertColor($second); - - $first_a = $this->lib_alpha($first); - $second_a = $this->lib_alpha($second); - - if (isset($args[2][2])) { - $weight = $args[2][2][1] / 100.0; - } else { - $weight = 0.5; - } - - $w = $weight * 2 - 1; - $a = $first_a - $second_a; - - $w1 = (($w * $a == -1 ? $w : ($w + $a)/(1 + $w * $a)) + 1) / 2.0; - $w2 = 1.0 - $w1; - - $new = array('color', - $w1 * $first[1] + $w2 * $second[1], - $w1 * $first[2] + $w2 * $second[2], - $w1 * $first[3] + $w2 * $second[3], - ); - - if ($first_a != 1.0 || $second_a != 1.0) { - $new[] = $first_a * $weight + $second_a * ($weight - 1); - } - - return $this->fixColor($new); - } - - protected function lib_contrast($args) { - $darkColor = array('color', 0, 0, 0); - $lightColor = array('color', 255, 255, 255); - $threshold = 0.43; - - if ( $args[0] == 'list' ) { - $inputColor = ( isset($args[2][0]) ) ? $this->assertColor($args[2][0]) : $lightColor; - $darkColor = ( isset($args[2][1]) ) ? $this->assertColor($args[2][1]) : $darkColor; - $lightColor = ( isset($args[2][2]) ) ? $this->assertColor($args[2][2]) : $lightColor; - $threshold = ( isset($args[2][3]) ) ? $this->assertNumber($args[2][3]) : $threshold; - } - else { - $inputColor = $this->assertColor($args); - } - - $inputColor = $this->coerceColor($inputColor); - $darkColor = $this->coerceColor($darkColor); - $lightColor = $this->coerceColor($lightColor); - - //Figure out which is actually light and dark! - if ( $this->lib_luma($darkColor) > $this->lib_luma($lightColor) ) { - $t = $lightColor; - $lightColor = $darkColor; - $darkColor = $t; - } - - $inputColor_alpha = $this->lib_alpha($inputColor); - if ( ( $this->lib_luma($inputColor) * $inputColor_alpha) < $threshold) { - return $lightColor; - } - return $darkColor; - } - - protected function lib_luma($color) { - $color = $this->coerceColor($color); - return (0.2126 * $color[0] / 255) + (0.7152 * $color[1] / 255) + (0.0722 * $color[2] / 255); - } - - - public function assertColor($value, $error = "expected color value") { - $color = $this->coerceColor($value); - if (is_null($color)) $this->throwError($error); - return $color; - } - - public function assertNumber($value, $error = "expecting number") { - if ($value[0] == "number") return $value[1]; - $this->throwError($error); - } - - public function assertArgs($value, $expectedArgs, $name="") { - if ($expectedArgs == 1) { - return $value; - } else { - if ($value[0] !== "list" || $value[1] != ",") $this->throwError("expecting list"); - $values = $value[2]; - $numValues = count($values); - if ($expectedArgs != $numValues) { - if ($name) { - $name = $name . ": "; - } - - $this->throwError("${name}expecting $expectedArgs arguments, got $numValues"); - } - - return $values; - } - } - - protected function toHSL($color) { - if ($color[0] == 'hsl') return $color; - - $r = $color[1] / 255; - $g = $color[2] / 255; - $b = $color[3] / 255; - - $min = min($r, $g, $b); - $max = max($r, $g, $b); - - $L = ($min + $max) / 2; - if ($min == $max) { - $S = $H = 0; - } else { - if ($L < 0.5) - $S = ($max - $min)/($max + $min); - else - $S = ($max - $min)/(2.0 - $max - $min); - - if ($r == $max) $H = ($g - $b)/($max - $min); - elseif ($g == $max) $H = 2.0 + ($b - $r)/($max - $min); - elseif ($b == $max) $H = 4.0 + ($r - $g)/($max - $min); - - } - - $out = array('hsl', - ($H < 0 ? $H + 6 : $H)*60, - $S*100, - $L*100, - ); - - if (count($color) > 4) $out[] = $color[4]; // copy alpha - return $out; - } - - protected function toRGB_helper($comp, $temp1, $temp2) { - if ($comp < 0) $comp += 1.0; - elseif ($comp > 1) $comp -= 1.0; - - if (6 * $comp < 1) return $temp1 + ($temp2 - $temp1) * 6 * $comp; - if (2 * $comp < 1) return $temp2; - if (3 * $comp < 2) return $temp1 + ($temp2 - $temp1)*((2/3) - $comp) * 6; - - return $temp1; - } - - /** - * Converts a hsl array into a color value in rgb. - * Expects H to be in range of 0 to 360, S and L in 0 to 100 - */ - protected function toRGB($color) { - if ($color[0] == 'color') return $color; - - $H = $color[1] / 360; - $S = $color[2] / 100; - $L = $color[3] / 100; - - if ($S == 0) { - $r = $g = $b = $L; - } else { - $temp2 = $L < 0.5 ? - $L*(1.0 + $S) : - $L + $S - $L * $S; - - $temp1 = 2.0 * $L - $temp2; - - $r = $this->toRGB_helper($H + 1/3, $temp1, $temp2); - $g = $this->toRGB_helper($H, $temp1, $temp2); - $b = $this->toRGB_helper($H - 1/3, $temp1, $temp2); - } - - // $out = array('color', round($r*255), round($g*255), round($b*255)); - $out = array('color', $r*255, $g*255, $b*255); - if (count($color) > 4) $out[] = $color[4]; // copy alpha - return $out; - } - - protected function clamp($v, $max = 1, $min = 0) { - return min($max, max($min, $v)); - } - - /** - * Convert the rgb, rgba, hsl color literals of function type - * as returned by the parser into values of color type. - */ - protected function funcToColor($func) { - $fname = $func[1]; - if ($func[2][0] != 'list') return false; // need a list of arguments - $rawComponents = $func[2][2]; - - if ($fname == 'hsl' || $fname == 'hsla') { - $hsl = array('hsl'); - $i = 0; - foreach ($rawComponents as $c) { - $val = $this->reduce($c); - $val = isset($val[1]) ? floatval($val[1]) : 0; - - if ($i == 0) $clamp = 360; - elseif ($i < 3) $clamp = 100; - else $clamp = 1; - - $hsl[] = $this->clamp($val, $clamp); - $i++; - } - - while (count($hsl) < 4) $hsl[] = 0; - return $this->toRGB($hsl); - - } elseif ($fname == 'rgb' || $fname == 'rgba') { - $components = array(); - $i = 1; - foreach ($rawComponents as $c) { - $c = $this->reduce($c); - if ($i < 4) { - if ($c[0] == "number" && $c[2] == "%") { - $components[] = 255 * ($c[1] / 100); - } else { - $components[] = floatval($c[1]); - } - } elseif ($i == 4) { - if ($c[0] == "number" && $c[2] == "%") { - $components[] = 1.0 * ($c[1] / 100); - } else { - $components[] = floatval($c[1]); - } - } else break; - - $i++; - } - while (count($components) < 3) $components[] = 0; - array_unshift($components, 'color'); - return $this->fixColor($components); - } - - return false; - } - - protected function reduce($value, $forExpression = false) { - switch ($value[0]) { - case "interpolate": - $reduced = $this->reduce($value[1]); - $var = $this->compileValue($reduced); - $res = $this->reduce(array("variable", $this->vPrefix . $var)); - - if ($res[0] == "raw_color") { - $res = $this->coerceColor($res); - } - - if (empty($value[2])) $res = $this->lib_e($res); - - return $res; - case "variable": - $key = $value[1]; - if (is_array($key)) { - $key = $this->reduce($key); - $key = $this->vPrefix . $this->compileValue($this->lib_e($key)); - } - - $seen =& $this->env->seenNames; - - if (!empty($seen[$key])) { - $this->throwError("infinite loop detected: $key"); - } - - $seen[$key] = true; - $out = $this->reduce($this->get($key)); - $seen[$key] = false; - return $out; - case "list": - foreach ($value[2] as &$item) { - $item = $this->reduce($item, $forExpression); - } - return $value; - case "expression": - return $this->evaluate($value); - case "string": - foreach ($value[2] as &$part) { - if (is_array($part)) { - $strip = $part[0] == "variable"; - $part = $this->reduce($part); - if ($strip) $part = $this->lib_e($part); - } - } - return $value; - case "escape": - list(,$inner) = $value; - return $this->lib_e($this->reduce($inner)); - case "function": - $color = $this->funcToColor($value); - if ($color) return $color; - - list(, $name, $args) = $value; - if ($name == "%") $name = "_sprintf"; - - $f = isset($this->libFunctions[$name]) ? - $this->libFunctions[$name] : array($this, 'lib_'.str_replace('-', '_', $name)); - - if (is_callable($f)) { - if ($args[0] == 'list') - $args = self::compressList($args[2], $args[1]); - - $ret = call_user_func($f, $this->reduce($args, true), $this); - - if (is_null($ret)) { - return array("string", "", array( - $name, "(", $args, ")" - )); - } - - // convert to a typed value if the result is a php primitive - if (is_numeric($ret)) $ret = array('number', $ret, ""); - elseif (!is_array($ret)) $ret = array('keyword', $ret); - - return $ret; - } - - // plain function, reduce args - $value[2] = $this->reduce($value[2]); - return $value; - case "unary": - list(, $op, $exp) = $value; - $exp = $this->reduce($exp); - - if ($exp[0] == "number") { - switch ($op) { - case "+": - return $exp; - case "-": - $exp[1] *= -1; - return $exp; - } - } - return array("string", "", array($op, $exp)); - } - - if ($forExpression) { - switch ($value[0]) { - case "keyword": - if ($color = $this->coerceColor($value)) { - return $color; - } - break; - case "raw_color": - return $this->coerceColor($value); - } - } - - return $value; - } - - - // coerce a value for use in color operation - protected function coerceColor($value) { - switch($value[0]) { - case 'color': return $value; - case 'raw_color': - $c = array("color", 0, 0, 0); - $colorStr = substr($value[1], 1); - $num = hexdec($colorStr); - $width = strlen($colorStr) == 3 ? 16 : 256; - - for ($i = 3; $i > 0; $i--) { // 3 2 1 - $t = $num % $width; - $num /= $width; - - $c[$i] = $t * (256/$width) + $t * floor(16/$width); - } - - return $c; - case 'keyword': - $name = $value[1]; - if (isset(self::$cssColors[$name])) { - $rgba = explode(',', self::$cssColors[$name]); - - if(isset($rgba[3])) - return array('color', $rgba[0], $rgba[1], $rgba[2], $rgba[3]); - - return array('color', $rgba[0], $rgba[1], $rgba[2]); - } - return null; - } - } - - // make something string like into a string - protected function coerceString($value) { - switch ($value[0]) { - case "string": - return $value; - case "keyword": - return array("string", "", array($value[1])); - } - return null; - } - - // turn list of length 1 into value type - protected function flattenList($value) { - if ($value[0] == "list" && count($value[2]) == 1) { - return $this->flattenList($value[2][0]); - } - return $value; - } - - public function toBool($a) { - if ($a) return self::$TRUE; - else return self::$FALSE; - } - - // evaluate an expression - protected function evaluate($exp) { - list(, $op, $left, $right, $whiteBefore, $whiteAfter) = $exp; - - $left = $this->reduce($left, true); - $right = $this->reduce($right, true); - - if ($leftColor = $this->coerceColor($left)) { - $left = $leftColor; - } - - if ($rightColor = $this->coerceColor($right)) { - $right = $rightColor; - } - - $ltype = $left[0]; - $rtype = $right[0]; - - // operators that work on all types - if ($op == "and") { - return $this->toBool($left == self::$TRUE && $right == self::$TRUE); - } - - if ($op == "=") { - return $this->toBool($this->eq($left, $right) ); - } - - if ($op == "+" && !is_null($str = $this->stringConcatenate($left, $right))) { - return $str; - } - - // type based operators - $fname = "op_${ltype}_${rtype}"; - if (is_callable(array($this, $fname))) { - $out = $this->$fname($op, $left, $right); - if (!is_null($out)) return $out; - } - - // make the expression look it did before being parsed - $paddedOp = $op; - if ($whiteBefore) $paddedOp = " " . $paddedOp; - if ($whiteAfter) $paddedOp .= " "; - - return array("string", "", array($left, $paddedOp, $right)); - } - - protected function stringConcatenate($left, $right) { - if ($strLeft = $this->coerceString($left)) { - if ($right[0] == "string") { - $right[1] = ""; - } - $strLeft[2][] = $right; - return $strLeft; - } - - if ($strRight = $this->coerceString($right)) { - array_unshift($strRight[2], $left); - return $strRight; - } - } - - - // make sure a color's components don't go out of bounds - protected function fixColor($c) { - foreach (range(1, 3) as $i) { - if ($c[$i] < 0) $c[$i] = 0; - if ($c[$i] > 255) $c[$i] = 255; - } - - return $c; - } - - protected function op_number_color($op, $lft, $rgt) { - if ($op == '+' || $op == '*') { - return $this->op_color_number($op, $rgt, $lft); - } - } - - protected function op_color_number($op, $lft, $rgt) { - if ($rgt[0] == '%') $rgt[1] /= 100; - - return $this->op_color_color($op, $lft, - array_fill(1, count($lft) - 1, $rgt[1])); - } - - protected function op_color_color($op, $left, $right) { - $out = array('color'); - $max = count($left) > count($right) ? count($left) : count($right); - foreach (range(1, $max - 1) as $i) { - $lval = isset($left[$i]) ? $left[$i] : 0; - $rval = isset($right[$i]) ? $right[$i] : 0; - switch ($op) { - case '+': - $out[] = $lval + $rval; - break; - case '-': - $out[] = $lval - $rval; - break; - case '*': - $out[] = $lval * $rval; - break; - case '%': - $out[] = $lval % $rval; - break; - case '/': - if ($rval == 0) $this->throwError("evaluate error: can't divide by zero"); - $out[] = $lval / $rval; - break; - default: - $this->throwError('evaluate error: color op number failed on op '.$op); - } - } - return $this->fixColor($out); - } - - function lib_red($color){ - $color = $this->coerceColor($color); - if (is_null($color)) { - $this->throwError('color expected for red()'); - } - - return $color[1]; - } - - function lib_green($color){ - $color = $this->coerceColor($color); - if (is_null($color)) { - $this->throwError('color expected for green()'); - } - - return $color[2]; - } - - function lib_blue($color){ - $color = $this->coerceColor($color); - if (is_null($color)) { - $this->throwError('color expected for blue()'); - } - - return $color[3]; - } - - - // operator on two numbers - protected function op_number_number($op, $left, $right) { - $unit = empty($left[2]) ? $right[2] : $left[2]; - - $value = 0; - switch ($op) { - case '+': - $value = $left[1] + $right[1]; - break; - case '*': - $value = $left[1] * $right[1]; - break; - case '-': - $value = $left[1] - $right[1]; - break; - case '%': - $value = $left[1] % $right[1]; - break; - case '/': - if ($right[1] == 0) $this->throwError('parse error: divide by zero'); - $value = $left[1] / $right[1]; - break; - case '<': - return $this->toBool($left[1] < $right[1]); - case '>': - return $this->toBool($left[1] > $right[1]); - case '>=': - return $this->toBool($left[1] >= $right[1]); - case '=<': - return $this->toBool($left[1] <= $right[1]); - default: - $this->throwError('parse error: unknown number operator: '.$op); - } - - return array("number", $value, $unit); - } - - - /* environment functions */ - - protected function makeOutputBlock($type, $selectors = null) { - $b = new stdclass; - $b->lines = array(); - $b->children = array(); - $b->selectors = $selectors; - $b->type = $type; - $b->parent = $this->scope; - return $b; - } - - // the state of execution - protected function pushEnv($block = null) { - $e = new stdclass; - $e->parent = $this->env; - $e->store = array(); - $e->block = $block; - - $this->env = $e; - return $e; - } - - // pop something off the stack - protected function popEnv() { - $old = $this->env; - $this->env = $this->env->parent; - return $old; - } - - // set something in the current env - protected function set($name, $value) { - $this->env->store[$name] = $value; - } - - - // get the highest occurrence entry for a name - protected function get($name) { - $current = $this->env; - - $isArguments = $name == $this->vPrefix . 'arguments'; - while ($current) { - if ($isArguments && isset($current->arguments)) { - return array('list', ' ', $current->arguments); - } - - if (isset($current->store[$name])) - return $current->store[$name]; - else { - $current = isset($current->storeParent) ? - $current->storeParent : $current->parent; - } - } - - $this->throwError("variable $name is undefined"); - } - - // inject array of unparsed strings into environment as variables - protected function injectVariables($args) { - $this->pushEnv(); - $parser = new lessc_parser($this, __METHOD__); - foreach ($args as $name => $strValue) { - if ($name{0} != '@') $name = '@'.$name; - $parser->count = 0; - $parser->buffer = (string)$strValue; - if (!$parser->propertyValue($value)) { - throw new Exception("failed to parse passed in variable $name: $strValue"); - } - - $this->set($name, $value); - } - } - - /** - * Initialize any static state, can initialize parser for a file - * $opts isn't used yet - */ - public function __construct($fname = null) { - if ($fname !== null) { - // used for deprecated parse method - $this->_parseFile = $fname; - } - } - - public function compile($string, $name = null) { - $locale = setlocale(LC_NUMERIC, 0); - setlocale(LC_NUMERIC, "C"); - - $this->parser = $this->makeParser($name); - $root = $this->parser->parse($string); - - $this->env = null; - $this->scope = null; - - $this->formatter = $this->newFormatter(); - - if (!empty($this->registeredVars)) { - $this->injectVariables($this->registeredVars); - } - - $this->sourceParser = $this->parser; // used for error messages - $this->compileBlock($root); - - ob_start(); - $this->formatter->block($this->scope); - $out = ob_get_clean(); - setlocale(LC_NUMERIC, $locale); - return $out; - } - - public function compileFile($fname, $outFname = null) { - if (!is_readable($fname)) { - throw new Exception('load error: failed to find '.$fname); - } - - $pi = pathinfo($fname); - - $oldImport = $this->importDir; - - $this->importDir = (array)$this->importDir; - $this->importDir[] = $pi['dirname'].'/'; - - $this->addParsedFile($fname); - - $out = $this->compile(file_get_contents($fname), $fname); - - $this->importDir = $oldImport; - - if ($outFname !== null) { - return file_put_contents($outFname, $out); - } - - return $out; - } - - // compile only if changed input has changed or output doesn't exist - public function checkedCompile($in, $out) { - if (!is_file($out) || filemtime($in) > filemtime($out)) { - $this->compileFile($in, $out); - return true; - } - return false; - } - - /** - * Execute lessphp on a .less file or a lessphp cache structure - * - * The lessphp cache structure contains information about a specific - * less file having been parsed. It can be used as a hint for future - * calls to determine whether or not a rebuild is required. - * - * The cache structure contains two important keys that may be used - * externally: - * - * compiled: The final compiled CSS - * updated: The time (in seconds) the CSS was last compiled - * - * The cache structure is a plain-ol' PHP associative array and can - * be serialized and unserialized without a hitch. - * - * @param mixed $in Input - * @param bool $force Force rebuild? - * @return array lessphp cache structure - */ - public function cachedCompile($in, $force = false) { - // assume no root - $root = null; - - if (is_string($in)) { - $root = $in; - } elseif (is_array($in) and isset($in['root'])) { - if ($force or ! isset($in['files'])) { - // If we are forcing a recompile or if for some reason the - // structure does not contain any file information we should - // specify the root to trigger a rebuild. - $root = $in['root']; - } elseif (isset($in['files']) and is_array($in['files'])) { - foreach ($in['files'] as $fname => $ftime ) { - if (!file_exists($fname) or filemtime($fname) > $ftime) { - // One of the files we knew about previously has changed - // so we should look at our incoming root again. - $root = $in['root']; - break; - } - } - } - } else { - // TODO: Throw an exception? We got neither a string nor something - // that looks like a compatible lessphp cache structure. - return null; - } - - if ($root !== null) { - // If we have a root value which means we should rebuild. - $out = array(); - $out['root'] = $root; - $out['compiled'] = $this->compileFile($root); - $out['files'] = $this->allParsedFiles(); - $out['updated'] = time(); - return $out; - } else { - // No changes, pass back the structure - // we were given initially. - return $in; - } - - } - - // parse and compile buffer - // This is deprecated - public function parse($str = null, $initialVariables = null) { - if (is_array($str)) { - $initialVariables = $str; - $str = null; - } - - $oldVars = $this->registeredVars; - if ($initialVariables !== null) { - $this->setVariables($initialVariables); - } - - if ($str == null) { - if (empty($this->_parseFile)) { - throw new exception("nothing to parse"); - } - - $out = $this->compileFile($this->_parseFile); - } else { - $out = $this->compile($str); - } - - $this->registeredVars = $oldVars; - return $out; - } - - protected function makeParser($name) { - $parser = new lessc_parser($this, $name); - $parser->writeComments = $this->preserveComments; - - return $parser; - } - - public function setFormatter($name) { - $this->formatterName = $name; - } - - protected function newFormatter() { - $className = "lessc_formatter_lessjs"; - if (!empty($this->formatterName)) { - if (!is_string($this->formatterName)) - return $this->formatterName; - $className = "lessc_formatter_$this->formatterName"; - } - - return new $className; - } - - public function setPreserveComments($preserve) { - $this->preserveComments = $preserve; - } - - public function registerFunction($name, $func) { - $this->libFunctions[$name] = $func; - } - - public function unregisterFunction($name) { - unset($this->libFunctions[$name]); - } - - public function setVariables($variables) { - $this->registeredVars = array_merge($this->registeredVars, $variables); - } - - public function unsetVariable($name) { - unset($this->registeredVars[$name]); - } - - public function setImportDir($dirs) { - $this->importDir = (array)$dirs; - } - - public function addImportDir($dir) { - $this->importDir = (array)$this->importDir; - $this->importDir[] = $dir; - } - - public function allParsedFiles() { - return $this->allParsedFiles; - } - - public function addParsedFile($file) { - $this->allParsedFiles[realpath($file)] = filemtime($file); - } - - /** - * Uses the current value of $this->count to show line and line number - */ - public function throwError($msg = null) { - if ($this->sourceLoc >= 0) { - $this->sourceParser->throwError($msg, $this->sourceLoc); - } - throw new exception($msg); - } - - // compile file $in to file $out if $in is newer than $out - // returns true when it compiles, false otherwise - public static function ccompile($in, $out, $less = null) { - if ($less === null) { - $less = new self; - } - return $less->checkedCompile($in, $out); - } - - public static function cexecute($in, $force = false, $less = null) { - if ($less === null) { - $less = new self; - } - return $less->cachedCompile($in, $force); - } - - static protected $cssColors = array( - 'aliceblue' => '240,248,255', - 'antiquewhite' => '250,235,215', - 'aqua' => '0,255,255', - 'aquamarine' => '127,255,212', - 'azure' => '240,255,255', - 'beige' => '245,245,220', - 'bisque' => '255,228,196', - 'black' => '0,0,0', - 'blanchedalmond' => '255,235,205', - 'blue' => '0,0,255', - 'blueviolet' => '138,43,226', - 'brown' => '165,42,42', - 'burlywood' => '222,184,135', - 'cadetblue' => '95,158,160', - 'chartreuse' => '127,255,0', - 'chocolate' => '210,105,30', - 'coral' => '255,127,80', - 'cornflowerblue' => '100,149,237', - 'cornsilk' => '255,248,220', - 'crimson' => '220,20,60', - 'cyan' => '0,255,255', - 'darkblue' => '0,0,139', - 'darkcyan' => '0,139,139', - 'darkgoldenrod' => '184,134,11', - 'darkgray' => '169,169,169', - 'darkgreen' => '0,100,0', - 'darkgrey' => '169,169,169', - 'darkkhaki' => '189,183,107', - 'darkmagenta' => '139,0,139', - 'darkolivegreen' => '85,107,47', - 'darkorange' => '255,140,0', - 'darkorchid' => '153,50,204', - 'darkred' => '139,0,0', - 'darksalmon' => '233,150,122', - 'darkseagreen' => '143,188,143', - 'darkslateblue' => '72,61,139', - 'darkslategray' => '47,79,79', - 'darkslategrey' => '47,79,79', - 'darkturquoise' => '0,206,209', - 'darkviolet' => '148,0,211', - 'deeppink' => '255,20,147', - 'deepskyblue' => '0,191,255', - 'dimgray' => '105,105,105', - 'dimgrey' => '105,105,105', - 'dodgerblue' => '30,144,255', - 'firebrick' => '178,34,34', - 'floralwhite' => '255,250,240', - 'forestgreen' => '34,139,34', - 'fuchsia' => '255,0,255', - 'gainsboro' => '220,220,220', - 'ghostwhite' => '248,248,255', - 'gold' => '255,215,0', - 'goldenrod' => '218,165,32', - 'gray' => '128,128,128', - 'green' => '0,128,0', - 'greenyellow' => '173,255,47', - 'grey' => '128,128,128', - 'honeydew' => '240,255,240', - 'hotpink' => '255,105,180', - 'indianred' => '205,92,92', - 'indigo' => '75,0,130', - 'ivory' => '255,255,240', - 'khaki' => '240,230,140', - 'lavender' => '230,230,250', - 'lavenderblush' => '255,240,245', - 'lawngreen' => '124,252,0', - 'lemonchiffon' => '255,250,205', - 'lightblue' => '173,216,230', - 'lightcoral' => '240,128,128', - 'lightcyan' => '224,255,255', - 'lightgoldenrodyellow' => '250,250,210', - 'lightgray' => '211,211,211', - 'lightgreen' => '144,238,144', - 'lightgrey' => '211,211,211', - 'lightpink' => '255,182,193', - 'lightsalmon' => '255,160,122', - 'lightseagreen' => '32,178,170', - 'lightskyblue' => '135,206,250', - 'lightslategray' => '119,136,153', - 'lightslategrey' => '119,136,153', - 'lightsteelblue' => '176,196,222', - 'lightyellow' => '255,255,224', - 'lime' => '0,255,0', - 'limegreen' => '50,205,50', - 'linen' => '250,240,230', - 'magenta' => '255,0,255', - 'maroon' => '128,0,0', - 'mediumaquamarine' => '102,205,170', - 'mediumblue' => '0,0,205', - 'mediumorchid' => '186,85,211', - 'mediumpurple' => '147,112,219', - 'mediumseagreen' => '60,179,113', - 'mediumslateblue' => '123,104,238', - 'mediumspringgreen' => '0,250,154', - 'mediumturquoise' => '72,209,204', - 'mediumvioletred' => '199,21,133', - 'midnightblue' => '25,25,112', - 'mintcream' => '245,255,250', - 'mistyrose' => '255,228,225', - 'moccasin' => '255,228,181', - 'navajowhite' => '255,222,173', - 'navy' => '0,0,128', - 'oldlace' => '253,245,230', - 'olive' => '128,128,0', - 'olivedrab' => '107,142,35', - 'orange' => '255,165,0', - 'orangered' => '255,69,0', - 'orchid' => '218,112,214', - 'palegoldenrod' => '238,232,170', - 'palegreen' => '152,251,152', - 'paleturquoise' => '175,238,238', - 'palevioletred' => '219,112,147', - 'papayawhip' => '255,239,213', - 'peachpuff' => '255,218,185', - 'peru' => '205,133,63', - 'pink' => '255,192,203', - 'plum' => '221,160,221', - 'powderblue' => '176,224,230', - 'purple' => '128,0,128', - 'red' => '255,0,0', - 'rosybrown' => '188,143,143', - 'royalblue' => '65,105,225', - 'saddlebrown' => '139,69,19', - 'salmon' => '250,128,114', - 'sandybrown' => '244,164,96', - 'seagreen' => '46,139,87', - 'seashell' => '255,245,238', - 'sienna' => '160,82,45', - 'silver' => '192,192,192', - 'skyblue' => '135,206,235', - 'slateblue' => '106,90,205', - 'slategray' => '112,128,144', - 'slategrey' => '112,128,144', - 'snow' => '255,250,250', - 'springgreen' => '0,255,127', - 'steelblue' => '70,130,180', - 'tan' => '210,180,140', - 'teal' => '0,128,128', - 'thistle' => '216,191,216', - 'tomato' => '255,99,71', - 'transparent' => '0,0,0,0', - 'turquoise' => '64,224,208', - 'violet' => '238,130,238', - 'wheat' => '245,222,179', - 'white' => '255,255,255', - 'whitesmoke' => '245,245,245', - 'yellow' => '255,255,0', - 'yellowgreen' => '154,205,50' - ); -} - -// responsible for taking a string of LESS code and converting it into a -// syntax tree -class lessc_parser { - static protected $nextBlockId = 0; // used to uniquely identify blocks - - static protected $precedence = array( - '=<' => 0, - '>=' => 0, - '=' => 0, - '<' => 0, - '>' => 0, - - '+' => 1, - '-' => 1, - '*' => 2, - '/' => 2, - '%' => 2, - ); - - static protected $whitePattern; - static protected $commentMulti; - - static protected $commentSingle = "//"; - static protected $commentMultiLeft = "/*"; - static protected $commentMultiRight = "*/"; - - // regex string to match any of the operators - static protected $operatorString; - - // these properties will supress division unless it's inside parenthases - static protected $supressDivisionProps = - array('/border-radius$/i', '/^font$/i'); - - protected $blockDirectives = array("font-face", "keyframes", "page", "-moz-document", "viewport", "-moz-viewport", "-o-viewport", "-ms-viewport"); - protected $lineDirectives = array("charset"); - - /** - * if we are in parens we can be more liberal with whitespace around - * operators because it must evaluate to a single value and thus is less - * ambiguous. - * - * Consider: - * property1: 10 -5; // is two numbers, 10 and -5 - * property2: (10 -5); // should evaluate to 5 - */ - protected $inParens = false; - - // caches preg escaped literals - static protected $literalCache = array(); - - public function __construct($lessc, $sourceName = null) { - $this->eatWhiteDefault = true; - // reference to less needed for vPrefix, mPrefix, and parentSelector - $this->lessc = $lessc; - - $this->sourceName = $sourceName; // name used for error messages - - $this->writeComments = false; - - if (!self::$operatorString) { - self::$operatorString = - '('.implode('|', array_map(array('lessc', 'preg_quote'), - array_keys(self::$precedence))).')'; - - $commentSingle = lessc::preg_quote(self::$commentSingle); - $commentMultiLeft = lessc::preg_quote(self::$commentMultiLeft); - $commentMultiRight = lessc::preg_quote(self::$commentMultiRight); - - self::$commentMulti = $commentMultiLeft.'.*?'.$commentMultiRight; - self::$whitePattern = '/'.$commentSingle.'[^\n]*\s*|('.self::$commentMulti.')\s*|\s+/Ais'; - } - } - - public function parse($buffer) { - $this->count = 0; - $this->line = 1; - - $this->env = null; // block stack - $this->buffer = $this->writeComments ? $buffer : $this->removeComments($buffer); - $this->pushSpecialBlock("root"); - $this->eatWhiteDefault = true; - $this->seenComments = array(); - - // trim whitespace on head - // if (preg_match('/^\s+/', $this->buffer, $m)) { - // $this->line += substr_count($m[0], "\n"); - // $this->buffer = ltrim($this->buffer); - // } - $this->whitespace(); - - // parse the entire file - while (false !== $this->parseChunk()); - - if ($this->count != strlen($this->buffer)) - $this->throwError(); - - // TODO report where the block was opened - if ( !property_exists($this->env, 'parent') || !is_null($this->env->parent) ) - throw new exception('parse error: unclosed block'); - - return $this->env; - } - - /** - * Parse a single chunk off the head of the buffer and append it to the - * current parse environment. - * Returns false when the buffer is empty, or when there is an error. - * - * This function is called repeatedly until the entire document is - * parsed. - * - * This parser is most similar to a recursive descent parser. Single - * functions represent discrete grammatical rules for the language, and - * they are able to capture the text that represents those rules. - * - * Consider the function lessc::keyword(). (all parse functions are - * structured the same) - * - * The function takes a single reference argument. When calling the - * function it will attempt to match a keyword on the head of the buffer. - * If it is successful, it will place the keyword in the referenced - * argument, advance the position in the buffer, and return true. If it - * fails then it won't advance the buffer and it will return false. - * - * All of these parse functions are powered by lessc::match(), which behaves - * the same way, but takes a literal regular expression. Sometimes it is - * more convenient to use match instead of creating a new function. - * - * Because of the format of the functions, to parse an entire string of - * grammatical rules, you can chain them together using &&. - * - * But, if some of the rules in the chain succeed before one fails, then - * the buffer position will be left at an invalid state. In order to - * avoid this, lessc::seek() is used to remember and set buffer positions. - * - * Before parsing a chain, use $s = $this->seek() to remember the current - * position into $s. Then if a chain fails, use $this->seek($s) to - * go back where we started. - */ - protected function parseChunk() { - if (empty($this->buffer)) return false; - $s = $this->seek(); - - if ($this->whitespace()) { - return true; - } - - // setting a property - if ($this->keyword($key) && $this->assign() && - $this->propertyValue($value, $key) && $this->end()) - { - $this->append(array('assign', $key, $value), $s); - return true; - } else { - $this->seek($s); - } - - - // look for special css blocks - if ($this->literal('@', false)) { - $this->count--; - - // media - if ($this->literal('@media')) { - if (($this->mediaQueryList($mediaQueries) || true) - && $this->literal('{')) - { - $media = $this->pushSpecialBlock("media"); - $media->queries = is_null($mediaQueries) ? array() : $mediaQueries; - return true; - } else { - $this->seek($s); - return false; - } - } - - if ($this->literal("@", false) && $this->keyword($dirName)) { - if ($this->isDirective($dirName, $this->blockDirectives)) { - if (($this->openString("{", $dirValue, null, array(";")) || true) && - $this->literal("{")) - { - $dir = $this->pushSpecialBlock("directive"); - $dir->name = $dirName; - if (isset($dirValue)) $dir->value = $dirValue; - return true; - } - } elseif ($this->isDirective($dirName, $this->lineDirectives)) { - if ($this->propertyValue($dirValue) && $this->end()) { - $this->append(array("directive", $dirName, $dirValue)); - return true; - } - } - } - - $this->seek($s); - } - - // setting a variable - if ($this->variable($var) && $this->assign() && - $this->propertyValue($value) && $this->end()) - { - $this->append(array('assign', $var, $value), $s); - return true; - } else { - $this->seek($s); - } - - if ($this->import($importValue)) { - $this->append($importValue, $s); - return true; - } - - // opening parametric mixin - if ($this->tag($tag, true) && $this->argumentDef($args, $isVararg) && - ($this->guards($guards) || true) && - $this->literal('{')) - { - $block = $this->pushBlock($this->fixTags(array($tag))); - $block->args = $args; - $block->isVararg = $isVararg; - if (!empty($guards)) $block->guards = $guards; - return true; - } else { - $this->seek($s); - } - - // opening a simple block - if ($this->tags($tags) && $this->literal('{', false)) { - $tags = $this->fixTags($tags); - $this->pushBlock($tags); - return true; - } else { - $this->seek($s); - } - - // closing a block - if ($this->literal('}', false)) { - try { - $block = $this->pop(); - } catch (exception $e) { - $this->seek($s); - $this->throwError($e->getMessage()); - } - - $hidden = false; - if (is_null($block->type)) { - $hidden = true; - if (!isset($block->args)) { - foreach ($block->tags as $tag) { - if (!is_string($tag) || $tag{0} != $this->lessc->mPrefix) { - $hidden = false; - break; - } - } - } - - foreach ($block->tags as $tag) { - if (is_string($tag)) { - $this->env->children[$tag][] = $block; - } - } - } - - if (!$hidden) { - $this->append(array('block', $block), $s); - } - - // this is done here so comments aren't bundled into he block that - // was just closed - $this->whitespace(); - return true; - } - - // mixin - if ($this->mixinTags($tags) && - ($this->argumentDef($argv, $isVararg) || true) && - ($this->keyword($suffix) || true) && $this->end()) - { - $tags = $this->fixTags($tags); - $this->append(array('mixin', $tags, $argv, $suffix), $s); - return true; - } else { - $this->seek($s); - } - - // spare ; - if ($this->literal(';')) return true; - - return false; // got nothing, throw error - } - - protected function isDirective($dirname, $directives) { - // TODO: cache pattern in parser - $pattern = implode("|", - array_map(array("lessc", "preg_quote"), $directives)); - $pattern = '/^(-[a-z-]+-)?(' . $pattern . ')$/i'; - - return preg_match($pattern, $dirname); - } - - protected function fixTags($tags) { - // move @ tags out of variable namespace - foreach ($tags as &$tag) { - if ($tag{0} == $this->lessc->vPrefix) - $tag[0] = $this->lessc->mPrefix; - } - return $tags; - } - - // a list of expressions - protected function expressionList(&$exps) { - $values = array(); - - while ($this->expression($exp)) { - $values[] = $exp; - } - - if (count($values) == 0) return false; - - $exps = lessc::compressList($values, ' '); - return true; - } - - /** - * Attempt to consume an expression. - * @link http://en.wikipedia.org/wiki/Operator-precedence_parser#Pseudo-code - */ - protected function expression(&$out) { - if ($this->value($lhs)) { - $out = $this->expHelper($lhs, 0); - - // look for / shorthand - if (!empty($this->env->supressedDivision)) { - unset($this->env->supressedDivision); - $s = $this->seek(); - if ($this->literal("/") && $this->value($rhs)) { - $out = array("list", "", - array($out, array("keyword", "/"), $rhs)); - } else { - $this->seek($s); - } - } - - return true; - } - return false; - } - - /** - * recursively parse infix equation with $lhs at precedence $minP - */ - protected function expHelper($lhs, $minP) { - $this->inExp = true; - $ss = $this->seek(); - - while (true) { - $whiteBefore = isset($this->buffer[$this->count - 1]) && - ctype_space($this->buffer[$this->count - 1]); - - // If there is whitespace before the operator, then we require - // whitespace after the operator for it to be an expression - $needWhite = $whiteBefore && !$this->inParens; - - if ($this->match(self::$operatorString.($needWhite ? '\s' : ''), $m) && self::$precedence[$m[1]] >= $minP) { - if (!$this->inParens && isset($this->env->currentProperty) && $m[1] == "/" && empty($this->env->supressedDivision)) { - foreach (self::$supressDivisionProps as $pattern) { - if (preg_match($pattern, $this->env->currentProperty)) { - $this->env->supressedDivision = true; - break 2; - } - } - } - - - $whiteAfter = isset($this->buffer[$this->count - 1]) && - ctype_space($this->buffer[$this->count - 1]); - - if (!$this->value($rhs)) break; - - // peek for next operator to see what to do with rhs - if ($this->peek(self::$operatorString, $next) && self::$precedence[$next[1]] > self::$precedence[$m[1]]) { - $rhs = $this->expHelper($rhs, self::$precedence[$next[1]]); - } - - $lhs = array('expression', $m[1], $lhs, $rhs, $whiteBefore, $whiteAfter); - $ss = $this->seek(); - - continue; - } - - break; - } - - $this->seek($ss); - - return $lhs; - } - - // consume a list of values for a property - public function propertyValue(&$value, $keyName = null) { - $values = array(); - - if ($keyName !== null) $this->env->currentProperty = $keyName; - - $s = null; - while ($this->expressionList($v)) { - $values[] = $v; - $s = $this->seek(); - if (!$this->literal(',')) break; - } - - if ($s) $this->seek($s); - - if ($keyName !== null) unset($this->env->currentProperty); - - if (count($values) == 0) return false; - - $value = lessc::compressList($values, ', '); - return true; - } - - protected function parenValue(&$out) { - $s = $this->seek(); - - // speed shortcut - if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] != "(") { - return false; - } - - $inParens = $this->inParens; - if ($this->literal("(") && - ($this->inParens = true) && $this->expression($exp) && - $this->literal(")")) - { - $out = $exp; - $this->inParens = $inParens; - return true; - } else { - $this->inParens = $inParens; - $this->seek($s); - } - - return false; - } - - // a single value - protected function value(&$value) { - $s = $this->seek(); - - // speed shortcut - if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] == "-") { - // negation - if ($this->literal("-", false) && - (($this->variable($inner) && $inner = array("variable", $inner)) || - $this->unit($inner) || - $this->parenValue($inner))) - { - $value = array("unary", "-", $inner); - return true; - } else { - $this->seek($s); - } - } - - if ($this->parenValue($value)) return true; - if ($this->unit($value)) return true; - if ($this->color($value)) return true; - if ($this->func($value)) return true; - if ($this->string($value)) return true; - - if ($this->keyword($word)) { - $value = array('keyword', $word); - return true; - } - - // try a variable - if ($this->variable($var)) { - $value = array('variable', $var); - return true; - } - - // unquote string (should this work on any type? - if ($this->literal("~") && $this->string($str)) { - $value = array("escape", $str); - return true; - } else { - $this->seek($s); - } - - // css hack: \0 - if ($this->literal('\\') && $this->match('([0-9]+)', $m)) { - $value = array('keyword', '\\'.$m[1]); - return true; - } else { - $this->seek($s); - } - - return false; - } - - // an import statement - protected function import(&$out) { - if (!$this->literal('@import')) return false; - - // @import "something.css" media; - // @import url("something.css") media; - // @import url(something.css) media; - - if ($this->propertyValue($value)) { - $out = array("import", $value); - return true; - } - } - - protected function mediaQueryList(&$out) { - if ($this->genericList($list, "mediaQuery", ",", false)) { - $out = $list[2]; - return true; - } - return false; - } - - protected function mediaQuery(&$out) { - $s = $this->seek(); - - $expressions = null; - $parts = array(); - - if (($this->literal("only") && ($only = true) || $this->literal("not") && ($not = true) || true) && $this->keyword($mediaType)) { - $prop = array("mediaType"); - if (isset($only)) $prop[] = "only"; - if (isset($not)) $prop[] = "not"; - $prop[] = $mediaType; - $parts[] = $prop; - } else { - $this->seek($s); - } - - - if (!empty($mediaType) && !$this->literal("and")) { - // ~ - } else { - $this->genericList($expressions, "mediaExpression", "and", false); - if (is_array($expressions)) $parts = array_merge($parts, $expressions[2]); - } - - if (count($parts) == 0) { - $this->seek($s); - return false; - } - - $out = $parts; - return true; - } - - protected function mediaExpression(&$out) { - $s = $this->seek(); - $value = null; - if ($this->literal("(") && - $this->keyword($feature) && - ($this->literal(":") && $this->expression($value) || true) && - $this->literal(")")) - { - $out = array("mediaExp", $feature); - if ($value) $out[] = $value; - return true; - } elseif ($this->variable($variable)) { - $out = array('variable', $variable); - return true; - } - - $this->seek($s); - return false; - } - - // an unbounded string stopped by $end - protected function openString($end, &$out, $nestingOpen=null, $rejectStrs = null) { - $oldWhite = $this->eatWhiteDefault; - $this->eatWhiteDefault = false; - - $stop = array("'", '"', "@{", $end); - $stop = array_map(array("lessc", "preg_quote"), $stop); - // $stop[] = self::$commentMulti; - - if (!is_null($rejectStrs)) { - $stop = array_merge($stop, $rejectStrs); - } - - $patt = '(.*?)('.implode("|", $stop).')'; - - $nestingLevel = 0; - - $content = array(); - while ($this->match($patt, $m, false)) { - if (!empty($m[1])) { - $content[] = $m[1]; - if ($nestingOpen) { - $nestingLevel += substr_count($m[1], $nestingOpen); - } - } - - $tok = $m[2]; - - $this->count-= strlen($tok); - if ($tok == $end) { - if ($nestingLevel == 0) { - break; - } else { - $nestingLevel--; - } - } - - if (($tok == "'" || $tok == '"') && $this->string($str)) { - $content[] = $str; - continue; - } - - if ($tok == "@{" && $this->interpolation($inter)) { - $content[] = $inter; - continue; - } - - if (!empty($rejectStrs) && in_array($tok, $rejectStrs)) { - break; - } - - $content[] = $tok; - $this->count+= strlen($tok); - } - - $this->eatWhiteDefault = $oldWhite; - - if (count($content) == 0) return false; - - // trim the end - if (is_string(end($content))) { - $content[count($content) - 1] = rtrim(end($content)); - } - - $out = array("string", "", $content); - return true; - } - - protected function string(&$out) { - $s = $this->seek(); - if ($this->literal('"', false)) { - $delim = '"'; - } elseif ($this->literal("'", false)) { - $delim = "'"; - } else { - return false; - } - - $content = array(); - - // look for either ending delim , escape, or string interpolation - $patt = '([^\n]*?)(@\{|\\\\|' . - lessc::preg_quote($delim).')'; - - $oldWhite = $this->eatWhiteDefault; - $this->eatWhiteDefault = false; - - while ($this->match($patt, $m, false)) { - $content[] = $m[1]; - if ($m[2] == "@{") { - $this->count -= strlen($m[2]); - if ($this->interpolation($inter, false)) { - $content[] = $inter; - } else { - $this->count += strlen($m[2]); - $content[] = "@{"; // ignore it - } - } elseif ($m[2] == '\\') { - $content[] = $m[2]; - if ($this->literal($delim, false)) { - $content[] = $delim; - } - } else { - $this->count -= strlen($delim); - break; // delim - } - } - - $this->eatWhiteDefault = $oldWhite; - - if ($this->literal($delim)) { - $out = array("string", $delim, $content); - return true; - } - - $this->seek($s); - return false; - } - - protected function interpolation(&$out) { - $oldWhite = $this->eatWhiteDefault; - $this->eatWhiteDefault = true; - - $s = $this->seek(); - if ($this->literal("@{") && - $this->openString("}", $interp, null, array("'", '"', ";")) && - $this->literal("}", false)) - { - $out = array("interpolate", $interp); - $this->eatWhiteDefault = $oldWhite; - if ($this->eatWhiteDefault) $this->whitespace(); - return true; - } - - $this->eatWhiteDefault = $oldWhite; - $this->seek($s); - return false; - } - - protected function unit(&$unit) { - // speed shortcut - if (isset($this->buffer[$this->count])) { - $char = $this->buffer[$this->count]; - if (!ctype_digit($char) && $char != ".") return false; - } - - if ($this->match('([0-9]+(?:\.[0-9]*)?|\.[0-9]+)([%a-zA-Z]+)?', $m)) { - $unit = array("number", $m[1], empty($m[2]) ? "" : $m[2]); - return true; - } - return false; - } - - // a # color - protected function color(&$out) { - if ($this->match('(#(?:[0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{3}))', $m)) { - if (strlen($m[1]) > 7) { - $out = array("string", "", array($m[1])); - } else { - $out = array("raw_color", $m[1]); - } - return true; - } - - return false; - } - - // consume an argument definition list surrounded by () - // each argument is a variable name with optional value - // or at the end a ... or a variable named followed by ... - // arguments are separated by , unless a ; is in the list, then ; is the - // delimiter. - protected function argumentDef(&$args, &$isVararg) { - $s = $this->seek(); - if (!$this->literal('(')) return false; - - $values = array(); - $delim = ","; - $method = "expressionList"; - - $isVararg = false; - while (true) { - if ($this->literal("...")) { - $isVararg = true; - break; - } - - if ($this->$method($value)) { - if ($value[0] == "variable") { - $arg = array("arg", $value[1]); - $ss = $this->seek(); - - if ($this->assign() && $this->$method($rhs)) { - $arg[] = $rhs; - } else { - $this->seek($ss); - if ($this->literal("...")) { - $arg[0] = "rest"; - $isVararg = true; - } - } - - $values[] = $arg; - if ($isVararg) break; - continue; - } else { - $values[] = array("lit", $value); - } - } - - - if (!$this->literal($delim)) { - if ($delim == "," && $this->literal(";")) { - // found new delim, convert existing args - $delim = ";"; - $method = "propertyValue"; - - // transform arg list - if (isset($values[1])) { // 2 items - $newList = array(); - foreach ($values as $i => $arg) { - switch($arg[0]) { - case "arg": - if ($i) { - $this->throwError("Cannot mix ; and , as delimiter types"); - } - $newList[] = $arg[2]; - break; - case "lit": - $newList[] = $arg[1]; - break; - case "rest": - $this->throwError("Unexpected rest before semicolon"); - } - } - - $newList = array("list", ", ", $newList); - - switch ($values[0][0]) { - case "arg": - $newArg = array("arg", $values[0][1], $newList); - break; - case "lit": - $newArg = array("lit", $newList); - break; - } - - } elseif ($values) { // 1 item - $newArg = $values[0]; - } - - if ($newArg) { - $values = array($newArg); - } - } else { - break; - } - } - } - - if (!$this->literal(')')) { - $this->seek($s); - return false; - } - - $args = $values; - - return true; - } - - // consume a list of tags - // this accepts a hanging delimiter - protected function tags(&$tags, $simple = false, $delim = ',') { - $tags = array(); - while ($this->tag($tt, $simple)) { - $tags[] = $tt; - if (!$this->literal($delim)) break; - } - if (count($tags) == 0) return false; - - return true; - } - - // list of tags of specifying mixin path - // optionally separated by > (lazy, accepts extra >) - protected function mixinTags(&$tags) { - $tags = array(); - while ($this->tag($tt, true)) { - $tags[] = $tt; - $this->literal(">"); - } - - if (count($tags) == 0) return false; - - return true; - } - - // a bracketed value (contained within in a tag definition) - protected function tagBracket(&$parts, &$hasExpression) { - // speed shortcut - if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] != "[") { - return false; - } - - $s = $this->seek(); - - $hasInterpolation = false; - - if ($this->literal("[", false)) { - $attrParts = array("["); - // keyword, string, operator - while (true) { - if ($this->literal("]", false)) { - $this->count--; - break; // get out early - } - - if ($this->match('\s+', $m)) { - $attrParts[] = " "; - continue; - } - if ($this->string($str)) { - // escape parent selector, (yuck) - foreach ($str[2] as &$chunk) { - $chunk = str_replace($this->lessc->parentSelector, "$&$", $chunk); - } - - $attrParts[] = $str; - $hasInterpolation = true; - continue; - } - - if ($this->keyword($word)) { - $attrParts[] = $word; - continue; - } - - if ($this->interpolation($inter, false)) { - $attrParts[] = $inter; - $hasInterpolation = true; - continue; - } - - // operator, handles attr namespace too - if ($this->match('[|-~\$\*\^=]+', $m)) { - $attrParts[] = $m[0]; - continue; - } - - break; - } - - if ($this->literal("]", false)) { - $attrParts[] = "]"; - foreach ($attrParts as $part) { - $parts[] = $part; - } - $hasExpression = $hasExpression || $hasInterpolation; - return true; - } - $this->seek($s); - } - - $this->seek($s); - return false; - } - - // a space separated list of selectors - protected function tag(&$tag, $simple = false) { - if ($simple) - $chars = '^@,:;{}\][>\(\) "\''; - else - $chars = '^@,;{}["\''; - - $s = $this->seek(); - - $hasExpression = false; - $parts = array(); - while ($this->tagBracket($parts, $hasExpression)); - - $oldWhite = $this->eatWhiteDefault; - $this->eatWhiteDefault = false; - - while (true) { - if ($this->match('(['.$chars.'0-9]['.$chars.']*)', $m)) { - $parts[] = $m[1]; - if ($simple) break; - - while ($this->tagBracket($parts, $hasExpression)); - continue; - } - - if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] == "@") { - if ($this->interpolation($interp)) { - $hasExpression = true; - $interp[2] = true; // don't unescape - $parts[] = $interp; - continue; - } - - if ($this->literal("@")) { - $parts[] = "@"; - continue; - } - } - - if ($this->unit($unit)) { // for keyframes - $parts[] = $unit[1]; - $parts[] = $unit[2]; - continue; - } - - break; - } - - $this->eatWhiteDefault = $oldWhite; - if (!$parts) { - $this->seek($s); - return false; - } - - if ($hasExpression) { - $tag = array("exp", array("string", "", $parts)); - } else { - $tag = trim(implode($parts)); - } - - $this->whitespace(); - return true; - } - - // a css function - protected function func(&$func) { - $s = $this->seek(); - - if ($this->match('(%|[\w\-_][\w\-_:\.]+|[\w_])', $m) && $this->literal('(')) { - $fname = $m[1]; - - $sPreArgs = $this->seek(); - - $args = array(); - while (true) { - $ss = $this->seek(); - // this ugly nonsense is for ie filter properties - if ($this->keyword($name) && $this->literal('=') && $this->expressionList($value)) { - $args[] = array("string", "", array($name, "=", $value)); - } else { - $this->seek($ss); - if ($this->expressionList($value)) { - $args[] = $value; - } - } - - if (!$this->literal(',')) break; - } - $args = array('list', ',', $args); - - if ($this->literal(')')) { - $func = array('function', $fname, $args); - return true; - } elseif ($fname == 'url') { - // couldn't parse and in url? treat as string - $this->seek($sPreArgs); - if ($this->openString(")", $string) && $this->literal(")")) { - $func = array('function', $fname, $string); - return true; - } - } - } - - $this->seek($s); - return false; - } - - // consume a less variable - protected function variable(&$name) { - $s = $this->seek(); - if ($this->literal($this->lessc->vPrefix, false) && - ($this->variable($sub) || $this->keyword($name))) - { - if (!empty($sub)) { - $name = array('variable', $sub); - } else { - $name = $this->lessc->vPrefix.$name; - } - return true; - } - - $name = null; - $this->seek($s); - return false; - } - - /** - * Consume an assignment operator - * Can optionally take a name that will be set to the current property name - */ - protected function assign($name = null) { - if ($name) $this->currentProperty = $name; - return $this->literal(':') || $this->literal('='); - } - - // consume a keyword - protected function keyword(&$word) { - if ($this->match('([\w_\-\*!"][\w\-_"]*)', $m)) { - $word = $m[1]; - return true; - } - return false; - } - - // consume an end of statement delimiter - protected function end() { - if ($this->literal(';', false)) { - return true; - } elseif ($this->count == strlen($this->buffer) || $this->buffer[$this->count] == '}') { - // if there is end of file or a closing block next then we don't need a ; - return true; - } - return false; - } - - protected function guards(&$guards) { - $s = $this->seek(); - - if (!$this->literal("when")) { - $this->seek($s); - return false; - } - - $guards = array(); - - while ($this->guardGroup($g)) { - $guards[] = $g; - if (!$this->literal(",")) break; - } - - if (count($guards) == 0) { - $guards = null; - $this->seek($s); - return false; - } - - return true; - } - - // a bunch of guards that are and'd together - // TODO rename to guardGroup - protected function guardGroup(&$guardGroup) { - $s = $this->seek(); - $guardGroup = array(); - while ($this->guard($guard)) { - $guardGroup[] = $guard; - if (!$this->literal("and")) break; - } - - if (count($guardGroup) == 0) { - $guardGroup = null; - $this->seek($s); - return false; - } - - return true; - } - - protected function guard(&$guard) { - $s = $this->seek(); - $negate = $this->literal("not"); - - if ($this->literal("(") && $this->expression($exp) && $this->literal(")")) { - $guard = $exp; - if ($negate) $guard = array("negate", $guard); - return true; - } - - $this->seek($s); - return false; - } - - /* raw parsing functions */ - - protected function literal($what, $eatWhitespace = null) { - if ($eatWhitespace === null) $eatWhitespace = $this->eatWhiteDefault; - - // shortcut on single letter - if (!isset($what[1]) && isset($this->buffer[$this->count])) { - if ($this->buffer[$this->count] == $what) { - if (!$eatWhitespace) { - $this->count++; - return true; - } - // goes below... - } else { - return false; - } - } - - if (!isset(self::$literalCache[$what])) { - self::$literalCache[$what] = lessc::preg_quote($what); - } - - return $this->match(self::$literalCache[$what], $m, $eatWhitespace); - } - - protected function genericList(&$out, $parseItem, $delim="", $flatten=true) { - $s = $this->seek(); - $items = array(); - while ($this->$parseItem($value)) { - $items[] = $value; - if ($delim) { - if (!$this->literal($delim)) break; - } - } - - if (count($items) == 0) { - $this->seek($s); - return false; - } - - if ($flatten && count($items) == 1) { - $out = $items[0]; - } else { - $out = array("list", $delim, $items); - } - - return true; - } - - - // advance counter to next occurrence of $what - // $until - don't include $what in advance - // $allowNewline, if string, will be used as valid char set - protected function to($what, &$out, $until = false, $allowNewline = false) { - if (is_string($allowNewline)) { - $validChars = $allowNewline; - } else { - $validChars = $allowNewline ? "." : "[^\n]"; - } - if (!$this->match('('.$validChars.'*?)'.lessc::preg_quote($what), $m, !$until)) return false; - if ($until) $this->count -= strlen($what); // give back $what - $out = $m[1]; - return true; - } - - // try to match something on head of buffer - protected function match($regex, &$out, $eatWhitespace = null) { - if ($eatWhitespace === null) $eatWhitespace = $this->eatWhiteDefault; - - $r = '/'.$regex.($eatWhitespace && !$this->writeComments ? '\s*' : '').'/Ais'; - if (preg_match($r, $this->buffer, $out, null, $this->count)) { - $this->count += strlen($out[0]); - if ($eatWhitespace && $this->writeComments) $this->whitespace(); - return true; - } - return false; - } - - // match some whitespace - protected function whitespace() { - if ($this->writeComments) { - $gotWhite = false; - while (preg_match(self::$whitePattern, $this->buffer, $m, null, $this->count)) { - if (isset($m[1]) && empty($this->seenComments[$this->count])) { - $this->append(array("comment", $m[1])); - $this->seenComments[$this->count] = true; - } - $this->count += strlen($m[0]); - $gotWhite = true; - } - return $gotWhite; - } else { - $this->match("", $m); - return strlen($m[0]) > 0; - } - } - - // match something without consuming it - protected function peek($regex, &$out = null, $from=null) { - if (is_null($from)) $from = $this->count; - $r = '/'.$regex.'/Ais'; - $result = preg_match($r, $this->buffer, $out, null, $from); - - return $result; - } - - // seek to a spot in the buffer or return where we are on no argument - protected function seek($where = null) { - if ($where === null) return $this->count; - else $this->count = $where; - return true; - } - - /* misc functions */ - - public function throwError($msg = "parse error", $count = null) { - $count = is_null($count) ? $this->count : $count; - - $line = $this->line + - substr_count(substr($this->buffer, 0, $count), "\n"); - - if (!empty($this->sourceName)) { - $loc = "$this->sourceName on line $line"; - } else { - $loc = "line: $line"; - } - - // TODO this depends on $this->count - if ($this->peek("(.*?)(\n|$)", $m, $count)) { - throw new exception("$msg: failed at `$m[1]` $loc"); - } else { - throw new exception("$msg: $loc"); - } - } - - protected function pushBlock($selectors=null, $type=null) { - $b = new stdclass; - $b->parent = $this->env; - - $b->type = $type; - $b->id = self::$nextBlockId++; - - $b->isVararg = false; // TODO: kill me from here - $b->tags = $selectors; - - $b->props = array(); - $b->children = array(); - - $this->env = $b; - return $b; - } - - // push a block that doesn't multiply tags - protected function pushSpecialBlock($type) { - return $this->pushBlock(null, $type); - } - - // append a property to the current block - protected function append($prop, $pos = null) { - if ($pos !== null) $prop[-1] = $pos; - $this->env->props[] = $prop; - } - - // pop something off the stack - protected function pop() { - $old = $this->env; - $this->env = $this->env->parent; - return $old; - } - - // remove comments from $text - // todo: make it work for all functions, not just url - protected function removeComments($text) { - $look = array( - 'url(', '//', '/*', '"', "'" - ); - - $out = ''; - $min = null; - while (true) { - // find the next item - foreach ($look as $token) { - $pos = strpos($text, $token); - if ($pos !== false) { - if (!isset($min) || $pos < $min[1]) $min = array($token, $pos); - } - } - - if (is_null($min)) break; - - $count = $min[1]; - $skip = 0; - $newlines = 0; - switch ($min[0]) { - case 'url(': - if (preg_match('/url\(.*?\)/', $text, $m, 0, $count)) - $count += strlen($m[0]) - strlen($min[0]); - break; - case '"': - case "'": - if (preg_match('/'.$min[0].'.*?(?indentLevel = 0; - } - - public function indentStr($n = 0) { - return str_repeat($this->indentChar, max($this->indentLevel + $n, 0)); - } - - public function property($name, $value) { - return $name . $this->assignSeparator . $value . ";"; - } - - protected function isEmpty($block) { - if (empty($block->lines)) { - foreach ($block->children as $child) { - if (!$this->isEmpty($child)) return false; - } - - return true; - } - return false; - } - - public function block($block) { - if ($this->isEmpty($block)) return; - - $inner = $pre = $this->indentStr(); - - $isSingle = !$this->disableSingle && - is_null($block->type) && count($block->lines) == 1; - - if (!empty($block->selectors)) { - $this->indentLevel++; - - if ($this->breakSelectors) { - $selectorSeparator = $this->selectorSeparator . $this->break . $pre; - } else { - $selectorSeparator = $this->selectorSeparator; - } - - echo $pre . - implode($selectorSeparator, $block->selectors); - if ($isSingle) { - echo $this->openSingle; - $inner = ""; - } else { - echo $this->open . $this->break; - $inner = $this->indentStr(); - } - - } - - if (!empty($block->lines)) { - $glue = $this->break.$inner; - echo $inner . implode($glue, $block->lines); - if (!$isSingle && !empty($block->children)) { - echo $this->break; - } - } - - foreach ($block->children as $child) { - $this->block($child); - } - - if (!empty($block->selectors)) { - if (!$isSingle && empty($block->children)) echo $this->break; - - if ($isSingle) { - echo $this->closeSingle . $this->break; - } else { - echo $pre . $this->close . $this->break; - } - - $this->indentLevel--; - } - } -} - -class lessc_formatter_compressed extends lessc_formatter_classic { - public $disableSingle = true; - public $open = "{"; - public $selectorSeparator = ","; - public $assignSeparator = ":"; - public $break = ""; - public $compressColors = true; - - public function indentStr($n = 0) { - return ""; - } -} - -class lessc_formatter_lessjs extends lessc_formatter_classic { - public $disableSingle = true; - public $breakSelectors = true; - public $assignSeparator = ": "; - public $selectorSeparator = ","; -} - - diff --git a/vendor/leafo/lessphp/lessify b/vendor/leafo/lessphp/lessify deleted file mode 100644 index becc5388..00000000 --- a/vendor/leafo/lessphp/lessify +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/php -parse(); -} catch (exception $e) { - exit("Fatal error: ".$e->getMessage()."\n"); -} - - diff --git a/vendor/leafo/lessphp/lessify.inc.php b/vendor/leafo/lessphp/lessify.inc.php deleted file mode 100644 index 91c14423..00000000 --- a/vendor/leafo/lessphp/lessify.inc.php +++ /dev/null @@ -1,447 +0,0 @@ - - * - * WARNING: THIS DOES NOT WORK ANYMORE. NEEDS TO BE UPDATED FOR - * LATEST VERSION OF LESSPHP. - * - */ - -require "lessc.inc.php"; - -// -// check if the merge during mixin is overwriting values. should or should it not? -// - -// -// 1. split apart class tags -// - -class easyparse { - var $buffer; - var $count; - - function __construct($str) { - $this->count = 0; - $this->buffer = trim($str); - } - - function seek($where = null) { - if ($where === null) return $this->count; - else $this->count = $where; - return true; - } - - function preg_quote($what) { - return preg_quote($what, '/'); - } - - function match($regex, &$out, $eatWhitespace = true) { - $r = '/'.$regex.($eatWhitespace ? '\s*' : '').'/Ais'; - if (preg_match($r, $this->buffer, $out, null, $this->count)) { - $this->count += strlen($out[0]); - return true; - } - return false; - } - - function literal($what, $eatWhitespace = true) { - // this is here mainly prevent notice from { } string accessor - if ($this->count >= strlen($this->buffer)) return false; - - // shortcut on single letter - if (!$eatWhitespace and strlen($what) == 1) { - if ($this->buffer{$this->count} == $what) { - $this->count++; - return true; - } - else return false; - } - - return $this->match($this->preg_quote($what), $m, $eatWhitespace); - } - -} - -class tagparse extends easyparse { - static private $combinators = null; - static private $match_opts = null; - - function parse() { - if (empty(self::$combinators)) { - self::$combinators = '('.implode('|', array_map(array($this, 'preg_quote'), - array('+', '>', '~'))).')'; - self::$match_opts = '('.implode('|', array_map(array($this, 'preg_quote'), - array('=', '~=', '|=', '$=', '*='))).')'; - } - - // crush whitespace - $this->buffer = preg_replace('/\s+/', ' ', $this->buffer).' '; - - $tags = array(); - while ($this->tag($t)) $tags[] = $t; - - return $tags; - } - - static function compileString($string) { - list(, $delim, $str) = $string; - $str = str_replace($delim, "\\".$delim, $str); - $str = str_replace("\n", "\\\n", $str); - return $delim.$str.$delim; - } - - static function compilePaths($paths) { - return implode(', ', array_map(array('self', 'compilePath'), $paths)); - } - - // array of tags - static function compilePath($path) { - return implode(' ', array_map(array('self', 'compileTag'), $path)); - } - - - static function compileTag($tag) { - ob_start(); - if (isset($tag['comb'])) echo $tag['comb']." "; - if (isset($tag['front'])) echo $tag['front']; - if (isset($tag['attr'])) { - echo '['.$tag['attr']; - if (isset($tag['op'])) { - echo $tag['op'].$tag['op_value']; - } - echo ']'; - } - return ob_get_clean(); - } - - function string(&$out) { - $s = $this->seek(); - - if ($this->literal('"')) { - $delim = '"'; - } elseif ($this->literal("'")) { - $delim = "'"; - } else { - return false; - } - - while (true) { - // step through letters looking for either end or escape - $buff = ""; - $escapeNext = false; - $finished = false; - for ($i = $this->count; $i < strlen($this->buffer); $i++) { - $char = $this->buffer[$i]; - switch ($char) { - case $delim: - if ($escapeNext) { - $buff .= $char; - $escapeNext = false; - break; - } - $finished = true; - break 2; - case "\\": - if ($escapeNext) { - $buff .= $char; - $escapeNext = false; - } else { - $escapeNext = true; - } - break; - case "\n": - if (!$escapeNext) { - break 3; - } - - $buff .= $char; - $escapeNext = false; - break; - default: - if ($escapeNext) { - $buff .= "\\"; - $escapeNext = false; - } - $buff .= $char; - } - } - if (!$finished) break; - $out = array('string', $delim, $buff); - $this->seek($i+1); - return true; - } - - $this->seek($s); - return false; - } - - function tag(&$out) { - $s = $this->seek(); - $tag = array(); - if ($this->combinator($op)) $tag['comb'] = $op; - - if (!$this->match('(.*?)( |$|\[|'.self::$combinators.')', $match)) { - $this->seek($s); - return false; - } - - if (!empty($match[3])) { - // give back combinator - $this->count-=strlen($match[3]); - } - - if (!empty($match[1])) $tag['front'] = $match[1]; - - if ($match[2] == '[') { - if ($this->ident($i)) { - $tag['attr'] = $i; - - if ($this->match(self::$match_opts, $m) && $this->value($v)) { - $tag['op'] = $m[1]; - $tag['op_value'] = $v; - } - - if ($this->literal(']')) { - $out = $tag; - return true; - } - } - } elseif (isset($tag['front'])) { - $out = $tag; - return true; - } - - $this->seek($s); - return false; - } - - function ident(&$out) { - // [-]?{nmstart}{nmchar}* - // nmstart: [_a-z]|{nonascii}|{escape} - // nmchar: [_a-z0-9-]|{nonascii}|{escape} - if ($this->match('(-?[_a-z][_\w]*)', $m)) { - $out = $m[1]; - return true; - } - return false; - } - - function value(&$out) { - if ($this->string($str)) { - $out = $this->compileString($str); - return true; - } elseif ($this->ident($id)) { - $out = $id; - return true; - } - return false; - } - - - function combinator(&$op) { - if ($this->match(self::$combinators, $m)) { - $op = $m[1]; - return true; - } - return false; - } -} - -class nodecounter { - var $count = 0; - var $children = array(); - - var $name; - var $child_blocks; - var $the_block; - - function __construct($name) { - $this->name = $name; - } - - function dump($stack = null) { - if (is_null($stack)) $stack = array(); - $stack[] = $this->getName(); - echo implode(' -> ', $stack)." ($this->count)\n"; - foreach ($this->children as $child) { - $child->dump($stack); - } - } - - static function compileProperties($c, $block) { - foreach($block as $name => $value) { - if ($c->isProperty($name, $value)) { - echo $c->compileProperty($name, $value)."\n"; - } - } - } - - function compile($c, $path = null) { - if (is_null($path)) $path = array(); - $path[] = $this->name; - - $isVisible = !is_null($this->the_block) || !is_null($this->child_blocks); - - if ($isVisible) { - echo $c->indent(implode(' ', $path).' {'); - $c->indentLevel++; - $path = array(); - - if ($this->the_block) { - $this->compileProperties($c, $this->the_block); - } - - if ($this->child_blocks) { - foreach ($this->child_blocks as $block) { - echo $c->indent(tagparse::compilePaths($block['__tags']).' {'); - $c->indentLevel++; - $this->compileProperties($c, $block); - $c->indentLevel--; - echo $c->indent('}'); - } - } - } - - // compile child nodes - foreach($this->children as $node) { - $node->compile($c, $path); - } - - if ($isVisible) { - $c->indentLevel--; - echo $c->indent('}'); - } - - } - - function getName() { - if (is_null($this->name)) return "[root]"; - else return $this->name; - } - - function getNode($name) { - if (!isset($this->children[$name])) { - $this->children[$name] = new nodecounter($name); - } - - return $this->children[$name]; - } - - function findNode($path) { - $current = $this; - for ($i = 0; $i < count($path); $i++) { - $t = tagparse::compileTag($path[$i]); - $current = $current->getNode($t); - } - - return $current; - } - - function addBlock($path, $block) { - $node = $this->findNode($path); - if (!is_null($node->the_block)) throw new exception("can this happen?"); - - unset($block['__tags']); - $node->the_block = $block; - } - - function addToNode($path, $block) { - $node = $this->findNode($path); - $node->child_blocks[] = $block; - } -} - -/** - * create a less file from a css file by combining blocks where appropriate - */ -class lessify extends lessc { - public function dump() { - print_r($this->env); - } - - public function parse($str = null) { - $this->prepareParser($str ? $str : $this->buffer); - while (false !== $this->parseChunk()); - - $root = new nodecounter(null); - - // attempt to preserve some of the block order - $order = array(); - - $visitedTags = array(); - foreach (end($this->env) as $name => $block) { - if (!$this->isBlock($name, $block)) continue; - if (isset($visitedTags[$name])) continue; - - foreach ($block['__tags'] as $t) { - $visitedTags[$t] = true; - } - - // skip those with more than 1 - if (count($block['__tags']) == 1) { - $p = new tagparse(end($block['__tags'])); - $path = $p->parse(); - $root->addBlock($path, $block); - $order[] = array('compressed', $path, $block); - continue; - } else { - $common = null; - $paths = array(); - foreach ($block['__tags'] as $rawtag) { - $p = new tagparse($rawtag); - $paths[] = $path = $p->parse(); - if (is_null($common)) $common = $path; - else { - $new_common = array(); - foreach ($path as $tag) { - $head = array_shift($common); - if ($tag == $head) { - $new_common[] = $head; - } else break; - } - $common = $new_common; - if (empty($common)) { - // nothing in common - break; - } - } - } - - if (!empty($common)) { - $new_paths = array(); - foreach ($paths as $p) $new_paths[] = array_slice($p, count($common)); - $block['__tags'] = $new_paths; - $root->addToNode($common, $block); - $order[] = array('compressed', $common, $block); - continue; - } - - } - - $order[] = array('none', $block['__tags'], $block); - } - - - $compressed = $root->children; - foreach ($order as $item) { - list($type, $tags, $block) = $item; - if ($type == 'compressed') { - $top = tagparse::compileTag(reset($tags)); - if (isset($compressed[$top])) { - $compressed[$top]->compile($this); - unset($compressed[$top]); - } - } else { - echo $this->indent(implode(', ', $tags).' {'); - $this->indentLevel++; - nodecounter::compileProperties($this, $block); - $this->indentLevel--; - echo $this->indent('}'); - } - } - } -} diff --git a/vendor/leafo/lessphp/package.sh b/vendor/leafo/lessphp/package.sh deleted file mode 100644 index f0888f12..00000000 --- a/vendor/leafo/lessphp/package.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/sh - -# creates tar.gz for current version - -VERSION=`./plessc -v | sed -n 's/^v\(.*\)$/\1/p'` -OUT_DIR="tmp/lessphp" -TMP=`dirname $OUT_DIR` - -mkdir -p $OUT_DIR -tar -c `git ls-files` | tar -C $OUT_DIR -x - -rm $OUT_DIR/.gitignore -rm $OUT_DIR/package.sh -rm $OUT_DIR/lessify -rm $OUT_DIR/lessify.inc.php - -OUT_NAME="lessphp-$VERSION.tar.gz" -tar -czf $OUT_NAME -C $TMP lessphp/ -echo "Wrote $OUT_NAME" - -rm -r $TMP - - -echo -echo "Don't forget to" -echo "* Update the version in lessc.inc.php (two places)" -echo "* Update the version in the README.md" -echo "* Update the version in docs.md (two places)" -echo "* Update the version in LICENSE" -echo "* Update @current_version in site.moon" -echo "* Add entry to feed.moon for changelog" -echo "* Update the -New- area on homepage with date and features" -echo - - diff --git a/vendor/leafo/lessphp/plessc b/vendor/leafo/lessphp/plessc deleted file mode 100644 index 1871dc77..00000000 --- a/vendor/leafo/lessphp/plessc +++ /dev/null @@ -1,250 +0,0 @@ -#!/usr/bin/env php -, 2013 - -$exe = array_shift($argv); // remove filename - -$HELP = << 0 && preg_match('/^-([-hvrwncXT]$|[f]=)/', $argv[0])) { - array_shift($argv); -} - -function has() { - global $opts; - foreach (func_get_args() as $arg) { - if (isset($opts[$arg])) return true; - } - return false; -} - -if (has("h", "help")) { - exit($HELP); -} - -error_reporting(E_ALL); -$path = realpath(dirname(__FILE__)).'/'; - -require $path."lessc.inc.php"; - -$VERSION = lessc::$VERSION; - -$fa = "Fatal Error: "; -function err($msg) { - fwrite(STDERR, $msg."\n"); -} - -if (php_sapi_name() != "cli") { - err($fa.$argv[0]." must be run in the command line."); - exit(1); -} - -function make_less($fname = null) { - global $opts; - $l = new lessc($fname); - - if (has("f")) { - $format = $opts["f"]; - if ($format != "default") $l->setFormatter($format); - } - - if (has("c")) { - $l->setPreserveComments(true); - } - - return $l; -} - -function process($data, $import = null) { - global $fa; - - $l = make_less(); - if ($import) $l->importDir = $import; - - try { - echo $l->parse($data); - exit(0); - } catch (exception $ex) { - err($fa."\n".str_repeat('=', 20)."\n". - $ex->getMessage()); - exit(1); - } -} - -if (has("v")) { - exit($VERSION."\n"); -} - -if (has("r")) { - if (!empty($argv)) { - $data = $argv[0]; - } else { - $data = ""; - while (!feof(STDIN)) { - $data .= fread(STDIN, 8192); - } - } - exit(process($data)); -} - -if (has("w")) { - // need two files - if (!is_file($in = array_shift($argv)) || - null == $out = array_shift($argv)) - { - err($fa.$exe." -w infile outfile"); - exit(1); - } - - echo "Watching ".$in. - (has("n") ? ' with notifications' : ''). - ", press Ctrl + c to exit.\n"; - - $cache = $in; - $last_action = 0; - while (true) { - clearstatcache(); - - // check if anything has changed since last fail - $updated = false; - if (is_array($cache)) { - foreach ($cache['files'] as $fname=>$_) { - if (filemtime($fname) > $last_action) { - $updated = true; - break; - } - } - } else $updated = true; - - // try to compile it - if ($updated) { - $last_action = time(); - - try { - $cache = lessc::cexecute($cache); - echo "Writing updated file: ".$out."\n"; - if (!file_put_contents($out, $cache['compiled'])) { - err($fa."Could not write to file ".$out); - exit(1); - } - } catch (exception $ex) { - echo "\nFatal Error:\n".str_repeat('=', 20)."\n". - $ex->getMessage()."\n\n"; - - if (has("n")) { - `notify-send -u critical "compile failed" "{$ex->getMessage()}"`; - } - } - } - - sleep(1); - } - exit(0); -} - -if (!$fname = array_shift($argv)) { - echo $HELP; - exit(1); -} - -function dumpValue($node, $depth = 0) { - if (is_object($node)) { - $indent = str_repeat(" ", $depth); - $out = array(); - foreach ($node->props as $prop) { - $out[] = $indent . dumpValue($prop, $depth + 1); - } - $out = implode("\n", $out); - if (!empty($node->tags)) { - $out = "+ ".implode(", ", $node->tags)."\n".$out; - } - return $out; - } elseif (is_array($node)) { - if (empty($node)) return "[]"; - $type = $node[0]; - if ($type == "block") - return dumpValue($node[1], $depth); - - $out = array(); - foreach ($node as $value) { - $out[] = dumpValue($value, $depth); - } - return "{ ".implode(", ", $out)." }"; - } else { - if (is_string($node) && preg_match("/[\s,]/", $node)) { - return '"'.$node.'"'; - } - return $node; // normal value - } -} - - -function stripValue($o, $toStrip) { - if (is_array($o) || is_object($o)) { - $isObject = is_object($o); - $o = (array)$o; - foreach ($toStrip as $removeKey) { - if (!empty($o[$removeKey])) { - $o[$removeKey] = "*stripped*"; - } - } - - foreach ($o as $k => $v) { - $o[$k] = stripValue($v, $toStrip); - } - - if ($isObject) { - $o = (object)$o; - } - } - - return $o; -} - -function dumpWithoutParent($o, $alsoStrip=array()) { - $toStrip = array_merge(array("parent"), $alsoStrip); - print_r(stripValue($o, $toStrip)); -} - -try { - $less = make_less($fname); - if (has("T", "X")) { - $parser = new lessc_parser($less, $fname); - $tree = $parser->parse(file_get_contents($fname)); - if (has("X")) - $out = print_r($tree, 1); - else - $out = dumpValue($tree)."\n"; - } else { - $out = $less->parse(); - } - - if (!$fout = array_shift($argv)) { - echo $out; - } else { - file_put_contents($fout, $out); - } - -} catch (exception $ex) { - err($fa.$ex->getMessage()); - exit(1); -} - -?> diff --git a/vendor/leafo/lessphp/tests/ApiTest.php b/vendor/leafo/lessphp/tests/ApiTest.php deleted file mode 100644 index fe1bbffa..00000000 --- a/vendor/leafo/lessphp/tests/ApiTest.php +++ /dev/null @@ -1,196 +0,0 @@ -less = new lessc(); - $this->less->importDir = array(__DIR__ . "/inputs/test-imports"); - } - - public function testPreserveComments() { - $input = <<assertEquals($this->compile($input), trim($outputWithoutComments)); - $this->less->setPreserveComments(true); - $this->assertEquals($this->compile($input), trim($outputWithComments)); - } - - public function testOldInterface() { - $this->less = new lessc(__DIR__ . "/inputs/hi.less"); - $out = $this->less->parse(array("hello" => "10px")); - $this->assertEquals(trim($out), trim(' -div:before { - content: "hi!"; -}')); - - } - - public function testInjectVars() { - $out = $this->less->parse(".magic { color: @color; width: @base - 200; }", - array( - 'color' => 'red', - 'base' => '960px' - )); - - $this->assertEquals(trim($out), trim(" -.magic { - color: red; - width: 760px; -}")); - - } - - public function testDisableImport() { - $this->less->importDisabled = true; - $this->assertEquals( - "/* import disabled */", - $this->compile("@import 'file3';")); - } - - public function testUserFunction() { - $this->less->registerFunction("add-two", function($list) { - list($a, $b) = $list[2]; - return $a[1] + $b[1]; - }); - - $this->assertEquals( - $this->compile("result: add-two(10, 20);"), - "result: 30;"); - - return $this->less; - } - - /** - * @depends testUserFunction - */ - public function testUnregisterFunction($less) { - $less->unregisterFunction("add-two"); - - $this->assertEquals( - $this->compile("result: add-two(10, 20);"), - "result: add-two(10,20);"); - } - - - - public function testFormatters() { - $src = " - div, pre { - color: blue; - span, .big, hello.world { - height: 20px; - color:#ffffff + #000; - } - }"; - - $this->less->setFormatter("compressed"); - $this->assertEquals( - $this->compile($src), "div,pre{color:blue;}div span,div .big,div hello.world,pre span,pre .big,pre hello.world{height:20px;color:#fff;}"); - - // TODO: fix the output order of tags - $this->less->setFormatter("lessjs"); - $this->assertEquals( - $this->compile($src), -"div, -pre { - color: blue; -} -div span, -div .big, -div hello.world, -pre span, -pre .big, -pre hello.world { - height: 20px; - color: #ffffff; -}"); - - $this->less->setFormatter("classic"); - $this->assertEquals( - $this->compile($src), -trim("div, pre { color:blue; } -div span, div .big, div hello.world, pre span, pre .big, pre hello.world { - height:20px; - color:#ffffff; -} -")); - - } - - public function compile($str) { - return trim($this->less->parse($str)); - } - -} diff --git a/vendor/leafo/lessphp/tests/ErrorHandlingTest.php b/vendor/leafo/lessphp/tests/ErrorHandlingTest.php deleted file mode 100644 index de02f065..00000000 --- a/vendor/leafo/lessphp/tests/ErrorHandlingTest.php +++ /dev/null @@ -1,81 +0,0 @@ -less = new lessc(); - } - - public function compile() { - $source = join("\n", func_get_args()); - return $this->less->compile($source); - } - - /** - * @expectedException Exception - * @expectedExceptionMessage .parametric-mixin is undefined - */ - public function testRequiredParametersMissing() { - $this->compile( - '.parametric-mixin (@a, @b) { a: @a; b: @b; }', - '.selector { .parametric-mixin(12px); }' - ); - } - - /** - * @expectedException Exception - * @expectedExceptionMessage .parametric-mixin is undefined - */ - public function testTooManyParameters() { - $this->compile( - '.parametric-mixin (@a, @b) { a: @a; b: @b; }', - '.selector { .parametric-mixin(12px, 13px, 14px); }' - ); - } - - /** - * @expectedException Exception - * @expectedExceptionMessage unrecognised input - */ - public function testRequiredArgumentsMissing() { - $this->compile('.selector { rule: e(); }'); - } - - /** - * @expectedException Exception - * @expectedExceptionMessage variable @missing is undefined - */ - public function testVariableMissing() { - $this->compile('.selector { rule: @missing; }'); - } - - /** - * @expectedException Exception - * @expectedExceptionMessage .missing-mixin is undefined - */ - public function testMixinMissing() { - $this->compile('.selector { .missing-mixin; }'); - } - - /** - * @expectedException Exception - * @expectedExceptionMessage .flipped is undefined - */ - public function testGuardUnmatchedValue() { - $this->compile( - '.flipped(@x) when (@x =< 10) { rule: value; }', - '.selector { .flipped(12); }' - ); - } - - /** - * @expectedException Exception - * @expectedExceptionMessage .colors-only is undefined - */ - public function testGuardUnmatchedType() { - $this->compile( - '.colors-only(@x) when (iscolor(@x)) { rule: value; }', - '.selector { .colors-only("string value"); }' - ); - } -} diff --git a/vendor/leafo/lessphp/tests/InputTest.php b/vendor/leafo/lessphp/tests/InputTest.php deleted file mode 100644 index 32db95bc..00000000 --- a/vendor/leafo/lessphp/tests/InputTest.php +++ /dev/null @@ -1,89 +0,0 @@ - "outputs", - "inputs_lessjs" => "outputs_lessjs", - ); - - public function setUp() { - $this->less = new lessc(); - $this->less->importDir = array_map(function($path) { - return __DIR__ . "/" . $path; - }, self::$importDirs); - } - - /** - * @dataProvider fileNameProvider - */ - public function testInputFile($inFname) { - if ($pattern = getenv("BUILD")) { - return $this->buildInput($inFname); - } - - $outFname = self::outputNameFor($inFname); - - if (!is_readable($outFname)) { - $this->fail("$outFname is missing, ". - "consider building tests with BUILD=true"); - } - - $input = file_get_contents($inFname); - $output = file_get_contents($outFname); - - $this->assertEquals($output, $this->less->parse($input)); - } - - public function fileNameProvider() { - return array_map(function($a) { return array($a); }, - self::findInputNames()); - } - - // only run when env is set - public function buildInput($inFname) { - $css = $this->less->parse(file_get_contents($inFname)); - file_put_contents(self::outputNameFor($inFname), $css); - } - - static public function findInputNames($pattern="*.less") { - $files = array(); - foreach (self::$testDirs as $inputDir => $outputDir) { - $files = array_merge($files, glob(__DIR__ . "/" . $inputDir . "/" . $pattern)); - } - - return array_filter($files, "is_file"); - } - - static public function outputNameFor($input) { - $front = _quote(__DIR__ . "/"); - $out = preg_replace("/^$front/", "", $input); - - foreach (self::$testDirs as $inputDir => $outputDir) { - $in = _quote($inputDir . "/"); - $rewritten = preg_replace("/$in/", $outputDir . "/", $out); - if ($rewritten != $out) { - $out = $rewritten; - break; - } - } - - $out = preg_replace("/.less$/", ".css", $out); - - return __DIR__ . "/" . $out; - } -} - diff --git a/vendor/leafo/lessphp/tests/README.md b/vendor/leafo/lessphp/tests/README.md deleted file mode 100644 index 85a75c05..00000000 --- a/vendor/leafo/lessphp/tests/README.md +++ /dev/null @@ -1,24 +0,0 @@ -lessphp uses [phpunit](https://github.com/sebastianbergmann/phpunit/) for its tests - -* `InputTest.php` iterates through all the less files in `inputs/`, compiles - them, then compares the result with the respective file in `outputs/`. - -* `ApiTest.php` tests the behavior of lessphp's public API methods. - -* `ErrorHandlingTest.php` tests that lessphp throws appropriate errors when - given invalid LESS as input. - -From the root you can run `make` to run all the tests. - -## lessjs tests - -Tests found in `inputs_lessjs` are extracted directly from -[less.js](https://github.com/less/less.js). The following license applies to -those tests: https://github.com/less/less.js/blob/master/LICENSE - -## bootstrap.sh - -Clones twitter bootsrap, compiles it with lessc and lessphp, cleans up results -with sort.php, and outputs diff. To run it, you need to have git and lessc -installed. - diff --git a/vendor/leafo/lessphp/tests/bootstrap.sh b/vendor/leafo/lessphp/tests/bootstrap.sh deleted file mode 100644 index 18a90e87..00000000 --- a/vendor/leafo/lessphp/tests/bootstrap.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/sh - -echo "This script clones Twitter Bootstrap, compiles it with lessc and lessphp," -echo "cleans up results with sort.php, and outputs diff. To run it, you need to" -echo "have git and lessc installed." -echo "" - -if [ -z "$input" ]; then - input="bootstrap/less/bootstrap.less" -fi -dest=$(basename "$input") -dest="${dest%.*}" - -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/twbs/bootstrap -fi - -echo ">> lessc compilation ($input)" -lessc "$input" "tmp/$dest.lessc.css" - -echo ">> lessphp compilation ($input)" -../plessc "$input" "tmp/$dest.lessphp.css" -echo ">> Cleanup and convert" - -php sort.php "tmp/$dest.lessc.css" > "tmp/$dest.lessc.clean.css" -php sort.php "tmp/$dest.lessphp.css" > "tmp/$dest.lessphp.clean.css" - -echo ">> Doing diff" -$diff_tool "tmp/$dest.lessc.clean.css" "tmp/$dest.lessphp.clean.css" diff --git a/vendor/leafo/lessphp/tests/inputs/accessors.less.disable b/vendor/leafo/lessphp/tests/inputs/accessors.less.disable deleted file mode 100644 index 2990faab..00000000 --- a/vendor/leafo/lessphp/tests/inputs/accessors.less.disable +++ /dev/null @@ -1,36 +0,0 @@ -/* 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/vendor/leafo/lessphp/tests/inputs/arity.less b/vendor/leafo/lessphp/tests/inputs/arity.less deleted file mode 100644 index 9998fd4a..00000000 --- a/vendor/leafo/lessphp/tests/inputs/arity.less +++ /dev/null @@ -1,77 +0,0 @@ - -// simple arity - -.hello(@a) { - hello: one; -} - -.hello(@a, @b) { - hello: two; -} - -.hello(@a, @b, @c) { - hello: three; -} - - -.world(@a, @b, @c) { - world: three; -} - -.world(@a, @b) { - world: two; -} - -.world(@a) { - world: 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) { - foo: two @b; -} - -.foo(@a, @b: cool, @c: yeah) { - foo: three @b @c; -} - - -.baz(@a, @b, @c: yeah) { - baz: three @c; -} - -.baz(@a, @b: cool) { - baz: two @b; -} - - -.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/vendor/leafo/lessphp/tests/inputs/attributes.less b/vendor/leafo/lessphp/tests/inputs/attributes.less deleted file mode 100644 index 7ede4fc4..00000000 --- a/vendor/leafo/lessphp/tests/inputs/attributes.less +++ /dev/null @@ -1,41 +0,0 @@ -* { 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/vendor/leafo/lessphp/tests/inputs/builtins.less b/vendor/leafo/lessphp/tests/inputs/builtins.less deleted file mode 100644 index f9301e04..00000000 --- a/vendor/leafo/lessphp/tests/inputs/builtins.less +++ /dev/null @@ -1,96 +0,0 @@ -// builtin - -@something: "hello world"; -@color: #112233; -@color2: rgba(44,55,66, .6); - -body { - color: @something; - - @num: 7 / 6; - num-basic: @num + 4; - num-floor: floor(@num) + 4px; - num-ceil: ceil(@num) + 4px; - - @num2: 2 / 3; - num2: @num2; - num2-round: round(@num2); - num2-floor: floor(@num2); - num2-ceil: ceil(@num2); - - round-lit: round(10px / 3); - - rgba1: rgbahex(@color); - rgba2: rgbahex(@color2); - argb: argb(@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)); -} - - -#functions { - str1: isstring("hello"); - str2: isstring(one, two); - - num1: isnumber(2323px); - num2: isnumber(2323); - num3: isnumber(4/5); - num4: isnumber("hello"); - - col1: iscolor(red); - col2: iscolor(hello); - col3: iscolor(rgba(0,0,0,0.3)); - col4: iscolor(#fff); - - key1: iskeyword(hello); - key2: iskeyword(3D); - - px1: ispixel(10px); - px2: ispixel(10); - - per1: ispercentage(10%); - per2: ispercentage(10); - - em1: isem(10em); - em2: isem(10); - - ex1: extract(1 2 3 4, 2); - ex2: extract(1 2, 1); - ex3: extract(1, 1); - - @list: 1,2,3,4; - - ex4: extract(@list, 2); - - pow: pow(2,4); - pi: pi(); - mod: mod(14,10); - - tan: tan(1); - cos: cos(1); - sin: sin(1); - - atan: atan(1); - acos: acos(1); - asin: asin(1); - - sqrt: sqrt(8); -} - - -#unit { - @unit: "em"; - unit-lit: unit(10px); - unit-arg: unit(10px, "s"); - unit-arg2: unit(10px, @unit); - unit-math: unit(0.07407s) * 100%; -} - diff --git a/vendor/leafo/lessphp/tests/inputs/colors.less b/vendor/leafo/lessphp/tests/inputs/colors.less deleted file mode 100644 index 7fd47a3c..00000000 --- a/vendor/leafo/lessphp/tests/inputs/colors.less +++ /dev/null @@ -1,154 +0,0 @@ - -body { - color:rgb(red(#f00), red(#0F0), red(#00f)); - color:rgb(red(#f00), green(#0F0), blue(#00f)); - color:rgb(red(#0ff), green(#f0f), blue(#ff0)); - - color: hsl(34, 50%, 40%); - color: hsla(34, 50%, 40%, 0.3); - - lighten1: lighten(#efefef, 10%); - lighten2: lighten(rgb(23, 53, 231), 22%); - lighten3: lighten(rgba(212, 103, 88, 0.5), 10%); - - darken1: darken(#efefef, 10%); - darken2: darken(rgb(23, 53, 231), 22%); - darken3: darken(rgba(23, 53, 231, 0.5), 10%); - - saturate1: saturate(#efefef, 10%); - saturate2: saturate(rgb(23, 53, 231), 22%); - saturate3: saturate(rgba(23, 53, 231, 0.5), 10%); - - desaturate1: desaturate(#efefef, 10%); - desaturate2: desaturate(rgb(23, 53, 231), 22%); - desaturate3: desaturate(rgba(23, 53, 231, 0.5), 10%); - - spin1: spin(#efefef, 12); - spin2: spin(rgb(23, 53, 231), 15); - spin3: spin(rgba(23, 53, 231, 0.5), 19); - - spin2: spin(#efefef, -12); - spin3: spin(rgb(23, 53, 231), -15); - spin4: spin(rgba(23, 53, 231, 0.5), -19); - - one1: fadein(#abcdef, 10%); - one2: fadeout(#abcdef, -10%); - - two1: fadeout(#029f23, 10%); - two2: fadein(#029f23, -10%); - - - three1: fadein(rgba(1,2,3, 0.5), 10%); - three2: fadeout(rgba(1,2,3, 0.5), -10%); - - four1: fadeout(rgba(1,2,3, 0), 10%); - four2: 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; - - zero1: saturate(#123456, -100%); - zero2: saturate(#123456, 100%); - zero3: saturate(#000000, 100%); - zero4: saturate(#ffffff, 100%); - - zero5: lighten(#123456, -100%); - zero6: lighten(#123456, 100%); - zero7: lighten(#000000, 100%); - zero8: lighten(#ffffff, 100%); - - zero9: spin(#123456, -100); - zeroa: spin(#123456, 100); - zerob: spin(#000000, 100); - zeroc: spin(#ffffff, 100); -} - - -alpha { - // g: alpha(red); - g1: alpha(rgba(0,0,0,0)); - g2: alpha(rgb(155,55,0)); -} - -fade { - f1: fade(red, 50%); - f2: fade(#fff, 20%); - f3: fade(rgba(34,23,64,0.4), 50%); -} - -@a: rgb(255,255,255); -@b: rgb(0,0,0); - -.mix { - color1: mix(@a, @b, 50%); - color2: mix(@a, @b); - color3: mix(rgba(5,3,1,0.3), rgba(6,3,2, 0.8), 50%); -} - -.contrast { - color1: contrast(#000, red, blue); - color2: contrast(#fff, red, blue); -} - -.percent { - per: percentage(0.5); -} - -// color keywords - -.colorz { - color1: whitesmoke - 10; - color2: spin(red, 34); - color3: spin(blah); -} - - - -// 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%); -} - -// math - -.ops { - c1: red * 0.3; - c2: green / 2; - c3: purple % 7; - c4: 4 * salmon; - c5: 1 + salmon; - - c6: 132 / red; - c7: 132 - red; - c8: 132- red; -} - -.transparent { - r: red(transparent); - g: green(transparent); - b: blue(transparent); - a: alpha(transparent); -} - diff --git a/vendor/leafo/lessphp/tests/inputs/compile_on_mixin.less b/vendor/leafo/lessphp/tests/inputs/compile_on_mixin.less deleted file mode 100644 index 79d628f4..00000000 --- a/vendor/leafo/lessphp/tests/inputs/compile_on_mixin.less +++ /dev/null @@ -1,39 +0,0 @@ - -@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/vendor/leafo/lessphp/tests/inputs/data-uri.less b/vendor/leafo/lessphp/tests/inputs/data-uri.less deleted file mode 100644 index 0cfa941a..00000000 --- a/vendor/leafo/lessphp/tests/inputs/data-uri.less +++ /dev/null @@ -1,7 +0,0 @@ -.small { - background: data-uri("../hi.less"); -} - -.large { - background: data-uri('../../../lessc.inc.php'); -} diff --git a/vendor/leafo/lessphp/tests/inputs/directives.less b/vendor/leafo/lessphp/tests/inputs/directives.less deleted file mode 100644 index 1b3a9b58..00000000 --- a/vendor/leafo/lessphp/tests/inputs/directives.less +++ /dev/null @@ -1,28 +0,0 @@ - -@hello: "utf-8"; -@charset @hello; - -@-moz-document url-prefix(){ - div { - color: red; - } -} - -@page :left { margin-left: 4cm; } -@page :right { margin-left: 3cm; } -@page { margin: 2cm } - -@-ms-viewport { - width: device-width; -} -@-moz-viewport { - width: device-width; -} -@-o-viewport { - width: device-width; -} -@viewport { - width: device-width; -} - - diff --git a/vendor/leafo/lessphp/tests/inputs/escape.less b/vendor/leafo/lessphp/tests/inputs/escape.less deleted file mode 100644 index 5c15e786..00000000 --- a/vendor/leafo/lessphp/tests/inputs/escape.less +++ /dev/null @@ -1,18 +0,0 @@ - -body { - @hello: "world"; - e1: e("this is simple"); - e2: e("this is simple", "cool lad"); - e3: e(1232); - e4: e(@hello); - e5: e("one" + 'more'); - - t1: ~"eating rice"; - t2: ~"string cheese"; - t3: a b c ~"string me" d e f; - t4: ~"string @{hello}"; -} - -.class { - filter: ~"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image.png')"; -} diff --git a/vendor/leafo/lessphp/tests/inputs/font_family.less b/vendor/leafo/lessphp/tests/inputs/font_family.less deleted file mode 100644 index d1dfb72d..00000000 --- a/vendor/leafo/lessphp/tests/inputs/font_family.less +++ /dev/null @@ -1,28 +0,0 @@ - -@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/vendor/leafo/lessphp/tests/inputs/guards.less b/vendor/leafo/lessphp/tests/inputs/guards.less deleted file mode 100644 index fc4e344e..00000000 --- a/vendor/leafo/lessphp/tests/inputs/guards.less +++ /dev/null @@ -1,74 +0,0 @@ - -.simple(@hi) when (@hi) { - simple: yellow; -} - - -.something(@hi) when (@hi = cool) { - something: red; -} - -.another(@x) when (@x > 10) { - another: green; -} - - -.flipped(@x) when (@x =< 10) { - flipped: teal; -} - -.yeah(@arg) when (isnumber(@arg)) { - yeah-number: purple @arg; -} - - -.yeah(@arg) when (ispixel(@arg)) { - yeah-pixel: silver; -} - - -.hello(@arg) when not (@arg) { - hello: orange; -} - -dd { - .simple(true); -} - -b { - .something(cool); - .something(birthday); -} - -img { - .another(12); - .flipped(2); -} - -body { - .yeah(232px); - .yeah(232); -} - -.something(@x) when (@x) and (@y), not (@x = what) { - something-complex: blue @x; -} - -div { - @y: true; - .something(true); - -} - -.coloras(@g) when (iscolor(@g)) { - color: true @g; -} - -link { - .coloras(red); - .coloras(#fff); - .coloras(#fffddd); - .coloras(rgb(0,0,0)); - .coloras(rgba(0,0,0, .34)); -} - diff --git a/vendor/leafo/lessphp/tests/inputs/hacks.less b/vendor/leafo/lessphp/tests/inputs/hacks.less deleted file mode 100644 index e69b7bf9..00000000 --- a/vendor/leafo/lessphp/tests/inputs/hacks.less +++ /dev/null @@ -1,6 +0,0 @@ -// css hacks - -:root .alert-message, :root .btn { - border-radius: 0 \0; -} - diff --git a/vendor/leafo/lessphp/tests/inputs/hi.less b/vendor/leafo/lessphp/tests/inputs/hi.less deleted file mode 100644 index 9a3d8198..00000000 --- a/vendor/leafo/lessphp/tests/inputs/hi.less +++ /dev/null @@ -1,5 +0,0 @@ - -div:before { - content: "hi!"; -} - diff --git a/vendor/leafo/lessphp/tests/inputs/ie.less b/vendor/leafo/lessphp/tests/inputs/ie.less deleted file mode 100644 index 37a5f1f6..00000000 --- a/vendor/leafo/lessphp/tests/inputs/ie.less +++ /dev/null @@ -1,12 +0,0 @@ - -foo { - filter: progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr=#c0ff3300, endColorstr=#ff000000); - filter:progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr=#c0ff3300, endColorstr=#ff000001); -} - - -foo { - filter: alpha(opacity=20); - filter: alpha(opacity=20, enabled=true); - filter: blaznicate(foo=bar, baz=bang bip, bart=#fa4600); -} diff --git a/vendor/leafo/lessphp/tests/inputs/import.less b/vendor/leafo/lessphp/tests/inputs/import.less deleted file mode 100644 index a5005674..00000000 --- a/vendor/leafo/lessphp/tests/inputs/import.less +++ /dev/null @@ -1,56 +0,0 @@ - -@import 'file1.less'; // file found and imported - -@import "not-found"; - -@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"; -} - - -.mixin-import() { - @import "file3"; -} - -.one { - .mixin-import(); - color: blue; -} - -.two { - .mixin-import(); -} - - -#merge-import-mixins { - @import "a"; - @import "b"; - div { .just-a-class; } -} - - -@import "inner/file1"; - - -// test bubbling variables up from imports, while preserving order - -pre { - color: @someValue; -} - -@import "file3"; - diff --git a/vendor/leafo/lessphp/tests/inputs/interpolation.less b/vendor/leafo/lessphp/tests/inputs/interpolation.less deleted file mode 100644 index 8aad0004..00000000 --- a/vendor/leafo/lessphp/tests/inputs/interpolation.less +++ /dev/null @@ -1,47 +0,0 @@ - -@cool-hello: "yes"; -@cool-yes: "okay"; -@var: "hello"; - -div { - interp1: ~"@{cool-hello}"; - interp2: ~"@{cool-@{var}}"; - interp3: ~"@{cool-@{cool-@{var}}}"; -} - -// interpolation in selectors - -@hello: 10; -@world: "yeah"; - -@{hello}@{world} { - color: blue; -} - -@{hello} { - color: blue; -} - -hello world @{hello} { - color: red; -} - -#@{world} { - color: "hello @{hello}"; -} - - -@num: 3; - -[prop], -[prop="value@{num}"], -[prop*="val@{num}"], -[|prop~="val@{num}"], -[*|prop$="val@{num}"], -[ns|prop^="val@{num}"], -[@{num}^="val@{num}"], -[@{num}=@{num}], -[@{num}] { - attributes: yes; -} - diff --git a/vendor/leafo/lessphp/tests/inputs/keyframes.less b/vendor/leafo/lessphp/tests/inputs/keyframes.less deleted file mode 100644 index e65a38b9..00000000 --- a/vendor/leafo/lessphp/tests/inputs/keyframes.less +++ /dev/null @@ -1,52 +0,0 @@ -@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/vendor/leafo/lessphp/tests/inputs/math.less b/vendor/leafo/lessphp/tests/inputs/math.less deleted file mode 100644 index db59d356..00000000 --- a/vendor/leafo/lessphp/tests/inputs/math.less +++ /dev/null @@ -1,122 +0,0 @@ - -.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 - - sub1: 10-5; - sub2: 10 - 5; - - add1: 10+5; - add2: 10 + 5; - - // div: 10/5; // this wont work, read on - div: 10 / 5; - - mul1: 10*5; - mul2: 10 * 5; -} - -// these properties have divison not in parenthases -.supress-division { - border-radius: 10px / 10px; - border-radius: 10px/12px; - border-radius: hello (10px/10px) world; - @x: 10px; - font: @x/30 sans-serif; - font: 10px / 20px sans-serif; - font: 10px/22px 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); - div1: (10 /5); - div2: (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 { - neg1: -(1px); - neg2: 0-(1px); - - @something: 10; - neg3: -@something; -} - - -// and now here are the tests - -.test { - single1: (5); - single2: 5+(5); - single3: (5)+((5)); - - parens: (5 +(5)) -2; - // parens: ((5 +(5)) -2); // FAILS - fixme - - math1: (5 + 5)*(2 / 1); - math2: (5+5)*(2/1); - - complex1: 2 * (4 * (2 + (1 + 6))) - 1; - complex2: ((2+3)*(2+3) / (9-4)) + 1; - complex3: (2px + 4px) 1em 2px 2; - - @var: (2 * 2); - var1: (2 * @var) 4 4 (@var * 1px); - var2: (@var * @var) * 6; - var3: 4 * (5 + 5) / 2 - (@var * 2); - - complex4: (7 * 7) + (8 * 8); -} - -.percents { - p1: 100 * 10%; - p2: 10% * 100; - p3: 10% * 10%; - - p4: 100px * 10%; // lessjs makes this px - p5: 10% * 100px; // lessjs makes this % - - p6: 20% + 10%; - p7: 20% - 10%; - - p8: 20% / 10%; -} - -.misc { - x: 10px * 4em; - y: 10 * 4em; -} - - -.cond { - c1: 10 < 10; - c2: 10 >= 10; -} - diff --git a/vendor/leafo/lessphp/tests/inputs/media.less b/vendor/leafo/lessphp/tests/inputs/media.less deleted file mode 100644 index 8c16a3cf..00000000 --- a/vendor/leafo/lessphp/tests/inputs/media.less +++ /dev/null @@ -1,68 +0,0 @@ -@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; } -} - - -// media bubbling - -@media test { - div { - height: 20px; - @media (hello) { - color: red; - - pre { - color: orange; - } - } - } -} - -// should not cross boundary -@media yeah { - @page { - @media cool { - color: red; - } - } -} - -// variable in query -@mobile: ~"(max-width: 599px)"; -@media @mobile { - .helloworld { color: blue } -} diff --git a/vendor/leafo/lessphp/tests/inputs/misc.less b/vendor/leafo/lessphp/tests/inputs/misc.less deleted file mode 100644 index eb690b9a..00000000 --- a/vendor/leafo/lessphp/tests/inputs/misc.less +++ /dev/null @@ -1,100 +0,0 @@ - -@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"; - background1: url(@var); - background2: url(@{var}); - background3: url("@{var}"); -} - -.mix(@arg) { color: @arg; } -@aaa: aaa; -@bbb: bbb; -// make sure the opening selector isn't too greedy -.cool {.mix("@{aaa}, @{bbb}")} -.cool(); - - - -// merging of mixins -.span-17 { float: left; } -.span-17 { width: 660px; } - -.x {.span-17;} - -.hi { - pre { - color: red; - } -} - -.hi { - pre { - color: blue; - } -} - -.rad { - .hi; -} - - -hello { - numbers: 1.0 0.1 .1 1.; - numbers: 1.0s 0.1s .1s 1.s; - numbers: -1.0s -0.1s -.1s -1.s; - numbers: -1.0 -0.1 -.1 -1.; -} - - -#string { - hello: 'what\'s going on here'; - hello: 'blah blag @{ blah blah'; - - join: 3434 + "hello"; - join: 3434 + hello; -} - - -.duplicates { - hello: world; - hello: "world"; - hello: world; - hello: "what"; - hello: world; - hello: "world"; -} diff --git a/vendor/leafo/lessphp/tests/inputs/mixin_functions.less b/vendor/leafo/lessphp/tests/inputs/mixin_functions.less deleted file mode 100644 index 2d858ad6..00000000 --- a/vendor/leafo/lessphp/tests/inputs/mixin_functions.less +++ /dev/null @@ -1,33 +0,0 @@ - -@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; -} - diff --git a/vendor/leafo/lessphp/tests/inputs/mixin_merging.less.disable b/vendor/leafo/lessphp/tests/inputs/mixin_merging.less.disable deleted file mode 100644 index 86b3e0cb..00000000 --- a/vendor/leafo/lessphp/tests/inputs/mixin_merging.less.disable +++ /dev/null @@ -1,100 +0,0 @@ - -@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/vendor/leafo/lessphp/tests/inputs/mixins.less b/vendor/leafo/lessphp/tests/inputs/mixins.less deleted file mode 100644 index 768e6384..00000000 --- a/vendor/leafo/lessphp/tests/inputs/mixins.less +++ /dev/null @@ -1,197 +0,0 @@ - -@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; -} - - -// 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); -} - - -.to-be-important() { - color: red; - @color: red; - height: 20px; - - pre { - color: @color; - } -} - -.mix-suffix { - .to-be-important() !important; -} - - - - -#search-all { - .red() { - color:#f00 !important; - } -} - -#search-all { - .green() { - color: #0f0 !important; - } -} - -.search-test { - #search-all > .red(); - #search-all > .green(); -} - - -// mixin self without infinite loop -.cowboy() { - color: blue; -} - -.cowboy { - .cowboy; -} - - -// semicolon - -.semi1(@color: red, blue, green;) { - color: @color; -} - -.semi2(@color: red, blue, green; dad) { - color: @color; -} - -.semi3(hello; world; piss) { - hello: world; -} - - - -// self referencing skipping - -.nav-divider(@color: red){ - padding: 10px; -} - -.nav { - .nav-divider { - .nav-divider(); - } -} - -.nav-divider { - .nav-divider(); -} - - diff --git a/vendor/leafo/lessphp/tests/inputs/nested.less b/vendor/leafo/lessphp/tests/inputs/nested.less deleted file mode 100644 index 0b62ea19..00000000 --- a/vendor/leafo/lessphp/tests/inputs/nested.less +++ /dev/null @@ -1,60 +0,0 @@ -#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/vendor/leafo/lessphp/tests/inputs/pattern_matching.less b/vendor/leafo/lessphp/tests/inputs/pattern_matching.less deleted file mode 100644 index c2a0da91..00000000 --- a/vendor/leafo/lessphp/tests/inputs/pattern_matching.less +++ /dev/null @@ -1,157 +0,0 @@ - -.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); -} - -.resty(@hello, @world, @the_rest...) { - padding: @hello @world; - rest: @the_rest; -} - -.defaults(@aa, @bb:e343, @cc: "heah", ...) { - height: @aa; -} - -#defaults_1 { - .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/vendor/leafo/lessphp/tests/inputs/scopes.less b/vendor/leafo/lessphp/tests/inputs/scopes.less deleted file mode 100644 index 42e46969..00000000 --- a/vendor/leafo/lessphp/tests/inputs/scopes.less +++ /dev/null @@ -1,40 +0,0 @@ - - -@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/vendor/leafo/lessphp/tests/inputs/selector_expressions.less b/vendor/leafo/lessphp/tests/inputs/selector_expressions.less deleted file mode 100644 index b8aa2214..00000000 --- a/vendor/leafo/lessphp/tests/inputs/selector_expressions.less +++ /dev/null @@ -1,29 +0,0 @@ - -@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/vendor/leafo/lessphp/tests/inputs/site_demos.less b/vendor/leafo/lessphp/tests/inputs/site_demos.less deleted file mode 100644 index 08d7f1e5..00000000 --- a/vendor/leafo/lessphp/tests/inputs/site_demos.less +++ /dev/null @@ -1,120 +0,0 @@ -// 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/vendor/leafo/lessphp/tests/inputs/test-imports/a.less b/vendor/leafo/lessphp/tests/inputs/test-imports/a.less deleted file mode 100644 index a00464db..00000000 --- a/vendor/leafo/lessphp/tests/inputs/test-imports/a.less +++ /dev/null @@ -1,6 +0,0 @@ -.just-a-class { background: red; } - -.some-mixin() { - height: 200px; -} - diff --git a/vendor/leafo/lessphp/tests/inputs/test-imports/b.less b/vendor/leafo/lessphp/tests/inputs/test-imports/b.less deleted file mode 100644 index 599ed3a4..00000000 --- a/vendor/leafo/lessphp/tests/inputs/test-imports/b.less +++ /dev/null @@ -1,12 +0,0 @@ -.just-a-class { background: blue; } - -.hello { - .some-mixin(); -} - - -@media cool { - color: red; - .some-mixin(); -} - diff --git a/vendor/leafo/lessphp/tests/inputs/test-imports/file1.less b/vendor/leafo/lessphp/tests/inputs/test-imports/file1.less deleted file mode 100644 index 658de0c5..00000000 --- a/vendor/leafo/lessphp/tests/inputs/test-imports/file1.less +++ /dev/null @@ -1,16 +0,0 @@ - - -/** - * This is a test import file - */ - -@colors { - div.bright { - color: red; - } - - div.sad { - color: blue; - } -} - diff --git a/vendor/leafo/lessphp/tests/inputs/test-imports/file2.less b/vendor/leafo/lessphp/tests/inputs/test-imports/file2.less deleted file mode 100644 index 2cae8dce..00000000 --- a/vendor/leafo/lessphp/tests/inputs/test-imports/file2.less +++ /dev/null @@ -1,6 +0,0 @@ - -b { - color: @color; - padding: 16px; -} - diff --git a/vendor/leafo/lessphp/tests/inputs/test-imports/file3.less b/vendor/leafo/lessphp/tests/inputs/test-imports/file3.less deleted file mode 100644 index 28b643ea..00000000 --- a/vendor/leafo/lessphp/tests/inputs/test-imports/file3.less +++ /dev/null @@ -1,7 +0,0 @@ - -h2 { - background: url("../images/logo.png") no-repeat; -} - -@someValue: hello-from-file-3; - diff --git a/vendor/leafo/lessphp/tests/inputs/test-imports/inner/file1.less b/vendor/leafo/lessphp/tests/inputs/test-imports/inner/file1.less deleted file mode 100644 index df654a7e..00000000 --- a/vendor/leafo/lessphp/tests/inputs/test-imports/inner/file1.less +++ /dev/null @@ -1,6 +0,0 @@ - -.inner { - content: "inner/file1.less" -} - -@import "file2"; // should get the one in inner diff --git a/vendor/leafo/lessphp/tests/inputs/test-imports/inner/file2.less b/vendor/leafo/lessphp/tests/inputs/test-imports/inner/file2.less deleted file mode 100644 index f40d3c67..00000000 --- a/vendor/leafo/lessphp/tests/inputs/test-imports/inner/file2.less +++ /dev/null @@ -1,4 +0,0 @@ - -.inner { - content: "inner/file2.less" -} diff --git a/vendor/leafo/lessphp/tests/inputs/variables.less b/vendor/leafo/lessphp/tests/inputs/variables.less deleted file mode 100644 index 6e18eb80..00000000 --- a/vendor/leafo/lessphp/tests/inputs/variables.less +++ /dev/null @@ -1,44 +0,0 @@ -@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; -} - -@hello: 44px; -@something: "hello"; -@cool: something; - -outer1: @@something; -outer2: @@@cool; - - diff --git a/vendor/leafo/lessphp/tests/inputs_lessjs/mixins-args.less b/vendor/leafo/lessphp/tests/inputs_lessjs/mixins-args.less deleted file mode 100644 index c3965924..00000000 --- a/vendor/leafo/lessphp/tests/inputs_lessjs/mixins-args.less +++ /dev/null @@ -1,205 +0,0 @@ -.mixin (@a: 1px, @b: 50%) { - width: (@a * 5); - height: (@b - 1%); -} - -.mixina (@style, @width, @color: black) { - border: @width @style @color; -} - -.mixiny -(@a: 0, @b: 0) { - margin: @a; - padding: @b; -} - -.hidden() { - color: transparent; // asd -} - -#hidden { - .hidden; -} - -#hidden1 { - .hidden(); -} - -.two-args { - color: blue; - .mixin(2px, 100%); - .mixina(dotted, 2px); -} - -.one-arg { - .mixin(3px); -} - -.no-parens { - .mixin; -} - -.no-args { - .mixin(); -} - -.var-args { - @var: 9; - .mixin(@var, (@var * 2)); -} - -.multi-mix { - .mixin(2px, 30%); - .mixiny(4, 5); -} - -.maxa(@arg1: 10, @arg2: #f00) { - padding: (@arg1 * 2px); - color: @arg2; -} - -body { - .maxa(15); -} - -@glob: 5; -.global-mixin(@a:2) { - width: (@glob + @a); -} - -.scope-mix { - .global-mixin(3); -} - -.nested-ruleset (@width: 200px) { - width: @width; - .column { margin: @width; } -} -.content { - .nested-ruleset(600px); -} - -// - -.same-var-name2(@radius) { - radius: @radius; -} -.same-var-name(@radius) { - .same-var-name2(@radius); -} -#same-var-name { - .same-var-name(5px); -} - -// - -.var-inside () { - @var: 10px; - width: @var; -} -#var-inside { .var-inside; } - -.mixin-arguments (@width: 0px, ...) { - border: @arguments; - width: @width; -} - -.arguments { - .mixin-arguments(1px, solid, black); -} -.arguments2 { - .mixin-arguments(); -} -.arguments3 { - .mixin-arguments; -} - -.mixin-arguments2 (@width, @rest...) { - border: @arguments; - rest: @rest; - width: @width; -} -.arguments4 { - .mixin-arguments2(0, 1, 2, 3, 4); -} - -// Edge cases - -.edge-case { - .mixin-arguments("{"); -} - -// Division vs. Literal Slash -.border-radius(@r: 2px/5px) { - border-radius: @r; -} -.slash-vs-math { - .border-radius(); - .border-radius(5px/10px); - .border-radius((3px * 2)); -} -// semi-colon vs comma for delimiting - -.mixin-takes-one(@a) { - one: @a; -} - -.mixin-takes-two(@a; @b) { - one: @a; - two: @b; -} - -.comma-vs-semi-colon { - .mixin-takes-two(@a : a; @b : b, c); - .mixin-takes-two(@a : d, e; @b : f); - .mixin-takes-one(@a: g); - .mixin-takes-one(@a : h;); - .mixin-takes-one(i); - .mixin-takes-one(j;); - .mixin-takes-two(k, l); - .mixin-takes-one(m, n;); - .mixin-takes-two(o, p; q); - .mixin-takes-two(r, s; t;); -} - -.mixin-conflict(@a:defA, @b:defB, @c:defC) { - three: @a, @b, @c; -} - -.mixin-conflict(@a:defA, @b:defB, @c:defC, @d:defD) { - four: @a, @b, @c, @d; -} - -#named-conflict { - .mixin-conflict(11, 12, 13, @a:a); - .mixin-conflict(@a:a, 21, 22, 23); -} -@a: 3px; -.mixin-default-arg(@a: 1px, @b: @a, @c: @b) { - defaults: 1px 1px 1px; - defaults: 2px 2px 2px; -} - -.test-mixin-default-arg { - .mixin-default-arg(); - .mixin-default-arg(2px); -} - -.mixin-comma-default1(@color; @padding; @margin: 2, 2, 2, 2) { - margin: @margin; -} -.selector { - .mixin-comma-default1(#33acfe; 4); -} -.mixin-comma-default2(@margin: 2, 2, 2, 2;) { - margin: @margin; -} -.selector2 { - .mixin-comma-default2(); -} -.mixin-comma-default3(@margin: 2, 2, 2, 2) { - margin: @margin; -} -.selector3 { - .mixin-comma-default3(4,2,2,2); -} diff --git a/vendor/leafo/lessphp/tests/inputs_lessjs/mixins-named-args.less b/vendor/leafo/lessphp/tests/inputs_lessjs/mixins-named-args.less deleted file mode 100644 index f62dc86a..00000000 --- a/vendor/leafo/lessphp/tests/inputs_lessjs/mixins-named-args.less +++ /dev/null @@ -1,36 +0,0 @@ -.mixin (@a: 1px, @b: 50%) { - width: (@a * 5); - height: (@b - 1%); - args: @arguments; -} -.mixin (@a: 1px, @b: 50%) when (@b > 75%){ - text-align: center; -} - -.named-arg { - color: blue; - .mixin(@b: 100%); -} - -.class { - @var: 20%; - .mixin(@b: @var); -} - -.all-args-wrong-args { - .mixin(@b: 10%, @a: 2px); -} - -.mixin2 (@a: 1px, @b: 50%, @c: 50) { - width: (@a * 5); - height: (@b - 1%); - color: (#000000 + @c); -} - -.named-args2 { - .mixin2(3px, @c: 100); -} - -.named-args3 { - .mixin2(@b: 30%, @c: #123456); -} diff --git a/vendor/leafo/lessphp/tests/inputs_lessjs/strings.less b/vendor/leafo/lessphp/tests/inputs_lessjs/strings.less deleted file mode 100644 index 32fad721..00000000 --- a/vendor/leafo/lessphp/tests/inputs_lessjs/strings.less +++ /dev/null @@ -1,51 +0,0 @@ -#strings { - background-image: url("http://son-of-a-banana.com"); - quotes: "~" "~"; - content: "#*%:&^,)!.(~*})"; - empty: ""; - brackets: "{" "}"; - escapes: "\"hello\" \\world"; - escapes2: "\"llo"; -} -#comments { - content: "/* hello */ // not-so-secret"; -} -#single-quote { - quotes: "'" "'"; - content: '""#!&""'; - empty: ''; - semi-colon: ';'; -} -#escaped { - filter: ~"DX.Transform.MS.BS.filter(opacity=50)"; -} -#one-line { image: url(http://tooks.com) } -#crazy { image: url(http://), "}", url("http://}") } -#interpolation { - @var: '/dev'; - url: "http://lesscss.org@{var}/image.jpg"; - - @var2: 256; - url2: "http://lesscss.org/image-@{var2}.jpg"; - - @var3: #456; - url3: "http://lesscss.org@{var3}"; - - @var4: hello; - url4: "http://lesscss.org/@{var4}"; - - @var5: 54.4px; - url5: "http://lesscss.org/@{var5}"; -} - -// multiple calls with string interpolation - -.mix-mul (@a: green) { - color: ~"@{a}"; -} -.mix-mul-class { - .mix-mul(blue); - .mix-mul(red); - .mix-mul(black); - .mix-mul(orange); -} diff --git a/vendor/leafo/lessphp/tests/outputs/accessors.css b/vendor/leafo/lessphp/tests/outputs/accessors.css deleted file mode 100644 index 2f3c9e61..00000000 --- a/vendor/leafo/lessphp/tests/outputs/accessors.css +++ /dev/null @@ -1,14 +0,0 @@ -.article { color:#294366; } -.comment { - width:960px; - color:#294366; - padding:10px; -} -.wow { - height:960px; - background-color:#294366; - color:green; - padding:; - margin:; -} -.mix { font-size:10px; } diff --git a/vendor/leafo/lessphp/tests/outputs/arity.css b/vendor/leafo/lessphp/tests/outputs/arity.css deleted file mode 100644 index 5173561d..00000000 --- a/vendor/leafo/lessphp/tests/outputs/arity.css +++ /dev/null @@ -1,25 +0,0 @@ -.one { - hello: one; - world: one; -} -.two { - hello: two; - world: two; -} -.three { - hello: three; - world: three; -} -.multi-foo { - foo: two cool; - foo: three cool yeah; - foo: two 1; - foo: three 1 yeah; - foo: three 1 1; -} -.multi-baz { - baz: two cool; - baz: three yeah; - baz: two 1; - baz: three 1; -} diff --git a/vendor/leafo/lessphp/tests/outputs/attributes.css b/vendor/leafo/lessphp/tests/outputs/attributes.css deleted file mode 100644 index fb0e176c..00000000 --- a/vendor/leafo/lessphp/tests/outputs/attributes.css +++ /dev/null @@ -1,105 +0,0 @@ -* { - 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/vendor/leafo/lessphp/tests/outputs/builtins.css b/vendor/leafo/lessphp/tests/outputs/builtins.css deleted file mode 100644 index 6ac21f2c..00000000 --- a/vendor/leafo/lessphp/tests/outputs/builtins.css +++ /dev/null @@ -1,61 +0,0 @@ -body { - color: "hello world"; - num-basic: 5.1666666666667; - num-floor: 5px; - num-ceil: 6px; - num2: 0.66666666666667; - num2-round: 1; - num2-floor: 0; - num2-ceil: 1; - round-lit: 3px; - rgba1: #ff112233; - rgba2: #992c3742; - argb: #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); -} -#functions { - str1: true; - str2: false; - num1: true; - num2: true; - num3: true; - num4: false; - col1: true; - col2: false; - col3: true; - col4: true; - key1: true; - key2: false; - px1: true; - px2: false; - per1: true; - per2: false; - em1: true; - em2: false; - ex1: 2; - ex2: 1; - ex3: extract(1,1); - ex4: 2; - pow: 16; - pi: 3.1415926535898; - mod: 4; - tan: 1.5574077246549; - cos: 0.54030230586814; - sin: 0.8414709848079; - atan: 0.78539816339745rad; - acos: 0rad; - asin: 1.5707963267949rad; - sqrt: 2.8284271247462; -} -#unit { - unit-lit: 10; - unit-arg: 10s; - unit-arg2: 10em; - unit-math: 7.407%; -} diff --git a/vendor/leafo/lessphp/tests/outputs/colors.css b/vendor/leafo/lessphp/tests/outputs/colors.css deleted file mode 100644 index 5310ffb0..00000000 --- a/vendor/leafo/lessphp/tests/outputs/colors.css +++ /dev/null @@ -1,103 +0,0 @@ -body { - color: #ff0000; - color: #ffffff; - color: #000000; - color: #996d33; - color: rgba(153,109,51,0.3); - lighten1: #ffffff; - lighten2: #7c8df2; - lighten3: rgba(222,140,129,0.5); - darken1: #d6d6d6; - darken2: #0d1e81; - darken3: rgba(18,42,185,0.5); - saturate1: #f1eded; - saturate2: #0025fe; - saturate3: rgba(10,44,244,0.5); - desaturate1: #efefef; - desaturate2: #3349cb; - desaturate3: rgba(36,62,218,0.5); - spin1: #efefef; - spin2: #2d17e7; - spin3: rgba(59,23,231,0.5); - spin2: #efefef; - spin3: #1769e7; - spin4: rgba(23,119,231,0.5); - one1: #abcdef; - one2: #abcdef; - two1: rgba(2,159,35,0.9); - two2: rgba(2,159,35,0.9); - three1: rgba(1,2,3,0.6); - three2: rgba(1,2,3,0.6); - four1: rgba(1,2,3,0); - four2: rgba(1,2,3,0); - hue: 282; - sat: 33; - lit: 12; - what: #dff1da; - zero1: #343434; - zero2: #003468; - zero3: #000000; - zero4: #ffffff; - zero5: #000000; - zero6: #ffffff; - zero7: #ffffff; - zero8: #ffffff; - zero9: #1d5612; - zeroa: #56124b; - zerob: #000000; - zeroc: #ffffff; -} -alpha { - g1: 0; - g2: 1; -} -fade { - f1: rgba(255,0,0,0.5); - f2: rgba(255,255,255,0.2); - f3: rgba(34,23,64,0.5); -} -.mix { - color1: #808080; - color2: #808080; - color3: rgba(6,3,2,-0.25); -} -.contrast { - color1: #ff0000; - color2: #0000ff; -} -.percent { - per: 50%; -} -.colorz { - color1: #ebebeb; - color2: #ff9100; - color3: #000000; -} -body { - start: #fcf8e3; - spin: #fcf4e3; - chained: #fbeed5; - direct: #fbefd5; -} -pre { - spin: #f2dee1; -} -dd { - background-color: #f5f5f5; -} -.ops { - c1: #4d0000; - c2: #004000; - c3: #020002; - c4: #ffffff; - c5: #fb8173; - c6: 132 / #ff0000; - c7: 132 - #ff0000; - c8: 132- #ff0000; -} -.transparent { - r: 0; - g: 0; - b: 0; - a: 0; -} diff --git a/vendor/leafo/lessphp/tests/outputs/compile_on_mixin.css b/vendor/leafo/lessphp/tests/outputs/compile_on_mixin.css deleted file mode 100644 index 318526a5..00000000 --- a/vendor/leafo/lessphp/tests/outputs/compile_on_mixin.css +++ /dev/null @@ -1,29 +0,0 @@ -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; -} diff --git a/vendor/leafo/lessphp/tests/outputs/data-uri.css b/vendor/leafo/lessphp/tests/outputs/data-uri.css deleted file mode 100644 index e51b8f9c..00000000 --- a/vendor/leafo/lessphp/tests/outputs/data-uri.css +++ /dev/null @@ -1,6 +0,0 @@ -.small { - background: url("data:text/plain;base64,CmRpdjpiZWZvcmUgewoJY29udGVudDogImhpISI7Cn0KCg=="); -} -.large { - background: url("../../../lessc.inc.php"); -} diff --git a/vendor/leafo/lessphp/tests/outputs/directives.css b/vendor/leafo/lessphp/tests/outputs/directives.css deleted file mode 100644 index c2d82b83..00000000 --- a/vendor/leafo/lessphp/tests/outputs/directives.css +++ /dev/null @@ -1,27 +0,0 @@ -@charset "utf-8"; -@-moz-document url-prefix() { - div { - color: red; - } -} -@page :left { - margin-left: 4cm; -} -@page :right { - margin-left: 3cm; -} -@page { - margin: 2cm; -} -@-ms-viewport { - width: device-width; -} -@-moz-viewport { - width: device-width; -} -@-o-viewport { - width: device-width; -} -@viewport { - width: device-width; -} diff --git a/vendor/leafo/lessphp/tests/outputs/escape.css b/vendor/leafo/lessphp/tests/outputs/escape.css deleted file mode 100644 index 0587bcab..00000000 --- a/vendor/leafo/lessphp/tests/outputs/escape.css +++ /dev/null @@ -1,14 +0,0 @@ -body { - e1: this is simple; - e2: this is simple; - e3: 1232; - e4: world; - e5: onemore; - t1: eating rice; - t2: string cheese; - t3: a b c string me d e f; - t4: string world; -} -.class { - filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image.png'); -} diff --git a/vendor/leafo/lessphp/tests/outputs/font_family.css b/vendor/leafo/lessphp/tests/outputs/font_family.css deleted file mode 100644 index fc260fd4..00000000 --- a/vendor/leafo/lessphp/tests/outputs/font_family.css +++ /dev/null @@ -1,17 +0,0 @@ -@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; -} diff --git a/vendor/leafo/lessphp/tests/outputs/guards.css b/vendor/leafo/lessphp/tests/outputs/guards.css deleted file mode 100644 index 34af5495..00000000 --- a/vendor/leafo/lessphp/tests/outputs/guards.css +++ /dev/null @@ -1,27 +0,0 @@ -dd { - simple: yellow; -} -b { - something: red; - something-complex: blue cool; - something-complex: blue birthday; -} -img { - another: green; - flipped: teal; -} -body { - yeah-number: purple 232px; - yeah-pixel: silver; - yeah-number: purple 232; -} -div { - something-complex: blue true; -} -link { - color: true red; - color: true #fff; - color: true #fffddd; - color: true #000000; - color: true rgba(0,0,0,0.34); -} diff --git a/vendor/leafo/lessphp/tests/outputs/hacks.css b/vendor/leafo/lessphp/tests/outputs/hacks.css deleted file mode 100644 index b8327eb5..00000000 --- a/vendor/leafo/lessphp/tests/outputs/hacks.css +++ /dev/null @@ -1,4 +0,0 @@ -:root .alert-message, -:root .btn { - border-radius: 0 \0; -} diff --git a/vendor/leafo/lessphp/tests/outputs/hi.css b/vendor/leafo/lessphp/tests/outputs/hi.css deleted file mode 100644 index 3bffcf0b..00000000 --- a/vendor/leafo/lessphp/tests/outputs/hi.css +++ /dev/null @@ -1,3 +0,0 @@ -div:before { - content: "hi!"; -} diff --git a/vendor/leafo/lessphp/tests/outputs/ie.css b/vendor/leafo/lessphp/tests/outputs/ie.css deleted file mode 100644 index 7e4571c8..00000000 --- a/vendor/leafo/lessphp/tests/outputs/ie.css +++ /dev/null @@ -1,9 +0,0 @@ -foo { - filter: progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr=#c0ff3300,endColorstr=#ff000000); - filter: progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr=#c0ff3300,endColorstr=#ff000001); -} -foo { - filter: alpha(opacity=20); - filter: alpha(opacity=20,enabled=true); - filter: blaznicate(foo=bar,baz=bang bip,bart=#fa4600); -} diff --git a/vendor/leafo/lessphp/tests/outputs/import.css b/vendor/leafo/lessphp/tests/outputs/import.css deleted file mode 100644 index b76c25b5..00000000 --- a/vendor/leafo/lessphp/tests/outputs/import.css +++ /dev/null @@ -1,51 +0,0 @@ -@import "not-found"; -@import "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; -} -.one { - color: blue; -} -#merge-import-mixins .just-a-class { - background: red; -} -#merge-import-mixins .just-a-class { - background: blue; -} -#merge-import-mixins .hello { - height: 200px; -} -@media cool { - #merge-import-mixins { - color: red; - height: 200px; - } -} -#merge-import-mixins div { - background: red; - background: blue; -} -.inner { - content: "inner/file1.less"; -} -.inner { - content: "inner/file2.less"; -} -pre { - color: hello-from-file-3; -} -h2 { - background: url("../images/logo.png") no-repeat; -} diff --git a/vendor/leafo/lessphp/tests/outputs/interpolation.css b/vendor/leafo/lessphp/tests/outputs/interpolation.css deleted file mode 100644 index c3ff1f42..00000000 --- a/vendor/leafo/lessphp/tests/outputs/interpolation.css +++ /dev/null @@ -1,28 +0,0 @@ -div { - interp1: yes; - interp2: yes; - interp3: okay; -} -10"yeah" { - color: blue; -} -10 { - color: blue; -} -hello world 10 { - color: red; -} -#"yeah" { - color: "hello 10"; -} -[prop], -[prop="value3"], -[prop*="val3"], -[|prop~="val3"], -[*|prop$="val3"], -[ns|prop^="val3"], -[3^="val3"], -[3=3], -[3] { - attributes: yes; -} diff --git a/vendor/leafo/lessphp/tests/outputs/keyframes.css b/vendor/leafo/lessphp/tests/outputs/keyframes.css deleted file mode 100644 index cf62be11..00000000 --- a/vendor/leafo/lessphp/tests/outputs/keyframes.css +++ /dev/null @@ -1,48 +0,0 @@ -@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/vendor/leafo/lessphp/tests/outputs/math.css b/vendor/leafo/lessphp/tests/outputs/math.css deleted file mode 100644 index 8d425f30..00000000 --- a/vendor/leafo/lessphp/tests/outputs/math.css +++ /dev/null @@ -1,69 +0,0 @@ -.unary { - sub: 10 -5; -} -.spaces { - sub1: 5; - sub2: 5; - add1: 15; - add2: 15; - div: 2; - mul1: 50; - mul2: 50; -} -.supress-division { - border-radius: 10px/10px; - border-radius: 10px/12px; - border-radius: hello(10px/10px) world; - font: 10px/30 sans-serif; - font: 10px/20px sans-serif; - font: 10px/22px sans-serif; - border-radius: 0 15px 15px 15px/0 50% 50% 50%; -} -.parens { - sub: 5; - add: 15; - div1: 2; - div2: 2; - mul: 50; -} -.keyword-names { - height: "hello" 25; -} -.negation { - neg1: -1px; - neg2: -1px; - neg3: -10; -} -.test { - single1: 5; - single2: 10; - single3: 10; - parens: 10 -2; - math1: 20; - math2: 20; - complex1: 71; - complex2: 6; - complex3: 6px 1em 2px 2; - var1: 8 4 4 4px; - var2: 96; - var3: 12; - complex4: 113; -} -.percents { - p1: 1000%; - p2: 1000%; - p3: 100%; - p4: 1000px; - p5: 1000%; - p6: 30%; - p7: 10%; - p8: 2%; -} -.misc { - x: 40px; - y: 40em; -} -.cond { - c1: false; - c2: true; -} diff --git a/vendor/leafo/lessphp/tests/outputs/media.css b/vendor/leafo/lessphp/tests/outputs/media.css deleted file mode 100644 index 99da8c31..00000000 --- a/vendor/leafo/lessphp/tests/outputs/media.css +++ /dev/null @@ -1,70 +0,0 @@ -@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; - } -} -@media test { - div { - height: 20px; - } -} -@media test and (hello) { - div { - color: red; - } - div pre { - color: orange; - } -} -@media yeah { - @page { - @media cool { - color: red; - } - } -} -@media (max-width: 599px) { - .helloworld { - color: blue; - } -} diff --git a/vendor/leafo/lessphp/tests/outputs/misc.css b/vendor/leafo/lessphp/tests/outputs/misc.css deleted file mode 100644 index 6c99cc39..00000000 --- a/vendor/leafo/lessphp/tests/outputs/misc.css +++ /dev/null @@ -1,68 +0,0 @@ -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 { - background1: url("http://google.com"); - background2: url(http://google.com); - background3: 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; -} -hello { - numbers: 1.0 0.1 .1 1.; - numbers: 1.0s 0.1s .1s 1.s; - numbers: -1s -0.1s -0.1s -1s; - numbers: -1 -0.1 -0.1 -1; -} -#string { - hello: 'what\'s going on here'; - hello: 'blah blag @{ blah blah'; - join: "3434hello"; - join: 3434hello; -} -.duplicates { - hello: world; - hello: "world"; - hello: "what"; -} diff --git a/vendor/leafo/lessphp/tests/outputs/mixin_functions.css b/vendor/leafo/lessphp/tests/outputs/mixin_functions.css deleted file mode 100644 index 53785803..00000000 --- a/vendor/leafo/lessphp/tests/outputs/mixin_functions.css +++ /dev/null @@ -1,7 +0,0 @@ -body { - padding: 2.0em; - color: red; - margin: 10px; - height: 12px; - border-bottom: 1px solid green; -} diff --git a/vendor/leafo/lessphp/tests/outputs/mixin_merging.css b/vendor/leafo/lessphp/tests/outputs/mixin_merging.css deleted file mode 100644 index f396ba92..00000000 --- a/vendor/leafo/lessphp/tests/outputs/mixin_merging.css +++ /dev/null @@ -1,42 +0,0 @@ -#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; -} diff --git a/vendor/leafo/lessphp/tests/outputs/mixins.css b/vendor/leafo/lessphp/tests/outputs/mixins.css deleted file mode 100644 index cce87eb4..00000000 --- a/vendor/leafo/lessphp/tests/outputs/mixins.css +++ /dev/null @@ -1,92 +0,0 @@ -.bold { - font-size: 20px; - font-weight: bold; -} -body #window { - border-radius: 10px; - font-size: 20px; - font-weight: bold; - line-height: 30px; -} -#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; -} -.mix-suffix { - color: red !important; - height: 20px !important; -} -.mix-suffix pre { - color: red; -} -.search-test { - color: #f00 !important; - color: #0f0 !important; -} -.cowboy { - color: blue; -} -.nav .nav-divider { - padding: 10px; -} -.nav-divider { - padding: 10px; -} diff --git a/vendor/leafo/lessphp/tests/outputs/nested.css b/vendor/leafo/lessphp/tests/outputs/nested.css deleted file mode 100644 index 454dcfcc..00000000 --- a/vendor/leafo/lessphp/tests/outputs/nested.css +++ /dev/null @@ -1,51 +0,0 @@ -#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; -} diff --git a/vendor/leafo/lessphp/tests/outputs/nesting.css b/vendor/leafo/lessphp/tests/outputs/nesting.css deleted file mode 100644 index 804a56bf..00000000 --- a/vendor/leafo/lessphp/tests/outputs/nesting.css +++ /dev/null @@ -1,6 +0,0 @@ -#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; } diff --git a/vendor/leafo/lessphp/tests/outputs/pattern_matching.css b/vendor/leafo/lessphp/tests/outputs/pattern_matching.css deleted file mode 100644 index 215371b0..00000000 --- a/vendor/leafo/lessphp/tests/outputs/pattern_matching.css +++ /dev/null @@ -1,72 +0,0 @@ -.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; -} diff --git a/vendor/leafo/lessphp/tests/outputs/scopes.css b/vendor/leafo/lessphp/tests/outputs/scopes.css deleted file mode 100644 index ea2a4573..00000000 --- a/vendor/leafo/lessphp/tests/outputs/scopes.css +++ /dev/null @@ -1,11 +0,0 @@ -body div other world { - height: 50; -} -div other world { - height: 50; -} -pre { - height: 10; - height: 11; - height: 12; -} diff --git a/vendor/leafo/lessphp/tests/outputs/selector_expressions.css b/vendor/leafo/lessphp/tests/outputs/selector_expressions.css deleted file mode 100644 index 71d4a5d8..00000000 --- a/vendor/leafo/lessphp/tests/outputs/selector_expressions.css +++ /dev/null @@ -1,25 +0,0 @@ -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; -} diff --git a/vendor/leafo/lessphp/tests/outputs/site_demos.css b/vendor/leafo/lessphp/tests/outputs/site_demos.css deleted file mode 100644 index 3428ad3a..00000000 --- a/vendor/leafo/lessphp/tests/outputs/site_demos.css +++ /dev/null @@ -1,76 +0,0 @@ -default .underline { - border-bottom: 1px solid green; -} -default #header { - color: black; - border: 1px solid #dd44dd; -} -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; -} diff --git a/vendor/leafo/lessphp/tests/outputs/variables.css b/vendor/leafo/lessphp/tests/outputs/variables.css deleted file mode 100644 index c4857cc6..00000000 --- a/vendor/leafo/lessphp/tests/outputs/variables.css +++ /dev/null @@ -1,19 +0,0 @@ -outer1: 44px; -outer2: 44px; -.variables { - width: 14cm; - height: 24px; - margin-top: -20px; - margin-bottom: 30px; - color: #888899; - 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); -} diff --git a/vendor/leafo/lessphp/tests/outputs_lessjs/mixins-args.css b/vendor/leafo/lessphp/tests/outputs_lessjs/mixins-args.css deleted file mode 100644 index 0a8e6bee..00000000 --- a/vendor/leafo/lessphp/tests/outputs_lessjs/mixins-args.css +++ /dev/null @@ -1,113 +0,0 @@ -#hidden { - color: transparent; -} -#hidden1 { - color: transparent; -} -.two-args { - color: blue; - width: 10px; - height: 99%; - border: 2px dotted black; -} -.one-arg { - width: 15px; - height: 49%; -} -.no-parens { - width: 5px; - height: 49%; -} -.no-args { - width: 5px; - height: 49%; -} -.var-args { - width: 45; - height: 17%; -} -.multi-mix { - width: 10px; - height: 29%; - margin: 4; - padding: 5; -} -body { - padding: 30px; - color: #f00; -} -.scope-mix { - width: 8; -} -.content { - width: 600px; -} -.content .column { - margin: 600px; -} -#same-var-name { - radius: 5px; -} -#var-inside { - width: 10px; -} -.arguments { - border: 1px solid black; - width: 1px; -} -.arguments2 { - border: 0px; - width: 0px; -} -.arguments3 { - border: 0px; - width: 0px; -} -.arguments4 { - border: 0 1 2 3 4; - rest: 1 2 3 4; - width: 0; -} -.edge-case { - border: "{"; - width: "{"; -} -.slash-vs-math { - border-radius: 0.4px; - border-radius: 0.5px; - border-radius: 6px; -} -.comma-vs-semi-colon { - one: a; - two: b, c; - one: d, e; - two: f; - one: g; - one: h; - one: i; - one: j; - one: k; - two: l; - one: m, n; - one: o, p; - two: q; - one: r, s; - two: t; -} -#named-conflict { - four: a, 11, 12, 13; - four: a, 21, 22, 23; -} -.test-mixin-default-arg { - defaults: 1px 1px 1px; - defaults: 2px 2px 2px; -} -.selector { - margin: 2, 2, 2, 2; -} -.selector2 { - margin: 2, 2, 2, 2; -} -.selector3 { - margin: 4; -} diff --git a/vendor/leafo/lessphp/tests/outputs_lessjs/mixins-named-args.css b/vendor/leafo/lessphp/tests/outputs_lessjs/mixins-named-args.css deleted file mode 100644 index e460aa10..00000000 --- a/vendor/leafo/lessphp/tests/outputs_lessjs/mixins-named-args.css +++ /dev/null @@ -1,27 +0,0 @@ -.named-arg { - color: blue; - width: 5px; - height: 99%; - args: 1px 100%; - text-align: center; -} -.class { - width: 5px; - height: 19%; - args: 1px 20%; -} -.all-args-wrong-args { - width: 10px; - height: 9%; - args: 2px 10%; -} -.named-args2 { - width: 15px; - height: 49%; - color: #646464; -} -.named-args3 { - width: 5px; - height: 29%; - color: #123456; -} diff --git a/vendor/leafo/lessphp/tests/outputs_lessjs/strings.css b/vendor/leafo/lessphp/tests/outputs_lessjs/strings.css deleted file mode 100644 index f7b9c27d..00000000 --- a/vendor/leafo/lessphp/tests/outputs_lessjs/strings.css +++ /dev/null @@ -1,40 +0,0 @@ -#strings { - background-image: url("http://son-of-a-banana.com"); - quotes: "~" "~"; - content: "#*%:&^,)!.(~*})"; - empty: ""; - brackets: "{" "}"; - escapes: "\"hello\" \\world"; - escapes2: "\"llo"; -} -#comments { - content: "/* hello */ // not-so-secret"; -} -#single-quote { - quotes: "'" "'"; - content: '""#!&""'; - empty: ''; - semi-colon: ';'; -} -#escaped { - filter: DX.Transform.MS.BS.filter(opacity=50); -} -#one-line { - image: url(http://tooks.com); -} -#crazy { - image: url(http://), "}", url("http://}"); -} -#interpolation { - url: "http://lesscss.org/dev/image.jpg"; - url2: "http://lesscss.org/image-256.jpg"; - url3: "http://lesscss.org#445566"; - url4: "http://lesscss.org/hello"; - url5: "http://lesscss.org/54.4px"; -} -.mix-mul-class { - color: blue; - color: red; - color: black; - color: orange; -} diff --git a/vendor/leafo/lessphp/tests/sort.php b/vendor/leafo/lessphp/tests/sort.php deleted file mode 100644 index 70b907ea..00000000 --- a/vendor/leafo/lessphp/tests/sort.php +++ /dev/null @@ -1,57 +0,0 @@ -coerceColor($value); - } - - return parent::compileValue($value); - } -} - -class SortingFormatter extends lessc_formatter_lessjs { - function sortKey($block) { - if (!isset($block->sortKey)) { - sort($block->selectors, SORT_STRING); - $block->sortKey = implode(",", $block->selectors); - } - - return $block->sortKey; - } - - function sortBlock($block) { - usort($block->children, function($a, $b) { - $sort = strcmp($this->sortKey($a), $this->sortKey($b)); - if ($sort == 0) { - // TODO - } - return $sort; - }); - - } - - function block($block) { - $this->sortBlock($block); - return parent::block($block); - } - -} - -$less = new lesscNormalized(); -$less->setFormatter(new SortingFormatter); -echo $less->parse(file_get_contents($fname)); - -- cgit v1.2.3-54-g00ecf