diff options
Diffstat (limited to 'vendors/lessphp')
65 files changed, 0 insertions, 8109 deletions
diff --git a/vendors/lessphp/.gitignore b/vendors/lessphp/.gitignore deleted file mode 100644 index ed09d55dc..000000000 --- a/vendors/lessphp/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -*.swp -*~ -/*.less -/*.css -tests/bootstrap -tests/tmp -vendor -composer.lock diff --git a/vendors/lessphp/LICENSE b/vendors/lessphp/LICENSE deleted file mode 100644 index b2338b1c8..000000000 --- a/vendors/lessphp/LICENSE +++ /dev/null @@ -1,660 +0,0 @@ -For ease of distribution, lessphp 0.2.0 is under a dual license. -You are free to pick which one suits your needs. - - - - -MIT LICENSE - - - - -Copyright (c) 2010 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. <http://fsf.org/> - 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/vendors/lessphp/README.md b/vendors/lessphp/README.md deleted file mode 100644 index b48850038..000000000 --- a/vendors/lessphp/README.md +++ /dev/null @@ -1,69 +0,0 @@ -# lessphp v0.3.5 -### <http://leafo.net/lessphp> - -`lessphp` is a compiler for LESS written in PHP. The documentation is great, -so check it out: <http://leafo.net/lessphp/docs/>. - -Here's a quick tutorial: - -### How to use in your PHP project - -Copy `lessc.inc.php` to your include directory and include it into your project. - -There are a few ways to interface with the compiler. The easiest is to have it -compile a LESS file when the page is requested. The static function -`lessc::ccompile`, checked compile, will compile the input LESS file only when it -is newer than the output file. - - try { - lessc::ccompile('input.less', 'output.css'); - } catch (exception $ex) { - exit($ex->getMessage()); - } - -`lessc::ccompile` is not aware of imported files that change. Read [about -`lessc::cexecute`](http://leafo.net/lessphp/docs/#compiling_automatically). - -Note that all failures with lessc are reported through exceptions. -If you need more control you can make your own instance of lessc. - - $input = 'mystyle.less'; - - $lc = new lessc($input); - - try { - file_put_contents('mystyle.css', $lc->parse()); - } catch (exception $ex) { ... } - -In addition to loading from file, you can also parse from a string like so: - - $lc = new lessc(); - $lesscode = 'body { ... }'; - $out = $lc->parse($lesscode); - -### 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. - -`lessphp` also supports output formatters. To compress the output run this: - - $ plessc -f=compressed myfile.less - -For more help, run `plessc --help` - diff --git a/vendors/lessphp/composer.json b/vendors/lessphp/composer.json deleted file mode 100644 index 5a29a284a..000000000 --- a/vendors/lessphp/composer.json +++ /dev/null @@ -1,20 +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"] - } -} diff --git a/vendors/lessphp/docs/docs.md b/vendors/lessphp/docs/docs.md deleted file mode 100644 index c46ad0fe1..000000000 --- a/vendors/lessphp/docs/docs.md +++ /dev/null @@ -1,1168 +0,0 @@ - title: v0.3.5 documentation - link_to_home: true --- - -<h2 skip="true">Documentation v0.3.5</h2> - -<div style="margin-bottom: 1em;">$index</div> - -**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; - .mixin; - } - ``` - -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; - } - ``` - -#### `@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) { - (e(@name)) { - color: red; - } - } - - .create-selector("hello"); - .create-selector("world"); - ``` - -Any selector that is enclosed in `()` will have it's contents evaluated and -directly written to output. The value is not changed any way before being -outputted, thats why we use the `e` function. If you're not familiar, the `e` -function strips quotes off a string value. If we didn't have it, then the -selector would have quotes around it, and that's not valid CSS! - -Any value can be used in a selector expression, but it works best when using -strings and things like [String Interpolation](#string_interpolation). - -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: - - ```less - // 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: - - ```less - @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). - -### 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)` -- returns the rounded value of numerical input - -* `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 - <http://sass-lang.com/docs/yardoc/Sass/Script/Functions.html#mix-instance_method>. - -* `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 - -The PHP interface lets you control the compiler from your PHP scripts. There is -only one file to include to get access to everything: - - ```php - <?php - include "lessc.inc.php"; - ``` - -To compile a file to a string (of CSS code): - - ```php - $less = new lessc("myfile.less"); - $css = $less->parse(); - ``` - -To compile a string to a string: - - ```php - $less = new lessc(); // a blank lessc - $css = $less->parse("body { a { color: red } }"); - ``` - -### Output Formatting - -Besides the default output formatter, **lessphp** comes with two additional -ones, and it's easy to make your own. - -The first extra formatter is called `compressed`. It compresses the output by -removing any extra whitespace. - -We use the `setFormatter` method set the formatter that should be used. Just -pass the name of the formatter: - - ```php - $less = new lessc("myfile.less"); - - $less->setFormatter("compressed"); - - $css = $less->parse(); - ``` - -The second formatter is called `indent`. It will indent CSS blocks based on how -they were nested in the LESS code. - -#### Custom Formatter - -The easiest way to customize is to create your own instance of the formatter -and alter its public properties before passing it off to **lessphp**. The -`setFormatter` method can also take an instance of a formatter. - -For example, let's use tabs instead of the default two spaces to indent: - - ```php - $formatter = new lessc_formatter; - $formatter->indentChar = "\t"; - - $less = new lessc("myfile.less"); - $less->setFormatter($formatter); - $css = $less->parse(); - ``` - -For more information about what can be configured with the formatter consult -the sourcecode. - -### Compiling Automatically - -Often, you want to write the compiled CSS to a file, and only recompile when -the original LESS file has changed. The following function will check if the -modification date of the LESS file is more recent than the CSS file. The LESS -file will be compiled if it is. If the CSS file doesn't exist yet, then it will -also compile the LESS file. - - ```php - lessc::ccompile('myfile.less', 'mystyle.css'); - ``` - -`ccompile` is very basic, it only checks if the input file's modification time. -It is not of any files that are brought in using `@import`. - -For this reason we also have `lessc::cexecute`. It functions slightly -differently, but gives us the ability to check changes to all files used during -the compile. 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 - $less_file = 'myfile.less'; - $css_file = 'myfile.css'; - - // create a new cache object, and compile - $cache = lessc::cexecute('myfile.less'); - file_put_contents($css_file, $cache['compiled']); - - // the next time we run, write only if it has updated - $last_updated = $cache['updated']; - $cache = lessc::cexecute($cache); - if ($cache['updated'] > $last_updated) { - file_put_contents($css_file, $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 auto_compile_less($less_fname, $css_fname) { - // load the cache - $cache_fname = $less_fname.".cache"; - if (file_exists($cache_fname)) { - $cache = unserialize(file_get_contents($cache_fname)); - } else { - $cache = $less_fname; - } - - $new_cache = lessc::cexecute($cache); - if (!is_array($cache) || $new_cache['updated'] > $cache['updated']) { - file_put_contents($cache_fname, serialize($new_cache)); - file_put_contents($css_fname, $new_cache['compiled']); - } - } - - auto_compile_less('myfile.less', 'myfile.css'); - ``` - -`lessc:cexecute` takes an optional second argument, `$force`. Passing in true -will cause the input to always be recompiled. - -### Error Handling - -All of the following methods will throw an `Exception` if the parsing fails: - - ```php - $less = new lessc(); - try { - $less->parse("} invalid LESS }}}"); - } catch (Exception $ex) { - echo "lessphp fatal error: ".$ex->getMessage(); - } - ``` -### Setting Variables From PHP - -The `parse` function takes a second optional argument. If you want to -initialize variables from outside the LESS file then you can pass in an -associative array of names and values. The values will parsed as CSS values: - - ```php - $less = new lessc(); - echo $less->parse(".magic { color: @color; width: @base - 200; }", - array( - 'color' => 'red'; - 'base' => '960px'; - )); - ``` - -You can also do this when loading from a file. If the first argument of `parse` -is an array it will be used an array of variables to set. - - ```php - $less = new lessc("myfile.less"); - echo $less->parse(array('color' => 'blue')); - ``` - -### 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. - -An instance of `lessc`, the **lessphp** compiler has two relevant methods: -`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 - <?php - include "lessc.inc.php"; - - function lessphp_double($arg) { - list($type, $value) = $arg; - return array($type, $value*2); - } - - $myless = new myless(); - $myless->registerFunction("double", "lessphp_double"); - - // gives us a width of 800px - echo $myless->parse("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 - $myless->registerFunction("double", function($arg) { - list($type, $value) = $arg; - return array($type, $value*2); - }); - ``` - -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 `vardump` 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. - -In addition to the arguments passed from **lessphp**, the instance of -**lessphp** itself is sent to the registered function as the second argument. - -## 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 an 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) 2010 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. - - -*Also under GPL3 if required, see `LICENSE` file* - diff --git a/vendors/lessphp/lessc.inc.php b/vendors/lessphp/lessc.inc.php deleted file mode 100644 index d710fdf8a..000000000 --- a/vendors/lessphp/lessc.inc.php +++ /dev/null @@ -1,2910 +0,0 @@ -<?php - -/** - * lessphp v0.3.5 - * http://leafo.net/lessphp - * - * LESS css compiler, adapted from http://lesscss.org - * - * Copyright 2012, Leaf Corcoran <leafot@gmail.com> - * Licensed under MIT or GPLv3, see LICENSE - */ - - -/** - * The less compiler and parser. - * - * Converting LESS to CSS is a two stage process. The incoming file is parsed - * by `lessc_parser` into a tree, then compiled to CSS text by `lessc`. The - * compile step has an implicit step called reduction, where values are brought - * to their lowest form before being turned to text, eg. mathematical equations - * are solved, and variables are dereferenced. - * - * The `lessc` class creates an intstance of the parser, feeds it LESS code, then - * compiles the resulting tree to CSS - * - * The `lessc_parser` class is only concerned with parsing its input. - * - * The `lessc_formatter` classes are used to format the output of the CSS, - * controlling things like whitespace and line-breaks. - */ -class lessc { - static public $VERSION = "v0.3.5"; - static protected $TRUE = array("keyword", "true"); - static protected $FALSE = array("keyword", "false"); - - protected $libFunctions = array(); - - protected $indentLevel; - - protected $env = null; - - protected $allParsedFiles = array(); - - public $vPrefix = '@'; // prefix of abstract properties - public $mPrefix = '$'; // prefix of abstract blocks - public $parentSelector = '&'; - - // types that must be reduced before being compiled - static protected $dtypes = array('expression', 'variable', - 'function', 'negative', 'list', 'lookup'); - - public $importDisabled = false; - public $importDir = ''; - - public $compat = true; // lessjs compatibility mode, does nothing right now - - // 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; - - // attempts to find the path of an import url, returns null for css files - 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; - } - - function fileExists($name) { - return is_file($name); - } - - static function compressList($items, $delim) { - if (count($items) == 1) return $items[0]; - else return array('list', $delim, $items); - } - - static function preg_quote($what) { - return preg_quote($what, '/'); - } - - // just do a shallow property merge, seems to be what lessjs does - function mergeBlock($target, $from) { - $target = clone $target; - $target->props = array_merge($target->props, $from->props); - return $target; - } - - // attempt to import $import into $parentBlock - // $props is the property array that will given to $parentBlock at the end - function mixImport($import, $parentBlock, &$props) { - list(, $url, $media) = $import; - - if (empty($media) && substr_compare($url, '.css', -4, 4) !== 0) { - if ($this->importDisabled) { - $props[] = array('raw', '/* import disabled */'); - return true; - } - - $realPath = $this->findImport($url); - if (!is_null($realPath)) { - $this->addParsedFile($realPath); - - $parser = new lessc_parser($this, $realPath); - $root = $parser->parse(file_get_contents($realPath)); - $root->isRoot = false; - $root->parent = $parentBlock; - - // handle all the imports in the new file - $pi = pathinfo($realPath); - $this->mixImports($root, $pi['dirname'].'/'); - - // inject imported blocks into this block, local will overwrite import - $parentBlock->children = - array_merge($root->children,$parentBlock->children); - - // splice in the props - foreach ($root->props as $prop) { - // leave a reference to the file where it came from - if (isset($prop[-1]) && !is_array($prop[-1])) { - $prop[-1] = array($parser, $prop[-1]); - } - $props[] = $prop; - } - - return true; - } - } - - // fallback to regular css import - $props[] = array('raw', '@import url("'.$url.'")'.($media ? ' '.$media : '').';'); - return false; - } - - // import all imports mentioned in the block - function mixImports($block, $importDir = null) { - $oldImport = $this->importDir; - if (!is_null($importDir)) { - $this->importDir = array_merge((array)$importDir, (array)$this->importDir); - } - - $props = array(); - foreach ($block->props as $prop) { - if ($prop[0] == 'import') { - $this->mixImport($prop, $block, $props); - } else { - $props[] = $prop; - } - } - $block->props = $props; - $this->importDir = $oldImport; - } - - /** - * Recursively compiles a block. - * @param $block the block - * @param $parentTags the tags of the block that contained this one - * - * 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. - * - * Compiling the block involves pushing a fresh environment on the stack, - * and iterating through the props, compiling each one. - * - * See lessc::compileProp() - * - */ - function compileBlock($block, $parent_tags = null) { - if (!empty($block->no_multiply)) { - $special_block = true; - $tags = array(); - } else { - $special_block = false; - - // evaluate expression tags - $tags = null; - if (is_array($block->tags)) { - $tags = array(); - foreach ($block->tags as $tag) { - if (is_array($tag)) { - list(, $value) = $tag; - $tags[] = $this->compileValue($this->reduce($value)); - } else { - $tags[] = $tag; - } - } - } - - $tags = $this->multiplyTags($parent_tags, $tags); - } - - $env = $this->pushEnv(); - $env->nameDepth = array(); - - $lines = array(); - $blocks = array(); - $this->mixImports($block); - - $idelta = $this->formatter->indentAmount($block); - $this->indentLevel += $idelta; - - foreach ($this->sortProps($block->props) as $prop) { - $this->compileProp($prop, $block, $tags, $lines, $blocks); - } - $this->indentLevel -= $idelta; - - $block->scope = $env; - - $this->pop(); - - // override tags if it's a special block - if (isset($block->media)) { - $tags = $this->compileMedia($block); - } elseif (isset($block->keyframes)) { - $tags = $block->tags[0]." ". - $this->compileValue($this->reduce($block->keyframes)); - } elseif ($special_block) { // font-face and the like - $tags = $block->tags[0]; - } - - return $this->formatter->block($tags, $special_block, $lines, - $blocks, $this->indentLevel); - } - - function sortProps($props) { - $out = array(); - foreach ($props as $prop) { - if ($prop[0] == "assign") $out[] = $prop; - } - - foreach ($props as $prop) { - if ($prop[0] != "assign") $out[] = $prop; - } - - return $out; - } - - 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; - } - - // find the fully qualified tags for a block and its parent's tags - function multiplyTags($parents, $current) { - if ($parents == null) { - if (is_array($current)) { - // get rid of parent selectors and escapes in top level tag - foreach ($current as &$tag) { - $this->expandParentSelectors($tag, ""); - } - } - return $current; - } - - $tags = array(); - foreach ($parents as $ptag) { - foreach ($current as $tag) { - $count = $this->expandParentSelectors($tag, $ptag); - - // don't prepend the parent tag if & was used - if ($count > 0) { - $tags[] = trim($tag); - } else { - $tags[] = trim($ptag . ' ' . $tag); - } - } - } - - return $tags; - } - - function eq($left, $right) { - return $left == $right; - } - - function patternMatch($block, $callingArgs) { - // 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)) { - $group_passed = false; - foreach ($block->guards as $guard_group) { - foreach ($guard_group as $guard) { - $this->pushEnv(); - $this->zipSetArgs($block->args, $callingArgs); - - $negate = false; - if ($guard[0] == "negate") { - $guard = $guard[1]; - $negate = true; - } - - $passed = $this->reduce($guard) == self::$TRUE; - if ($negate) $passed = !$passed; - - $this->pop(); - - if ($passed) { - $group_passed = true; - } else { - $group_passed = false; - break; - } - } - - if ($group_passed) break; - } - - if (!$group_passed) { - return false; - } - } - - $numCalling = count($callingArgs); - - if (empty($block->args)) { - return $block->is_vararg || $numCalling == 0; - } - - $i = -1; // no args - // try to match by arity or by argument literal - foreach ($block->args as $i => $arg) { - switch ($arg[0]) { - case "lit": - if (empty($callingArgs[$i]) || !$this->eq($arg[1], $callingArgs[$i])) { - return false; - } - break; - case "arg": - // no arg and no default value - if (!isset($callingArgs[$i]) && !isset($arg[2])) { - return false; - } - break; - case "rest": - $i--; // rest can be empty - break 2; - } - } - - if ($block->is_vararg) { - return true; // not having enough is handled above - } else { - $numMatched = $i + 1; - // greater than becuase default values always match - return $numMatched >= $numCalling; - } - } - - function patternMatchAll($blocks, $callingArgs) { - $matches = null; - foreach ($blocks as $block) { - if ($this->patternMatch($block, $callingArgs)) { - $matches[] = $block; - } - } - - return $matches; - } - - // attempt to find blocks matched by path and args - function findBlocks($search_in, $path, $args, $seen=array()) { - if ($search_in == null) return null; - if (isset($seen[$search_in->id])) return null; - $seen[$search_in->id] = true; - - $name = $path[0]; - - if (isset($search_in->children[$name])) { - $blocks = $search_in->children[$name]; - if (count($path) == 1) { - $matches = $this->patternMatchAll($blocks, $args); - if (!empty($matches)) { - // This will return all blocks that match in the closest - // scope that has any matching block, like lessjs - return $matches; - } - } else { - return $this->findBlocks($blocks[0], - array_slice($path, 1), $args, $seen); - } - } - - if ($search_in->parent === $search_in) return null; - return $this->findBlocks($search_in->parent, $path, $args, $seen); - } - - // sets all argument names in $args to either the default value - // or the one passed in through $values - function zipSetArgs($args, $values) { - $i = 0; - $assigned_values = array(); - foreach ($args as $a) { - if ($a[0] == "arg") { - if ($i < count($values) && !is_null($values[$i])) { - $value = $values[$i]; - } elseif (isset($a[2])) { - $value = $a[2]; - } else $value = null; - - $value = $this->reduce($value); - $this->set($a[1], $value); - $assigned_values[] = $value; - } - $i++; - } - - // check for a rest - $last = end($args); - if ($last[0] == "rest") { - $rest = array_slice($values, count($args) - 1); - $this->set($last[1], $this->reduce(array("list", " ", $rest))); - } - - $this->env->arguments = $assigned_values; - } - - // compile a prop and update $lines or $blocks appropriately - function compileProp($prop, $block, $tags, &$_lines, &$_blocks) { - // set error position context - if (isset($prop[-1])) { - if (is_array($prop[-1])) { - list($parser, $count) = $prop[-1]; - $this->sourceParser = $parser; - $this->sourceLoc = $count; - } else { - $this->sourceParser = $this->parser; - $this->sourceLoc = $prop[-1]; - } - } else { - $this->sourceLoc = -1; - } - - switch ($prop[0]) { - case 'assign': - list(, $name, $value) = $prop; - if ($name[0] == $this->vPrefix) { - $this->set($name, $value); - } else { - $_lines[] = "$name:". - $this->compileValue($this->reduce($value)).";"; - } - break; - case 'block': - list(, $child) = $prop; - $_blocks[] = $this->compileBlock($child, $tags); - break; - case 'mixin': - list(, $path, $args, $suffix) = $prop; - - $args = array_map(array($this, "reduce"), (array)$args); - $mixins = $this->findBlocks($block, $path, $args); - if (is_null($mixins)) { - // echo "failed to find block: ".implode(" > ", $path)."\n"; - break; // throw error here?? - } - - foreach ($mixins as $mixin) { - $old_scope = null; - if (isset($mixin->parent->scope)) { - $old_scope = $this->env; - $this->env = $mixin->parent->scope; - } - - $have_args = false; - if (isset($mixin->args)) { - $have_args = true; - $this->pushEnv(); - $this->zipSetArgs($mixin->args, $args); - } - - $old_parent = $mixin->parent; - if ($mixin != $block) $mixin->parent = $block; - - foreach ($this->sortProps($mixin->props) as $sub_prop) { - if($suffix !== null) { - $sub_prop[2] = array( - 'list', ' ', - array($sub_prop[2], array('keyword', $suffix)) - ); - } - - $this->compileProp($sub_prop, $mixin, $tags, $_lines, $_blocks); - } - - $mixin->parent = $old_parent; - - if ($have_args) $this->pop(); - - if ($old_scope) { - $this->env = $old_scope; - } - } - - break; - case 'raw': - $_lines[] = $prop[1]; - break; - case 'charset': - list(, $value) = $prop; - $_lines[] = '@charset '.$this->compileValue($this->reduce($value)).';'; - 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. - */ - 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 'keyword': - // [1] - the keyword - case 'number': - // [1] - the number - return $value[1]; - case 'escape': - case 'string': - // [1] - contents of string (includes quotes) - - // search for inline variables to replace - $replace = array(); - if (preg_match_all('/'.self::preg_quote($this->vPrefix).'\{([\w-_][0-9\w-_]*)\}/', $value[1], $m)) { - foreach ($m[1] as $name) { - if (!isset($replace[$name])) - $replace[$name] = $this->compileValue($this->reduce(array('variable', $this->vPrefix . $name))); - } - } - - foreach ($replace as $var=>$val) { - if ($this->quoted($val)) { - $val = substr($val, 1, -1); - } - $value[1] = str_replace($this->vPrefix. '{'.$var.'}', $val, $value[1]); - } - - return $value[1]; - case 'color': - // [1] - red component (either number for 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); - - // 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': - // [1] - function name - // [2] - some array value representing arguments, either ['string', value] or ['list', ',', values[]] - - // see if function evaluates to something else - $value = $this->reduce($value); - if ($value[0] == 'function') { - return $value[1].'('.$this->compileValue($value[2]).')'; - } - else return $this->compileValue($value); - default: // assumed to be unit - return $value[1].$value[0]; - } - } - - function compileMedia($block) { - $mediaParts = array(); - foreach ($block->media as $part) { - if ($part[0] == "raw") { - $mediaParts[] = $part[1]; - } elseif ($part[0] == "assign") { - list(, $propName, $propVal) = $part; - $mediaParts[] = "$propName: ". - $this->compileValue($this->reduce($propVal)); - } - } - - return "@media ".trim(implode($mediaParts)); - } - - function lib_isnumber($value) { - return $this->toBool(is_numeric($value[1]) && $value[0] != "color"); - } - - function lib_isstring($value) { - return $this->toBool($value[0] == "string"); - } - - function lib_iscolor($value) { - return $this->toBool($this->coerceColor($value)); - } - - function lib_iskeyword($value) { - return $this->toBool($value[0] == "keyword"); - } - - function lib_ispixel($value) { - return $this->toBool($value[0] == "px"); - } - - function lib_ispercentage($value) { - return $this->toBool($value[0] == "%"); - } - - function lib_isem($value) { - return $this->toBool($value[0] == "em"); - } - - 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 : 0, - $color[1],$color[2], $color[3]); - } - - function lib_argb($color){ - return $this->lib_rgbahex($color); - } - - // utility func to unquote a string - function lib_e($arg) { - switch ($arg[0]) { - case "list": - $items = $arg[2]; - if (isset($items[0])) { - return $this->lib_e($items[0]); - } - return ""; - case "string": - $str = $this->compileValue($arg); - return substr($str, 1, -1); - default: - return $this->compileValue($arg); - } - } - - function lib__sprintf($args) { - if ($args[0] != "list") return $args; - $values = $args[2]; - $source = $this->reduce(array_shift($values)); - if ($source[0] != "string") { - return $source; - } - - $str = $source[1]; - $i = 0; - if (preg_match_all('/%[dsa]/', $str, $m)) { - foreach ($m[0] as $match) { - $val = isset($values[$i]) ? $this->reduce($values[$i]) : array('keyword', ''); - $i++; - switch ($match[1]) { - case "s": - if ($val[0] == "string") { - $rep = substr($val[1], 1, -1); - break; - } - default: - $rep = $this->compileValue($val); - } - $str = preg_replace('/'.self::preg_quote($match).'/', $rep, $str, 1); - } - } - - return array('string', $str); - } - - function lib_floor($arg) { - return array($arg[0], floor($arg[1])); - } - - function lib_ceil($arg) { - return array($arg[0], ceil($arg[1])); - } - - function lib_round($arg) { - return array($arg[0], round($arg[1])); - } - - // is a string surrounded in quotes? returns the quoting char if true - function quoted($s) { - if (preg_match('/^("|\').*?\1$/', $s, $m)) - return $m[1]; - else return false; - } - - /** - * Helper function to get arguments for color functions. - * Accepts invalid input, non colors interpreted as being black. - */ - function colorArgs($args) { - if ($args[0] != 'list' || count($args[2]) < 2) { - return array(array('color', 0, 0, 0)); - } - list($color, $delta) = $args[2]; - $color = $this->coerceColor($color); - if (is_null($color)) - $color = array('color', 0, 0, 0); - - $delta = floatval($delta[1]); - - return array($color, $delta); - } - - 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); - } - - 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); - } - - 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); - } - - 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); - } - - 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); - } - - function lib_fadeout($args) { - list($color, $delta) = $this->colorArgs($args); - $color[4] = $this->clamp((isset($color[4]) ? $color[4] : 1) - $delta/100); - return $color; - } - - function lib_fadein($args) { - list($color, $delta) = $this->colorArgs($args); - $color[4] = $this->clamp((isset($color[4]) ? $color[4] : 1) + $delta/100); - return $color; - } - - function lib_hue($color) { - if ($color[0] != 'color') return 0; - $hsl = $this->toHSL($color); - return round($hsl[1]); - } - - function lib_saturation($color) { - if ($color[0] != 'color') return 0; - $hsl = $this->toHSL($color); - return round($hsl[2]); - } - - function lib_lightness($color) { - if ($color[0] != 'color') return 0; - $hsl = $this->toHSL($color); - return round($hsl[3]); - } - - // get the alpha of a color - // defaults to 1 for non-colors or colors without an alpha - function lib_alpha($color) { - if ($color[0] != 'color') return 1; - return isset($color[4]) ? $color[4] : 1; - } - - // set the alpha of the color - function lib_fade($args) { - list($color, $alpha) = $this->colorArgs($args); - $color[4] = $this->clamp($alpha / 100.0); - return $color; - } - - function lib_percentage($number) { - return array('%', $number[1]*100); - } - - // mixes two colors by weight - // mix(@color1, @color2, @weight); - // http://sass-lang.com/docs/yardoc/Sass/Script/Functions.html#mix-instance_method - function lib_mix($args) { - if ($args[0] != "list" || count($args[2]) < 3) - $this->throwError("mix expects (color1, color2, weight)"); - - list($first, $second, $weight) = $args[2]; - $first = $this->assertColor($first); - $second = $this->assertColor($second); - - $first_a = $this->lib_alpha($first); - $second_a = $this->lib_alpha($second); - $weight = $weight[1] / 100.0; - - $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); - } - - function assertColor($value, $error = "expected color value") { - $color = $this->coerceColor($value); - if (is_null($color)) $this->throwError($error); - return $color; - } - - 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; - } - - 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 - */ - function toRGB($color) { - if ($color == '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; - } - - 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. - */ - 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 < 4) $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] == '%') $components[] = 255 * ($c[1] / 100); - else $components[] = floatval($c[1]); - } elseif ($i == 4) { - if ($c[0] == '%') $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; - } - - function toName($val) { - switch($val[0]) { - case "string": - return substr($val[1], 1, -1); - default: - return $val[1]; - } - } - - // reduce a delayed type to its final value - // dereference variables and solve equations - function reduce($var) { - // this is done here for infinite loop checking - if ($var[0] == "variable") { - $key = is_array($var[1]) ? - $this->vPrefix.$this->toName($this->reduce($var[1])) : $var[1]; - - $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; - } - - while (in_array($var[0], self::$dtypes)) { - if ($var[0] == 'list') { - foreach ($var[2] as &$value) $value = $this->reduce($value); - break; - } elseif ($var[0] == 'expression') { - $var = $this->evaluate($var[1], $var[2], $var[3]); - } elseif ($var[0] == 'lookup') { - // do accessor here.... - $var = array('number', 0); - } elseif ($var[0] == 'function') { - $color = $this->funcToColor($var); - if ($color) $var = $color; - else { - list($_, $name, $args) = $var; - if ($name == "%") $name = "_sprintf"; - $f = isset($this->libFunctions[$name]) ? - $this->libFunctions[$name] : array($this, 'lib_'.$name); - - if (is_callable($f)) { - if ($args[0] == 'list') - $args = self::compressList($args[2], $args[1]); - - $var = call_user_func($f, $this->reduce($args), $this); - - // convert to a typed value if the result is a php primitive - if (is_numeric($var)) $var = array('number', $var); - elseif (!is_array($var)) $var = array('keyword', $var); - } else { - // plain function, reduce args - $var[2] = $this->reduce($var[2]); - } - } - break; // done reducing after a function - } elseif ($var[0] == 'negative') { - $value = $this->reduce($var[1]); - if (is_numeric($value[1])) { - $value[1] = -1*$value[1]; - } - $var = $value; - } - } - - return $var; - } - - function coerceColor($value) { - switch($value[0]) { - case 'color': return $value; - case 'keyword': - $name = $value[1]; - if (isset(self::$cssColors[$name])) { - list($r, $g, $b) = explode(',', self::$cssColors[$name]); - return array('color', $r, $g, $b); - } - return null; - } - } - - function toBool($a) { - if ($a) return self::$TRUE; - else return self::$FALSE; - } - - // evaluate an expression - function evaluate($op, $left, $right) { - $left = $this->reduce($left); - $right = $this->reduce($right); - - if ($left_color = $this->coerceColor($left)) { - $left = $left_color; - } - - if ($right_color = $this->coerceColor($right)) { - $right = $right_color; - } - - if ($op == "and") { - return $this->toBool($left == self::$TRUE && $right == self::$TRUE); - } - - if ($op == "=") { - return $this->toBool($this->eq($left, $right) ); - } - - if ($left[0] == 'color' && $right[0] == 'color') { - $out = $this->op_color_color($op, $left, $right); - return $out; - } - - if ($left[0] == 'color') { - return $this->op_color_number($op, $left, $right); - } - - if ($right[0] == 'color') { - return $this->op_number_color($op, $left, $right); - } - - // concatenate strings - if ($op == '+' && $left[0] == 'string') { - $append = $this->compileValue($right); - if ($this->quoted($append)) $append = substr($append, 1, -1); - - $lhs = $this->compileValue($left); - if ($q = $this->quoted($lhs)) $lhs = substr($lhs, 1, -1); - if (!$q) $q = ''; - - return array('string', $q.$lhs.$append.$q); - } - - if ($left[0] == 'keyword' || $right[0] == 'keyword' || - $left[0] == 'string' || $right[0] == 'string') - { - // look for negative op - if ($op == '-') $right[1] = '-'.$right[1]; - return array('keyword', $this->compileValue($left) .' '. $this->compileValue($right)); - } - - // default to number operation - return $this->op_number_number($op, $left, $right); - } - - // make sure a color's components don't go out of bounds - 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; - } - - function op_number_color($op, $lft, $rgt) { - if ($op == '+' || $op = '*') { - return $this->op_color_number($op, $rgt, $lft); - } - } - - 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])); - } - - 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); - } - - // operator on two numbers - function op_number_number($op, $left, $right) { - $type = is_null($left) ? "number" : $left[0]; - if ($type == "number") $type = $right[0]; - - $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($type, $value); - } - - - /* environment functions */ - - // used for compiliation variable state - function pushEnv() { - $e = new stdclass; - $e->parent = $this->env; - - $this->store = array(); - - $this->env = $e; - return $e; - } - - // pop something off the stack - function pop() { - $old = $this->env; - $this->env = $this->env->parent; - return $old; - } - - // set something in the current env - function set($name, $value) { - $this->env->store[$name] = $value; - } - - - // get the highest occurrence entry for a name - function get($name) { - $current = $this->env; - - $is_arguments = $name == $this->vPrefix . 'arguments'; - while ($current) { - if ($is_arguments && isset($current->arguments)) { - return array('list', ' ', $current->arguments); - } - - if (isset($current->store[$name])) - return $current->store[$name]; - else - $current = $current->parent; - } - - return null; - } - - // create a child parser (for compiling an import) - protected function createChild($fname) { - $less = new lessc($fname); - $less->importDir = array_merge((array)$less->importDir, (array)$this->importDir); - $less->formatter = $this->formatter; - $less->compat = $this->compat; - return $less; - } - - // 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 => $str_value) { - if ($name{0} != '@') $name = '@'.$name; - $parser->count = 0; - $parser->buffer = (string)$str_value; - if (!$parser->propertyValue($value)) { - throw new Exception("failed to parse passed in variable $name: $str_value"); - } - - $this->set($name, $value); - } - } - - // parse and compile buffer - function parse($str = null, $initialVariables = null) { - if (is_array($str)) { - $initialVariables = $str; - $str = null; - } - - $locale = setlocale(LC_NUMERIC, 0); - setlocale(LC_NUMERIC, "C"); - - $name = null; - if (is_null($str)) { - if (empty($this->fileName)) - throw new exception("nothing to parse"); - - $name = $this->fileName; - $str = file_get_contents($this->fileName); - } - - $this->parser = new lessc_parser($this, $name); - $root = $this->parser->parse($str); - - $this->formatter = $this->newFormatter(); - - if ($initialVariables) $this->injectVariables($initialVariables); - $this->indentLevel = -1; - $out = $this->compileBlock($root); - setlocale(LC_NUMERIC, $locale); - return $out; - } - - function setFormatter($name) { - $this->formatterName = $name; - } - - function newFormatter() { - $className = "lessc_formatter"; - if (!empty($this->formatterName)) { - if (!is_string($this->formatterName)) - return $this->formatterName; - $className = "lessc_formatter_$this->formatterName"; - } - - return new $className; - } - - /** - * Uses the current value of $this->count to show line and line number - */ - function throwError($msg = null) { - if ($this->sourceLoc >= 0) { - $this->sourceParser->throwError($msg, $this->sourceLoc); - } - throw new exception($msg); - } - - /** - * Initialize any static state, can initialize parser for a file - * $opts isn't used yet - */ - function __construct($fname = null, $opts = null) { - if ($fname) { - if (!is_file($fname)) { - throw new Exception('load error: failed to find '.$fname); - } - $pi = pathinfo($fname); - - $this->fileName = $fname; - $this->importDir = $pi['dirname'].'/'; - $this->addParsedFile($fname); - } - } - - public function registerFunction($name, $func) { - $this->libFunctions[$name] = $func; - } - - public function unregisterFunction($name) { - unset($this->libFunctions[$name]); - } - - public function allParsedFiles() { return $this->allParsedFiles; } - protected function addParsedFile($file) { - $this->allParsedFiles[realpath($file)] = filemtime($file); - } - - - // 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) { - if (!is_file($out) || filemtime($in) > filemtime($out)) { - $less = new lessc($in); - file_put_contents($out, $less->parse()); - 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 static function cexecute($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. - $less = new lessc($root); - $out = array(); - $out['root'] = $root; - $out['compiled'] = $less->parse(); - $out['files'] = $less->allParsedFiles(); - $out['updated'] = time(); - return $out; - } else { - // No changes, pass back the structure - // we were given initially. - return $in; - } - - } - - 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', - '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, - ); - - // 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'); - - /** - * @link http://www.w3.org/TR/css3-values/ - */ - static protected $units = array( - 'em', 'ex', 'px', 'gd', 'rem', 'vw', 'vh', 'vm', 'ch', // Relative length units - 'in', 'cm', 'mm', 'pt', 'pc', // Absolute length units - '%', // Percentages - 'deg', 'grad', 'rad', 'turn', // Angles - 'ms', 's', // Times - 'Hz', 'kHz', //Frequencies - ); - - /** - * 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; - - function __construct($lessc, $sourceName = null) { - // reference to less needed for vPrefix, mPrefix, and parentSelector - $this->lessc = $lessc; - - $this->sourceName = $sourceName; // name used for error messages - - if (!self::$operatorString) { - self::$operatorString = - '('.implode('|', array_map(array('lessc', 'preg_quote'), - array_keys(self::$precedence))).')'; - } - } - - function parse($buffer) { - $this->count = 0; - $this->line = 1; - - $this->env = null; // block stack - $this->buffer = $this->removeComments($buffer); - $this->pushBlock(null); // root - - // trim whitespace on head - if (preg_match('/^\s+/', $this->buffer, $m)) { - $this->line += substr_count($m[0], "\n"); - $this->buffer = ltrim($this->buffer); - } - - // parse the entire file - $lastCount = $this->count; - while (false !== $this->parseChunk()); - - if ($this->count != strlen($this->buffer)) - $this->throwError(); - - // TODO report where the block was opened - if (!is_null($this->env->parent)) - throw new exception('parse error: unclosed block'); - - $this->env->isRoot = true; - 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(); - - // 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->env->parent == null && $this->literal('@', false)) { - $this->count--; - - // a font-face block - if ($this->literal('@font-face') && $this->literal('{')) { - $b = $this->pushSpecialBlock('@font-face'); - return true; - } else { - $this->seek($s); - } - - // charset - if ($this->literal('@charset') && $this->propertyValue($value) && - $this->end()) - { - $this->append(array('charset', $value), $s); - return true; - } else { - $this->seek($s); - } - - - // media - if ($this->literal('@media') && $this->mediaTypes($types) && - $this->literal('{')) - { - $b = $this->pushSpecialBlock('@media'); - $b->media = $types; - return true; - } else { - $this->seek($s); - } - - // css animations - if ($this->match('(@(-[a-z]+-)?keyframes)', $m) && - $this->propertyValue($value) && $this->literal('{')) - { - $b = $this->pushSpecialBlock(trim($m[0])); - $b->keyframes = $value; - return true; - } else { - $this->seek($s); - } - - if ($this->literal("@page") && - ($this->match('(:(left|right))', $m) || true) && - $this->literal("{")) - { - $name = "@page"; - if ($m) $name = $name . " " . $m[1]; - $this->pushSpecialBlock($name); - return true; - } else { - $this->seek($s); - } - } - - if (isset($this->env->keyframes)) { - if ($this->keyframeTags($ktags) && $this->literal('{')) { - $this->pushSpecialBlock($ktags); - return true; - } else { - $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($url, $media)) { - $this->append(array('import', $url, $media), $s); - return true; - - // don't check .css files - if (empty($media) && substr_compare($url, '.css', -4, 4) !== 0) { - if ($this->importDisabled) { - $this->append(array('raw', '/* import disabled */')); - } else { - $path = $this->findImport($url); - if (!is_null($path)) { - $this->append(array('import', $path), $s); - return true; - } - } - } - - $this->append(array('raw', '@import url("'.$url.'")'. - ($media ? ' '.$media : '').';'), $s); - return true; - } - - // opening parametric mixin - if ($this->tag($tag, true) && $this->argumentDef($args, $is_vararg) && - ($this->guards($guards) || true) && - $this->literal('{')) - { - $block = $this->pushBlock($this->fixTags(array($tag))); - $block->args = $args; - $block->is_vararg = $is_vararg; - if (!empty($guards)) $block->guards = $guards; - return true; - } else { - $this->seek($s); - } - - // opening a simple block - if ($this->tags($tags) && $this->literal('{')) { - $tags = $this->fixTags($tags); - $this->pushBlock($tags); - return true; - } else { - $this->seek($s); - } - - // closing a block - if ($this->literal('}')) { - try { - $block = $this->pop(); - } catch (exception $e) { - $this->seek($s); - $this->throwError($e->getMessage()); - } - - $hidden = true; - if (!isset($block->args)) foreach ($block->tags as $tag) { - if (!is_string($tag) || $tag{0} != $this->lessc->mPrefix) { - $hidden = false; - break; - } - } - - if (!$hidden) $this->append(array('block', $block), $s); - - foreach ($block->tags as $tag) { - if (is_string($tag)) { - $this->env->children[$tag][] = $block; - } - } - - return true; - } - - // mixin - if ($this->mixinTags($tags) && - ($this->argumentValues($argv) || 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 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; - } - - protected function keyframeTags(&$tags) { - $s = $this->seek(); - $tags = array(); - while($this->match("(to|from|[0-9]+%)", $m)) { - $tags[] = $m[1]; - if (!$this->literal(",")) break; - } - - if (count($tags) == 0) { - $this->seek($s); - return false; - } - - return true; - } - - // 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) { - $s = $this->seek(); - if ($this->literal('(') && ($this->inParens = true) && $this->expression($exp) && $this->literal(')')) { - $lhs = $exp; - } elseif ($this->seek($s) && $this->value($val)) { - $lhs = $val; - } else { - $this->inParens = false; - $this->seek($s); - return false; - } - - $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); - } - } - - $this->inParens = false; - return true; - } - - /** - * recursively parse infix equation with $lhs at precedence $minP - */ - protected function expHelper($lhs, $minP) { - $this->inExp = true; - $ss = $this->seek(); - - // if there was whitespace before the operator, then we require whitespace after - // the operator for it to be a mathematical operator. - - $needWhite = false; - if (!$this->inParens && preg_match('/\s/', $this->buffer{$this->count - 1})) { - $needWhite = true; - } - - // try to find a valid operator - while ($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; - } - } - } - - // get rhs - $s = $this->seek(); - $p = $this->inParens; - if ($this->literal('(') && ($this->inParens = true) && $this->expression($exp) && $this->literal(')')) { - $this->inParens = $p; - $rhs = $exp; - } else { - $this->inParens = $p; - if ($this->seek($s) && $this->value($val)) { - $rhs = $val; - } else { - 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); - $ss = $this->seek(); - - $needWhite = false; - if (!$this->inParens && preg_match('/\s/', $this->buffer{$this->count - 1})) { - $needWhite = true; - } - } - $this->seek($ss); - - return $lhs; - } - - // consume a list of values for a property - public function propertyValue(&$value, $keyName=null) { - $values = array(); - - if (!is_null($keyName)) $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 (!is_null($keyName)) unset($this->env->currentProperty); - - if (count($values) == 0) return false; - - $value = lessc::compressList($values, ', '); - return true; - } - - // a single value - protected function value(&$value) { - // try a unit - if ($this->unit($value)) return true; - - // see if there is a negation - $s = $this->seek(); - if ($this->literal('-', false)) { - $value = null; - if ($this->variable($var)) { - $value = array('variable', $var); - } elseif ($this->buffer{$this->count} == "(" && $this->expression($exp)) { - $value = $exp; - } else { - $this->seek($s); - } - - if (!is_null($value)) { - $value = array('negative', $value); - return true; - } - } else { - $this->seek($s); - } - - // accessor - // must be done before color - // this needs negation too - if ($this->accessor($a)) { - $a[1] = $this->fixTags($a[1]); - $value = $a; - return true; - } - - // color - if ($this->color($value)) return true; - - // css function - // must be done after color - if ($this->func($value)) return true; - - // string - if ($this->string($tmp, $d)) { - $value = array('string', $d.$tmp.$d); - return true; - } - - // try a keyword - 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 - if ($this->literal("~") && $this->string($value, $d)) { - $value = array("escape", $value); - 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(&$url, &$media) { - $s = $this->seek(); - if (!$this->literal('@import')) return false; - - // @import "something.css" media; - // @import url("something.css") media; - // @import url(something.css) media; - - if ($this->literal('url(')) $parens = true; else $parens = false; - - if (!$this->string($url)) { - if ($parens && $this->to(')', $url)) { - $parens = false; // got em - } else { - $this->seek($s); - return false; - } - } - - if ($parens && !$this->literal(')')) { - $this->seek($s); - return false; - } - - // now the rest is media - return $this->to(';', $media, false, true); - } - - // a list of media types, very lenient - protected function mediaTypes(&$parts) { - $parts = array(); - while ($this->to("(", $chunk, false, "[^{]")) { - $parts[] = array('raw', $chunk."("); - $s = $this->seek(); - if ($this->keyword($name) && $this->assign() && - $this->propertyValue($value)) - { - $parts[] = array('assign', $name, $value); - } else { - $this->seek($s); - } - } - - if ($this->to('{', $rest, true, true)) { - $parts[] = array('raw', $rest); - return true; - } - - $parts = null; - return false; - } - - // a scoped value accessor - // .hello > @scope1 > @scope2['value']; - protected function accessor(&$var) { - $s = $this->seek(); - - if (!$this->tags($scope, true, '>') || !$this->literal('[')) { - $this->seek($s); - return false; - } - - // either it is a variable or a property - // why is a property wrapped in quotes, who knows! - if ($this->variable($name)) { - // ~ - } elseif ($this->literal("'") && $this->keyword($name) && $this->literal("'")) { - // .. $this->count is messed up if we wanted to test another access type - } else { - $this->seek($s); - return false; - } - - if (!$this->literal(']')) { - $this->seek($s); - return false; - } - - $var = array('lookup', $scope, $name); - return true; - } - - // a string - protected function string(&$string, &$d = null) { - $s = $this->seek(); - if ($this->literal('"', false)) { - $delim = '"'; - } elseif ($this->literal("'", false)) { - $delim = "'"; - } else { - return false; - } - - if (!$this->to($delim, $string)) { - $this->seek($s); - return false; - } - - $d = $delim; - return true; - } - - /** - * Consume a number and optionally a unit. - * Can also consume a font shorthand if it is a simple case. - * $allowed restricts the types that are matched. - */ - protected function unit(&$unit, $allowed = null) { - if (!$allowed) $allowed = self::$units; - - if ($this->match('(-?[0-9]*(\.)?[0-9]+)('.implode('|', $allowed).')?', $m)) { - if (!isset($m[3])) $m[3] = 'number'; - $unit = array($m[3], $m[1]); - - return true; - } - - return false; - } - - // a # color - protected function color(&$out) { - $color = array('color'); - - if ($this->match('(#([0-9a-f]{6})|#([0-9a-f]{3}))', $m)) { - if (isset($m[3])) { - $num = $m[3]; - $width = 16; - } else { - $num = $m[2]; - $width = 256; - } - - $num = hexdec($num); - foreach (array(3,2,1) as $i) { - $t = $num % $width; - $num /= $width; - - $color[$i] = $t * (256/$width) + $t * floor(16/$width); - } - - $out = $color; - return true; - } - - return false; - } - - // consume a list of property values delimited by ; and wrapped in () - protected function argumentValues(&$args, $delim = ',') { - $s = $this->seek(); - if (!$this->literal('(')) return false; - - $values = array(); - while (true) { - if ($this->expressionList($value)) $values[] = $value; - if (!$this->literal($delim)) break; - else { - if ($value == null) $values[] = null; - $value = null; - } - } - - if (!$this->literal(')')) { - $this->seek($s); - return false; - } - - $args = $values; - return true; - } - - // 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 ... - protected function argumentDef(&$args, &$is_vararg, $delim = ',') { - $s = $this->seek(); - if (!$this->literal('(')) return false; - - $values = array(); - - $is_vararg = false; - while (true) { - if ($this->literal("...")) { - $is_vararg = true; - break; - } - - if ($this->variable($vname)) { - $arg = array("arg", $vname); - $ss = $this->seek(); - if ($this->assign() && $this->expressionList($value)) { - $arg[] = $value; - } else { - $this->seek($ss); - if ($this->literal("...")) { - $arg[0] = "rest"; - $is_vararg = true; - } - } - $values[] = $arg; - if ($is_vararg) break; - continue; - } - - if ($this->value($literal)) { - $values[] = array("lit", $literal); - } - - if (!$this->literal($delim)) 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 >) - function mixinTags(&$tags) { - $s = $this->seek(); - $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(&$value) { - $s = $this->seek(); - if ($this->literal('[') && $this->to(']', $c, true) && $this->literal(']', false)) { - $value = '['.$c.']'; - // whitespace? - if ($this->match('', $_)) $value .= $_[0]; - - // escape parent selector, (yuck) - $value = str_replace($this->lessc->parentSelector, "$&$", $value); - return true; - } - - $this->seek($s); - return false; - } - - protected function tagExpression(&$value) { - $s = $this->seek(); - if ($this->literal("(") && $this->expression($exp) && $this->literal(")")) { - $value = array('exp', $exp); - return true; - } - - $this->seek($s); - return false; - } - - // a single tag - protected function tag(&$tag, $simple = false) { - if ($simple) - $chars = '^,:;{}\][>\(\) "\''; - else - $chars = '^,;{}["\''; - - if (!$simple && $this->tagExpression($tag)) { - return true; - } - - $tag = ''; - while ($this->tagBracket($first)) $tag .= $first; - while ($this->match('(['.$chars.'0-9]['.$chars.']*)', $m)) { - $tag .= $m[1]; - if ($simple) break; - - while ($this->tagBracket($brack)) $tag .= $brack; - } - $tag = trim($tag); - if ($tag == '') return false; - - return true; - } - - // a css function - protected function func(&$func) { - $s = $this->seek(); - - if ($this->match('(%|[\w\-_][\w\-_:\.]+|[\w_])', $m) && $this->literal('(')) { - $fname = $m[1]; - - $s_pre_args = $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('list', '=', array(array('keyword', $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($s_pre_args); - if ($this->to(')', $content, true) && $this->literal(')')) { - $func = array('function', $fname,array('string', $content)); - 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(';')) - 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->guard_group($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 guard_group(&$guard_group) { - $s = $this->seek(); - $guard_group = array(); - while ($this->guard($guard)) { - $guard_group[] = $guard; - if (!$this->literal("and")) break; - } - - if (count($guard_group) == 0) { - $guard_group = 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 = true) { - // this is here mainly prevent notice from { } string accessor - if ($this->count >= strlen($this->buffer)) return false; - - // shortcut on single letter - if (!$eatWhitespace && strlen($what) == 1) { - if ($this->buffer{$this->count} == $what) { - $this->count++; - return true; - } - else return false; - } - - return $this->match(lessc::preg_quote($what), $m, $eatWhitespace); - } - - - // 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 = 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; - } - - // 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($tags) { - $b = new stdclass; - $b->parent = $this->env; - - $b->id = self::$nextBlockId++; - $b->is_vararg = false; - $b->tags = $tags; - $b->props = array(); - $b->children = array(); - - $this->env = $b; - return $b; - } - - // push a block that doesn't multiply tags - protected function pushSpecialBlock($name) { - $b = $this->pushBlock(array($name)); - $b->no_multiply = true; - return $b; - } - - // append a property to the current block - function append($prop, $pos = null) { - if (!is_null($pos)) $prop[-1] = $pos; - $this->env->props[] = $prop; - } - - // pop something off the stack - 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; - $done = false; - 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].'.*?'.$min[0].'/', $text, $m, 0, $count)) - $count += strlen($m[0]) - 1; - break; - case '//': - $skip = strpos($text, "\n", $count); - if ($skip === false) $skip = strlen($text) - $count; - else $skip -= $count; - break; - case '/*': - if (preg_match('/\/\*.*?\*\//s', $text, $m, 0, $count)) { - $skip = strlen($m[0]); - $newlines = substr_count($m[0], "\n"); - } - break; - } - - if ($skip == 0) $count += strlen($min[0]); - - $out .= substr($text, 0, $count).str_repeat("\n", $newlines); - $text = substr($text, $count + $skip); - - $min = null; - } - - return $out.$text; - } - -} - -class lessc_formatter { - public $indentChar = " "; - - public $break = "\n"; - public $open = " {"; - public $close = "}"; - public $tagSeparator = ", "; - - public $disableSingle = false; - public $openSingle = " { "; - public $closeSingle = " }"; - - // returns the amount of indent that should happen for a block - function indentAmount($block) { - return isset($block->isRoot) || !empty($block->no_multiply) ? 1 : 0; - } - - // an $indentLevel of -1 signifies the root level - function block($tags, $wrapChildren, $lines, $children, $indentLevel) { - $indent = str_repeat($this->indentChar, max($indentLevel, 0)); - - // what $lines is imploded by - $nl = $indentLevel == -1 ? $this->break : - $this->break.$indent.$this->indentChar; - - ob_start(); - - $isSingle = !$this->disableSingle && !$wrapChildren - && count($lines) <= 1; - - $showDelim = !empty($tags) && (count($lines) > 0 || $wrapChildren); - - if ($showDelim) { - if (is_array($tags)) { - $tags = implode($this->tagSeparator, $tags); - } - - echo $indent.$tags; - if ($isSingle) echo $this->openSingle; - else { - echo $this->open; - if (!empty($lines)) echo $nl; - else echo $this->break; - } - } - - echo implode($nl, $lines); - - if ($wrapChildren) { - if (!empty($lines)) echo $this->break; - foreach ($children as $child) echo $child; - } - - if ($showDelim) { - if ($isSingle) echo $this->closeSingle; - else { - if (!$wrapChildren) echo $this->break; - echo $indent.$this->close; - } - echo $this->break; - } elseif (!empty($lines)) { - echo $this->break; - } - - if (!$wrapChildren) - foreach ($children as $child) echo $child; - - return ob_get_clean(); - } - - function property($name, $values) { - return ""; - } -} - -class lessc_formatter_compressed extends lessc_formatter { - public $indentChar = ""; - - public $break = ""; - public $open = "{"; - public $close = "}"; - public $tagSeparator = ","; - public $disableSingle = true; -} - -class lessc_formatter_indent extends lessc_formatter { - function indentAmount($block) { - if (isset($block->isRoot)) return 1; - $numLines = 0; - foreach ($block->props as $prop) { - $t = $prop[0]; - if ($t != 'block' && $t != 'mixin') { - $numLines++; - } - } - return $numLines > 0 ? 1 : 0; - } -} - diff --git a/vendors/lessphp/lessify b/vendors/lessphp/lessify deleted file mode 100755 index 416f0ca4c..000000000 --- a/vendors/lessphp/lessify +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/php -q -<?php - -if (php_sapi_name() != "cli") { - err($fa.$argv[0]." must be run in the command line."); - exit(1); -} -$exe = array_shift($argv); // remove filename - -if (!$fname = array_shift($argv)) { - exit("Usage: ".$exe." input-file\n"); -} - -require "lessify.inc.php"; - -try { - $parser = new lessify($fname); - echo $parser->parse(); -} catch (exception $e) { - exit("Fatal error: ".$e->getMessage()."\n"); -} - - diff --git a/vendors/lessphp/lessify.inc.php b/vendors/lessphp/lessify.inc.php deleted file mode 100644 index 96d7d2a92..000000000 --- a/vendors/lessphp/lessify.inc.php +++ /dev/null @@ -1,447 +0,0 @@ -<?php -/** - * lessify - * Convert a css file into a less file - * http://leafo.net/lessphp - * Copyright 2010, leaf corcoran <leafot@gmail.com> - * - * 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/vendors/lessphp/package.sh b/vendors/lessphp/package.sh deleted file mode 100755 index 1c871a147..000000000 --- a/vendors/lessphp/package.sh +++ /dev/null @@ -1,22 +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 - diff --git a/vendors/lessphp/plessc b/vendors/lessphp/plessc deleted file mode 100755 index af07293e1..000000000 --- a/vendors/lessphp/plessc +++ /dev/null @@ -1,217 +0,0 @@ -#!/usr/bin/php -q -<?php -// Command line utility to compile LESS to STDOUT -// Leaf Corcoran <leafot@gmail.com>, 2012 - -$exe = array_shift($argv); // remove filename - -$HELP = <<<EOT -Usage: $exe [options] input-file [output-file] - -Options include: - - -h, --help Show this message - -v Print the version - -f=format Set the output format, includes "default", "compressed" - -r Read from STDIN instead of input-file - -w Watch input-file, and compile to output-file if it is changed - -T Dump formatted parse tree - -X Dump raw parse tree - - -EOT; - -$opts = getopt('hvrwnXTf:', array('help')); -while (count($argv) > 0 && preg_match('/^-([-hvrwnXT]$|[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); - } - - 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 - } -} - -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/vendors/lessphp/tests/README.md b/vendors/lessphp/tests/README.md deleted file mode 100644 index edb8f7be3..000000000 --- a/vendors/lessphp/tests/README.md +++ /dev/null @@ -1,24 +0,0 @@ -## test.php - -To run: - - php test.php [flags] [test-name-glob] - - -Runs through all files in `inputs`, compiles them, then compares to respective -file in `outputs`. If there are any differences then the test will fail. - -Add the `-d` flag to show the differences of failed tests. Defaults to showing -differences with `diff` but you can set the tool by doing `-d=toolname`. - -Pass the `-C` flag to save the output of the inputs to the appropriate file. This -will overwrite any existing outputs. Use this when you want to save verified -test results. Combine with a *test-name-glob* to selectively compile. - -You can also run specific tests by passing in an argument that contains any -part of the test name. - -## bootstrap.sh - -It's a syntetic test comparing lessc and lessphp output compiling twitter bootstrap; -see bootstrap.sh for details.
\ No newline at end of file diff --git a/vendors/lessphp/tests/bootstrap.sh b/vendors/lessphp/tests/bootstrap.sh deleted file mode 100755 index b49f7cec3..000000000 --- a/vendors/lessphp/tests/bootstrap.sh +++ /dev/null @@ -1,49 +0,0 @@ -echo "This script clones twitter bootsrap, compiles it with lessc and lessphp," -echo "cleans up results with csstidy, and outputs diff. To run it, you need to" -echo "have git, csstidy and lessc installed." -echo "" - -csstidy_params="--allow_html_in_templates=false --compress_colors=false ---compress_font-weight=false --discard_invalid_properties=false ---lowercase_s=false --preserve_css=true --remove_bslash=false ---remove_last_;=false --sort-properties=true --sort-selectors=true ---timestamp=false --silent=true --merge_selectors=0 --case-properties=0 ---optimize-shorthands=0 --template=high" - -if [ -z "$@" ]; then - diff_tool="diff -b -u -t -B" -else - diff_tool=$@ -fi - -mkdir -p tmp - -if [ ! -d 'bootstrap/' ]; then - echo ">> Cloning bootstrap to bootstrap/" - git clone https://github.com/twitter/bootstrap -fi - -echo ">> Lessc compilation" -lessc bootstrap/less/bootstrap.less tmp/bootstrap.lessc.css - -echo ">> Lessphp compilation" -../plessc bootstrap/less/bootstrap.less tmp/bootstrap.lessphp.css -echo ">> Cleanup and convert" - -# csstidy tmp/bootstrap.lessc.css $csstidy_params tmp/bootstrap.lessc.clean.css -# csstidy tmp/bootstrap.lessphp.css $csstidy_params tmp/bootstrap.lessphp.clean.css -# -# # put a newline after { and : -# function split() { -# sed 's/\(;\|{\)/\1\n/g' -# } -# -# # csstidy is messed up and wont output to stdout when there are a bunch of options -# cat tmp/bootstrap.lessc.clean.css | split | tee tmp/bootstrap.lessc.clean.css -# cat tmp/bootstrap.lessphp.clean.css | split | tee tmp/bootstrap.lessphp.clean.css - -php sort.php tmp/bootstrap.lessc.css > tmp/bootstrap.lessc.clean.css -php sort.php tmp/bootstrap.lessphp.css > tmp/bootstrap.lessphp.clean.css - -echo ">> Doing diff" -$diff_tool tmp/bootstrap.lessc.clean.css tmp/bootstrap.lessphp.clean.css diff --git a/vendors/lessphp/tests/inputs/accessors.less.disable b/vendors/lessphp/tests/inputs/accessors.less.disable deleted file mode 100644 index 37f5c8e8b..000000000 --- a/vendors/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/vendors/lessphp/tests/inputs/arity.less b/vendors/lessphp/tests/inputs/arity.less deleted file mode 100644 index a3adad612..000000000 --- a/vendors/lessphp/tests/inputs/arity.less +++ /dev/null @@ -1,77 +0,0 @@ - -// simple arity - -.hello(@a) { - color: one; -} - -.hello(@a, @b) { - color: two; -} - -.hello(@a, @b, @c) { - color: three; -} - - -.world(@a, @b, @c) { - color: three; -} - -.world(@a, @b) { - color: two; -} - -.world(@a) { - color: one; -} - -.one { - .hello(1); - .world(1); -} - -.two { - .hello(1, 1); - .world(1, 1); -} - -.three { - .hello(1, 1, 1); - .world(1, 1, 1); -} - - -// arity with default values - -.foo(@a, @b: cool) { - color: two; -} - -.foo(@a, @b: cool, @c: yeah) { - color: three; -} - - -.baz(@a, @b, @c: yeah) { - color: three; -} - -.baz(@a, @b: cool) { - color: two; -} - - -.multi-foo { - .foo(1); - .foo(1, 1); - .foo(1,1,1); -} - -.multi-baz { - .baz(1); - .baz(1, 1); - .baz(1,1,1); -} - - diff --git a/vendors/lessphp/tests/inputs/attributes.less b/vendors/lessphp/tests/inputs/attributes.less deleted file mode 100644 index 7ede4fc4e..000000000 --- a/vendors/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/vendors/lessphp/tests/inputs/builtins.less b/vendors/lessphp/tests/inputs/builtins.less deleted file mode 100644 index ae2c4ef6e..000000000 --- a/vendors/lessphp/tests/inputs/builtins.less +++ /dev/null @@ -1,36 +0,0 @@ -// builtin - -@something: "hello world"; -@color: #112233; -@color2: rgba(44,55,66, .6); - -body { - color: @something; - - @num: 7 / 6; - height: @num + 4; - height: floor(@num) + 4px; - height: ceil(@num) + 4px; - - @num2: 2 / 3; - width: @num2; - width: round(@num2); - width: floor(@num2); - width: ceil(@num2); - width: round(10px / 3); - - color: rgbahex(@color); - color: rgbahex(@color2); -} - - -format { - @r: 32; - format: %("rgb(%d, %d, %d)", @r, 128, 64); - format-string: %("hello %s", "world"); - format-multiple: %("hello %s %d", "earth", 2); - format-url-encode: %('red is %A', #ff0000); - eformat: e(%("rgb(%d, %d, %d)", @r, 128, 64)); -} - - diff --git a/vendors/lessphp/tests/inputs/colors.less b/vendors/lessphp/tests/inputs/colors.less deleted file mode 100644 index d407a74f3..000000000 --- a/vendors/lessphp/tests/inputs/colors.less +++ /dev/null @@ -1,122 +0,0 @@ - -body { - color: hsl(34, 50%, 40%); - color: hsla(34, 50%, 40%, 0.3); - - lighten: lighten(#efefef, 10%); - lighten: lighten(rgb(23, 53, 231), 22%); - lighten: lighten(rgba(212, 103, 88, 0.5), 10%); - - darken: darken(#efefef, 10%); - darken: darken(rgb(23, 53, 231), 22%); - darken: darken(rgba(23, 53, 231, 0.5), 10%); - - saturate: saturate(#efefef, 10%); - saturate: saturate(rgb(23, 53, 231), 22%); - saturate: saturate(rgba(23, 53, 231, 0.5), 10%); - - desaturate: desaturate(#efefef, 10%); - desaturate: desaturate(rgb(23, 53, 231), 22%); - desaturate: desaturate(rgba(23, 53, 231, 0.5), 10%); - - spin: spin(#efefef, 12); - spin: spin(rgb(23, 53, 231), 15); - spin: spin(rgba(23, 53, 231, 0.5), 19); - - spin: spin(#efefef, -12); - spin: spin(rgb(23, 53, 231), -15); - spin: spin(rgba(23, 53, 231, 0.5), -19); - - one: fadein(#abcdef, 10%); - one: fadeout(#abcdef, -10%); - - two: fadeout(#029f23, 10%); - two: fadein(#029f23, -10%); - - - three: fadein(rgba(1,2,3, 0.5), 10%); - three: fadeout(rgba(1,2,3, 0.5), -10%); - - four: fadeout(rgba(1,2,3, 0), 10%); - four: fadein(rgba(1,2,3, 0), -10%); - - hue: hue(rgb(34,20,40)); - sat: saturation(rgb(34,20,40)); - lit: lightness(rgb(34,20,40)); - - @old: #34fa03; - @new: hsl(hue(@old), 45%, 90%); - what: @new; - - zero: saturate(#123456, -100%); - zero: saturate(#123456, 100%); - zero: saturate(#000000, 100%); - zero: saturate(#ffffff, 100%); - - zero: lighten(#123456, -100%); - zero: lighten(#123456, 100%); - zero: lighten(#000000, 100%); - zero: lighten(#ffffff, 100%); - - zero: spin(#123456, -100); - zero: spin(#123456, 100); - zero: spin(#000000, 100); - zero: spin(#ffffff, 100); -} - - -alpha { - // g: alpha(red); - g: alpha(rgba(0,0,0,0)); - g: alpha(rgb(155,55,0)); -} - -fade { - f: fade(red, 50%); - f: fade(#fff, 20%); - f: fade(rgba(34,23,64,0.4), 50%); -} - -@a: rgb(255,255,255); -@b: rgb(0,0,0); - -.mix { - color: mix(@a, @b, 50%); -} - -.percent { - per: percentage(0.5); -} - -// color keywords - -.colorz { - color: whitesmoke - 10; - color: spin(red, 34); -} - - - -// purposfuly whacky to match less.js - -@color: #fcf8e3; - -body { - start: @color; - spin: spin(@color, -10); // #fcf4e3 - chained: darken(spin(@color, -10), 3%); // gives #fbeed5, should be #fbefd5 - direct: darken(#fcf4e3, 3%); // #fbefd5 -} - -// spin around -pre { - @errorBackground: #f2dede; - spin: spin(@errorBackground, -10); -} - -dd { - @white: #fff; - background-color: mix(@white, darken(@white, 10%), 60%); -} - - diff --git a/vendors/lessphp/tests/inputs/compile_on_mixin.less b/vendors/lessphp/tests/inputs/compile_on_mixin.less deleted file mode 100644 index 79d628f49..000000000 --- a/vendors/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/vendors/lessphp/tests/inputs/escape.less b/vendors/lessphp/tests/inputs/escape.less deleted file mode 100644 index 02d92d6f0..000000000 --- a/vendors/lessphp/tests/inputs/escape.less +++ /dev/null @@ -1,20 +0,0 @@ - -body { - @hello: "world"; - border: e("this is simple"); - border: e(this is simple); // bug in lessjs - border: e("this is simple", "cool lad"); - border: e(1232); - border: e(@hello); - border: e("one" + 'more'); // no string addition lessjs - border: e(); // syntax error lessjs - - line-height: ~"eating rice"; - line-height: ~"string cheese"; - line-height: a b c ~"string me" d e f; - line-height: ~"string @{hello}"; -} - -.class { - filter: ~"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image.png')"; -} diff --git a/vendors/lessphp/tests/inputs/font_family.less b/vendors/lessphp/tests/inputs/font_family.less deleted file mode 100644 index c7186b57b..000000000 --- a/vendors/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/vendors/lessphp/tests/inputs/guards.less b/vendors/lessphp/tests/inputs/guards.less deleted file mode 100644 index 20bdf240e..000000000 --- a/vendors/lessphp/tests/inputs/guards.less +++ /dev/null @@ -1,88 +0,0 @@ - -.simple(@hi) when (@hi) { - color: yellow; -} - - -.something(@hi) when (@hi = cool) { - color: red; -} - -.another(@x) when (@x > 10) { - color: green; -} - - -.flipped(@x) when (@x =< 10) { - color: teal; -} - -.yeah(@arg) when (isnumber(@arg)) { - color: purple; -} - - -.yeah(@arg) when (ispixel(@arg)) { - color: silver; -} - - -.hello(@arg) when not (@arg) { - color: orange; -} - -dd { - .simple(true); - .simple(2344px); -} - -b { - .something(cool); - .something(birthday); -} - -img { - .another(12); - .another(2); - - .flipped(12); - .flipped(2); -} - -body { - .yeah("world"); - .yeah(232px); - .yeah(232); - - .hello(true); -} - -.something(@x) when (@x) and (@y), not (@x = what) { - color: blue; -} - -div { - @y: true; - .something(true); - -} - -pre { - .something(what); -} - - -.coloras(@g) when (iscolor(@g)) { - color: true @g; -} - -link { - .coloras(red); - .coloras(10px); - .coloras(ffjref); - .coloras(#fff); - .coloras(#fffddd); - .coloras(rgb(0,0,0)); - .coloras(rgba(0,0,0, .34)); -} - diff --git a/vendors/lessphp/tests/inputs/hacks.less b/vendors/lessphp/tests/inputs/hacks.less deleted file mode 100644 index e69b7bf98..000000000 --- a/vendors/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/vendors/lessphp/tests/inputs/import.less b/vendors/lessphp/tests/inputs/import.less deleted file mode 100644 index 250d1a3f3..000000000 --- a/vendors/lessphp/tests/inputs/import.less +++ /dev/null @@ -1,21 +0,0 @@ - -@import 'file1.less'; // file found and imported - -@import "something.css" media; -@import url("something.css") media; -@import url(something.css) media, screen, print; - -@color: maroon; - -@import url(file2); // found and imported - -body { - line-height: 10em; - @colors; -} - -div { - @color: fuchsia; - @import "file2"; -} - diff --git a/vendors/lessphp/tests/inputs/keyframes.less b/vendors/lessphp/tests/inputs/keyframes.less deleted file mode 100644 index e65a38b95..000000000 --- a/vendors/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/vendors/lessphp/tests/inputs/math.less b/vendors/lessphp/tests/inputs/math.less deleted file mode 100644 index 3f4af2c7d..000000000 --- a/vendors/lessphp/tests/inputs/math.less +++ /dev/null @@ -1,116 +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 - - sub: 10-5; - sub: 10 - 5; - - add: 10+5; - add: 10 + 5; - - // div: 10/5; // this wont work, read on - div: 10 / 5; - - mul: 10*5; - mul: 10 * 5; -} - -// these properties have divison not in parenthases -.supress-division { - border-radius: 10px / 10px; - border-radius: 10px/10px; - border-radius: hello (10px/10px) world; - @x: 10px; - font: @x/30 sans-serif; - font: 10px / 20px sans-serif; - font: 10px/20px sans-serif; - border-radius:0 15px 15px 15px / 0 50% 50% 50%; -} - - -.parens { - // if you are unsure, then just wrap the expression in parentheses and it will - // always evaluate. - - // notice we no longer have unary operators, and these will evaluate - sub: (10 -5); - add: (10 +5); - div: (10 /5); - div: (10/5); // no longer interpreted as the shorthand - mul: (10 *5); -} - -.keyword-names { - // watch out when doing math with keywords, - is a valid keyword character - @a: 100; - @b: 25; - @a-: "hello"; - height: @a-@b; // here we get "hello" 25, not 75 -} - - -.negation { - hello: -(1px); - hello: 0-(1px); - - @something: 10; - hello: -@something; -} - - -// and now here are the tests - -.test { - single: (5); - single: 5+(5); - single: (5)+((5)); - - parens: (5 +(5)) -2; - // parens: ((5 +(5)) -2); // FAILS - fixme - - math: (5 + 5)*(2 / 1); - math: (5+5)*(2/1); - - width: 2 * (4 * (2 + (1 + 6))) - 1; - height: ((2+3)*(2+3) / (9-4)) + 1; - padding: (2px + 4px) 1em 2px 2; - - @var: (2 * 2); - padding: (2 * @var) 4 4 (@var * 1px); - width: (@var * @var) * 6; - height: (7 * 7) + (8 * 8); - margin: 4 * (5 + 5) / 2 - (@var * 2); -} - -.percents { - color: 100 * 10%; - color: 10% * 100; - color: 10% * 10%; - - color: 100px * 10%; // lessjs makes this px - color: 10% * 100px; // lessjs makes this % - - color: 20% + 10%; - color: 20% - 10%; - - color: 20% / 10%; -} - -.misc { - x: 10px * 4em; - y: 10 * 4em; - -} - diff --git a/vendors/lessphp/tests/inputs/media.less b/vendors/lessphp/tests/inputs/media.less deleted file mode 100644 index 0e65d942f..000000000 --- a/vendors/lessphp/tests/inputs/media.less +++ /dev/null @@ -1,38 +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; } -} - diff --git a/vendors/lessphp/tests/inputs/misc.less b/vendors/lessphp/tests/inputs/misc.less deleted file mode 100644 index 86bd8f706..000000000 --- a/vendors/lessphp/tests/inputs/misc.less +++ /dev/null @@ -1,84 +0,0 @@ - -@hello: "utf-8"; -@charset @hello; - -@color: #fff; -@base_path: "/assets/images/"; -@images: @base_path + "test/"; -.topbar { background: url(@{images}topbar.png); } -.hello { test: empty-function(@images, 40%, to(@color)); } - -.css3 { - background-image: -webkit-gradient(linear, 0% 0%, 0% 90%, - from(#E9A000), to(#A37000)); -} - - -/** - -Here is a block comment - -**/ - - -// this is a comment - -.test, /*hello*/.world { - border: 1px solid red; // world - /* another property */ - color: url(http://mage-page.com); - string: "hello /* this is not a comment */"; - world: "// neither is this"; - string: 'hello /* this is not a comment */' /*what if this is a comment */; - world: '// neither is this' // hell world; - ; - what-/*something?*/ever: 100px; - background: url(/*no comment here*/); -} - - -.urls { - @var: "http://google.com"; - background: url(@var); - background: url(@{var}); - background: url("@{var}"); -} - -.mix(@arg) { color: @arg; } -@aaa: aaa; -@bbb: bbb; -// make sure the opening selector isn't too greedy -.cool {.mix("@{aaa}, @{bbb}")} -.cool(); - -.cool("{hello"); -.cool('{hello'); - - -// merging of mixins -.span-17 { float: left; } -.span-17 { width: 660px; } - -.x {.span-17;} - -.hi { - pre { - color: red; - } -} - -.hi { - pre { - color: blue; - } -} - -.rad { - .hi; -} - - -@page :left { margin-left: 4cm; } -@page :right { margin-left: 3cm; } -@page { margin: 2cm } - diff --git a/vendors/lessphp/tests/inputs/mixin_functions.less b/vendors/lessphp/tests/inputs/mixin_functions.less deleted file mode 100644 index fc9d57901..000000000 --- a/vendors/lessphp/tests/inputs/mixin_functions.less +++ /dev/null @@ -1,40 +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; -} - -.skip_args { - @class(,12px); - @lots(,,,88px,,12px); - @group > @f(red,,,,); - @group > @f(red); -} - diff --git a/vendors/lessphp/tests/inputs/mixin_merging.less.disable b/vendors/lessphp/tests/inputs/mixin_merging.less.disable deleted file mode 100644 index 6b25e421f..000000000 --- a/vendors/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/vendors/lessphp/tests/inputs/mixins.less b/vendors/lessphp/tests/inputs/mixins.less deleted file mode 100644 index 259db3def..000000000 --- a/vendors/lessphp/tests/inputs/mixins.less +++ /dev/null @@ -1,126 +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; -} - - -.butter { - .this .one .isnt .found; -} - - -// arguments - -.spam(@something: 100, @dad: land) { - @wow: 23434; - foo: @arguments; - bar: @arguments; -} - -.eggs { - .spam(1px, 2px); - .spam(); -} - -.first(@one, @two, @three, @four: cool) { - cool: @arguments; -} - -#hello { - .first(one, two, three); -} - -#hello-important { - .first(one, two, three) !important; -} - -.rad(@name) { - cool: @arguments; -} - -#world { - @hello: "world"; - .rad("@{hello}"); -} - -.second(@x, @y:skip, @z: me) { - things: @arguments; -} - -#another { - .second(red, blue, green); - .second(red blue green); -} - - -.another(@x, @y:skip, @z:me) { - .cool { - color: @arguments; - } -} - -#day { - .another(one,two, three); - .another(one two three); -} - - - - diff --git a/vendors/lessphp/tests/inputs/nested.less b/vendors/lessphp/tests/inputs/nested.less deleted file mode 100644 index 0b62ea19b..000000000 --- a/vendors/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/vendors/lessphp/tests/inputs/pattern_matching.less b/vendors/lessphp/tests/inputs/pattern_matching.less deleted file mode 100644 index e875473d3..000000000 --- a/vendors/lessphp/tests/inputs/pattern_matching.less +++ /dev/null @@ -1,167 +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); - .hola(jello, world); -} - -.resty(@hello, @world, @the_rest...) { - padding: @hello @world; - rest: @the_rest; -} - -#nnn { - .body(10, 10, 10, 10, 10); - .body(10, 10, 10); - .body(10, 10); - .body(10); - .body(); -} - -.defaults(@aa, @bb:e343, @cc: "heah", ...) { - height: @aa; -} - -#defaults_1 { - .defaults(); - .defaults(one); - .defaults(two, one); - .defaults(three, two, one); - .defaults(four, three, two, one); -} - - -.thing() { color: green; } -.thing(...) { color: blue; } -.thing { color: red; } - -#aa { - .thing(); -} - -#bb { - .thing; -} - - -#cc { - .thing(1); -} - - - diff --git a/vendors/lessphp/tests/inputs/scopes.less b/vendors/lessphp/tests/inputs/scopes.less deleted file mode 100644 index 0ddbfac20..000000000 --- a/vendors/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/vendors/lessphp/tests/inputs/selector_expressions.less b/vendors/lessphp/tests/inputs/selector_expressions.less deleted file mode 100644 index a16c1d23a..000000000 --- a/vendors/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/vendors/lessphp/tests/inputs/site_demos.less b/vendors/lessphp/tests/inputs/site_demos.less deleted file mode 100644 index 136a99ac8..000000000 --- a/vendors/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/vendors/lessphp/tests/inputs/test-imports/file1.less b/vendors/lessphp/tests/inputs/test-imports/file1.less deleted file mode 100644 index 658de0c53..000000000 --- a/vendors/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/vendors/lessphp/tests/inputs/test-imports/file2.less b/vendors/lessphp/tests/inputs/test-imports/file2.less deleted file mode 100644 index 2cae8dce0..000000000 --- a/vendors/lessphp/tests/inputs/test-imports/file2.less +++ /dev/null @@ -1,6 +0,0 @@ - -b { - color: @color; - padding: 16px; -} - diff --git a/vendors/lessphp/tests/inputs/variables.less b/vendors/lessphp/tests/inputs/variables.less deleted file mode 100644 index 6c4ef8fb4..000000000 --- a/vendors/lessphp/tests/inputs/variables.less +++ /dev/null @@ -1,45 +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; - padding: @nonexistant + 4px; -} - -@hello: 44px; -@something: "hello"; -@cool: something; - -color: @@something; -color: @@@cool; - - diff --git a/vendors/lessphp/tests/outputs/accessors.css b/vendors/lessphp/tests/outputs/accessors.css deleted file mode 100644 index e6c01a72c..000000000 --- a/vendors/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; }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/arity.css b/vendors/lessphp/tests/outputs/arity.css deleted file mode 100644 index 7900e4087..000000000 --- a/vendors/lessphp/tests/outputs/arity.css +++ /dev/null @@ -1,25 +0,0 @@ -.one { - color:one; - color:one; -} -.two { - color:two; - color:two; -} -.three { - color:three; - color:three; -} -.multi-foo { - color:two; - color:three; - color:two; - color:three; - color:three; -} -.multi-baz { - color:two; - color:three; - color:two; - color:three; -}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/attributes.css b/vendors/lessphp/tests/outputs/attributes.css deleted file mode 100644 index 229f7cf36..000000000 --- a/vendors/lessphp/tests/outputs/attributes.css +++ /dev/null @@ -1,35 +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; }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/builtins.css b/vendors/lessphp/tests/outputs/builtins.css deleted file mode 100644 index 1787e0ba3..000000000 --- a/vendors/lessphp/tests/outputs/builtins.css +++ /dev/null @@ -1,20 +0,0 @@ -body { - color:"hello world"; - height:5.1666666666667; - height:5px; - height:6px; - width:0.66666666666667; - width:1; - width:0; - width:1; - width:3px; - color:#00112233; - color:#992c3742; -} -format { - format:"rgb(32, 128, 64)"; - format-string:"hello world"; - format-multiple:"hello earth 2"; - format-url-encode:'red is %A'; - eformat:rgb(32, 128, 64); -}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/colors.css b/vendors/lessphp/tests/outputs/colors.css deleted file mode 100644 index 51eb152b5..000000000 --- a/vendors/lessphp/tests/outputs/colors.css +++ /dev/null @@ -1,69 +0,0 @@ -body { - color:#996d33; - color:rgba(153,109,51,0.3); - lighten:#fff; - lighten:#7c8df2; - lighten:rgba(222,140,129,0.5); - darken:#d6d6d6; - darken:#0d1e81; - darken:rgba(18,42,185,0.5); - saturate:#f1eded; - saturate:#0025fe; - saturate:rgba(10,44,244,0.5); - desaturate:#efefef; - desaturate:#3349cb; - desaturate:rgba(36,62,218,0.5); - spin:#efefef; - spin:#2d17e7; - spin:rgba(59,23,231,0.5); - spin:#efefef; - spin:#1769e7; - spin:rgba(23,119,231,0.5); - one:#abcdef; - one:#abcdef; - two:rgba(2,159,35,0.9); - two:rgba(2,159,35,0.9); - three:rgba(1,2,3,0.6); - three:rgba(1,2,3,0.6); - four:rgba(1,2,3,0); - four:rgba(1,2,3,0); - hue:282; - sat:33; - lit:12; - what:#dff1da; - zero:#343434; - zero:#003468; - zero:#000; - zero:#fff; - zero:#000; - zero:#fff; - zero:#fff; - zero:#fff; - zero:#1d5612; - zero:#56124b; - zero:#000; - zero:#fff; -} -alpha { - g:0; - g:1; -} -fade { - f:rgba(255,0,0,0.5); - f:rgba(255,255,255,0.2); - f:rgba(34,23,64,0.5); -} -.mix { color:#808080; } -.percent { per:50%; } -.colorz { - color:#ebebeb; - color:#ff9100; -} -body { - start:#fcf8e3; - spin:#fcf4e3; - chained:#fbeed5; - direct:#fbefd5; -} -pre { spin:#f2dee1; } -dd { background-color:#f5f5f5; }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/compile_on_mixin.css b/vendors/lessphp/tests/outputs/compile_on_mixin.css deleted file mode 100644 index b1a3d7fcc..000000000 --- a/vendors/lessphp/tests/outputs/compile_on_mixin.css +++ /dev/null @@ -1,11 +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; }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/escape.css b/vendors/lessphp/tests/outputs/escape.css deleted file mode 100644 index a310fe009..000000000 --- a/vendors/lessphp/tests/outputs/escape.css +++ /dev/null @@ -1,14 +0,0 @@ -body { - border:this is simple; - border:this; - border:this is simple; - border:1232; - border:world; - border:onemore; - border:; - line-height:eating rice; - line-height:string cheese; - line-height:a b c string me d e f; - line-height:string world; -} -.class { filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image.png'); }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/font_family.css b/vendors/lessphp/tests/outputs/font_family.css deleted file mode 100644 index afbc996d3..000000000 --- a/vendors/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; -}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/guards.css b/vendors/lessphp/tests/outputs/guards.css deleted file mode 100644 index db110aa9d..000000000 --- a/vendors/lessphp/tests/outputs/guards.css +++ /dev/null @@ -1,23 +0,0 @@ -dd { color:yellow; } -b { - color:red; - color:blue; - color:blue; -} -img { - color:green; - color:teal; -} -body { - color:purple; - color:silver; - color:purple; -} -div { color:blue; } -link { - color:true red; - color:true #fff; - color:true #fffddd; - color:true #000; - color:true rgba(0,0,0,0.34); -}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/hacks.css b/vendors/lessphp/tests/outputs/hacks.css deleted file mode 100644 index 984faa6e5..000000000 --- a/vendors/lessphp/tests/outputs/hacks.css +++ /dev/null @@ -1 +0,0 @@ -:root .alert-message, :root .btn { border-radius:0 \0; }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/import.css b/vendors/lessphp/tests/outputs/import.css deleted file mode 100644 index 4d50ba598..000000000 --- a/vendors/lessphp/tests/outputs/import.css +++ /dev/null @@ -1,14 +0,0 @@ -@import url("something.css") media; -@import url("something.css") media; -@import url("something.css") media, screen, print; -b { - color:maroon; - padding:16px; -} -body { line-height:10em; } -body div.bright { color:red; } -body div.sad { color:blue; } -div b { - color:fuchsia; - padding:16px; -}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/keyframes.css b/vendors/lessphp/tests/outputs/keyframes.css deleted file mode 100644 index d01f05b77..000000000 --- a/vendors/lessphp/tests/outputs/keyframes.css +++ /dev/null @@ -1,47 +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; - } -}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/math.css b/vendors/lessphp/tests/outputs/math.css deleted file mode 100644 index bcd66839e..000000000 --- a/vendors/lessphp/tests/outputs/math.css +++ /dev/null @@ -1,61 +0,0 @@ -.unary { sub:10 -5; } -.spaces { - sub:5; - sub:5; - add:15; - add:15; - div:2; - mul:50; - mul:50; -} -.supress-division { - border-radius:10px/10px; - border-radius:10px/10px; - border-radius:hello(10px/10px) world; - font:10px/30 sans-serif; - font:10px/20px sans-serif; - font:10px/20px sans-serif; - border-radius:0 15px 15px 15px/0 50% 50% 50%; -} -.parens { - sub:5; - add:15; - div:2; - div:2; - mul:50; -} -.keyword-names { height:"hello" 25; } -.negation { - hello:-1px; - hello:-1px; - hello:-10; -} -.test { - single:5; - single:10; - single:10; - parens:10 -2; - math:20; - math:20; - width:71; - height:6; - padding:6px 1em 2px 2; - padding:8 4 4 4px; - width:96; - height:113; - margin:12; -} -.percents { - color:1000%; - color:1000%; - color:100%; - color:1000px; - color:1000%; - color:30%; - color:10%; - color:2%; -} -.misc { - x:40px; - y:40em; -}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/media.css b/vendors/lessphp/tests/outputs/media.css deleted file mode 100644 index cb5683fd4..000000000 --- a/vendors/lessphp/tests/outputs/media.css +++ /dev/null @@ -1,28 +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; } -}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/misc.css b/vendors/lessphp/tests/outputs/misc.css deleted file mode 100644 index 8d85268c8..000000000 --- a/vendors/lessphp/tests/outputs/misc.css +++ /dev/null @@ -1,40 +0,0 @@ -@charset "utf-8"; -color:"aaa, bbb"; -.topbar { background:url(/assets/images/test/topbar.png); } -.hello { test:empty-function("/assets/images/test/",40%,to(#fff)); } -.css3 { background-image:-webkit-gradient(linear,0% 0%,0% 90%,from(#e9a000),to(#a37000)); } -.test, .world { - border:1px solid red; - color:url(http://mage-page.com); - string:"hello /* this is not a comment */"; - world:"// neither is this"; - string:'hello /* this is not a comment */'; - world:'// neither is this'; - what-ever:100px; - background:url(/*no comment here*/); -} -.urls { - background:url("http://google.com"); - background:url(http://google.com); - background:url("http://google.com"); -} -.cool { color:"aaa, bbb"; } -.span-17 { float:left; } -.span-17 { width:660px; } -.x { - float:left; - width:660px; -} -.hi pre { color:red; } -.hi pre { color:blue; } -.rad pre { color:red; } -.rad pre { color:blue; } -@page :left { - margin-left:4cm; -} -@page :right { - margin-left:3cm; -} -@page { - margin:2cm; -}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/mixin_functions.css b/vendors/lessphp/tests/outputs/mixin_functions.css deleted file mode 100644 index 91b61492e..000000000 --- a/vendors/lessphp/tests/outputs/mixin_functions.css +++ /dev/null @@ -1,14 +0,0 @@ -body { - padding:2.0em; - color:red; - margin:10px; - height:12px; - border-bottom:1px solid green; -} -.skip_args { - margin:22px; - height:12px; - padding:10px 20px 30px 88px; - margin:4px 12px 2px 1px; - color:red; -}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/mixin_merging.css b/vendors/lessphp/tests/outputs/mixin_merging.css deleted file mode 100644 index 9ec360c21..000000000 --- a/vendors/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; -}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/mixins.css b/vendors/lessphp/tests/outputs/mixins.css deleted file mode 100644 index 70a99003d..000000000 --- a/vendors/lessphp/tests/outputs/mixins.css +++ /dev/null @@ -1,50 +0,0 @@ -.bold { - font-size:20px; - font-weight:bold; -} -body #window { - line-height:0; - border-radius:10px; - font-size:20px; - font-weight:bold; -} -#bundle .button { - display:block; - border:1px solid black; - background-color:grey; -} -#bundle .button:hover { background-color:white; } -#header a { - color:orange; - display:block; - border:1px solid black; - background-color:grey; -} -#header a:hover { background-color:white; } -div { - color:blue; - hello:world; -} -div b { color:blue; } -body { - color:blue; - hello:world; -} -body b { color:blue; } -.hello .world { color:blue; } -.foobar { color:blue; } -.eggs { - foo:1px 2px; - bar:1px 2px; - foo:100 land; - bar:100 land; -} -#hello { cool:one two three cool; } -#hello-important { cool:one two three cool !important; } -#world { cool:"world"; } -#another { - things:red blue green; - things:red blue green skip me; -} -#day .cool { color:one two three; } -#day .cool { color:one two three skip me; }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/nested.css b/vendors/lessphp/tests/outputs/nested.css deleted file mode 100644 index 0845fb6ff..000000000 --- a/vendors/lessphp/tests/outputs/nested.css +++ /dev/null @@ -1,16 +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; }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/nesting.css b/vendors/lessphp/tests/outputs/nesting.css deleted file mode 100644 index 908c1d814..000000000 --- a/vendors/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; }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/pattern_matching.css b/vendors/lessphp/tests/outputs/pattern_matching.css deleted file mode 100644 index f83ace15f..000000000 --- a/vendors/lessphp/tests/outputs/pattern_matching.css +++ /dev/null @@ -1,56 +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; }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/scopes.css b/vendors/lessphp/tests/outputs/scopes.css deleted file mode 100644 index 23d1551ca..000000000 --- a/vendors/lessphp/tests/outputs/scopes.css +++ /dev/null @@ -1,7 +0,0 @@ -body div other world { height:50; } -div other world { height:50; } -pre { - height:10; - height:11; - height:12; -}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/selector_expressions.css b/vendors/lessphp/tests/outputs/selector_expressions.css deleted file mode 100644 index 78dc4bb92..000000000 --- a/vendors/lessphp/tests/outputs/selector_expressions.css +++ /dev/null @@ -1,8 +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; }
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/site_demos.css b/vendors/lessphp/tests/outputs/site_demos.css deleted file mode 100644 index 2c853af4c..000000000 --- a/vendors/lessphp/tests/outputs/site_demos.css +++ /dev/null @@ -1,54 +0,0 @@ -default .underline { border-bottom:1px solid green; } -default #header { - color:black; - border:1px solid #d4d; -} -default #header .navigation { font-size:12px; } -default #header .navigation a { border-bottom:1px solid green; } -default #header .logo { width:300px; } -default #header .logo:hover { text-decoration:none; } -variables .variables { - width:14cm; - height:24px; - color:#888; - background:#6c94be; - font-family:"Trebuchet MS", Verdana, sans-serif; -} -mixins .bordered { - border-top:dotted 1px black; - border-bottom:solid 2px black; -} -mixins #menu a { - color:#111; - border-top:dotted 1px black; - border-bottom:solid 2px black; -} -mixins .post a { - color:red; - border-top:dotted 1px black; - border-bottom:solid 2px black; -} -nested-rules #header { color:black; } -nested-rules #header .navigation { font-size:12px; } -nested-rules #header .logo { width:300px; } -nested-rules #header .logo:hover { text-decoration:none; } -namespaces #bundle .button { - display:block; - border:1px solid black; - background-color:grey; -} -namespaces #bundle .button:hover { background-color:white; } -namespaces #header a { - color:orange; - display:block; - border:1px solid black; - background-color:grey; -} -namespaces #header a:hover { background-color:white; } -mixin-functions body { - padding:2.0em; - color:red; - margin:10px; - height:12px; - border-bottom:1px solid green; -}
\ No newline at end of file diff --git a/vendors/lessphp/tests/outputs/variables.css b/vendors/lessphp/tests/outputs/variables.css deleted file mode 100644 index 4c7e5e669..000000000 --- a/vendors/lessphp/tests/outputs/variables.css +++ /dev/null @@ -1,20 +0,0 @@ -color:44px; -color:44px; -.variables { - width:14cm; - height:24px; - margin-top:-20px; - margin-bottom:30px; - color:#889; - background:#6c94be; - font-family:"Trebuchet MS", Verdana, sans-serif; - margin:3px; - font:10px/12px serif; - font:120%/120% serif; -} -.external { - color:#888; - border:1px solid #3326cc; - background:rgba(23,68,149,0.5); - padding:4px; -}
\ No newline at end of file diff --git a/vendors/lessphp/tests/sort.php b/vendors/lessphp/tests/sort.php deleted file mode 100644 index 38662cb24..000000000 --- a/vendors/lessphp/tests/sort.php +++ /dev/null @@ -1,57 +0,0 @@ -<?php -error_reporting(E_ALL); - -require realpath(dirname(__FILE__)).'/../lessc.inc.php'; - -// sorts the selectors in stylesheet in order to normalize it for comparison - -$exe = array_shift($argv); // remove filename - -if (!$fname = array_shift($argv)) { - $fname = "php://stdin"; -} - -// also sorts the tags in the block -function sort_key($block) { - if (!isset($block->sort_key)) { - sort($block->tags, SORT_STRING); - $block->sort_key = implode(",", $block->tags); - } - - return $block->sort_key; -} - -class sort_css extends lessc { - function __construct() { - parent::__construct(); - } - - // normalize numbers - function compileValue($value) { - $ignore = array('list', 'keyword', 'string', 'color', 'function'); - if ($value[0] == 'number' || !in_array($value[0], $ignore)) { - $value[1] = $value[1] + 0; // convert to either double or int - } - - return parent::compileValue($value); - } - - function parse_and_sort($str) { - $root = $this->parseTree($str); - - $less = $this; - usort($root->props, function($a, $b) use ($less) { - - $sort = strcmp(sort_key($a[1]), sort_key($b[1])); - if ($sort == 0) - return strcmp($less->compileBlock($a[1]), $less->compileBlock($b[1])); - return $sort; - }); - - return $this->compileBlock($root); - } -} - -$sorter = new sort_css; -echo $sorter->parse_and_sort(file_get_contents($fname)); - diff --git a/vendors/lessphp/tests/test.php b/vendors/lessphp/tests/test.php deleted file mode 100644 index 629fe0153..000000000 --- a/vendors/lessphp/tests/test.php +++ /dev/null @@ -1,190 +0,0 @@ -#!/usr/bin/env php -<?php -error_reporting(E_ALL); - -/** - * Go through all files matching pattern in input directory - * and compile them, then compare them to paired file in - * output directory. - */ -$difftool = 'diff -b -B -t -u'; -$input = array( - 'dir' => 'inputs', - 'glob' => '*.less', -); - -$output = array( - 'dir' => 'outputs', - 'filename' => '%s.css', -); - - -$prefix = strtr(realpath(dirname(__FILE__)), '\\', '/'); -require $prefix.'/../lessc.inc.php'; - -$compiler = new lessc(); -$compiler->importDir = array($input['dir'].'/test-imports'); - -$fa = 'Fatal Error: '; -if (php_sapi_name() != 'cli') { - exit($fa.$argv[0].' must be run in the command line.'); -} - -$opts = getopt('hCd::g'); - -if ($opts === false || isset($opts['h'])) { - echo <<<EOT -Usage: ./test.php [options] [searchstring] - -where [options] can be a mix of these: - - -h Show this help message and exit. - - -d=[difftool] Show the diff of the actual output vs. the reference when a - test fails; uses 'diff -b -B -t -u' by default. - - The test is aborted after the first failure report, unless - you also specify the '-g' option ('go on'). - - -g Continue executing the other tests when a test fails and - option '-d' is active. - - -C Regenerate ('compile') the reference output files from the - given inputs. - - WARNING: ONLY USE THIS OPTION WHEN YOU HAVE ASCERTAINED - THAT lessphp PROCESSES ALL TESTS CORRECTLY! - -The optional [searchstring] is used to filter the input files: only tests -which have filename(s) containing the specified searchstring will be -executed. I.e. the corresponding glob pattern is '*[searchstring]*.less'. - -The script EXIT CODE is the number of failed tests (with a maximum of 255), -0 on success and 1 when this help message is shown. This aids in integrating -this script in larger (user defined) shell test scripts. - - -Examples of use: - -- Test the full test set: - ./test.php - -- Run only the mixin tests: - ./test.php mixin - -- Use a custom diff tool to show diffs for failing tests - ./test.php -d=meld - -EOT; - exit(1); -} - -$input['dir'] = $prefix.'/'.$input['dir']; -$output['dir'] = $prefix.'/'.$output['dir']; -if (!is_dir($input['dir']) || !is_dir($output['dir'])) - exit($fa." both input and output directories must exist\n"); - -$exe = array_shift($argv); // remove filename -// get the first non flag as search string -$searchString = null; -foreach ($argv as $a) { - if (strlen($a) > 0 && $a{0} != '-') { - $searchString = $a; - break; - } -} - -$tests = array(); -$matches = glob($input['dir'].'/'.(!is_null($searchString) ? '*'.$searchString : '' ).$input['glob']); -if ($matches) { - foreach ($matches as $fname) { - extract(pathinfo($fname)); // for $filename, from php 5.2 - $tests[] = array( - 'in' => $fname, - 'out' => $output['dir'].'/'.sprintf($output['filename'], $filename), - ); - } -} - -$count = count($tests); -$compiling = isset($opts["C"]); -$continue_when_test_fails = isset($opts["g"]); -$showDiff = isset($opts["d"]); -if ($showDiff && !empty($opts["d"])) { - $difftool = $opts["d"]; -} - -echo ($compiling ? "Compiling" : "Running")." $count test".($count == 1 ? '' : 's').":\n"; - -function dump($msgs, $depth = 1, $prefix=" ") { - if (!is_array($msgs)) $msgs = array($msgs); - foreach ($msgs as $m) { - echo str_repeat($prefix, $depth).' - '.$m."\n"; - } -} - -$fail_prefix = " ** "; - -$fail_count = 0; -$i = 1; -foreach ($tests as $test) { - printf(" [Test %04d/%04d] %s -> %s\n", $i, $count, basename($test['in']), basename($test['out'])); - - try { - ob_start(); - $parsed = trim($compiler->parse(file_get_contents($test['in']))); - ob_end_clean(); - } catch (exception $e) { - dump(array( - "Failed to compile input, reason:", - $e->getMessage(), - "Aborting" - ), 1, $fail_prefix); - break; - } - - if ($compiling) { - file_put_contents($test['out'], $parsed); - } else { - if (!is_file($test['out'])) { - dump(array( - "Failed to find output file: $test[out]", - "Maybe you forgot to compile tests?", - "Aborting" - ), 1, $fail_prefix); - break; - } - $expected = trim(file_get_contents($test['out'])); - - // don't care about CRLF vs LF change (DOS/Win vs. UNIX): - $expected = trim(str_replace("\r\n", "\n", $expected)); - $parsed = trim(str_replace("\r\n", "\n", $parsed)); - - if ($expected != $parsed) { - $fail_count++; - if ($showDiff) { - dump("Failed:", 1, $fail_prefix); - $tmp = $test['out'].".tmp"; - file_put_contents($tmp, $parsed); - system($difftool.' '.$test['out'].' '.$tmp); - unlink($tmp); - - if (!$continue_when_test_fails) { - dump("Aborting"); - break; - } else { - echo "===========================================================================\n"; - } - } else { - dump("Failed, run with -d flag to view diff", 1, $fail_prefix); - } - } else { - dump("Passed"); - } - } - - $i++; -} - -exit($fail_count > 255 ? 255 : $fail_count); -?> |