diff options
Diffstat (limited to 'chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin')
56 files changed, 13862 insertions, 0 deletions
diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/LICENSE b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/LICENSE new file mode 100644 index 00000000000..261eeb9e9f8 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/MANIFEST b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/MANIFEST new file mode 100644 index 00000000000..a0384d9c1b4 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/MANIFEST @@ -0,0 +1,354 @@ +LICENSE +MANIFEST +PKG-INFO +README.rst +_setup/__init__.py +_setup/include/cext.h +_setup/py2/__init__.py +_setup/py2/commands.py +_setup/py2/data.py +_setup/py2/dist.py +_setup/py2/ext.py +_setup/py2/setup.py +_setup/py2/shell.py +_setup/py2/term/__init__.py +_setup/py2/term/_term.py +_setup/py2/util.py +_setup/py3/__init__.py +_setup/py3/commands.py +_setup/py3/data.py +_setup/py3/dist.py +_setup/py3/ext.py +_setup/py3/setup.py +_setup/py3/shell.py +_setup/py3/term/__init__.py +_setup/py3/term/_term.py +_setup/py3/util.py +bench +bench.sh +bench/LICENSE.cssmin +bench/__init__.py +bench/cssmin.py +bench/main.py +bench/wikipedia.css +bench/wikipedia.min.css +bench/write.py +docs/BENCHMARKS +docs/CHANGES +docs/CLASSIFIERS +docs/DESCRIPTION +docs/PROVIDES +docs/SUMMARY +docs/apidoc/api-objects.txt +docs/apidoc/crarr.png +docs/apidoc/epydoc.css +docs/apidoc/epydoc.js +docs/apidoc/help.html +docs/apidoc/identifier-index.html +docs/apidoc/index.html +docs/apidoc/module-tree.html +docs/apidoc/rcssmin-module.html +docs/apidoc/rcssmin-pysrc.html +docs/apidoc/redirect.html +package.cfg +rcssmin.c +rcssmin.py +run_tests.py +setup.py +tests +tests/main/atgroup_00.css +tests/main/atgroup_01.css +tests/main/atgroup_02.css +tests/main/atgroup_03.css +tests/main/atgroup_04.css +tests/main/atgroup_05.css +tests/main/atgroup_06.css +tests/main/atgroup_07.css +tests/main/atgroup_08.css +tests/main/atgroup_09.css +tests/main/atgroup_10.css +tests/main/atgroup_11.css +tests/main/comment_00.css +tests/main/comment_01.css +tests/main/comment_02.css +tests/main/comment_03.css +tests/main/comment_04.css +tests/main/escape_00.css +tests/main/escape_01.css +tests/main/escape_02.css +tests/main/escape_03.css +tests/main/escape_04.css +tests/main/escape_05.css +tests/main/escape_06.css +tests/main/first_00.css +tests/main/first_01.css +tests/main/first_02.css +tests/main/out/atgroup_00.out +tests/main/out/atgroup_00.out.b +tests/main/out/atgroup_01.out +tests/main/out/atgroup_01.out.b +tests/main/out/atgroup_02.out +tests/main/out/atgroup_02.out.b +tests/main/out/atgroup_03.out +tests/main/out/atgroup_03.out.b +tests/main/out/atgroup_04.out +tests/main/out/atgroup_04.out.b +tests/main/out/atgroup_05.out +tests/main/out/atgroup_05.out.b +tests/main/out/atgroup_06.out +tests/main/out/atgroup_06.out.b +tests/main/out/atgroup_07.out +tests/main/out/atgroup_07.out.b +tests/main/out/atgroup_08.out +tests/main/out/atgroup_08.out.b +tests/main/out/atgroup_09.out +tests/main/out/atgroup_09.out.b +tests/main/out/atgroup_10.out +tests/main/out/atgroup_10.out.b +tests/main/out/atgroup_11.out +tests/main/out/atgroup_11.out.b +tests/main/out/comment_00.out +tests/main/out/comment_00.out.b +tests/main/out/comment_01.out +tests/main/out/comment_01.out.b +tests/main/out/comment_02.out +tests/main/out/comment_02.out.b +tests/main/out/comment_03.out +tests/main/out/comment_03.out.b +tests/main/out/comment_04.out +tests/main/out/comment_04.out.b +tests/main/out/escape_00.out +tests/main/out/escape_00.out.b +tests/main/out/escape_01.out +tests/main/out/escape_01.out.b +tests/main/out/escape_02.out +tests/main/out/escape_02.out.b +tests/main/out/escape_03.out +tests/main/out/escape_03.out.b +tests/main/out/escape_04.out +tests/main/out/escape_04.out.b +tests/main/out/escape_05.out +tests/main/out/escape_05.out.b +tests/main/out/escape_06.out +tests/main/out/escape_06.out.b +tests/main/out/first_00.out +tests/main/out/first_00.out.b +tests/main/out/first_01.out +tests/main/out/first_01.out.b +tests/main/out/first_02.out +tests/main/out/first_02.out.b +tests/main/out/url_00.out +tests/main/out/url_00.out.b +tests/main/out/url_01.out +tests/main/out/url_01.out.b +tests/main/out/url_02.out +tests/main/out/url_02.out.b +tests/main/out/url_03.out +tests/main/out/url_03.out.b +tests/main/out/url_04.out +tests/main/out/url_04.out.b +tests/main/out/url_05.out +tests/main/out/url_05.out.b +tests/main/out/url_06.out +tests/main/out/url_06.out.b +tests/main/out/url_07.out +tests/main/out/url_07.out.b +tests/main/out/url_08.out +tests/main/out/url_08.out.b +tests/main/out/url_09.out +tests/main/out/url_09.out.b +tests/main/url_00.css +tests/main/url_01.css +tests/main/url_02.css +tests/main/url_03.css +tests/main/url_04.css +tests/main/url_05.css +tests/main/url_06.css +tests/main/url_07.css +tests/main/url_08.css +tests/main/url_09.css +tests/yui/README +tests/yui/background-position.css +tests/yui/background-position.css.min +tests/yui/border-none.css +tests/yui/border-none.css.min +tests/yui/box-model-hack.css +tests/yui/box-model-hack.css.min +tests/yui/bug2527974.css +tests/yui/bug2527974.css.min +tests/yui/bug2527991.css +tests/yui/bug2527991.css.min +tests/yui/bug2527998.css +tests/yui/bug2527998.css.min +tests/yui/bug2528034.css +tests/yui/bug2528034.css.min +tests/yui/charset-media.css +tests/yui/charset-media.css.min +tests/yui/color-simple.css +tests/yui/color-simple.css.min +tests/yui/color.css +tests/yui/color.css.min +tests/yui/comment.css +tests/yui/comment.css.min +tests/yui/concat-charset.css +tests/yui/concat-charset.css.min +tests/yui/dataurl-base64-doublequotes.css +tests/yui/dataurl-base64-doublequotes.css.min +tests/yui/dataurl-base64-eof.css +tests/yui/dataurl-base64-eof.css.min +tests/yui/dataurl-base64-linebreakindata.css +tests/yui/dataurl-base64-linebreakindata.css.min +tests/yui/dataurl-base64-noquotes.css +tests/yui/dataurl-base64-noquotes.css.min +tests/yui/dataurl-base64-singlequotes.css +tests/yui/dataurl-base64-singlequotes.css.min +tests/yui/dataurl-base64-twourls.css +tests/yui/dataurl-base64-twourls.css.min +tests/yui/dataurl-dbquote-font.css +tests/yui/dataurl-dbquote-font.css.min +tests/yui/dataurl-nonbase64-doublequotes.css +tests/yui/dataurl-nonbase64-doublequotes.css.min +tests/yui/dataurl-nonbase64-noquotes.css +tests/yui/dataurl-nonbase64-noquotes.css.min +tests/yui/dataurl-nonbase64-singlequotes.css +tests/yui/dataurl-nonbase64-singlequotes.css.min +tests/yui/dataurl-noquote-multiline-font.css +tests/yui/dataurl-noquote-multiline-font.css.min +tests/yui/dataurl-realdata-doublequotes.css +tests/yui/dataurl-realdata-doublequotes.css.min +tests/yui/dataurl-realdata-noquotes.css +tests/yui/dataurl-realdata-noquotes.css.min +tests/yui/dataurl-realdata-singlequotes.css +tests/yui/dataurl-realdata-singlequotes.css.min +tests/yui/dataurl-realdata-yuiapp.css +tests/yui/dataurl-realdata-yuiapp.css.min +tests/yui/dataurl-singlequote-font.css +tests/yui/dataurl-singlequote-font.css.min +tests/yui/decimals.css +tests/yui/decimals.css.min +tests/yui/dollar-header.css +tests/yui/dollar-header.css.min +tests/yui/font-face.css +tests/yui/font-face.css.min +tests/yui/ie5mac.css +tests/yui/ie5mac.css.min +tests/yui/media-empty-class.css +tests/yui/media-empty-class.css.min +tests/yui/media-multi.css +tests/yui/media-multi.css.min +tests/yui/media-test.css +tests/yui/media-test.css.min +tests/yui/opacity-filter.css +tests/yui/opacity-filter.css.min +tests/yui/out/background-position.out +tests/yui/out/background-position.out.b +tests/yui/out/border-none.out +tests/yui/out/border-none.out.b +tests/yui/out/box-model-hack.out +tests/yui/out/box-model-hack.out.b +tests/yui/out/bug2527974.out +tests/yui/out/bug2527974.out.b +tests/yui/out/bug2527991.out +tests/yui/out/bug2527991.out.b +tests/yui/out/bug2527998.out +tests/yui/out/bug2527998.out.b +tests/yui/out/bug2528034.out +tests/yui/out/bug2528034.out.b +tests/yui/out/charset-media.out +tests/yui/out/charset-media.out.b +tests/yui/out/color-simple.out +tests/yui/out/color-simple.out.b +tests/yui/out/color.out +tests/yui/out/color.out.b +tests/yui/out/comment.out +tests/yui/out/comment.out.b +tests/yui/out/concat-charset.out +tests/yui/out/concat-charset.out.b +tests/yui/out/dataurl-base64-doublequotes.out +tests/yui/out/dataurl-base64-doublequotes.out.b +tests/yui/out/dataurl-base64-eof.out +tests/yui/out/dataurl-base64-eof.out.b +tests/yui/out/dataurl-base64-linebreakindata.out +tests/yui/out/dataurl-base64-linebreakindata.out.b +tests/yui/out/dataurl-base64-noquotes.out +tests/yui/out/dataurl-base64-noquotes.out.b +tests/yui/out/dataurl-base64-singlequotes.out +tests/yui/out/dataurl-base64-singlequotes.out.b +tests/yui/out/dataurl-base64-twourls.out +tests/yui/out/dataurl-base64-twourls.out.b +tests/yui/out/dataurl-dbquote-font.out +tests/yui/out/dataurl-dbquote-font.out.b +tests/yui/out/dataurl-nonbase64-doublequotes.out +tests/yui/out/dataurl-nonbase64-doublequotes.out.b +tests/yui/out/dataurl-nonbase64-noquotes.out +tests/yui/out/dataurl-nonbase64-noquotes.out.b +tests/yui/out/dataurl-nonbase64-singlequotes.out +tests/yui/out/dataurl-nonbase64-singlequotes.out.b +tests/yui/out/dataurl-noquote-multiline-font.out +tests/yui/out/dataurl-noquote-multiline-font.out.b +tests/yui/out/dataurl-realdata-doublequotes.out +tests/yui/out/dataurl-realdata-doublequotes.out.b +tests/yui/out/dataurl-realdata-noquotes.out +tests/yui/out/dataurl-realdata-noquotes.out.b +tests/yui/out/dataurl-realdata-singlequotes.out +tests/yui/out/dataurl-realdata-singlequotes.out.b +tests/yui/out/dataurl-realdata-yuiapp.out +tests/yui/out/dataurl-realdata-yuiapp.out.b +tests/yui/out/dataurl-singlequote-font.out +tests/yui/out/dataurl-singlequote-font.out.b +tests/yui/out/decimals.out +tests/yui/out/decimals.out.b +tests/yui/out/dollar-header.out +tests/yui/out/dollar-header.out.b +tests/yui/out/font-face.out +tests/yui/out/font-face.out.b +tests/yui/out/ie5mac.out +tests/yui/out/ie5mac.out.b +tests/yui/out/media-empty-class.out +tests/yui/out/media-empty-class.out.b +tests/yui/out/media-multi.out +tests/yui/out/media-multi.out.b +tests/yui/out/media-test.out +tests/yui/out/media-test.out.b +tests/yui/out/opacity-filter.out +tests/yui/out/opacity-filter.out.b +tests/yui/out/preserve-case.out +tests/yui/out/preserve-case.out.b +tests/yui/out/preserve-new-line.out +tests/yui/out/preserve-new-line.out.b +tests/yui/out/preserve-strings.out +tests/yui/out/preserve-strings.out.b +tests/yui/out/pseudo-first.out +tests/yui/out/pseudo-first.out.b +tests/yui/out/pseudo.out +tests/yui/out/pseudo.out.b +tests/yui/out/special-comments.out +tests/yui/out/special-comments.out.b +tests/yui/out/star-underscore-hacks.out +tests/yui/out/star-underscore-hacks.out.b +tests/yui/out/string-in-comment.out +tests/yui/out/string-in-comment.out.b +tests/yui/out/webkit-transform.out +tests/yui/out/webkit-transform.out.b +tests/yui/out/zeros.out +tests/yui/out/zeros.out.b +tests/yui/preserve-case.css +tests/yui/preserve-case.css.min +tests/yui/preserve-new-line.css +tests/yui/preserve-new-line.css.min +tests/yui/preserve-strings.css +tests/yui/preserve-strings.css.min +tests/yui/pseudo-first.css +tests/yui/pseudo-first.css.min +tests/yui/pseudo.css +tests/yui/pseudo.css.min +tests/yui/special-comments.css +tests/yui/special-comments.css.min +tests/yui/star-underscore-hacks.css +tests/yui/star-underscore-hacks.css.min +tests/yui/string-in-comment.css +tests/yui/string-in-comment.css.min +tests/yui/webkit-transform.css +tests/yui/webkit-transform.css.min +tests/yui/zeros.css +tests/yui/zeros.css.min diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/PKG-INFO b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/PKG-INFO new file mode 100644 index 00000000000..d4ee866c986 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/PKG-INFO @@ -0,0 +1,316 @@ +Metadata-Version: 1.1 +Name: rcssmin +Version: 1.0.5 +Summary: CSS Minifier +Home-page: http://opensource.perlig.de/rcssmin/ +Author: André Malo +Author-email: nd@perlig.de +License: Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +Download-URL: http://storage.perlig.de/rcssmin/ +Description: ============== + CSS Minifier + ============== + + RCSSmin is a CSS minifier. + + The minifier is based on the semantics of the `YUI compressor`_\, which itself + is based on `the rule list by Isaac Schlueter`_\. + + This module is a re-implementation aiming for speed instead of maximum + compression, so it can be used at runtime (rather than during a preprocessing + step). RCSSmin does syntactical compression only (removing spaces, comments + and possibly semicolons). It does not provide semantic compression (like + removing empty blocks, collapsing redundant properties etc). It does, however, + support various CSS hacks (by keeping them working as intended). + + Here's a feature list: + + - Strings are kept, except that escaped newlines are stripped + - Space/Comments before the very end or before various characters are + stripped: ``:{});=>+],!`` (The colon (``:``) is a special case, a single + space is kept if it's outside a ruleset.) + - Space/Comments at the very beginning or after various characters are + stripped: ``{}(=:>+[,!`` + - Optional space after unicode escapes is kept, resp. replaced by a simple + space + - whitespaces inside ``url()`` definitions are stripped + - Comments starting with an exclamation mark (``!``) can be kept optionally. + - All other comments and/or whitespace characters are replaced by a single + space. + - Multiple consecutive semicolons are reduced to one + - The last semicolon within a ruleset is stripped + - CSS Hacks supported: + + - IE7 hack (``>/**/``) + - Mac-IE5 hack (``/*\*/.../**/``) + - The boxmodelhack is supported naturally because it relies on valid CSS2 + strings + - Between ``:first-line`` and the following comma or curly brace a space is + inserted. (apparently it's needed for IE6) + - Same for ``:first-letter`` + + rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to + factor 100 or so (depending on the input). docs/BENCHMARKS in the source + distribution contains the details. + + Both python 2 (>= 2.4) and python 3 are supported. + + .. _YUI compressor: https://github.com/yui/yuicompressor/ + + .. _the rule list by Isaac Schlueter: https://github.com/isaacs/cssmin/ + + + Copyright and License + ~~~~~~~~~~~~~~~~~~~~~ + + Copyright 2011 - 2014 + André Malo or his licensors, as applicable. + + The whole package (except for the files in the bench/ directory) is + distributed under the Apache License Version 2.0. You'll find a copy in the + root directory of the distribution or online at: + <http://www.apache.org/licenses/LICENSE-2.0>. + + + Bugs + ~~~~ + + No bugs, of course. ;-) + But if you've found one or have an idea how to improve rcssmin, feel free + to send a pull request on `github <https://github.com/ndparker/rcssmin>`_ + or send a mail to <rcssmin-bugs@perlig.de>. + + + Author Information + ~~~~~~~~~~~~~~~~~~ + + André "nd" Malo <nd perlig.de> + GPG: 0x8103A37E + + + If God intended people to be naked, they would be born that way. + -- Oscar Wilde + + .. vim:tw=72 syntax=rest +Keywords: CSS,Minimization +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved +Classifier: License :: OSI Approved :: Apache License, Version 2.0 +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: C +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: Jython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing +Classifier: Topic :: Text Processing :: Filters +Classifier: Topic :: Utilities +Provides: rcssmin (1.0) diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/README.chromium b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/README.chromium new file mode 100644 index 00000000000..b1350fc9fa4 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/README.chromium @@ -0,0 +1,16 @@ +Name: rCSSmin +Short Name: rcssmin +URL: http://opensource.perlig.de/rcssmin/ +Version: 1.0.5 +License: Apache 2.0 +License File: NOT_SHIPPED +Security Critical: no + +Description: +rCSSmin is a CSS minifier written in python. +The minifier is based on the semantics of the YUI compressor, which itself is +based on the rule list by Isaac Schlueter. + +Modifications made: + - Removed the bench.sh since the file doesn't have the licensing info and + caused license checker to fail. diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/README.rst b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/README.rst new file mode 100644 index 00000000000..95fb3083a89 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/README.rst @@ -0,0 +1,153 @@ +.. -*- coding: utf-8 -*- + +===================================== + rCSSmin - A CSS Minifier For Python +===================================== + +TABLE OF CONTENTS +----------------- + +1. Introduction +2. Copyright and License +3. System Requirements +4. Installation +5. Documentation +6. Bugs +7. Author Information + + +INTRODUCTION +------------ + +RCSSmin is a CSS minifier written in python. + +The minifier is based on the semantics of the `YUI compressor`_\, which itself +is based on `the rule list by Isaac Schlueter`_\. + +This module is a re-implementation aiming for speed instead of maximum +compression, so it can be used at runtime (rather than during a preprocessing +step). RCSSmin does syntactical compression only (removing spaces, comments +and possibly semicolons). It does not provide semantic compression (like +removing empty blocks, collapsing redundant properties etc). It does, however, +support various CSS hacks (by keeping them working as intended). + +Here's a feature list: + +- Strings are kept, except that escaped newlines are stripped +- Space/Comments before the very end or before various characters are + stripped: ``:{});=>+],!`` (The colon (``:``) is a special case, a single + space is kept if it's outside a ruleset.) +- Space/Comments at the very beginning or after various characters are + stripped: ``{}(=:>+[,!`` +- Optional space after unicode escapes is kept, resp. replaced by a simple + space +- whitespaces inside ``url()`` definitions are stripped +- Comments starting with an exclamation mark (``!``) can be kept optionally. +- All other comments and/or whitespace characters are replaced by a single + space. +- Multiple consecutive semicolons are reduced to one +- The last semicolon within a ruleset is stripped +- CSS Hacks supported: + + - IE7 hack (``>/**/``) + - Mac-IE5 hack (``/*\*/.../**/``) + - The boxmodelhack is supported naturally because it relies on valid CSS2 + strings + - Between ``:first-line`` and the following comma or curly brace a space is + inserted. (apparently it's needed for IE6) + - Same for ``:first-letter`` + +rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to +factor 100 or so (depending on the input). docs/BENCHMARKS in the source +distribution contains the details. + +.. _YUI compressor: https://github.com/yui/yuicompressor/ + +.. _the rule list by Isaac Schlueter: https://github.com/isaacs/cssmin/ + + +COPYRIGHT AND LICENSE +--------------------- + +Copyright 2011 - 2014 +André Malo or his licensors, as applicable. + +The whole package (except for the files in the bench/ directory) +is distributed under the Apache License Version 2.0. You'll find a copy in the +root directory of the distribution or online at: +<http://www.apache.org/licenses/LICENSE-2.0>. + + +SYSTEM REQUIREMENTS +------------------- + +Both python 2 (>=2.4) and python 3 are supported. + + +INSTALLATION +------------ + +Using pip +~~~~~~~~~ + +$ pip install rcssmin + + +Using distutils +~~~~~~~~~~~~~~~ + +$ python setup.py install + +The following extra options to the install command may be of interest: + + --without-c-extensions Don't install C extensions + --without-docs Do not install documentation files + + +Drop-in +~~~~~~~ + +rCSSmin effectively consists of two files: rcssmin.py and rcssmin.c, the +latter being entirely optional. So, for simple integration you can just +copy rcssmin.py into your project and use it. + + +DOCUMENTATION +------------- + +A generated API documentation is available in the docs/apidoc/ directory. +But you can just look into the module. It provides a simple function, +called cssmin which takes the CSS as a string and returns the minified +CSS as a string. + +The module additionally provides a "streamy" interface: + +$ python -mrcssmin <css >minified + +It takes two options: + + -b Keep bang-comments (Comments starting with an exclamation mark) + -p Force using the python implementation (not the C implementation) + +The latest documentation is also available online at +<http://opensource.perlig.de/rcssmin/>. + + +BUGS +---- + +No bugs, of course. ;-) +But if you've found one or have an idea how to improve rcssmin, feel free to +send a pull request on `github <https://github.com/ndparker/rcssmin>`_ or +send a mail to <rcssmin-bugs@perlig.de>. + + +AUTHOR INFORMATION +------------------ + +André "nd" Malo <nd@perlig.de> +GPG: 0x8103A37E + + + If God intended people to be naked, they would be born that way. + -- Oscar Wilde diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/__init__.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/__init__.py new file mode 100644 index 00000000000..77dc23c8412 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/__init__.py @@ -0,0 +1,39 @@ +# -*- coding: ascii -*- +# +# Copyright 2007, 2008, 2009, 2010, 2011 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +================ + Package _setup +================ + +This package provides tools for main package setup. +""" +__author__ = "Andr\xe9 Malo" +__docformat__ = "restructuredtext en" + +import os as _os +import sys as _sys + +if _sys.version_info[0] == 2: + __path__ = [_os.path.join(__path__[0], 'py2')] + __author__ = __author__.decode('latin-1') +elif _sys.version_info[0] == 3: + __path__ = [_os.path.join(__path__[0], 'py3')] +else: + raise RuntimeError("Unsupported python version") +del _os, _sys + +from _setup.setup import run # pylint: disable = W0611 diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/include/cext.h b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/include/cext.h new file mode 100644 index 00000000000..47b6f5b9c11 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/include/cext.h @@ -0,0 +1,244 @@ +/* + * Copyright 2006 - 2014 + * Andr\xe9 Malo or his licensors, as applicable + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * central naming stuff + */ + +#ifndef SETUP_CEXT_H +#define SETUP_CEXT_H + +#ifndef EXT_MODULE +#error EXT_MODULE must be defined outside of this file (-DEXT_MODULE=...) +#endif + +/* + * include core header files + */ +#define PY_SSIZE_T_CLEAN + +#include "Python.h" +#include "structmember.h" + +/* + * define our helper macros depending on the stuff above + */ +#define STRINGIFY(n) STRINGIFY_HELPER(n) +#define STRINGIFY_HELPER(n) #n +#define CONCATENATE(first, second) CONCATENATE_HELPER(first, second) +#define CONCATENATE_HELPER(first, second) first##second + +#define EXT_MODULE_NAME STRINGIFY(EXT_MODULE) +#ifdef EXT_PACKAGE +#define EXT_PACKAGE_NAME STRINGIFY(EXT_PACKAGE) +#define EXT_MODULE_PATH EXT_PACKAGE_NAME "." EXT_MODULE_NAME +#else +#define EXT_PACKAGE_NAME "" +#define EXT_MODULE_PATH EXT_MODULE_NAME +#endif + +#define EXT_DOCS_VAR CONCATENATE(var, CONCATENATE(EXT_MODULE, __doc__)) +#define EXT_METHODS_VAR CONCATENATE(var, CONCATENATE(EXT_MODULE, _methods)) +#define EXT_METHODS static PyMethodDef EXT_METHODS_VAR[] + +#define EXT_DEFINE_VAR CONCATENATE(var, CONCATENATE(EXT_MODULE, _module)) + +/* Py3K Support */ +#if PY_MAJOR_VERSION >= 3 + +#define EXT3 + +#ifndef PyMODINIT_FUNC +#define EXT_INIT_FUNC PyObject *CONCATENATE(PyInit_, EXT_MODULE)(void) +#else +#define EXT_INIT_FUNC PyMODINIT_FUNC CONCATENATE(PyInit_, EXT_MODULE)(void) +#endif + +#define EXT_DEFINE(name, methods, doc) \ +static struct PyModuleDef EXT_DEFINE_VAR = { \ + PyModuleDef_HEAD_INIT, \ + name, \ + doc, \ + -1, \ + methods, \ + NULL, \ + NULL, \ + NULL, \ + NULL \ +} + +#define EXT_CREATE(def) (PyModule_Create(def)) +#define EXT_INIT_ERROR(module) do {Py_XDECREF(module); return NULL;} while(0) +#define EXT_INIT_RETURN(module) return module + +#else /* end py3k */ + +#define EXT2 + +#ifndef PyMODINIT_FUNC +#define EXT_INIT_FUNC void CONCATENATE(init, EXT_MODULE)(void) +#else +#define EXT_INIT_FUNC PyMODINIT_FUNC CONCATENATE(init, EXT_MODULE)(void) +#endif + +#define EXT_DEFINE__STRUCT \ + CONCATENATE(struct, CONCATENATE(EXT_MODULE, _module)) + +struct EXT_DEFINE__STRUCT { + char *m_name; + char *m_doc; + PyMethodDef *m_methods; +}; +#define EXT_DEFINE(name, methods, doc) \ +static struct EXT_DEFINE__STRUCT EXT_DEFINE_VAR = { \ + name, \ + doc, \ + methods \ +} + +#define EXT_CREATE(def) ((def)->m_doc \ + ? Py_InitModule3((def)->m_name, (def)->m_methods, (def)->m_doc) \ + : Py_InitModule((def)->m_name, (def)->m_methods) \ +) +#define EXT_INIT_ERROR(module) return +#define EXT_INIT_RETURN(module) return + +#endif /* end py2K */ + +#define EXT_INIT_TYPE(module, type) do { \ + if (PyType_Ready(type) < 0) \ + EXT_INIT_ERROR(module); \ +} while (0) + +#define EXT_ADD_TYPE(module, name, type) do { \ + Py_INCREF(type); \ + if (PyModule_AddObject(module, name, (PyObject *)(type)) < 0) \ + EXT_INIT_ERROR(module); \ +} while (0) + +#define EXT_ADD_UNICODE(module, name, string, encoding) do { \ + if (PyModule_AddObject( \ + module, \ + name, \ + PyUnicode_Decode( \ + string, \ + sizeof(string) - 1, \ + encoding, \ + "strict" \ + )) < 0) \ + EXT_INIT_ERROR(module); \ +} while (0) + +#define EXT_ADD_STRING(module, name, string) do { \ + if (PyModule_AddStringConstant(module, name, string) < 0) \ + EXT_INIT_ERROR(module); \ +} while (0) + +#define EXT_ADD_INT(module, name, number) do { \ + if (PyModule_AddIntConstant(module, name, number) < 0) \ + EXT_INIT_ERROR(module); \ +} while (0) + + +/* PEP 353 support, implemented as of python 2.5 */ +#if PY_VERSION_HEX < 0x02050000 +typedef int Py_ssize_t; +#define PyInt_FromSsize_t(arg) PyInt_FromLong((long)arg) +#define PyInt_AsSsize_t(arg) (int)PyInt_AsLong(arg) +#define PY_SSIZE_T_MAX ((Py_ssize_t)INT_MAX) +#endif + +/* + * some helper macros (Python 2.4) + */ +#ifndef Py_VISIT +#define Py_VISIT(op) do { \ + if (op) { \ + int vret = visit((op), arg); \ + if (vret) return vret; \ + } \ +} while (0) +#endif + +#ifdef Py_CLEAR +#undef Py_CLEAR +#endif +#define Py_CLEAR(op) do { \ + if (op) { \ + PyObject *tmp__ = (PyObject *)(op); \ + (op) = NULL; \ + Py_DECREF(tmp__); \ + } \ +} while (0) + +#ifndef Py_RETURN_NONE +#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None +#endif + +#ifndef Py_RETURN_FALSE +#define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False +#endif + +#ifndef Py_RETURN_TRUE +#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True +#endif + +/* Macros for inline documentation. (Python 2.3) */ +#ifndef PyDoc_VAR +#define PyDoc_VAR(name) static char name[] +#endif + +#ifndef PyDoc_STRVAR +#define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str) +#endif + +#ifndef PyDoc_STR +#ifdef WITH_DOC_STRINGS +#define PyDoc_STR(str) str +#else +#define PyDoc_STR(str) "" +#endif +#endif + +/* Basestring check (basestring introduced in Python 2.3) */ +#if PY_VERSION_HEX < 0x02030000 +#define BaseString_Check(type) ( \ + PyObject_TypeCheck((type), &PyString_Type) \ + || PyObject_TypeCheck((type), &PyUnicode_Type) \ +) +#else +#define BaseString_Check(type) PyObject_TypeCheck((type), &PyBaseString_Type) +#endif + +#define GENERIC_ALLOC(type) \ + ((void *)((PyTypeObject *)type)->tp_alloc(type, (Py_ssize_t)0)) + +/* PyPy doesn't define it */ +#ifndef PyType_IS_GC +#define PyType_IS_GC(t) PyType_HasFeature((t), Py_TPFLAGS_HAVE_GC) +#endif + +#define DEFINE_GENERIC_DEALLOC(prefix) \ +static void prefix##_dealloc(void *self) \ +{ \ + if (PyType_IS_GC(((PyObject *)self)->ob_type)) \ + PyObject_GC_UnTrack(self); \ + (void)prefix##_clear(self); \ + ((PyObject *)self)->ob_type->tp_free((PyObject *)self); \ +} + +#endif /* SETUP_CEXT_H */ diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/__init__.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/__init__.py new file mode 100644 index 00000000000..9582ecc1087 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/__init__.py @@ -0,0 +1,27 @@ +# -*- coding: ascii -*- +# +# Copyright 2007, 2008, 2009, 2010, 2011 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +================ + Package _setup +================ + +This package provides tools for main package setup. +""" +__author__ = u"Andr\xe9 Malo" +__docformat__ = "restructuredtext en" + +from _setup.setup import run # pylint: disable = W0611 diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/commands.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/commands.py new file mode 100644 index 00000000000..a41b166e0a5 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/commands.py @@ -0,0 +1,267 @@ +# -*- coding: ascii -*- +# +# Copyright 2007, 2008, 2009, 2010, 2011 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +=================== + Command extenders +=================== + +Command extenders. +""" +__author__ = u"Andr\xe9 Malo" +__docformat__ = "restructuredtext en" +__test__ = False + +from distutils import fancy_getopt as _fancy_getopt +from distutils.command import build as _build +from distutils.command import build_ext as _build_ext +from distutils.command import install as _install +from distutils.command import install_data as _install_data +from distutils.command import install_lib as _install_lib +import os as _os + +from _setup.util import log + +_option_defaults = {} +_option_inherits = {} +_option_finalizers = {} +_command_mapping = { + 'install': 'Install', + 'install_data': 'InstallData', + 'install_lib': 'InstallLib', + 'build': 'Build', + 'build_ext': 'BuildExt', +} + + +def add_option(command, long_name, help_text, short_name=None, default=None, + inherit=None): + """ Add an option """ + try: + command_class = globals()[_command_mapping[command]] + except KeyError: + raise ValueError("Unknown command %r" % (command,)) + for opt in command_class.user_options: + if opt[0] == long_name: + break + else: + opt = (long_name, short_name, help_text) + command_class.user_options.append(opt) + if not long_name.endswith('='): + command_class.boolean_options.append(long_name) + attr_name = _fancy_getopt.translate_longopt(long_name) + else: + attr_name = _fancy_getopt.translate_longopt(long_name[:-1]) + if not _option_defaults.has_key(command): + _option_defaults[command] = [] + if inherit is not None: + if isinstance(inherit, (str, unicode)): + inherit = [inherit] + for i_inherit in inherit: + add_option( + i_inherit, long_name, help_text, short_name, default + ) + default = None + if not _option_inherits.has_key(command): + _option_inherits[command] = [] + for i_inherit in inherit: + for i_command, opt_name in _option_inherits[command]: + if i_command == i_inherit and opt_name == attr_name: + break + else: + _option_inherits[command].append((i_inherit, attr_name)) + _option_defaults[command].append((attr_name, default)) + + +def add_finalizer(command, key, func): + """ Add finalizer """ + if not _option_finalizers.has_key(command): + _option_finalizers[command] = {} + if not _option_finalizers[command].has_key(key): + _option_finalizers[command][key] = func + + +class Install(_install.install): + """ Extended installer to reflect the additional data options """ + user_options = _install.install.user_options + [ + ('single-version-externally-managed', None, + "Compat option. Does not a thing."), + ] + boolean_options = _install.install.boolean_options + [ + 'single-version-externally-managed' + ] + + def initialize_options(self): + """ Prepare for new options """ + _install.install.initialize_options(self) + self.single_version_externally_managed = None + if _option_defaults.has_key('install'): + for opt_name, default in _option_defaults['install']: + setattr(self, opt_name, default) + + def finalize_options(self): + """ Finalize options """ + _install.install.finalize_options(self) + if _option_inherits.has_key('install'): + for parent, opt_name in _option_inherits['install']: + self.set_undefined_options(parent, (opt_name, opt_name)) + if _option_finalizers.has_key('install'): + for func in _option_finalizers['install'].values(): + func(self) + + +class InstallData(_install_data.install_data): + """ Extended data installer """ + user_options = _install_data.install_data.user_options + [] + boolean_options = _install_data.install_data.boolean_options + [] + + def initialize_options(self): + """ Prepare for new options """ + _install_data.install_data.initialize_options(self) + if _option_defaults.has_key('install_data'): + for opt_name, default in _option_defaults['install_data']: + setattr(self, opt_name, default) + + def finalize_options(self): + """ Finalize options """ + _install_data.install_data.finalize_options(self) + if _option_inherits.has_key('install_data'): + for parent, opt_name in _option_inherits['install_data']: + self.set_undefined_options(parent, (opt_name, opt_name)) + if _option_finalizers.has_key('install_data'): + for func in _option_finalizers['install_data'].values(): + func(self) + + +class InstallLib(_install_lib.install_lib): + """ Extended lib installer """ + user_options = _install_lib.install_lib.user_options + [] + boolean_options = _install_lib.install_lib.boolean_options + [] + + def initialize_options(self): + """ Prepare for new options """ + _install_lib.install_lib.initialize_options(self) + if _option_defaults.has_key('install_lib'): + for opt_name, default in _option_defaults['install_lib']: + setattr(self, opt_name, default) + + def finalize_options(self): + """ Finalize options """ + _install_lib.install_lib.finalize_options(self) + if _option_inherits.has_key('install_lib'): + for parent, opt_name in _option_inherits['install_lib']: + self.set_undefined_options(parent, (opt_name, opt_name)) + if _option_finalizers.has_key('install_lib'): + for func in _option_finalizers['install_lib'].values(): + func(self) + + +class BuildExt(_build_ext.build_ext): + """ + Extended extension builder class + + This class allows extensions to provide a ``check_prerequisites`` method + which is called before actually building it. The method takes the + `BuildExt` instance and returns whether the extension should be skipped or + not. + """ + + def initialize_options(self): + """ Prepare for new options """ + _build_ext.build_ext.initialize_options(self) + if _option_defaults.has_key('build_ext'): + for opt_name, default in _option_defaults['build_ext']: + setattr(self, opt_name, default) + + def finalize_options(self): + """ Finalize options """ + _build_ext.build_ext.finalize_options(self) + if _option_inherits.has_key('build_ext'): + for parent, opt_name in _option_inherits['build_ext']: + self.set_undefined_options(parent, (opt_name, opt_name)) + if _option_finalizers.has_key('build_ext'): + for func in _option_finalizers['build_ext'].values(): + func(self) + + def build_extension(self, ext): + """ + Build C extension - with extended functionality + + The following features are added here: + + - ``ext.check_prerequisites`` is called before the extension is being + built. See `Extension` for details. If the method does not exist, + simply no check will be run. + - The macros ``EXT_PACKAGE`` and ``EXT_MODULE`` will be filled (or + unset) depending on the extensions name, but only if they are not + already defined. + + :Parameters: + `ext` : `Extension` + The extension to build. If it's a pure + ``distutils.core.Extension``, simply no prequisites check is + applied. + + :Return: whatever ``distutils.command.build_ext.build_ext`` returns + :Rtype: any + """ + # handle name macros + macros = dict(ext.define_macros or ()) + tup = ext.name.split('.') + if len(tup) == 1: + pkg, mod = None, tup[0] + else: + pkg, mod = '.'.join(tup[:-1]), tup[-1] + if pkg is not None and 'EXT_PACKAGE' not in macros: + ext.define_macros.append(('EXT_PACKAGE', pkg)) + if 'EXT_MODULE' not in macros: + ext.define_macros.append(('EXT_MODULE', mod)) + if pkg is None: + macros = dict(ext.undef_macros or ()) + if 'EXT_PACKAGE' not in macros: + ext.undef_macros.append('EXT_PACKAGE') + + # handle prereq checks + try: + checker = ext.check_prerequisites + except AttributeError: + pass + else: + if checker(self): + log.info("Skipping %s extension" % ext.name) + return + + return _build_ext.build_ext.build_extension(self, ext) + + +class Build(_build.build): + + def initialize_options(self): + """ Prepare for new options """ + _build.build.initialize_options(self) + if _option_defaults.has_key('build'): + for opt_name, default in _option_defaults['build']: + setattr(self, opt_name, default) + + def finalize_options(self): + """ Finalize options """ + _build.build.finalize_options(self) + if _option_inherits.has_key('build'): + for parent, opt_name in _option_inherits['build']: + self.set_undefined_options(parent, (opt_name, opt_name)) + if _option_finalizers.has_key('build'): + for func in _option_finalizers['build'].values(): + func(self) diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/data.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/data.py new file mode 100644 index 00000000000..9cf04e104c2 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/data.py @@ -0,0 +1,165 @@ +# -*- coding: ascii -*- +# +# Copyright 2007, 2008, 2009, 2010, 2011 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +=================== + Data distribution +=================== + +This module provides tools to simplify data distribution. +""" +__author__ = u"Andr\xe9 Malo" +__docformat__ = "restructuredtext en" + +from distutils import filelist as _filelist +import os as _os +import posixpath as _posixpath +import sys as _sys + +from _setup import commands as _commands + + +def splitpath(path): + """ Split a path """ + drive, path = '', _os.path.normpath(path) + try: + splitunc = _os.path.splitunc + except AttributeError: + pass + else: + drive, path = splitunc(path) + if not drive: + drive, path = _os.path.splitdrive(path) + elems = [] + try: + sep = _os.path.sep + except AttributeError: + sep = _os.path.join('1', '2')[1:-1] + while 1: + prefix, path = _os.path.split(path) + elems.append(path) + if prefix in ('', sep): + drive = _os.path.join(drive, prefix) + break + path = prefix + elems.reverse() + return drive, elems + + +def finalizer(installer): + """ Finalize install_data """ + data_files = [] + for item in installer.data_files: + if not isinstance(item, Data): + data_files.append(item) + continue + data_files.extend(item.flatten(installer)) + installer.data_files = data_files + + +class Data(object): + """ File list container """ + + def __init__(self, files, target=None, preserve=0, strip=0, + prefix=None): + """ Initialization """ + self._files = files + self._target = target + self._preserve = preserve + self._strip = strip + self._prefix = prefix + self.fixup_commands() + + def fixup_commands(self): + pass + + def from_templates(cls, *templates, **kwargs): + """ Initialize from template """ + files = _filelist.FileList() + for tpl in templates: + for line in tpl.split(';'): + files.process_template_line(line.strip()) + files.sort() + files.remove_duplicates() + result = [] + for filename in files.files: + _, elems = splitpath(filename) + if '.svn' in elems or '.git' in elems: + continue + result.append(filename) + return cls(result, **kwargs) + from_templates = classmethod(from_templates) + + def flatten(self, installer): + """ Flatten the file list to (target, file) tuples """ + # pylint: disable = W0613 + if self._prefix: + _, prefix = splitpath(self._prefix) + telems = prefix + else: + telems = [] + + tmap = {} + for fname in self._files: + (_, name), target = splitpath(fname), telems + if self._preserve: + if self._strip: + name = name[max(0, min(self._strip, len(name) - 1)):] + if len(name) > 1: + target = telems + name[:-1] + tmap.setdefault(_posixpath.join(*target), []).append(fname) + return tmap.items() + + +class Documentation(Data): + """ Documentation container """ + + def fixup_commands(self): + _commands.add_option('install_data', 'without-docs', + help_text='Do not install documentation files', + inherit='install', + ) + _commands.add_finalizer('install_data', 'documentation', finalizer) + + def flatten(self, installer): + """ Check if docs should be installed at all """ + if installer.without_docs: + return [] + return Data.flatten(self, installer) + + +class Manpages(Documentation): + """ Manpages container """ + + def dispatch(cls, files): + """ Automatically dispatch manpages to their target directories """ + mpmap = {} + for manpage in files: + normalized = _os.path.normpath(manpage) + _, ext = _os.path.splitext(normalized) + if ext.startswith(_os.path.extsep): + ext = ext[len(_os.path.extsep):] + mpmap.setdefault(ext, []).append(manpage) + return [cls(manpages, prefix=_posixpath.join( + 'share', 'man', 'man%s' % section, + )) for section, manpages in mpmap.items()] + dispatch = classmethod(dispatch) + + def flatten(self, installer): + """ Check if manpages are suitable """ + if _sys.platform == 'win32': + return [] + return Documentation.flatten(self, installer) diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/dist.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/dist.py new file mode 100644 index 00000000000..21a65415185 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/dist.py @@ -0,0 +1,51 @@ +# -*- coding: ascii -*- +# +# Copyright 2007, 2008, 2009, 2010, 2011 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +================ + dist utilities +================ + +dist utilities. +""" +__author__ = u"Andr\xe9 Malo" +__docformat__ = "restructuredtext en" + +import sys as _sys + +from _setup import shell as _shell + + +def run_setup(*args, **kwargs): + """ Run setup """ + if 'setup' in kwargs: + script = kwargs.get('setup') or 'setup.py' + del kwargs['setup'] + else: + script = 'setup.py' + if 'fakeroot' in kwargs: + fakeroot = kwargs['fakeroot'] + del kwargs['fakeroot'] + else: + fakeroot = None + if kwargs: + raise TypeError("Unrecognized keyword parameters") + + script = _shell.native(script) + argv = [_sys.executable, script] + list(args) + if fakeroot: + argv.insert(0, fakeroot) + return not _shell.spawn(*argv) diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/ext.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/ext.py new file mode 100644 index 00000000000..bcc0209a53a --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/ext.py @@ -0,0 +1,254 @@ +# -*- coding: ascii -*- +# +# Copyright 2007, 2008, 2009, 2010, 2011 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +=================== + C extension tools +=================== + +C extension tools. +""" +__author__ = u"Andr\xe9 Malo" +__docformat__ = "restructuredtext en" +__test__ = False + +from distutils import core as _core +from distutils import errors as _distutils_errors +import os as _os +import posixpath as _posixpath +import shutil as _shutil +import tempfile as _tempfile + +from _setup import commands as _commands +from _setup.util import log + + +def _install_finalizer(installer): + if installer.without_c_extensions: + installer.distribution.ext_modules = [] + +def _build_finalizer(builder): + if builder.without_c_extensions: + builder.extensions = [] + + +class Extension(_core.Extension): + """ + Extension with prerequisite check interface + + If your check is cacheable (during the setup run), override + `cached_check_prerequisites`, `check_prerequisites` otherwise. + + :IVariables: + `cached_check` : ``bool`` + The cached check result + """ + cached_check = None + + def __init__(self, *args, **kwargs): + """ Initialization """ + if kwargs.has_key('depends'): + self.depends = kwargs['depends'] or [] + else: + self.depends = [] + _core.Extension.__init__(self, *args, **kwargs) + + # add include path + included = _posixpath.join('_setup', 'include') + if included not in self.include_dirs: + self.include_dirs.append(included) + + # add cext.h to the dependencies + cext_h = _posixpath.join(included, 'cext.h') + if cext_h not in self.depends: + self.depends.append(cext_h) + + _commands.add_option('install_lib', 'without-c-extensions', + help_text='Don\'t install C extensions', + inherit='install', + ) + _commands.add_finalizer('install_lib', 'c-extensions', + _install_finalizer + ) + _commands.add_option('build_ext', 'without-c-extensions', + help_text='Don\'t build C extensions', + inherit=('build', 'install_lib'), + ) + _commands.add_finalizer('build_ext', 'c-extensions', _build_finalizer) + + def check_prerequisites(self, build): + """ + Check prerequisites + + The check should cover all dependencies needed for the extension to + be built and run. The method can do the following: + + - return a false value: the extension will be built + - return a true value: the extension will be skipped. This is useful + for optional extensions + - raise an exception. This is useful for mandatory extensions + + If the check result is cacheable (during the setup run), override + `cached_check_prerequisites` instead. + + :Parameters: + `build` : `BuildExt` + The extension builder + + :Return: Skip the extension? + :Rtype: ``bool`` + """ + if self.cached_check is None: + log.debug("PREREQ check for %s" % self.name) + self.cached_check = self.cached_check_prerequisites(build) + else: + log.debug("PREREQ check for %s (cached)" % self.name) + return self.cached_check + + def cached_check_prerequisites(self, build): + """ + Check prerequisites + + The check should cover all dependencies needed for the extension to + be built and run. The method can do the following: + + - return a false value: the extension will be built + - return a true value: the extension will be skipped. This is useful + for optional extensions + - raise an exception. This is useful for mandatory extensions + + If the check result is *not* cacheable (during the setup run), + override `check_prerequisites` instead. + + :Parameters: + `build` : `BuildExt` + The extension builder + + :Return: Skip the extension? + :Rtype: ``bool`` + """ + # pylint: disable = W0613 + log.debug("Nothing to check for %s!" % self.name) + return False + + +class ConfTest(object): + """ + Single conftest abstraction + + :IVariables: + `_tempdir` : ``str`` + The tempdir created for this test + + `src` : ``str`` + Name of the source file + + `target` : ``str`` + Target filename + + `compiler` : ``CCompiler`` + compiler instance + + `obj` : ``list`` + List of object filenames (``[str, ...]``) + """ + _tempdir = None + + def __init__(self, build, source): + """ + Initialization + + :Parameters: + `build` : ``distuils.command.build_ext.build_ext`` + builder instance + + `source` : ``str`` + Source of the file to compile + """ + self._tempdir = tempdir = _tempfile.mkdtemp() + src = _os.path.join(tempdir, 'conftest.c') + fp = open(src, 'w') + try: + fp.write(source) + finally: + fp.close() + self.src = src + self.compiler = compiler = build.compiler + self.target = _os.path.join(tempdir, 'conftest') + self.obj = compiler.object_filenames([src], output_dir=tempdir) + + def __del__(self): + """ Destruction """ + self.destroy() + + def destroy(self): + """ Destroy the conftest leftovers on disk """ + tempdir, self._tempdir = self._tempdir, None + if tempdir is not None: + _shutil.rmtree(tempdir) + + def compile(self, **kwargs): + """ + Compile the conftest + + :Parameters: + `kwargs` : ``dict`` + Optional keyword parameters for the compiler call + + :Return: Was the compilation successful? + :Rtype: ``bool`` + """ + kwargs['output_dir'] = self._tempdir + try: + self.compiler.compile([self.src], **kwargs) + except _distutils_errors.CompileError: + return False + return True + + def link(self, **kwargs): + r""" + Link the conftest + + Before you can link the conftest objects they need to be `compile`\d. + + :Parameters: + `kwargs` : ``dict`` + Optional keyword parameters for the linker call + + :Return: Was the linking successful? + :Rtype: ``bool`` + """ + try: + self.compiler.link_executable(self.obj, self.target, **kwargs) + except _distutils_errors.LinkError: + return False + return True + + def pipe(self, mode="r"): + r""" + Execute the conftest binary and connect to it using a pipe + + Before you can pipe to or from the conftest binary it needs to + be `link`\ed. + + :Parameters: + `mode` : ``str`` + Pipe mode - r/w + + :Return: The open pipe + :Rtype: ``file`` + """ + return _os.popen(self.compiler.executable_filename(self.target), mode) diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/setup.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/setup.py new file mode 100644 index 00000000000..fd86f62f9bc --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/setup.py @@ -0,0 +1,419 @@ +# -*- coding: ascii -*- +# +# Copyright 2007 - 2013 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +=================== + Main setup runner +=================== + +This module provides a wrapper around the distutils core setup. +""" +__author__ = u"Andr\xe9 Malo" +__docformat__ = "restructuredtext en" + +import ConfigParser as _config_parser +from distutils import core as _core +import os as _os +import posixpath as _posixpath +import sys as _sys + +from _setup import commands as _commands +from _setup import data as _data +from _setup import ext as _ext +from _setup import util as _util +from _setup import shell as _shell + + +def check_python_version(impl, version_min, version_max): + """ Check python version """ + if impl == 'python': + version_info = _sys.version_info + elif impl == 'pypy': + version_info = getattr(_sys, 'pypy_version_info', None) + if not version_info: + return + elif impl == 'jython': + if not 'java' in _sys.platform.lower(): + return + version_info = _sys.version_info + else: + raise AssertionError("impl not in ('python', 'pypy', 'jython')") + + pyversion = map(int, version_info[:3]) + if version_min: + min_required = \ + map(int, '.'.join((version_min, '0.0.0')).split('.')[:3]) + if pyversion < min_required: + raise EnvironmentError("Need at least %s %s (vs. %s)" % ( + impl, version_min, '.'.join(map(str, pyversion)) + )) + if version_max: + max_required = map(int, version_max.split('.')) + max_required[-1] += 1 + if pyversion >= max_required: + raise EnvironmentError("Need at max %s %s (vs. %s)" % ( + impl, + version_max, + '.'.join(map(str, pyversion)) + )) + + +def find_description(docs): + """ + Determine the package description from DESCRIPTION + + :Parameters: + `docs` : ``dict`` + Docs config section + + :Return: Tuple of summary, description and license + (``('summary', 'description', 'license')``) + (all may be ``None``) + :Rtype: ``tuple`` + """ + summary = None + filename = docs.get('meta.summary', 'SUMMARY').strip() + if filename and _os.path.isfile(filename): + fp = open(filename) + try: + try: + summary = fp.read().strip().splitlines()[0].rstrip() + except IndexError: + summary = '' + finally: + fp.close() + + description = None + filename = docs.get('meta.description', 'DESCRIPTION').strip() + if filename and _os.path.isfile(filename): + fp = open(filename) + try: + description = fp.read().rstrip() + finally: + fp.close() + + if summary is None and description: + from docutils import core + summary = core.publish_parts( + source=description, + source_path=filename, + writer_name='html', + )['title'].encode('utf-8') + + return summary, description + + +def find_classifiers(docs): + """ + Determine classifiers from CLASSIFIERS + + :return: List of classifiers (``['classifier', ...]``) + :rtype: ``list`` + """ + filename = docs.get('meta.classifiers', 'CLASSIFIERS').strip() + if filename and _os.path.isfile(filename): + fp = open(filename) + try: + content = fp.read() + finally: + fp.close() + content = [item.strip() for item in content.splitlines()] + return [item for item in content if item and not item.startswith('#')] + return [] + + +def find_provides(docs): + """ + Determine provides from PROVIDES + + :return: List of provides (``['provides', ...]``) + :rtype: ``list`` + """ + filename = docs.get('meta.provides', 'PROVIDES').strip() + if filename and _os.path.isfile(filename): + fp = open(filename) + try: + content = fp.read() + finally: + fp.close() + content = [item.strip() for item in content.splitlines()] + return [item for item in content if item and not item.startswith('#')] + return [] + + +def find_license(docs): + """ + Determine license from LICENSE + + :return: License text + :rtype: ``str`` + """ + filename = docs.get('meta.license', 'LICENSE').strip() + if filename and _os.path.isfile(filename): + fp = open(filename) + try: + return fp.read().rstrip() + finally: + fp.close() + return None + + +def find_packages(manifest): + """ Determine packages and subpackages """ + packages = {} + collect = manifest.get('packages.collect', '').split() + lib = manifest.get('packages.lib', '.') + try: + sep = _os.path.sep + except AttributeError: + sep = _os.path.join('1', '2')[1:-1] + for root in collect: + for dirpath, _, filenames in _shell.walk(_os.path.join(lib, root)): + if dirpath.find('.svn') >= 0 or dirpath.find('.git') >= 0: + continue + if '__init__.py' in filenames: + packages[ + _os.path.normpath(dirpath).replace(sep, '.') + ] = None + packages = packages.keys() + packages.sort() + return packages + + +def find_data(name, docs): + """ Determine data files """ + result = [] + if docs.get('extra', '').strip(): + result.append(_data.Documentation(docs['extra'].split(), + prefix='share/doc/%s' % name, + )) + if docs.get('examples.dir', '').strip(): + tpl = ['recursive-include %s *' % docs['examples.dir']] + if docs.get('examples.ignore', '').strip(): + tpl.extend(["global-exclude %s" % item + for item in docs['examples.ignore'].split() + ]) + strip = int(docs.get('examples.strip', '') or 0) + result.append(_data.Documentation.from_templates(*tpl, **{ + 'strip': strip, + 'prefix': 'share/doc/%s' % name, + 'preserve': 1, + })) + if docs.get('userdoc.dir', '').strip(): + tpl = ['recursive-include %s *' % docs['userdoc.dir']] + if docs.get('userdoc.ignore', '').strip(): + tpl.extend(["global-exclude %s" % item + for item in docs['userdoc.ignore'].split() + ]) + strip = int(docs.get('userdoc.strip', '') or 0) + result.append(_data.Documentation.from_templates(*tpl, **{ + 'strip': strip, + 'prefix': 'share/doc/%s' % name, + 'preserve': 1, + })) + if docs.get('apidoc.dir', '').strip(): + tpl = ['recursive-include %s *' % docs['apidoc.dir']] + if docs.get('apidoc.ignore', '').strip(): + tpl.extend(["global-exclude %s" % item + for item in docs['apidoc.ignore'].split() + ]) + strip = int(docs.get('apidoc.strip', '') or 0) + result.append(_data.Documentation.from_templates(*tpl, **{ + 'strip': strip, + 'prefix': 'share/doc/%s' % name, + 'preserve': 1, + })) + if docs.get('man', '').strip(): + result.extend(_data.Manpages.dispatch(docs['man'].split())) + return result + + +def make_manifest(manifest, config, docs, kwargs): + """ Create file list to pack up """ + # pylint: disable = R0912 + kwargs = kwargs.copy() + kwargs['script_args'] = ['install'] + kwargs['packages'] = list(kwargs.get('packages') or ()) + [ + '_setup', '_setup.py2', '_setup.py3', + ] + list(manifest.get('packages.extra', '').split() or ()) + _core._setup_stop_after = "commandline" + try: + dist = _core.setup(**kwargs) + finally: + _core._setup_stop_after = None + + result = ['MANIFEST', 'PKG-INFO', 'setup.py'] + list(config) + # TODO: work with default values: + for key in ('classifiers', 'description', 'summary', 'provides', + 'license'): + filename = docs.get('meta.' + key, '').strip() + if filename and _os.path.isfile(filename): + result.append(filename) + + cmd = dist.get_command_obj("build_py") + cmd.ensure_finalized() + #from pprint import pprint; pprint(("build_py", cmd.get_source_files())) + for item in cmd.get_source_files(): + result.append(_posixpath.sep.join( + _os.path.normpath(item).split(_os.path.sep) + )) + + cmd = dist.get_command_obj("build_ext") + cmd.ensure_finalized() + #from pprint import pprint; pprint(("build_ext", cmd.get_source_files())) + for item in cmd.get_source_files(): + result.append(_posixpath.sep.join( + _os.path.normpath(item).split(_os.path.sep) + )) + for ext in cmd.extensions: + if ext.depends: + result.extend([_posixpath.sep.join( + _os.path.normpath(item).split(_os.path.sep) + ) for item in ext.depends]) + + cmd = dist.get_command_obj("build_clib") + cmd.ensure_finalized() + if cmd.libraries: + #import pprint; pprint.pprint(("build_clib", cmd.get_source_files())) + for item in cmd.get_source_files(): + result.append(_posixpath.sep.join( + _os.path.normpath(item).split(_os.path.sep) + )) + for lib in cmd.libraries: + if lib[1].get('depends'): + result.extend([_posixpath.sep.join( + _os.path.normpath(item).split(_os.path.sep) + ) for item in lib[1]['depends']]) + + cmd = dist.get_command_obj("build_scripts") + cmd.ensure_finalized() + #import pprint; pprint.pprint(("build_scripts", cmd.get_source_files())) + if cmd.get_source_files(): + for item in cmd.get_source_files(): + result.append(_posixpath.sep.join( + _os.path.normpath(item).split(_os.path.sep) + )) + + cmd = dist.get_command_obj("install_data") + cmd.ensure_finalized() + #from pprint import pprint; pprint(("install_data", cmd.get_inputs())) + try: + strings = basestring + except NameError: + strings = (str, unicode) + + for item in cmd.get_inputs(): + if isinstance(item, strings): + result.append(item) + else: + result.extend(item[1]) + + for item in manifest.get('dist', '').split(): + result.append(item) + if _os.path.isdir(item): + for filename in _shell.files(item): + result.append(filename) + + result = dict([(item, None) for item in result]).keys() + result.sort() + return result + + +def run(config=('package.cfg',), ext=None, script_args=None, manifest_only=0): + """ Main runner """ + if ext is None: + ext = [] + + cfg = _util.SafeConfigParser() + cfg.read(config) + pkg = dict(cfg.items('package')) + python_min = pkg.get('python.min') or None + python_max = pkg.get('python.max') or None + check_python_version('python', python_min, python_max) + pypy_min = pkg.get('pypy.min') or None + pypy_max = pkg.get('pypy.max') or None + check_python_version('pypy', pypy_min, pypy_max) + jython_min = pkg.get('jython.min') or None + jython_max = pkg.get('jython.max') or None + check_python_version('jython', jython_min, jython_max) + + manifest = dict(cfg.items('manifest')) + try: + docs = dict(cfg.items('docs')) + except _config_parser.NoSectionError: + docs = {} + + summary, description = find_description(docs) + scripts = manifest.get('scripts', '').strip() or None + if scripts: + scripts = scripts.split() + modules = manifest.get('modules', '').strip() or None + if modules: + modules = modules.split() + keywords = docs.get('meta.keywords', '').strip() or None + if keywords: + keywords = keywords.split() + revision = pkg.get('version.revision', '').strip() + if revision: + revision = "-r%s" % (revision,) + + kwargs = { + 'name': pkg['name'], + 'version': "%s%s" % ( + pkg['version.number'], + ["", "-dev%s" % (revision,)][_util.humanbool( + 'version.dev', pkg.get('version.dev', 'false') + )], + ), + 'provides': find_provides(docs), + 'description': summary, + 'long_description': description, + 'classifiers': find_classifiers(docs), + 'keywords': keywords, + 'author': pkg['author.name'], + 'author_email': pkg['author.email'], + 'maintainer': pkg.get('maintainer.name'), + 'maintainer_email': pkg.get('maintainer.email'), + 'url': pkg.get('url.homepage'), + 'download_url': pkg.get('url.download'), + 'license': find_license(docs), + 'package_dir': {'': manifest.get('packages.lib', '.')}, + 'packages': find_packages(manifest), + 'py_modules': modules, + 'ext_modules': ext, + 'scripts': scripts, + 'script_args': script_args, + 'data_files': find_data(pkg['name'], docs), + 'cmdclass': { + 'build' : _commands.Build, + 'build_ext' : _commands.BuildExt, + 'install' : _commands.Install, + 'install_data': _commands.InstallData, + 'install_lib' : _commands.InstallLib, + } + } + for key in ('provides',): + if key not in _core.setup_keywords: + del kwargs[key] + + if manifest_only: + return make_manifest(manifest, config, docs, kwargs) + + # monkey-patch crappy manifest writer away. + from distutils.command import sdist + sdist.sdist.get_file_list = sdist.sdist.read_manifest + + return _core.setup(**kwargs) diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/shell.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/shell.py new file mode 100644 index 00000000000..4eafb9c8647 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/shell.py @@ -0,0 +1,478 @@ +# -*- coding: ascii -*- +# +# Copyright 2007 - 2013 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +================= + Shell utilities +================= + +Shell utilities. +""" +from __future__ import generators + +__author__ = u"Andr\xe9 Malo" +__docformat__ = "restructuredtext en" + +import errno as _errno +import fnmatch as _fnmatch +import os as _os +import shutil as _shutil +import sys as _sys +import tempfile as _tempfile + +cwd = _os.path.dirname(_os.path.abspath(_sys.argv[0])) + +class ExitError(RuntimeError): + """ Exit error """ + def __init__(self, code): + RuntimeError.__init__(self, code) + self.code = code + self.signal = None + + +class SignalError(ExitError): + """ Signal error """ + def __init__(self, code, signal): + ExitError.__init__(self, code) + import signal as _signal + self.signal = signal + for key, val in vars(_signal).iteritems(): + if key.startswith('SIG') and not key.startswith('SIG_'): + if val == signal: + self.signalstr = key[3:] + break + else: + self.signalstr = '%04d' % signal + + +def native(path): + """ Convert slash path to native """ + path = _os.path.sep.join(path.split('/')) + return _os.path.normpath(_os.path.join(cwd, path)) + + +def cp(src, dest): + """ Copy src to dest """ + _shutil.copy2(native(src), native(dest)) + + +def cp_r(src, dest): + """ Copy -r src to dest """ + _shutil.copytree(native(src), native(dest)) + + +def rm(dest): + """ Remove a file """ + try: + _os.unlink(native(dest)) + except OSError, e: + if _errno.ENOENT != e.errno: + raise + +def rm_rf(dest): + """ Remove a tree """ + dest = native(dest) + if _os.path.exists(dest): + for path in files(dest, '*'): + _os.chmod(native(path), 0644) + _shutil.rmtree(dest) + + +try: + mkstemp = _tempfile.mkstemp +except AttributeError: + # helpers stolen from 2.4 tempfile module + try: + import fcntl as _fcntl + except ImportError: + def _set_cloexec(fd): + """ Set close-on-exec (not implemented, but not an error) """ + # pylint: disable = W0613 + pass + else: + def _set_cloexec(fd): + """ Set close-on-exec """ + try: + flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0) + except IOError: + pass + else: + # flags read successfully, modify + flags |= _fcntl.FD_CLOEXEC + _fcntl.fcntl(fd, _fcntl.F_SETFD, flags) + + _text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL + _text_openflags |= getattr(_os, 'O_NOINHERIT', 0) + _text_openflags |= getattr(_os, 'O_NOFOLLOW', 0) + + _bin_openflags = _text_openflags + _bin_openflags |= getattr(_os, 'O_BINARY', 0) + + def mkstemp(suffix="", prefix=_tempfile.gettempprefix(), dir=None, + text=False): + """ Create secure temp file """ + # pylint: disable = W0622 + if dir is None: + dir = _tempfile.gettempdir() + if text: + flags = _text_openflags + else: + flags = _bin_openflags + count = 100 + while count > 0: + j = _tempfile._counter.get_next() # pylint: disable = E1101, W0212 + fname = _os.path.join(dir, prefix + str(j) + suffix) + try: + fd = _os.open(fname, flags, 0600) + except OSError, e: + if e.errno == _errno.EEXIST: + count -= 1 + continue + raise + _set_cloexec(fd) + return fd, _os.path.abspath(fname) + raise IOError, (_errno.EEXIST, "No usable temporary file name found") + + +def _pipespawn(argv, env): + """ Pipe spawn """ + # pylint: disable = R0912 + import pickle as _pickle + fd, name = mkstemp('.py') + try: + _os.write(fd, (r""" +import os +import pickle +try: + import subprocess +except ImportError: + subprocess = None +import sys + +argv = pickle.loads(%(argv)s) +env = pickle.loads(%(env)s) +if 'X_JYTHON_WA_PATH' in env: + env['PATH'] = env['X_JYTHON_WA_PATH'] + +if subprocess is None: + pid = os.spawnve(os.P_NOWAIT, argv[0], argv, env) + result = os.waitpid(pid, 0)[1] +else: + p = subprocess.Popen(argv, env=env) + result = p.wait() + if result < 0: + print "\n%%d 1" %% (-result) + sys.exit(2) + +if result == 0: + sys.exit(0) +signalled = getattr(os, 'WIFSIGNALED', None) +if signalled is not None: + if signalled(result): + print "\n%%d %%d" %% (os.WTERMSIG(result), result & 7) + sys.exit(2) +print "\n%%d" %% (result & 7,) +sys.exit(3) + """.strip() + "\n") % { + 'argv': repr(_pickle.dumps(argv)), + 'env': repr(_pickle.dumps(env)), + }) + fd, _ = None, _os.close(fd) + if _sys.platform == 'win32': + argv = [] + for arg in [_sys.executable, name]: + if ' ' in arg or arg.startswith('"'): + arg = '"%s"' % arg.replace('"', '\\"') + argv.append(arg) + argv = ' '.join(argv) + shell = True + close_fds = False + else: + argv = [_sys.executable, name] + shell = False + close_fds = True + + res = 0 + try: + import subprocess + except ImportError: + import popen2 as _popen2 + proc = _popen2.Popen3(argv, False) + try: + proc.tochild.close() + result = proc.fromchild.read() + finally: + res = proc.wait() + else: + if 'X_JYTHON_WA_PATH' in env: + env['PATH'] = env['X_JYTHON_WA_PATH'] + + proc = subprocess.Popen(argv, + shell=shell, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + close_fds=close_fds, + env=env, + ) + try: + proc.stdin.close() + result = proc.stdout.read() + finally: + res = proc.wait() + if res != 0: + if res == 2: + signal, code = map(int, result.splitlines()[-1].split()) + raise SignalError(code, signal) + elif res == 3: + code = int(result.splitlines()[-1].strip()) + raise ExitError(code) + raise ExitError(res) + + return result + finally: + try: + if fd is not None: + _os.close(fd) + finally: + _os.unlink(name) + + +def _filepipespawn(infile, outfile, argv, env): + """ File Pipe spawn """ + try: + import subprocess + except ImportError: + subprocess = None + import pickle as _pickle + fd, name = mkstemp('.py') + try: + _os.write(fd, (""" +import os +import pickle +import sys + +infile = pickle.loads(%(infile)s) +outfile = pickle.loads(%(outfile)s) +argv = pickle.loads(%(argv)s) +env = pickle.loads(%(env)s) + +if infile is not None: + infile = open(infile, 'rb') + os.dup2(infile.fileno(), 0) + infile.close() +if outfile is not None: + outfile = open(outfile, 'wb') + os.dup2(outfile.fileno(), 1) + outfile.close() + +pid = os.spawnve(os.P_NOWAIT, argv[0], argv, env) +result = os.waitpid(pid, 0)[1] +sys.exit(result & 7) + """.strip() + "\n") % { + 'infile': repr(_pickle.dumps(_os.path.abspath(infile))), + 'outfile': repr(_pickle.dumps(_os.path.abspath(outfile))), + 'argv': repr(_pickle.dumps(argv)), + 'env': repr(_pickle.dumps(env)), + }) + fd, _ = None, _os.close(fd) + if _sys.platform == 'win32': + argv = [] + for arg in [_sys.executable, name]: + if ' ' in arg or arg.startswith('"'): + arg = '"%s"' % arg.replace('"', '\\"') + argv.append(arg) + argv = ' '.join(argv) + close_fds = False + shell = True + else: + argv = [_sys.executable, name] + close_fds = True + shell = False + + if subprocess is None: + pid = _os.spawnve(_os.P_NOWAIT, argv[0], argv, env) + return _os.waitpid(pid, 0)[1] + else: + p = subprocess.Popen( + argv, env=env, shell=shell, close_fds=close_fds + ) + return p.wait() + finally: + try: + if fd is not None: + _os.close(fd) + finally: + _os.unlink(name) + + +def spawn(*argv, **kwargs): + """ Spawn a process """ + try: + import subprocess + except ImportError: + subprocess = None + + if _sys.platform == 'win32': + newargv = [] + for arg in argv: + if not arg or ' ' in arg or arg.startswith('"'): + arg = '"%s"' % arg.replace('"', '\\"') + newargv.append(arg) + argv = newargv + close_fds = False + shell = True + else: + close_fds = True + shell = False + + env = kwargs.get('env') + if env is None: + env = dict(_os.environ) + if 'X_JYTHON_WA_PATH' in env: + env['PATH'] = env['X_JYTHON_WA_PATH'] + + echo = kwargs.get('echo') + if echo: + print ' '.join(argv) + filepipe = kwargs.get('filepipe') + if filepipe: + return _filepipespawn( + kwargs.get('stdin'), kwargs.get('stdout'), argv, env + ) + pipe = kwargs.get('stdout') + if pipe: + return _pipespawn(argv, env) + + if subprocess is None: + pid = _os.spawnve(_os.P_NOWAIT, argv[0], argv, env) + return _os.waitpid(pid, 0)[1] + else: + p = subprocess.Popen(argv, env=env, shell=shell, close_fds=close_fds) + return p.wait() + + +try: + walk = _os.walk +except AttributeError: + # copy from python 2.4 sources (modulo docs and comments) + def walk(top, topdown=True, onerror=None): + """ directory tree walker """ + # pylint: disable = C0103 + join, isdir, islink = _os.path.join, _os.path.isdir, _os.path.islink + listdir, error = _os.listdir, _os.error + + try: + names = listdir(top) + except error, err: + if onerror is not None: + onerror(err) + return + + dirs, nondirs = [], [] + for name in names: + if isdir(join(top, name)): + dirs.append(name) + else: + nondirs.append(name) + + if topdown: + yield top, dirs, nondirs + for name in dirs: + path = join(top, name) + if not islink(path): + for x in walk(path, topdown, onerror): + yield x + if not topdown: + yield top, dirs, nondirs + + +def files(base, wildcard='[!.]*', recursive=1, prune=('.git', '.svn', 'CVS')): + """ Determine a filelist """ + for dirpath, dirnames, filenames in walk(native(base)): + for item in prune: + if item in dirnames: + dirnames.remove(item) + + filenames.sort() + for name in _fnmatch.filter(filenames, wildcard): + dest = _os.path.join(dirpath, name) + if dest.startswith(cwd): + dest = dest.replace(cwd, '', 1) + aslist = [] + head, tail = _os.path.split(dest) + while tail: + aslist.append(tail) + head, tail = _os.path.split(head) + aslist.reverse() + dest = '/'.join(aslist) + yield dest + + if not recursive: + break + dirnames.sort() + + +def dirs(base, wildcard='[!.]*', recursive=1, prune=('.git', '.svn', 'CVS')): + """ Determine a filelist """ + for dirpath, dirnames, filenames in walk(native(base)): + for item in prune: + if item in dirnames: + dirnames.remove(item) + + dirnames.sort() + for name in _fnmatch.filter(dirnames, wildcard): + dest = _os.path.join(dirpath, name) + if dest.startswith(cwd): + dest = dest.replace(cwd, '', 1) + aslist = [] + head, tail = _os.path.split(dest) + while tail: + aslist.append(tail) + head, tail = _os.path.split(head) + aslist.reverse() + dest = '/'.join(aslist) + yield dest + + if not recursive: + break + + +def frompath(executable): + """ Find executable in PATH """ + # Based on distutils.spawn.find_executable. + path = _os.environ.get('PATH', '') + paths = [ + _os.path.expanduser(item) + for item in path.split(_os.pathsep) + ] + ext = _os.path.splitext(executable)[1] + exts = [''] + if _sys.platform == 'win32' or _os.name == 'os2': + eext = ['.exe', '.bat', '.py'] + if ext not in eext: + exts.extend(eext) + + for ext in exts: + if not _os.path.isfile(executable + ext): + for path in paths: + fname = _os.path.join(path, executable + ext) + if _os.path.isfile(fname): + # the file exists, we have a shot at spawn working + return fname + else: + return executable + ext + + return None diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/term/__init__.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/term/__init__.py new file mode 100644 index 00000000000..4e50ec37493 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/term/__init__.py @@ -0,0 +1,28 @@ +# -*- coding: ascii -*- +# +# Copyright 2010, 2011 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +===================== + Package _setup.term +===================== + +Terminal tools, not distributed. +""" +__author__ = u"Andr\xe9 Malo" +__docformat__ = "restructuredtext en" + +# pylint: disable = W0611 +from _setup.term._term import terminfo, write, green, red, yellow, announce diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/term/_term.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/term/_term.py new file mode 100644 index 00000000000..72b727c1a95 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/term/_term.py @@ -0,0 +1,115 @@ +# -*- coding: ascii -*- +# +# Copyright 2007, 2008, 2009, 2010, 2011 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +================= + Terminal writer +================= +""" +__author__ = u"Andr\xe9 Malo" +__docformat__ = "restructuredtext en" + +import sys as _sys + + +class _INFO(dict): + """ Terminal info dict """ + + def __init__(self): + """ Initialization """ + dict.__init__(self, { + 'NORMAL': '', + 'BOLD': '', + 'ERASE': '\n', + 'RED': '', + 'YELLOW': '', + 'GREEN': '', + }) + try: + import curses as _curses + except ImportError: + # fixup if a submodule of curses failed. + if 'curses' in _sys.modules: + del _sys.modules['curses'] + else: + try: + _curses.setupterm() + except (TypeError, _curses.error): + pass + else: + def make_color(color): + """ Make color control string """ + seq = _curses.tigetstr('setaf') + if seq is not None: + # XXX may fail - need better logic + seq = seq.replace("%p1", "") % color + return seq + + self['NORMAL'] = _curses.tigetstr('sgr0') + self['BOLD'] = _curses.tigetstr('bold') + + erase = _curses.tigetstr('el1') + if erase is not None: + self['ERASE'] = erase + _curses.tigetstr('cr') + + self['RED'] = make_color(_curses.COLOR_RED) + self['YELLOW'] = make_color(_curses.COLOR_YELLOW) + self['GREEN'] = make_color(_curses.COLOR_GREEN) + + def __getitem__(self, key): + """ Deliver always """ + dict.get(self, key) or "" + + +def terminfo(): + """ Get info singleton """ + # pylint: disable = E1101, W0612 + if terminfo.info is None: + terminfo.info = _INFO() + return terminfo.info +terminfo.info = None + + +def write(fmt, **kwargs): + """ Write stuff on the terminal """ + parm = dict(terminfo()) + parm.update(kwargs) + _sys.stdout.write(fmt % parm) + _sys.stdout.flush() + + +def green(bmt, **kwargs): + """ Write something in green on screen """ + announce("%%(GREEN)s%s%%(NORMAL)s" % bmt, **kwargs) + + +def red(bmt, **kwargs): + """ Write something in red on the screen """ + announce("%%(BOLD)s%%(RED)s%s%%(NORMAL)s" % bmt, **kwargs) + + +def yellow(fmt, **kwargs): + """ Write something in yellow on the screen """ + announce("%%(BOLD)s%%(YELLOW)s%s%%(NORMAL)s" % fmt, **kwargs) + + +def announce(fmt, **kwargs): + """ Announce something """ + write(fmt, **kwargs) + _sys.stdout.write("\n") + _sys.stdout.flush() + + diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/util.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/util.py new file mode 100644 index 00000000000..5c05fac6e4c --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py2/util.py @@ -0,0 +1,73 @@ +# -*- coding: ascii -*- +# +# Copyright 2007, 2008, 2009, 2010, 2011 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +================= + Setup utilities +================= + +Setup utilities. +""" +__author__ = u"Andr\xe9 Malo" +__docformat__ = "restructuredtext en" + +try: + from distutils import log +except ImportError: + class log(object): + def info(self, value): + print value + def debug(self, value): + pass + log = log() + +from distutils import util as _util +try: + from ConfigParser import SafeConfigParser +except ImportError: + import ConfigParser as _config_parser + class SafeConfigParser(_config_parser.ConfigParser): + """ Safe config parser """ + def _interpolate(self, section, option, rawval, vars): + return rawval + + def items(self, section): + return [(key, self.get(section, key)) + for key in self.options(section) + ] + + +def humanbool(name, value): + """ + Determine human boolean value + + :Parameters: + `name` : ``str`` + The config key (used for error message) + + `value` : ``str`` + The config value + + :Return: The boolean value + :Rtype: ``bool`` + + :Exceptions: + - `ValueError` : The value could not be recognized + """ + try: + return _util.strtobool(str(value).strip().lower() or 'no') + except ValueError: + raise ValueError("Unrecognized config value: %s = %s" % (name, value)) diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/__init__.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/__init__.py new file mode 100644 index 00000000000..6139d510a10 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/__init__.py @@ -0,0 +1,27 @@ +# -*- coding: ascii -*- +# +# Copyright 2007, 2008, 2009, 2010, 2011 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +================ + Package _setup +================ + +This package provides tools for main package setup. +""" +__author__ = "Andr\xe9 Malo" +__docformat__ = "restructuredtext en" + +from _setup.setup import run # pylint: disable = W0611 diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/commands.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/commands.py new file mode 100644 index 00000000000..7bfacbc86ef --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/commands.py @@ -0,0 +1,266 @@ +# -*- coding: ascii -*- +# +# Copyright 2007, 2008, 2009, 2010, 2011 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +=================== + Command extenders +=================== + +Command extenders. +""" +__author__ = "Andr\xe9 Malo" +__docformat__ = "restructuredtext en" +__test__ = False + +from distutils import fancy_getopt as _fancy_getopt +from distutils import log +from distutils.command import build as _build +from distutils.command import build_ext as _build_ext +from distutils.command import install as _install +from distutils.command import install_data as _install_data +from distutils.command import install_lib as _install_lib +import os as _os + +_option_defaults = {} +_option_inherits = {} +_option_finalizers = {} +_command_mapping = { + 'install': 'Install', + 'install_data': 'InstallData', + 'install_lib': 'InstallLib', + 'build': 'Build', + 'build_ext': 'BuildExt', +} + + +def add_option(command, long_name, help_text, short_name=None, default=None, + inherit=None): + """ Add an option """ + try: + command_class = globals()[_command_mapping[command]] + except KeyError: + raise ValueError("Unknown command %r" % (command,)) + for opt in command_class.user_options: + if opt[0] == long_name: + break + else: + opt = (long_name, short_name, help_text) + command_class.user_options.append(opt) + if not long_name.endswith('='): + command_class.boolean_options.append(long_name) + attr_name = _fancy_getopt.translate_longopt(long_name) + else: + attr_name = _fancy_getopt.translate_longopt(long_name[:-1]) + if command not in _option_defaults: + _option_defaults[command] = [] + if inherit is not None: + if isinstance(inherit, str): + inherit = [inherit] + for i_inherit in inherit: + add_option( + i_inherit, long_name, help_text, short_name, default + ) + default = None + if command not in _option_inherits: + _option_inherits[command] = [] + for i_inherit in inherit: + for i_command, opt_name in _option_inherits[command]: + if i_command == i_inherit and opt_name == attr_name: + break + else: + _option_inherits[command].append((i_inherit, attr_name)) + _option_defaults[command].append((attr_name, default)) + + +def add_finalizer(command, key, func): + """ Add finalizer """ + if command not in _option_finalizers: + _option_finalizers[command] = {} + if key not in _option_finalizers[command]: + _option_finalizers[command][key] = func + + +class Install(_install.install): + """ Extended installer to reflect the additional data options """ + user_options = _install.install.user_options + [ + ('single-version-externally-managed', None, + "Compat option. Does not a thing."), + ] + boolean_options = _install.install.boolean_options + [ + 'single-version-externally-managed' + ] + + def initialize_options(self): + """ Prepare for new options """ + _install.install.initialize_options(self) + self.single_version_externally_managed = None + if 'install' in _option_defaults: + for opt_name, default in _option_defaults['install']: + setattr(self, opt_name, default) + + def finalize_options(self): + """ Finalize options """ + _install.install.finalize_options(self) + if 'install' in _option_inherits: + for parent, opt_name in _option_inherits['install']: + self.set_undefined_options(parent, (opt_name, opt_name)) + if 'install' in _option_finalizers: + for func in list(_option_finalizers['install'].values()): + func(self) + + +class InstallData(_install_data.install_data): + """ Extended data installer """ + user_options = _install_data.install_data.user_options + [] + boolean_options = _install_data.install_data.boolean_options + [] + + def initialize_options(self): + """ Prepare for new options """ + _install_data.install_data.initialize_options(self) + if 'install_data' in _option_defaults: + for opt_name, default in _option_defaults['install_data']: + setattr(self, opt_name, default) + + def finalize_options(self): + """ Finalize options """ + _install_data.install_data.finalize_options(self) + if 'install_data' in _option_inherits: + for parent, opt_name in _option_inherits['install_data']: + self.set_undefined_options(parent, (opt_name, opt_name)) + if 'install_data' in _option_finalizers: + for func in list(_option_finalizers['install_data'].values()): + func(self) + + +class InstallLib(_install_lib.install_lib): + """ Extended lib installer """ + user_options = _install_lib.install_lib.user_options + [] + boolean_options = _install_lib.install_lib.boolean_options + [] + + def initialize_options(self): + """ Prepare for new options """ + _install_lib.install_lib.initialize_options(self) + if 'install_lib' in _option_defaults: + for opt_name, default in _option_defaults['install_lib']: + setattr(self, opt_name, default) + + def finalize_options(self): + """ Finalize options """ + _install_lib.install_lib.finalize_options(self) + if 'install_lib' in _option_inherits: + for parent, opt_name in _option_inherits['install_lib']: + self.set_undefined_options(parent, (opt_name, opt_name)) + if 'install_lib' in _option_finalizers: + for func in list(_option_finalizers['install_lib'].values()): + func(self) + + +class BuildExt(_build_ext.build_ext): + """ + Extended extension builder class + + This class allows extensions to provide a ``check_prerequisites`` method + which is called before actually building it. The method takes the + `BuildExt` instance and returns whether the extension should be skipped or + not. + """ + + def initialize_options(self): + """ Prepare for new options """ + _build_ext.build_ext.initialize_options(self) + if 'build_ext' in _option_defaults: + for opt_name, default in _option_defaults['build_ext']: + setattr(self, opt_name, default) + + def finalize_options(self): + """ Finalize options """ + _build_ext.build_ext.finalize_options(self) + if 'build_ext' in _option_inherits: + for parent, opt_name in _option_inherits['build_ext']: + self.set_undefined_options(parent, (opt_name, opt_name)) + if 'build_ext' in _option_finalizers: + for func in list(_option_finalizers['build_ext'].values()): + func(self) + + def build_extension(self, ext): + """ + Build C extension - with extended functionality + + The following features are added here: + + - ``ext.check_prerequisites`` is called before the extension is being + built. See `Extension` for details. If the method does not exist, + simply no check will be run. + - The macros ``EXT_PACKAGE`` and ``EXT_MODULE`` will be filled (or + unset) depending on the extensions name, but only if they are not + already defined. + + :Parameters: + `ext` : `Extension` + The extension to build. If it's a pure + ``distutils.core.Extension``, simply no prequisites check is + applied. + + :Return: whatever ``distutils.command.build_ext.build_ext`` returns + :Rtype: any + """ + # handle name macros + macros = dict(ext.define_macros or ()) + tup = ext.name.split('.') + if len(tup) == 1: + pkg, mod = None, tup[0] + else: + pkg, mod = '.'.join(tup[:-1]), tup[-1] + if pkg is not None and 'EXT_PACKAGE' not in macros: + ext.define_macros.append(('EXT_PACKAGE', pkg)) + if 'EXT_MODULE' not in macros: + ext.define_macros.append(('EXT_MODULE', mod)) + if pkg is None: + macros = dict(ext.undef_macros or ()) + if 'EXT_PACKAGE' not in macros: + ext.undef_macros.append('EXT_PACKAGE') + + # handle prereq checks + try: + checker = ext.check_prerequisites + except AttributeError: + pass + else: + if checker(self): + log.info("Skipping %s extension" % ext.name) + return + + return _build_ext.build_ext.build_extension(self, ext) + + +class Build(_build.build): + + def initialize_options(self): + """ Prepare for new options """ + _build.build.initialize_options(self) + if 'build' in _option_defaults: + for opt_name, default in _option_defaults['build']: + setattr(self, opt_name, default) + + def finalize_options(self): + """ Finalize options """ + _build.build.finalize_options(self) + if 'build' in _option_inherits: + for parent, opt_name in _option_inherits['build']: + self.set_undefined_options(parent, (opt_name, opt_name)) + if 'build' in _option_finalizers: + for func in list(_option_finalizers['build'].values()): + func(self) diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/data.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/data.py new file mode 100644 index 00000000000..d4221735768 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/data.py @@ -0,0 +1,165 @@ +# -*- coding: ascii -*- +# +# Copyright 2007, 2008, 2009, 2010, 2011 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +=================== + Data distribution +=================== + +This module provides tools to simplify data distribution. +""" +__author__ = "Andr\xe9 Malo" +__docformat__ = "restructuredtext en" + +from distutils import filelist as _filelist +import os as _os +import posixpath as _posixpath +import sys as _sys + +from _setup import commands as _commands + + +def splitpath(path): + """ Split a path """ + drive, path = '', _os.path.normpath(path) + try: + splitunc = _os.path.splitunc + except AttributeError: + pass + else: + drive, path = splitunc(path) + if not drive: + drive, path = _os.path.splitdrive(path) + elems = [] + try: + sep = _os.path.sep + except AttributeError: + sep = _os.path.join('1', '2')[1:-1] + while 1: + prefix, path = _os.path.split(path) + elems.append(path) + if prefix in ('', sep): + drive = _os.path.join(drive, prefix) + break + path = prefix + elems.reverse() + return drive, elems + + +def finalizer(installer): + """ Finalize install_data """ + data_files = [] + for item in installer.data_files: + if not isinstance(item, Data): + data_files.append(item) + continue + data_files.extend(item.flatten(installer)) + installer.data_files = data_files + + +class Data(object): + """ File list container """ + + def __init__(self, files, target=None, preserve=0, strip=0, + prefix=None): + """ Initialization """ + self._files = files + self._target = target + self._preserve = preserve + self._strip = strip + self._prefix = prefix + self.fixup_commands() + + def fixup_commands(self): + pass + + def from_templates(cls, *templates, **kwargs): + """ Initialize from template """ + files = _filelist.FileList() + for tpl in templates: + for line in tpl.split(';'): + files.process_template_line(line.strip()) + files.sort() + files.remove_duplicates() + result = [] + for filename in files.files: + _, elems = splitpath(filename) + if '.svn' in elems or '.git' in elems: + continue + result.append(filename) + return cls(result, **kwargs) + from_templates = classmethod(from_templates) + + def flatten(self, installer): + """ Flatten the file list to (target, file) tuples """ + # pylint: disable = W0613 + if self._prefix: + _, prefix = splitpath(self._prefix) + telems = prefix + else: + telems = [] + + tmap = {} + for fname in self._files: + (_, name), target = splitpath(fname), telems + if self._preserve: + if self._strip: + name = name[max(0, min(self._strip, len(name) - 1)):] + if len(name) > 1: + target = telems + name[:-1] + tmap.setdefault(_posixpath.join(*target), []).append(fname) + return list(tmap.items()) + + +class Documentation(Data): + """ Documentation container """ + + def fixup_commands(self): + _commands.add_option('install_data', 'without-docs', + help_text='Do not install documentation files', + inherit='install', + ) + _commands.add_finalizer('install_data', 'documentation', finalizer) + + def flatten(self, installer): + """ Check if docs should be installed at all """ + if installer.without_docs: + return [] + return Data.flatten(self, installer) + + +class Manpages(Documentation): + """ Manpages container """ + + def dispatch(cls, files): + """ Automatically dispatch manpages to their target directories """ + mpmap = {} + for manpage in files: + normalized = _os.path.normpath(manpage) + _, ext = _os.path.splitext(normalized) + if ext.startswith(_os.path.extsep): + ext = ext[len(_os.path.extsep):] + mpmap.setdefault(ext, []).append(manpage) + return [cls(manpages, prefix=_posixpath.join( + 'share', 'man', 'man%s' % section, + )) for section, manpages in list(mpmap.items())] + dispatch = classmethod(dispatch) + + def flatten(self, installer): + """ Check if manpages are suitable """ + if _sys.platform == 'win32': + return [] + return Documentation.flatten(self, installer) diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/dist.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/dist.py new file mode 100644 index 00000000000..cce21e57a63 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/dist.py @@ -0,0 +1,51 @@ +# -*- coding: ascii -*- +# +# Copyright 2007, 2008, 2009, 2010, 2011 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +================ + dist utilities +================ + +dist utilities. +""" +__author__ = "Andr\xe9 Malo" +__docformat__ = "restructuredtext en" + +import sys as _sys + +from _setup import shell as _shell + + +def run_setup(*args, **kwargs): + """ Run setup """ + if 'setup' in kwargs: + script = kwargs.get('setup') or 'setup.py' + del kwargs['setup'] + else: + script = 'setup.py' + if 'fakeroot' in kwargs: + fakeroot = kwargs['fakeroot'] + del kwargs['fakeroot'] + else: + fakeroot = None + if kwargs: + raise TypeError("Unrecognized keyword parameters") + + script = _shell.native(script) + argv = [_sys.executable, script] + list(args) + if fakeroot: + argv.insert(0, fakeroot) + return not _shell.spawn(*argv) diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/ext.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/ext.py new file mode 100644 index 00000000000..852c466547e --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/ext.py @@ -0,0 +1,253 @@ +# -*- coding: ascii -*- +# +# Copyright 2007, 2008, 2009, 2010, 2011 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +=================== + C extension tools +=================== + +C extension tools. +""" +__author__ = "Andr\xe9 Malo" +__docformat__ = "restructuredtext en" +__test__ = False + +from distutils import core as _core +from distutils import errors as _distutils_errors +from distutils import log +import os as _os +import posixpath as _posixpath +import shutil as _shutil +import tempfile as _tempfile + +from _setup import commands as _commands + +def _install_finalizer(installer): + if installer.without_c_extensions: + installer.distribution.ext_modules = [] + +def _build_finalizer(builder): + if builder.without_c_extensions: + builder.extensions = [] + + +class Extension(_core.Extension): + """ + Extension with prerequisite check interface + + If your check is cacheable (during the setup run), override + `cached_check_prerequisites`, `check_prerequisites` otherwise. + + :IVariables: + `cached_check` : ``bool`` + The cached check result + """ + cached_check = None + + def __init__(self, *args, **kwargs): + """ Initialization """ + if 'depends' in kwargs: + self.depends = kwargs['depends'] or [] + else: + self.depends = [] + _core.Extension.__init__(self, *args, **kwargs) + + # add include path + included = _posixpath.join('_setup', 'include') + if included not in self.include_dirs: + self.include_dirs.append(included) + + # add cext.h to the dependencies + cext_h = _posixpath.join(included, 'cext.h') + if cext_h not in self.depends: + self.depends.append(cext_h) + + _commands.add_option('install_lib', 'without-c-extensions', + help_text='Don\'t install C extensions', + inherit='install', + ) + _commands.add_finalizer('install_lib', 'c-extensions', + _install_finalizer + ) + _commands.add_option('build_ext', 'without-c-extensions', + help_text='Don\'t build C extensions', + inherit=('build', 'install_lib'), + ) + _commands.add_finalizer('build_ext', 'c-extensions', _build_finalizer) + + def check_prerequisites(self, build): + """ + Check prerequisites + + The check should cover all dependencies needed for the extension to + be built and run. The method can do the following: + + - return a false value: the extension will be built + - return a true value: the extension will be skipped. This is useful + for optional extensions + - raise an exception. This is useful for mandatory extensions + + If the check result is cacheable (during the setup run), override + `cached_check_prerequisites` instead. + + :Parameters: + `build` : `BuildExt` + The extension builder + + :Return: Skip the extension? + :Rtype: ``bool`` + """ + if self.cached_check is None: + log.debug("PREREQ check for %s" % self.name) + self.cached_check = self.cached_check_prerequisites(build) + else: + log.debug("PREREQ check for %s (cached)" % self.name) + return self.cached_check + + def cached_check_prerequisites(self, build): + """ + Check prerequisites + + The check should cover all dependencies needed for the extension to + be built and run. The method can do the following: + + - return a false value: the extension will be built + - return a true value: the extension will be skipped. This is useful + for optional extensions + - raise an exception. This is useful for mandatory extensions + + If the check result is *not* cacheable (during the setup run), + override `check_prerequisites` instead. + + :Parameters: + `build` : `BuildExt` + The extension builder + + :Return: Skip the extension? + :Rtype: ``bool`` + """ + # pylint: disable = W0613 + log.debug("Nothing to check for %s!" % self.name) + return False + + +class ConfTest(object): + """ + Single conftest abstraction + + :IVariables: + `_tempdir` : ``str`` + The tempdir created for this test + + `src` : ``str`` + Name of the source file + + `target` : ``str`` + Target filename + + `compiler` : ``CCompiler`` + compiler instance + + `obj` : ``list`` + List of object filenames (``[str, ...]``) + """ + _tempdir = None + + def __init__(self, build, source): + """ + Initialization + + :Parameters: + `build` : ``distuils.command.build_ext.build_ext`` + builder instance + + `source` : ``str`` + Source of the file to compile + """ + self._tempdir = tempdir = _tempfile.mkdtemp() + src = _os.path.join(tempdir, 'conftest.c') + fp = open(src, 'w', encoding='utf-8') + try: + fp.write(source) + finally: + fp.close() + self.src = src + self.compiler = compiler = build.compiler + self.target = _os.path.join(tempdir, 'conftest') + self.obj = compiler.object_filenames([src], output_dir=tempdir) + + def __del__(self): + """ Destruction """ + self.destroy() + + def destroy(self): + """ Destroy the conftest leftovers on disk """ + tempdir, self._tempdir = self._tempdir, None + if tempdir is not None: + _shutil.rmtree(tempdir) + + def compile(self, **kwargs): + """ + Compile the conftest + + :Parameters: + `kwargs` : ``dict`` + Optional keyword parameters for the compiler call + + :Return: Was the compilation successful? + :Rtype: ``bool`` + """ + kwargs['output_dir'] = self._tempdir + try: + self.compiler.compile([self.src], **kwargs) + except _distutils_errors.CompileError: + return False + return True + + def link(self, **kwargs): + r""" + Link the conftest + + Before you can link the conftest objects they need to be `compile`\d. + + :Parameters: + `kwargs` : ``dict`` + Optional keyword parameters for the linker call + + :Return: Was the linking successful? + :Rtype: ``bool`` + """ + try: + self.compiler.link_executable(self.obj, self.target, **kwargs) + except _distutils_errors.LinkError: + return False + return True + + def pipe(self, mode="r"): + r""" + Execute the conftest binary and connect to it using a pipe + + Before you can pipe to or from the conftest binary it needs to + be `link`\ed. + + :Parameters: + `mode` : ``str`` + Pipe mode - r/w + + :Return: The open pipe + :Rtype: ``file`` + """ + return _os.popen(self.compiler.executable_filename(self.target), mode) diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/setup.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/setup.py new file mode 100644 index 00000000000..83f1c21d544 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/setup.py @@ -0,0 +1,420 @@ +# -*- coding: ascii -*- +# +# Copyright 2007 - 2013 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +=================== + Main setup runner +=================== + +This module provides a wrapper around the distutils core setup. +""" +__author__ = "Andr\xe9 Malo" +__docformat__ = "restructuredtext en" + +import configparser as _config_parser +from distutils import core as _core +import os as _os +import posixpath as _posixpath +import sys as _sys + +from _setup import commands as _commands +from _setup import data as _data +from _setup import ext as _ext +from _setup import util as _util +from _setup import shell as _shell + + +def check_python_version(impl, version_min, version_max): + """ Check python version """ + if impl == 'python': + version_info = _sys.version_info + elif impl == 'pypy': + version_info = getattr(_sys, 'pypy_version_info', None) + if not version_info: + return + elif impl == 'jython': + if not 'java' in _sys.platform.lower(): + return + version_info = _sys.version_info + else: + raise AssertionError("impl not in ('python', 'pypy', 'jython')") + + pyversion = list(map(int, version_info[:3])) + if version_min: + min_required = list( + map(int, '.'.join((version_min, '0.0.0')).split('.')[:3]) + ) + if pyversion < min_required: + raise EnvironmentError("Need at least %s %s (vs. %s)" % ( + impl, version_min, '.'.join(map(str, pyversion)) + )) + if version_max: + max_required = list(map(int, version_max.split('.'))) + max_required[-1] += 1 + if pyversion >= max_required: + raise EnvironmentError("Need at max %s %s (vs. %s)" % ( + impl, + version_max, + '.'.join(map(str, pyversion)) + )) + + +def find_description(docs): + """ + Determine the package description from DESCRIPTION + + :Parameters: + `docs` : ``dict`` + Docs config section + + :Return: Tuple of summary, description and license + (``('summary', 'description', 'license')``) + (all may be ``None``) + :Rtype: ``tuple`` + """ + summary = None + filename = docs.get('meta.summary', 'SUMMARY').strip() + if filename and _os.path.isfile(filename): + fp = open(filename, encoding='utf-8') + try: + try: + summary = fp.read().strip().splitlines()[0].rstrip() + except IndexError: + summary = '' + finally: + fp.close() + + description = None + filename = docs.get('meta.description', 'DESCRIPTION').strip() + if filename and _os.path.isfile(filename): + fp = open(filename, encoding='utf-8') + try: + description = fp.read().rstrip() + finally: + fp.close() + + if summary is None and description: + from docutils import core + summary = core.publish_parts( + source=description, + source_path=filename, + writer_name='html', + )['title'].encode('utf-8') + + return summary, description + + +def find_classifiers(docs): + """ + Determine classifiers from CLASSIFIERS + + :return: List of classifiers (``['classifier', ...]``) + :rtype: ``list`` + """ + filename = docs.get('meta.classifiers', 'CLASSIFIERS').strip() + if filename and _os.path.isfile(filename): + fp = open(filename, encoding='utf-8') + try: + content = fp.read() + finally: + fp.close() + content = [item.strip() for item in content.splitlines()] + return [item for item in content if item and not item.startswith('#')] + return [] + + +def find_provides(docs): + """ + Determine provides from PROVIDES + + :return: List of provides (``['provides', ...]``) + :rtype: ``list`` + """ + filename = docs.get('meta.provides', 'PROVIDES').strip() + if filename and _os.path.isfile(filename): + fp = open(filename, encoding='utf-8') + try: + content = fp.read() + finally: + fp.close() + content = [item.strip() for item in content.splitlines()] + return [item for item in content if item and not item.startswith('#')] + return [] + + +def find_license(docs): + """ + Determine license from LICENSE + + :return: License text + :rtype: ``str`` + """ + filename = docs.get('meta.license', 'LICENSE').strip() + if filename and _os.path.isfile(filename): + fp = open(filename, encoding='utf-8') + try: + return fp.read().rstrip() + finally: + fp.close() + return None + + +def find_packages(manifest): + """ Determine packages and subpackages """ + packages = {} + collect = manifest.get('packages.collect', '').split() + lib = manifest.get('packages.lib', '.') + try: + sep = _os.path.sep + except AttributeError: + sep = _os.path.join('1', '2')[1:-1] + for root in collect: + for dirpath, _, filenames in _shell.walk(_os.path.join(lib, root)): + if dirpath.find('.svn') >= 0 or dirpath.find('.git') >= 0: + continue + if '__init__.py' in filenames: + packages[ + _os.path.normpath(dirpath).replace(sep, '.') + ] = None + packages = list(packages.keys()) + packages.sort() + return packages + + +def find_data(name, docs): + """ Determine data files """ + result = [] + if docs.get('extra', '').strip(): + result.append(_data.Documentation(docs['extra'].split(), + prefix='share/doc/%s' % name, + )) + if docs.get('examples.dir', '').strip(): + tpl = ['recursive-include %s *' % docs['examples.dir']] + if docs.get('examples.ignore', '').strip(): + tpl.extend(["global-exclude %s" % item + for item in docs['examples.ignore'].split() + ]) + strip = int(docs.get('examples.strip', '') or 0) + result.append(_data.Documentation.from_templates(*tpl, **{ + 'strip': strip, + 'prefix': 'share/doc/%s' % name, + 'preserve': 1, + })) + if docs.get('userdoc.dir', '').strip(): + tpl = ['recursive-include %s *' % docs['userdoc.dir']] + if docs.get('userdoc.ignore', '').strip(): + tpl.extend(["global-exclude %s" % item + for item in docs['userdoc.ignore'].split() + ]) + strip = int(docs.get('userdoc.strip', '') or 0) + result.append(_data.Documentation.from_templates(*tpl, **{ + 'strip': strip, + 'prefix': 'share/doc/%s' % name, + 'preserve': 1, + })) + if docs.get('apidoc.dir', '').strip(): + tpl = ['recursive-include %s *' % docs['apidoc.dir']] + if docs.get('apidoc.ignore', '').strip(): + tpl.extend(["global-exclude %s" % item + for item in docs['apidoc.ignore'].split() + ]) + strip = int(docs.get('apidoc.strip', '') or 0) + result.append(_data.Documentation.from_templates(*tpl, **{ + 'strip': strip, + 'prefix': 'share/doc/%s' % name, + 'preserve': 1, + })) + if docs.get('man', '').strip(): + result.extend(_data.Manpages.dispatch(docs['man'].split())) + return result + + +def make_manifest(manifest, config, docs, kwargs): + """ Create file list to pack up """ + # pylint: disable = R0912 + kwargs = kwargs.copy() + kwargs['script_args'] = ['install'] + kwargs['packages'] = list(kwargs.get('packages') or ()) + [ + '_setup', '_setup.py2', '_setup.py3', + ] + list(manifest.get('packages.extra', '').split() or ()) + _core._setup_stop_after = "commandline" + try: + dist = _core.setup(**kwargs) + finally: + _core._setup_stop_after = None + + result = ['MANIFEST', 'PKG-INFO', 'setup.py'] + list(config) + # TODO: work with default values: + for key in ('classifiers', 'description', 'summary', 'provides', + 'license'): + filename = docs.get('meta.' + key, '').strip() + if filename and _os.path.isfile(filename): + result.append(filename) + + cmd = dist.get_command_obj("build_py") + cmd.ensure_finalized() + #from pprint import pprint; pprint(("build_py", cmd.get_source_files())) + for item in cmd.get_source_files(): + result.append(_posixpath.sep.join( + _os.path.normpath(item).split(_os.path.sep) + )) + + cmd = dist.get_command_obj("build_ext") + cmd.ensure_finalized() + #from pprint import pprint; pprint(("build_ext", cmd.get_source_files())) + for item in cmd.get_source_files(): + result.append(_posixpath.sep.join( + _os.path.normpath(item).split(_os.path.sep) + )) + for ext in cmd.extensions: + if ext.depends: + result.extend([_posixpath.sep.join( + _os.path.normpath(item).split(_os.path.sep) + ) for item in ext.depends]) + + cmd = dist.get_command_obj("build_clib") + cmd.ensure_finalized() + if cmd.libraries: + #import pprint; pprint.pprint(("build_clib", cmd.get_source_files())) + for item in cmd.get_source_files(): + result.append(_posixpath.sep.join( + _os.path.normpath(item).split(_os.path.sep) + )) + for lib in cmd.libraries: + if lib[1].get('depends'): + result.extend([_posixpath.sep.join( + _os.path.normpath(item).split(_os.path.sep) + ) for item in lib[1]['depends']]) + + cmd = dist.get_command_obj("build_scripts") + cmd.ensure_finalized() + #import pprint; pprint.pprint(("build_scripts", cmd.get_source_files())) + if cmd.get_source_files(): + for item in cmd.get_source_files(): + result.append(_posixpath.sep.join( + _os.path.normpath(item).split(_os.path.sep) + )) + + cmd = dist.get_command_obj("install_data") + cmd.ensure_finalized() + #from pprint import pprint; pprint(("install_data", cmd.get_inputs())) + try: + strings = str + except NameError: + strings = (str, str) + + for item in cmd.get_inputs(): + if isinstance(item, strings): + result.append(item) + else: + result.extend(item[1]) + + for item in manifest.get('dist', '').split(): + result.append(item) + if _os.path.isdir(item): + for filename in _shell.files(item): + result.append(filename) + + result = list(dict([(item, None) for item in result]).keys()) + result.sort() + return result + + +def run(config=('package.cfg',), ext=None, script_args=None, manifest_only=0): + """ Main runner """ + if ext is None: + ext = [] + + cfg = _util.SafeConfigParser() + cfg.read(config, encoding='utf-8') + pkg = dict(cfg.items('package')) + python_min = pkg.get('python.min') or None + python_max = pkg.get('python.max') or None + check_python_version('python', python_min, python_max) + pypy_min = pkg.get('pypy.min') or None + pypy_max = pkg.get('pypy.max') or None + check_python_version('pypy', pypy_min, pypy_max) + jython_min = pkg.get('jython.min') or None + jython_max = pkg.get('jython.max') or None + check_python_version('jython', jython_min, jython_max) + + manifest = dict(cfg.items('manifest')) + try: + docs = dict(cfg.items('docs')) + except _config_parser.NoSectionError: + docs = {} + + summary, description = find_description(docs) + scripts = manifest.get('scripts', '').strip() or None + if scripts: + scripts = scripts.split() + modules = manifest.get('modules', '').strip() or None + if modules: + modules = modules.split() + keywords = docs.get('meta.keywords', '').strip() or None + if keywords: + keywords = keywords.split() + revision = pkg.get('version.revision', '').strip() + if revision: + revision = "-r%s" % (revision,) + + kwargs = { + 'name': pkg['name'], + 'version': "%s%s" % ( + pkg['version.number'], + ["", "-dev%s" % (revision,)][_util.humanbool( + 'version.dev', pkg.get('version.dev', 'false') + )], + ), + 'provides': find_provides(docs), + 'description': summary, + 'long_description': description, + 'classifiers': find_classifiers(docs), + 'keywords': keywords, + 'author': pkg['author.name'], + 'author_email': pkg['author.email'], + 'maintainer': pkg.get('maintainer.name'), + 'maintainer_email': pkg.get('maintainer.email'), + 'url': pkg.get('url.homepage'), + 'download_url': pkg.get('url.download'), + 'license': find_license(docs), + 'package_dir': {'': manifest.get('packages.lib', '.')}, + 'packages': find_packages(manifest), + 'py_modules': modules, + 'ext_modules': ext, + 'scripts': scripts, + 'script_args': script_args, + 'data_files': find_data(pkg['name'], docs), + 'cmdclass': { + 'build' : _commands.Build, + 'build_ext' : _commands.BuildExt, + 'install' : _commands.Install, + 'install_data': _commands.InstallData, + 'install_lib' : _commands.InstallLib, + } + } + for key in ('provides',): + if key not in _core.setup_keywords: + del kwargs[key] + + if manifest_only: + return make_manifest(manifest, config, docs, kwargs) + + # monkey-patch crappy manifest writer away. + from distutils.command import sdist + sdist.sdist.get_file_list = sdist.sdist.read_manifest + + return _core.setup(**kwargs) diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/shell.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/shell.py new file mode 100644 index 00000000000..91f2ebc5b40 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/shell.py @@ -0,0 +1,351 @@ +# -*- coding: ascii -*- +# +# Copyright 2007 - 2013 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +================= + Shell utilities +================= + +Shell utilities. +""" +__author__ = "Andr\xe9 Malo" +__docformat__ = "restructuredtext en" + +import errno as _errno +import fnmatch as _fnmatch +import os as _os +import shutil as _shutil +import subprocess as _subprocess +import sys as _sys +import tempfile as _tempfile + +cwd = _os.path.dirname(_os.path.abspath(_sys.argv[0])) + +class ExitError(RuntimeError): + """ Exit error """ + def __init__(self, code): + RuntimeError.__init__(self, code) + self.code = code + self.signal = None + + +class SignalError(ExitError): + """ Signal error """ + def __init__(self, code, signal): + ExitError.__init__(self, code) + import signal as _signal + self.signal = signal + for key, val in vars(_signal).items(): + if key.startswith('SIG') and not key.startswith('SIG_'): + if val == signal: + self.signalstr = key[3:] + break + else: + self.signalstr = '%04d' % signal + + +def native(path): + """ Convert slash path to native """ + path = _os.path.sep.join(path.split('/')) + return _os.path.normpath(_os.path.join(cwd, path)) + + +def cp(src, dest): + """ Copy src to dest """ + _shutil.copy2(native(src), native(dest)) + + +def cp_r(src, dest): + """ Copy -r src to dest """ + _shutil.copytree(native(src), native(dest)) + + +def rm(dest): + """ Remove a file """ + try: + _os.unlink(native(dest)) + except OSError as e: + if _errno.ENOENT != e.errno: + raise + +def rm_rf(dest): + """ Remove a tree """ + dest = native(dest) + if _os.path.exists(dest): + for path in files(dest, '*'): + _os.chmod(native(path), 0o644) + _shutil.rmtree(dest) + + +mkstemp = _tempfile.mkstemp + + +def _pipespawn(argv, env): + """ Pipe spawn """ + # pylint: disable = R0912 + import pickle as _pickle + fd, name = mkstemp('.py') + try: + _os.write(fd, ((r""" +import os +import pickle +import subprocess +import sys + +argv = pickle.loads(%(argv)s) +env = pickle.loads(%(env)s) +if 'X_JYTHON_WA_PATH' in env: + env['PATH'] = env['X_JYTHON_WA_PATH'] + +p = subprocess.Popen(argv, env=env) +result = p.wait() +if result < 0: + print("\n%%d 1" %% (-result)) + sys.exit(2) +if result == 0: + sys.exit(0) +print("\n%%d" %% (result & 7,)) +sys.exit(3) + """.strip() + "\n") % { + 'argv': repr(_pickle.dumps(argv)), + 'env': repr(_pickle.dumps(dict(env))), + }).encode('utf-8')) + fd, _ = None, _os.close(fd) + if _sys.platform == 'win32': + argv = [] + for arg in [_sys.executable, name]: + if ' ' in arg or arg.startswith('"'): + arg = '"%s"' % arg.replace('"', '\\"') + argv.append(arg) + argv = ' '.join(argv) + shell = True + close_fds = False + else: + argv = [_sys.executable, name] + shell = False + close_fds = True + + res = 0 + if 'X_JYTHON_WA_PATH' in env: + env['PATH'] = env['X_JYTHON_WA_PATH'] + + proc = _subprocess.Popen(argv, + shell=shell, + stdin=_subprocess.PIPE, + stdout=_subprocess.PIPE, + close_fds=close_fds, + env=env, + ) + try: + proc.stdin.close() + result = proc.stdout.read() + finally: + res = proc.wait() + if res != 0: + if res == 2: + signal, code = list(map(int, result.splitlines()[-1].split())) + raise SignalError(code, signal) + elif res == 3: + code = int(result.splitlines()[-1].strip()) + raise ExitError(code) + raise ExitError(res) + + return result.decode('latin-1') + finally: + try: + if fd is not None: + _os.close(fd) + finally: + _os.unlink(name) + + +def _filepipespawn(infile, outfile, argv, env): + """ File Pipe spawn """ + import pickle as _pickle + fd, name = mkstemp('.py') + try: + _os.write(fd, ((""" +import os +import pickle +import sys + +infile = pickle.loads(%(infile)s) +outfile = pickle.loads(%(outfile)s) +argv = pickle.loads(%(argv)s) +env = pickle.loads(%(env)s) + +if infile is not None: + infile = open(infile, 'rb') + os.dup2(infile.fileno(), 0) + infile.close() +if outfile is not None: + outfile = open(outfile, 'wb') + os.dup2(outfile.fileno(), 1) + outfile.close() + +pid = os.spawnve(os.P_NOWAIT, argv[0], argv, env) +result = os.waitpid(pid, 0)[1] +sys.exit(result & 7) + """.strip() + "\n") % { + 'infile': repr(_pickle.dumps(_os.path.abspath(infile))), + 'outfile': repr(_pickle.dumps(_os.path.abspath(outfile))), + 'argv': repr(_pickle.dumps(argv)), + 'env': repr(_pickle.dumps(env)), + }).encode('utf-8')) + fd, _ = None, _os.close(fd) + if _sys.platform == 'win32': + argv = [] + for arg in [_sys.executable, name]: + if ' ' in arg or arg.startswith('"'): + arg = '"%s"' % arg.replace('"', '\\"') + argv.append(arg) + argv = ' '.join(argv) + close_fds = False + shell = True + else: + argv = [_sys.executable, name] + close_fds = True + shell = False + + p = _subprocess.Popen( + argv, env=env, shell=shell, close_fds=close_fds + ) + return p.wait() + finally: + try: + if fd is not None: + _os.close(fd) + finally: + _os.unlink(name) + + +def spawn(*argv, **kwargs): + """ Spawn a process """ + if _sys.platform == 'win32': + newargv = [] + for arg in argv: + if not arg or ' ' in arg or arg.startswith('"'): + arg = '"%s"' % arg.replace('"', '\\"') + newargv.append(arg) + argv = newargv + close_fds = False + shell = True + else: + close_fds = True + shell = False + + env = kwargs.get('env') + if env is None: + env = dict(_os.environ) + if 'X_JYTHON_WA_PATH' in env: + env['PATH'] = env['X_JYTHON_WA_PATH'] + + echo = kwargs.get('echo') + if echo: + print(' '.join(argv)) + filepipe = kwargs.get('filepipe') + if filepipe: + return _filepipespawn( + kwargs.get('stdin'), kwargs.get('stdout'), argv, env + ) + pipe = kwargs.get('stdout') + if pipe: + return _pipespawn(argv, env) + + p = _subprocess.Popen(argv, env=env, shell=shell, close_fds=close_fds) + return p.wait() + + +walk = _os.walk + + +def files(base, wildcard='[!.]*', recursive=1, prune=('.git', '.svn', 'CVS')): + """ Determine a filelist """ + for dirpath, dirnames, filenames in walk(native(base)): + for item in prune: + if item in dirnames: + dirnames.remove(item) + + filenames.sort() + for name in _fnmatch.filter(filenames, wildcard): + dest = _os.path.join(dirpath, name) + if dest.startswith(cwd): + dest = dest.replace(cwd, '', 1) + aslist = [] + head, tail = _os.path.split(dest) + while tail: + aslist.append(tail) + head, tail = _os.path.split(head) + aslist.reverse() + dest = '/'.join(aslist) + yield dest + + if not recursive: + break + dirnames.sort() + + +def dirs(base, wildcard='[!.]*', recursive=1, prune=('.git', '.svn', 'CVS')): + """ Determine a filelist """ + for dirpath, dirnames, filenames in walk(native(base)): + for item in prune: + if item in dirnames: + dirnames.remove(item) + + dirnames.sort() + for name in _fnmatch.filter(dirnames, wildcard): + dest = _os.path.join(dirpath, name) + if dest.startswith(cwd): + dest = dest.replace(cwd, '', 1) + aslist = [] + head, tail = _os.path.split(dest) + while tail: + aslist.append(tail) + head, tail = _os.path.split(head) + aslist.reverse() + dest = '/'.join(aslist) + yield dest + + if not recursive: + break + + +def frompath(executable): + """ Find executable in PATH """ + # Based on distutils.spawn.find_executable. + path = _os.environ.get('PATH', '') + paths = [ + _os.path.expanduser(item) + for item in path.split(_os.pathsep) + ] + ext = _os.path.splitext(executable)[1] + exts = [''] + if _sys.platform == 'win32' or _os.name == 'os2': + eext = ['.exe', '.bat', '.py'] + if ext not in eext: + exts.extend(eext) + + for ext in exts: + if not _os.path.isfile(executable + ext): + for path in paths: + fname = _os.path.join(path, executable + ext) + if _os.path.isfile(fname): + # the file exists, we have a shot at spawn working + return fname + else: + return executable + ext + + return None diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/term/__init__.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/term/__init__.py new file mode 100644 index 00000000000..5459454514b --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/term/__init__.py @@ -0,0 +1,28 @@ +# -*- coding: ascii -*- +# +# Copyright 2010, 2011 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +===================== + Package _setup.term +===================== + +Terminal tools, not distributed. +""" +__author__ = "Andr\xe9 Malo" +__docformat__ = "restructuredtext en" + +# pylint: disable = W0611 +from _setup.term._term import terminfo, write, green, red, yellow, announce diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/term/_term.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/term/_term.py new file mode 100644 index 00000000000..b94f58e27f1 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/term/_term.py @@ -0,0 +1,116 @@ +# -*- coding: ascii -*- +# +# Copyright 2007, 2008, 2009, 2010, 2011 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +================= + Terminal writer +================= +""" +__author__ = "Andr\xe9 Malo" +__docformat__ = "restructuredtext en" + +import sys as _sys + + +class _INFO(dict): + """ Terminal info dict """ + + def __init__(self): + """ Initialization """ + dict.__init__(self, { + 'NORMAL': '', + 'BOLD': '', + 'ERASE': '\n', + 'RED': '', + 'YELLOW': '', + 'GREEN': '', + }) + try: + import curses as _curses + except ImportError: + # fixup if a submodule of curses failed. + if 'curses' in _sys.modules: + del _sys.modules['curses'] + else: + try: + _curses.setupterm() + except (TypeError, _curses.error): + pass + else: + def make_color(color): + """ Make color control string """ + seq = _curses.tigetstr('setaf').decode('ascii') + if seq is not None: + # XXX may fail - need better logic + seq = seq.replace("%p1", "") % color + return seq + + self['NORMAL'] = _curses.tigetstr('sgr0').decode('ascii') + self['BOLD'] = _curses.tigetstr('bold').decode('ascii') + + erase = _curses.tigetstr('el1').decode('ascii') + if erase is not None: + self['ERASE'] = erase + \ + _curses.tigetstr('cr').decode('ascii') + + self['RED'] = make_color(_curses.COLOR_RED) + self['YELLOW'] = make_color(_curses.COLOR_YELLOW) + self['GREEN'] = make_color(_curses.COLOR_GREEN) + + def __getitem__(self, key): + """ Deliver always """ + dict.get(self, key) or "" + + +def terminfo(): + """ Get info singleton """ + # pylint: disable = E1101, W0612 + if terminfo.info is None: + terminfo.info = _INFO() + return terminfo.info +terminfo.info = None + + +def write(fmt, **kwargs): + """ Write stuff on the terminal """ + parm = dict(terminfo()) + parm.update(kwargs) + _sys.stdout.write(fmt % parm) + _sys.stdout.flush() + + +def green(bmt, **kwargs): + """ Write something in green on screen """ + announce("%%(GREEN)s%s%%(NORMAL)s" % bmt, **kwargs) + + +def red(bmt, **kwargs): + """ Write something in red on the screen """ + announce("%%(BOLD)s%%(RED)s%s%%(NORMAL)s" % bmt, **kwargs) + + +def yellow(fmt, **kwargs): + """ Write something in yellow on the screen """ + announce("%%(BOLD)s%%(YELLOW)s%s%%(NORMAL)s" % fmt, **kwargs) + + +def announce(fmt, **kwargs): + """ Announce something """ + write(fmt, **kwargs) + _sys.stdout.write("\n") + _sys.stdout.flush() + + diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/util.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/util.py new file mode 100644 index 00000000000..a07daa812fe --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/_setup/py3/util.py @@ -0,0 +1,63 @@ +# -*- coding: ascii -*- +# +# Copyright 2007, 2008, 2009, 2010, 2011 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +================= + Setup utilities +================= + +Setup utilities. +""" +__author__ = "Andr\xe9 Malo" +__docformat__ = "restructuredtext en" + +from distutils import util as _util +try: + from configparser import SafeConfigParser +except ImportError: + import configparser as _config_parser + class SafeConfigParser(_config_parser.ConfigParser): + """ Safe config parser """ + def _interpolate(self, section, option, rawval, vars): + return rawval + + def items(self, section): + return [(key, self.get(section, key)) + for key in self.options(section) + ] + + +def humanbool(name, value): + """ + Determine human boolean value + + :Parameters: + `name` : ``str`` + The config key (used for error message) + + `value` : ``str`` + The config value + + :Return: The boolean value + :Rtype: ``bool`` + + :Exceptions: + - `ValueError` : The value could not be recognized + """ + try: + return _util.strtobool(str(value).strip().lower() or 'no') + except ValueError: + raise ValueError("Unrecognized config value: %s = %s" % (name, value)) diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/LICENSE.cssmin b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/LICENSE.cssmin new file mode 100644 index 00000000000..c10ccb05c7a --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/LICENSE.cssmin @@ -0,0 +1,64 @@ +`cssmin.py` - A Python port of the YUI CSS compressor. + +Copyright (c) 2010 Zachary Voase + +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. + +------------------------------------------------------------------------------- + +This software contains portions of the YUI CSS Compressor, notably some regular +expressions for reducing the size of CSS. The YUI Compressor source code can be +found at <http://github.com/yui/yuicompressor>, and is licensed as follows: + +> YUI Compressor Copyright License Agreement (BSD License) +> +> Copyright (c) 2009, Yahoo! Inc. +> All rights reserved. +> +> Redistribution and use of this software in source and binary forms, +> with or without modification, are permitted provided that the following +> conditions are met: +> +> * Redistributions of source code must retain the above +> copyright notice, this list of conditions and the +> following disclaimer. +> +> * Redistributions in binary form must reproduce the above +> copyright notice, this list of conditions and the +> following disclaimer in the documentation and/or other +> materials provided with the distribution. +> +> * Neither the name of Yahoo! Inc. nor the names of its +> contributors may be used to endorse or promote products +> derived from this software without specific prior +> written permission of Yahoo! Inc. +> +> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +> AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +> IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +> DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +> FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +> DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +> SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +> OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +> OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/__init__.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/__init__.py new file mode 100644 index 00000000000..705dd0ccd1b --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/__init__.py @@ -0,0 +1,30 @@ +# -*- coding: ascii -*- +r""" +================================= + Benchmark cssmin implementations +================================= + +Benchmark cssmin implementations. + +:Copyright: + + Copyright 2011 - 2014 + Andr\xe9 Malo or his licensors, as applicable + +:License: + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +""" +if __doc__: + __doc__ = __doc__.encode('ascii').decode('unicode_escape') diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/cssmin.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/cssmin.py new file mode 100644 index 00000000000..cbfbf8d4966 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/cssmin.py @@ -0,0 +1,246 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +"""`cssmin` - A Python port of the YUI CSS compressor. + +:Copyright: + + Copyright 2011 - 2014 + Andr\xe9 Malo or his licensors, as applicable + +:License: + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +""" + +try: + from StringIO import StringIO # The pure-Python StringIO supports unicode. +except ImportError: + from io import StringIO +import re + + +__version__ = '0.2.0' + + +def remove_comments(css): + """Remove all CSS comment blocks.""" + + iemac = False + preserve = False + comment_start = css.find("/*") + while comment_start >= 0: + # Preserve comments that look like `/*!...*/`. + # Slicing is used to make sure we don"t get an IndexError. + preserve = css[comment_start + 2:comment_start + 3] == "!" + + comment_end = css.find("*/", comment_start + 2) + if comment_end < 0: + if not preserve: + css = css[:comment_start] + break + elif comment_end >= (comment_start + 2): + if css[comment_end - 1] == "\\": + # This is an IE Mac-specific comment; leave this one and the + # following one alone. + comment_start = comment_end + 2 + iemac = True + elif iemac: + comment_start = comment_end + 2 + iemac = False + elif not preserve: + css = css[:comment_start] + css[comment_end + 2:] + else: + comment_start = comment_end + 2 + comment_start = css.find("/*", comment_start) + + return css + + +def remove_unnecessary_whitespace(css): + """Remove unnecessary whitespace characters.""" + + def pseudoclasscolon(css): + + """ + Prevents 'p :link' from becoming 'p:link'. + + Translates 'p :link' into 'p ___PSEUDOCLASSCOLON___link'; this is + translated back again later. + """ + + regex = re.compile(r"(^|\})(([^\{\:])+\:)+([^\{]*\{)") + match = regex.search(css) + while match: + css = ''.join([ + css[:match.start()], + match.group().replace(":", "___PSEUDOCLASSCOLON___"), + css[match.end():]]) + match = regex.search(css) + return css + + css = pseudoclasscolon(css) + # Remove spaces from before things. + css = re.sub(r"\s+([!{};:>+\(\)\],])", r"\1", css) + + # If there is a `@charset`, then only allow one, and move to the beginning. + css = re.sub(r"^(.*)(@charset \"[^\"]*\";)", r"\2\1", css) + css = re.sub(r"^(\s*@charset [^;]+;\s*)+", r"\1", css) + + # Put the space back in for a few cases, such as `@media screen` and + # `(-webkit-min-device-pixel-ratio:0)`. + css = re.sub(r"\band\(", "and (", css) + + # Put the colons back. + css = css.replace('___PSEUDOCLASSCOLON___', ':') + + # Remove spaces from after things. + css = re.sub(r"([!{}:;>+\(\[,])\s+", r"\1", css) + + return css + + +def remove_unnecessary_semicolons(css): + """Remove unnecessary semicolons.""" + + return re.sub(r";+\}", "}", css) + + +def remove_empty_rules(css): + """Remove empty rules.""" + + return re.sub(r"[^\}\{]+\{\}", "", css) + + +def normalize_rgb_colors_to_hex(css): + """Convert `rgb(51,102,153)` to `#336699`.""" + + regex = re.compile(r"rgb\s*\(\s*([0-9,\s]+)\s*\)") + match = regex.search(css) + while match: + colors = map(lambda s: s.strip(), match.group(1).split(",")) + hexcolor = '#%.2x%.2x%.2x' % tuple(map(int, colors)) + css = css.replace(match.group(), hexcolor) + match = regex.search(css) + return css + + +def condense_zero_units(css): + """Replace `0(px, em, %, etc)` with `0`.""" + + return re.sub(r"([\s:])(0)(px|em|%|in|cm|mm|pc|pt|ex)", r"\1\2", css) + + +def condense_multidimensional_zeros(css): + """Replace `:0 0 0 0;`, `:0 0 0;` etc. with `:0;`.""" + + css = css.replace(":0 0 0 0;", ":0;") + css = css.replace(":0 0 0;", ":0;") + css = css.replace(":0 0;", ":0;") + + # Revert `background-position:0;` to the valid `background-position:0 0;`. + css = css.replace("background-position:0;", "background-position:0 0;") + + return css + + +def condense_floating_points(css): + """Replace `0.6` with `.6` where possible.""" + + return re.sub(r"(:|\s)0+\.(\d+)", r"\1.\2", css) + + +def condense_hex_colors(css): + """Shorten colors from #AABBCC to #ABC where possible.""" + + regex = re.compile(r"([^\"'=\s])(\s*)#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])") + match = regex.search(css) + while match: + first = match.group(3) + match.group(5) + match.group(7) + second = match.group(4) + match.group(6) + match.group(8) + if first.lower() == second.lower(): + css = css.replace(match.group(), match.group(1) + match.group(2) + '#' + first) + match = regex.search(css, match.end() - 3) + else: + match = regex.search(css, match.end()) + return css + + +def condense_whitespace(css): + """Condense multiple adjacent whitespace characters into one.""" + + return re.sub(r"\s+", " ", css) + + +def condense_semicolons(css): + """Condense multiple adjacent semicolon characters into one.""" + + return re.sub(r";;+", ";", css) + + +def wrap_css_lines(css, line_length): + """Wrap the lines of the given CSS to an approximate length.""" + + lines = [] + line_start = 0 + for i, char in enumerate(css): + # It's safe to break after `}` characters. + if char == '}' and (i - line_start >= line_length): + lines.append(css[line_start:i + 1]) + line_start = i + 1 + + if line_start < len(css): + lines.append(css[line_start:]) + return '\n'.join(lines) + + +def cssmin(css, wrap=None): + css = remove_comments(css) + css = condense_whitespace(css) + # A pseudo class for the Box Model Hack + # (see http://tantek.com/CSS/Examples/boxmodelhack.html) + css = css.replace('"\\"}\\""', "___PSEUDOCLASSBMH___") + css = remove_unnecessary_whitespace(css) + css = remove_unnecessary_semicolons(css) + css = condense_zero_units(css) + css = condense_multidimensional_zeros(css) + css = condense_floating_points(css) + css = normalize_rgb_colors_to_hex(css) + css = condense_hex_colors(css) + if wrap is not None: + css = wrap_css_lines(css, wrap) + css = css.replace("___PSEUDOCLASSBMH___", '"\\"}\\""') + css = condense_semicolons(css) + return css.strip() + + +def main(): + import optparse + import sys + + p = optparse.OptionParser( + prog="cssmin", version=__version__, + usage="%prog [--wrap N]", + description="""Reads raw CSS from stdin, and writes compressed CSS to stdout.""") + + p.add_option( + '-w', '--wrap', type='int', default=None, metavar='N', + help="Wrap output to approximately N chars per line.") + + options, args = p.parse_args() + sys.stdout.write(cssmin(sys.stdin.read(), wrap=options.wrap)) + + +if __name__ == '__main__': + main() diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/main.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/main.py new file mode 100644 index 00000000000..078150629f2 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/main.py @@ -0,0 +1,236 @@ +#!/usr/bin/env python +# -*- coding: ascii -*- +r""" +================================== + Benchmark cssmin implementations +================================== + +Benchmark cssmin implementations. + +:Copyright: + + Copyright 2011 - 2014 + Andr\xe9 Malo or his licensors, as applicable + +:License: + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +Usage:: + + python -mbench.main [-c COUNT] [-p file] cssfile ... + + -c COUNT number of runs per cssfile and minifier. Defaults to 10. + -p file File to write the benchmark results in (pickled) + +""" +if __doc__: + __doc__ = __doc__.encode('ascii').decode('unicode_escape') +__author__ = r"Andr\xe9 Malo".encode('ascii').decode('unicode_escape') +__docformat__ = "restructuredtext en" +__license__ = "Apache License, Version 2.0" +__version__ = "1.0.0" + +import sys as _sys +import time as _time + +import_notes = [] +class _p_02__rcssmin(object): + def __init__(self): + import rcssmin + cssmin = rcssmin._make_cssmin(python_only=True) + self.cssmin = lambda x: cssmin(x, keep_bang_comments=True) + +class _p_03__rcssmin(object): + def __init__(self): + import _rcssmin + cssmin = _rcssmin.cssmin + self.cssmin = lambda x: cssmin(x, keep_bang_comments=True) + +class cssmins(object): + from bench import cssmin as p_01_cssmin + p_02_rcssmin = _p_02__rcssmin() + try: + p_03__rcssmin = _p_03__rcssmin() + except ImportError: + import_notes.append("_rcssmin (C-Port) not available") + print(import_notes[-1]) + +print("Python Release: %s" % ".".join(map(str, _sys.version_info[:3]))) +print("") + + +def slurp(filename): + """ Load a file """ + fp = open(filename) + try: + return fp.read() + finally: + fp.close() + + +def print_(*value, **kwargs): + """ Print stuff """ + (kwargs.get('file') or _sys.stdout).write( + ''.join(value) + kwargs.get('end', '\n') + ) + + +def bench(filenames, count): + """ + Benchmark the minifiers with given css samples + + :Parameters: + `filenames` : sequence + List of filenames + + `count` : ``int`` + Number of runs per css file and minifier + + :Exceptions: + - `RuntimeError` : empty filenames sequence + """ + if not filenames: + raise RuntimeError("Missing files to benchmark") + try: + xrange + except NameError: + xrange = range + try: + cmp + except NameError: + cmp = lambda a, b: (a > b) - (a < b) + + ports = [item for item in dir(cssmins) if item.startswith('p_')] + ports.sort() + space = max(map(len, ports)) - 4 + ports = [(item[5:], getattr(cssmins, item).cssmin) for item in ports] + flush = _sys.stdout.flush + + struct = [] + inputs = [(filename, slurp(filename)) for filename in filenames] + for filename, style in inputs: + print_("Benchmarking %r..." % filename, end=" ") + flush() + outputs = [] + for _, cssmin in ports: + try: + outputs.append(cssmin(style)) + except (SystemExit, KeyboardInterrupt): + raise + except: + outputs.append(None) + struct.append(dict( + filename=filename, + sizes=[ + (item is not None and len(item) or None) for item in outputs + ], + size=len(style), + messages=[], + times=[], + )) + print_("(%.1f KiB)" % (struct[-1]['size'] / 1024.0,)) + flush() + times = [] + for idx, (name, cssmin) in enumerate(ports): + if outputs[idx] is None: + print_(" FAILED %s" % (name,)) + struct[-1]['times'].append((name, None)) + else: + print_(" Timing %s%s... (%5.1f KiB %s)" % ( + name, + " " * (space - len(name)), + len(outputs[idx]) / 1024.0, + idx == 0 and '*' or ['=', '>', '<'][ + cmp(len(outputs[idx]), len(outputs[0])) + ], + ), end=" ") + flush() + + xcount = count + while True: + counted = [None for _ in xrange(xcount)] + start = _time.time() + for _ in counted: + cssmin(style) + end = _time.time() + result = (end - start) * 1000 + if result < 10: # avoid measuring within the error range + xcount *= 10 + continue + times.append(result / xcount) + break + + print_("%8.2f ms" % times[-1], end=" ") + flush() + if len(times) <= 1: + print_() + else: + print_("(factor: %s)" % (', '.join([ + '%.2f' % (timed / times[-1]) for timed in times[:-1] + ]))) + struct[-1]['times'].append((name, times[-1])) + + flush() + print_() + + return struct + + +def main(argv=None): + """ Main """ + import getopt as _getopt + import os as _os + import pickle as _pickle + + if argv is None: + argv = _sys.argv[1:] + try: + opts, args = _getopt.getopt(argv, "hc:p:", ["help"]) + except getopt.GetoptError: + e = _sys.exc_info()[0](_sys.exc_info()[1]) + print >> _sys.stderr, "%s\nTry %s -mbench.main --help" % ( + e, + _os.path.basename(_sys.executable), + ) + _sys.exit(2) + + count, pickle = 10, None + for key, value in opts: + if key in ("-h", "--help"): + print >> _sys.stderr, ( + "%s -mbench.main [-c count] [-p file] cssfile ..." % ( + _os.path.basename(_sys.executable), + ) + ) + _sys.exit(0) + elif key == '-c': + count = int(value) + elif key == '-p': + pickle = str(value) + + struct = bench(args, count) + if pickle: + fp = open(pickle, 'wb') + try: + fp.write(_pickle.dumps(( + ".".join(map(str, _sys.version_info[:3])), + import_notes, + struct, + ), 0)) + finally: + fp.close() + + +if __name__ == '__main__': + main() diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/wikipedia.css b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/wikipedia.css new file mode 100644 index 00000000000..03079e35a6f --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/wikipedia.css @@ -0,0 +1,3861 @@ +/* + * This CSS is taken from wikipedia / mediawiki, it's the combined files of + * the vector skin described at: + * + * http://en.wikipedia.org/wiki/Wikipedia:Catalogue_of_CSS_classes + */ + +/* + * Any rules which should not be flipped automatically in right-to-left situations should be + * prepended with @noflip in a comment block. Images that should be embedded as base64 data-URLs + * should be prepended with @embed in a comment block. + * + * This style-sheet employs a few CSS trick to accomplish compatibility with a wide range of web + * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using + * a rule that makes things work in IE6, and then following it with a rule that begins with + * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support + * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and + * "IGNORED BY IE6" comments. + */ + +/* Framework */ +html, +body { + height: 100%; + margin: 0; + padding: 0; + font-family: sans-serif; + font-size: 1em; +} +body { + background-color: #f3f3f3; + /* @embed */ + background-image: url(images/page-base.png); +} +/* Content */ +div#content { + margin-left: 10em; + padding: 1em; + /* @embed */ + background-image: url(images/border.png); + background-position: top left; + background-repeat: repeat-y; + background-color: white; + color: black; + direction: ltr; +} +/* Head */ +#mw-page-base { + height: 5em; + background-color: white; + /* @embed */ + background-image: url(images/page-fade.png); + background-position: bottom left; + background-repeat: repeat-x; +} +#mw-head-base { + margin-top: -5em; + margin-left: 10em; + height: 5em; + /* @embed */ + background-image: url(images/border.png); + background-position: bottom left; + background-repeat: repeat-x; +} +div#mw-head { + position: absolute; + top: 0; + right: 0; + width: 100%; +} +div#mw-head h5 { + margin: 0; + padding: 0; +} +/* Hide empty portlets */ +div.emptyPortlet { + display: none; +} +/* Personal */ +#p-personal { + position: absolute; + top: 0; + right: 0.75em; +} +#p-personal h5 { + display: none; +} +#p-personal ul { + list-style: none; + margin: 0; + padding-left: 10em; /* Keep from overlapping logo */ +} +/* @noflip */ +#p-personal li { + line-height: 1.125em; + float: left; +} +/* This one flips! */ +#p-personal li { + margin-left: 0.75em; + margin-top: 0.5em; + font-size: 0.75em; + white-space: nowrap; +} +/* Navigation Containers */ +#left-navigation { + position: absolute; + left: 10em; + top: 2.5em; +} +#right-navigation { + float: right; + margin-top: 2.5em; +} +/* Navigation Labels */ +div.vectorTabs h5, +div.vectorMenu h5 span { + display: none; +} +/* Namespaces and Views */ +/* @noflip */ +div.vectorTabs { + float: left; + height: 2.5em; +} +div.vectorTabs { + /* @embed */ + background-image: url(images/tab-break.png); + background-position: bottom left; + background-repeat: no-repeat; + padding-left: 1px; +} +/* @noflip */ +div.vectorTabs ul { + float: left; +} +div.vectorTabs ul { + height: 100%; + list-style: none; + margin: 0; + padding: 0; +} +/* @noflip */ +div.vectorTabs ul li { + float: left; +} +/* OVERRIDDEN BY COMPLIANT BROWSERS */ +div.vectorTabs ul li { + line-height: 1.125em; + display: inline-block; + height: 100%; + margin: 0; + padding: 0; + background-color: #f3f3f3; + /* @embed */ + background-image: url(images/tab-normal-fade.png); + background-position: bottom left; + background-repeat: repeat-x; + white-space:nowrap; +} +/* IGNORED BY IE6 */ +div.vectorTabs ul > li { + display: block; +} +div.vectorTabs li.selected { + /* @embed */ + background-image: url(images/tab-current-fade.png); +} +/* OVERRIDDEN BY COMPLIANT BROWSERS */ +div.vectorTabs li a { + display: inline-block; + height: 1.9em; + padding-left: 0.5em; + padding-right: 0.5em; + color: #0645ad; + cursor: pointer; + font-size: 0.8em; +} +/* IGNORED BY IE6 */ +div.vectorTabs li > a { + display: block; +} +div.vectorTabs li.icon a { + background-position: bottom right; + background-repeat: no-repeat; +} +/* OVERRIDDEN BY COMPLIANT BROWSERS */ +div.vectorTabs span a { + display: inline-block; + padding-top: 1.25em; +} +/* IGNORED BY IE6 */ +/* @noflip */ +div.vectorTabs span > a { + float: left; + display: block; +} +div.vectorTabs span { + display: inline-block; + /* @embed */ + background-image: url(images/tab-break.png); + background-position: bottom right; + background-repeat: no-repeat; +} +div.vectorTabs li.selected a, +div.vectorTabs li.selected a:visited{ + color: #333333; + text-decoration: none; +} +div.vectorTabs li.new a, +div.vectorTabs li.new a:visited{ + color: #a55858; +} +/* Variants and Actions */ +/* @noflip */ +div.vectorMenu { + direction: ltr; + float: left; + /* @embed */ + background-image: url(images/arrow-down-icon.png); + background-position: 100% 60%; + background-repeat: no-repeat; + cursor: pointer; +} +div.vectorMenuFocus { + /* @embed */ + background-image: url(images/arrow-down-focus-icon.png); + background-position: 100% 60%; +} +/* @noflip */ +body.rtl div.vectorMenu { + direction: rtl; +} +/* OVERRIDDEN BY COMPLIANT BROWSERS */ +/* @noflip */ +div#mw-head div.vectorMenu h5 { + float: left; + /* @embed */ + background-image: url(images/tab-break.png); + background-repeat: no-repeat; +} +/* This will be flipped - unlike the one above it */ +div#mw-head div.vectorMenu h5 { + background-position: bottom left; + margin-left: -1px; +} +/* IGNORED BY IE6 */ +div#mw-head div.vectorMenu > h5 { + background-image: none; +} +div#mw-head div.vectorMenu h4 { + display: inline-block; + float: left; + font-size: 0.8em; + padding-left: 0.5em; + padding-top: 1.375em; + font-weight: normal; + border: none; +} +/* OVERRIDDEN BY COMPLIANT BROWSERS */ +/* @noflip */ +div.vectorMenu h5 a { + display: inline-block; + width: 24px; + height: 2.5em; + text-decoration: none; + /* @embed */ + background-image: url(images/tab-break.png); + background-repeat: no-repeat; +} +/* This will be flipped - unlike the one above it */ +div.vectorMenu h5 a { + background-position: bottom right; +} +/* IGNORED BY IE6 */ +div.vectorMenu h5 > a { + display: block; +} +div.vectorMenu div.menu { + position: relative; + display: none; + clear: both; + text-align: left; +} +/* OVERRIDDEN BY COMPLIANT BROWSERS */ +/* @noflip */ +body.rtl div.vectorMenu div.menu { + margin-left: 24px; +} +/* IGNORED BY IE6 */ +/* @noflip */ +body.rtl div.vectorMenu > div.menu { + margin-left: auto; +} +/* IGNORED BY IE6 */ +/* Also fixes old versions of FireFox */ +/* @noflip */ +body.rtl div.vectorMenu > div.menu, +x:-moz-any-link { + margin-left: 23px; +} +/* Enable forcing showing of the menu for accessibility */ +div.vectorMenu:hover div.menu, +div.vectorMenu div.menuForceShow { + display: block; +} +div.vectorMenu ul { + position: absolute; + background-color: white; + border: solid 1px silver; + border-top-width: 0; + list-style: none; + list-style-image: none; + list-style-type: none; + padding: 0; + margin: 0; + margin-left: -1px; + text-align: left; +} +/* Fixes old versions of FireFox */ +div.vectorMenu ul, +x:-moz-any-link { + min-width: 5em; +} +/* Returns things back to normal in modern versions of FireFox */ +div.vectorMenu ul, +x:-moz-any-link, +x:default { + min-width: 0; +} +div.vectorMenu li { + padding: 0; + margin: 0; + text-align: left; + line-height: 1em; +} +/* OVERRIDDEN BY COMPLIANT BROWSERS */ +div.vectorMenu li a { + display: inline-block; + padding: 0.5em; + white-space: nowrap; + color: #0645ad; + cursor: pointer; + font-size: 0.8em; +} +/* IGNORED BY IE6 */ +div.vectorMenu li > a { + display: block; +} +div.vectorMenu li.selected a, +div.vectorMenu li.selected a:visited { + color: #333333; + text-decoration: none; +} +/* Search */ +#p-search h5 { + display: none; +} +/* @noflip */ +#p-search { + float: left; +} +#p-search { + margin-right: 0.5em; + margin-left: 0.5em; +} +#p-search form, +#p-search input { + margin: 0; + margin-top: 0.4em; +} +div#simpleSearch { + display: block; + width: 14em; + height: 1.4em; + margin-top: 0.65em; + position: relative; + min-height: 1px; /* Gotta trigger hasLayout for IE7 */ + border: solid 1px #AAAAAA; + color: black; + background-color: white; + /* @embed */ + background-image: url(images/search-fade.png); + background-position: top left; + background-repeat: repeat-x; +} +div#simpleSearch label { + /* + * DON'T PANIC! Browsers that won't scale this properly are the same browsers that have JS issues that prevent + * this from ever being shown anyways. + */ + font-size: 13px; + top: 0.25em; + direction: ltr; +} +div#simpleSearch input { + color: black; + direction: ltr; +} +div#simpleSearch input:focus { + outline: none; +} +div#simpleSearch input.placeholder { + color: #999999; +} +div#simpleSearch input::-webkit-input-placeholder { + color: #999999; +} +div#simpleSearch input#searchInput { + position: absolute; + top: 0; + left: 0; + width: 90%; + margin: 0; + padding: 0; + padding-left: 0.2em; + padding-top: 0.2em; + padding-bottom: 0.2em; + outline: none; + border: none; + /* + * DON'T PANIC! Browsers that won't scale this properly are the same browsers that have JS issues that prevent + * this from ever being shown anyways. + */ + font-size: 13px; + background-color: transparent; + direction: ltr; +} +div#simpleSearch button#searchButton { + position: absolute; + width: 10%; + right: 0; + top: 0; + padding: 0; + padding-top: 0.3em; + padding-bottom: 0.2em; + padding-right: 0.4em; + margin: 0; + border: none; + cursor: pointer; + background-color: transparent; + background-image: none; +} +/* OVERRIDDEN BY COMPLIANT BROWSERS */ +div#simpleSearch button#searchButton img { + border: none; + margin: 0; + margin-top: -3px; + padding: 0; +} +/* IGNORED BY IE6 */ +div#simpleSearch button#searchButton > img { + margin: 0; +} +/* Panel */ +div#mw-panel { + position: absolute; + top: 160px; + padding-top: 1em; + width: 10em; + left: 0; +} +div#mw-panel div.portal { + padding-bottom: 1.5em; + direction: ltr; +} +div#mw-panel div.portal h5 { + font-weight: normal; + color: #444444; + padding: 0.25em; + padding-top: 0; + padding-left: 1.75em; + cursor: default; + border: none; + font-size: 0.75em; +} +div#mw-panel div.portal div.body { + margin: 0; + padding-top: 0.5em; + margin-left: 1.25em; + /* @embed */ + background-image: url(images/portal-break.png); + background-repeat: no-repeat; + background-position: top left; +} +div#mw-panel div.portal div.body ul { + list-style: none; + list-style-image: none; + list-style-type: none; + padding: 0; + margin: 0; +} +div#mw-panel div.portal div.body ul li { + line-height: 1.125em; + padding: 0; + padding-bottom: 0.5em; + margin: 0; + overflow: hidden; + font-size: 0.75em; +} +div#mw-panel div.portal div.body ul li a { + color: #0645ad; +} +div#mw-panel div.portal div.body ul li a:visited { + color: #0b0080; +} +/* Footer */ +div#footer { + margin-left: 10em; + margin-top: 0; + padding: 0.75em; + /* @embed */ + background-image: url(images/border.png); + background-position: top left; + background-repeat: repeat-x; + direction: ltr; +} +div#footer ul { + list-style: none; + list-style-image: none; + list-style-type: none; + margin: 0; + padding: 0; +} +div#footer ul li { + margin: 0; + padding: 0; + padding-top: 0.5em; + padding-bottom: 0.5em; + color: #333333; + font-size: 0.7em; +} +div#footer #footer-icons { + float: right; +} +/* @noflip */ +body.ltr div#footer #footer-places { + float: left; +} +div#footer #footer-info li { + line-height: 1.4em; +} +div#footer #footer-icons li { + float: left; + margin-left: 0.5em; + line-height: 2em; + text-align: right; +} +div#footer #footer-places li { + float: left; + margin-right: 1em; + line-height: 2em; +} +/* Logo */ +#p-logo { + position: absolute; + top: -160px; + left: 0; + width: 10em; + height: 160px; +} +#p-logo a { + display: block; + width: 10em; + height: 160px; + background-repeat: no-repeat; + background-position: center center; + text-decoration: none; +} + +/* + * + * The following code is highly modified from monobook. It would be nice if the + * preftoc id was more human readable like preferences-toc for instance, + * howerver this would require backporting the other skins. + */ + +/* Preferences */ +#preftoc { + /* Tabs */ + width: 100%; + float: left; + clear: both; + margin: 0 !important; + padding: 0 !important; + /* @embed */ + background-image: url(images/preferences-break.png); + background-position: bottom left; + background-repeat: no-repeat; +} + #preftoc li { + /* Tab */ + float: left; + margin: 0; + padding: 0; + padding-right: 1px; + height: 2.25em; + white-space: nowrap; + list-style-type: none; + list-style-image: none; + /* @embed */ + background-image: url(images/preferences-break.png); + background-position: bottom right; + background-repeat: no-repeat; + } + /* Sadly, IE6 won't understand this */ + #preftoc li:first-child { + margin-left: 1px; + } + #preftoc a, + #preftoc a:active { + display: inline-block; + position: relative; + color: #0645ad; + padding: 0.5em; + text-decoration: none; + background-image: none; + font-size: 0.9em; + } + #preftoc a:hover, + #preftoc a:focus { + text-decoration: underline; + } + #preftoc li.selected a { + /* @embed */ + background-image: url(images/preferences-fade.png); + background-position: bottom; + background-repeat: repeat-x; + color: #333333; + text-decoration: none; + } +#preferences { + float: left; + width: 100%; + margin: 0; + margin-top: -2px; + clear: both; + border: solid 1px #cccccc; + background-color: #f9f9f9; + /* @embed */ + background-image: url(images/preferences-base.png); +} +#preferences fieldset { + border: none; + border-top: solid 1px #cccccc; +} +#preferences fieldset.prefsection { + border: none; + padding: 0; + margin: 1em; +} +#preferences legend { + color: #666666; +} +#preferences fieldset.prefsection legend.mainLegend { + display: none; +} +#preferences td { + padding-left: 0.5em; + padding-right: 0.5em; +} +#preferences td.htmlform-tip { + font-size: x-small; + padding: .2em 2em; + color: #666666; +} +#preferences div.mw-prefs-buttons { + padding: 1em; +} +#preferences div.mw-prefs-buttons input { + margin-right: 0.25em; +} + +/** + * The following code is slightly modified from monobook + */ +div#content { + line-height: 1.5em; +} +#bodyContent { + font-size: 0.8em; +} + +.editsection { + float: right; +} + +ul { + /* @embed */ + list-style-image: url(images/bullet-icon.png); +} + +pre { + line-height: 1.3em; +} + +/* Site Notice (includes notices from CentralNotice extension) */ +#siteNotice { + font-size: 0.8em; +} +#firstHeading { + padding-top: 0; + margin-top: 0; + padding-top: 0; + font-size: 1.6em; +} +div#content a.external, +div#content a.external[href ^="gopher://"] { + /* @embed */ + background: url(images/external-link-ltr-icon.png) center right no-repeat; + padding-right: 13px; +} +div#content a.external[href ^="https://"], +.link-https { + /* @embed */ + background: url(images/lock-icon.png) center right no-repeat; + padding-right: 13px; +} +div#content a.external[href ^="mailto:"], +.link-mailto { + /* @embed */ + background: url(images/mail-icon.png) center right no-repeat; + padding-right: 13px; +} +div#content a.external[href ^="news:"] { + /* @embed */ + background: url(images/news-icon.png) center right no-repeat; + padding-right: 13px; +} +div#content a.external[href ^="ftp://"], +.link-ftp { + /* @embed */ + background: url(images/file-icon.png) center right no-repeat; + padding-right: 13px; +} +div#content a.external[href ^="irc://"], +div#content a.external[href ^="ircs://"], +.link-irc { + /* @embed */ + background: url(images/talk-icon.png) center right no-repeat; + padding-right: 13px; +} +div#content a.external[href $=".ogg"], div#content a.external[href $=".OGG"], +div#content a.external[href $=".mid"], div#content a.external[href $=".MID"], +div#content a.external[href $=".midi"], div#content a.external[href $=".MIDI"], +div#content a.external[href $=".mp3"], div#content a.external[href $=".MP3"], +div#content a.external[href $=".wav"], div#content a.external[href $=".WAV"], +div#content a.external[href $=".wma"], div#content a.external[href $=".WMA"], +.link-audio { + /* @embed */ + background: url(images/audio-icon.png) center right no-repeat; + padding-right: 13px; +} +div#content a.external[href $=".ogm"], div#content a.external[href $=".OGM"], +div#content a.external[href $=".avi"], div#content a.external[href $=".AVI"], +div#content a.external[href $=".mpeg"], div#content a.external[href $=".MPEG"], +div#content a.external[href $=".mpg"], div#content a.external[href $=".MPG"], +.link-video { + /* @embed */ + background: url(images/video-icon.png) center right no-repeat; + padding-right: 13px; +} +div#content a.external[href $=".pdf"], div#content a.external[href $=".PDF"], +div#content a.external[href *=".pdf#"], div#content a.external[href *=".PDF#"], +div#content a.external[href *=".pdf?"], div#content a.external[href *=".PDF?"], +.link-document { + /* @embed */ + background: url(images/document-icon.png) center right no-repeat; + padding-right: 13px; +} + +/* Icon for Usernames */ +#pt-userpage, +#pt-anonuserpage, +#pt-login { + /* @embed */ + background: url(images/user-icon.png) left top no-repeat; + padding-left: 15px !important; + text-transform: none; +} + +.redirectText { + font-size: 140%; +} + +.redirectMsg img { + vertical-align: text-bottom; +} + +#bodyContent { + position: relative; + width: 100%; +} +#mw-js-message { + font-size: 0.8em; +} +div#bodyContent { + line-height: 1.5em; +} + +/* Watch/Unwatch Icon Styling */ +#ca-unwatch.icon a, +#ca-watch.icon a { + margin: 0; + padding: 0; + outline: none; + display: block; + width: 26px; + /* This hides the text but shows the background image */ + padding-top: 3.1em; + margin-top: 0; + /* Only applied in IE6 */ + margin-top: -0.8em !ie; + height: 0; + overflow: hidden; + /* @embed */ + background-image: url(images/watch-icons.png); +} +#ca-unwatch.icon a { + background-position: -43px 60%; +} +#ca-watch.icon a { + background-position: 5px 60%; +} +#ca-unwatch.icon a:hover, +#ca-unwatch.icon a:focus { + background-position: -67px 60%; +} +#ca-watch.icon a:hover, +#ca-watch.icon a:focus { + background-position: -19px 60%; +} +#ca-unwatch.icon a.loading, +#ca-watch.icon a.loading { + /* @embed */ + background-image: url(images/watch-icon-loading.gif); + background-position: 5px 60%; +} +#ca-unwatch.icon a span, +#ca-watch.icon a span { + display: none; +} +div.vectorTabs ul { + /* @embed */ + background-image:url(images/tab-break.png); + background-position:right bottom; + background-repeat:no-repeat; +} + +/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */ +.tipsy { + font-size: 0.8em; +} +/** + * CSS in this file is used by *all* skins (that have any CSS at all). Be + * careful what you put in here, since what looks good in one skin may not in + * another, but don't ignore the poor pre-Monobook users either. + */ + +/* GENERAL CLASSES FOR DIRECTIONALITY SUPPORT */ + +/** + * These classes should be used for text depending on the content direction. + * Content stuff like editsection, ul/ol and TOC depend on this. + */ +.mw-content-ltr { + /* @noflip */ + direction: ltr; +} +.mw-content-rtl { + /* @noflip */ + direction: rtl; +} + +/* Most input fields should be in site direction */ +.sitedir-ltr textarea, +.sitedir-ltr input { + /* @noflip */ + direction: ltr; +} +.sitedir-rtl textarea, +.sitedir-rtl input { + /* @noflip */ + direction: rtl; +} + +/* Input types that should follow user direction, like buttons */ +/* TODO: What about buttons in wikipage content ? */ +input[type="submit"], +input[type="button"], +input[type="reset"], +input[type="file"] { + direction: ltr; +} + +/* Override default values */ +textarea[dir="ltr"], +input[dir="ltr"] { + /* @noflip */ + direction: ltr; +} +textarea[dir="rtl"], +input[dir="rtl"] { + /* @noflip */ + direction: rtl; +} + +/* Default style for semantic tags */ +abbr, +acronym, +.explain { + border-bottom: 1px dotted; + cursor: help; +} + +/* Colored watchlist and recent changes numbers */ +.mw-plusminus-pos { + color: #006400; /* dark green */ +} +.mw-plusminus-neg { + color: #8b0000; /* dark red */ +} +.mw-plusminus-null { + color: #aaa; /* gray */ +} + +/** + * Links to redirects appear italicized on [[Special:AllPages]], [[Special:PrefixIndex]], + * [[Special:Watchlist/edit]] and in category listings. + */ +.allpagesredirect, +.redirect-in-category, +.watchlistredir { + font-style: italic; +} + +/* Comment and username portions of RC entries */ +span.comment { + font-style: italic; +} + +span.changedby { + font-size: 95%; +} + +/* Math */ +.texvc { + direction: ltr; + unicode-bidi: embed; +} +img.tex { + vertical-align: middle; +} +span.texhtml { + font-family: serif; +} + +/** + * Add a bit of margin space between the preview and the toolbar. + * This replaces the ugly <p><br /></p> we used to insert into the page source + */ +#wikiPreview.ontop { + margin-bottom: 1em; +} + +/* Stop floats from intruding into edit area in previews */ +#editform, +#toolbar, +#wpTextbox1 { + clear: both; +} +#toolbar img { + cursor: pointer; +} +div#mw-js-message { + margin: 1em 5%; + padding: 0.5em 2.5%; + border: solid 1px #ddd; + background-color: #fcfcfc; +} + +/* Edit section links */ +.editsection { + float: right; + margin-left: 5px; +} +/* Correct directionality when page dir is different from site/user dir */ +.mw-content-ltr .editsection, +.mw-content-rtl .mw-content-ltr .editsection { + /* @noflip */ + float: right; +} +.mw-content-rtl .editsection, +.mw-content-ltr .mw-content-rtl .editsection { + /* @noflip */ + float: left; +} + +/** + * File description page + */ + +div.mw-filepage-resolutioninfo { + font-size: smaller; +} + +/** + * File histories + */ +h2#filehistory { + clear: both; +} + +table.filehistory th, +table.filehistory td { + vertical-align: top; +} +table.filehistory th { + text-align: left; +} +table.filehistory td.mw-imagepage-filesize, +table.filehistory th.mw-imagepage-filesize { + white-space: nowrap; +} + +table.filehistory td.filehistory-selected { + font-weight: bold; +} + +/** + * Add a checkered background image on hover for file + * description pages. (bug 26470) + */ +.filehistory a img, +#file img:hover { + /* @embed */ + background: white url(images/Checker-16x16.png) repeat; +} + +/** + * rev_deleted stuff + */ +li span.deleted, +span.history-deleted { + text-decoration: line-through; + color: #888; + font-style: italic; +} + +/** + * Patrol stuff + */ +.not-patrolled { + background-color: #ffa; +} + +.unpatrolled { + font-weight: bold; + color: red; +} + +div.patrollink { + font-size: 75%; + text-align: right; +} + +/** + * Forms + */ +td.mw-label { + text-align: right; +} +td.mw-input { + text-align: left; +} +td.mw-submit { + text-align: left; +} + +td.mw-label { + vertical-align: top; +} +.prefsection td.mw-label { + width: 20%; +} +.prefsection table { + width: 100%; +} +td.mw-submit { + white-space: nowrap; +} + +table.mw-htmlform-nolabel td.mw-label { + width: 1px; +} + +tr.mw-htmlform-vertical-label td.mw-label { + text-align: left !important; +} + +.mw-htmlform-invalid-input td.mw-input input { + border-color: red; +} + +.mw-htmlform-flatlist div.mw-htmlform-flatlist-item { + display: inline; + margin-right: 1em; + white-space: nowrap; +} + +input#wpSummary { + width: 80%; +} + +/** + * Image captions + */ +.thumbcaption { + text-align: left; +} +.magnify { + float: right; +} + +/** + * Categories + */ +#catlinks { + /** + * Overrides text justification (user preference) + * See bug 31990 + */ + text-align: left; +} +.catlinks ul { + display: inline; + margin: 0; + padding: 0; + list-style: none; + list-style-type: none; + list-style-image: none; + vertical-align: middle !ie; +} + +.catlinks li { + display: inline-block; + line-height: 1.25em; + border-left: 1px solid #AAA; + margin: 0.125em 0; + padding: 0 0.5em; + zoom: 1; + display: inline !ie; +} + +.catlinks li:first-child { + padding-left: 0.25em; + border-left: none; +} +/** + * Hidden categories + */ +.mw-hidden-cats-hidden { + display: none; +} +.catlinks-allhidden { + display: none; +} + +/* Convenience links to edit block, delete and protect reasons */ +p.mw-ipb-conveniencelinks, +p.mw-protect-editreasons, +p.mw-filedelete-editreasons, +p.mw-delete-editreasons, +p.mw-revdel-editreasons { + font-size: 90%; + text-align: right; +} + +/** + * OpenSearch ajax suggestions + */ +.os-suggest { + overflow: auto; + overflow-x: hidden; + position: absolute; + top: 0; + left: 0; + width: 0; + background-color: white; + border-style: solid; + border-color: #AAAAAA; + border-width: 1px; + z-index:99; + font-size:95%; +} + +table.os-suggest-results { + font-size: 95%; + cursor: pointer; + border: 0; + border-collapse: collapse; + width: 100%; +} + +.os-suggest-result, +.os-suggest-result-hl { + white-space: nowrap; + background-color: white; + color: black; + padding: 2px; +} +.os-suggest-result-hl, +.os-suggest-result-hl-webkit { + background-color: #4C59A6; + color: white; +} + +.os-suggest-toggle { + position: relative; + left: 1ex; + font-size: 65%; +} +.os-suggest-toggle-def { + position: absolute; + top: 0; + left: 0; + font-size: 65%; + visibility: hidden; +} + +/* Page history styling */ + +/* The auto-generated edit comments */ +.autocomment { + color: gray; +} +#pagehistory .history-user { + margin-left: 0.4em; + margin-right: 0.2em; +} +#pagehistory span.minor { + font-weight: bold; +} +#pagehistory li { + border: 1px solid white; +} +#pagehistory li.selected { + background-color: #f9f9f9; + border: 1px dashed #aaa; +} + +.mw-history-revisiondelete-button, #mw-fileduplicatesearch-icon { + float: right; +} + +/** Generic minor/bot/newpage styling (recent changes) */ +.newpage, +.minoredit, +.botedit { + font-weight: bold; +} + +#shared-image-dup, +#shared-image-conflict { + font-style: italic; +} + +/** + * Recreating deleted page warning + * Reupload file warning + * Page protection warning + * incl. log entries for these warnings + */ +div.mw-warning-with-logexcerpt { + padding: 3px; + margin-bottom: 3px; + border: 2px solid #2F6FAB; + clear: both; +} +div.mw-warning-with-logexcerpt ul li { + font-size: 90%; +} + +/* (show/hide) revision deletion links */ +span.mw-revdelundel-link, +strong.mw-revdelundel-link { + font-size: 90%; +} +span.mw-revdelundel-hidden, +input.mw-revdelundel-hidden { + visibility: hidden; +} + +td.mw-revdel-checkbox, +th.mw-revdel-checkbox { + padding-right: 10px; + text-align: center; +} + +/* feed links */ +a.feedlink { + /* @embed */ + background: url(images/feed-icon.png) center left no-repeat; + padding-left: 16px; +} + +/* Plainlinks - this can be used to switch + * off special external link styling */ +.plainlinks a { + background: none !important; + padding: 0 !important; +} +/* External URLs should always be treated as LTR (bug 4330) */ +/* @noflip */ .rtl a.external.free, +.rtl a.external.autonumber { + direction: ltr; + unicode-bidi: embed; +} + +/** + * wikitable class for skinning normal tables + * keep in sync with commonPrint.css + */ +table.wikitable { + margin: 1em 1em 1em 0; + background-color: #f9f9f9; + border: 1px #aaa solid; + border-collapse: collapse; + color: black; +} +table.wikitable > tr > th, +table.wikitable > tr > td, +table.wikitable > * > tr > th, +table.wikitable > * > tr > td { + border: 1px #aaa solid; + padding: 0.2em; +} +table.wikitable > tr > th, +table.wikitable > * > tr > th { + background-color: #f2f2f2; + text-align: center; +} +table.wikitable > caption { + font-weight: bold; +} + +/* hide initially collapsed collapsable tables */ +table.collapsed tr.collapsable { + display: none; +} + +/* success and error messages */ +.success { + color: green; + font-size: larger; +} +.warning { + color: #FFA500; /* orange */ + font-size: larger; +} +.error { + color: red; + font-size: larger; +} +.errorbox, +.warningbox, +.successbox { + font-size: larger; + border: 2px solid; + padding: .5em 1em; + float: left; + margin-bottom: 2em; + color: #000; +} +.errorbox { + border-color: red; + background-color: #fff2f2; +} +.warningbox { + border-color: #FF8C00; /* darkorange */ + background-color: #FFFFC0; +} +.successbox { + border-color: green; + background-color: #dfd; +} +.errorbox h2, +.warningbox h2, +.successbox h2 { + font-size: 1em; + font-weight: bold; + display: inline; + margin: 0 .5em 0 0; + border: none; +} + +/* general info/warning box for SP */ +.mw-infobox { + border: 2px solid #ff7f00; + margin: 0.5em; + clear: left; + overflow: hidden; +} + +.mw-infobox-left { + margin: 7px; + float: left; + width: 35px; +} + +.mw-infobox-right { + margin: 0.5em 0.5em 0.5em 49px; +} + +/* Note on preview page */ +.previewnote { + color: #c00; + margin-bottom: 1em; +} + +.previewnote p { + text-indent: 3em; + margin: 0.8em 0; +} + +.visualClear { + clear: both; +} + +#mw_trackbacks { + border: solid 1px #bbbbff; + background-color: #eeeeff; + padding: 0.2em; +} + +/** + * Data table style + * + * Transparent table with suddle borders + * and blue row-highlighting. + */ +.mw-datatable { + border-collapse: collapse; +} +.mw-datatable, +.mw-datatable td, +.mw-datatable th { + border: 1px solid #aaaaaa; + padding: 0 0.15em 0 0.15em; +} +.mw-datatable th { + background-color: #ddddff; +} +.mw-datatable td { + background-color: #ffffff; +} +.mw-datatable tr:hover td { + background-color: #eeeeff; +} + + +/** + * TablePager tables generated by the TablePager PHP class + * in MediaWiki (e.g. Special:ListFiles). + */ +.TablePager { + min-width: 80%; +} +.TablePager_nav { + margin: 0 auto; +} +.TablePager_nav td { + padding: 3px; + text-align: center; +} +.TablePager_nav a { + text-decoration: none; +} + +.imagelist td, +.imagelist th { + white-space: nowrap; +} +.imagelist .TablePager_col_links { + background-color: #eeeeff; +} +.imagelist .TablePager_col_img_description { + white-space: normal; +} +.imagelist th.TablePager_sort { + background-color: #ccccff; +} + +/* filetoc */ +ul#filetoc { + text-align: center; + border: 1px solid #aaaaaa; + background-color: #f9f9f9; + padding: 5px; + font-size: 95%; + margin-bottom: 0.5em; + margin-left: 0; + margin-right: 0; +} + +#filetoc li { + display: inline; + list-style-type: none; + padding-right: 2em; +} + +/* Classes for EXIF data display */ +table.mw_metadata { + font-size: 0.8em; + margin-left: 0.5em; + margin-bottom: 0.5em; + width: 400px; +} + +table.mw_metadata caption { + font-weight: bold; +} + +table.mw_metadata th { + font-weight: normal; +} + +table.mw_metadata td { + padding: 0.1em; +} + +table.mw_metadata { + border: none; + border-collapse: collapse; +} + +table.mw_metadata td, +table.mw_metadata th { + text-align: center; + border: 1px solid #aaaaaa; + padding-left: 5px; + padding-right: 5px; +} + +table.mw_metadata th { + background-color: #f9f9f9; +} + +table.mw_metadata td { + background-color: #fcfcfc; +} + +table.mw_metadata ul.metadata-langlist { + list-style-type: none; + list-style-image: none; + padding-right: 5px; + padding-left: 5px; + margin: 0; +} + +/* Correct directionality when page dir is different from site/user dir */ +.mw-content-ltr ul, +.mw-content-rtl .mw-content-ltr ul { + /* @noflip */ + margin: 0.3em 0 0 1.6em; + padding: 0; +} +.mw-content-rtl ul, +.mw-content-ltr .mw-content-rtl ul { + /* @noflip */ + margin: 0.3em 1.6em 0 0; + padding: 0; +} +.mw-content-ltr ol, +.mw-content-rtl .mw-content-ltr ol { + /* @noflip */ + margin: 0.3em 0 0 3.2em; + padding: 0; +} +.mw-content-rtl ol, +.mw-content-ltr .mw-content-rtl ol { + /* @noflip */ + margin: 0.3em 3.2em 0 0; + padding: 0; +} +/* @noflip */ +.mw-content-ltr dd, +.mw-content-rtl .mw-content-ltr dd { + margin-left: 1.6em; + margin-right: 0; +} +/* @noflip */ +.mw-content-rtl dd, +.mw-content-ltr .mw-content-rtl dd { + margin-right: 1.6em; + margin-left: 0; +} + +/* Galleries */ +/* These display attributes look nonsensical, but are needed to support IE and FF2 */ +/* Don't forget to update commonPrint.css */ +li.gallerybox { + vertical-align: top; + border: solid 2px white; + display: -moz-inline-box; + display: inline-block; +} + +ul.gallery, +li.gallerybox { + zoom: 1; + *display: inline; +} + +ul.gallery { + margin: 2px; + padding: 2px; + display: block; +} + +li.gallerycaption { + font-weight: bold; + text-align: center; + display: block; + word-wrap: break-word; +} + +li.gallerybox div.thumb { + text-align: center; + border: 1px solid #ccc; + background-color: #f9f9f9; + margin: 2px; +} + +li.gallerybox div.thumb img { + display: block; + margin: 0 auto; +} + +div.gallerytext { + overflow: hidden; + font-size: 94%; + padding: 2px 4px; + word-wrap: break-word; +} + +.mw-ajax-loader { + /* @embed */ + background-image: url(images/ajax-loader.gif); + background-position: center center; + background-repeat: no-repeat; + padding: 16px; + position: relative; + top: -16px; +} + +.mw-small-spinner { + padding: 10px !important; + margin-right: 0.6em; + /* @embed */ + background-image: url(images/spinner.gif); + background-position: center center; + background-repeat: no-repeat; +} + +/* Language specific height correction for titles. Ref Bug 29405 and Bug 30809 */ +/* Languages like hi or ml require slightly more vertical space to show diacritics properly */ +h1:lang(as), +h1:lang(bh), /* Macrolanguage, used on bh.wikipedia.org, should be removed one day */ +h1:lang(bho), +h1:lang(bn), +h1:lang(gu), +h1:lang(hi), +h1:lang(kn), +h1:lang(ml), +h1:lang(mr), +h1:lang(or), +h1:lang(pa), +h1:lang(sa), +h1:lang(ta), +h1:lang(te) { + line-height: 1.5em !important; +} +h2:lang(as), h3:lang(as), h4:lang(as), h5:lang(as), h6:lang(as), +h2:lang(bho), h3:lang(bho), h4:lang(bho), h5:lang(bho), h6:lang(bho), +h2:lang(bh), h3:lang(bh), h4:lang(bh), h5:lang(bh), h6:lang(bh), +h2:lang(bn), h3:lang(bn), h4:lang(bn), h5:lang(bn), h6:lang(bn), +h2:lang(gu), h3:lang(gu), h4:lang(gu), h5:lang(gu), h6:lang(gu), +h2:lang(hi), h3:lang(hi), h4:lang(hi), h5:lang(hi), h6:lang(hi), +h2:lang(kn), h3:lang(kn), h4:lang(kn), h5:lang(kn), h6:lang(kn), +h2:lang(ml), h3:lang(ml), h4:lang(ml), h5:lang(ml), h6:lang(ml), +h2:lang(mr), h3:lang(mr), h4:lang(mr), h5:lang(mr), h6:lang(mr), +h2:lang(or), h3:lang(or), h4:lang(or), h5:lang(or), h6:lang(or), +h2:lang(pa), h3:lang(pa), h4:lang(pa), h5:lang(pa), h6:lang(pa), +h2:lang(sa), h3:lang(sa), h4:lang(sa), h5:lang(sa), h6:lang(sa), +h2:lang(ta), h3:lang(ta), h4:lang(ta), h5:lang(ta), h6:lang(ta), +h2:lang(te), h3:lang(te), h4:lang(te), h5:lang(te), h6:lang(te) { + line-height: 1.2em; +} + +/* Localised ordered list numbering for some languages */ +ol:lang(bcc) li, +ol:lang(bqi) li, +ol:lang(fa) li, +ol:lang(glk) li, +ol:lang(kk-arab) li, +ol:lang(mzn) li { + list-style-type: -moz-persian; + list-style-type: persian; +} + +ol:lang(ckb) li { + list-style-type: -moz-arabic-indic; + list-style-type: arabic-indic; +} + +ol:lang(hi) li, +ol:lang(mr) li { + list-style-type: -moz-devanagari; + list-style-type: devanagari; +} + +ol:lang(as) li, +ol:lang(bn) li { + list-style-type: -moz-bengali; + list-style-type: bengali; +} + +ol:lang(or) li { + list-style-type: -moz-oriya; + list-style-type: oriya; +} + +#toc ul, .toc ul { + margin: .3em 0; +} + +/* Correct directionality when page dir is different from site/user dir */ +/* @noflip */ .mw-content-ltr .toc ul, +.mw-content-ltr #toc ul, +.mw-content-rtl .mw-content-ltr .toc ul, +.mw-content-rtl .mw-content-ltr #toc ul { + text-align: left; +} +/* @noflip */ .mw-content-rtl .toc ul, +.mw-content-rtl #toc ul, +.mw-content-ltr .mw-content-rtl .toc ul, +.mw-content-ltr .mw-content-rtl #toc ul { + text-align: right; +} +/* @noflip */ .mw-content-ltr .toc ul ul, +.mw-content-ltr #toc ul ul, +.mw-content-rtl .mw-content-ltr .toc ul ul, +.mw-content-rtl .mw-content-ltr #toc ul ul { + margin: 0 0 0 2em; +} +/* @noflip */ .mw-content-rtl .toc ul ul, +.mw-content-rtl #toc ul ul, +.mw-content-ltr .mw-content-rtl .toc ul ul, +.mw-content-ltr .mw-content-rtl #toc ul ul { + margin: 0 2em 0 0; +} + +#toc #toctitle, +.toc #toctitle, +#toc .toctitle, +.toc .toctitle { + direction: ltr; +} + +/* tooltip styles */ +.mw-help-field-hint { + display: none; + margin-left: 2px; + margin-bottom: -8px; + padding: 0 0 0 15px; + /* @embed */ + background-image: url('images/help-question.gif'); + background-position: left center; + background-repeat: no-repeat; + cursor: pointer; + font-size: .8em; + text-decoration: underline; + color: #0645ad; +} +.mw-help-field-hint:hover { + /* @embed */ + background-image: url('images/help-question-hover.gif'); +} +.mw-help-field-data { + display: block; + background-color: #d6f3ff; + padding:5px 8px 4px 8px; + border: 1px solid #5dc9f4; + margin-left: 20px; +} +.tipsy { + padding: 5px 5px 10px; + font-size: 12px; + position: absolute; + z-index: 100000; + overflow: visible; +} +.tipsy-inner { + padding: 5px 8px 4px 8px; + background-color: #d6f3ff; + color: black; + border: 1px solid #5dc9f4; + max-width: 300px; + text-align: left; +} +.tipsy-arrow { + position: absolute; + /* @embed */ + background: url(images/tipsy-arrow.gif) no-repeat top left; + width: 13px; + height: 13px; +} +.tipsy-se .tipsy-arrow { + bottom: -2px; + right: 10px; + background-position: 0% 100%; +} + +#mw-clearyourcache, +#mw-sitecsspreview, +#mw-sitejspreview, +#mw-usercsspreview, +#mw-userjspreview { + direction: ltr; + unicode-bidi: embed; +} + +/* Correct user & content directionality when viewing a diff */ +.diff-currentversion-title, +.diff { + direction: ltr; + unicode-bidi: embed; +} +/* @noflip */ .diff-contentalign-right td { + direction: rtl; + unicode-bidi: embed; +} +/* @noflip */ .diff-contentalign-left td { + direction: ltr; + unicode-bidi: embed; +} +.diff-otitle, +.diff-ntitle, +.diff-lineno { + direction: ltr !important; + unicode-bidi: embed; +} + +#mw-revision-info, +#mw-revision-info-current, +#mw-revision-nav { + direction: ltr; + display: inline; +} + +/* Images */ + +/* @noflip */ div.tright, +div.floatright, +table.floatright { + clear: right; + float: right; +} +/* @noflip */ div.tleft, +div.floatleft, +table.floatleft { + float: left; + clear: left; +} +div.floatright, +table.floatright, +div.floatleft, +table.floatleft { + position: relative; +} + +/* bug 12205 */ +#mw-credits a { + unicode-bidi: embed; +} + +/* Accessibility */ +.mw-jump, +#jump-to-nav { + overflow: hidden; + height: 0; + zoom: 1; /* http://webaim.org/techniques/skipnav/#iequirk */ +} + +/* Print footer should be hidden by default in screen. */ +.printfooter { + display: none; +} + +/* For developpers */ +.xdebug-error { + position: absolute; + z-index: 99; +} + +.editsection, .toctoggle { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +/** + * MediaWiki Print style sheet for CSS2-capable browsers. + * Copyright Gabriel Wicke, http://www.aulinx.de/ + * + * Derived from the plone (http://plone.org/) styles + * Copyright Alexander Limi + */ + +/* Thanks to A List Apart (http://alistapart.com/) for useful extras */ +a.stub, +a.new { + color: #ba0000; + text-decoration: none; +} + +#toc { + border: 1px solid #aaaaaa; + background-color: #f9f9f9; + padding: 5px; +} + +/* images */ +div.floatright { + float: right; + clear: right; + position: relative; + margin: 0.5em 0 0.8em 1.4em; +} +div.floatright p { + font-style: italic; +} +div.floatleft { + float: left; + clear: left; + position: relative; + margin: 0.5em 1.4em 0.8em 0; +} +div.floatleft p { + font-style: italic; +} +div.center { + text-align: center; +} + +/* thumbnails */ +div.thumb { + border: none; + width: auto; + margin-top: 0.5em; + margin-bottom: 0.8em; + background-color: transparent; +} +div.thumbinner { + border:1px solid #cccccc; + padding: 3px !important; + background-color: White; + font-size: 94%; + text-align: center; + overflow: hidden; +} +html .thumbimage { + border: 1px solid #cccccc; +} +html .thumbcaption { + border: none; + text-align: left; + line-height: 1.4em; + padding: 3px !important; + font-size: 94%; +} + +div.magnify { + display: none; +} +/* @noflip */ +div.tright { + float: right; + clear: right; + margin: 0.5em 0 0.8em 1.4em; +} +/* @noflip */ +div.tleft { + float: left; + clear: left; + margin: 0.5em 1.4em 0.8em 0; +} +img.thumbborder { + border: 1px solid #dddddd; +} + +/* table standards */ +table.rimage { + float: right; + width: 1pt; + position: relative; + margin-left: 1em; + margin-bottom: 1em; + text-align: center; +} + +body { + background: white; + color: black; + margin: 0; + padding: 0; +} + +.noprint, +div#jump-to-nav, +.mw-jump, +div.top, +div#column-one, +#colophon, +.editsection, +.toctoggle, +.tochidden, +div#f-poweredbyico, +div#f-copyrightico, +li#viewcount, +li#about, +li#disclaimer, +li#mobileview, +li#privacy, +#footer-places, +.mw-hidden-catlinks, +tr.mw-metadata-show-hide-extended, +span.mw-filepage-other-resolutions, +#filetoc { + /* Hides all the elements irrelevant for printing */ + display: none; +} + +ul { + list-style-type: square; +} + +#content { + background: none; + border: none !important; + padding: 0 !important; + margin: 0 !important; + direction: ltr; +} +#footer { + background : white; + color : black; + margin-top: 1em; + border-top: 1px solid #AAA; + direction: ltr; +} + +h1, h2, h3, h4, h5, h6 { + font-weight: bold; +} + +p { + margin: 1em 0; + line-height: 1.2em; +} + +pre { + border: 1pt dashed black; + white-space: pre; + font-size: 8pt; + overflow: auto; + padding: 1em 0; + background: white; + color: black; +} + +table.listing, +table.listing td { + border: 1pt solid black; + border-collapse: collapse; +} + +a { + color: black !important; + background: none !important; + padding: 0 !important; +} + +a:link, a:visited { + color: #520; + background: transparent; + text-decoration: underline; +} + +#content a.external.text:after, +#content a.external.autonumber:after { + /* Expand URLs for printing */ + content: " (" attr(href) ") "; +} + +#globalWrapper { + width: 100% !important; + min-width: 0 !important; +} + +#content { + background: white; + color: black; +} + +#column-content { + margin: 0 !important; +} + +#column-content #content { + padding: 1em; + margin: 0 !important; +} + +/* MSIE/Win doesn't understand 'inherit' */ +a, +a.external, +a.new, +a.stub { + color: black !important; + text-decoration: none !important; +} + +/* Continue ... */ +a, +a.external, +a.new, +a.stub { + color: inherit !important; + text-decoration: inherit !important; +} + +img { + border: none; + vertical-align: middle; +} + +/* math */ +span.texhtml { + font-family: serif; +} + +#siteNotice { + display: none; +} + +/* Galleries (see shared.css for more info) */ +li.gallerybox { + vertical-align: top; + border: solid 2px white; + display: -moz-inline-box; + display: inline-block; +} + +ul.gallery, li.gallerybox { + zoom: 1; + *display: inline; +} + +ul.gallery { + margin: 2px; + padding: 2px; + display: block; +} + +li.gallerycaption { + font-weight: bold; + text-align: center; + display: block; + word-wrap: break-word; +} + +li.gallerybox div.thumb { + text-align: center; + border: 1px solid #ccc; + margin: 2px; +} + +div.gallerytext { + overflow: hidden; + font-size: 94%; + padding: 2px 4px; + word-wrap: break-word; +} + +/** + * Diff rendering + */ +table.diff { + background: white; +} +td.diff-otitle { + background: #ffffff; +} +td.diff-ntitle { + background: #ffffff; +} +td.diff-addedline { + background: #ccffcc; + font-size: smaller; + border: solid 2px black; +} +td.diff-deletedline { + background: #ffffaa; + font-size: smaller; + border: dotted 2px black; +} +td.diff-context { + background: #eeeeee; + font-size: smaller; +} +.diffchange { + color: silver; + font-weight: bold; + text-decoration: underline; +} + +/** + * Table rendering + * As on shared.css but with white background. + */ +table.wikitable, +table.mw_metadata { + margin: 1em 1em 1em 0; + border: 1px #aaa solid; + background: white; + border-collapse: collapse; +} +table.wikitable > tr > th, table.wikitable > tr > td, +table.wikitable > * > tr > th, table.wikitable > * > tr > td, +.mw_metadata th, .mw_metadata td { + border: 1px #aaa solid; + padding: 0.2em; +} +table.wikitable > tr > th, +table.wikitable > * > tr > th, +.mw_metadata th { + text-align: center; + background: white; + font-weight: bold; +} +table.wikitable > caption, +.mw_metadata caption { + font-weight: bold; +} + +a.sortheader { + margin: 0 0.3em; +} + +/* Some pagination options */ +.wikitable, .thumb, img { + page-break-inside: avoid; +} +h2, h3, h4, h5, h6, h7 { + page-break-after: avoid; +} +p { + widows: 3; + orphans: 3; +} + +/** + * Categories + */ +.catlinks ul { + display: inline; + margin: 0; + padding: 0; + list-style: none; + list-style-type: none; + list-style-image: none; + vertical-align: middle !ie; +} + +.catlinks li { + display: inline-block; + line-height: 1.15em; + padding: 0 .4em; + border-left: 1px solid #AAA; + margin: 0.1em 0; + zoom: 1; + display: inline !ie; +} + +.catlinks li:first-child { + padding-left: .2em; + border-left: none; +} +/* Default styling for HTML elements */ +dfn { + font-style: inherit; /* Reset default styling for <dfn> */ +} +sup, sub { + line-height: 1em; /* Reduce line-height for <sup> and <sub> */ +} + +/* Main page fixes */ +#interwiki-completelist { + font-weight: bold; +} +body.page-Main_Page #ca-delete { + display: none !important; +} +body.page-Main_Page #mp-topbanner { + clear: both; +} + +/* Edit window toolbar */ +#toolbar { + height: 22px; + margin-bottom: 6px; +} + +/* Highlight data points in the info action if specified in the URL */ +body.action-info :target { + background: #DEF; +} + +/* Make the list of references smaller */ +ol.references, +div.reflist, +div.refbegin { + font-size: 90%; /* Default font-size */ + margin-bottom: 0.5em; +} +div.refbegin-100 { + font-size: 100%; /* Option for normal fontsize in {{refbegin}} */ +} +div.reflist ol.references { + font-size: 100%; /* Reset font-size when nested in div.reflist */ + list-style-type: inherit; /* Enable custom list style types */ +} + +/* Reset top margin for lists embedded in columns */ +div.columns { + margin-top: 0.3em; +} +div.columns dl, +div.columns ol, +div.columns ul { + margin-top: 0; +} + +/* Avoid list items from breaking between columns */ +div.columns li, +div.columns dd dd { + -webkit-column-break-inside: avoid; + page-break-inside: avoid; + break-inside: avoid-column; +} + +/* Highlight clicked reference in blue to help navigation */ +ol.references li:target, +sup.reference:target, +span.citation:target { + background-color: #DEF; +} + +/* Ensure refs in table headers and the like aren't bold or italic */ +sup.reference { + font-weight: normal; + font-style: normal; +} + +/* Allow hidden ref errors to be shown by user CSS */ +span.brokenref { + display: none; +} + +/* Styling for citations (CSS3). Breaks long urls, etc., rather than overflowing box */ +.citation { + word-wrap: break-word; +} + +/* For linked citation numbers and document IDs, where + the number need not be shown on a screen or a handheld, + but should be included in the printed version */ +@media screen, handheld { + .citation *.printonly { + display: none; + } +} + +/* Style for [[Template:Flowlist]] that Lets lists flow around floating objecs */ +.flowlist ul { + overflow-x: hidden; + margin-left: 0em; + padding-left: 1.6em; +} +.flowlist ol { + overflow-x: hidden; + margin-left: 0em; + padding-left: 3.2em; +} +.flowlist dl { + overflow-x: hidden; +} + +/* Style for horizontal lists (separator following item). + IE8-specific classes are assigned in [[MediaWiki:Common.js/IEFixes.js]]. + @source mediawiki.org/wiki/Snippets/Horizontal_lists + @revision 4.3 (2014-01-06) + @author [[User:Edokter]] + */ +.hlist dl, +.hlist ol, +.hlist ul { + margin: 0; + padding: 0; +} +/* Display list items inline */ +.hlist dd, +.hlist dt, +.hlist li { + margin: 0; + display: inline; +} +/* Display nested lists inline */ +.hlist dl dl, .hlist dl ol, .hlist dl ul, +.hlist ol dl, .hlist ol ol, .hlist ol ul, +.hlist ul dl, .hlist ul ol, .hlist ul ul { + display: inline; +} +/* Generate interpuncts */ +.hlist dt:after { + content: ": "; +} +.hlist dd:after, +.hlist li:after { + content: " · "; + font-weight: bold; +} +.hlist dd:last-child:after, +.hlist dt:last-child:after, +.hlist li:last-child:after { + content: none; +} +/* For IE8 */ +.hlist dd.hlist-last-child:after, +.hlist dt.hlist-last-child:after, +.hlist li.hlist-last-child:after { + content: none; +} +/* Add parentheses around nested lists */ +.hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before, +.hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before, +.hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before { + content: " ("; + font-weight: normal; +} +.hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after, +.hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after, +.hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after { + content: ") "; + font-weight: normal; +} +/* For IE8 */ +.hlist dd dd.hlist-last-child:after, .hlist dd dt.hlist-last-child:after, .hlist dd li.hlist-last-child:after, +.hlist dt dd.hlist-last-child:after, .hlist dt dt.hlist-last-child:after, .hlist dt li.hlist-last-child:after, +.hlist li dd.hlist-last-child:after, .hlist li dt.hlist-last-child:after, .hlist li li.hlist-last-child:after { + content: ") "; + font-weight: normal; +} +/* Put ordinals in front of ordered list items */ +.hlist ol { + counter-reset: listitem; +} +.hlist ol > li { + counter-increment: listitem; +} +.hlist ol > li:before { + content: " " counter(listitem) " "; +} +.hlist dd ol > li:first-child:before, +.hlist dt ol > li:first-child:before, +.hlist li ol > li:first-child:before { + content: " (" counter(listitem) " "; +} + +/* Unbulleted lists */ +.plainlist ul { + line-height: inherit; + list-style: none none; + margin: 0; +} +.plainlist ul li { + margin-bottom: 0; +} + +/* Default style for navigation boxes */ +.navbox { /* Navbox container style */ + border: 1px solid #aaa; + width: 100%; + margin: auto; + clear: both; + font-size: 88%; + text-align: center; + padding: 1px; +} +.navbox-inner, +.navbox-subgroup { + width: 100%; +} +.navbox-group, +.navbox-title, +.navbox-abovebelow { + padding: 0.25em 1em; /* Title, group and above/below styles */ + line-height: 1.5em; + text-align: center; +} +th.navbox-group { /* Group style */ + white-space: nowrap; + /* @noflip */ + text-align: right; +} +.navbox, +.navbox-subgroup { + background: #fdfdfd; /* Background color */ +} +.navbox-list { + line-height: 1.8em; + border-color: #fdfdfd; /* Must match background color */ +} +.navbox th, +.navbox-title { + background: #ccccff; /* Level 1 color */ +} +.navbox-abovebelow, +th.navbox-group, +.navbox-subgroup .navbox-title { + background: #ddddff; /* Level 2 color */ +} +.navbox-subgroup .navbox-group, +.navbox-subgroup .navbox-abovebelow { + background: #e6e6ff; /* Level 3 color */ +} +.navbox-even { + background: #f7f7f7; /* Even row striping */ +} +.navbox-odd { + background: transparent; /* Odd row striping */ +} +table.navbox + table.navbox { /* Single pixel border between adjacent navboxes */ + margin-top: -1px; /* (doesn't work for IE6, but that's okay) */ +} +.navbox .hlist td dl, +.navbox .hlist td ol, +.navbox .hlist td ul, +.navbox td.hlist dl, +.navbox td.hlist ol, +.navbox td.hlist ul { + padding: 0.125em 0; /* Adjust hlist padding in navboxes */ +} +ol + table.navbox, +ul + table.navbox { + margin-top: 0.5em; /* Prevent lists from clinging to navboxes */ +} + +/* Default styling for Navbar template */ +.navbar { + display: inline; + font-size: 88%; + font-weight: normal; +} +.navbar ul { + display: inline; + white-space: nowrap; +} +.navbar li { + word-spacing: -0.125em; +} +.navbar.mini li span { + font-variant: small-caps; +} +/* Navbar styling when nested in infobox and navbox */ +.infobox .navbar { + font-size: 100%; +} +.navbox .navbar { + display: block; + font-size: 100%; +} +.navbox-title .navbar { + /* @noflip */ + float: left; + /* @noflip */ + text-align: left; + /* @noflip */ + margin-right: 0.5em; + width: 6em; +} + +/* 'show'/'hide' buttons created dynamically by the CollapsibleTables javascript + in [[MediaWiki:Common.js]] are styled here so they can be customised. */ +.collapseButton { + /* @noflip */ + float: right; + font-weight: normal; + /* @noflip */ + margin-left: 0.5em; + /* @noflip */ + text-align: right; + width: auto; +} +/* In navboxes, the show/hide button balances the v·d·e links + from [[Template:Navbar]], so they need to be the same width. */ +.navbox .collapseButton { + width: 6em; +} + +/* Styling for JQuery makeCollapsible, matching that of collapseButton */ +.mw-collapsible-toggle { + font-weight: normal; + /* @noflip */ + text-align: right; +} +.navbox .mw-collapsible-toggle { + width: 6em; +} + +/* Infobox template style */ +.infobox { + border: 1px solid #aaa; + background-color: #f9f9f9; + color: black; + /* @noflip */ + margin: 0.5em 0 0.5em 1em; + padding: 0.2em; + /* @noflip */ + float: right; + /* @noflip */ + clear: right; + /* @noflip */ + text-align: left; + font-size: 88%; + line-height: 1.5em; +} +.infobox caption { + font-size: 125%; + font-weight: bold; +} +.infobox td, +.infobox th { + vertical-align: top; +} +.infobox.bordered { + border-collapse: collapse; +} +.infobox.bordered td, +.infobox.bordered th { + border: 1px solid #aaa; +} +.infobox.bordered .borderless td, +.infobox.bordered .borderless th { + border: 0; +} + +.infobox.sisterproject { + width: 20em; + font-size: 90%; +} + +.infobox.standard-talk { + border: 1px solid #c0c090; + background-color: #f8eaba; +} +.infobox.standard-talk.bordered td, +.infobox.standard-talk.bordered th { + border: 1px solid #c0c090; +} + +/* styles for bordered infobox with merged rows */ +.infobox.bordered .mergedtoprow td, +.infobox.bordered .mergedtoprow th { + border: 0; + border-top: 1px solid #aaa; + /* @noflip */ + border-right: 1px solid #aaa; +} + +.infobox.bordered .mergedrow td, +.infobox.bordered .mergedrow th { + border: 0; + /* @noflip */ + border-right: 1px solid #aaa; +} + +/* Styles for geography infoboxes, eg countries, + country subdivisions, cities, etc. */ +.infobox.geography { + border-collapse: collapse; + line-height: 1.2em; + font-size: 90%; +} + +.infobox.geography td, +.infobox.geography th { + border-top: 1px solid #aaa; + padding: 0.4em 0.6em 0.4em 0.6em; +} +.infobox.geography .mergedtoprow td, +.infobox.geography .mergedtoprow th { + border-top: 1px solid #aaa; + padding: 0.4em 0.6em 0.2em 0.6em; +} + +.infobox.geography .mergedrow td, +.infobox.geography .mergedrow th { + border: 0; + padding: 0 0.6em 0.2em 0.6em; +} + +.infobox.geography .mergedbottomrow td, +.infobox.geography .mergedbottomrow th { + border-top: 0; + border-bottom: 1px solid #aaa; + padding: 0 0.6em 0.4em 0.6em; +} + +.infobox.geography .maptable td, +.infobox.geography .maptable th { + border: 0; + padding: 0; +} + +/* Normal font styling for table row headers with scope="row" tag */ +.wikitable.plainrowheaders th[scope=row] { + font-weight: normal; + /* @noflip */ + text-align: left; +} + +/* Lists in data cells are always left-aligned */ +.wikitable td ul, +.wikitable td ol, +.wikitable td dl { + /* @noflip */ + text-align: left; +} +/* ...unless they also use the hlist class */ +.wikitable.hlist td ul, +.wikitable.hlist td ol, +.wikitable.hlist td dl { + text-align: inherit; +} + +/* Icons for medialist templates [[Template:Listen]], + [[Template:Multi-listen_start]], [[Template:Video]], + [[Template:Multi-video_start]] */ +div.listenlist { + background: url("//upload.wikimedia.org/wikipedia/commons/4/47/Sound-icon.svg") no-repeat scroll 0% 0% transparent; + background-size: 30px; + padding-left: 40px; +} + +/* Fix for hieroglyphs specificality issue in infoboxes ([[Bugzilla:41869]]) */ +table.mw-hiero-table td { + vertical-align: middle; +} + +/* Style rules for media list templates */ +div.medialist { + min-height: 50px; + margin: 1em; + /* @noflip */ + background-position: top left; + background-repeat: no-repeat; +} +div.medialist ul { + list-style-type: none; + list-style-image: none; + margin: 0; +} +div.medialist ul li { + padding-bottom: 0.5em; +} +div.medialist ul li li { + font-size: 91%; + padding-bottom: 0; +} + +/* Change the external link icon to an Adobe icon for all PDF files + in browsers that support these CSS selectors, like Mozilla and Opera */ +div#content a[href$=".pdf"].external, +div#content a[href*=".pdf?"].external, +div#content a[href*=".pdf#"].external, +div#content a[href$=".PDF"].external, +div#content a[href*=".PDF?"].external, +div#content a[href*=".PDF#"].external, +div#mw_content a[href$=".pdf"].external, +div#mw_content a[href*=".pdf?"].external, +div#mw_content a[href*=".pdf#"].external, +div#mw_content a[href$=".PDF"].external, +div#mw_content a[href*=".PDF?"].external, +div#mw_content a[href*=".PDF#"].external { + background: url("//upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif") no-repeat right; + /* @noflip */ + padding-right: 18px; +} + +/* Change the external link icon to an Adobe icon anywhere the PDFlink class + is used (notably Template:PDFlink). This works in IE, unlike the above. */ +div#content span.PDFlink a, +div#mw_content span.PDFlink a { + background: url("//upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif") no-repeat right; + /* @noflip */ + padding-right: 18px; +} + +/* Content in columns with CSS instead of tables ([[Template:Columns]]) */ +div.columns-2 div.column { + /* @noflip */ + float: left; + width: 50%; + min-width: 300px; +} +div.columns-3 div.column { + /* @noflip */ + float: left; + width: 33.3%; + min-width: 200px; +} +div.columns-4 div.column { + /* @noflip */ + float: left; + width: 25%; + min-width: 150px; +} +div.columns-5 div.column { + /* @noflip */ + float: left; + width: 20%; + min-width: 120px; +} + +/* Messagebox templates */ +.messagebox { + border: 1px solid #aaa; + background-color: #f9f9f9; + width: 80%; + margin: 0 auto 1em auto; + padding: .2em; +} +.messagebox.merge { + border: 1px solid #c0b8cc; + background-color: #f0e5ff; + text-align: center; +} +.messagebox.cleanup { + border: 1px solid #9f9fff; + background-color: #efefff; + text-align: center; +} +.messagebox.standard-talk { + border: 1px solid #c0c090; + background-color: #f8eaba; + margin: 4px auto; +} +/* For old WikiProject banners inside banner shells. */ +.mbox-inside .standard-talk, +.messagebox.nested-talk { + border: 1px solid #c0c090; + background-color: #f8eaba; + width: 100%; + margin: 2px 0; + padding: 2px; +} +.messagebox.small { + width: 238px; + font-size: 85%; + /* @noflip */ + float: right; + clear: both; + /* @noflip */ + margin: 0 0 1em 1em; + line-height: 1.25em; +} +.messagebox.small-talk { + width: 238px; + font-size: 85%; + /* @noflip */ + float: right; + clear: both; + /* @noflip */ + margin: 0 0 1em 1em; + line-height: 1.25em; + background: #F8EABA; +} + +/* Cell sizes for ambox/tmbox/imbox/cmbox/ombox/fmbox/dmbox message boxes */ +th.mbox-text, td.mbox-text { /* The message body cell(s) */ + border: none; + /* @noflip */ + padding: 0.25em 0.9em; /* 0.9em left/right */ + width: 100%; /* Make all mboxes the same width regardless of text length */ +} +td.mbox-image { /* The left image cell */ + border: none; + /* @noflip */ + padding: 2px 0 2px 0.9em; /* 0.9em left, 0px right */ + text-align: center; +} +td.mbox-imageright { /* The right image cell */ + border: none; + /* @noflip */ + padding: 2px 0.9em 2px 0; /* 0px left, 0.9em right */ + text-align: center; +} +td.mbox-empty-cell { /* An empty narrow cell */ + border: none; + padding: 0px; + width: 1px; +} + +/* Article message box styles */ +table.ambox { + margin: 0px 10%; /* 10% = Will not overlap with other elements */ + border: 1px solid #aaa; + /* @noflip */ + border-left: 10px solid #1e90ff; /* Default "notice" blue */ + background: #fbfbfb; +} +table.ambox + table.ambox { /* Single border between stacked boxes. */ + margin-top: -1px; +} +.ambox th.mbox-text, +.ambox td.mbox-text { /* The message body cell(s) */ + padding: 0.25em 0.5em; /* 0.5em left/right */ +} +.ambox td.mbox-image { /* The left image cell */ + /* @noflip */ + padding: 2px 0 2px 0.5em; /* 0.5em left, 0px right */ +} +.ambox td.mbox-imageright { /* The right image cell */ + /* @noflip */ + padding: 2px 0.5em 2px 0; /* 0px left, 0.5em right */ +} + +table.ambox-notice { + /* @noflip */ + border-left: 10px solid #1e90ff; /* Blue */ +} +table.ambox-speedy { + /* @noflip */ + border-left: 10px solid #b22222; /* Red */ + background: #fee; /* Pink */ +} +table.ambox-delete { + /* @noflip */ + border-left: 10px solid #b22222; /* Red */ +} +table.ambox-content { + /* @noflip */ + border-left: 10px solid #f28500; /* Orange */ +} +table.ambox-style { + /* @noflip */ + border-left: 10px solid #f4c430; /* Yellow */ +} +table.ambox-move { + /* @noflip */ + border-left: 10px solid #9932cc; /* Purple */ +} +table.ambox-protection { + /* @noflip */ + border-left: 10px solid #bba; /* Gray-gold */ +} + +/* Image message box styles */ +table.imbox { + margin: 4px 10%; + border-collapse: collapse; + border: 3px solid #1e90ff; /* Default "notice" blue */ + background: #fbfbfb; +} +.imbox .mbox-text .imbox { /* For imboxes inside imbox-text cells. */ + margin: 0 -0.5em; /* 0.9 - 0.5 = 0.4em left/right. */ + display: block; /* Fix for webkit to force 100% width. */ +} +.mbox-inside .imbox { /* For imboxes inside other templates. */ + margin: 4px; +} + +table.imbox-notice { + border: 3px solid #1e90ff; /* Blue */ +} +table.imbox-speedy { + border: 3px solid #b22222; /* Red */ + background: #fee; /* Pink */ +} +table.imbox-delete { + border: 3px solid #b22222; /* Red */ +} +table.imbox-content { + border: 3px solid #f28500; /* Orange */ +} +table.imbox-style { + border: 3px solid #f4c430; /* Yellow */ +} +table.imbox-move { + border: 3px solid #9932cc; /* Purple */ +} +table.imbox-protection { + border: 3px solid #bba; /* Gray-gold */ +} +table.imbox-license { + border: 3px solid #88a; /* Dark gray */ + background: #f7f8ff; /* Light gray */ +} +table.imbox-featured { + border: 3px solid #cba135; /* Brown-gold */ +} + +/* Category message box styles */ +table.cmbox { + margin: 3px 10%; + border-collapse: collapse; + border: 1px solid #aaa; + background: #DFE8FF; /* Default "notice" blue */ +} + +table.cmbox-notice { + background: #D8E8FF; /* Blue */ +} +table.cmbox-speedy { + margin-top: 4px; + margin-bottom: 4px; + border: 4px solid #b22222; /* Red */ + background: #FFDBDB; /* Pink */ +} +table.cmbox-delete { + background: #FFDBDB; /* Red */ +} +table.cmbox-content { + background: #FFE7CE; /* Orange */ +} +table.cmbox-style { + background: #FFF9DB; /* Yellow */ +} +table.cmbox-move { + background: #E4D8FF; /* Purple */ +} +table.cmbox-protection { + background: #EFEFE1; /* Gray-gold */ +} + +/* Other pages message box styles */ +table.ombox { + margin: 4px 10%; + border-collapse: collapse; + border: 1px solid #aaa; /* Default "notice" gray */ + background: #f9f9f9; +} + +table.ombox-notice { + border: 1px solid #aaa; /* Gray */ +} +table.ombox-speedy { + border: 2px solid #b22222; /* Red */ + background: #fee; /* Pink */ +} +table.ombox-delete { + border: 2px solid #b22222; /* Red */ +} +table.ombox-content { + border: 1px solid #f28500; /* Orange */ +} +table.ombox-style { + border: 1px solid #f4c430; /* Yellow */ +} +table.ombox-move { + border: 1px solid #9932cc; /* Purple */ +} +table.ombox-protection { + border: 2px solid #bba; /* Gray-gold */ +} + +/* Talk page message box styles */ +table.tmbox { + margin: 4px 10%; + border-collapse: collapse; + border: 1px solid #c0c090; /* Default "notice" gray-brown */ + background: #f8eaba; +} +.mediawiki .mbox-inside .tmbox { /* For tmboxes inside other templates. The "mediawiki" class ensures that */ + margin: 2px 0; /* this declaration overrides other styles (including mbox-small above) */ + width: 100%; /* For Safari and Opera */ +} +.mbox-inside .tmbox.mbox-small { /* "small" tmboxes should not be small when */ + line-height: 1.5em; /* also "nested", so reset styles that are */ + font-size: 100%; /* set in "mbox-small" above. */ +} + +table.tmbox-speedy { + border: 2px solid #b22222; /* Red */ + background: #fee; /* Pink */ +} +table.tmbox-delete { + border: 2px solid #b22222; /* Red */ +} +table.tmbox-content { + border: 2px solid #f28500; /* Orange */ +} +table.tmbox-style { + border: 2px solid #f4c430; /* Yellow */ +} +table.tmbox-move { + border: 2px solid #9932cc; /* Purple */ +} +table.tmbox-protection, +table.tmbox-notice { + border: 1px solid #c0c090; /* Gray-brown */ +} + +/* Disambig and set index box styles */ +table.dmbox { + clear: both; + margin: 0.9em 1em; + border-top: 1px solid #ccc; + border-bottom: 1px solid #ccc; + background: transparent; +} + +/* Footer and header message box styles */ +table.fmbox { + clear: both; + margin: 0.2em 0; + width: 100%; + border: 1px solid #aaa; + background: #f9f9f9; /* Default "system" gray */ +} +table.fmbox-system { + background: #f9f9f9; +} +table.fmbox-warning { + border: 1px solid #bb7070; /* Dark pink */ + background: #ffdbdb; /* Pink */ +} +table.fmbox-editnotice { + background: transparent; +} +/* Div based "warning" style fmbox messages. */ +div.mw-warning-with-logexcerpt, +div.mw-lag-warn-high, +div.mw-cascadeprotectedwarning, +div#mw-protect-cascadeon { + clear: both; + margin: 0.2em 0; + border: 1px solid #bb7070; + background: #ffdbdb; + padding: 0.25em 0.9em; +} +/* Div based "system" style fmbox messages. + Used in [[MediaWiki:Readonly lag]]. */ +div.mw-lag-warn-normal, +div.fmbox-system { + clear: both; + margin: 0.2em 0; + border: 1px solid #aaa; + background: #f9f9f9; + padding: 0.25em 0.9em; +} + +/* These mbox-small classes must be placed after all other + ambox/tmbox/ombox etc classes. "body.mediawiki" is so + they override "table.ambox + table.ambox" above. */ +body.mediawiki table.mbox-small { /* For the "small=yes" option. */ + /* @noflip */ + clear: right; + /* @noflip */ + float: right; + /* @noflip */ + margin: 4px 0 4px 1em; + width: 238px; + font-size: 88%; + line-height: 1.25em; +} +body.mediawiki table.mbox-small-left { /* For the "small=left" option. */ + /* @noflip */ + margin: 4px 1em 4px 0; + width: 238px; + border-collapse: collapse; + font-size: 88%; + line-height: 1.25em; +} + +/* Style for compact ambox */ +/* Hide the images */ +.compact-ambox table .mbox-image, +.compact-ambox table .mbox-imageright, +.compact-ambox table .mbox-empty-cell { + display: none; +} +/* Remove borders, backgrounds, padding, etc. */ +.compact-ambox table.ambox { + border: none; + border-collapse: collapse; + background: transparent; + margin: 0 0 0 1.6em !important; + padding: 0 !important; + width: auto; + display: block; +} +body.mediawiki .compact-ambox table.mbox-small-left { + font-size: 100%; + width: auto; + margin: 0; +} +/* Style the text cell as a list item and remove its padding */ +.compact-ambox table .mbox-text { + padding: 0 !important; + margin: 0 !important; +} +.compact-ambox table .mbox-text-span { + display: list-item; + line-height: 1.5em; + list-style-type: square; + list-style-image: url(//bits.wikimedia.org/skins/common/images/bullet.gif); +} +.skin-vector .compact-ambox table .mbox-text-span { + list-style-type: circle; + list-style-image: url(//bits.wikimedia.org/skins/vector/images/bullet-icon.png) +} +/* Allow for hiding text in compact form */ +.compact-ambox .hide-when-compact { + display: none; +} + +/* Remove default styles for [[MediaWiki:Noarticletext]]. */ +div.noarticletext { + border: none; + background: transparent; + padding: 0; +} + +/* Hide (formatting) elements from screen, but not from screenreaders */ +.visualhide { + position: absolute; + left: -10000px; + top: auto; + width: 1px; + height: 1px; + overflow: hidden; +} + +/* Bold save button */ +#wpSave { + font-weight: bold; +} + +/* class hiddenStructure is defunct. See [[Wikipedia:hiddenStructure]] */ +.hiddenStructure { + display: inline !important; + color: #f00; + background-color: #0f0; +} + +/* suppress missing interwiki image links where #ifexist cannot + be used due to high number of requests see .hidden-redlink on + [[m:MediaWiki:Common.css]] */ +.check-icon a.new { + display: none; + speak: none; +} + +/* Removes underlines from certain links */ +.nounderlines a, +.IPA a:link, .IPA a:visited { + text-decoration: none !important; +} + +/* Standard Navigationsleisten, aka box hiding thingy + from .de. Documentation at [[Wikipedia:NavFrame]]. */ +div.NavFrame { + margin: 0; + padding: 4px; + border: 1px solid #aaa; + text-align: center; + border-collapse: collapse; + font-size: 95%; +} +div.NavFrame + div.NavFrame { + border-top-style: none; + border-top-style: hidden; +} +div.NavPic { + background-color: #fff; + margin: 0; + padding: 2px; + /* @noflip */ + float: left; +} +div.NavFrame div.NavHead { + height: 1.6em; + font-weight: bold; + background-color: #ccf; + position: relative; +} +div.NavFrame p, +div.NavFrame div.NavContent, +div.NavFrame div.NavContent p { + font-size: 100%; +} +div.NavEnd { + margin: 0; + padding: 0; + line-height: 1px; + clear: both; +} +a.NavToggle { + position: absolute; + top: 0; + /* @noflip */ + right: 3px; + font-weight: normal; + font-size: 90%; +} + +/* Hatnotes and disambiguation notices */ +.rellink, +.dablink { + font-style: italic; + /* @noflip */ + padding-left: 1.6em; + margin-bottom: 0.5em; +} +.rellink i, +.dablink i { + font-style: normal; +} + +/* Allow transcluded pages to display in lists rather than a table. + Compatible in Firefox; incompatible in IE6. */ +.listify td { display: list-item; } +.listify tr { display: block; } +.listify table { display: block; } + +/* Geographical coordinates defaults. See [[Template:Coord/link]] + for how these are used. The classes "geo", "longitude", and + "latitude" are used by the [[Geo microformat]]. */ +.geo-default, .geo-dms, .geo-dec { display: inline; } +.geo-nondefault, .geo-multi-punct { display: none; } +.longitude, .latitude { white-space: nowrap; } + +/* When <div class="nonumtoc"> is used on the table of contents, + the ToC will display without numbers */ +.nonumtoc .tocnumber { display: none; } +.nonumtoc #toc ul, +.nonumtoc .toc ul { + line-height: 1.5em; + list-style: none none; + margin: .3em 0 0; + padding: 0; +} +.nonumtoc #toc ul ul, +.nonumtoc .toc ul ul { + /* @noflip */ + margin: 0 0 0 2em; +} + +/* Allow limiting of which header levels are shown in a TOC; + <div class="toclimit-3">, for instance, will limit to + showing ==headings== and ===headings=== but no further + (as long as there are no =headings= on the page, which + there shouldn't be according to the MoS). */ +.toclimit-2 .toclevel-1 ul, +.toclimit-3 .toclevel-2 ul, +.toclimit-4 .toclevel-3 ul, +.toclimit-5 .toclevel-4 ul, +.toclimit-6 .toclevel-5 ul, +.toclimit-7 .toclevel-6 ul { + display: none; +} + +/* Styling for Template:Quote */ +blockquote.templatequote { + margin-top: 0; +} +blockquote.templatequote div.templatequotecite { + line-height: 1em; + /* @noflip */ + text-align: left; + /* @noflip */ + padding-left: 2em; + margin-top: 0; +} +blockquote.templatequote div.templatequotecite cite { + font-size: 85%; +} + +/* User block messages */ +div.user-block { + padding: 5px; + margin-bottom: 0.5em; + border: 1px solid #A9A9A9; + background-color: #FFEFD5; +} + +/* Prevent line breaks in silly places: + 1) Where desired + 2) Links when we don't want them to + 3) Bold "links" to the page itself + 4) Ref tags with group names <ref group="Note"> --> "[Note 1]" */ +.nowrap, +.nowraplinks a, +.nowraplinks .selflink, +sup.reference a { + white-space: nowrap; +} +/* But allow wrapping where desired: */ +.wrap, +.wraplinks a { + white-space: normal; +} + +/* For template documentation */ +.template-documentation { + clear: both; + margin: 1em 0 0 0; + border: 1px solid #aaa; + background-color: #ecfcf4; + padding: 1em; +} + +/* Inline divs in ImageMaps (code borrowed from de.wiki) */ +.imagemap-inline div { + display: inline; +} + +/* Increase the height of the image upload box */ +#wpUploadDescription { + height: 13em; +} + +/* Minimum thumb width */ +.thumbinner { + min-width: 100px; +} + +/* Makes the background of a framed image white instead of gray. + Only visible with transparent images. */ +div.thumb .thumbimage { + background-color: #fff; +} + +/* The backgrounds for galleries. */ +div#content .gallerybox div.thumb { + /* Light gray padding */ + background-color: #F9F9F9; +} +/* Put a chequered background behind images, only visible if they have transparency. + '.filehistory a img' and '#file img:hover' are handled by MediaWiki core (as of 1.19) */ +.gallerybox .thumb img { + background: #fff url(//bits.wikimedia.org/skins/common/images/Checker-16x16.png) repeat; +} +/* But not on articles, user pages, portals or with opt-out. */ +.ns-0 .gallerybox .thumb img, +.ns-2 .gallerybox .thumb img, +.ns-100 .gallerybox .thumb img, +.nochecker .gallerybox .thumb img { + background: #fff; +} + +/* Prevent floating boxes from overlapping any category listings, + file histories, edit previews, and edit [Show changes] views. */ +#mw-subcategories, #mw-pages, #mw-category-media, +#filehistory, #wikiPreview, #wikiDiff { + clear: both; +} + +body.rtl #mw-articlefeedbackv5, body.rtl #mw-articlefeedback { + display: block; /* Override inline block mode */ + margin-bottom: 1em; + /* @noflip */ + clear: right; /* Clear any info boxes that stick out */ + /* @noflip */ + float: right; /* Prevents margin collapsing */ +} + +/* Selectively hide headers in WikiProject banners */ +.wpb .wpb-header { display: none; } +.wpbs-inner .wpb .wpb-header { display: block; } /* for IE */ +.wpbs-inner .wpb .wpb-header { display: table-row; } /* for real browsers */ +.wpbs-inner .wpb-outside { display: none; } /* hide things that should only display outside shells */ + +/* Styling for Abuse Filter tags */ +.mw-tag-markers { + font-family:sans-serif; + font-style:italic; + font-size:90%; +} + +/* Hide stuff meant for accounts with special permissions. Made visible again in + [[MediaWiki:Group-sysop.css]], [[MediaWiki:Group-accountcreator.css]], + [[MediaWiki:Group-templateeditor.css]] and [[Mediawiki:Group-autoconfirmed.css]]. */ +.sysop-show, +.accountcreator-show, +.templateeditor-show, +.autoconfirmed-show { + display: none; +} + +/** + * Hide the redlink generated by {{Editnotice}}, + * this overrides the ".sysop-show { display: none; }" above that applies + * to the same link as well. + */ +.ve-init-mw-viewPageTarget-toolbar-editNotices-notice .editnotice-redlink { + display: none !important; +} + +/* Remove bullets when there are multiple edit page warnings */ +ul.permissions-errors > li { + list-style: none none; +} +ul.permissions-errors { + margin: 0; +} + +/* No linewrap on the labels of the login/signup page */ +body.page-Special_UserLogin .mw-label label, +body.page-Special_UserLogin_signup .mw-label label { + white-space: nowrap; +} + +/* Pie chart test: Transparent borders */ +.transborder { + border: solid transparent; +} +* html .transborder { /* IE6 */ + border: solid #000001; + filter: chroma(color=#000001); +} + +/* Styling for updated markers on watchlist, history and recent/related changes. + Bullets are handled in skin-specific stylesheets. */ +.updatedmarker { + background-color: transparent; + color: #006400; +} +li.mw-changeslist-line-watched .mw-title, +table.mw-changeslist-line-watched .mw-title, +table.mw-enhanced-watch .mw-enhanced-rctime { + font-weight: normal; +} + +/* Adjust font for inline HTML generated formulae */ +span.texhtml { + font-family: "Times New Roman", "Nimbus Roman No9 L", Times, serif; + font-size: 118%; + white-space: nowrap; +} +span.texhtml span.texhtml { + font-size: 100%; +} + +/* Fix so <syntaxhighlight> tags and .css and .js pages get normal text size. + [[Bugzilla:26204]]. See also [[Wikipedia:Typography#The monospace 'bug']] */ +div.mw-geshi div, +div.mw-geshi div pre, +span.mw-geshi, +pre.source-css, +pre.source-javascript, +pre.source-lua { + font-family: monospace, Courier !important; +} + +/* Fix styling of transcluded prefindex tables */ +table#mw-prefixindex-list-table, +table#mw-prefixindex-nav-table { + width: 98%; +} + +/* For portals, added 2011-12-07 -bv + On wide screens, show these as two columns + On narrow and mobile screens, let them collapse into a single column */ +.portal-column-left { + float: left; + width: 50%; +} +.portal-column-right { + float: right; + width: 49%; +} +.portal-column-left-wide { + float: left; + width: 60%; +} +.portal-column-right-narrow { + float: right; + width: 39%; +} +.portal-column-left-extra-wide { + float: left; + width: 70%; +} +.portal-column-right-extra-narrow { + float: right; + width: 29%; +} +@media only screen and (max-width: 800px) { + /* Decouple the columns on narrow screens */ + .portal-column-left, + .portal-column-right, + .portal-column-left-wide, + .portal-column-right-narrow, + .portal-column-left-extra-wide, + .portal-column-right-extra-narrow { + float: inherit; + width: inherit; + } +} + +/* For announcements */ +#bodyContent .letterhead { + background-image:url('//upload.wikimedia.org/wikipedia/commons/e/e0/Tan-page-corner.png'); + background-repeat:no-repeat; + padding: 2em; + background-color: #faf9f2; +} + +/* Tree style lists */ +.treeview ul { + padding: 0; + margin: 0; +} +.treeview li { + padding: 0; + margin: 0; + list-style-type: none; + list-style-image: none; + zoom: 1; /* BE KIND TO IE6 */; +} +.treeview li li { + background: url("//upload.wikimedia.org/wikipedia/commons/f/f2/Treeview-grey-line.png") no-repeat 0 -2981px; + /* @noflip */ + padding-left: 20px; + text-indent: 0.3em; +} +.treeview li li.lastline { + background-position: 0 -5971px +} +.treeview li.emptyline > ul { + /* @noflip */ + margin-left: -1px; +} +.treeview li.emptyline > ul > li:first-child { + background-position: 0 9px +} + +/* hidden sortkey for tablesorter */ +td .sortkey, +th .sortkey { + display: none; + speak: none; +} + +/* Make it possible to hide checkboxes in <inputbox> */ +.inputbox-hidecheckboxes form .inputbox-element { + display: none !important; +} + +/* Hide charinsert base for those not using the gadget */ +#editpage-specialchars { + display: none; +} + +/* work-around for [[bugzilla:23965]] (Kaltura advertisement) */ +.k-player .k-attribution { + visibility: hidden; +} + +/* [[MediaZilla:35337]] */ +@media (-webkit-min-device-pixel-ratio: 1.5), (min--moz-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx), (min-resolution: 144dpi) { + #p-logo a { + background-image: url("//upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Wikipedia-logo-v2-en.svg/204px-Wikipedia-logo-v2-en.svg.png") !important; + background-size: 136px auto; + } +} +@media (-webkit-min-device-pixel-ratio: 2), (min--moz-device-pixel-ratio: 2), (min-resolution: 2dppx), (min-resolution: 192dpi) { + #p-logo a { + background-image: url("//upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Wikipedia-logo-v2-en.svg/270px-Wikipedia-logo-v2-en.svg.png") !important; + background-size: 135px auto; + } +} +/* Do not print: + 1: When in mainspace: Article message boxes, + navboxes, sister project boxes, disambig links, + and items marked as metadata. + 2: section edit links. + 3: navbar links. + 4: Show/hide toggles for collapsible items. +*/ +.ns-0 .ambox, +.ns-0 .navbox, +.ns-0 .vertical-navbox, +.ns-0 .infobox.sisterproject, +.ns-0 .dablink, +.ns-0 .metadata, +.editlink, +.navbar, +a.NavToggle, span.collapseButton, span.mw-collapsible-toggle, +th .sortkey, td .sortkey { + display: none !important; +} + +/* Add formatting to make sure that "external references" from templates + like [[Template:Ref]] do not get URL expansion, not even when printed. + The anchor itself has class "external autonumber" and the url expansion + is inserted when printing (see the common printing style sheet at + http://en.wikipedia.org/skins-1.5/common/commonPrint.css) using the + ":after" pseudo-element of CSS. Also hide in <cite> elements. +*/ +#content cite a.external.text:after, +.nourlexpansion a.external.text:after, +.nourlexpansion a.external.autonumber:after { + display: none !important; +} + +/* Uncollapse collapsible tables/divs. + The proper way to do this for tables is to use display:table-row, + but this is not supported by all browsers, so use display:block as fallback. +*/ +table.collapsible tr, div.NavPic, div.NavContent { + display: block !important; +} +table.collapsible tr { + display: table-row !important; +} + +/* On websites with siteSub visible, the margin on the firstHeading is not needed. */ +#firstHeading { + margin: 0px; +} + +/* We don't want very long URLs (that are added to the content in print) to widen the canvas */ +#content a.external.text:after, +#content a.external.autonumber:after { + word-wrap: break-word; +} +/* Don't display some stuff on the main page */ +body.page-Main_Page #deleteconfirm, +body.page-Main_Page #t-cite, +body.page-Main_Page #footer-info-lastmod, +body.action-view.page-Main_Page #siteSub, +body.action-view.page-Main_Page #contentSub, +body.action-view.page-Main_Page h1.firstHeading { + display: none !important; +} + +/* Position Main Page top banner */ +body.page-Main_Page #mp-topbanner { + margin-top: 0 !important; +} + +/* Position coordinates */ +#coordinates { + position: absolute; + top: 0em; + right: 0em; + float: right; + margin: 0em; + padding: 0em; + line-height: 1.5em; + text-align: right; + text-indent: 0; + font-size: 85%; + text-transform: none; + white-space: nowrap; +} + +/* For positioning icons at top-right, used in Templates + "Spoken Article" and "Featured Article" */ +div.topicon { + position: absolute; + top: -2em; + margin-right: -10px; + display: block !important; +} + +/* FR topicon position */ +div.flaggedrevs_short { + position: absolute; + top: -3em; + right: 80px; + z-index: 1; + margin-left: 0; + /* Because this is not yet a topicon, we emulate it's behavior, + this ensure compatibility with edit lead section gadget. */ + margin-right: -10px; +} + +/* On rtl interfaces, we need to override the defaults. + It is content included (so ltr), but positioned in part of the rtl interface. */ +body.rtl #protected-icon { + /* @noflip */ + left: 55px; +} +body.rtl #spoken-icon, +body.rtl #commons-icon { + /* @noflip */ + left: 30px; +} +body.rtl #featured-star { + /* @noflip */ + left: 10px; +} + +/* Menu over FR box */ +div.vectorMenu div { + z-index: 2; +} + +/* Display "From Wikipedia, the free encyclopedia" */ +#siteSub { + display: inline; + font-size: 92%; +} + +/* Bullets for Good and Featured interwiki links */ +li.GA { + list-style-image: url(//upload.wikimedia.org/wikipedia/commons/4/42/Monobook-bullet-ga.png); +} +li.FA { + list-style-image: url(//upload.wikimedia.org/wikipedia/commons/d/d4/Monobook-bullet-star.png); +} + +/* Styling for updated markers on watchlist, history and recent/related changes */ +li.mw-changeslist-line-watched, +li.mw-history-line-updated { + list-style-image: url(//upload.wikimedia.org/wikipedia/commons/c/c2/ChangedBulletVector.png); +} + +/* Blue instead of yellow padlock for secure links. */ +#bodyContent a.external[href ^="https://"], +.link-https { + background: url(//upload.wikimedia.org/wikipedia/en/0/00/Lock_icon_blue.gif) center right no-repeat; + /* @noflip */ + padding-right: 16px; +} + +/* (Soft) redirect styling (bug:26544) */ +div.redirectMsg img { + vertical-align: text-bottom; +} +.redirectText { + font-size: 150%; + margin: 5px; +} diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/wikipedia.min.css b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/wikipedia.min.css new file mode 100644 index 00000000000..eecfc919430 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/wikipedia.min.css @@ -0,0 +1 @@ +html,body{height:100%;margin:0;padding:0;font-family:sans-serif;font-size:1em}body{background-color:#f3f3f3;background-image:url(images/page-base.png)}div#content{margin-left:10em;padding:1em;background-image:url(images/border.png);background-position:top left;background-repeat:repeat-y;background-color:white;color:black;direction:ltr}#mw-page-base{height:5em;background-color:white;background-image:url(images/page-fade.png);background-position:bottom left;background-repeat:repeat-x}#mw-head-base{margin-top:-5em;margin-left:10em;height:5em;background-image:url(images/border.png);background-position:bottom left;background-repeat:repeat-x}div#mw-head{position:absolute;top:0;right:0;width:100%}div#mw-head h5{margin:0;padding:0}div.emptyPortlet{display:none}#p-personal{position:absolute;top:0;right:.75em}#p-personal h5{display:none}#p-personal ul{list-style:none;margin:0;padding-left:10em}#p-personal li{line-height:1.125em;float:left}#p-personal li{margin-left:.75em;margin-top:.5em;font-size:.75em;white-space:nowrap}#left-navigation{position:absolute;left:10em;top:2.5em}#right-navigation{float:right;margin-top:2.5em}div.vectorTabs h5,div.vectorMenu h5 span{display:none}div.vectorTabs{float:left;height:2.5em}div.vectorTabs{background-image:url(images/tab-break.png);background-position:bottom left;background-repeat:no-repeat;padding-left:1px}div.vectorTabs ul{float:left}div.vectorTabs ul{height:100%;list-style:none;margin:0;padding:0}div.vectorTabs ul li{float:left}div.vectorTabs ul li{line-height:1.125em;display:inline-block;height:100%;margin:0;padding:0;background-color:#f3f3f3;background-image:url(images/tab-normal-fade.png);background-position:bottom left;background-repeat:repeat-x;white-space:nowrap}div.vectorTabs ul>li{display:block}div.vectorTabs li.selected{background-image:url(images/tab-current-fade.png)}div.vectorTabs li a{display:inline-block;height:1.9em;padding-left:.5em;padding-right:.5em;color:#0645ad;cursor:pointer;font-size:.8em}div.vectorTabs li>a{display:block}div.vectorTabs li.icon a{background-position:bottom right;background-repeat:no-repeat}div.vectorTabs span a{display:inline-block;padding-top:1.25em}div.vectorTabs span>a{float:left;display:block}div.vectorTabs span{display:inline-block;background-image:url(images/tab-break.png);background-position:bottom right;background-repeat:no-repeat}div.vectorTabs li.selected a,div.vectorTabs li.selected a:visited{color:#333;text-decoration:none}div.vectorTabs li.new a,div.vectorTabs li.new a:visited{color:#a55858}div.vectorMenu{direction:ltr;float:left;background-image:url(images/arrow-down-icon.png);background-position:100% 60%;background-repeat:no-repeat;cursor:pointer}div.vectorMenuFocus{background-image:url(images/arrow-down-focus-icon.png);background-position:100% 60%}body.rtl div.vectorMenu{direction:rtl}div#mw-head div.vectorMenu h5{float:left;background-image:url(images/tab-break.png);background-repeat:no-repeat}div#mw-head div.vectorMenu h5{background-position:bottom left;margin-left:-1px}div#mw-head div.vectorMenu>h5{background-image:none}div#mw-head div.vectorMenu h4{display:inline-block;float:left;font-size:.8em;padding-left:.5em;padding-top:1.375em;font-weight:normal;border:none}div.vectorMenu h5 a{display:inline-block;width:24px;height:2.5em;text-decoration:none;background-image:url(images/tab-break.png);background-repeat:no-repeat}div.vectorMenu h5 a{background-position:bottom right}div.vectorMenu h5>a{display:block}div.vectorMenu div.menu{position:relative;display:none;clear:both;text-align:left}body.rtl div.vectorMenu div.menu{margin-left:24px}body.rtl div.vectorMenu>div.menu{margin-left:auto}body.rtl div.vectorMenu>div.menu,x:-moz-any-link{margin-left:23px}div.vectorMenu:hover div.menu,div.vectorMenu div.menuForceShow{display:block}div.vectorMenu ul{position:absolute;background-color:white;border:solid 1px silver;border-top-width:0;list-style:none;list-style-image:none;list-style-type:none;padding:0;margin:0;margin-left:-1px;text-align:left}div.vectorMenu ul,x:-moz-any-link{min-width:5em}div.vectorMenu ul,x:-moz-any-link,x:default{min-width:0}div.vectorMenu li{padding:0;margin:0;text-align:left;line-height:1em}div.vectorMenu li a{display:inline-block;padding:.5em;white-space:nowrap;color:#0645ad;cursor:pointer;font-size:.8em}div.vectorMenu li>a{display:block}div.vectorMenu li.selected a,div.vectorMenu li.selected a:visited{color:#333;text-decoration:none}#p-search h5{display:none}#p-search{float:left}#p-search{margin-right:.5em;margin-left:.5em}#p-search form,#p-search input{margin:0;margin-top:.4em}div#simpleSearch{display:block;width:14em;height:1.4em;margin-top:.65em;position:relative;min-height:1px;border:solid 1px #AAA;color:black;background-color:white;background-image:url(images/search-fade.png);background-position:top left;background-repeat:repeat-x}div#simpleSearch label{font-size:13px;top:.25em;direction:ltr}div#simpleSearch input{color:black;direction:ltr}div#simpleSearch input:focus{outline:none}div#simpleSearch input.placeholder{color:#999}div#simpleSearch input::-webkit-input-placeholder{color:#999}div#simpleSearch input#searchInput{position:absolute;top:0;left:0;width:90%;margin:0;padding:0;padding-left:.2em;padding-top:.2em;padding-bottom:.2em;outline:none;border:none;font-size:13px;background-color:transparent;direction:ltr}div#simpleSearch button#searchButton{position:absolute;width:10%;right:0;top:0;padding:0;padding-top:.3em;padding-bottom:.2em;padding-right:.4em;margin:0;border:none;cursor:pointer;background-color:transparent;background-image:none}div#simpleSearch button#searchButton img{border:none;margin:0;margin-top:-3px;padding:0}div#simpleSearch button#searchButton>img{margin:0}div#mw-panel{position:absolute;top:160px;padding-top:1em;width:10em;left:0}div#mw-panel div.portal{padding-bottom:1.5em;direction:ltr}div#mw-panel div.portal h5{font-weight:normal;color:#444;padding:.25em;padding-top:0;padding-left:1.75em;cursor:default;border:none;font-size:.75em}div#mw-panel div.portal div.body{margin:0;padding-top:.5em;margin-left:1.25em;background-image:url(images/portal-break.png);background-repeat:no-repeat;background-position:top left}div#mw-panel div.portal div.body ul{list-style:none;list-style-image:none;list-style-type:none;padding:0;margin:0}div#mw-panel div.portal div.body ul li{line-height:1.125em;padding:0;padding-bottom:.5em;margin:0;overflow:hidden;font-size:.75em}div#mw-panel div.portal div.body ul li a{color:#0645ad}div#mw-panel div.portal div.body ul li a:visited{color:#0b0080}div#footer{margin-left:10em;margin-top:0;padding:.75em;background-image:url(images/border.png);background-position:top left;background-repeat:repeat-x;direction:ltr}div#footer ul{list-style:none;list-style-image:none;list-style-type:none;margin:0;padding:0}div#footer ul li{margin:0;padding:0;padding-top:.5em;padding-bottom:.5em;color:#333;font-size:.7em}div#footer #footer-icons{float:right}body.ltr div#footer #footer-places{float:left}div#footer #footer-info li{line-height:1.4em}div#footer #footer-icons li{float:left;margin-left:.5em;line-height:2em;text-align:right}div#footer #footer-places li{float:left;margin-right:1em;line-height:2em}#p-logo{position:absolute;top:-160px;left:0;width:10em;height:160px}#p-logo a{display:block;width:10em;height:160px;background-repeat:no-repeat;background-position:center center;text-decoration:none}#preftoc{width:100%;float:left;clear:both;margin:0!important;padding:0!important;background-image:url(images/preferences-break.png);background-position:bottom left;background-repeat:no-repeat}#preftoc li{float:left;margin:0;padding:0;padding-right:1px;height:2.25em;white-space:nowrap;list-style-type:none;list-style-image:none;background-image:url(images/preferences-break.png);background-position:bottom right;background-repeat:no-repeat}#preftoc li:first-child{margin-left:1px}#preftoc a,#preftoc a:active{display:inline-block;position:relative;color:#0645ad;padding:.5em;text-decoration:none;background-image:none;font-size:.9em}#preftoc a:hover,#preftoc a:focus{text-decoration:underline}#preftoc li.selected a{background-image:url(images/preferences-fade.png);background-position:bottom;background-repeat:repeat-x;color:#333;text-decoration:none}#preferences{float:left;width:100%;margin:0;margin-top:-2px;clear:both;border:solid 1px #ccc;background-color:#f9f9f9;background-image:url(images/preferences-base.png)}#preferences fieldset{border:none;border-top:solid 1px #ccc}#preferences fieldset.prefsection{border:none;padding:0;margin:1em}#preferences legend{color:#666}#preferences fieldset.prefsection legend.mainLegend{display:none}#preferences td{padding-left:.5em;padding-right:.5em}#preferences td.htmlform-tip{font-size:x-small;padding:.2em 2em;color:#666}#preferences div.mw-prefs-buttons{padding:1em}#preferences div.mw-prefs-buttons input{margin-right:.25em}div#content{line-height:1.5em}#bodyContent{font-size:.8em}.editsection{float:right}ul{list-style-image:url(images/bullet-icon.png)}pre{line-height:1.3em}#siteNotice{font-size:.8em}#firstHeading{padding-top:0;margin-top:0;padding-top:0;font-size:1.6em}div#content a.external,div#content a.external[href ^="gopher://"]{background:url(images/external-link-ltr-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href ^="https://"],.link-https{background:url(images/lock-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href ^="mailto:"],.link-mailto{background:url(images/mail-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href ^="news:"]{background:url(images/news-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href ^="ftp://"],.link-ftp{background:url(images/file-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href ^="irc://"],div#content a.external[href ^="ircs://"],.link-irc{background:url(images/talk-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href $=".ogg"],div#content a.external[href $=".OGG"],div#content a.external[href $=".mid"],div#content a.external[href $=".MID"],div#content a.external[href $=".midi"],div#content a.external[href $=".MIDI"],div#content a.external[href $=".mp3"],div#content a.external[href $=".MP3"],div#content a.external[href $=".wav"],div#content a.external[href $=".WAV"],div#content a.external[href $=".wma"],div#content a.external[href $=".WMA"],.link-audio{background:url(images/audio-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href $=".ogm"],div#content a.external[href $=".OGM"],div#content a.external[href $=".avi"],div#content a.external[href $=".AVI"],div#content a.external[href $=".mpeg"],div#content a.external[href $=".MPEG"],div#content a.external[href $=".mpg"],div#content a.external[href $=".MPG"],.link-video{background:url(images/video-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href $=".pdf"],div#content a.external[href $=".PDF"],div#content a.external[href *=".pdf#"],div#content a.external[href *=".PDF#"],div#content a.external[href *=".pdf?"],div#content a.external[href *=".PDF?"],.link-document{background:url(images/document-icon.png) center right no-repeat;padding-right:13px}#pt-userpage,#pt-anonuserpage,#pt-login{background:url(images/user-icon.png) left top no-repeat;padding-left:15px!important;text-transform:none}.redirectText{font-size:140%}.redirectMsg img{vertical-align:text-bottom}#bodyContent{position:relative;width:100%}#mw-js-message{font-size:.8em}div#bodyContent{line-height:1.5em}#ca-unwatch.icon a,#ca-watch.icon a{margin:0;padding:0;outline:none;display:block;width:26px;padding-top:3.1em;margin-top:0;margin-top:-0.8em!ie;height:0;overflow:hidden;background-image:url(images/watch-icons.png)}#ca-unwatch.icon a{background-position:-43px 60%}#ca-watch.icon a{background-position:5px 60%}#ca-unwatch.icon a:hover,#ca-unwatch.icon a:focus{background-position:-67px 60%}#ca-watch.icon a:hover,#ca-watch.icon a:focus{background-position:-19px 60%}#ca-unwatch.icon a.loading,#ca-watch.icon a.loading{background-image:url(images/watch-icon-loading.gif);background-position:5px 60%}#ca-unwatch.icon a span,#ca-watch.icon a span{display:none}div.vectorTabs ul{background-image:url(images/tab-break.png);background-position:right bottom;background-repeat:no-repeat}.tipsy{font-size:.8em}.mw-content-ltr{direction:ltr}.mw-content-rtl{direction:rtl}.sitedir-ltr textarea,.sitedir-ltr input{direction:ltr}.sitedir-rtl textarea,.sitedir-rtl input{direction:rtl}input[type="submit"],input[type="button"],input[type="reset"],input[type="file"]{direction:ltr}textarea[dir="ltr"],input[dir="ltr"]{direction:ltr}textarea[dir="rtl"],input[dir="rtl"]{direction:rtl}abbr,acronym,.explain{border-bottom:1px dotted;cursor:help}.mw-plusminus-pos{color:#006400}.mw-plusminus-neg{color:#8b0000}.mw-plusminus-null{color:#aaa}.allpagesredirect,.redirect-in-category,.watchlistredir{font-style:italic}span.comment{font-style:italic}span.changedby{font-size:95%}.texvc{direction:ltr;unicode-bidi:embed}img.tex{vertical-align:middle}span.texhtml{font-family:serif}#wikiPreview.ontop{margin-bottom:1em}#editform,#toolbar,#wpTextbox1{clear:both}#toolbar img{cursor:pointer}div#mw-js-message{margin:1em 5%;padding:.5em 2.5%;border:solid 1px #ddd;background-color:#fcfcfc}.editsection{float:right;margin-left:5px}.mw-content-ltr .editsection,.mw-content-rtl .mw-content-ltr .editsection{float:right}.mw-content-rtl .editsection,.mw-content-ltr .mw-content-rtl .editsection{float:left}div.mw-filepage-resolutioninfo{font-size:smaller}h2#filehistory{clear:both}table.filehistory th,table.filehistory td{vertical-align:top}table.filehistory th{text-align:left}table.filehistory td.mw-imagepage-filesize,table.filehistory th.mw-imagepage-filesize{white-space:nowrap}table.filehistory td.filehistory-selected{font-weight:bold}.filehistory a img,#file img:hover{background:white url(images/Checker-16x16.png) repeat}li span.deleted,span.history-deleted{text-decoration:line-through;color:#888;font-style:italic}.not-patrolled{background-color:#ffa}.unpatrolled{font-weight:bold;color:red}div.patrollink{font-size:75%;text-align:right}td.mw-label{text-align:right}td.mw-input{text-align:left}td.mw-submit{text-align:left}td.mw-label{vertical-align:top}.prefsection td.mw-label{width:20%}.prefsection table{width:100%}td.mw-submit{white-space:nowrap}table.mw-htmlform-nolabel td.mw-label{width:1px}tr.mw-htmlform-vertical-label td.mw-label{text-align:left!important}.mw-htmlform-invalid-input td.mw-input input{border-color:red}.mw-htmlform-flatlist div.mw-htmlform-flatlist-item{display:inline;margin-right:1em;white-space:nowrap}input#wpSummary{width:80%}.thumbcaption{text-align:left}.magnify{float:right}#catlinks{text-align:left}.catlinks ul{display:inline;margin:0;padding:0;list-style:none;list-style-type:none;list-style-image:none;vertical-align:middle!ie}.catlinks li{display:inline-block;line-height:1.25em;border-left:1px solid #AAA;margin:.125em 0;padding:0 .5em;zoom:1;display:inline!ie}.catlinks li:first-child{padding-left:.25em;border-left:none}.mw-hidden-cats-hidden{display:none}.catlinks-allhidden{display:none}p.mw-ipb-conveniencelinks,p.mw-protect-editreasons,p.mw-filedelete-editreasons,p.mw-delete-editreasons,p.mw-revdel-editreasons{font-size:90%;text-align:right}.os-suggest{overflow:auto;overflow-x:hidden;position:absolute;top:0;left:0;width:0;background-color:white;border-style:solid;border-color:#AAA;border-width:1px;z-index:99;font-size:95%}table.os-suggest-results{font-size:95%;cursor:pointer;border:0;border-collapse:collapse;width:100%}.os-suggest-result,.os-suggest-result-hl{white-space:nowrap;background-color:white;color:black;padding:2px}.os-suggest-result-hl,.os-suggest-result-hl-webkit{background-color:#4C59A6;color:white}.os-suggest-toggle{position:relative;left:1ex;font-size:65%}.os-suggest-toggle-def{position:absolute;top:0;left:0;font-size:65%;visibility:hidden}.autocomment{color:gray}#pagehistory .history-user{margin-left:.4em;margin-right:.2em}#pagehistory span.minor{font-weight:bold}#pagehistory li{border:1px solid white}#pagehistory li.selected{background-color:#f9f9f9;border:1px dashed #aaa}.mw-history-revisiondelete-button,#mw-fileduplicatesearch-icon{float:right}.newpage,.minoredit,.botedit{font-weight:bold}#shared-image-dup,#shared-image-conflict{font-style:italic}div.mw-warning-with-logexcerpt{padding:3px;margin-bottom:3px;border:2px solid #2F6FAB;clear:both}div.mw-warning-with-logexcerpt ul li{font-size:90%}span.mw-revdelundel-link,strong.mw-revdelundel-link{font-size:90%}span.mw-revdelundel-hidden,input.mw-revdelundel-hidden{visibility:hidden}td.mw-revdel-checkbox,th.mw-revdel-checkbox{padding-right:10px;text-align:center}a.feedlink{background:url(images/feed-icon.png) center left no-repeat;padding-left:16px}.plainlinks a{background:none!important;padding:0!important}.rtl a.external.free,.rtl a.external.autonumber{direction:ltr;unicode-bidi:embed}table.wikitable{margin:1em 1em 1em 0;background-color:#f9f9f9;border:1px #aaa solid;border-collapse:collapse;color:black}table.wikitable>tr>th,table.wikitable>tr>td,table.wikitable>*>tr>th,table.wikitable>*>tr>td{border:1px #aaa solid;padding:.2em}table.wikitable>tr>th,table.wikitable>*>tr>th{background-color:#f2f2f2;text-align:center}table.wikitable>caption{font-weight:bold}table.collapsed tr.collapsable{display:none}.success{color:green;font-size:larger}.warning{color:#FFA500;font-size:larger}.error{color:red;font-size:larger}.errorbox,.warningbox,.successbox{font-size:larger;border:2px solid;padding:.5em 1em;float:left;margin-bottom:2em;color:#000}.errorbox{border-color:red;background-color:#fff2f2}.warningbox{border-color:#FF8C00;background-color:#FFFFC0}.successbox{border-color:green;background-color:#dfd}.errorbox h2,.warningbox h2,.successbox h2{font-size:1em;font-weight:bold;display:inline;margin:0 .5em 0 0;border:none}.mw-infobox{border:2px solid #ff7f00;margin:.5em;clear:left;overflow:hidden}.mw-infobox-left{margin:7px;float:left;width:35px}.mw-infobox-right{margin:.5em .5em .5em 49px}.previewnote{color:#c00;margin-bottom:1em}.previewnote p{text-indent:3em;margin:.8em 0}.visualClear{clear:both}#mw_trackbacks{border:solid 1px #bbf;background-color:#eef;padding:.2em}.mw-datatable{border-collapse:collapse}.mw-datatable,.mw-datatable td,.mw-datatable th{border:1px solid #aaa;padding:0 .15em 0 .15em}.mw-datatable th{background-color:#ddf}.mw-datatable td{background-color:#fff}.mw-datatable tr:hover td{background-color:#eef}.TablePager{min-width:80%}.TablePager_nav{margin:0 auto}.TablePager_nav td{padding:3px;text-align:center}.TablePager_nav a{text-decoration:none}.imagelist td,.imagelist th{white-space:nowrap}.imagelist .TablePager_col_links{background-color:#eef}.imagelist .TablePager_col_img_description{white-space:normal}.imagelist th.TablePager_sort{background-color:#ccf}ul#filetoc{text-align:center;border:1px solid #aaa;background-color:#f9f9f9;padding:5px;font-size:95%;margin-bottom:.5em;margin-left:0;margin-right:0}#filetoc li{display:inline;list-style-type:none;padding-right:2em}table.mw_metadata{font-size:.8em;margin-left:.5em;margin-bottom:.5em;width:400px}table.mw_metadata caption{font-weight:bold}table.mw_metadata th{font-weight:normal}table.mw_metadata td{padding:.1em}table.mw_metadata{border:none;border-collapse:collapse}table.mw_metadata td,table.mw_metadata th{text-align:center;border:1px solid #aaa;padding-left:5px;padding-right:5px}table.mw_metadata th{background-color:#f9f9f9}table.mw_metadata td{background-color:#fcfcfc}table.mw_metadata ul.metadata-langlist{list-style-type:none;list-style-image:none;padding-right:5px;padding-left:5px;margin:0}.mw-content-ltr ul,.mw-content-rtl .mw-content-ltr ul{margin:.3em 0 0 1.6em;padding:0}.mw-content-rtl ul,.mw-content-ltr .mw-content-rtl ul{margin:.3em 1.6em 0 0;padding:0}.mw-content-ltr ol,.mw-content-rtl .mw-content-ltr ol{margin:.3em 0 0 3.2em;padding:0}.mw-content-rtl ol,.mw-content-ltr .mw-content-rtl ol{margin:.3em 3.2em 0 0;padding:0}.mw-content-ltr dd,.mw-content-rtl .mw-content-ltr dd{margin-left:1.6em;margin-right:0}.mw-content-rtl dd,.mw-content-ltr .mw-content-rtl dd{margin-right:1.6em;margin-left:0}li.gallerybox{vertical-align:top;border:solid 2px white;display:-moz-inline-box;display:inline-block}ul.gallery,li.gallerybox{zoom:1;*display:inline}ul.gallery{margin:2px;padding:2px;display:block}li.gallerycaption{font-weight:bold;text-align:center;display:block;word-wrap:break-word}li.gallerybox div.thumb{text-align:center;border:1px solid #ccc;background-color:#f9f9f9;margin:2px}li.gallerybox div.thumb img{display:block;margin:0 auto}div.gallerytext{overflow:hidden;font-size:94%;padding:2px 4px;word-wrap:break-word}.mw-ajax-loader{background-image:url(images/ajax-loader.gif);background-position:center center;background-repeat:no-repeat;padding:16px;position:relative;top:-16px}.mw-small-spinner{padding:10px!important;margin-right:.6em;background-image:url(images/spinner.gif);background-position:center center;background-repeat:no-repeat}h1:lang(as),h1:lang(bh),h1:lang(bho),h1:lang(bn),h1:lang(gu),h1:lang(hi),h1:lang(kn),h1:lang(ml),h1:lang(mr),h1:lang(or),h1:lang(pa),h1:lang(sa),h1:lang(ta),h1:lang(te){line-height:1.5em!important}h2:lang(as),h3:lang(as),h4:lang(as),h5:lang(as),h6:lang(as),h2:lang(bho),h3:lang(bho),h4:lang(bho),h5:lang(bho),h6:lang(bho),h2:lang(bh),h3:lang(bh),h4:lang(bh),h5:lang(bh),h6:lang(bh),h2:lang(bn),h3:lang(bn),h4:lang(bn),h5:lang(bn),h6:lang(bn),h2:lang(gu),h3:lang(gu),h4:lang(gu),h5:lang(gu),h6:lang(gu),h2:lang(hi),h3:lang(hi),h4:lang(hi),h5:lang(hi),h6:lang(hi),h2:lang(kn),h3:lang(kn),h4:lang(kn),h5:lang(kn),h6:lang(kn),h2:lang(ml),h3:lang(ml),h4:lang(ml),h5:lang(ml),h6:lang(ml),h2:lang(mr),h3:lang(mr),h4:lang(mr),h5:lang(mr),h6:lang(mr),h2:lang(or),h3:lang(or),h4:lang(or),h5:lang(or),h6:lang(or),h2:lang(pa),h3:lang(pa),h4:lang(pa),h5:lang(pa),h6:lang(pa),h2:lang(sa),h3:lang(sa),h4:lang(sa),h5:lang(sa),h6:lang(sa),h2:lang(ta),h3:lang(ta),h4:lang(ta),h5:lang(ta),h6:lang(ta),h2:lang(te),h3:lang(te),h4:lang(te),h5:lang(te),h6:lang(te){line-height:1.2em}ol:lang(bcc) li,ol:lang(bqi) li,ol:lang(fa) li,ol:lang(glk) li,ol:lang(kk-arab) li,ol:lang(mzn) li{list-style-type:-moz-persian;list-style-type:persian}ol:lang(ckb) li{list-style-type:-moz-arabic-indic;list-style-type:arabic-indic}ol:lang(hi) li,ol:lang(mr) li{list-style-type:-moz-devanagari;list-style-type:devanagari}ol:lang(as) li,ol:lang(bn) li{list-style-type:-moz-bengali;list-style-type:bengali}ol:lang(or) li{list-style-type:-moz-oriya;list-style-type:oriya}#toc ul,.toc ul{margin:.3em 0}.mw-content-ltr .toc ul,.mw-content-ltr #toc ul,.mw-content-rtl .mw-content-ltr .toc ul,.mw-content-rtl .mw-content-ltr #toc ul{text-align:left}.mw-content-rtl .toc ul,.mw-content-rtl #toc ul,.mw-content-ltr .mw-content-rtl .toc ul,.mw-content-ltr .mw-content-rtl #toc ul{text-align:right}.mw-content-ltr .toc ul ul,.mw-content-ltr #toc ul ul,.mw-content-rtl .mw-content-ltr .toc ul ul,.mw-content-rtl .mw-content-ltr #toc ul ul{margin:0 0 0 2em}.mw-content-rtl .toc ul ul,.mw-content-rtl #toc ul ul,.mw-content-ltr .mw-content-rtl .toc ul ul,.mw-content-ltr .mw-content-rtl #toc ul ul{margin:0 2em 0 0}#toc #toctitle,.toc #toctitle,#toc .toctitle,.toc .toctitle{direction:ltr}.mw-help-field-hint{display:none;margin-left:2px;margin-bottom:-8px;padding:0 0 0 15px;background-image:url('images/help-question.gif');background-position:left center;background-repeat:no-repeat;cursor:pointer;font-size:.8em;text-decoration:underline;color:#0645ad}.mw-help-field-hint:hover{background-image:url('images/help-question-hover.gif')}.mw-help-field-data{display:block;background-color:#d6f3ff;padding:5px 8px 4px 8px;border:1px solid #5dc9f4;margin-left:20px}.tipsy{padding:5px 5px 10px;font-size:12px;position:absolute;z-index:100000;overflow:visible}.tipsy-inner{padding:5px 8px 4px 8px;background-color:#d6f3ff;color:black;border:1px solid #5dc9f4;max-width:300px;text-align:left}.tipsy-arrow{position:absolute;background:url(images/tipsy-arrow.gif) no-repeat top left;width:13px;height:13px}.tipsy-se .tipsy-arrow{bottom:-2px;right:10px;background-position:0 100%}#mw-clearyourcache,#mw-sitecsspreview,#mw-sitejspreview,#mw-usercsspreview,#mw-userjspreview{direction:ltr;unicode-bidi:embed}.diff-currentversion-title,.diff{direction:ltr;unicode-bidi:embed}.diff-contentalign-right td{direction:rtl;unicode-bidi:embed}.diff-contentalign-left td{direction:ltr;unicode-bidi:embed}.diff-otitle,.diff-ntitle,.diff-lineno{direction:ltr!important;unicode-bidi:embed}#mw-revision-info,#mw-revision-info-current,#mw-revision-nav{direction:ltr;display:inline}div.tright,div.floatright,table.floatright{clear:right;float:right}div.tleft,div.floatleft,table.floatleft{float:left;clear:left}div.floatright,table.floatright,div.floatleft,table.floatleft{position:relative}#mw-credits a{unicode-bidi:embed}.mw-jump,#jump-to-nav{overflow:hidden;height:0;zoom:1}.printfooter{display:none}.xdebug-error{position:absolute;z-index:99}.editsection,.toctoggle{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}a.stub,a.new{color:#ba0000;text-decoration:none}#toc{border:1px solid #aaa;background-color:#f9f9f9;padding:5px}div.floatright{float:right;clear:right;position:relative;margin:.5em 0 .8em 1.4em}div.floatright p{font-style:italic}div.floatleft{float:left;clear:left;position:relative;margin:.5em 1.4em .8em 0}div.floatleft p{font-style:italic}div.center{text-align:center}div.thumb{border:none;width:auto;margin-top:.5em;margin-bottom:.8em;background-color:transparent}div.thumbinner{border:1px solid #ccc;padding:3px!important;background-color:White;font-size:94%;text-align:center;overflow:hidden}html .thumbimage{border:1px solid #ccc}html .thumbcaption{border:none;text-align:left;line-height:1.4em;padding:3px!important;font-size:94%}div.magnify{display:none}div.tright{float:right;clear:right;margin:.5em 0 .8em 1.4em}div.tleft{float:left;clear:left;margin:.5em 1.4em .8em 0}img.thumbborder{border:1px solid #ddd}table.rimage{float:right;width:1pt;position:relative;margin-left:1em;margin-bottom:1em;text-align:center}body{background:white;color:black;margin:0;padding:0}.noprint,div#jump-to-nav,.mw-jump,div.top,div#column-one,#colophon,.editsection,.toctoggle,.tochidden,div#f-poweredbyico,div#f-copyrightico,li#viewcount,li#about,li#disclaimer,li#mobileview,li#privacy,#footer-places,.mw-hidden-catlinks,tr.mw-metadata-show-hide-extended,span.mw-filepage-other-resolutions,#filetoc{display:none}ul{list-style-type:square}#content{background:none;border:none!important;padding:0!important;margin:0!important;direction:ltr}#footer{background:white;color:black;margin-top:1em;border-top:1px solid #AAA;direction:ltr}h1,h2,h3,h4,h5,h6{font-weight:bold}p{margin:1em 0;line-height:1.2em}pre{border:1pt dashed black;white-space:pre;font-size:8pt;overflow:auto;padding:1em 0;background:white;color:black}table.listing,table.listing td{border:1pt solid black;border-collapse:collapse}a{color:black!important;background:none!important;padding:0!important}a:link,a:visited{color:#520;background:transparent;text-decoration:underline}#content a.external.text:after,#content a.external.autonumber:after{content:"(" attr(href) ") "}#globalWrapper{width:100%!important;min-width:0!important}#content{background:white;color:black}#column-content{margin:0!important}#column-content #content{padding:1em;margin:0!important}a,a.external,a.new,a.stub{color:black!important;text-decoration:none!important}a,a.external,a.new,a.stub{color:inherit!important;text-decoration:inherit!important}img{border:none;vertical-align:middle}span.texhtml{font-family:serif}#siteNotice{display:none}li.gallerybox{vertical-align:top;border:solid 2px white;display:-moz-inline-box;display:inline-block}ul.gallery,li.gallerybox{zoom:1;*display:inline}ul.gallery{margin:2px;padding:2px;display:block}li.gallerycaption{font-weight:bold;text-align:center;display:block;word-wrap:break-word}li.gallerybox div.thumb{text-align:center;border:1px solid #ccc;margin:2px}div.gallerytext{overflow:hidden;font-size:94%;padding:2px 4px;word-wrap:break-word}table.diff{background:white}td.diff-otitle{background:#fff}td.diff-ntitle{background:#fff}td.diff-addedline{background:#cfc;font-size:smaller;border:solid 2px black}td.diff-deletedline{background:#ffa;font-size:smaller;border:dotted 2px black}td.diff-context{background:#eee;font-size:smaller}.diffchange{color:silver;font-weight:bold;text-decoration:underline}table.wikitable,table.mw_metadata{margin:1em 1em 1em 0;border:1px #aaa solid;background:white;border-collapse:collapse}table.wikitable>tr>th,table.wikitable>tr>td,table.wikitable>*>tr>th,table.wikitable>*>tr>td,.mw_metadata th,.mw_metadata td{border:1px #aaa solid;padding:.2em}table.wikitable>tr>th,table.wikitable>*>tr>th,.mw_metadata th{text-align:center;background:white;font-weight:bold}table.wikitable>caption,.mw_metadata caption{font-weight:bold}a.sortheader{margin:0 .3em}.wikitable,.thumb,img{page-break-inside:avoid}h2,h3,h4,h5,h6,h7{page-break-after:avoid}p{widows:3;orphans:3}.catlinks ul{display:inline;margin:0;padding:0;list-style:none;list-style-type:none;list-style-image:none;vertical-align:middle!ie}.catlinks li{display:inline-block;line-height:1.15em;padding:0 .4em;border-left:1px solid #AAA;margin:.1em 0;zoom:1;display:inline!ie}.catlinks li:first-child{padding-left:.2em;border-left:none}dfn{font-style:inherit}sup,sub{line-height:1em}#interwiki-completelist{font-weight:bold}body.page-Main_Page #ca-delete{display:none!important}body.page-Main_Page #mp-topbanner{clear:both}#toolbar{height:22px;margin-bottom:6px}body.action-info :target{background:#DEF}ol.references,div.reflist,div.refbegin{font-size:90%;margin-bottom:.5em}div.refbegin-100{font-size:100%}div.reflist ol.references{font-size:100%;list-style-type:inherit}div.columns{margin-top:.3em}div.columns dl,div.columns ol,div.columns ul{margin-top:0}div.columns li,div.columns dd dd{-webkit-column-break-inside:avoid;page-break-inside:avoid;break-inside:avoid-column}ol.references li:target,sup.reference:target,span.citation:target{background-color:#DEF}sup.reference{font-weight:normal;font-style:normal}span.brokenref{display:none}.citation{word-wrap:break-word}@media screen,handheld{.citation *.printonly{display:none}}.flowlist ul{overflow-x:hidden;margin-left:0;padding-left:1.6em}.flowlist ol{overflow-x:hidden;margin-left:0;padding-left:3.2em}.flowlist dl{overflow-x:hidden}.hlist dl,.hlist ol,.hlist ul{margin:0;padding:0}.hlist dd,.hlist dt,.hlist li{margin:0;display:inline}.hlist dl dl,.hlist dl ol,.hlist dl ul,.hlist ol dl,.hlist ol ol,.hlist ol ul,.hlist ul dl,.hlist ul ol,.hlist ul ul{display:inline}.hlist dt:after{content:":"}.hlist dd:after,.hlist li:after{content:" · ";font-weight:bold}.hlist dd:last-child:after,.hlist dt:last-child:after,.hlist li:last-child:after{content:none}.hlist dd.hlist-last-child:after,.hlist dt.hlist-last-child:after,.hlist li.hlist-last-child:after{content:none}.hlist dd dd:first-child:before,.hlist dd dt:first-child:before,.hlist dd li:first-child:before,.hlist dt dd:first-child:before,.hlist dt dt:first-child:before,.hlist dt li:first-child:before,.hlist li dd:first-child:before,.hlist li dt:first-child:before,.hlist li li:first-child:before{content:"(";font-weight:normal}.hlist dd dd:last-child:after,.hlist dd dt:last-child:after,.hlist dd li:last-child:after,.hlist dt dd:last-child:after,.hlist dt dt:last-child:after,.hlist dt li:last-child:after,.hlist li dd:last-child:after,.hlist li dt:last-child:after,.hlist li li:last-child:after{content:") ";font-weight:normal}.hlist dd dd.hlist-last-child:after,.hlist dd dt.hlist-last-child:after,.hlist dd li.hlist-last-child:after,.hlist dt dd.hlist-last-child:after,.hlist dt dt.hlist-last-child:after,.hlist dt li.hlist-last-child:after,.hlist li dd.hlist-last-child:after,.hlist li dt.hlist-last-child:after,.hlist li li.hlist-last-child:after{content:") ";font-weight:normal}.hlist ol{counter-reset:listitem}.hlist ol>li{counter-increment:listitem}.hlist ol>li:before{content:" " counter(listitem) " "}.hlist dd ol>li:first-child:before,.hlist dt ol>li:first-child:before,.hlist li ol>li:first-child:before{content:"(" counter(listitem) " "}.plainlist ul{line-height:inherit;list-style:none none;margin:0}.plainlist ul li{margin-bottom:0}.navbox{border:1px solid #aaa;width:100%;margin:auto;clear:both;font-size:88%;text-align:center;padding:1px}.navbox-inner,.navbox-subgroup{width:100%}.navbox-group,.navbox-title,.navbox-abovebelow{padding:.25em 1em;line-height:1.5em;text-align:center}th.navbox-group{white-space:nowrap;text-align:right}.navbox,.navbox-subgroup{background:#fdfdfd}.navbox-list{line-height:1.8em;border-color:#fdfdfd}.navbox th,.navbox-title{background:#ccf}.navbox-abovebelow,th.navbox-group,.navbox-subgroup .navbox-title{background:#ddf}.navbox-subgroup .navbox-group,.navbox-subgroup .navbox-abovebelow{background:#e6e6ff}.navbox-even{background:#f7f7f7}.navbox-odd{background:transparent}table.navbox+table.navbox{margin-top:-1px}.navbox .hlist td dl,.navbox .hlist td ol,.navbox .hlist td ul,.navbox td.hlist dl,.navbox td.hlist ol,.navbox td.hlist ul{padding:.125em 0}ol+table.navbox,ul+table.navbox{margin-top:.5em}.navbar{display:inline;font-size:88%;font-weight:normal}.navbar ul{display:inline;white-space:nowrap}.navbar li{word-spacing:-0.125em}.navbar.mini li span{font-variant:small-caps}.infobox .navbar{font-size:100%}.navbox .navbar{display:block;font-size:100%}.navbox-title .navbar{float:left;text-align:left;margin-right:.5em;width:6em}.collapseButton{float:right;font-weight:normal;margin-left:.5em;text-align:right;width:auto}.navbox .collapseButton{width:6em}.mw-collapsible-toggle{font-weight:normal;text-align:right}.navbox .mw-collapsible-toggle{width:6em}.infobox{border:1px solid #aaa;background-color:#f9f9f9;color:black;margin:.5em 0 .5em 1em;padding:.2em;float:right;clear:right;text-align:left;font-size:88%;line-height:1.5em}.infobox caption{font-size:125%;font-weight:bold}.infobox td,.infobox th{vertical-align:top}.infobox.bordered{border-collapse:collapse}.infobox.bordered td,.infobox.bordered th{border:1px solid #aaa}.infobox.bordered .borderless td,.infobox.bordered .borderless th{border:0}.infobox.sisterproject{width:20em;font-size:90%}.infobox.standard-talk{border:1px solid #c0c090;background-color:#f8eaba}.infobox.standard-talk.bordered td,.infobox.standard-talk.bordered th{border:1px solid #c0c090}.infobox.bordered .mergedtoprow td,.infobox.bordered .mergedtoprow th{border:0;border-top:1px solid #aaa;border-right:1px solid #aaa}.infobox.bordered .mergedrow td,.infobox.bordered .mergedrow th{border:0;border-right:1px solid #aaa}.infobox.geography{border-collapse:collapse;line-height:1.2em;font-size:90%}.infobox.geography td,.infobox.geography th{border-top:1px solid #aaa;padding:.4em .6em .4em .6em}.infobox.geography .mergedtoprow td,.infobox.geography .mergedtoprow th{border-top:1px solid #aaa;padding:.4em .6em .2em .6em}.infobox.geography .mergedrow td,.infobox.geography .mergedrow th{border:0;padding:0 .6em .2em .6em}.infobox.geography .mergedbottomrow td,.infobox.geography .mergedbottomrow th{border-top:0;border-bottom:1px solid #aaa;padding:0 .6em .4em .6em}.infobox.geography .maptable td,.infobox.geography .maptable th{border:0;padding:0}.wikitable.plainrowheaders th[scope=row]{font-weight:normal;text-align:left}.wikitable td ul,.wikitable td ol,.wikitable td dl{text-align:left}.wikitable.hlist td ul,.wikitable.hlist td ol,.wikitable.hlist td dl{text-align:inherit}div.listenlist{background:url("//upload.wikimedia.org/wikipedia/commons/4/47/Sound-icon.svg") no-repeat scroll 0 0 transparent;background-size:30px;padding-left:40px}table.mw-hiero-table td{vertical-align:middle}div.medialist{min-height:50px;margin:1em;background-position:top left;background-repeat:no-repeat}div.medialist ul{list-style-type:none;list-style-image:none;margin:0}div.medialist ul li{padding-bottom:.5em}div.medialist ul li li{font-size:91%;padding-bottom:0}div#content a[href$=".pdf"].external,div#content a[href*=".pdf?"].external,div#content a[href*=".pdf#"].external,div#content a[href$=".PDF"].external,div#content a[href*=".PDF?"].external,div#content a[href*=".PDF#"].external,div#mw_content a[href$=".pdf"].external,div#mw_content a[href*=".pdf?"].external,div#mw_content a[href*=".pdf#"].external,div#mw_content a[href$=".PDF"].external,div#mw_content a[href*=".PDF?"].external,div#mw_content a[href*=".PDF#"].external{background:url("//upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif") no-repeat right;padding-right:18px}div#content span.PDFlink a,div#mw_content span.PDFlink a{background:url("//upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif") no-repeat right;padding-right:18px}div.columns-2 div.column{float:left;width:50%;min-width:300px}div.columns-3 div.column{float:left;width:33.3%;min-width:200px}div.columns-4 div.column{float:left;width:25%;min-width:150px}div.columns-5 div.column{float:left;width:20%;min-width:120px}.messagebox{border:1px solid #aaa;background-color:#f9f9f9;width:80%;margin:0 auto 1em auto;padding:.2em}.messagebox.merge{border:1px solid #c0b8cc;background-color:#f0e5ff;text-align:center}.messagebox.cleanup{border:1px solid #9f9fff;background-color:#efefff;text-align:center}.messagebox.standard-talk{border:1px solid #c0c090;background-color:#f8eaba;margin:4px auto}.mbox-inside .standard-talk,.messagebox.nested-talk{border:1px solid #c0c090;background-color:#f8eaba;width:100%;margin:2px 0;padding:2px}.messagebox.small{width:238px;font-size:85%;float:right;clear:both;margin:0 0 1em 1em;line-height:1.25em}.messagebox.small-talk{width:238px;font-size:85%;float:right;clear:both;margin:0 0 1em 1em;line-height:1.25em;background:#F8EABA}th.mbox-text,td.mbox-text{border:none;padding:.25em .9em;width:100%}td.mbox-image{border:none;padding:2px 0 2px .9em;text-align:center}td.mbox-imageright{border:none;padding:2px .9em 2px 0;text-align:center}td.mbox-empty-cell{border:none;padding:0;width:1px}table.ambox{margin:0 10%;border:1px solid #aaa;border-left:10px solid #1e90ff;background:#fbfbfb}table.ambox+table.ambox{margin-top:-1px}.ambox th.mbox-text,.ambox td.mbox-text{padding:.25em .5em}.ambox td.mbox-image{padding:2px 0 2px .5em}.ambox td.mbox-imageright{padding:2px .5em 2px 0}table.ambox-notice{border-left:10px solid #1e90ff}table.ambox-speedy{border-left:10px solid #b22222;background:#fee}table.ambox-delete{border-left:10px solid #b22222}table.ambox-content{border-left:10px solid #f28500}table.ambox-style{border-left:10px solid #f4c430}table.ambox-move{border-left:10px solid #9932cc}table.ambox-protection{border-left:10px solid #bba}table.imbox{margin:4px 10%;border-collapse:collapse;border:3px solid #1e90ff;background:#fbfbfb}.imbox .mbox-text .imbox{margin:0 -0.5em;display:block}.mbox-inside .imbox{margin:4px}table.imbox-notice{border:3px solid #1e90ff}table.imbox-speedy{border:3px solid #b22222;background:#fee}table.imbox-delete{border:3px solid #b22222}table.imbox-content{border:3px solid #f28500}table.imbox-style{border:3px solid #f4c430}table.imbox-move{border:3px solid #9932cc}table.imbox-protection{border:3px solid #bba}table.imbox-license{border:3px solid #88a;background:#f7f8ff}table.imbox-featured{border:3px solid #cba135}table.cmbox{margin:3px 10%;border-collapse:collapse;border:1px solid #aaa;background:#DFE8FF}table.cmbox-notice{background:#D8E8FF}table.cmbox-speedy{margin-top:4px;margin-bottom:4px;border:4px solid #b22222;background:#FFDBDB}table.cmbox-delete{background:#FFDBDB}table.cmbox-content{background:#FFE7CE}table.cmbox-style{background:#FFF9DB}table.cmbox-move{background:#E4D8FF}table.cmbox-protection{background:#EFEFE1}table.ombox{margin:4px 10%;border-collapse:collapse;border:1px solid #aaa;background:#f9f9f9}table.ombox-notice{border:1px solid #aaa}table.ombox-speedy{border:2px solid #b22222;background:#fee}table.ombox-delete{border:2px solid #b22222}table.ombox-content{border:1px solid #f28500}table.ombox-style{border:1px solid #f4c430}table.ombox-move{border:1px solid #9932cc}table.ombox-protection{border:2px solid #bba}table.tmbox{margin:4px 10%;border-collapse:collapse;border:1px solid #c0c090;background:#f8eaba}.mediawiki .mbox-inside .tmbox{margin:2px 0;width:100%}.mbox-inside .tmbox.mbox-small{line-height:1.5em;font-size:100%}table.tmbox-speedy{border:2px solid #b22222;background:#fee}table.tmbox-delete{border:2px solid #b22222}table.tmbox-content{border:2px solid #f28500}table.tmbox-style{border:2px solid #f4c430}table.tmbox-move{border:2px solid #9932cc}table.tmbox-protection,table.tmbox-notice{border:1px solid #c0c090}table.dmbox{clear:both;margin:.9em 1em;border-top:1px solid #ccc;border-bottom:1px solid #ccc;background:transparent}table.fmbox{clear:both;margin:.2em 0;width:100%;border:1px solid #aaa;background:#f9f9f9}table.fmbox-system{background:#f9f9f9}table.fmbox-warning{border:1px solid #bb7070;background:#ffdbdb}table.fmbox-editnotice{background:transparent}div.mw-warning-with-logexcerpt,div.mw-lag-warn-high,div.mw-cascadeprotectedwarning,div#mw-protect-cascadeon{clear:both;margin:.2em 0;border:1px solid #bb7070;background:#ffdbdb;padding:.25em .9em}div.mw-lag-warn-normal,div.fmbox-system{clear:both;margin:.2em 0;border:1px solid #aaa;background:#f9f9f9;padding:.25em .9em}body.mediawiki table.mbox-small{clear:right;float:right;margin:4px 0 4px 1em;width:238px;font-size:88%;line-height:1.25em}body.mediawiki table.mbox-small-left{margin:4px 1em 4px 0;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.compact-ambox table .mbox-image,.compact-ambox table .mbox-imageright,.compact-ambox table .mbox-empty-cell{display:none}.compact-ambox table.ambox{border:none;border-collapse:collapse;background:transparent;margin:0 0 0 1.6em!important;padding:0!important;width:auto;display:block}body.mediawiki .compact-ambox table.mbox-small-left{font-size:100%;width:auto;margin:0}.compact-ambox table .mbox-text{padding:0!important;margin:0!important}.compact-ambox table .mbox-text-span{display:list-item;line-height:1.5em;list-style-type:square;list-style-image:url(//bits.wikimedia.org/skins/common/images/bullet.gif)}.skin-vector .compact-ambox table .mbox-text-span{list-style-type:circle;list-style-image:url(//bits.wikimedia.org/skins/vector/images/bullet-icon.png)}.compact-ambox .hide-when-compact{display:none}div.noarticletext{border:none;background:transparent;padding:0}.visualhide{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}#wpSave{font-weight:bold}.hiddenStructure{display:inline!important;color:#f00;background-color:#0f0}.check-icon a.new{display:none;speak:none}.nounderlines a,.IPA a:link,.IPA a:visited{text-decoration:none!important}div.NavFrame{margin:0;padding:4px;border:1px solid #aaa;text-align:center;border-collapse:collapse;font-size:95%}div.NavFrame+div.NavFrame{border-top-style:none;border-top-style:hidden}div.NavPic{background-color:#fff;margin:0;padding:2px;float:left}div.NavFrame div.NavHead{height:1.6em;font-weight:bold;background-color:#ccf;position:relative}div.NavFrame p,div.NavFrame div.NavContent,div.NavFrame div.NavContent p{font-size:100%}div.NavEnd{margin:0;padding:0;line-height:1px;clear:both}a.NavToggle{position:absolute;top:0;right:3px;font-weight:normal;font-size:90%}.rellink,.dablink{font-style:italic;padding-left:1.6em;margin-bottom:.5em}.rellink i,.dablink i{font-style:normal}.listify td{display:list-item}.listify tr{display:block}.listify table{display:block}.geo-default,.geo-dms,.geo-dec{display:inline}.geo-nondefault,.geo-multi-punct{display:none}.longitude,.latitude{white-space:nowrap}.nonumtoc .tocnumber{display:none}.nonumtoc #toc ul,.nonumtoc .toc ul{line-height:1.5em;list-style:none none;margin:.3em 0 0;padding:0}.nonumtoc #toc ul ul,.nonumtoc .toc ul ul{margin:0 0 0 2em}.toclimit-2 .toclevel-1 ul,.toclimit-3 .toclevel-2 ul,.toclimit-4 .toclevel-3 ul,.toclimit-5 .toclevel-4 ul,.toclimit-6 .toclevel-5 ul,.toclimit-7 .toclevel-6 ul{display:none}blockquote.templatequote{margin-top:0}blockquote.templatequote div.templatequotecite{line-height:1em;text-align:left;padding-left:2em;margin-top:0}blockquote.templatequote div.templatequotecite cite{font-size:85%}div.user-block{padding:5px;margin-bottom:.5em;border:1px solid #A9A9A9;background-color:#FFEFD5}.nowrap,.nowraplinks a,.nowraplinks .selflink,sup.reference a{white-space:nowrap}.wrap,.wraplinks a{white-space:normal}.template-documentation{clear:both;margin:1em 0 0 0;border:1px solid #aaa;background-color:#ecfcf4;padding:1em}.imagemap-inline div{display:inline}#wpUploadDescription{height:13em}.thumbinner{min-width:100px}div.thumb .thumbimage{background-color:#fff}div#content .gallerybox div.thumb{background-color:#F9F9F9}.gallerybox .thumb img{background:#fff url(//bits.wikimedia.org/skins/common/images/Checker-16x16.png) repeat}.ns-0 .gallerybox .thumb img,.ns-2 .gallerybox .thumb img,.ns-100 .gallerybox .thumb img,.nochecker .gallerybox .thumb img{background:#fff}#mw-subcategories,#mw-pages,#mw-category-media,#filehistory,#wikiPreview,#wikiDiff{clear:both}body.rtl #mw-articlefeedbackv5,body.rtl #mw-articlefeedback{display:block;margin-bottom:1em;clear:right;float:right}.wpb .wpb-header{display:none}.wpbs-inner .wpb .wpb-header{display:block}.wpbs-inner .wpb .wpb-header{display:table-row}.wpbs-inner .wpb-outside{display:none}.mw-tag-markers{font-family:sans-serif;font-style:italic;font-size:90%}.sysop-show,.accountcreator-show,.templateeditor-show,.autoconfirmed-show{display:none}.ve-init-mw-viewPageTarget-toolbar-editNotices-notice .editnotice-redlink{display:none!important}ul.permissions-errors>li{list-style:none none}ul.permissions-errors{margin:0}body.page-Special_UserLogin .mw-label label,body.page-Special_UserLogin_signup .mw-label label{white-space:nowrap}.transborder{border:solid transparent}* html .transborder{border:solid #000001;filter:chroma(color=#000001)}.updatedmarker{background-color:transparent;color:#006400}li.mw-changeslist-line-watched .mw-title,table.mw-changeslist-line-watched .mw-title,table.mw-enhanced-watch .mw-enhanced-rctime{font-weight:normal}span.texhtml{font-family:"Times New Roman","Nimbus Roman No9 L",Times,serif;font-size:118%;white-space:nowrap}span.texhtml span.texhtml{font-size:100%}div.mw-geshi div,div.mw-geshi div pre,span.mw-geshi,pre.source-css,pre.source-javascript,pre.source-lua{font-family:monospace,Courier!important}table#mw-prefixindex-list-table,table#mw-prefixindex-nav-table{width:98%}.portal-column-left{float:left;width:50%}.portal-column-right{float:right;width:49%}.portal-column-left-wide{float:left;width:60%}.portal-column-right-narrow{float:right;width:39%}.portal-column-left-extra-wide{float:left;width:70%}.portal-column-right-extra-narrow{float:right;width:29%}@media only screen and (max-width:800px){.portal-column-left,.portal-column-right,.portal-column-left-wide,.portal-column-right-narrow,.portal-column-left-extra-wide,.portal-column-right-extra-narrow{float:inherit;width:inherit}}#bodyContent .letterhead{background-image:url('//upload.wikimedia.org/wikipedia/commons/e/e0/Tan-page-corner.png');background-repeat:no-repeat;padding:2em;background-color:#faf9f2}.treeview ul{padding:0;margin:0}.treeview li{padding:0;margin:0;list-style-type:none;list-style-image:none;zoom:1}.treeview li li{background:url("//upload.wikimedia.org/wikipedia/commons/f/f2/Treeview-grey-line.png") no-repeat 0 -2981px;padding-left:20px;text-indent:.3em}.treeview li li.lastline{background-position:0 -5971px}.treeview li.emptyline>ul{margin-left:-1px}.treeview li.emptyline>ul>li:first-child{background-position:0 9px}td .sortkey,th .sortkey{display:none;speak:none}.inputbox-hidecheckboxes form .inputbox-element{display:none!important}#editpage-specialchars{display:none}.k-player .k-attribution{visibility:hidden}@media(-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(min-resolution:1.5dppx),(min-resolution:144dpi){#p-logo a{background-image:url("//upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Wikipedia-logo-v2-en.svg/204px-Wikipedia-logo-v2-en.svg.png")!important;background-size:136px auto}}@media(-webkit-min-device-pixel-ratio:2),(min--moz-device-pixel-ratio:2),(min-resolution:2dppx),(min-resolution:192dpi){#p-logo a{background-image:url("//upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Wikipedia-logo-v2-en.svg/270px-Wikipedia-logo-v2-en.svg.png")!important;background-size:135px auto}}.ns-0 .ambox,.ns-0 .navbox,.ns-0 .vertical-navbox,.ns-0 .infobox.sisterproject,.ns-0 .dablink,.ns-0 .metadata,.editlink,.navbar,a.NavToggle,span.collapseButton,span.mw-collapsible-toggle,th .sortkey,td .sortkey{display:none!important}#content cite a.external.text:after,.nourlexpansion a.external.text:after,.nourlexpansion a.external.autonumber:after{display:none!important}table.collapsible tr,div.NavPic,div.NavContent{display:block!important}table.collapsible tr{display:table-row!important}#firstHeading{margin:0}#content a.external.text:after,#content a.external.autonumber:after{word-wrap:break-word}body.page-Main_Page #deleteconfirm,body.page-Main_Page #t-cite,body.page-Main_Page #footer-info-lastmod,body.action-view.page-Main_Page #siteSub,body.action-view.page-Main_Page #contentSub,body.action-view.page-Main_Page h1.firstHeading{display:none!important}body.page-Main_Page #mp-topbanner{margin-top:0!important}#coordinates{position:absolute;top:0;right:0;float:right;margin:0;padding:0;line-height:1.5em;text-align:right;text-indent:0;font-size:85%;text-transform:none;white-space:nowrap}div.topicon{position:absolute;top:-2em;margin-right:-10px;display:block!important}div.flaggedrevs_short{position:absolute;top:-3em;right:80px;z-index:1;margin-left:0;margin-right:-10px}body.rtl #protected-icon{left:55px}body.rtl #spoken-icon,body.rtl #commons-icon{left:30px}body.rtl #featured-star{left:10px}div.vectorMenu div{z-index:2}#siteSub{display:inline;font-size:92%}li.GA{list-style-image:url(//upload.wikimedia.org/wikipedia/commons/4/42/Monobook-bullet-ga.png)}li.FA{list-style-image:url(//upload.wikimedia.org/wikipedia/commons/d/d4/Monobook-bullet-star.png)}li.mw-changeslist-line-watched,li.mw-history-line-updated{list-style-image:url(//upload.wikimedia.org/wikipedia/commons/c/c2/ChangedBulletVector.png)}#bodyContent a.external[href ^="https://"],.link-https{background:url(//upload.wikimedia.org/wikipedia/en/0/00/Lock_icon_blue.gif) center right no-repeat;padding-right:16px}div.redirectMsg img{vertical-align:text-bottom}.redirectText{font-size:150%;margin:5px}
\ No newline at end of file diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/write.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/write.py new file mode 100644 index 00000000000..939e11d5910 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/bench/write.py @@ -0,0 +1,344 @@ +#!/usr/bin/env python +# -*- coding: ascii -*- +r""" +========================= + Write benchmark results +========================= + +Write benchmark results. + +:Copyright: + + Copyright 2014 + Andr\xe9 Malo or his licensors, as applicable + +:License: + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +Usage:: + + python -mbench.write [-p plain] [-t table] <pickled + + -p plain Plain file to write to (like docs/BENCHMARKS). + -t table Table file to write to (like docs/_userdoc/benchmark.txt). + +""" +if __doc__: + __doc__ = __doc__.encode('ascii').decode('unicode_escape') +__author__ = r"Andr\xe9 Malo".encode('ascii').decode('unicode_escape') +__docformat__ = "restructuredtext en" +__license__ = "Apache License, Version 2.0" +__version__ = "1.0.0" + +import os as _os +import re as _re +import sys as _sys + + +try: + unicode +except NameError: + def uni(v): + if hasattr(v, 'decode'): + return v.decode('latin-1') + return str(v) +else: + def uni(v): + if isinstance(v, unicode): + return v.encode('utf-8') + return str(v) + + +def write_table(filename, results): + """ + Output tabled benchmark results + + :Parameters: + `filename` : ``str`` + Filename to write to + + `results` : ``list`` + Results + """ + try: + next + except NameError: + next = lambda i: (getattr(i, 'next', None) or i.__next__)() + try: + cmp + except NameError: + cmp = lambda a, b: (a > b) - (a < b) + + names = [ + ('cssmin', 'YUI Port'), + ('rcssmin', '|rcssmin|'), + ('_rcssmin', r'_\ |rcssmin|'), + ] + benched_per_table = 2 + + results = sorted(results, reverse=True) + + # First we transform our data into a table (list of lists) + pythons, widths = [], [0] * (benched_per_table + 1) + last_version = None + for version, _, result in results: + version = uni(version) + if not(last_version is None or version.startswith('2.')): + continue + last_version = version + + namesub = _re.compile(r'(?:-\d+(?:\.\d+)*)?\.css$').sub + result = iter(result) + tables = [] + + # given our data it's easier to create the table transposed... + for benched in result: + rows = [['Name'] + [desc for _, desc in names]] + for _ in range(benched_per_table): + if _: + try: + benched = next(result) + except StopIteration: + rows.append([''] + ['' for _ in names]) + continue + + times = dict(( + uni(port), (time, benched['sizes'][idx]) + ) for idx, (port, time) in enumerate(benched['times'])) + columns = ['%s (%.1f)' % ( + namesub('', _os.path.basename(uni(benched['filename']))), + benched['size'] / 1024.0, + )] + for idx, (port, _) in enumerate(names): + if port not in times: + columns.append('n/a') + continue + time, size = times[port] + if time is None: + columns.append('(failed)') + continue + columns.append('%s%.2f ms (%.1f %s)' % ( + idx == 0 and ' ' or '', + time, + size / 1024.0, + idx == 0 and '\\*' or ['=', '>', '<'][ + cmp(size, benched['sizes'][0]) + ], + )) + rows.append(columns) + + # calculate column widths (global for all tables) + for idx, row in enumerate(rows): + widths[idx] = max(widths[idx], max(map(len, row))) + + # ... and transpose it back. + tables.append(zip(*rows)) + pythons.append((version, tables)) + + if last_version.startswith('2.'): + break + + # Second we create a rest table from it + lines = [] + separator = lambda c='-': '+'.join([''] + [ + c * (width + 2) for width in widths + ] + ['']) + + for idx, (version, tables) in enumerate(pythons): + if idx: + lines.append('') + lines.append('') + + line = 'Python %s' % (version,) + lines.append(line) + lines.append('~' * len(line)) + + for table in tables: + lines.append('') + lines.append('.. rst-class:: benchmark') + lines.append('') + + for idx, row in enumerate(table): + if idx == 0: + # header + lines.append(separator()) + lines.append('|'.join([''] + [ + ' %s%*s ' % (col, len(col) - width, '') + for width, col in zip(widths, row) + ] + [''])) + lines.append(separator('=')) + else: # data + lines.append('|'.join([''] + [ + j == 0 and ( + ' %s%*s ' % (col, len(col) - widths[j], '') + ) or ( + ['%*s ', ' %*s '][idx == 1] % (widths[j], col) + ) + for j, col in enumerate(row) + ] + [''])) + lines.append(separator()) + + fplines = [] + fp = open(filename) + try: + fpiter = iter(fp) + for line in fpiter: + line = line.rstrip() + if line == '.. begin tables': + buf = [] + for line in fpiter: + line = line.rstrip() + if line == '.. end tables': + fplines.append('.. begin tables') + fplines.append('') + fplines.extend(lines) + fplines.append('') + fplines.append('.. end tables') + buf = [] + break + else: + buf.append(line) + else: + fplines.extend(buf) + _sys.stderr.write("Placeholder container not found!\n") + else: + fplines.append(line) + finally: + fp.close() + + fp = open(filename, 'w') + try: + fp.write('\n'.join(fplines) + '\n') + finally: + fp.close() + + +def write_plain(filename, results): + """ + Output plain benchmark results + + :Parameters: + `filename` : ``str`` + Filename to write to + + `results` : ``list`` + Results + """ + lines = [] + results = sorted(results, reverse=True) + for idx, (version, import_notes, result) in enumerate(results): + if idx: + lines.append('') + lines.append('') + + lines.append('$ python%s -OO bench/main.py bench/*.css' % ( + '.'.join(version.split('.')[:2]) + )) + lines.append('~' * 72) + for note in import_notes: + lines.append(uni(note)) + lines.append('Python Release: %s' % (version,)) + + for single in result: + lines.append('') + lines.append('Benchmarking %r... (%.1f KiB)' % ( + uni(single['filename']), single['size'] / 1024.0 + )) + for msg in single['messages']: + lines.append(msg) + times = [] + space = max([len(uni(port)) for port, _ in single['times']]) + for idx, (port, time) in enumerate(single['times']): + port = uni(port) + if time is None: + lines.append(" FAILED %s" % (port,)) + else: + times.append(time) + lines.append( + " Timing %s%s ... (%5.1f KiB %s) %8.2f ms" % ( + port, + " " * (space - len(port)), + single['sizes'][idx] / 1024.0, + idx == 0 and '*' or ['=', '>', '<'][ + cmp(single['sizes'][idx], single['sizes'][0]) + ], + time + ) + ) + if len(times) > 1: + lines[-1] += " (factor: %s)" % (', '.join([ + '%.2f' % (timed / time) for timed in times[:-1] + ])) + + lines.append('') + lines.append('') + lines.append('# vim: nowrap') + fp = open(filename, 'w') + try: + fp.write('\n'.join(lines) + '\n') + finally: + fp.close() + + +def main(argv=None): + """ Main """ + import getopt as _getopt + import pickle as _pickle + + if argv is None: + argv = _sys.argv[1:] + try: + opts, args = _getopt.getopt(argv, "hp:t:", ["help"]) + except getopt.GetoptError: + e = _sys.exc_info()[0](_sys.exc_info()[1]) + print >> _sys.stderr, "%s\nTry %s -mbench.write --help" % ( + e, + _os.path.basename(_sys.executable), + ) + _sys.exit(2) + + plain, table = None, None + for key, value in opts: + if key in ("-h", "--help"): + print >> _sys.stderr, ( + "%s -mbench.write [-p plain] [-t table] <pickled" % ( + _os.path.basename(_sys.executable), + ) + ) + _sys.exit(0) + elif key == '-p': + plain = str(value) + elif key == '-t': + table = str(value) + + struct = [] + _sys.stdin = getattr(_sys.stdin, 'detach', lambda: _sys.stdin)() + try: + while True: + version, import_notes, result = _pickle.load(_sys.stdin) + if hasattr(version, 'decode'): + version = version.decode('latin-1') + struct.append((version, import_notes, result)) + except EOFError: + pass + + if plain: + write_plain(plain, struct) + + if table: + write_table(table, struct) + + +if __name__ == '__main__': + main() diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/BENCHMARKS b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/BENCHMARKS new file mode 100644 index 00000000000..9a49e9b51bf --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/BENCHMARKS @@ -0,0 +1,61 @@ +$ python3.4 -OO bench/main.py bench/*.css +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Python Release: 3.4.2 + +Benchmarking 'bench/wikipedia.css'... (81.0 KiB) + Timing cssmin ... ( 49.4 KiB *) 163.11 ms + Timing rcssmin ... ( 49.6 KiB >) 45.48 ms (factor: 3.59) + Timing _rcssmin ... ( 49.6 KiB >) 0.43 ms (factor: 378.93, 105.66) + +Benchmarking 'bench/wikipedia.min.css'... (49.4 KiB) + Timing cssmin ... ( 49.4 KiB *) 119.00 ms + Timing rcssmin ... ( 49.4 KiB =) 20.94 ms (factor: 5.68) + Timing _rcssmin ... ( 49.4 KiB =) 0.26 ms (factor: 454.45, 79.98) + + +$ python3.3 -OO bench/main.py bench/*.css +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Python Release: 3.3.5 + +Benchmarking 'bench/wikipedia.css'... (81.0 KiB) + Timing cssmin ... ( 49.4 KiB *) 185.01 ms + Timing rcssmin ... ( 49.6 KiB >) 59.30 ms (factor: 3.12) + Timing _rcssmin ... ( 49.6 KiB >) 0.52 ms (factor: 356.38, 114.23) + +Benchmarking 'bench/wikipedia.min.css'... (49.4 KiB) + Timing cssmin ... ( 49.4 KiB *) 136.26 ms + Timing rcssmin ... ( 49.4 KiB =) 25.51 ms (factor: 5.34) + Timing _rcssmin ... ( 49.4 KiB =) 0.26 ms (factor: 515.24, 96.47) + + +$ python3.2 -OO bench/main.py bench/*.css +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Python Release: 3.2.5 + +Benchmarking 'bench/wikipedia.css'... (81.0 KiB) + Timing cssmin ... ( 49.4 KiB *) 225.32 ms + Timing rcssmin ... ( 49.6 KiB >) 57.51 ms (factor: 3.92) + Timing _rcssmin ... ( 49.6 KiB >) 0.43 ms (factor: 527.98, 134.77) + +Benchmarking 'bench/wikipedia.min.css'... (49.4 KiB) + Timing cssmin ... ( 49.4 KiB *) 129.43 ms + Timing rcssmin ... ( 49.4 KiB =) 24.45 ms (factor: 5.29) + Timing _rcssmin ... ( 49.4 KiB =) 0.25 ms (factor: 526.94, 99.55) + + +$ python2.7 -OO bench/main.py bench/*.css +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Python Release: 2.7.7 + +Benchmarking 'bench/wikipedia.css'... (81.0 KiB) + Timing cssmin ... ( 49.4 KiB *) 175.98 ms + Timing rcssmin ... ( 49.6 KiB >) 46.22 ms (factor: 3.81) + Timing _rcssmin ... ( 49.6 KiB >) 0.45 ms (factor: 390.95, 102.68) + +Benchmarking 'bench/wikipedia.min.css'... (49.4 KiB) + Timing cssmin ... ( 49.4 KiB *) 126.19 ms + Timing rcssmin ... ( 49.4 KiB =) 19.92 ms (factor: 6.33) + Timing _rcssmin ... ( 49.4 KiB =) 0.27 ms (factor: 469.78, 74.17) + + +# vim: nowrap diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/CHANGES b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/CHANGES new file mode 100644 index 00000000000..e179dce99dd --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/CHANGES @@ -0,0 +1,42 @@ +Changes with version 1.0.5 + + *) Added support for pypy 2.2 + + *) Updated benchmarks + + *) Relint with newer pylint + + *) Fix locale problem with the setup script on python3. + Submitted by https://github.com/svenstaro + + +Changes with version 1.0.4 + + *) Documentation and benchmark updates + + +Changes with version 1.0.3 + + *) Added support for the following grouping @-rules: + @supports, @document, @keyframes + + *) Added support for Python 3.4 and Jython 2.7 + + +Changes with version 1.0.2 + + *) Added compat option to setup.py supporting the pip installer + + *) Added support for pypy (1.9, 2.0) + + *) Added support for jython (2.5) + + +Changes with version 1.0.1 + + *) Added support for Python 3.3 + + +Changes with version 1.0.0 + + *) First stable release. diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/CLASSIFIERS b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/CLASSIFIERS new file mode 100644 index 00000000000..10d59650380 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/CLASSIFIERS @@ -0,0 +1,19 @@ +Development Status :: 5 - Production/Stable +Environment :: Web Environment +Intended Audience :: Developers +License :: OSI Approved +License :: OSI Approved :: Apache License, Version 2.0 +Operating System :: OS Independent +Programming Language :: C +Programming Language :: Python +Programming Language :: Python :: 2 +Programming Language :: Python :: 3 +Programming Language :: Python :: Implementation :: CPython +Programming Language :: Python :: Implementation :: Jython +Programming Language :: Python :: Implementation :: PyPy +Topic :: Internet :: WWW/HTTP :: Dynamic Content +Topic :: Software Development :: Libraries +Topic :: Software Development :: Libraries :: Python Modules +Topic :: Text Processing +Topic :: Text Processing :: Filters +Topic :: Utilities diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/DESCRIPTION b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/DESCRIPTION new file mode 100644 index 00000000000..b51a7fdb837 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/DESCRIPTION @@ -0,0 +1,85 @@ +============== + CSS Minifier +============== + +RCSSmin is a CSS minifier. + +The minifier is based on the semantics of the `YUI compressor`_\, which itself +is based on `the rule list by Isaac Schlueter`_\. + +This module is a re-implementation aiming for speed instead of maximum +compression, so it can be used at runtime (rather than during a preprocessing +step). RCSSmin does syntactical compression only (removing spaces, comments +and possibly semicolons). It does not provide semantic compression (like +removing empty blocks, collapsing redundant properties etc). It does, however, +support various CSS hacks (by keeping them working as intended). + +Here's a feature list: + +- Strings are kept, except that escaped newlines are stripped +- Space/Comments before the very end or before various characters are + stripped: ``:{});=>+],!`` (The colon (``:``) is a special case, a single + space is kept if it's outside a ruleset.) +- Space/Comments at the very beginning or after various characters are + stripped: ``{}(=:>+[,!`` +- Optional space after unicode escapes is kept, resp. replaced by a simple + space +- whitespaces inside ``url()`` definitions are stripped +- Comments starting with an exclamation mark (``!``) can be kept optionally. +- All other comments and/or whitespace characters are replaced by a single + space. +- Multiple consecutive semicolons are reduced to one +- The last semicolon within a ruleset is stripped +- CSS Hacks supported: + + - IE7 hack (``>/**/``) + - Mac-IE5 hack (``/*\*/.../**/``) + - The boxmodelhack is supported naturally because it relies on valid CSS2 + strings + - Between ``:first-line`` and the following comma or curly brace a space is + inserted. (apparently it's needed for IE6) + - Same for ``:first-letter`` + +rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to +factor 100 or so (depending on the input). docs/BENCHMARKS in the source +distribution contains the details. + +Both python 2 (>= 2.4) and python 3 are supported. + +.. _YUI compressor: https://github.com/yui/yuicompressor/ + +.. _the rule list by Isaac Schlueter: https://github.com/isaacs/cssmin/ + + +Copyright and License +~~~~~~~~~~~~~~~~~~~~~ + +Copyright 2011 - 2014 +André Malo or his licensors, as applicable. + +The whole package (except for the files in the bench/ directory) is +distributed under the Apache License Version 2.0. You'll find a copy in the +root directory of the distribution or online at: +<http://www.apache.org/licenses/LICENSE-2.0>. + + +Bugs +~~~~ + +No bugs, of course. ;-) +But if you've found one or have an idea how to improve rcssmin, feel free +to send a pull request on `github <https://github.com/ndparker/rcssmin>`_ +or send a mail to <rcssmin-bugs@perlig.de>. + + +Author Information +~~~~~~~~~~~~~~~~~~ + +André "nd" Malo <nd perlig.de> +GPG: 0x8103A37E + + + If God intended people to be naked, they would be born that way. + -- Oscar Wilde + +.. vim:tw=72 syntax=rest diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/PROVIDES b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/PROVIDES new file mode 100644 index 00000000000..d6d4e9ebe93 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/PROVIDES @@ -0,0 +1 @@ +rcssmin (1.0) diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/SUMMARY b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/SUMMARY new file mode 100644 index 00000000000..490e5373442 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/SUMMARY @@ -0,0 +1 @@ +CSS Minifier diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/api-objects.txt b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/api-objects.txt new file mode 100644 index 00000000000..f4ed223ee65 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/api-objects.txt @@ -0,0 +1,6 @@ +rcssmin rcssmin-module.html +rcssmin.__license__ rcssmin-module.html#__license__ +rcssmin._make_cssmin rcssmin-module.html#_make_cssmin +rcssmin.__doc__ rcssmin-module.html#__doc__ +rcssmin.__package__ rcssmin-module.html#__package__ +rcssmin.cssmin rcssmin-module.html#cssmin diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/crarr.png b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/crarr.png Binary files differnew file mode 100644 index 00000000000..26b43c52433 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/crarr.png diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/epydoc.css b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/epydoc.css new file mode 100644 index 00000000000..86d41706824 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/epydoc.css @@ -0,0 +1,322 @@ + + +/* Epydoc CSS Stylesheet + * + * This stylesheet can be used to customize the appearance of epydoc's + * HTML output. + * + */ + +/* Default Colors & Styles + * - Set the default foreground & background color with 'body'; and + * link colors with 'a:link' and 'a:visited'. + * - Use bold for decision list terms. + * - The heading styles defined here are used for headings *within* + * docstring descriptions. All headings used by epydoc itself use + * either class='epydoc' or class='toc' (CSS styles for both + * defined below). + */ +body { background: #ffffff; color: #000000; } +p { margin-top: 0.5em; margin-bottom: 0.5em; } +a:link { color: #0000ff; } +a:visited { color: #204080; } +dt { font-weight: bold; } +h1 { font-size: +140%; font-style: italic; + font-weight: bold; } +h2 { font-size: +125%; font-style: italic; + font-weight: bold; } +h3 { font-size: +110%; font-style: italic; + font-weight: normal; } +code { font-size: 100%; } +/* N.B.: class, not pseudoclass */ +a.link { font-family: monospace; } + +/* Page Header & Footer + * - The standard page header consists of a navigation bar (with + * pointers to standard pages such as 'home' and 'trees'); a + * breadcrumbs list, which can be used to navigate to containing + * classes or modules; options links, to show/hide private + * variables and to show/hide frames; and a page title (using + * <h1>). The page title may be followed by a link to the + * corresponding source code (using 'span.codelink'). + * - The footer consists of a navigation bar, a timestamp, and a + * pointer to epydoc's homepage. + */ +h1.epydoc { margin: 0; font-size: +140%; font-weight: bold; } +h2.epydoc { font-size: +130%; font-weight: bold; } +h3.epydoc { font-size: +115%; font-weight: bold; + margin-top: 0.2em; } +td h3.epydoc { font-size: +115%; font-weight: bold; + margin-bottom: 0; } +table.navbar { background: #a0c0ff; color: #000000; + border: 2px groove #c0d0d0; } +table.navbar table { color: #000000; } +th.navbar-select { background: #70b0ff; + color: #000000; } +table.navbar a { text-decoration: none; } +table.navbar a:link { color: #0000ff; } +table.navbar a:visited { color: #204080; } +span.breadcrumbs { font-size: 85%; font-weight: bold; } +span.options { font-size: 70%; } +span.codelink { font-size: 85%; } +td.footer { font-size: 85%; } + +/* Table Headers + * - Each summary table and details section begins with a 'header' + * row. This row contains a section title (marked by + * 'span.table-header') as well as a show/hide private link + * (marked by 'span.options', defined above). + * - Summary tables that contain user-defined groups mark those + * groups using 'group header' rows. + */ +td.table-header { background: #70b0ff; color: #000000; + border: 1px solid #608090; } +td.table-header table { color: #000000; } +td.table-header table a:link { color: #0000ff; } +td.table-header table a:visited { color: #204080; } +span.table-header { font-size: 120%; font-weight: bold; } +th.group-header { background: #c0e0f8; color: #000000; + text-align: left; font-style: italic; + font-size: 115%; + border: 1px solid #608090; } + +/* Summary Tables (functions, variables, etc) + * - Each object is described by a single row of the table with + * two cells. The left cell gives the object's type, and is + * marked with 'code.summary-type'. The right cell gives the + * object's name and a summary description. + * - CSS styles for the table's header and group headers are + * defined above, under 'Table Headers' + */ +table.summary { border-collapse: collapse; + background: #e8f0f8; color: #000000; + border: 1px solid #608090; + margin-bottom: 0.5em; } +td.summary { border: 1px solid #608090; } +code.summary-type { font-size: 85%; } +table.summary a:link { color: #0000ff; } +table.summary a:visited { color: #204080; } + + +/* Details Tables (functions, variables, etc) + * - Each object is described in its own div. + * - A single-row summary table w/ table-header is used as + * a header for each details section (CSS style for table-header + * is defined above, under 'Table Headers'). + */ +table.details { border-collapse: collapse; + background: #e8f0f8; color: #000000; + border: 1px solid #608090; + margin: .2em 0 0 0; } +table.details table { color: #000000; } +table.details a:link { color: #0000ff; } +table.details a:visited { color: #204080; } + +/* Fields */ +dl.fields { margin-left: 2em; margin-top: 1em; + margin-bottom: 1em; } +dl.fields dd ul { margin-left: 0em; padding-left: 0em; } +dl.fields dd ul li ul { margin-left: 2em; padding-left: 0em; } +div.fields { margin-left: 2em; } +div.fields p { margin-bottom: 0.5em; } + +/* Index tables (identifier index, term index, etc) + * - link-index is used for indices containing lists of links + * (namely, the identifier index & term index). + * - index-where is used in link indices for the text indicating + * the container/source for each link. + * - metadata-index is used for indices containing metadata + * extracted from fields (namely, the bug index & todo index). + */ +table.link-index { border-collapse: collapse; + background: #e8f0f8; color: #000000; + border: 1px solid #608090; } +td.link-index { border-width: 0px; } +table.link-index a:link { color: #0000ff; } +table.link-index a:visited { color: #204080; } +span.index-where { font-size: 70%; } +table.metadata-index { border-collapse: collapse; + background: #e8f0f8; color: #000000; + border: 1px solid #608090; + margin: .2em 0 0 0; } +td.metadata-index { border-width: 1px; border-style: solid; } +table.metadata-index a:link { color: #0000ff; } +table.metadata-index a:visited { color: #204080; } + +/* Function signatures + * - sig* is used for the signature in the details section. + * - .summary-sig* is used for the signature in the summary + * table, and when listing property accessor functions. + * */ +.sig-name { color: #006080; } +.sig-arg { color: #008060; } +.sig-default { color: #602000; } +.summary-sig { font-family: monospace; } +.summary-sig-name { color: #006080; font-weight: bold; } +table.summary a.summary-sig-name:link + { color: #006080; font-weight: bold; } +table.summary a.summary-sig-name:visited + { color: #006080; font-weight: bold; } +.summary-sig-arg { color: #006040; } +.summary-sig-default { color: #501800; } + +/* Subclass list + */ +ul.subclass-list { display: inline; } +ul.subclass-list li { display: inline; } + +/* To render variables, classes etc. like functions */ +table.summary .summary-name { color: #006080; font-weight: bold; + font-family: monospace; } +table.summary + a.summary-name:link { color: #006080; font-weight: bold; + font-family: monospace; } +table.summary + a.summary-name:visited { color: #006080; font-weight: bold; + font-family: monospace; } + +/* Variable values + * - In the 'variable details' sections, each varaible's value is + * listed in a 'pre.variable' box. The width of this box is + * restricted to 80 chars; if the value's repr is longer than + * this it will be wrapped, using a backslash marked with + * class 'variable-linewrap'. If the value's repr is longer + * than 3 lines, the rest will be ellided; and an ellipsis + * marker ('...' marked with 'variable-ellipsis') will be used. + * - If the value is a string, its quote marks will be marked + * with 'variable-quote'. + * - If the variable is a regexp, it is syntax-highlighted using + * the re* CSS classes. + */ +pre.variable { padding: .5em; margin: 0; + background: #dce4ec; color: #000000; + border: 1px solid #708890; } +.variable-linewrap { color: #604000; font-weight: bold; } +.variable-ellipsis { color: #604000; font-weight: bold; } +.variable-quote { color: #604000; font-weight: bold; } +.variable-group { color: #008000; font-weight: bold; } +.variable-op { color: #604000; font-weight: bold; } +.variable-string { color: #006030; } +.variable-unknown { color: #a00000; font-weight: bold; } +.re { color: #000000; } +.re-char { color: #006030; } +.re-op { color: #600000; } +.re-group { color: #003060; } +.re-ref { color: #404040; } + +/* Base tree + * - Used by class pages to display the base class hierarchy. + */ +pre.base-tree { font-size: 80%; margin: 0; } + +/* Frames-based table of contents headers + * - Consists of two frames: one for selecting modules; and + * the other listing the contents of the selected module. + * - h1.toc is used for each frame's heading + * - h2.toc is used for subheadings within each frame. + */ +h1.toc { text-align: center; font-size: 105%; + margin: 0; font-weight: bold; + padding: 0; } +h2.toc { font-size: 100%; font-weight: bold; + margin: 0.5em 0 0 -0.3em; } + +/* Syntax Highlighting for Source Code + * - doctest examples are displayed in a 'pre.py-doctest' block. + * If the example is in a details table entry, then it will use + * the colors specified by the 'table pre.py-doctest' line. + * - Source code listings are displayed in a 'pre.py-src' block. + * Each line is marked with 'span.py-line' (used to draw a line + * down the left margin, separating the code from the line + * numbers). Line numbers are displayed with 'span.py-lineno'. + * The expand/collapse block toggle button is displayed with + * 'a.py-toggle' (Note: the CSS style for 'a.py-toggle' should not + * modify the font size of the text.) + * - If a source code page is opened with an anchor, then the + * corresponding code block will be highlighted. The code + * block's header is highlighted with 'py-highlight-hdr'; and + * the code block's body is highlighted with 'py-highlight'. + * - The remaining py-* classes are used to perform syntax + * highlighting (py-string for string literals, py-name for names, + * etc.) + */ +pre.py-doctest { padding: .5em; margin: 1em; + background: #e8f0f8; color: #000000; + border: 1px solid #708890; } +table pre.py-doctest { background: #dce4ec; + color: #000000; } +pre.py-src { border: 2px solid #000000; + background: #f0f0f0; color: #000000; } +.py-line { border-left: 2px solid #000000; + margin-left: .2em; padding-left: .4em; } +.py-lineno { font-style: italic; font-size: 90%; + padding-left: .5em; } +a.py-toggle { text-decoration: none; } +div.py-highlight-hdr { border-top: 2px solid #000000; + border-bottom: 2px solid #000000; + background: #d8e8e8; } +div.py-highlight { border-bottom: 2px solid #000000; + background: #d0e0e0; } +.py-prompt { color: #005050; font-weight: bold;} +.py-more { color: #005050; font-weight: bold;} +.py-string { color: #006030; } +.py-comment { color: #003060; } +.py-keyword { color: #600000; } +.py-output { color: #404040; } +.py-name { color: #000050; } +.py-name:link { color: #000050 !important; } +.py-name:visited { color: #000050 !important; } +.py-number { color: #005000; } +.py-defname { color: #000060; font-weight: bold; } +.py-def-name { color: #000060; font-weight: bold; } +.py-base-class { color: #000060; } +.py-param { color: #000060; } +.py-docstring { color: #006030; } +.py-decorator { color: #804020; } +/* Use this if you don't want links to names underlined: */ +/*a.py-name { text-decoration: none; }*/ + +/* Graphs & Diagrams + * - These CSS styles are used for graphs & diagrams generated using + * Graphviz dot. 'img.graph-without-title' is used for bare + * diagrams (to remove the border created by making the image + * clickable). + */ +img.graph-without-title { border: none; } +img.graph-with-title { border: 1px solid #000000; } +span.graph-title { font-weight: bold; } +span.graph-caption { } + +/* General-purpose classes + * - 'p.indent-wrapped-lines' defines a paragraph whose first line + * is not indented, but whose subsequent lines are. + * - The 'nomargin-top' class is used to remove the top margin (e.g. + * from lists). The 'nomargin' class is used to remove both the + * top and bottom margin (but not the left or right margin -- + * for lists, that would cause the bullets to disappear.) + */ +p.indent-wrapped-lines { padding: 0 0 0 7em; text-indent: -7em; + margin: 0; } +.nomargin-top { margin-top: 0; } +.nomargin { margin-top: 0; margin-bottom: 0; } + +/* HTML Log */ +div.log-block { padding: 0; margin: .5em 0 .5em 0; + background: #e8f0f8; color: #000000; + border: 1px solid #000000; } +div.log-error { padding: .1em .3em .1em .3em; margin: 4px; + background: #ffb0b0; color: #000000; + border: 1px solid #000000; } +div.log-warning { padding: .1em .3em .1em .3em; margin: 4px; + background: #ffffb0; color: #000000; + border: 1px solid #000000; } +div.log-info { padding: .1em .3em .1em .3em; margin: 4px; + background: #b0ffb0; color: #000000; + border: 1px solid #000000; } +h2.log-hdr { background: #70b0ff; color: #000000; + margin: 0; padding: 0em 0.5em 0em 0.5em; + border-bottom: 1px solid #000000; font-size: 110%; } +p.log { font-weight: bold; margin: .5em 0 .5em 0; } +tr.opt-changed { color: #000000; font-weight: bold; } +tr.opt-default { color: #606060; } +pre.log { margin: 0; padding: 0; padding-left: 1em; } diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/epydoc.js b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/epydoc.js new file mode 100644 index 00000000000..e787dbcf471 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/epydoc.js @@ -0,0 +1,293 @@ +function toggle_private() { + // Search for any private/public links on this page. Store + // their old text in "cmd," so we will know what action to + // take; and change their text to the opposite action. + var cmd = "?"; + var elts = document.getElementsByTagName("a"); + for(var i=0; i<elts.length; i++) { + if (elts[i].className == "privatelink") { + cmd = elts[i].innerHTML; + elts[i].innerHTML = ((cmd && cmd.substr(0,4)=="show")? + "hide private":"show private"); + } + } + // Update all DIVs containing private objects. + var elts = document.getElementsByTagName("div"); + for(var i=0; i<elts.length; i++) { + if (elts[i].className == "private") { + elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"none":"block"); + } + else if (elts[i].className == "public") { + elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"block":"none"); + } + } + // Update all table rows containing private objects. Note, we + // use "" instead of "block" becaue IE & firefox disagree on what + // this should be (block vs table-row), and "" just gives the + // default for both browsers. + var elts = document.getElementsByTagName("tr"); + for(var i=0; i<elts.length; i++) { + if (elts[i].className == "private") { + elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"none":""); + } + } + // Update all list items containing private objects. + var elts = document.getElementsByTagName("li"); + for(var i=0; i<elts.length; i++) { + if (elts[i].className == "private") { + elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")? + "none":""); + } + } + // Update all list items containing private objects. + var elts = document.getElementsByTagName("ul"); + for(var i=0; i<elts.length; i++) { + if (elts[i].className == "private") { + elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"none":"block"); + } + } + // Set a cookie to remember the current option. + document.cookie = "EpydocPrivate="+cmd; + } +function show_private() { + var elts = document.getElementsByTagName("a"); + for(var i=0; i<elts.length; i++) { + if (elts[i].className == "privatelink") { + cmd = elts[i].innerHTML; + if (cmd && cmd.substr(0,4)=="show") + toggle_private(); + } + } + } +function getCookie(name) { + var dc = document.cookie; + var prefix = name + "="; + var begin = dc.indexOf("; " + prefix); + if (begin == -1) { + begin = dc.indexOf(prefix); + if (begin != 0) return null; + } else + { begin += 2; } + var end = document.cookie.indexOf(";", begin); + if (end == -1) + { end = dc.length; } + return unescape(dc.substring(begin + prefix.length, end)); + } +function setFrame(url1, url2) { + parent.frames[1].location.href = url1; + parent.frames[2].location.href = url2; + } +function checkCookie() { + var cmd=getCookie("EpydocPrivate"); + if (cmd && cmd.substr(0,4)!="show" && location.href.indexOf("#_") < 0) + toggle_private(); + } +function toggleCallGraph(id) { + var elt = document.getElementById(id); + if (elt.style.display == "none") + elt.style.display = "block"; + else + elt.style.display = "none"; + } +function expand(id) { + var elt = document.getElementById(id+"-expanded"); + if (elt) elt.style.display = "block"; + var elt = document.getElementById(id+"-expanded-linenums"); + if (elt) elt.style.display = "block"; + var elt = document.getElementById(id+"-collapsed"); + if (elt) { elt.innerHTML = ""; elt.style.display = "none"; } + var elt = document.getElementById(id+"-collapsed-linenums"); + if (elt) { elt.innerHTML = ""; elt.style.display = "none"; } + var elt = document.getElementById(id+"-toggle"); + if (elt) { elt.innerHTML = "-"; } +} + +function collapse(id) { + var elt = document.getElementById(id+"-expanded"); + if (elt) elt.style.display = "none"; + var elt = document.getElementById(id+"-expanded-linenums"); + if (elt) elt.style.display = "none"; + var elt = document.getElementById(id+"-collapsed-linenums"); + if (elt) { elt.innerHTML = "<br />"; elt.style.display="block"; } + var elt = document.getElementById(id+"-toggle"); + if (elt) { elt.innerHTML = "+"; } + var elt = document.getElementById(id+"-collapsed"); + if (elt) { + elt.style.display = "block"; + + var indent = elt.getAttribute("indent"); + var pad = elt.getAttribute("pad"); + var s = "<tt class='py-lineno'>"; + for (var i=0; i<pad.length; i++) { s += " " } + s += "</tt>"; + s += " <tt class='py-line'>"; + for (var i=0; i<indent.length; i++) { s += " " } + s += "<a href='#' onclick='expand(\"" + id; + s += "\");return false'>...</a></tt><br />"; + elt.innerHTML = s; + } +} + +function toggle(id) { + elt = document.getElementById(id+"-toggle"); + if (elt.innerHTML == "-") + collapse(id); + else + expand(id); + return false; +} + +function highlight(id) { + var elt = document.getElementById(id+"-def"); + if (elt) elt.className = "py-highlight-hdr"; + var elt = document.getElementById(id+"-expanded"); + if (elt) elt.className = "py-highlight"; + var elt = document.getElementById(id+"-collapsed"); + if (elt) elt.className = "py-highlight"; +} + +function num_lines(s) { + var n = 1; + var pos = s.indexOf("\n"); + while ( pos > 0) { + n += 1; + pos = s.indexOf("\n", pos+1); + } + return n; +} + +// Collapse all blocks that mave more than `min_lines` lines. +function collapse_all(min_lines) { + var elts = document.getElementsByTagName("div"); + for (var i=0; i<elts.length; i++) { + var elt = elts[i]; + var split = elt.id.indexOf("-"); + if (split > 0) + if (elt.id.substring(split, elt.id.length) == "-expanded") + if (num_lines(elt.innerHTML) > min_lines) + collapse(elt.id.substring(0, split)); + } +} + +function expandto(href) { + var start = href.indexOf("#")+1; + if (start != 0 && start != href.length) { + if (href.substring(start, href.length) != "-") { + collapse_all(4); + pos = href.indexOf(".", start); + while (pos != -1) { + var id = href.substring(start, pos); + expand(id); + pos = href.indexOf(".", pos+1); + } + var id = href.substring(start, href.length); + expand(id); + highlight(id); + } + } +} + +function kill_doclink(id) { + var parent = document.getElementById(id); + parent.removeChild(parent.childNodes.item(0)); +} +function auto_kill_doclink(ev) { + if (!ev) var ev = window.event; + if (!this.contains(ev.toElement)) { + var parent = document.getElementById(this.parentID); + parent.removeChild(parent.childNodes.item(0)); + } +} + +function doclink(id, name, targets_id) { + var elt = document.getElementById(id); + + // If we already opened the box, then destroy it. + // (This case should never occur, but leave it in just in case.) + if (elt.childNodes.length > 1) { + elt.removeChild(elt.childNodes.item(0)); + } + else { + // The outer box: relative + inline positioning. + var box1 = document.createElement("div"); + box1.style.position = "relative"; + box1.style.display = "inline"; + box1.style.top = 0; + box1.style.left = 0; + + // A shadow for fun + var shadow = document.createElement("div"); + shadow.style.position = "absolute"; + shadow.style.left = "-1.3em"; + shadow.style.top = "-1.3em"; + shadow.style.background = "#404040"; + + // The inner box: absolute positioning. + var box2 = document.createElement("div"); + box2.style.position = "relative"; + box2.style.border = "1px solid #a0a0a0"; + box2.style.left = "-.2em"; + box2.style.top = "-.2em"; + box2.style.background = "white"; + box2.style.padding = ".3em .4em .3em .4em"; + box2.style.fontStyle = "normal"; + box2.onmouseout=auto_kill_doclink; + box2.parentID = id; + + // Get the targets + var targets_elt = document.getElementById(targets_id); + var targets = targets_elt.getAttribute("targets"); + var links = ""; + target_list = targets.split(","); + for (var i=0; i<target_list.length; i++) { + var target = target_list[i].split("="); + links += "<li><a href='" + target[1] + + "' style='text-decoration:none'>" + + target[0] + "</a></li>"; + } + + // Put it all together. + elt.insertBefore(box1, elt.childNodes.item(0)); + //box1.appendChild(box2); + box1.appendChild(shadow); + shadow.appendChild(box2); + box2.innerHTML = + "Which <b>"+name+"</b> do you want to see documentation for?" + + "<ul style='margin-bottom: 0;'>" + + links + + "<li><a href='#' style='text-decoration:none' " + + "onclick='kill_doclink(\""+id+"\");return false;'>"+ + "<i>None of the above</i></a></li></ul>"; + } + return false; +} + +function get_anchor() { + var href = location.href; + var start = href.indexOf("#")+1; + if ((start != 0) && (start != href.length)) + return href.substring(start, href.length); + } +function redirect_url(dottedName) { + // Scan through each element of the "pages" list, and check + // if "name" matches with any of them. + for (var i=0; i<pages.length; i++) { + + // Each page has the form "<pagename>-m" or "<pagename>-c"; + // extract the <pagename> portion & compare it to dottedName. + var pagename = pages[i].substring(0, pages[i].length-2); + if (pagename == dottedName.substring(0,pagename.length)) { + + // We've found a page that matches `dottedName`; + // construct its URL, using leftover `dottedName` + // content to form an anchor. + var pagetype = pages[i].charAt(pages[i].length-1); + var url = pagename + ((pagetype=="m")?"-module.html": + "-class.html"); + if (dottedName.length > pagename.length) + url += "#" + dottedName.substring(pagename.length+1, + dottedName.length); + return url; + } + } + } diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/help.html b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/help.html new file mode 100644 index 00000000000..d1bf1c8766d --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/help.html @@ -0,0 +1,261 @@ +<?xml version="1.0" encoding="ascii"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <title>Help</title> + <link rel="stylesheet" href="epydoc.css" type="text/css" /> + <script type="text/javascript" src="epydoc.js"></script> +</head> + +<body bgcolor="white" text="black" link="blue" vlink="#204080" + alink="#204080"> +<!-- ==================== NAVIGATION BAR ==================== --> +<table class="navbar" border="0" width="100%" cellpadding="0" + bgcolor="#a0c0ff" cellspacing="0"> + <tr valign="middle"> + <!-- Home link --> + <th> <a + href="rcssmin-module.html">Home</a> </th> + + <!-- Tree link --> + <th> <a + href="module-tree.html">Trees</a> </th> + + <!-- Index link --> + <th> <a + href="identifier-index.html">Indices</a> </th> + + <!-- Help link --> + <th bgcolor="#70b0f0" class="navbar-select" + > Help </th> + + <!-- Project homepage --> + <th class="navbar" align="right" width="100%"> + <table border="0" cellpadding="0" cellspacing="0"> + <tr><th class="navbar" align="center" + ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th> + </tr></table></th> + </tr> +</table> +<table width="100%" cellpadding="0" cellspacing="0"> + <tr valign="top"> + <td width="100%"> </td> + <td> + <table cellpadding="0" cellspacing="0"> + <!-- hide/show private --> + </table> + </td> + </tr> +</table> + +<h1 class="epydoc"> API Documentation </h1> + +<p> This document contains the API (Application Programming Interface) +documentation for this project. Documentation for the Python +objects defined by the project is divided into separate pages for each +package, module, and class. The API documentation also includes two +pages containing information about the project as a whole: a trees +page, and an index page. </p> + +<h2> Object Documentation </h2> + + <p>Each <strong>Package Documentation</strong> page contains: </p> + <ul> + <li> A description of the package. </li> + <li> A list of the modules and sub-packages contained by the + package. </li> + <li> A summary of the classes defined by the package. </li> + <li> A summary of the functions defined by the package. </li> + <li> A summary of the variables defined by the package. </li> + <li> A detailed description of each function defined by the + package. </li> + <li> A detailed description of each variable defined by the + package. </li> + </ul> + + <p>Each <strong>Module Documentation</strong> page contains:</p> + <ul> + <li> A description of the module. </li> + <li> A summary of the classes defined by the module. </li> + <li> A summary of the functions defined by the module. </li> + <li> A summary of the variables defined by the module. </li> + <li> A detailed description of each function defined by the + module. </li> + <li> A detailed description of each variable defined by the + module. </li> + </ul> + + <p>Each <strong>Class Documentation</strong> page contains: </p> + <ul> + <li> A class inheritance diagram. </li> + <li> A list of known subclasses. </li> + <li> A description of the class. </li> + <li> A summary of the methods defined by the class. </li> + <li> A summary of the instance variables defined by the class. </li> + <li> A summary of the class (static) variables defined by the + class. </li> + <li> A detailed description of each method defined by the + class. </li> + <li> A detailed description of each instance variable defined by the + class. </li> + <li> A detailed description of each class (static) variable defined + by the class. </li> + </ul> + +<h2> Project Documentation </h2> + + <p> The <strong>Trees</strong> page contains the module and class hierarchies: </p> + <ul> + <li> The <em>module hierarchy</em> lists every package and module, with + modules grouped into packages. At the top level, and within each + package, modules and sub-packages are listed alphabetically. </li> + <li> The <em>class hierarchy</em> lists every class, grouped by base + class. If a class has more than one base class, then it will be + listed under each base class. At the top level, and under each base + class, classes are listed alphabetically. </li> + </ul> + + <p> The <strong>Index</strong> page contains indices of terms and + identifiers: </p> + <ul> + <li> The <em>term index</em> lists every term indexed by any object's + documentation. For each term, the index provides links to each + place where the term is indexed. </li> + <li> The <em>identifier index</em> lists the (short) name of every package, + module, class, method, function, variable, and parameter. For each + identifier, the index provides a short description, and a link to + its documentation. </li> + </ul> + +<h2> The Table of Contents </h2> + +<p> The table of contents occupies the two frames on the left side of +the window. The upper-left frame displays the <em>project +contents</em>, and the lower-left frame displays the <em>module +contents</em>: </p> + +<table class="help summary" border="1" cellspacing="0" cellpadding="3"> + <tr style="height: 30%"> + <td align="center" style="font-size: small"> + Project<br />Contents<hr />...</td> + <td align="center" style="font-size: small" rowspan="2" width="70%"> + API<br />Documentation<br />Frame<br /><br /><br /> + </td> + </tr> + <tr> + <td align="center" style="font-size: small"> + Module<br />Contents<hr /> <br />...<br /> + </td> + </tr> +</table><br /> + +<p> The <strong>project contents frame</strong> contains a list of all packages +and modules that are defined by the project. Clicking on an entry +will display its contents in the module contents frame. Clicking on a +special entry, labeled "Everything," will display the contents of +the entire project. </p> + +<p> The <strong>module contents frame</strong> contains a list of every +submodule, class, type, exception, function, and variable defined by a +module or package. Clicking on an entry will display its +documentation in the API documentation frame. Clicking on the name of +the module, at the top of the frame, will display the documentation +for the module itself. </p> + +<p> The "<strong>frames</strong>" and "<strong>no frames</strong>" buttons below the top +navigation bar can be used to control whether the table of contents is +displayed or not. </p> + +<h2> The Navigation Bar </h2> + +<p> A navigation bar is located at the top and bottom of every page. +It indicates what type of page you are currently viewing, and allows +you to go to related pages. The following table describes the labels +on the navigation bar. Note that not some labels (such as +[Parent]) are not displayed on all pages. </p> + +<table class="summary" border="1" cellspacing="0" cellpadding="3" width="100%"> +<tr class="summary"> + <th>Label</th> + <th>Highlighted when...</th> + <th>Links to...</th> +</tr> + <tr><td valign="top"><strong>[Parent]</strong></td> + <td valign="top"><em>(never highlighted)</em></td> + <td valign="top"> the parent of the current package </td></tr> + <tr><td valign="top"><strong>[Package]</strong></td> + <td valign="top">viewing a package</td> + <td valign="top">the package containing the current object + </td></tr> + <tr><td valign="top"><strong>[Module]</strong></td> + <td valign="top">viewing a module</td> + <td valign="top">the module containing the current object + </td></tr> + <tr><td valign="top"><strong>[Class]</strong></td> + <td valign="top">viewing a class </td> + <td valign="top">the class containing the current object</td></tr> + <tr><td valign="top"><strong>[Trees]</strong></td> + <td valign="top">viewing the trees page</td> + <td valign="top"> the trees page </td></tr> + <tr><td valign="top"><strong>[Index]</strong></td> + <td valign="top">viewing the index page</td> + <td valign="top"> the index page </td></tr> + <tr><td valign="top"><strong>[Help]</strong></td> + <td valign="top">viewing the help page</td> + <td valign="top"> the help page </td></tr> +</table> + +<p> The "<strong>show private</strong>" and "<strong>hide private</strong>" buttons below +the top navigation bar can be used to control whether documentation +for private objects is displayed. Private objects are usually defined +as objects whose (short) names begin with a single underscore, but do +not end with an underscore. For example, "<code>_x</code>", +"<code>__pprint</code>", and "<code>epydoc.epytext._tokenize</code>" +are private objects; but "<code>re.sub</code>", +"<code>__init__</code>", and "<code>type_</code>" are not. However, +if a module defines the "<code>__all__</code>" variable, then its +contents are used to decide which objects are private. </p> + +<p> A timestamp below the bottom navigation bar indicates when each +page was last updated. </p> +<!-- ==================== NAVIGATION BAR ==================== --> +<table class="navbar" border="0" width="100%" cellpadding="0" + bgcolor="#a0c0ff" cellspacing="0"> + <tr valign="middle"> + <!-- Home link --> + <th> <a + href="rcssmin-module.html">Home</a> </th> + + <!-- Tree link --> + <th> <a + href="module-tree.html">Trees</a> </th> + + <!-- Index link --> + <th> <a + href="identifier-index.html">Indices</a> </th> + + <!-- Help link --> + <th bgcolor="#70b0f0" class="navbar-select" + > Help </th> + + <!-- Project homepage --> + <th class="navbar" align="right" width="100%"> + <table border="0" cellpadding="0" cellspacing="0"> + <tr><th class="navbar" align="center" + ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th> + </tr></table></th> + </tr> +</table> + +<script type="text/javascript"> + <!-- + // Private objects are initially displayed (because if + // javascript is turned off then we want them to be + // visible); but by default, we want to hide them. So hide + // them unless we have a cookie that says to show them. + checkCookie(); + // --> +</script> +</body> +</html> diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/identifier-index.html b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/identifier-index.html new file mode 100644 index 00000000000..82acafdbb7c --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/identifier-index.html @@ -0,0 +1,163 @@ +<?xml version="1.0" encoding="ascii"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <title>Identifier Index</title> + <link rel="stylesheet" href="epydoc.css" type="text/css" /> + <script type="text/javascript" src="epydoc.js"></script> +</head> + +<body bgcolor="white" text="black" link="blue" vlink="#204080" + alink="#204080"> +<!-- ==================== NAVIGATION BAR ==================== --> +<table class="navbar" border="0" width="100%" cellpadding="0" + bgcolor="#a0c0ff" cellspacing="0"> + <tr valign="middle"> + <!-- Home link --> + <th> <a + href="rcssmin-module.html">Home</a> </th> + + <!-- Tree link --> + <th> <a + href="module-tree.html">Trees</a> </th> + + <!-- Index link --> + <th bgcolor="#70b0f0" class="navbar-select" + > Indices </th> + + <!-- Help link --> + <th> <a + href="help.html">Help</a> </th> + + <!-- Project homepage --> + <th class="navbar" align="right" width="100%"> + <table border="0" cellpadding="0" cellspacing="0"> + <tr><th class="navbar" align="center" + ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th> + </tr></table></th> + </tr> +</table> +<table width="100%" cellpadding="0" cellspacing="0"> + <tr valign="top"> + <td width="100%"> </td> + <td> + <table cellpadding="0" cellspacing="0"> + <!-- hide/show private --> + </table> + </td> + </tr> +</table> +<table border="0" width="100%"> +<tr valign="bottom"><td> +<h1 class="epydoc">Identifier Index</h1> +</td><td> +[ + A + B + <a href="#C">C</a> + D + E + F + G + H + I + J + K + L + M + N + O + P + Q + <a href="#R">R</a> + S + T + U + V + W + X + Y + Z + <a href="#_">_</a> +] +</td></table> +<table border="0" width="100%"> +<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="C">C</a></h2></td> +<td valign="top"> +<table class="link-index" width="100%" border="1"> +<tr> +<td width="33%" class="link-index"><a href="rcssmin-module.html#cssmin">cssmin()</a><br /> +<span class="index-where">(in <a href="rcssmin-module.html">rcssmin</a>)</span></td> +<td width="33%" class="link-index"> </td> +<td width="33%" class="link-index"> </td> +</tr> +<tr><td class="link-index"> </td><td class="link-index"> </td><td class="link-index"> </td></tr> +</table> +</td></tr> +<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="R">R</a></h2></td> +<td valign="top"> +<table class="link-index" width="100%" border="1"> +<tr> +<td width="33%" class="link-index"><a href="rcssmin-module.html">rcssmin</a></td> +<td width="33%" class="link-index"> </td> +<td width="33%" class="link-index"> </td> +</tr> +<tr><td class="link-index"> </td><td class="link-index"> </td><td class="link-index"> </td></tr> +</table> +</td></tr> +<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="_">_</a></h2></td> +<td valign="top"> +<table class="link-index" width="100%" border="1"> +<tr> +<td width="33%" class="link-index"><a href="rcssmin-module.html#__doc__">__doc__</a><br /> +<span class="index-where">(in <a href="rcssmin-module.html">rcssmin</a>)</span></td> +<td width="33%" class="link-index"><a href="rcssmin-module.html#__license__">__license__</a><br /> +<span class="index-where">(in <a href="rcssmin-module.html">rcssmin</a>)</span></td> +<td width="33%" class="link-index"><a href="rcssmin-module.html#__package__">__package__</a><br /> +<span class="index-where">(in <a href="rcssmin-module.html">rcssmin</a>)</span></td> +</tr> +<tr><td class="link-index"> </td><td class="link-index"> </td><td class="link-index"> </td></tr> +</table> +</td></tr> +</table> +<br /><br /><!-- ==================== NAVIGATION BAR ==================== --> +<table class="navbar" border="0" width="100%" cellpadding="0" + bgcolor="#a0c0ff" cellspacing="0"> + <tr valign="middle"> + <!-- Home link --> + <th> <a + href="rcssmin-module.html">Home</a> </th> + + <!-- Tree link --> + <th> <a + href="module-tree.html">Trees</a> </th> + + <!-- Index link --> + <th bgcolor="#70b0f0" class="navbar-select" + > Indices </th> + + <!-- Help link --> + <th> <a + href="help.html">Help</a> </th> + + <!-- Project homepage --> + <th class="navbar" align="right" width="100%"> + <table border="0" cellpadding="0" cellspacing="0"> + <tr><th class="navbar" align="center" + ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th> + </tr></table></th> + </tr> +</table> + +<script type="text/javascript"> + <!-- + // Private objects are initially displayed (because if + // javascript is turned off then we want them to be + // visible); but by default, we want to hide them. So hide + // them unless we have a cookie that says to show them. + checkCookie(); + // --> +</script> +</body> +</html> diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/index.html b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/index.html new file mode 100644 index 00000000000..84ffddda734 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/index.html @@ -0,0 +1,224 @@ +<?xml version="1.0" encoding="ascii"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <title>rcssmin</title> + <link rel="stylesheet" href="epydoc.css" type="text/css" /> + <script type="text/javascript" src="epydoc.js"></script> +</head> + +<body bgcolor="white" text="black" link="blue" vlink="#204080" + alink="#204080"> +<!-- ==================== NAVIGATION BAR ==================== --> +<table class="navbar" border="0" width="100%" cellpadding="0" + bgcolor="#a0c0ff" cellspacing="0"> + <tr valign="middle"> + <!-- Home link --> + <th bgcolor="#70b0f0" class="navbar-select" + > Home </th> + + <!-- Tree link --> + <th> <a + href="module-tree.html">Trees</a> </th> + + <!-- Index link --> + <th> <a + href="identifier-index.html">Indices</a> </th> + + <!-- Help link --> + <th> <a + href="help.html">Help</a> </th> + + <!-- Project homepage --> + <th class="navbar" align="right" width="100%"> + <table border="0" cellpadding="0" cellspacing="0"> + <tr><th class="navbar" align="center" + ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th> + </tr></table></th> + </tr> +</table> +<table width="100%" cellpadding="0" cellspacing="0"> + <tr valign="top"> + <td width="100%"> + <span class="breadcrumbs"> + Module rcssmin + </span> + </td> + <td> + <table cellpadding="0" cellspacing="0"> + <!-- hide/show private --> + </table> + </td> + </tr> +</table> +<!-- ==================== MODULE DESCRIPTION ==================== --> +<h1 class="epydoc">Module rcssmin</h1><p class="nomargin-top"><span class="codelink"><a href="rcssmin-pysrc.html">source code</a></span></p> +<p>CSS Minifier.</p> +<p>The minifier is based on the semantics of the <a class="rst-reference external" href="https://github.com/yui/yuicompressor/" target="_top">YUI compressor</a>, which +itself is based on <a class="rst-reference external" href="https://github.com/isaacs/cssmin/" target="_top">the rule list by Isaac Schlueter</a>.</p> +<p>This module is a re-implementation aiming for speed instead of maximum +compression, so it can be used at runtime (rather than during a preprocessing +step). RCSSmin does syntactical compression only (removing spaces, comments +and possibly semicolons). It does not provide semantic compression (like +removing empty blocks, collapsing redundant properties etc). It does, however, +support various CSS hacks (by keeping them working as intended).</p> +<p>Here's a feature list:</p> +<ul class="rst-simple"> +<li>Strings are kept, except that escaped newlines are stripped</li> +<li>Space/Comments before the very end or before various characters are +stripped: <tt class="rst-docutils literal"><span class="pre">:{});=>+],!</span></tt> (The colon (<tt class="rst-docutils literal">:</tt>) is a special case, a single +space is kept if it's outside a ruleset.)</li> +<li>Space/Comments at the very beginning or after various characters are +stripped: <tt class="rst-docutils literal"><span class="pre">{}(=:>+[,!</span></tt></li> +<li>Optional space after unicode escapes is kept, resp. replaced by a simple +space</li> +<li>whitespaces inside <tt class="rst-docutils literal">url()</tt> definitions are stripped</li> +<li>Comments starting with an exclamation mark (<tt class="rst-docutils literal">!</tt>) can be kept optionally.</li> +<li>All other comments and/or whitespace characters are replaced by a single +space.</li> +<li>Multiple consecutive semicolons are reduced to one</li> +<li>The last semicolon within a ruleset is stripped</li> +<li>CSS Hacks supported:<ul> +<li>IE7 hack (<tt class="rst-docutils literal"><span class="pre">>/**/</span></tt>)</li> +<li>Mac-IE5 hack (<tt class="rst-docutils literal"><span class="pre">/*\*/.../**/</span></tt>)</li> +<li>The boxmodelhack is supported naturally because it relies on valid CSS2 +strings</li> +<li>Between <tt class="rst-docutils literal"><span class="pre">:first-line</span></tt> and the following comma or curly brace a space is +inserted. (apparently it's needed for IE6)</li> +<li>Same for <tt class="rst-docutils literal"><span class="pre">:first-letter</span></tt></li> +</ul> +</li> +</ul> +<p>rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to +factor 100 or so (depending on the input). docs/BENCHMARKS in the source +distribution contains the details.</p> +<p>Both python 2 (>= 2.4) and python 3 are supported.</p> + +<hr /> +<div class="fields"> <p><strong>Copyright:</strong> + Copyright 2011 - 2014 +André Malo or his licensors, as applicable + </p> + <p><strong>License:</strong> + <p>Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at</p> +<blockquote> +<a class="rst-reference external" href="http://www.apache.org/licenses/LICENSE-2.0" target="_top">http://www.apache.org/licenses/LICENSE-2.0</a></blockquote> +<p>Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.</p> + </p> + <p><strong>Version:</strong> + 1.0.5 + </p> + <p><strong>Author:</strong> + André Malo + </p> +</div><!-- ==================== FUNCTIONS ==================== --> +<a name="section-Functions"></a> +<table class="summary" border="1" cellpadding="3" + cellspacing="0" width="100%" bgcolor="white"> +<tr bgcolor="#70b0f0" class="table-header"> + <td align="left" colspan="2" class="table-header"> + <span class="table-header">Functions</span></td> +</tr> +<tr> + <td width="15%" align="right" valign="top" class="summary"> + <span class="summary-type"><tt class="rst-docutils literal">str</tt></span> + </td><td class="summary"> + <table width="100%" cellpadding="0" cellspacing="0" border="0"> + <tr> + <td><span class="summary-sig"><a href="rcssmin-module.html#cssmin" class="summary-sig-name">cssmin</a>(<span class="summary-sig-arg">style</span>, + <span class="summary-sig-arg">keep_bang_comments</span>=<span class="summary-sig-default">False</span>)</span><br /> + Minify CSS.</td> + <td align="right" valign="top"> + <span class="codelink"><a href="rcssmin-pysrc.html#cssmin">source code</a></span> + + </td> + </tr> + </table> + + </td> + </tr> +</table> +<!-- ==================== FUNCTION DETAILS ==================== --> +<a name="section-FunctionDetails"></a> +<table class="details" border="1" cellpadding="3" + cellspacing="0" width="100%" bgcolor="white"> +<tr bgcolor="#70b0f0" class="table-header"> + <td align="left" colspan="2" class="table-header"> + <span class="table-header">Function Details</span></td> +</tr> +</table> +<a name="cssmin"></a> +<div> +<table class="details" border="1" cellpadding="3" + cellspacing="0" width="100%" bgcolor="white"> +<tr><td> + <table width="100%" cellpadding="0" cellspacing="0" border="0"> + <tr valign="top"><td> + <h3 class="epydoc"><span class="sig"><span class="sig-name">cssmin</span>(<span class="sig-arg">style</span>, + <span class="sig-arg">keep_bang_comments</span>=<span class="sig-default">False</span>)</span> + </h3> + </td><td align="right" valign="top" + ><span class="codelink"><a href="rcssmin-pysrc.html#cssmin">source code</a></span> + </td> + </tr></table> + + Minify CSS. + <dl class="fields"> + <dt>Parameters:</dt> + <dd><ul class="nomargin-top"> + <li><strong class="pname"><code>style</code></strong> (<tt class="rst-docutils literal">str</tt>) - CSS to minify</li> + <li><strong class="pname"><code>keep_bang_comments</code></strong> (<tt class="rst-docutils literal">bool</tt>) - Keep comments starting with an exclamation mark? (<tt class="rst-docutils literal"><span class="pre">/*!...*/</span></tt>)</li> + </ul></dd> + <dt>Returns: <tt class="rst-docutils literal">str</tt></dt> + <dd>Minified style</dd> + </dl> +</td></tr></table> +</div> +<br /> +<!-- ==================== NAVIGATION BAR ==================== --> +<table class="navbar" border="0" width="100%" cellpadding="0" + bgcolor="#a0c0ff" cellspacing="0"> + <tr valign="middle"> + <!-- Home link --> + <th bgcolor="#70b0f0" class="navbar-select" + > Home </th> + + <!-- Tree link --> + <th> <a + href="module-tree.html">Trees</a> </th> + + <!-- Index link --> + <th> <a + href="identifier-index.html">Indices</a> </th> + + <!-- Help link --> + <th> <a + href="help.html">Help</a> </th> + + <!-- Project homepage --> + <th class="navbar" align="right" width="100%"> + <table border="0" cellpadding="0" cellspacing="0"> + <tr><th class="navbar" align="center" + ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th> + </tr></table></th> + </tr> +</table> + +<script type="text/javascript"> + <!-- + // Private objects are initially displayed (because if + // javascript is turned off then we want them to be + // visible); but by default, we want to hide them. So hide + // them unless we have a cookie that says to show them. + checkCookie(); + // --> +</script> +</body> +</html> diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/module-tree.html b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/module-tree.html new file mode 100644 index 00000000000..e522dd1721b --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/module-tree.html @@ -0,0 +1,94 @@ +<?xml version="1.0" encoding="ascii"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <title>Module Hierarchy</title> + <link rel="stylesheet" href="epydoc.css" type="text/css" /> + <script type="text/javascript" src="epydoc.js"></script> +</head> + +<body bgcolor="white" text="black" link="blue" vlink="#204080" + alink="#204080"> +<!-- ==================== NAVIGATION BAR ==================== --> +<table class="navbar" border="0" width="100%" cellpadding="0" + bgcolor="#a0c0ff" cellspacing="0"> + <tr valign="middle"> + <!-- Home link --> + <th> <a + href="rcssmin-module.html">Home</a> </th> + + <!-- Tree link --> + <th bgcolor="#70b0f0" class="navbar-select" + > Trees </th> + + <!-- Index link --> + <th> <a + href="identifier-index.html">Indices</a> </th> + + <!-- Help link --> + <th> <a + href="help.html">Help</a> </th> + + <!-- Project homepage --> + <th class="navbar" align="right" width="100%"> + <table border="0" cellpadding="0" cellspacing="0"> + <tr><th class="navbar" align="center" + ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th> + </tr></table></th> + </tr> +</table> +<table width="100%" cellpadding="0" cellspacing="0"> + <tr valign="top"> + <td width="100%"> </td> + <td> + <table cellpadding="0" cellspacing="0"> + <!-- hide/show private --> + </table> + </td> + </tr> +</table> +<h1 class="epydoc">Module Hierarchy</h1> +<ul class="nomargin-top"> + <li> <strong class="uidlink"><a href="rcssmin-module.html">rcssmin</a></strong>: <em class="summary">CSS Minifier.</em> </li> +</ul> +<!-- ==================== NAVIGATION BAR ==================== --> +<table class="navbar" border="0" width="100%" cellpadding="0" + bgcolor="#a0c0ff" cellspacing="0"> + <tr valign="middle"> + <!-- Home link --> + <th> <a + href="rcssmin-module.html">Home</a> </th> + + <!-- Tree link --> + <th bgcolor="#70b0f0" class="navbar-select" + > Trees </th> + + <!-- Index link --> + <th> <a + href="identifier-index.html">Indices</a> </th> + + <!-- Help link --> + <th> <a + href="help.html">Help</a> </th> + + <!-- Project homepage --> + <th class="navbar" align="right" width="100%"> + <table border="0" cellpadding="0" cellspacing="0"> + <tr><th class="navbar" align="center" + ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th> + </tr></table></th> + </tr> +</table> + +<script type="text/javascript"> + <!-- + // Private objects are initially displayed (because if + // javascript is turned off then we want them to be + // visible); but by default, we want to hide them. So hide + // them unless we have a cookie that says to show them. + checkCookie(); + // --> +</script> +</body> +</html> diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/rcssmin-module.html b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/rcssmin-module.html new file mode 100644 index 00000000000..84ffddda734 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/rcssmin-module.html @@ -0,0 +1,224 @@ +<?xml version="1.0" encoding="ascii"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <title>rcssmin</title> + <link rel="stylesheet" href="epydoc.css" type="text/css" /> + <script type="text/javascript" src="epydoc.js"></script> +</head> + +<body bgcolor="white" text="black" link="blue" vlink="#204080" + alink="#204080"> +<!-- ==================== NAVIGATION BAR ==================== --> +<table class="navbar" border="0" width="100%" cellpadding="0" + bgcolor="#a0c0ff" cellspacing="0"> + <tr valign="middle"> + <!-- Home link --> + <th bgcolor="#70b0f0" class="navbar-select" + > Home </th> + + <!-- Tree link --> + <th> <a + href="module-tree.html">Trees</a> </th> + + <!-- Index link --> + <th> <a + href="identifier-index.html">Indices</a> </th> + + <!-- Help link --> + <th> <a + href="help.html">Help</a> </th> + + <!-- Project homepage --> + <th class="navbar" align="right" width="100%"> + <table border="0" cellpadding="0" cellspacing="0"> + <tr><th class="navbar" align="center" + ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th> + </tr></table></th> + </tr> +</table> +<table width="100%" cellpadding="0" cellspacing="0"> + <tr valign="top"> + <td width="100%"> + <span class="breadcrumbs"> + Module rcssmin + </span> + </td> + <td> + <table cellpadding="0" cellspacing="0"> + <!-- hide/show private --> + </table> + </td> + </tr> +</table> +<!-- ==================== MODULE DESCRIPTION ==================== --> +<h1 class="epydoc">Module rcssmin</h1><p class="nomargin-top"><span class="codelink"><a href="rcssmin-pysrc.html">source code</a></span></p> +<p>CSS Minifier.</p> +<p>The minifier is based on the semantics of the <a class="rst-reference external" href="https://github.com/yui/yuicompressor/" target="_top">YUI compressor</a>, which +itself is based on <a class="rst-reference external" href="https://github.com/isaacs/cssmin/" target="_top">the rule list by Isaac Schlueter</a>.</p> +<p>This module is a re-implementation aiming for speed instead of maximum +compression, so it can be used at runtime (rather than during a preprocessing +step). RCSSmin does syntactical compression only (removing spaces, comments +and possibly semicolons). It does not provide semantic compression (like +removing empty blocks, collapsing redundant properties etc). It does, however, +support various CSS hacks (by keeping them working as intended).</p> +<p>Here's a feature list:</p> +<ul class="rst-simple"> +<li>Strings are kept, except that escaped newlines are stripped</li> +<li>Space/Comments before the very end or before various characters are +stripped: <tt class="rst-docutils literal"><span class="pre">:{});=>+],!</span></tt> (The colon (<tt class="rst-docutils literal">:</tt>) is a special case, a single +space is kept if it's outside a ruleset.)</li> +<li>Space/Comments at the very beginning or after various characters are +stripped: <tt class="rst-docutils literal"><span class="pre">{}(=:>+[,!</span></tt></li> +<li>Optional space after unicode escapes is kept, resp. replaced by a simple +space</li> +<li>whitespaces inside <tt class="rst-docutils literal">url()</tt> definitions are stripped</li> +<li>Comments starting with an exclamation mark (<tt class="rst-docutils literal">!</tt>) can be kept optionally.</li> +<li>All other comments and/or whitespace characters are replaced by a single +space.</li> +<li>Multiple consecutive semicolons are reduced to one</li> +<li>The last semicolon within a ruleset is stripped</li> +<li>CSS Hacks supported:<ul> +<li>IE7 hack (<tt class="rst-docutils literal"><span class="pre">>/**/</span></tt>)</li> +<li>Mac-IE5 hack (<tt class="rst-docutils literal"><span class="pre">/*\*/.../**/</span></tt>)</li> +<li>The boxmodelhack is supported naturally because it relies on valid CSS2 +strings</li> +<li>Between <tt class="rst-docutils literal"><span class="pre">:first-line</span></tt> and the following comma or curly brace a space is +inserted. (apparently it's needed for IE6)</li> +<li>Same for <tt class="rst-docutils literal"><span class="pre">:first-letter</span></tt></li> +</ul> +</li> +</ul> +<p>rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to +factor 100 or so (depending on the input). docs/BENCHMARKS in the source +distribution contains the details.</p> +<p>Both python 2 (>= 2.4) and python 3 are supported.</p> + +<hr /> +<div class="fields"> <p><strong>Copyright:</strong> + Copyright 2011 - 2014 +André Malo or his licensors, as applicable + </p> + <p><strong>License:</strong> + <p>Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at</p> +<blockquote> +<a class="rst-reference external" href="http://www.apache.org/licenses/LICENSE-2.0" target="_top">http://www.apache.org/licenses/LICENSE-2.0</a></blockquote> +<p>Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.</p> + </p> + <p><strong>Version:</strong> + 1.0.5 + </p> + <p><strong>Author:</strong> + André Malo + </p> +</div><!-- ==================== FUNCTIONS ==================== --> +<a name="section-Functions"></a> +<table class="summary" border="1" cellpadding="3" + cellspacing="0" width="100%" bgcolor="white"> +<tr bgcolor="#70b0f0" class="table-header"> + <td align="left" colspan="2" class="table-header"> + <span class="table-header">Functions</span></td> +</tr> +<tr> + <td width="15%" align="right" valign="top" class="summary"> + <span class="summary-type"><tt class="rst-docutils literal">str</tt></span> + </td><td class="summary"> + <table width="100%" cellpadding="0" cellspacing="0" border="0"> + <tr> + <td><span class="summary-sig"><a href="rcssmin-module.html#cssmin" class="summary-sig-name">cssmin</a>(<span class="summary-sig-arg">style</span>, + <span class="summary-sig-arg">keep_bang_comments</span>=<span class="summary-sig-default">False</span>)</span><br /> + Minify CSS.</td> + <td align="right" valign="top"> + <span class="codelink"><a href="rcssmin-pysrc.html#cssmin">source code</a></span> + + </td> + </tr> + </table> + + </td> + </tr> +</table> +<!-- ==================== FUNCTION DETAILS ==================== --> +<a name="section-FunctionDetails"></a> +<table class="details" border="1" cellpadding="3" + cellspacing="0" width="100%" bgcolor="white"> +<tr bgcolor="#70b0f0" class="table-header"> + <td align="left" colspan="2" class="table-header"> + <span class="table-header">Function Details</span></td> +</tr> +</table> +<a name="cssmin"></a> +<div> +<table class="details" border="1" cellpadding="3" + cellspacing="0" width="100%" bgcolor="white"> +<tr><td> + <table width="100%" cellpadding="0" cellspacing="0" border="0"> + <tr valign="top"><td> + <h3 class="epydoc"><span class="sig"><span class="sig-name">cssmin</span>(<span class="sig-arg">style</span>, + <span class="sig-arg">keep_bang_comments</span>=<span class="sig-default">False</span>)</span> + </h3> + </td><td align="right" valign="top" + ><span class="codelink"><a href="rcssmin-pysrc.html#cssmin">source code</a></span> + </td> + </tr></table> + + Minify CSS. + <dl class="fields"> + <dt>Parameters:</dt> + <dd><ul class="nomargin-top"> + <li><strong class="pname"><code>style</code></strong> (<tt class="rst-docutils literal">str</tt>) - CSS to minify</li> + <li><strong class="pname"><code>keep_bang_comments</code></strong> (<tt class="rst-docutils literal">bool</tt>) - Keep comments starting with an exclamation mark? (<tt class="rst-docutils literal"><span class="pre">/*!...*/</span></tt>)</li> + </ul></dd> + <dt>Returns: <tt class="rst-docutils literal">str</tt></dt> + <dd>Minified style</dd> + </dl> +</td></tr></table> +</div> +<br /> +<!-- ==================== NAVIGATION BAR ==================== --> +<table class="navbar" border="0" width="100%" cellpadding="0" + bgcolor="#a0c0ff" cellspacing="0"> + <tr valign="middle"> + <!-- Home link --> + <th bgcolor="#70b0f0" class="navbar-select" + > Home </th> + + <!-- Tree link --> + <th> <a + href="module-tree.html">Trees</a> </th> + + <!-- Index link --> + <th> <a + href="identifier-index.html">Indices</a> </th> + + <!-- Help link --> + <th> <a + href="help.html">Help</a> </th> + + <!-- Project homepage --> + <th class="navbar" align="right" width="100%"> + <table border="0" cellpadding="0" cellspacing="0"> + <tr><th class="navbar" align="center" + ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th> + </tr></table></th> + </tr> +</table> + +<script type="text/javascript"> + <!-- + // Private objects are initially displayed (because if + // javascript is turned off then we want them to be + // visible); but by default, we want to hide them. So hide + // them unless we have a cookie that says to show them. + checkCookie(); + // --> +</script> +</body> +</html> diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/rcssmin-pysrc.html b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/rcssmin-pysrc.html new file mode 100644 index 00000000000..6856baca0e6 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/rcssmin-pysrc.html @@ -0,0 +1,477 @@ +<?xml version="1.0" encoding="ascii"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <title>rcssmin</title> + <link rel="stylesheet" href="epydoc.css" type="text/css" /> + <script type="text/javascript" src="epydoc.js"></script> +</head> + +<body bgcolor="white" text="black" link="blue" vlink="#204080" + alink="#204080"> +<!-- ==================== NAVIGATION BAR ==================== --> +<table class="navbar" border="0" width="100%" cellpadding="0" + bgcolor="#a0c0ff" cellspacing="0"> + <tr valign="middle"> + <!-- Home link --> + <th bgcolor="#70b0f0" class="navbar-select" + > Home </th> + + <!-- Tree link --> + <th> <a + href="module-tree.html">Trees</a> </th> + + <!-- Index link --> + <th> <a + href="identifier-index.html">Indices</a> </th> + + <!-- Help link --> + <th> <a + href="help.html">Help</a> </th> + + <!-- Project homepage --> + <th class="navbar" align="right" width="100%"> + <table border="0" cellpadding="0" cellspacing="0"> + <tr><th class="navbar" align="center" + ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th> + </tr></table></th> + </tr> +</table> +<table width="100%" cellpadding="0" cellspacing="0"> + <tr valign="top"> + <td width="100%"> + <span class="breadcrumbs"> + Module rcssmin + </span> + </td> + <td> + <table cellpadding="0" cellspacing="0"> + <!-- hide/show private --> + </table> + </td> + </tr> +</table> +<h1 class="epydoc">Source Code for <a href="rcssmin-module.html">Module rcssmin</a></h1> +<pre class="py-src"> +<a name="L1"></a><tt class="py-lineno"> 1</tt> <tt class="py-line"><tt class="py-comment">#!/usr/bin/env python</tt> </tt> +<a name="L2"></a><tt class="py-lineno"> 2</tt> <tt class="py-line"><tt class="py-comment"># -*- coding: ascii -*-</tt> </tt> +<a name="L3"></a><tt class="py-lineno"> 3</tt> <tt class="py-line"><tt class="py-docstring">r"""</tt> </tt> +<a name="L4"></a><tt class="py-lineno"> 4</tt> <tt class="py-line"><tt class="py-docstring">==============</tt> </tt> +<a name="L5"></a><tt class="py-lineno"> 5</tt> <tt class="py-line"><tt class="py-docstring"> CSS Minifier</tt> </tt> +<a name="L6"></a><tt class="py-lineno"> 6</tt> <tt class="py-line"><tt class="py-docstring">==============</tt> </tt> +<a name="L7"></a><tt class="py-lineno"> 7</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt> +<a name="L8"></a><tt class="py-lineno"> 8</tt> <tt class="py-line"><tt class="py-docstring">CSS Minifier.</tt> </tt> +<a name="L9"></a><tt class="py-lineno"> 9</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt> +<a name="L10"></a><tt class="py-lineno"> 10</tt> <tt class="py-line"><tt class="py-docstring">The minifier is based on the semantics of the `YUI compressor`_\\, which</tt> </tt> +<a name="L11"></a><tt class="py-lineno"> 11</tt> <tt class="py-line"><tt class="py-docstring">itself is based on `the rule list by Isaac Schlueter`_\\.</tt> </tt> +<a name="L12"></a><tt class="py-lineno"> 12</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt> +<a name="L13"></a><tt class="py-lineno"> 13</tt> <tt class="py-line"><tt class="py-docstring">:Copyright:</tt> </tt> +<a name="L14"></a><tt class="py-lineno"> 14</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt> +<a name="L15"></a><tt class="py-lineno"> 15</tt> <tt class="py-line"><tt class="py-docstring"> Copyright 2011 - 2014</tt> </tt> +<a name="L16"></a><tt class="py-lineno"> 16</tt> <tt class="py-line"><tt class="py-docstring"> Andr\xe9 Malo or his licensors, as applicable</tt> </tt> +<a name="L17"></a><tt class="py-lineno"> 17</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt> +<a name="L18"></a><tt class="py-lineno"> 18</tt> <tt class="py-line"><tt class="py-docstring">:License:</tt> </tt> +<a name="L19"></a><tt class="py-lineno"> 19</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt> +<a name="L20"></a><tt class="py-lineno"> 20</tt> <tt class="py-line"><tt class="py-docstring"> Licensed under the Apache License, Version 2.0 (the "License");</tt> </tt> +<a name="L21"></a><tt class="py-lineno"> 21</tt> <tt class="py-line"><tt class="py-docstring"> you may not use this file except in compliance with the License.</tt> </tt> +<a name="L22"></a><tt class="py-lineno"> 22</tt> <tt class="py-line"><tt class="py-docstring"> You may obtain a copy of the License at</tt> </tt> +<a name="L23"></a><tt class="py-lineno"> 23</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt> +<a name="L24"></a><tt class="py-lineno"> 24</tt> <tt class="py-line"><tt class="py-docstring"> http://www.apache.org/licenses/LICENSE-2.0</tt> </tt> +<a name="L25"></a><tt class="py-lineno"> 25</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt> +<a name="L26"></a><tt class="py-lineno"> 26</tt> <tt class="py-line"><tt class="py-docstring"> Unless required by applicable law or agreed to in writing, software</tt> </tt> +<a name="L27"></a><tt class="py-lineno"> 27</tt> <tt class="py-line"><tt class="py-docstring"> distributed under the License is distributed on an "AS IS" BASIS,</tt> </tt> +<a name="L28"></a><tt class="py-lineno"> 28</tt> <tt class="py-line"><tt class="py-docstring"> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</tt> </tt> +<a name="L29"></a><tt class="py-lineno"> 29</tt> <tt class="py-line"><tt class="py-docstring"> See the License for the specific language governing permissions and</tt> </tt> +<a name="L30"></a><tt class="py-lineno"> 30</tt> <tt class="py-line"><tt class="py-docstring"> limitations under the License.</tt> </tt> +<a name="L31"></a><tt class="py-lineno"> 31</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt> +<a name="L32"></a><tt class="py-lineno"> 32</tt> <tt class="py-line"><tt class="py-docstring">This module is a re-implementation aiming for speed instead of maximum</tt> </tt> +<a name="L33"></a><tt class="py-lineno"> 33</tt> <tt class="py-line"><tt class="py-docstring">compression, so it can be used at runtime (rather than during a preprocessing</tt> </tt> +<a name="L34"></a><tt class="py-lineno"> 34</tt> <tt class="py-line"><tt class="py-docstring">step). RCSSmin does syntactical compression only (removing spaces, comments</tt> </tt> +<a name="L35"></a><tt class="py-lineno"> 35</tt> <tt class="py-line"><tt class="py-docstring">and possibly semicolons). It does not provide semantic compression (like</tt> </tt> +<a name="L36"></a><tt class="py-lineno"> 36</tt> <tt class="py-line"><tt class="py-docstring">removing empty blocks, collapsing redundant properties etc). It does, however,</tt> </tt> +<a name="L37"></a><tt class="py-lineno"> 37</tt> <tt class="py-line"><tt class="py-docstring">support various CSS hacks (by keeping them working as intended).</tt> </tt> +<a name="L38"></a><tt class="py-lineno"> 38</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt> +<a name="L39"></a><tt class="py-lineno"> 39</tt> <tt class="py-line"><tt class="py-docstring">Here's a feature list:</tt> </tt> +<a name="L40"></a><tt class="py-lineno"> 40</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt> +<a name="L41"></a><tt class="py-lineno"> 41</tt> <tt class="py-line"><tt class="py-docstring">- Strings are kept, except that escaped newlines are stripped</tt> </tt> +<a name="L42"></a><tt class="py-lineno"> 42</tt> <tt class="py-line"><tt class="py-docstring">- Space/Comments before the very end or before various characters are</tt> </tt> +<a name="L43"></a><tt class="py-lineno"> 43</tt> <tt class="py-line"><tt class="py-docstring"> stripped: ``:{});=>+],!`` (The colon (``:``) is a special case, a single</tt> </tt> +<a name="L44"></a><tt class="py-lineno"> 44</tt> <tt class="py-line"><tt class="py-docstring"> space is kept if it's outside a ruleset.)</tt> </tt> +<a name="L45"></a><tt class="py-lineno"> 45</tt> <tt class="py-line"><tt class="py-docstring">- Space/Comments at the very beginning or after various characters are</tt> </tt> +<a name="L46"></a><tt class="py-lineno"> 46</tt> <tt class="py-line"><tt class="py-docstring"> stripped: ``{}(=:>+[,!``</tt> </tt> +<a name="L47"></a><tt class="py-lineno"> 47</tt> <tt class="py-line"><tt class="py-docstring">- Optional space after unicode escapes is kept, resp. replaced by a simple</tt> </tt> +<a name="L48"></a><tt class="py-lineno"> 48</tt> <tt class="py-line"><tt class="py-docstring"> space</tt> </tt> +<a name="L49"></a><tt class="py-lineno"> 49</tt> <tt class="py-line"><tt class="py-docstring">- whitespaces inside ``url()`` definitions are stripped</tt> </tt> +<a name="L50"></a><tt class="py-lineno"> 50</tt> <tt class="py-line"><tt class="py-docstring">- Comments starting with an exclamation mark (``!``) can be kept optionally.</tt> </tt> +<a name="L51"></a><tt class="py-lineno"> 51</tt> <tt class="py-line"><tt class="py-docstring">- All other comments and/or whitespace characters are replaced by a single</tt> </tt> +<a name="L52"></a><tt class="py-lineno"> 52</tt> <tt class="py-line"><tt class="py-docstring"> space.</tt> </tt> +<a name="L53"></a><tt class="py-lineno"> 53</tt> <tt class="py-line"><tt class="py-docstring">- Multiple consecutive semicolons are reduced to one</tt> </tt> +<a name="L54"></a><tt class="py-lineno"> 54</tt> <tt class="py-line"><tt class="py-docstring">- The last semicolon within a ruleset is stripped</tt> </tt> +<a name="L55"></a><tt class="py-lineno"> 55</tt> <tt class="py-line"><tt class="py-docstring">- CSS Hacks supported:</tt> </tt> +<a name="L56"></a><tt class="py-lineno"> 56</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt> +<a name="L57"></a><tt class="py-lineno"> 57</tt> <tt class="py-line"><tt class="py-docstring"> - IE7 hack (``>/**/``)</tt> </tt> +<a name="L58"></a><tt class="py-lineno"> 58</tt> <tt class="py-line"><tt class="py-docstring"> - Mac-IE5 hack (``/*\\*/.../**/``)</tt> </tt> +<a name="L59"></a><tt class="py-lineno"> 59</tt> <tt class="py-line"><tt class="py-docstring"> - The boxmodelhack is supported naturally because it relies on valid CSS2</tt> </tt> +<a name="L60"></a><tt class="py-lineno"> 60</tt> <tt class="py-line"><tt class="py-docstring"> strings</tt> </tt> +<a name="L61"></a><tt class="py-lineno"> 61</tt> <tt class="py-line"><tt class="py-docstring"> - Between ``:first-line`` and the following comma or curly brace a space is</tt> </tt> +<a name="L62"></a><tt class="py-lineno"> 62</tt> <tt class="py-line"><tt class="py-docstring"> inserted. (apparently it's needed for IE6)</tt> </tt> +<a name="L63"></a><tt class="py-lineno"> 63</tt> <tt class="py-line"><tt class="py-docstring"> - Same for ``:first-letter``</tt> </tt> +<a name="L64"></a><tt class="py-lineno"> 64</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt> +<a name="L65"></a><tt class="py-lineno"> 65</tt> <tt class="py-line"><tt class="py-docstring">rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to</tt> </tt> +<a name="L66"></a><tt class="py-lineno"> 66</tt> <tt class="py-line"><tt class="py-docstring">factor 100 or so (depending on the input). docs/BENCHMARKS in the source</tt> </tt> +<a name="L67"></a><tt class="py-lineno"> 67</tt> <tt class="py-line"><tt class="py-docstring">distribution contains the details.</tt> </tt> +<a name="L68"></a><tt class="py-lineno"> 68</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt> +<a name="L69"></a><tt class="py-lineno"> 69</tt> <tt class="py-line"><tt class="py-docstring">Both python 2 (>= 2.4) and python 3 are supported.</tt> </tt> +<a name="L70"></a><tt class="py-lineno"> 70</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt> +<a name="L71"></a><tt class="py-lineno"> 71</tt> <tt class="py-line"><tt class="py-docstring">.. _YUI compressor: https://github.com/yui/yuicompressor/</tt> </tt> +<a name="L72"></a><tt class="py-lineno"> 72</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt> +<a name="L73"></a><tt class="py-lineno"> 73</tt> <tt class="py-line"><tt class="py-docstring">.. _the rule list by Isaac Schlueter: https://github.com/isaacs/cssmin/</tt> </tt> +<a name="L74"></a><tt class="py-lineno"> 74</tt> <tt class="py-line"><tt class="py-docstring">"""</tt> </tt> +<a name="L75"></a><tt class="py-lineno"> 75</tt> <tt class="py-line"><tt class="py-keyword">if</tt> <tt id="link-0" class="py-name" targets="Variable rcssmin.__doc__=rcssmin-module.html#__doc__"><a title="rcssmin.__doc__" class="py-name" href="#" onclick="return doclink('link-0', '__doc__', 'link-0');">__doc__</a></tt><tt class="py-op">:</tt> </tt> +<a name="L76"></a><tt class="py-lineno"> 76</tt> <tt class="py-line"> <tt class="py-comment"># pylint: disable = W0622</tt> </tt> +<a name="L77"></a><tt class="py-lineno"> 77</tt> <tt class="py-line"> <tt id="link-1" class="py-name"><a title="rcssmin.__doc__" class="py-name" href="#" onclick="return doclink('link-1', '__doc__', 'link-0');">__doc__</a></tt> <tt class="py-op">=</tt> <tt id="link-2" class="py-name"><a title="rcssmin.__doc__" class="py-name" href="#" onclick="return doclink('link-2', '__doc__', 'link-0');">__doc__</a></tt><tt class="py-op">.</tt><tt class="py-name">encode</tt><tt class="py-op">(</tt><tt class="py-string">'ascii'</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">decode</tt><tt class="py-op">(</tt><tt class="py-string">'unicode_escape'</tt><tt class="py-op">)</tt> </tt> +<a name="L78"></a><tt class="py-lineno"> 78</tt> <tt class="py-line"><tt class="py-name">__author__</tt> <tt class="py-op">=</tt> <tt class="py-string">r"Andr\xe9 Malo"</tt><tt class="py-op">.</tt><tt class="py-name">encode</tt><tt class="py-op">(</tt><tt class="py-string">'ascii'</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">decode</tt><tt class="py-op">(</tt><tt class="py-string">'unicode_escape'</tt><tt class="py-op">)</tt> </tt> +<a name="L79"></a><tt class="py-lineno"> 79</tt> <tt class="py-line"><tt class="py-name">__docformat__</tt> <tt class="py-op">=</tt> <tt class="py-string">"restructuredtext en"</tt> </tt> +<a name="L80"></a><tt class="py-lineno"> 80</tt> <tt class="py-line"><tt id="link-3" class="py-name" targets="Variable rcssmin.__license__=rcssmin-module.html#__license__"><a title="rcssmin.__license__" class="py-name" href="#" onclick="return doclink('link-3', '__license__', 'link-3');">__license__</a></tt> <tt class="py-op">=</tt> <tt class="py-string">"Apache License, Version 2.0"</tt> </tt> +<a name="L81"></a><tt class="py-lineno"> 81</tt> <tt class="py-line"><tt class="py-name">__version__</tt> <tt class="py-op">=</tt> <tt class="py-string">'1.0.5'</tt> </tt> +<a name="L82"></a><tt class="py-lineno"> 82</tt> <tt class="py-line"><tt class="py-name">__all__</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-string">'cssmin'</tt><tt class="py-op">]</tt> </tt> +<a name="L83"></a><tt class="py-lineno"> 83</tt> <tt class="py-line"> </tt> +<a name="L84"></a><tt class="py-lineno"> 84</tt> <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">re</tt> <tt class="py-keyword">as</tt> <tt class="py-name">_re</tt> </tt> +<a name="L85"></a><tt class="py-lineno"> 85</tt> <tt class="py-line"> </tt> +<a name="L86"></a><tt class="py-lineno"> 86</tt> <tt class="py-line"> </tt> +<a name="_make_cssmin"></a><div id="_make_cssmin-def"><a name="L87"></a><tt class="py-lineno"> 87</tt> <a class="py-toggle" href="#" id="_make_cssmin-toggle" onclick="return toggle('_make_cssmin');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="rcssmin-module.html#_make_cssmin">_make_cssmin</a><tt class="py-op">(</tt><tt class="py-param">python_only</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt> +</div><div id="_make_cssmin-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="_make_cssmin-expanded"><a name="L88"></a><tt class="py-lineno"> 88</tt> <tt class="py-line"> <tt class="py-docstring">"""</tt> </tt> +<a name="L89"></a><tt class="py-lineno"> 89</tt> <tt class="py-line"><tt class="py-docstring"> Generate CSS minifier.</tt> </tt> +<a name="L90"></a><tt class="py-lineno"> 90</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt> +<a name="L91"></a><tt class="py-lineno"> 91</tt> <tt class="py-line"><tt class="py-docstring"> :Parameters:</tt> </tt> +<a name="L92"></a><tt class="py-lineno"> 92</tt> <tt class="py-line"><tt class="py-docstring"> `python_only` : ``bool``</tt> </tt> +<a name="L93"></a><tt class="py-lineno"> 93</tt> <tt class="py-line"><tt class="py-docstring"> Use only the python variant. If true, the c extension is not even</tt> </tt> +<a name="L94"></a><tt class="py-lineno"> 94</tt> <tt class="py-line"><tt class="py-docstring"> tried to be loaded.</tt> </tt> +<a name="L95"></a><tt class="py-lineno"> 95</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt> +<a name="L96"></a><tt class="py-lineno"> 96</tt> <tt class="py-line"><tt class="py-docstring"> :Return: Minifier</tt> </tt> +<a name="L97"></a><tt class="py-lineno"> 97</tt> <tt class="py-line"><tt class="py-docstring"> :Rtype: ``callable``</tt> </tt> +<a name="L98"></a><tt class="py-lineno"> 98</tt> <tt class="py-line"><tt class="py-docstring"> """</tt> </tt> +<a name="L99"></a><tt class="py-lineno"> 99</tt> <tt class="py-line"> <tt class="py-comment"># pylint: disable = R0912, R0914, W0612</tt> </tt> +<a name="L100"></a><tt class="py-lineno">100</tt> <tt class="py-line"> </tt> +<a name="L101"></a><tt class="py-lineno">101</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">python_only</tt><tt class="py-op">:</tt> </tt> +<a name="L102"></a><tt class="py-lineno">102</tt> <tt class="py-line"> <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt> +<a name="L103"></a><tt class="py-lineno">103</tt> <tt class="py-line"> <tt class="py-keyword">import</tt> <tt class="py-name">_rcssmin</tt> </tt> +<a name="L104"></a><tt class="py-lineno">104</tt> <tt class="py-line"> <tt class="py-keyword">except</tt> <tt class="py-name">ImportError</tt><tt class="py-op">:</tt> </tt> +<a name="L105"></a><tt class="py-lineno">105</tt> <tt class="py-line"> <tt class="py-keyword">pass</tt> </tt> +<a name="L106"></a><tt class="py-lineno">106</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt> +<a name="L107"></a><tt class="py-lineno">107</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">_rcssmin</tt><tt class="py-op">.</tt><tt id="link-4" class="py-name" targets="Function rcssmin.cssmin()=rcssmin-module.html#cssmin"><a title="rcssmin.cssmin" class="py-name" href="#" onclick="return doclink('link-4', 'cssmin', 'link-4');">cssmin</a></tt> </tt> +<a name="L108"></a><tt class="py-lineno">108</tt> <tt class="py-line"> </tt> +<a name="L109"></a><tt class="py-lineno">109</tt> <tt class="py-line"> <tt class="py-name">nl</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:[\n\f]|\r\n?)'</tt> <tt class="py-comment"># pylint: disable = C0103</tt> </tt> +<a name="L110"></a><tt class="py-lineno">110</tt> <tt class="py-line"> <tt class="py-name">spacechar</tt> <tt class="py-op">=</tt> <tt class="py-string">r'[\r\n\f\040\t]'</tt> </tt> +<a name="L111"></a><tt class="py-lineno">111</tt> <tt class="py-line"> </tt> +<a name="L112"></a><tt class="py-lineno">112</tt> <tt class="py-line"> <tt class="py-name">unicoded</tt> <tt class="py-op">=</tt> <tt class="py-string">r'[0-9a-fA-F]{1,6}(?:[\040\n\t\f]|\r\n?)?'</tt> </tt> +<a name="L113"></a><tt class="py-lineno">113</tt> <tt class="py-line"> <tt class="py-name">escaped</tt> <tt class="py-op">=</tt> <tt class="py-string">r'[^\n\r\f0-9a-fA-F]'</tt> </tt> +<a name="L114"></a><tt class="py-lineno">114</tt> <tt class="py-line"> <tt class="py-name">escape</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:\\(?:%(unicoded)s|%(escaped)s))'</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt> +<a name="L115"></a><tt class="py-lineno">115</tt> <tt class="py-line"> </tt> +<a name="L116"></a><tt class="py-lineno">116</tt> <tt class="py-line"> <tt class="py-name">nmchar</tt> <tt class="py-op">=</tt> <tt class="py-string">r'[^\000-\054\056\057\072-\100\133-\136\140\173-\177]'</tt> </tt> +<a name="L117"></a><tt class="py-lineno">117</tt> <tt class="py-line"> <tt class="py-comment">#nmstart = r'[^\000-\100\133-\136\140\173-\177]'</tt> </tt> +<a name="L118"></a><tt class="py-lineno">118</tt> <tt class="py-line"> <tt class="py-comment">#ident = (r'(?:'</tt> </tt> +<a name="L119"></a><tt class="py-lineno">119</tt> <tt class="py-line"> <tt class="py-comment"># r'-?(?:%(nmstart)s|%(escape)s)%(nmchar)s*(?:%(escape)s%(nmchar)s*)*'</tt> </tt> +<a name="L120"></a><tt class="py-lineno">120</tt> <tt class="py-line"> <tt class="py-comment">#r')') % locals()</tt> </tt> +<a name="L121"></a><tt class="py-lineno">121</tt> <tt class="py-line"> </tt> +<a name="L122"></a><tt class="py-lineno">122</tt> <tt class="py-line"> <tt class="py-name">comment</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)'</tt> </tt> +<a name="L123"></a><tt class="py-lineno">123</tt> <tt class="py-line"> </tt> +<a name="L124"></a><tt class="py-lineno">124</tt> <tt class="py-line"> <tt class="py-comment"># only for specific purposes. The bang is grouped:</tt> </tt> +<a name="L125"></a><tt class="py-lineno">125</tt> <tt class="py-line"> <tt class="py-name">_bang_comment</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:/\*(!?)[^*]*\*+(?:[^/*][^*]*\*+)*/)'</tt> </tt> +<a name="L126"></a><tt class="py-lineno">126</tt> <tt class="py-line"> </tt> +<a name="L127"></a><tt class="py-lineno">127</tt> <tt class="py-line"> <tt class="py-name">string1</tt> <tt class="py-op">=</tt> \ </tt> +<a name="L128"></a><tt class="py-lineno">128</tt> <tt class="py-line"> <tt class="py-string">r'(?:\047[^\047\\\r\n\f]*(?:\\[^\r\n\f][^\047\\\r\n\f]*)*\047)'</tt> </tt> +<a name="L129"></a><tt class="py-lineno">129</tt> <tt class="py-line"> <tt class="py-name">string2</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:"[^"\\\r\n\f]*(?:\\[^\r\n\f][^"\\\r\n\f]*)*")'</tt> </tt> +<a name="L130"></a><tt class="py-lineno">130</tt> <tt class="py-line"> <tt class="py-name">strings</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:%s|%s)'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">string1</tt><tt class="py-op">,</tt> <tt class="py-name">string2</tt><tt class="py-op">)</tt> </tt> +<a name="L131"></a><tt class="py-lineno">131</tt> <tt class="py-line"> </tt> +<a name="L132"></a><tt class="py-lineno">132</tt> <tt class="py-line"> <tt class="py-name">nl_string1</tt> <tt class="py-op">=</tt> \ </tt> +<a name="L133"></a><tt class="py-lineno">133</tt> <tt class="py-line"> <tt class="py-string">r'(?:\047[^\047\\\r\n\f]*(?:\\(?:[^\r]|\r\n?)[^\047\\\r\n\f]*)*\047)'</tt> </tt> +<a name="L134"></a><tt class="py-lineno">134</tt> <tt class="py-line"> <tt class="py-name">nl_string2</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:"[^"\\\r\n\f]*(?:\\(?:[^\r]|\r\n?)[^"\\\r\n\f]*)*")'</tt> </tt> +<a name="L135"></a><tt class="py-lineno">135</tt> <tt class="py-line"> <tt class="py-name">nl_strings</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:%s|%s)'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">nl_string1</tt><tt class="py-op">,</tt> <tt class="py-name">nl_string2</tt><tt class="py-op">)</tt> </tt> +<a name="L136"></a><tt class="py-lineno">136</tt> <tt class="py-line"> </tt> +<a name="L137"></a><tt class="py-lineno">137</tt> <tt class="py-line"> <tt class="py-name">uri_nl_string1</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:\047[^\047\\]*(?:\\(?:[^\r]|\r\n?)[^\047\\]*)*\047)'</tt> </tt> +<a name="L138"></a><tt class="py-lineno">138</tt> <tt class="py-line"> <tt class="py-name">uri_nl_string2</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:"[^"\\]*(?:\\(?:[^\r]|\r\n?)[^"\\]*)*")'</tt> </tt> +<a name="L139"></a><tt class="py-lineno">139</tt> <tt class="py-line"> <tt class="py-name">uri_nl_strings</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:%s|%s)'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">uri_nl_string1</tt><tt class="py-op">,</tt> <tt class="py-name">uri_nl_string2</tt><tt class="py-op">)</tt> </tt> +<a name="L140"></a><tt class="py-lineno">140</tt> <tt class="py-line"> </tt> +<a name="L141"></a><tt class="py-lineno">141</tt> <tt class="py-line"> <tt class="py-name">nl_escaped</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:\\%(nl)s)'</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt> +<a name="L142"></a><tt class="py-lineno">142</tt> <tt class="py-line"> </tt> +<a name="L143"></a><tt class="py-lineno">143</tt> <tt class="py-line"> <tt class="py-name">space</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:%(spacechar)s|%(comment)s)'</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt> +<a name="L144"></a><tt class="py-lineno">144</tt> <tt class="py-line"> </tt> +<a name="L145"></a><tt class="py-lineno">145</tt> <tt class="py-line"> <tt class="py-name">ie7hack</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:>/\*\*/)'</tt> </tt> +<a name="L146"></a><tt class="py-lineno">146</tt> <tt class="py-line"> </tt> +<a name="L147"></a><tt class="py-lineno">147</tt> <tt class="py-line"> <tt class="py-name">uri</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt><tt class="py-string">r'(?:'</tt> </tt> +<a name="L148"></a><tt class="py-lineno">148</tt> <tt class="py-line"> <tt class="py-comment"># noqa pylint: disable = C0330</tt> </tt> +<a name="L149"></a><tt class="py-lineno">149</tt> <tt class="py-line"> <tt class="py-string">r'(?:[^\000-\040"\047()\\\177]*'</tt> </tt> +<a name="L150"></a><tt class="py-lineno">150</tt> <tt class="py-line"> <tt class="py-string">r'(?:%(escape)s[^\000-\040"\047()\\\177]*)*)'</tt> </tt> +<a name="L151"></a><tt class="py-lineno">151</tt> <tt class="py-line"> <tt class="py-string">r'(?:'</tt> </tt> +<a name="L152"></a><tt class="py-lineno">152</tt> <tt class="py-line"> <tt class="py-string">r'(?:%(spacechar)s+|%(nl_escaped)s+)'</tt> </tt> +<a name="L153"></a><tt class="py-lineno">153</tt> <tt class="py-line"> <tt class="py-string">r'(?:'</tt> </tt> +<a name="L154"></a><tt class="py-lineno">154</tt> <tt class="py-line"> <tt class="py-string">r'(?:[^\000-\040"\047()\\\177]|%(escape)s|%(nl_escaped)s)'</tt> </tt> +<a name="L155"></a><tt class="py-lineno">155</tt> <tt class="py-line"> <tt class="py-string">r'[^\000-\040"\047()\\\177]*'</tt> </tt> +<a name="L156"></a><tt class="py-lineno">156</tt> <tt class="py-line"> <tt class="py-string">r'(?:%(escape)s[^\000-\040"\047()\\\177]*)*'</tt> </tt> +<a name="L157"></a><tt class="py-lineno">157</tt> <tt class="py-line"> <tt class="py-string">r')+'</tt> </tt> +<a name="L158"></a><tt class="py-lineno">158</tt> <tt class="py-line"> <tt class="py-string">r')*'</tt> </tt> +<a name="L159"></a><tt class="py-lineno">159</tt> <tt class="py-line"> <tt class="py-string">r')'</tt><tt class="py-op">)</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt> +<a name="L160"></a><tt class="py-lineno">160</tt> <tt class="py-line"> </tt> +<a name="L161"></a><tt class="py-lineno">161</tt> <tt class="py-line"> <tt class="py-name">nl_unesc_sub</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-name">nl_escaped</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt> +<a name="L162"></a><tt class="py-lineno">162</tt> <tt class="py-line"> </tt> +<a name="L163"></a><tt class="py-lineno">163</tt> <tt class="py-line"> <tt class="py-name">uri_space_sub</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-op">(</tt> </tt> +<a name="L164"></a><tt class="py-lineno">164</tt> <tt class="py-line"> <tt class="py-string">r'(%(escape)s+)|%(spacechar)s+|%(nl_escaped)s+'</tt> </tt> +<a name="L165"></a><tt class="py-lineno">165</tt> <tt class="py-line"> <tt class="py-op">)</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt> +<a name="L166"></a><tt class="py-lineno">166</tt> <tt class="py-line"> <tt class="py-name">uri_space_subber</tt> <tt class="py-op">=</tt> <tt class="py-keyword">lambda</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">groups</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> <tt class="py-string">''</tt> </tt> +<a name="L167"></a><tt class="py-lineno">167</tt> <tt class="py-line"> </tt> +<a name="L168"></a><tt class="py-lineno">168</tt> <tt class="py-line"> <tt class="py-name">space_sub_simple</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-op">(</tt> </tt> +<a name="L169"></a><tt class="py-lineno">169</tt> <tt class="py-line"> <tt class="py-string">r'[\r\n\f\040\t;]+|(%(comment)s+)'</tt> </tt> +<a name="L170"></a><tt class="py-lineno">170</tt> <tt class="py-line"> <tt class="py-op">)</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt> +<a name="L171"></a><tt class="py-lineno">171</tt> <tt class="py-line"> <tt class="py-name">space_sub_banged</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-op">(</tt> </tt> +<a name="L172"></a><tt class="py-lineno">172</tt> <tt class="py-line"> <tt class="py-string">r'[\r\n\f\040\t;]+|(%(_bang_comment)s+)'</tt> </tt> +<a name="L173"></a><tt class="py-lineno">173</tt> <tt class="py-line"> <tt class="py-op">)</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt> +<a name="L174"></a><tt class="py-lineno">174</tt> <tt class="py-line"> </tt> +<a name="L175"></a><tt class="py-lineno">175</tt> <tt class="py-line"> <tt class="py-name">post_esc_sub</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">r'[\r\n\f\t]+'</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt> +<a name="L176"></a><tt class="py-lineno">176</tt> <tt class="py-line"> </tt> +<a name="L177"></a><tt class="py-lineno">177</tt> <tt class="py-line"> <tt class="py-name">main_sub</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-op">(</tt> </tt> +<a name="L178"></a><tt class="py-lineno">178</tt> <tt class="py-line"> <tt class="py-comment"># noqa pylint: disable = C0330</tt> </tt> +<a name="L179"></a><tt class="py-lineno">179</tt> <tt class="py-line"> <tt class="py-string">r'([^\\"\047u>@\r\n\f\040\t/;:{}]+)'</tt> </tt> +<a name="L180"></a><tt class="py-lineno">180</tt> <tt class="py-line"> <tt class="py-string">r'|(?<=[{}(=:>+[,!])(%(space)s+)'</tt> </tt> +<a name="L181"></a><tt class="py-lineno">181</tt> <tt class="py-line"> <tt class="py-string">r'|^(%(space)s+)'</tt> </tt> +<a name="L182"></a><tt class="py-lineno">182</tt> <tt class="py-line"> <tt class="py-string">r'|(%(space)s+)(?=(([:{});=>+\],!])|$)?)'</tt> </tt> +<a name="L183"></a><tt class="py-lineno">183</tt> <tt class="py-line"> <tt class="py-string">r'|;(%(space)s*(?:;%(space)s*)*)(?=(\})?)'</tt> </tt> +<a name="L184"></a><tt class="py-lineno">184</tt> <tt class="py-line"> <tt class="py-string">r'|(\{)'</tt> </tt> +<a name="L185"></a><tt class="py-lineno">185</tt> <tt class="py-line"> <tt class="py-string">r'|(\})'</tt> </tt> +<a name="L186"></a><tt class="py-lineno">186</tt> <tt class="py-line"> <tt class="py-string">r'|(%(strings)s)'</tt> </tt> +<a name="L187"></a><tt class="py-lineno">187</tt> <tt class="py-line"> <tt class="py-string">r'|(?<!%(nmchar)s)url\(%(spacechar)s*('</tt> </tt> +<a name="L188"></a><tt class="py-lineno">188</tt> <tt class="py-line"> <tt class="py-string">r'%(uri_nl_strings)s'</tt> </tt> +<a name="L189"></a><tt class="py-lineno">189</tt> <tt class="py-line"> <tt class="py-string">r'|%(uri)s'</tt> </tt> +<a name="L190"></a><tt class="py-lineno">190</tt> <tt class="py-line"> <tt class="py-string">r')%(spacechar)s*\)'</tt> </tt> +<a name="L191"></a><tt class="py-lineno">191</tt> <tt class="py-line"> <tt class="py-string">r'|(@(?:'</tt> </tt> +<a name="L192"></a><tt class="py-lineno">192</tt> <tt class="py-line"> <tt class="py-string">r'[mM][eE][dD][iI][aA]'</tt> </tt> +<a name="L193"></a><tt class="py-lineno">193</tt> <tt class="py-line"> <tt class="py-string">r'|[sS][uU][pP][pP][oO][rR][tT][sS]'</tt> </tt> +<a name="L194"></a><tt class="py-lineno">194</tt> <tt class="py-line"> <tt class="py-string">r'|[dD][oO][cC][uU][mM][eE][nN][tT]'</tt> </tt> +<a name="L195"></a><tt class="py-lineno">195</tt> <tt class="py-line"> <tt class="py-string">r'|(?:-(?:'</tt> </tt> +<a name="L196"></a><tt class="py-lineno">196</tt> <tt class="py-line"> <tt class="py-string">r'[wW][eE][bB][kK][iI][tT]|[mM][oO][zZ]|[oO]|[mM][sS]'</tt> </tt> +<a name="L197"></a><tt class="py-lineno">197</tt> <tt class="py-line"> <tt class="py-string">r')-)?'</tt> </tt> +<a name="L198"></a><tt class="py-lineno">198</tt> <tt class="py-line"> <tt class="py-string">r'[kK][eE][yY][fF][rR][aA][mM][eE][sS]'</tt> </tt> +<a name="L199"></a><tt class="py-lineno">199</tt> <tt class="py-line"> <tt class="py-string">r'))(?!%(nmchar)s)'</tt> </tt> +<a name="L200"></a><tt class="py-lineno">200</tt> <tt class="py-line"> <tt class="py-string">r'|(%(ie7hack)s)(%(space)s*)'</tt> </tt> +<a name="L201"></a><tt class="py-lineno">201</tt> <tt class="py-line"> <tt class="py-string">r'|(:[fF][iI][rR][sS][tT]-[lL]'</tt> </tt> +<a name="L202"></a><tt class="py-lineno">202</tt> <tt class="py-line"> <tt class="py-string">r'(?:[iI][nN][eE]|[eE][tT][tT][eE][rR]))'</tt> </tt> +<a name="L203"></a><tt class="py-lineno">203</tt> <tt class="py-line"> <tt class="py-string">r'(%(space)s*)(?=[{,])'</tt> </tt> +<a name="L204"></a><tt class="py-lineno">204</tt> <tt class="py-line"> <tt class="py-string">r'|(%(nl_strings)s)'</tt> </tt> +<a name="L205"></a><tt class="py-lineno">205</tt> <tt class="py-line"> <tt class="py-string">r'|(%(escape)s[^\\"\047u>@\r\n\f\040\t/;:{}]*)'</tt> </tt> +<a name="L206"></a><tt class="py-lineno">206</tt> <tt class="py-line"> <tt class="py-op">)</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt> +<a name="L207"></a><tt class="py-lineno">207</tt> <tt class="py-line"> </tt> +<a name="L208"></a><tt class="py-lineno">208</tt> <tt class="py-line"> <tt class="py-comment">#print main_sub.__self__.pattern</tt> </tt> +<a name="L209"></a><tt class="py-lineno">209</tt> <tt class="py-line"> </tt> +<a name="L210"></a><tt class="py-lineno">210</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">main_subber</tt><tt class="py-op">(</tt><tt class="py-param">keep_bang_comments</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt> +<a name="L211"></a><tt class="py-lineno">211</tt> <tt class="py-line"> <tt class="py-docstring">""" Make main subber """</tt> </tt> +<a name="L212"></a><tt class="py-lineno">212</tt> <tt class="py-line"> <tt class="py-name">in_macie5</tt><tt class="py-op">,</tt> <tt class="py-name">in_rule</tt><tt class="py-op">,</tt> <tt class="py-name">at_group</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> </tt> +<a name="L213"></a><tt class="py-lineno">213</tt> <tt class="py-line"> </tt> +<a name="L214"></a><tt class="py-lineno">214</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">keep_bang_comments</tt><tt class="py-op">:</tt> </tt> +<a name="L215"></a><tt class="py-lineno">215</tt> <tt class="py-line"> <tt class="py-name">space_sub</tt> <tt class="py-op">=</tt> <tt class="py-name">space_sub_banged</tt> </tt> +<a name="L216"></a><tt class="py-lineno">216</tt> <tt class="py-line"> </tt> +<a name="L217"></a><tt class="py-lineno">217</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">space_subber</tt><tt class="py-op">(</tt><tt class="py-param">match</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt> +<a name="L218"></a><tt class="py-lineno">218</tt> <tt class="py-line"> <tt class="py-docstring">""" Space|Comment subber """</tt> </tt> +<a name="L219"></a><tt class="py-lineno">219</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">lastindex</tt><tt class="py-op">:</tt> </tt> +<a name="L220"></a><tt class="py-lineno">220</tt> <tt class="py-line"> <tt class="py-name">group1</tt><tt class="py-op">,</tt> <tt class="py-name">group2</tt> <tt class="py-op">=</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">,</tt> <tt class="py-number">2</tt><tt class="py-op">)</tt> </tt> +<a name="L221"></a><tt class="py-lineno">221</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">group2</tt><tt class="py-op">:</tt> </tt> +<a name="L222"></a><tt class="py-lineno">222</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">group1</tt><tt class="py-op">.</tt><tt class="py-name">endswith</tt><tt class="py-op">(</tt><tt class="py-string">r'\*/'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt> +<a name="L223"></a><tt class="py-lineno">223</tt> <tt class="py-line"> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">1</tt> </tt> +<a name="L224"></a><tt class="py-lineno">224</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt> +<a name="L225"></a><tt class="py-lineno">225</tt> <tt class="py-line"> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt> +<a name="L226"></a><tt class="py-lineno">226</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">group1</tt> </tt> +<a name="L227"></a><tt class="py-lineno">227</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">group1</tt><tt class="py-op">:</tt> </tt> +<a name="L228"></a><tt class="py-lineno">228</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">group1</tt><tt class="py-op">.</tt><tt class="py-name">endswith</tt><tt class="py-op">(</tt><tt class="py-string">r'\*/'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt> +<a name="L229"></a><tt class="py-lineno">229</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt> +<a name="L230"></a><tt class="py-lineno">230</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">''</tt> </tt> +<a name="L231"></a><tt class="py-lineno">231</tt> <tt class="py-line"> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">1</tt> </tt> +<a name="L232"></a><tt class="py-lineno">232</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">r'/*\*/'</tt> </tt> +<a name="L233"></a><tt class="py-lineno">233</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt> +<a name="L234"></a><tt class="py-lineno">234</tt> <tt class="py-line"> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt> +<a name="L235"></a><tt class="py-lineno">235</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">'/**/'</tt> </tt> +<a name="L236"></a><tt class="py-lineno">236</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">''</tt> </tt> +</div><a name="L237"></a><tt class="py-lineno">237</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt> +<a name="L238"></a><tt class="py-lineno">238</tt> <tt class="py-line"> <tt class="py-name">space_sub</tt> <tt class="py-op">=</tt> <tt class="py-name">space_sub_simple</tt> </tt> +<a name="L239"></a><tt class="py-lineno">239</tt> <tt class="py-line"> </tt> +<a name="L240"></a><tt class="py-lineno">240</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">space_subber</tt><tt class="py-op">(</tt><tt class="py-param">match</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt> +<a name="L241"></a><tt class="py-lineno">241</tt> <tt class="py-line"> <tt class="py-docstring">""" Space|Comment subber """</tt> </tt> +<a name="L242"></a><tt class="py-lineno">242</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">lastindex</tt><tt class="py-op">:</tt> </tt> +<a name="L243"></a><tt class="py-lineno">243</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">endswith</tt><tt class="py-op">(</tt><tt class="py-string">r'\*/'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt> +<a name="L244"></a><tt class="py-lineno">244</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt> +<a name="L245"></a><tt class="py-lineno">245</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">''</tt> </tt> +<a name="L246"></a><tt class="py-lineno">246</tt> <tt class="py-line"> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">1</tt> </tt> +<a name="L247"></a><tt class="py-lineno">247</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">r'/*\*/'</tt> </tt> +<a name="L248"></a><tt class="py-lineno">248</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt> +<a name="L249"></a><tt class="py-lineno">249</tt> <tt class="py-line"> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt> +<a name="L250"></a><tt class="py-lineno">250</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">'/**/'</tt> </tt> +<a name="L251"></a><tt class="py-lineno">251</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">''</tt> </tt> +</div><a name="L252"></a><tt class="py-lineno">252</tt> <tt class="py-line"> </tt> +<a name="L253"></a><tt class="py-lineno">253</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">fn_space_post</tt><tt class="py-op">(</tt><tt class="py-param">group</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt> +<a name="L254"></a><tt class="py-lineno">254</tt> <tt class="py-line"> <tt class="py-docstring">""" space with token after """</tt> </tt> +<a name="L255"></a><tt class="py-lineno">255</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">5</tt><tt class="py-op">)</tt> <tt class="py-keyword">is</tt> <tt class="py-name">None</tt> <tt class="py-keyword">or</tt> <tt class="py-op">(</tt> </tt> +<a name="L256"></a><tt class="py-lineno">256</tt> <tt class="py-line"> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">6</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-string">':'</tt> <tt class="py-keyword">and</tt> <tt class="py-keyword">not</tt> <tt class="py-name">in_rule</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-keyword">not</tt> <tt class="py-name">at_group</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt> +<a name="L257"></a><tt class="py-lineno">257</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">' '</tt> <tt class="py-op">+</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">4</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt> +<a name="L258"></a><tt class="py-lineno">258</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">4</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt> +</div><a name="L259"></a><tt class="py-lineno">259</tt> <tt class="py-line"> </tt> +<a name="L260"></a><tt class="py-lineno">260</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">fn_semicolon</tt><tt class="py-op">(</tt><tt class="py-param">group</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt> +<a name="L261"></a><tt class="py-lineno">261</tt> <tt class="py-line"> <tt class="py-docstring">""" ; handler """</tt> </tt> +<a name="L262"></a><tt class="py-lineno">262</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">';'</tt> <tt class="py-op">+</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">7</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt> +</div><a name="L263"></a><tt class="py-lineno">263</tt> <tt class="py-line"> </tt> +<a name="L264"></a><tt class="py-lineno">264</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">fn_semicolon2</tt><tt class="py-op">(</tt><tt class="py-param">group</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt> +<a name="L265"></a><tt class="py-lineno">265</tt> <tt class="py-line"> <tt class="py-docstring">""" ; handler """</tt> </tt> +<a name="L266"></a><tt class="py-lineno">266</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">in_rule</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt> +<a name="L267"></a><tt class="py-lineno">267</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">7</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt> +<a name="L268"></a><tt class="py-lineno">268</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">';'</tt> <tt class="py-op">+</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">7</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt> +</div><a name="L269"></a><tt class="py-lineno">269</tt> <tt class="py-line"> </tt> +<a name="L270"></a><tt class="py-lineno">270</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">fn_open</tt><tt class="py-op">(</tt><tt class="py-param">_</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt> +<a name="L271"></a><tt class="py-lineno">271</tt> <tt class="py-line"> <tt class="py-docstring">""" { handler """</tt> </tt> +<a name="L272"></a><tt class="py-lineno">272</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">at_group</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt> +<a name="L273"></a><tt class="py-lineno">273</tt> <tt class="py-line"> <tt class="py-name">at_group</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">-=</tt> <tt class="py-number">1</tt> </tt> +<a name="L274"></a><tt class="py-lineno">274</tt> <tt class="py-line"> <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt> +<a name="L275"></a><tt class="py-lineno">275</tt> <tt class="py-line"> <tt class="py-name">in_rule</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">1</tt> </tt> +<a name="L276"></a><tt class="py-lineno">276</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">'{'</tt> </tt> +</div><a name="L277"></a><tt class="py-lineno">277</tt> <tt class="py-line"> </tt> +<a name="L278"></a><tt class="py-lineno">278</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">fn_close</tt><tt class="py-op">(</tt><tt class="py-param">_</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt> +<a name="L279"></a><tt class="py-lineno">279</tt> <tt class="py-line"> <tt class="py-docstring">""" } handler """</tt> </tt> +<a name="L280"></a><tt class="py-lineno">280</tt> <tt class="py-line"> <tt class="py-name">in_rule</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt> +<a name="L281"></a><tt class="py-lineno">281</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">'}'</tt> </tt> +</div><a name="L282"></a><tt class="py-lineno">282</tt> <tt class="py-line"> </tt> +<a name="L283"></a><tt class="py-lineno">283</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">fn_at_group</tt><tt class="py-op">(</tt><tt class="py-param">group</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt> +<a name="L284"></a><tt class="py-lineno">284</tt> <tt class="py-line"> <tt class="py-docstring">""" @xxx group handler """</tt> </tt> +<a name="L285"></a><tt class="py-lineno">285</tt> <tt class="py-line"> <tt class="py-name">at_group</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">+=</tt> <tt class="py-number">1</tt> </tt> +<a name="L286"></a><tt class="py-lineno">286</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">13</tt><tt class="py-op">)</tt> </tt> +</div><a name="L287"></a><tt class="py-lineno">287</tt> <tt class="py-line"> </tt> +<a name="L288"></a><tt class="py-lineno">288</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">fn_ie7hack</tt><tt class="py-op">(</tt><tt class="py-param">group</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt> +<a name="L289"></a><tt class="py-lineno">289</tt> <tt class="py-line"> <tt class="py-docstring">""" IE7 Hack handler """</tt> </tt> +<a name="L290"></a><tt class="py-lineno">290</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">in_rule</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-keyword">not</tt> <tt class="py-name">at_group</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt> +<a name="L291"></a><tt class="py-lineno">291</tt> <tt class="py-line"> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt> +<a name="L292"></a><tt class="py-lineno">292</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">14</tt><tt class="py-op">)</tt> <tt class="py-op">+</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">15</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt> +<a name="L293"></a><tt class="py-lineno">293</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-string">'>'</tt> <tt class="py-op">+</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">15</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt> +</div><a name="L294"></a><tt class="py-lineno">294</tt> <tt class="py-line"> </tt> +<a name="L295"></a><tt class="py-lineno">295</tt> <tt class="py-line"> <tt class="py-name">table</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt> </tt> +<a name="L296"></a><tt class="py-lineno">296</tt> <tt class="py-line"> <tt class="py-comment"># noqa pylint: disable = C0330</tt> </tt> +<a name="L297"></a><tt class="py-lineno">297</tt> <tt class="py-line"> <tt class="py-name">None</tt><tt class="py-op">,</tt> </tt> +<a name="L298"></a><tt class="py-lineno">298</tt> <tt class="py-line"> <tt class="py-name">None</tt><tt class="py-op">,</tt> </tt> +<a name="L299"></a><tt class="py-lineno">299</tt> <tt class="py-line"> <tt class="py-name">None</tt><tt class="py-op">,</tt> </tt> +<a name="L300"></a><tt class="py-lineno">300</tt> <tt class="py-line"> <tt class="py-name">None</tt><tt class="py-op">,</tt> </tt> +<a name="L301"></a><tt class="py-lineno">301</tt> <tt class="py-line"> <tt class="py-name">fn_space_post</tt><tt class="py-op">,</tt> <tt class="py-comment"># space with token after</tt> </tt> +<a name="L302"></a><tt class="py-lineno">302</tt> <tt class="py-line"> <tt class="py-name">fn_space_post</tt><tt class="py-op">,</tt> <tt class="py-comment"># space with token after</tt> </tt> +<a name="L303"></a><tt class="py-lineno">303</tt> <tt class="py-line"> <tt class="py-name">fn_space_post</tt><tt class="py-op">,</tt> <tt class="py-comment"># space with token after</tt> </tt> +<a name="L304"></a><tt class="py-lineno">304</tt> <tt class="py-line"> <tt class="py-name">fn_semicolon</tt><tt class="py-op">,</tt> <tt class="py-comment"># semicolon</tt> </tt> +<a name="L305"></a><tt class="py-lineno">305</tt> <tt class="py-line"> <tt class="py-name">fn_semicolon2</tt><tt class="py-op">,</tt> <tt class="py-comment"># semicolon</tt> </tt> +<a name="L306"></a><tt class="py-lineno">306</tt> <tt class="py-line"> <tt class="py-name">fn_open</tt><tt class="py-op">,</tt> <tt class="py-comment"># {</tt> </tt> +<a name="L307"></a><tt class="py-lineno">307</tt> <tt class="py-line"> <tt class="py-name">fn_close</tt><tt class="py-op">,</tt> <tt class="py-comment"># }</tt> </tt> +<a name="L308"></a><tt class="py-lineno">308</tt> <tt class="py-line"> <tt class="py-keyword">lambda</tt> <tt class="py-name">g</tt><tt class="py-op">:</tt> <tt class="py-name">g</tt><tt class="py-op">(</tt><tt class="py-number">11</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-comment"># string</tt> </tt> +<a name="L309"></a><tt class="py-lineno">309</tt> <tt class="py-line"> <tt class="py-keyword">lambda</tt> <tt class="py-name">g</tt><tt class="py-op">:</tt> <tt class="py-string">'url(%s)'</tt> <tt class="py-op">%</tt> <tt class="py-name">uri_space_sub</tt><tt class="py-op">(</tt><tt class="py-name">uri_space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">g</tt><tt class="py-op">(</tt><tt class="py-number">12</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt> +<a name="L310"></a><tt class="py-lineno">310</tt> <tt class="py-line"> <tt class="py-comment"># url(...)</tt> </tt> +<a name="L311"></a><tt class="py-lineno">311</tt> <tt class="py-line"> <tt class="py-name">fn_at_group</tt><tt class="py-op">,</tt> <tt class="py-comment"># @xxx expecting {...}</tt> </tt> +<a name="L312"></a><tt class="py-lineno">312</tt> <tt class="py-line"> <tt class="py-name">None</tt><tt class="py-op">,</tt> </tt> +<a name="L313"></a><tt class="py-lineno">313</tt> <tt class="py-line"> <tt class="py-name">fn_ie7hack</tt><tt class="py-op">,</tt> <tt class="py-comment"># ie7hack</tt> </tt> +<a name="L314"></a><tt class="py-lineno">314</tt> <tt class="py-line"> <tt class="py-name">None</tt><tt class="py-op">,</tt> </tt> +<a name="L315"></a><tt class="py-lineno">315</tt> <tt class="py-line"> <tt class="py-keyword">lambda</tt> <tt class="py-name">g</tt><tt class="py-op">:</tt> <tt class="py-name">g</tt><tt class="py-op">(</tt><tt class="py-number">16</tt><tt class="py-op">)</tt> <tt class="py-op">+</tt> <tt class="py-string">' '</tt> <tt class="py-op">+</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">g</tt><tt class="py-op">(</tt><tt class="py-number">17</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt> +<a name="L316"></a><tt class="py-lineno">316</tt> <tt class="py-line"> <tt class="py-comment"># :first-line|letter followed</tt> </tt> +<a name="L317"></a><tt class="py-lineno">317</tt> <tt class="py-line"> <tt class="py-comment"># by [{,] (apparently space</tt> </tt> +<a name="L318"></a><tt class="py-lineno">318</tt> <tt class="py-line"> <tt class="py-comment"># needed for IE6)</tt> </tt> +<a name="L319"></a><tt class="py-lineno">319</tt> <tt class="py-line"> <tt class="py-keyword">lambda</tt> <tt class="py-name">g</tt><tt class="py-op">:</tt> <tt class="py-name">nl_unesc_sub</tt><tt class="py-op">(</tt><tt class="py-string">''</tt><tt class="py-op">,</tt> <tt class="py-name">g</tt><tt class="py-op">(</tt><tt class="py-number">18</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-comment"># nl_string</tt> </tt> +<a name="L320"></a><tt class="py-lineno">320</tt> <tt class="py-line"> <tt class="py-keyword">lambda</tt> <tt class="py-name">g</tt><tt class="py-op">:</tt> <tt class="py-name">post_esc_sub</tt><tt class="py-op">(</tt><tt class="py-string">' '</tt><tt class="py-op">,</tt> <tt class="py-name">g</tt><tt class="py-op">(</tt><tt class="py-number">19</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-comment"># escape</tt> </tt> +<a name="L321"></a><tt class="py-lineno">321</tt> <tt class="py-line"> <tt class="py-op">)</tt> </tt> +<a name="L322"></a><tt class="py-lineno">322</tt> <tt class="py-line"> </tt> +<a name="L323"></a><tt class="py-lineno">323</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">func</tt><tt class="py-op">(</tt><tt class="py-param">match</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt> +<a name="L324"></a><tt class="py-lineno">324</tt> <tt class="py-line"> <tt class="py-docstring">""" Main subber """</tt> </tt> +<a name="L325"></a><tt class="py-lineno">325</tt> <tt class="py-line"> <tt class="py-name">idx</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt> <tt class="py-op">=</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">lastindex</tt><tt class="py-op">,</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">group</tt> </tt> +<a name="L326"></a><tt class="py-lineno">326</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-name">idx</tt> <tt class="py-op">></tt> <tt class="py-number">3</tt><tt class="py-op">:</tt> </tt> +<a name="L327"></a><tt class="py-lineno">327</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">table</tt><tt class="py-op">[</tt><tt class="py-name">idx</tt><tt class="py-op">]</tt><tt class="py-op">(</tt><tt class="py-name">group</tt><tt class="py-op">)</tt> </tt> +<a name="L328"></a><tt class="py-lineno">328</tt> <tt class="py-line"> </tt> +<a name="L329"></a><tt class="py-lineno">329</tt> <tt class="py-line"> <tt class="py-comment"># shortcuts for frequent operations below:</tt> </tt> +<a name="L330"></a><tt class="py-lineno">330</tt> <tt class="py-line"> <tt class="py-keyword">elif</tt> <tt class="py-name">idx</tt> <tt class="py-op">==</tt> <tt class="py-number">1</tt><tt class="py-op">:</tt> <tt class="py-comment"># not interesting</tt> </tt> +<a name="L331"></a><tt class="py-lineno">331</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">)</tt> </tt> +<a name="L332"></a><tt class="py-lineno">332</tt> <tt class="py-line"> <tt class="py-comment">#else: # space with token before or at the beginning</tt> </tt> +<a name="L333"></a><tt class="py-lineno">333</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-name">idx</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt> +</div><a name="L334"></a><tt class="py-lineno">334</tt> <tt class="py-line"> </tt> +<a name="L335"></a><tt class="py-lineno">335</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">func</tt> </tt> +</div><a name="L336"></a><tt class="py-lineno">336</tt> <tt class="py-line"> </tt> +<a name="L337"></a><tt class="py-lineno">337</tt> <tt class="py-line"> <tt class="py-keyword">def</tt> <tt class="py-def-name">cssmin</tt><tt class="py-op">(</tt><tt class="py-param">style</tt><tt class="py-op">,</tt> <tt class="py-param">keep_bang_comments</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> <tt class="py-comment"># pylint: disable = W0621</tt> </tt> +<a name="L338"></a><tt class="py-lineno">338</tt> <tt class="py-line"> <tt class="py-docstring">"""</tt> </tt> +<a name="L339"></a><tt class="py-lineno">339</tt> <tt class="py-line"><tt class="py-docstring"> Minify CSS.</tt> </tt> +<a name="L340"></a><tt class="py-lineno">340</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt> +<a name="L341"></a><tt class="py-lineno">341</tt> <tt class="py-line"><tt class="py-docstring"> :Parameters:</tt> </tt> +<a name="L342"></a><tt class="py-lineno">342</tt> <tt class="py-line"><tt class="py-docstring"> `style` : ``str``</tt> </tt> +<a name="L343"></a><tt class="py-lineno">343</tt> <tt class="py-line"><tt class="py-docstring"> CSS to minify</tt> </tt> +<a name="L344"></a><tt class="py-lineno">344</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt> +<a name="L345"></a><tt class="py-lineno">345</tt> <tt class="py-line"><tt class="py-docstring"> `keep_bang_comments` : ``bool``</tt> </tt> +<a name="L346"></a><tt class="py-lineno">346</tt> <tt class="py-line"><tt class="py-docstring"> Keep comments starting with an exclamation mark? (``/*!...*/``)</tt> </tt> +<a name="L347"></a><tt class="py-lineno">347</tt> <tt class="py-line"><tt class="py-docstring"></tt> </tt> +<a name="L348"></a><tt class="py-lineno">348</tt> <tt class="py-line"><tt class="py-docstring"> :Return: Minified style</tt> </tt> +<a name="L349"></a><tt class="py-lineno">349</tt> <tt class="py-line"><tt class="py-docstring"> :Rtype: ``str``</tt> </tt> +<a name="L350"></a><tt class="py-lineno">350</tt> <tt class="py-line"><tt class="py-docstring"> """</tt> </tt> +<a name="L351"></a><tt class="py-lineno">351</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt class="py-name">main_sub</tt><tt class="py-op">(</tt><tt class="py-name">main_subber</tt><tt class="py-op">(</tt><tt class="py-name">keep_bang_comments</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">style</tt><tt class="py-op">)</tt> </tt> +</div><a name="L352"></a><tt class="py-lineno">352</tt> <tt class="py-line"> </tt> +<a name="L353"></a><tt class="py-lineno">353</tt> <tt class="py-line"> <tt class="py-keyword">return</tt> <tt id="link-5" class="py-name"><a title="rcssmin.cssmin" class="py-name" href="#" onclick="return doclink('link-5', 'cssmin', 'link-4');">cssmin</a></tt> </tt> +</div><a name="L354"></a><tt class="py-lineno">354</tt> <tt class="py-line"> </tt> +<a name="L355"></a><tt class="py-lineno">355</tt> <tt class="py-line"><tt id="link-6" class="py-name"><a title="rcssmin.cssmin" class="py-name" href="#" onclick="return doclink('link-6', 'cssmin', 'link-4');">cssmin</a></tt> <tt class="py-op">=</tt> <tt class="py-name">_make_cssmin</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt> +<a name="L356"></a><tt class="py-lineno">356</tt> <tt class="py-line"> </tt> +<a name="L357"></a><tt class="py-lineno">357</tt> <tt class="py-line"> </tt> +<a name="L358"></a><tt class="py-lineno">358</tt> <tt class="py-line"><tt class="py-keyword">if</tt> <tt class="py-name">__name__</tt> <tt class="py-op">==</tt> <tt class="py-string">'__main__'</tt><tt class="py-op">:</tt> </tt> +<a name="main"></a><div id="main-def"><a name="L359"></a><tt class="py-lineno">359</tt> <a class="py-toggle" href="#" id="main-toggle" onclick="return toggle('main');">-</a><tt class="py-line"> <tt class="py-keyword">def</tt> <a class="py-def-name" href="rcssmin-module.html#main">main</a><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt> +</div><div id="main-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="main-expanded"><a name="L360"></a><tt class="py-lineno">360</tt> <tt class="py-line"> <tt class="py-docstring">""" Main """</tt> </tt> +<a name="L361"></a><tt class="py-lineno">361</tt> <tt class="py-line"> <tt class="py-keyword">import</tt> <tt class="py-name">sys</tt> <tt class="py-keyword">as</tt> <tt class="py-name">_sys</tt> </tt> +<a name="L362"></a><tt class="py-lineno">362</tt> <tt class="py-line"> <tt class="py-name">keep_bang_comments</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt> </tt> +<a name="L363"></a><tt class="py-lineno">363</tt> <tt class="py-line"> <tt class="py-string">'-b'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> </tt> +<a name="L364"></a><tt class="py-lineno">364</tt> <tt class="py-line"> <tt class="py-keyword">or</tt> <tt class="py-string">'-bp'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> </tt> +<a name="L365"></a><tt class="py-lineno">365</tt> <tt class="py-line"> <tt class="py-keyword">or</tt> <tt class="py-string">'-pb'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> </tt> +<a name="L366"></a><tt class="py-lineno">366</tt> <tt class="py-line"> <tt class="py-op">)</tt> </tt> +<a name="L367"></a><tt class="py-lineno">367</tt> <tt class="py-line"> <tt class="py-keyword">if</tt> <tt class="py-string">'-p'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> <tt class="py-string">'-bp'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> \ </tt> +<a name="L368"></a><tt class="py-lineno">368</tt> <tt class="py-line"> <tt class="py-keyword">or</tt> <tt class="py-string">'-pb'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt> +<a name="L369"></a><tt class="py-lineno">369</tt> <tt class="py-line"> <tt class="py-keyword">global</tt> <tt id="link-7" class="py-name"><a title="rcssmin.cssmin" class="py-name" href="#" onclick="return doclink('link-7', 'cssmin', 'link-4');">cssmin</a></tt> <tt class="py-comment"># pylint: disable = W0603</tt> </tt> +<a name="L370"></a><tt class="py-lineno">370</tt> <tt class="py-line"> <tt id="link-8" class="py-name"><a title="rcssmin.cssmin" class="py-name" href="#" onclick="return doclink('link-8', 'cssmin', 'link-4');">cssmin</a></tt> <tt class="py-op">=</tt> <tt class="py-name">_make_cssmin</tt><tt class="py-op">(</tt><tt class="py-name">python_only</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt> </tt> +<a name="L371"></a><tt class="py-lineno">371</tt> <tt class="py-line"> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">stdout</tt><tt class="py-op">.</tt><tt class="py-name">write</tt><tt class="py-op">(</tt><tt id="link-9" class="py-name"><a title="rcssmin.cssmin" class="py-name" href="#" onclick="return doclink('link-9', 'cssmin', 'link-4');">cssmin</a></tt><tt class="py-op">(</tt> </tt> +<a name="L372"></a><tt class="py-lineno">372</tt> <tt class="py-line"> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">stdin</tt><tt class="py-op">.</tt><tt class="py-name">read</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">keep_bang_comments</tt><tt class="py-op">=</tt><tt class="py-name">keep_bang_comments</tt> </tt> +<a name="L373"></a><tt class="py-lineno">373</tt> <tt class="py-line"> <tt class="py-op">)</tt><tt class="py-op">)</tt> </tt> +</div><a name="L374"></a><tt class="py-lineno">374</tt> <tt class="py-line"> <tt class="py-name">main</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt> +<a name="L375"></a><tt class="py-lineno">375</tt> <tt class="py-line"> </tt><script type="text/javascript"> +<!-- +expandto(location.href); +// --> +</script> +</pre> +<br /> +<!-- ==================== NAVIGATION BAR ==================== --> +<table class="navbar" border="0" width="100%" cellpadding="0" + bgcolor="#a0c0ff" cellspacing="0"> + <tr valign="middle"> + <!-- Home link --> + <th bgcolor="#70b0f0" class="navbar-select" + > Home </th> + + <!-- Tree link --> + <th> <a + href="module-tree.html">Trees</a> </th> + + <!-- Index link --> + <th> <a + href="identifier-index.html">Indices</a> </th> + + <!-- Help link --> + <th> <a + href="help.html">Help</a> </th> + + <!-- Project homepage --> + <th class="navbar" align="right" width="100%"> + <table border="0" cellpadding="0" cellspacing="0"> + <tr><th class="navbar" align="center" + ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th> + </tr></table></th> + </tr> +</table> + +<script type="text/javascript"> + <!-- + // Private objects are initially displayed (because if + // javascript is turned off then we want them to be + // visible); but by default, we want to hide them. So hide + // them unless we have a cookie that says to show them. + checkCookie(); + // --> +</script> +</body> +</html> diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/redirect.html b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/redirect.html new file mode 100644 index 00000000000..95728fdf177 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/redirect.html @@ -0,0 +1,38 @@ +<html><head><title>Epydoc Redirect Page</title> +<meta http-equiv="cache-control" content="no-cache" /> +<meta http-equiv="expires" content="0" /> +<meta http-equiv="pragma" content="no-cache" /> + <script type="text/javascript" src="epydoc.js"></script> +</head> +<body> +<script type="text/javascript"> +<!-- +var pages = ["rcssmin-m"]; +var dottedName = get_anchor(); +if (dottedName) { + var target = redirect_url(dottedName); + if (target) window.location.replace(target); +} +// --> +</script> + +<h3>Epydoc Auto-redirect page</h3> + +<p>When javascript is enabled, this page will redirect URLs of +the form <tt>redirect.html#<i>dotted.name</i></tt> to the +documentation for the object with the given fully-qualified +dotted name.</p> +<p><a id="message"> </a></p> + +<script type="text/javascript"> +<!-- +if (dottedName) { + var msg = document.getElementById("message"); + msg.innerHTML = "No documentation found for <tt>"+ + dottedName+"</tt>"; +} +// --> +</script> + +</body> +</html> diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/package.cfg b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/package.cfg new file mode 100644 index 00000000000..c09bbd0365b --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/package.cfg @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- +# +# Copyright 2009 - 2014 +# André Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +[package] +name = rcssmin + +python.min = 2.3 +python.max = 3.4 +pypy.min = 1.9 +pypy.max = 2.2 +jython.min = 2.5 +jython.max = 2.7 + +version.number = 1.0.5 + +author.name = André Malo +author.email = nd@perlig.de +#maintainer.name = +#maintainer.email = +url.homepage = http://opensource.perlig.de/rcssmin/ +url.download = http://storage.perlig.de/rcssmin/ + + +[docs] +meta.classifiers = docs/CLASSIFIERS +meta.description = docs/DESCRIPTION +meta.summary = docs/SUMMARY +meta.provides = docs/PROVIDES +meta.license = LICENSE +meta.keywords = + CSS + Minimization + +apidoc.dir = docs/apidoc +apidoc.strip = 1 +#apidoc.ignore = + +#userdoc.dir = docs/userdoc +#userdoc.strip = 1 +#userdoc.ignore = +# .buildinfo + +#examples.dir = docs/examples +#examples.strip = 1 +#examples.ignore = + +#man = + +extra = + README.rst + docs/CHANGES + docs/BENCHMARKS + + +[manifest] +#packages.lib = . +#packages.collect = +modules = rcssmin + +packages.extra = + _setup.py2.term + _setup.py3.term + +#scripts = + +dist = + tests + run_tests.py + bench + bench.sh diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/rcssmin.c b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/rcssmin.c new file mode 100644 index 00000000000..a722fc276a9 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/rcssmin.c @@ -0,0 +1,1163 @@ +/* + * Copyright 2011 - 2014 + * Andr\xe9 Malo or his licensors, as applicable + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "cext.h" +EXT_INIT_FUNC; + +#ifdef EXT3 +typedef Py_UNICODE rchar; +#else +typedef unsigned char rchar; +#endif +#define U(c) ((rchar)(c)) + +typedef struct { + const rchar *start; + const rchar *sentinel; + const rchar *tsentinel; + Py_ssize_t at_group; + int in_macie5; + int in_rule; + int keep_bang_comments; +} rcssmin_ctx_t; + +typedef enum { + NEED_SPACE_MAYBE = 0, + NEED_SPACE_NEVER +} need_space_flag; + + +#define RCSSMIN_DULL_BIT (1 << 0) +#define RCSSMIN_HEX_BIT (1 << 1) +#define RCSSMIN_ESC_BIT (1 << 2) +#define RCSSMIN_SPACE_BIT (1 << 3) +#define RCSSMIN_STRING_DULL_BIT (1 << 4) +#define RCSSMIN_NMCHAR_BIT (1 << 5) +#define RCSSMIN_URI_DULL_BIT (1 << 6) +#define RCSSMIN_PRE_CHAR_BIT (1 << 7) +#define RCSSMIN_POST_CHAR_BIT (1 << 8) + +static const unsigned short rcssmin_charmask[128] = { + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 28, 8, 21, 8, 8, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 28, 469, 4, 85, 85, 85, 85, 4, + 149, 277, 85, 469, 469, 117, 85, 84, + 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 468, 340, 85, 469, 468, 85, + 84, 115, 115, 115, 115, 115, 115, 117, + 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 213, 4, 341, 85, 117, + 85, 115, 115, 115, 115, 115, 115, 117, + 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 116, 117, 117, + 117, 117, 117, 468, 85, 468, 85, 21 +}; + +#define RCSSMIN_IS_DULL(c) ((U(c) > 127) || \ + (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_DULL_BIT)) + +#define RCSSMIN_IS_HEX(c) ((U(c) <= 127) && \ + (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_HEX_BIT)) + +#define RCSSMIN_IS_ESC(c) ((U(c) > 127) || \ + (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_ESC_BIT)) + +#define RCSSMIN_IS_SPACE(c) ((U(c) <= 127) && \ + (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_SPACE_BIT)) + +#define RCSSMIN_IS_STRING_DULL(c) ((U(c) > 127) || \ + (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_STRING_DULL_BIT)) + +#define RCSSMIN_IS_NMCHAR(c) ((U(c) > 127) || \ + (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_NMCHAR_BIT)) + +#define RCSSMIN_IS_URI_DULL(c) ((U(c) > 127) || \ + (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_URI_DULL_BIT)) + +#define RCSSMIN_IS_PRE_CHAR(c) ((U(c) <= 127) && \ + (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_PRE_CHAR_BIT)) + +#define RCSSMIN_IS_POST_CHAR(c) ((U(c) <= 127) && \ + (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_POST_CHAR_BIT)) + + +static const rchar pattern_url[] = { + /*U('u'),*/ U('r'), U('l'), U('(') +}; + +static const rchar pattern_ie7[] = { + /*U('>'),*/ U('/'), U('*'), U('*'), U('/') +}; + +static const rchar pattern_media[] = { + U('m'), U('e'), U('d'), U('i'), U('a'), + U('M'), U('E'), U('D'), U('I'), U('A') +}; + +static const rchar pattern_document[] = { + U('d'), U('o'), U('c'), U('u'), U('m'), U('e'), U('n'), U('t'), + U('D'), U('O'), U('C'), U('U'), U('M'), U('E'), U('N'), U('T') +}; + +static const rchar pattern_supports[] = { + U('s'), U('u'), U('p'), U('p'), U('o'), U('r'), U('t'), U('s'), + U('S'), U('U'), U('P'), U('P'), U('O'), U('R'), U('T'), U('S') +}; + +static const rchar pattern_keyframes[] = { + U('k'), U('e'), U('y'), U('f'), U('r'), U('a'), U('m'), U('e'), U('s'), + U('K'), U('E'), U('Y'), U('F'), U('R'), U('A'), U('M'), U('E'), U('S') +}; + +static const rchar pattern_vendor_o[] = { + U('-'), U('o'), U('-'), + U('-'), U('O'), U('-') +}; + +static const rchar pattern_vendor_moz[] = { + U('-'), U('m'), U('o'), U('z'), U('-'), + U('-'), U('M'), U('O'), U('Z'), U('-') +}; + +static const rchar pattern_vendor_webkit[] = { + U('-'), U('w'), U('e'), U('b'), U('k'), U('i'), U('t'), U('-'), + U('-'), U('W'), U('E'), U('B'), U('K'), U('I'), U('T'), U('-') +}; + +static const rchar pattern_vendor_ms[] = { + U('-'), U('m'), U('s'), U('-'), + U('-'), U('M'), U('S'), U('-') +}; + +static const rchar pattern_first[] = { + U('f'), U('i'), U('r'), U('s'), U('t'), U('-'), U('l'), + U('F'), U('I'), U('R'), U('S'), U('T'), U('-'), U('L') +}; + +static const rchar pattern_line[] = { + U('i'), U('n'), U('e'), + U('I'), U('N'), U('E'), +}; + +static const rchar pattern_letter[] = { + U('e'), U('t'), U('t'), U('e'), U('r'), + U('E'), U('T'), U('T'), U('E'), U('R') +}; + +static const rchar pattern_macie5_init[] = { + U('/'), U('*'), U('\\'), U('*'), U('/') +}; + +static const rchar pattern_macie5_exit[] = { + U('/'), U('*'), U('*'), U('/') +}; + +/* + * Match a pattern (and copy immediately to target) + */ +#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstrict-overflow" +#endif +static int +copy_match(const rchar *pattern, const rchar *psentinel, + const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx) +{ + const rchar *source = *source_; + rchar *target = *target_; + rchar c; + + while (pattern < psentinel + && source < ctx->sentinel && target < ctx->tsentinel + && ((c = *source++) == *pattern++)) + *target++ = c; + + *source_ = source; + *target_ = target; + + return (pattern == psentinel); +} +#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#pragma GCC diagnostic pop +#endif + +#define MATCH(PAT, source, target, ctx) ( \ + copy_match(pattern_##PAT, \ + pattern_##PAT + sizeof(pattern_##PAT) / sizeof(rchar), \ + source, target, ctx) \ +) + + +/* + * Match a pattern (and copy immediately to target) - CI version + */ +static int +copy_imatch(const rchar *pattern, const rchar *psentinel, + const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx) +{ + const rchar *source = *source_, *pstart = pattern; + rchar *target = *target_; + rchar c; + + while (pattern < psentinel + && source < ctx->sentinel && target < ctx->tsentinel + && ((c = *source++) == *pattern + || c == pstart[(pattern - pstart) + (psentinel - pstart)])) { + ++pattern; + *target++ = c; + } + + *source_ = source; + *target_ = target; + + return (pattern == psentinel); +} + +#define IMATCH(PAT, source, target, ctx) ( \ + copy_imatch(pattern_##PAT, \ + pattern_##PAT + sizeof(pattern_##PAT) / sizeof(rchar) / 2, \ + source, target, ctx) \ +) + + +/* + * Copy characters + */ +#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstrict-overflow" +#endif +static int +copy(const rchar *source, const rchar *sentinel, rchar **target_, + rcssmin_ctx_t *ctx) +{ + rchar *target = *target_; + + while (source < sentinel && target < ctx->tsentinel) + *target++ = *source++; + + *target_ = target; + + return (source == sentinel); +} +#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#pragma GCC diagnostic pop +#endif + +#define COPY_PAT(PAT, target, ctx) ( \ + copy(pattern_##PAT, \ + pattern_##PAT + sizeof(pattern_##PAT) / sizeof(rchar), \ + target, ctx) \ +) + + +/* + * The ABORT macros work with known local variables! + */ +#define ABORT_(RET) do { \ + if (source < ctx->sentinel && !(target < ctx->tsentinel)) { \ + *source_ = source; \ + *target_ = target; \ + } \ + return RET; \ +} while(0) + + +#define CRAPPY_C90_COMPATIBLE_EMPTY +#define ABORT ABORT_(CRAPPY_C90_COMPATIBLE_EMPTY) +#define RABORT(RET) ABORT_((RET)) + + +/* + * Copy escape + */ +static void +copy_escape(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx) +{ + const rchar *source = *source_, *hsentinel; + rchar *target = *target_; + rchar c; + + *target++ = U('\\'); + *target_ = target; + + if (source < ctx->sentinel && target < ctx->tsentinel) { + c = *source++; + if (RCSSMIN_IS_ESC(c)) { + *target++ = c; + } + else if (RCSSMIN_IS_HEX(c)) { + *target++ = c; + + /* 6 hex chars max, one we got already */ + if (ctx->sentinel - source > 5) + hsentinel = source + 5; + else + hsentinel = ctx->sentinel; + + while (source < hsentinel && target < ctx->tsentinel + && (c = *source, RCSSMIN_IS_HEX(c))) { + ++source; + *target++ = c; + } + + /* One optional space after */ + if (source < ctx->sentinel && target < ctx->tsentinel) { + if (source == hsentinel) + c = *source; + if (RCSSMIN_IS_SPACE(c)) { + ++source; + *target++ = U(' '); + if (c == U('\r') && source < ctx->sentinel + && *source == U('\n')) + ++source; + } + } + } + } + + *target_ = target; + *source_ = source; +} + + +/* + * Copy string + */ +static void +copy_string(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx) +{ + const rchar *source = *source_; + rchar *target = *target_; + rchar c, quote = source[-1]; + + *target++ = quote; + *target_ = target; + + while (source < ctx->sentinel && target < ctx->tsentinel) { + c = *target++ = *source++; + if (RCSSMIN_IS_STRING_DULL(c)) + continue; + + switch (c) { + case U('\''): case U('"'): + if (c == quote) { + *target_ = target; + *source_ = source; + return; + } + continue; + + case U('\\'): + if (source < ctx->sentinel && target < ctx->tsentinel) { + c = *source++; + switch (c) { + case U('\r'): + if (source < ctx->sentinel && *source == U('\n')) + ++source; + /* fall through */ + + case U('\n'): case U('\f'): + --target; + break; + + default: + *target++ = c; + } + } + continue; + } + break; /* forbidden characters */ + } + + ABORT; +} + + +/* + * Copy URI string + */ +static int +copy_uri_string(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx) +{ + const rchar *source = *source_; + rchar *target = *target_; + rchar c, quote = source[-1]; + + *target++ = quote; + *target_ = target; + + while (source < ctx->sentinel && target < ctx->tsentinel) { + c = *source++; + if (RCSSMIN_IS_SPACE(c)) + continue; + *target++ = c; + if (RCSSMIN_IS_STRING_DULL(c)) + continue; + + switch (c) { + case U('\''): case U('"'): + if (c == quote) { + *target_ = target; + *source_ = source; + return 0; + } + continue; + + case U('\\'): + if (source < ctx->sentinel && target < ctx->tsentinel) { + c = *source; + switch (c) { + case U('\r'): + if ((source + 1) < ctx->sentinel && source[1] == U('\n')) + ++source; + /* fall through */ + + case U('\n'): case U('\f'): + --target; + ++source; + break; + + default: + --target; + copy_escape(&source, &target, ctx); + } + } + continue; + } + + break; /* forbidden characters */ + } + + RABORT(-1); +} + + +/* + * Copy URI (unquoted) + */ +static int +copy_uri_unquoted(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx) +{ + const rchar *source = *source_; + rchar *target = *target_; + rchar c; + + *target++ = source[-1]; + *target_ = target; + + while (source < ctx->sentinel && target < ctx->tsentinel) { + c = *source++; + if (RCSSMIN_IS_SPACE(c)) + continue; + *target++ = c; + if (RCSSMIN_IS_URI_DULL(c)) + continue; + + switch (c) { + + case U(')'): + *target_ = target - 1; + *source_ = source - 1; + return 0; + + case U('\\'): + if (source < ctx->sentinel && target < ctx->tsentinel) { + c = *source; + switch (c) { + case U('\r'): + if ((source + 1) < ctx->sentinel && source[1] == U('\n')) + ++source; + /* fall through */ + + case U('\n'): case U('\f'): + --target; + ++source; + break; + + default: + --target; + copy_escape(&source, &target, ctx); + } + } + continue; + } + + break; /* forbidden characters */ + } + + RABORT(-1); +} + + +/* + * Copy url + */ +static void +copy_url(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx) +{ + const rchar *source = *source_; + rchar *target = *target_; + rchar c; + + *target++ = U('u'); + *target_ = target; + + /* Must not be inside an identifier */ + if ((source != ctx->start + 1) && RCSSMIN_IS_NMCHAR(source[-2])) + return; + + if (!MATCH(url, &source, &target, ctx) + || !(source < ctx->sentinel && target < ctx->tsentinel)) + ABORT; + + while (source < ctx->sentinel && RCSSMIN_IS_SPACE(*source)) + ++source; + + if (!(source < ctx->sentinel)) + ABORT; + + c = *source++; + switch (c) { + case U('"'): case U('\''): + if (copy_uri_string(&source, &target, ctx) == -1) + ABORT; + + while (source < ctx->sentinel && RCSSMIN_IS_SPACE(*source)) + ++source; + break; + + default: + if (copy_uri_unquoted(&source, &target, ctx) == -1) + ABORT; + } + + if (!(source < ctx->sentinel && target < ctx->tsentinel)) + ABORT; + + if ((*target++ = *source++) != U(')')) + ABORT; + + *target_ = target; + *source_ = source; +} + + +/* + * Copy @-group + */ +static void +copy_at_group(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx) +{ + const rchar *source = *source_; + rchar *target = *target_; + + *target++ = U('@'); + *target_ = target; + +#define REMATCH(what) ( \ + source = *source_, \ + target = *target_, \ + IMATCH(what, &source, &target, ctx) \ +) +#define CMATCH(what) IMATCH(what, &source, &target, ctx) + + if (( !CMATCH(media) + && !REMATCH(supports) + && !REMATCH(document) + && !REMATCH(keyframes) + && !(REMATCH(vendor_webkit) && CMATCH(keyframes)) + && !(REMATCH(vendor_moz) && CMATCH(keyframes)) + && !(REMATCH(vendor_o) && CMATCH(keyframes)) + && !(REMATCH(vendor_ms) && CMATCH(keyframes))) + || !(source < ctx->sentinel && target < ctx->tsentinel) + || RCSSMIN_IS_NMCHAR(*source)) + ABORT; + +#undef CMATCH +#undef REMATCH + + ++ctx->at_group; + + *target_ = target; + *source_ = source; +} + + +/* + * Skip space + */ +static const rchar * +skip_space(const rchar *source, rcssmin_ctx_t *ctx) +{ + const rchar *begin = source; + int res; + rchar c; + + while (source < ctx->sentinel) { + c = *source; + if (RCSSMIN_IS_SPACE(c)) { + ++source; + continue; + } + else if (c == U('/')) { + ++source; + if (!(source < ctx->sentinel && *source == U('*'))) { + --source; + break; + } + ++source; + res = 0; + while (source < ctx->sentinel) { + c = *source++; + if (c != U('*')) + continue; + if (!(source < ctx->sentinel)) + return begin; + if (*source != U('/')) + continue; + + /* Comment complete */ + ++source; + res = 1; + break; + } + if (!res) + return begin; + + continue; + } + + break; + } + + return source; +} + + +/* + * Copy space + */ +static void +copy_space(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx, + need_space_flag need_space) +{ + const rchar *source = *source_, *end, *comment; + rchar *target = *target_; + int res; + rchar c; + + --source; + if (need_space == NEED_SPACE_MAYBE + && source > ctx->start + && !RCSSMIN_IS_PRE_CHAR(source[-1]) + && (end = skip_space(source, ctx)) < ctx->sentinel + && (!RCSSMIN_IS_POST_CHAR(*end) + || (*end == U(':') && !ctx->in_rule && !ctx->at_group))) { + + if (!(target < ctx->tsentinel)) + ABORT; + *target++ = U(' '); + } + + while (source < ctx->sentinel) { + switch (c = *source) { + + /* comment */ + case U('/'): + comment = source++; + if (!((source < ctx->sentinel && *source == U('*')))) { + --source; + break; + } + ++source; + res = 0; + while (source < ctx->sentinel) { + c = *source++; + if (c != U('*')) + continue; + if (!(source < ctx->sentinel)) + ABORT; + if (*source != U('/')) + continue; + + /* Comment complete */ + ++source; + res = 1; + + if (ctx->keep_bang_comments && comment[2] == U('!')) { + ctx->in_macie5 = (source[-3] == U('\\')); + if (!copy(comment, source, &target, ctx)) + ABORT; + } + else if (source[-3] == U('\\')) { + if (!ctx->in_macie5) { + if (!COPY_PAT(macie5_init, &target, ctx)) + ABORT; + } + ctx->in_macie5 = 1; + } + else if (ctx->in_macie5) { + if (!COPY_PAT(macie5_exit, &target, ctx)) + ABORT; + ctx->in_macie5 = 0; + } + /* else don't copy anything */ + break; + } + if (!res) + ABORT; + continue; + + /* space */ + case U(' '): case U('\t'): case U('\r'): case U('\n'): case U('\f'): + ++source; + continue; + } + + break; + } + + *source_ = source; + *target_ = target; +} + + +/* + * Copy space if comment + */ +static int +copy_space_comment(const rchar **source_, rchar **target_, + rcssmin_ctx_t *ctx, need_space_flag need_space) +{ + const rchar *source = *source_; + rchar *target = *target_; + + if (source < ctx->sentinel && *source == U('*')) { + copy_space(source_, target_, ctx, need_space); + if (*source_ > source) + return 0; + } + if (!(target < ctx->tsentinel)) + RABORT(-1); + + *target++ = source[-1]; + + /* *source_ = source; <-- unchanged */ + *target_ = target; + + return -1; +} + + +/* + * Copy space if exists + */ +static int +copy_space_optional(const rchar **source_, rchar **target_, + rcssmin_ctx_t *ctx) +{ + const rchar *source = *source_; + + if (!(source < ctx->sentinel)) + return -1; + + if (*source == U('/')) { + *source_ = source + 1; + return copy_space_comment(source_, target_, ctx, NEED_SPACE_NEVER); + } + else if (RCSSMIN_IS_SPACE(*source)) { + *source_ = source + 1; + copy_space(source_, target_, ctx, NEED_SPACE_NEVER); + return 0; + } + + return -1; +} + + +/* + * Copy :first-line|letter + */ +static void +copy_first(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx) +{ + const rchar *source = *source_, *next, *source_fork; + rchar *target = *target_, *target_fork; + + *target++ = U(':'); + *target_ = target; + + if (!IMATCH(first, &source, &target, ctx) + || !(source < ctx->sentinel && target < ctx->tsentinel)) + ABORT; + + source_fork = source; + target_fork = target; + + if (!IMATCH(line, &source, &target, ctx)) { + source = source_fork; + target = target_fork; + + if (!IMATCH(letter, &source, &target, ctx) + || !(source < ctx->sentinel && target < ctx->tsentinel)) + ABORT; + } + + next = skip_space(source, ctx); + if (!(next < ctx->sentinel && target < ctx->tsentinel + && (*next == U('{') || *next == U(',')))) + ABORT; + + *target++ = U(' '); + *target_ = target; + *source_ = source; + (void)copy_space_optional(source_, target_, ctx); +} + + +/* + * Copy IE7 hack + */ +static void +copy_ie7hack(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx) +{ + const rchar *source = *source_; + rchar *target = *target_; + + *target++ = U('>'); + *target_ = target; + + if (ctx->in_rule || ctx->at_group) + return; /* abort */ + + if (!MATCH(ie7, &source, &target, ctx)) + ABORT; + + ctx->in_macie5 = 0; + + *target_ = target; + *source_ = source; + + (void)copy_space_optional(source_, target_, ctx); +} + + +/* + * Copy semicolon; miss out duplicates or even this one (before '}') + */ +static void +copy_semicolon(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx) +{ + const rchar *source = *source_, *begin, *end; + rchar *target = *target_; + + begin = source; + while (source < ctx->sentinel) { + end = skip_space(source, ctx); + if (!(end < ctx->sentinel)) { + if (!(target < ctx->tsentinel)) + ABORT; + *target++ = U(';'); + break; + } + switch (*end) { + case U(';'): + source = end + 1; + continue; + + case U('}'): + if (ctx->in_rule) + break; + + /* fall through */ + default: + if (!(target < ctx->tsentinel)) + ABORT; + *target++ = U(';'); + break; + } + + break; + } + + source = begin; + *target_ = target; + while (source < ctx->sentinel) { + if (*source == U(';')) { + ++source; + continue; + } + + if (copy_space_optional(&source, target_, ctx) == 0) + continue; + + break; + } + + *source_ = source; +} + + +/* + * Main function + * + * The return value determines the result length (kept in the target buffer). + * However, if the target buffer is too small, the return value is greater + * than tlength. The difference to tlength is the number of unconsumed source + * characters at the time the buffer was full. In this case you should resize + * the target buffer to the return value and call rcssmin again. Repeat as + * often as needed. + */ +static Py_ssize_t +rcssmin(const rchar *source, rchar *target, Py_ssize_t slength, + Py_ssize_t tlength, int keep_bang_comments) +{ + rcssmin_ctx_t ctx_, *ctx = &ctx_; + const rchar *tstart = target; + rchar c; + + ctx->start = source; + ctx->sentinel = source + slength; + ctx->tsentinel = target + tlength; + ctx->at_group = 0; + ctx->in_macie5 = 0; + ctx->in_rule = 0; + ctx->keep_bang_comments = keep_bang_comments; + + while (source < ctx->sentinel && target < ctx->tsentinel) { + c = *source++; + if (RCSSMIN_IS_DULL(c)) { + *target++ = c; + continue; + } + else if (RCSSMIN_IS_SPACE(c)) { + copy_space(&source, &target, ctx, NEED_SPACE_MAYBE); + continue; + } + + switch (c) { + + /* Escape */ + case U('\\'): + copy_escape(&source, &target, ctx); + continue; + + /* String */ + case U('"'): case U('\''): + copy_string(&source, &target, ctx); + continue; + + /* URL */ + case U('u'): + copy_url(&source, &target, ctx); + continue; + + /* IE7hack */ + case U('>'): + copy_ie7hack(&source, &target, ctx); + continue; + + /* @-group */ + case U('@'): + copy_at_group(&source, &target, ctx); + continue; + + /* ; */ + case U(';'): + copy_semicolon(&source, &target, ctx); + continue; + + /* :first-line|letter followed by [{,] */ + /* (apparently needed for IE6) */ + case U(':'): + copy_first(&source, &target, ctx); + continue; + + /* { */ + case U('{'): + if (ctx->at_group) + --ctx->at_group; + else + ++ctx->in_rule; + *target++ = c; + continue; + + /* } */ + case U('}'): + if (ctx->in_rule) + --ctx->in_rule; + *target++ = c; + continue; + + /* space starting with comment */ + case U('/'): + (void)copy_space_comment(&source, &target, ctx, NEED_SPACE_MAYBE); + continue; + + /* Fallback: copy character. Better safe than sorry. Should not be + * reached, though */ + default: + *target++ = c; + continue; + } + } + + return + (Py_ssize_t)(target - tstart) + (Py_ssize_t)(ctx->sentinel - source); +} + + +PyDoc_STRVAR(rcssmin_cssmin__doc__, +"cssmin(style, keep_bang_comments=False)\n\ +\n\ +Minify CSS.\n\ +\n\ +:Note: This is a hand crafted C implementation built on the regex\n\ + semantics.\n\ +\n\ +:Parameters:\n\ + `style` : ``str``\n\ + CSS to minify\n\ +\n\ +:Return: Minified style\n\ +:Rtype: ``str``"); + +static PyObject * +rcssmin_cssmin(PyObject *self, PyObject *args, PyObject *kwds) +{ + PyObject *style, *keep_bang_comments_ = NULL, *result; + static char *kwlist[] = {"style", "keep_bang_comments", NULL}; + Py_ssize_t rlength, slength, length; + int keep_bang_comments; +#ifdef EXT2 + int uni; +#define UOBJ "O" +#endif +#ifdef EXT3 +#define UOBJ "U" +#endif + + if (!PyArg_ParseTupleAndKeywords(args, kwds, UOBJ "|O", kwlist, + &style, &keep_bang_comments_)) + return NULL; + + if (!keep_bang_comments_) + keep_bang_comments = 0; + else { + keep_bang_comments = PyObject_IsTrue(keep_bang_comments_); + if (keep_bang_comments == -1) + return NULL; + } + +#ifdef EXT2 + if (PyUnicode_Check(style)) { + if (!(style = PyUnicode_AsUTF8String(style))) + return NULL; + uni = 1; + } + else { + if (!(style = PyObject_Str(style))) + return NULL; + uni = 0; + } +#endif + +#ifdef EXT3 + Py_INCREF(style); +#define PyString_GET_SIZE PyUnicode_GET_SIZE +#define PyString_AS_STRING PyUnicode_AS_UNICODE +#define _PyString_Resize PyUnicode_Resize +#define PyString_FromStringAndSize PyUnicode_FromUnicode +#endif + + rlength = slength = PyString_GET_SIZE(style); + +again: + if (!(result = PyString_FromStringAndSize(NULL, rlength))) { + Py_DECREF(style); + return NULL; + } + Py_BEGIN_ALLOW_THREADS + length = rcssmin((rchar *)PyString_AS_STRING(style), + (rchar *)PyString_AS_STRING(result), + slength, rlength, keep_bang_comments); + Py_END_ALLOW_THREADS + + if (length > rlength) { + Py_DECREF(result); + rlength = length; + goto again; + } + + Py_DECREF(style); + if (length < 0) { + Py_DECREF(result); + return NULL; + } + if (length != rlength && _PyString_Resize(&result, length) == -1) + return NULL; + +#ifdef EXT2 + if (uni) { + style = PyUnicode_DecodeUTF8(PyString_AS_STRING(result), + PyString_GET_SIZE(result), "strict"); + Py_DECREF(result); + if (!style) + return NULL; + result = style; + } +#endif + return result; +} + +/* ------------------------ BEGIN MODULE DEFINITION ------------------------ */ + +EXT_METHODS = { + {"cssmin", + (PyCFunction)rcssmin_cssmin, METH_VARARGS | METH_KEYWORDS, + rcssmin_cssmin__doc__}, + + {NULL} /* Sentinel */ +}; + +PyDoc_STRVAR(EXT_DOCS_VAR, +"C implementation of rcssmin\n\ +===========================\n\ +\n\ +C implementation of rcssmin."); + + +EXT_DEFINE(EXT_MODULE_NAME, EXT_METHODS_VAR, EXT_DOCS_VAR); + +EXT_INIT_FUNC { + PyObject *m; + + /* Create the module and populate stuff */ + if (!(m = EXT_CREATE(&EXT_DEFINE_VAR))) + EXT_INIT_ERROR(NULL); + + EXT_ADD_UNICODE(m, "__author__", "Andr\xe9 Malo", "latin-1"); + EXT_ADD_STRING(m, "__docformat__", "restructuredtext en"); + + EXT_INIT_RETURN(m); +} + +/* ------------------------- END MODULE DEFINITION ------------------------- */ diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/rcssmin.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/rcssmin.py new file mode 100644 index 00000000000..ae1cefc3396 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/rcssmin.py @@ -0,0 +1,374 @@ +#!/usr/bin/env python +# -*- coding: ascii -*- +r""" +============== + CSS Minifier +============== + +CSS Minifier. + +The minifier is based on the semantics of the `YUI compressor`_\\, which +itself is based on `the rule list by Isaac Schlueter`_\\. + +:Copyright: + + Copyright 2011 - 2014 + Andr\xe9 Malo or his licensors, as applicable + +:License: + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +This module is a re-implementation aiming for speed instead of maximum +compression, so it can be used at runtime (rather than during a preprocessing +step). RCSSmin does syntactical compression only (removing spaces, comments +and possibly semicolons). It does not provide semantic compression (like +removing empty blocks, collapsing redundant properties etc). It does, however, +support various CSS hacks (by keeping them working as intended). + +Here's a feature list: + +- Strings are kept, except that escaped newlines are stripped +- Space/Comments before the very end or before various characters are + stripped: ``:{});=>+],!`` (The colon (``:``) is a special case, a single + space is kept if it's outside a ruleset.) +- Space/Comments at the very beginning or after various characters are + stripped: ``{}(=:>+[,!`` +- Optional space after unicode escapes is kept, resp. replaced by a simple + space +- whitespaces inside ``url()`` definitions are stripped +- Comments starting with an exclamation mark (``!``) can be kept optionally. +- All other comments and/or whitespace characters are replaced by a single + space. +- Multiple consecutive semicolons are reduced to one +- The last semicolon within a ruleset is stripped +- CSS Hacks supported: + + - IE7 hack (``>/**/``) + - Mac-IE5 hack (``/*\\*/.../**/``) + - The boxmodelhack is supported naturally because it relies on valid CSS2 + strings + - Between ``:first-line`` and the following comma or curly brace a space is + inserted. (apparently it's needed for IE6) + - Same for ``:first-letter`` + +rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to +factor 100 or so (depending on the input). docs/BENCHMARKS in the source +distribution contains the details. + +Both python 2 (>= 2.4) and python 3 are supported. + +.. _YUI compressor: https://github.com/yui/yuicompressor/ + +.. _the rule list by Isaac Schlueter: https://github.com/isaacs/cssmin/ +""" +if __doc__: + # pylint: disable = W0622 + __doc__ = __doc__.encode('ascii').decode('unicode_escape') +__author__ = r"Andr\xe9 Malo".encode('ascii').decode('unicode_escape') +__docformat__ = "restructuredtext en" +__license__ = "Apache License, Version 2.0" +__version__ = '1.0.5' +__all__ = ['cssmin'] + +import re as _re + + +def _make_cssmin(python_only=False): + """ + Generate CSS minifier. + + :Parameters: + `python_only` : ``bool`` + Use only the python variant. If true, the c extension is not even + tried to be loaded. + + :Return: Minifier + :Rtype: ``callable`` + """ + # pylint: disable = R0912, R0914, W0612 + + if not python_only: + try: + import _rcssmin + except ImportError: + pass + else: + return _rcssmin.cssmin + + nl = r'(?:[\n\f]|\r\n?)' # pylint: disable = C0103 + spacechar = r'[\r\n\f\040\t]' + + unicoded = r'[0-9a-fA-F]{1,6}(?:[\040\n\t\f]|\r\n?)?' + escaped = r'[^\n\r\f0-9a-fA-F]' + escape = r'(?:\\(?:%(unicoded)s|%(escaped)s))' % locals() + + nmchar = r'[^\000-\054\056\057\072-\100\133-\136\140\173-\177]' + #nmstart = r'[^\000-\100\133-\136\140\173-\177]' + #ident = (r'(?:' + # r'-?(?:%(nmstart)s|%(escape)s)%(nmchar)s*(?:%(escape)s%(nmchar)s*)*' + #r')') % locals() + + comment = r'(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)' + + # only for specific purposes. The bang is grouped: + _bang_comment = r'(?:/\*(!?)[^*]*\*+(?:[^/*][^*]*\*+)*/)' + + string1 = \ + r'(?:\047[^\047\\\r\n\f]*(?:\\[^\r\n\f][^\047\\\r\n\f]*)*\047)' + string2 = r'(?:"[^"\\\r\n\f]*(?:\\[^\r\n\f][^"\\\r\n\f]*)*")' + strings = r'(?:%s|%s)' % (string1, string2) + + nl_string1 = \ + r'(?:\047[^\047\\\r\n\f]*(?:\\(?:[^\r]|\r\n?)[^\047\\\r\n\f]*)*\047)' + nl_string2 = r'(?:"[^"\\\r\n\f]*(?:\\(?:[^\r]|\r\n?)[^"\\\r\n\f]*)*")' + nl_strings = r'(?:%s|%s)' % (nl_string1, nl_string2) + + uri_nl_string1 = r'(?:\047[^\047\\]*(?:\\(?:[^\r]|\r\n?)[^\047\\]*)*\047)' + uri_nl_string2 = r'(?:"[^"\\]*(?:\\(?:[^\r]|\r\n?)[^"\\]*)*")' + uri_nl_strings = r'(?:%s|%s)' % (uri_nl_string1, uri_nl_string2) + + nl_escaped = r'(?:\\%(nl)s)' % locals() + + space = r'(?:%(spacechar)s|%(comment)s)' % locals() + + ie7hack = r'(?:>/\*\*/)' + + uri = (r'(?:' + # noqa pylint: disable = C0330 + r'(?:[^\000-\040"\047()\\\177]*' + r'(?:%(escape)s[^\000-\040"\047()\\\177]*)*)' + r'(?:' + r'(?:%(spacechar)s+|%(nl_escaped)s+)' + r'(?:' + r'(?:[^\000-\040"\047()\\\177]|%(escape)s|%(nl_escaped)s)' + r'[^\000-\040"\047()\\\177]*' + r'(?:%(escape)s[^\000-\040"\047()\\\177]*)*' + r')+' + r')*' + r')') % locals() + + nl_unesc_sub = _re.compile(nl_escaped).sub + + uri_space_sub = _re.compile(( + r'(%(escape)s+)|%(spacechar)s+|%(nl_escaped)s+' + ) % locals()).sub + uri_space_subber = lambda m: m.groups()[0] or '' + + space_sub_simple = _re.compile(( + r'[\r\n\f\040\t;]+|(%(comment)s+)' + ) % locals()).sub + space_sub_banged = _re.compile(( + r'[\r\n\f\040\t;]+|(%(_bang_comment)s+)' + ) % locals()).sub + + post_esc_sub = _re.compile(r'[\r\n\f\t]+').sub + + main_sub = _re.compile(( + # noqa pylint: disable = C0330 + r'([^\\"\047u>@\r\n\f\040\t/;:{}]+)' + r'|(?<=[{}(=:>+[,!])(%(space)s+)' + r'|^(%(space)s+)' + r'|(%(space)s+)(?=(([:{});=>+\],!])|$)?)' + r'|;(%(space)s*(?:;%(space)s*)*)(?=(\})?)' + r'|(\{)' + r'|(\})' + r'|(%(strings)s)' + r'|(?<!%(nmchar)s)url\(%(spacechar)s*(' + r'%(uri_nl_strings)s' + r'|%(uri)s' + r')%(spacechar)s*\)' + r'|(@(?:' + r'[mM][eE][dD][iI][aA]' + r'|[sS][uU][pP][pP][oO][rR][tT][sS]' + r'|[dD][oO][cC][uU][mM][eE][nN][tT]' + r'|(?:-(?:' + r'[wW][eE][bB][kK][iI][tT]|[mM][oO][zZ]|[oO]|[mM][sS]' + r')-)?' + r'[kK][eE][yY][fF][rR][aA][mM][eE][sS]' + r'))(?!%(nmchar)s)' + r'|(%(ie7hack)s)(%(space)s*)' + r'|(:[fF][iI][rR][sS][tT]-[lL]' + r'(?:[iI][nN][eE]|[eE][tT][tT][eE][rR]))' + r'(%(space)s*)(?=[{,])' + r'|(%(nl_strings)s)' + r'|(%(escape)s[^\\"\047u>@\r\n\f\040\t/;:{}]*)' + ) % locals()).sub + + #print main_sub.__self__.pattern + + def main_subber(keep_bang_comments): + """ Make main subber """ + in_macie5, in_rule, at_group = [0], [0], [0] + + if keep_bang_comments: + space_sub = space_sub_banged + + def space_subber(match): + """ Space|Comment subber """ + if match.lastindex: + group1, group2 = match.group(1, 2) + if group2: + if group1.endswith(r'\*/'): + in_macie5[0] = 1 + else: + in_macie5[0] = 0 + return group1 + elif group1: + if group1.endswith(r'\*/'): + if in_macie5[0]: + return '' + in_macie5[0] = 1 + return r'/*\*/' + elif in_macie5[0]: + in_macie5[0] = 0 + return '/**/' + return '' + else: + space_sub = space_sub_simple + + def space_subber(match): + """ Space|Comment subber """ + if match.lastindex: + if match.group(1).endswith(r'\*/'): + if in_macie5[0]: + return '' + in_macie5[0] = 1 + return r'/*\*/' + elif in_macie5[0]: + in_macie5[0] = 0 + return '/**/' + return '' + + def fn_space_post(group): + """ space with token after """ + if group(5) is None or ( + group(6) == ':' and not in_rule[0] and not at_group[0]): + return ' ' + space_sub(space_subber, group(4)) + return space_sub(space_subber, group(4)) + + def fn_semicolon(group): + """ ; handler """ + return ';' + space_sub(space_subber, group(7)) + + def fn_semicolon2(group): + """ ; handler """ + if in_rule[0]: + return space_sub(space_subber, group(7)) + return ';' + space_sub(space_subber, group(7)) + + def fn_open(_): + """ { handler """ + if at_group[0]: + at_group[0] -= 1 + else: + in_rule[0] = 1 + return '{' + + def fn_close(_): + """ } handler """ + in_rule[0] = 0 + return '}' + + def fn_at_group(group): + """ @xxx group handler """ + at_group[0] += 1 + return group(13) + + def fn_ie7hack(group): + """ IE7 Hack handler """ + if not in_rule[0] and not at_group[0]: + in_macie5[0] = 0 + return group(14) + space_sub(space_subber, group(15)) + return '>' + space_sub(space_subber, group(15)) + + table = ( + # noqa pylint: disable = C0330 + None, + None, + None, + None, + fn_space_post, # space with token after + fn_space_post, # space with token after + fn_space_post, # space with token after + fn_semicolon, # semicolon + fn_semicolon2, # semicolon + fn_open, # { + fn_close, # } + lambda g: g(11), # string + lambda g: 'url(%s)' % uri_space_sub(uri_space_subber, g(12)), + # url(...) + fn_at_group, # @xxx expecting {...} + None, + fn_ie7hack, # ie7hack + None, + lambda g: g(16) + ' ' + space_sub(space_subber, g(17)), + # :first-line|letter followed + # by [{,] (apparently space + # needed for IE6) + lambda g: nl_unesc_sub('', g(18)), # nl_string + lambda g: post_esc_sub(' ', g(19)), # escape + ) + + def func(match): + """ Main subber """ + idx, group = match.lastindex, match.group + if idx > 3: + return table[idx](group) + + # shortcuts for frequent operations below: + elif idx == 1: # not interesting + return group(1) + #else: # space with token before or at the beginning + return space_sub(space_subber, group(idx)) + + return func + + def cssmin(style, keep_bang_comments=False): # pylint: disable = W0621 + """ + Minify CSS. + + :Parameters: + `style` : ``str`` + CSS to minify + + `keep_bang_comments` : ``bool`` + Keep comments starting with an exclamation mark? (``/*!...*/``) + + :Return: Minified style + :Rtype: ``str`` + """ + return main_sub(main_subber(keep_bang_comments), style) + + return cssmin + +cssmin = _make_cssmin() + + +if __name__ == '__main__': + def main(): + """ Main """ + import sys as _sys + keep_bang_comments = ( + '-b' in _sys.argv[1:] + or '-bp' in _sys.argv[1:] + or '-pb' in _sys.argv[1:] + ) + if '-p' in _sys.argv[1:] or '-bp' in _sys.argv[1:] \ + or '-pb' in _sys.argv[1:]: + global cssmin # pylint: disable = W0603 + cssmin = _make_cssmin(python_only=True) + _sys.stdout.write(cssmin( + _sys.stdin.read(), keep_bang_comments=keep_bang_comments + )) + main() diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/run_tests.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/run_tests.py new file mode 100755 index 00000000000..9128d743586 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/run_tests.py @@ -0,0 +1,166 @@ +#!/usr/bin/env python +# -*- coding: ascii -*- +# +# Copyright 2014 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +=========== + Run tests +=========== + +Run tests. +""" +__author__ = "Andr\xe9 Malo" +__author__ = getattr(__author__, 'decode', lambda x: __author__)('latin-1') +__docformat__ = "restructuredtext en" + +import os as _os +import re as _re +import sys as _sys + +from _setup import shell +from _setup import term + + +def run_tests(basedir, libdir): + """ Run output based tests """ + import rcssmin as _rcssmin + py_cssmin = _rcssmin._make_cssmin(python_only=True) + c_cssmin = _rcssmin._make_cssmin(python_only=False) + + def run_test(example, output_file): + """ Run it """ + try: + fp = open(example, 'r') + except IOError: + return + else: + try: + input = fp.read() + finally: + fp.close() + + def load_output(filename): + try: + fp = open(filename, 'r') + except IOError: + return None + else: + try: + output = fp.read() + finally: + fp.close() + output = output.strip() + if _re.search(r'(?<!\\)(?:\\\\)*\\[0-9a-zA-Z]{1,6}$', output): + output += ' ' + return output + + output = load_output(output_file) + output_b = load_output(output_file + '.b') + + def do_test(cssmin, output, **options): + try: + genout = cssmin(input, **options) + except (KeyboardInterrupt, SystemExit): + raise + except: + return 1, "%(RED)s exc%(NORMAL)s " + else: + if output is None: + return 1, "%(RED)smiss%(NORMAL)s " + elif genout == output or genout == output.rstrip(): + return 0, "%(GREEN)sOK%(NORMAL)s " + else: + return 1, "%(RED)sfail%(NORMAL)s " + + erred, out = do_test(py_cssmin, output) + erred, c_out = do_test(c_cssmin, output) + erred, out_b = do_test(py_cssmin, output_b, keep_bang_comments=True) + erred, c_out_b = do_test(c_cssmin, output_b, keep_bang_comments=True) + + term.write( + "%(out)s %(out_b)s | %(c_out)s %(c_out_b)s - %%(example)s\n" + % locals(), + example=_os.path.basename(example), + ) + return erred + + # end + # begin main test code + + erred = 0 + basedir = shell.native(basedir) + strip = len(basedir) - len(_os.path.basename(basedir)) + for dirname, dirs, files in shell.walk(basedir): + dirs[:] = [ + item for item in dirs if item not in ('.svn', '.git', 'out') + ] + dirs.sort() + files = [item for item in files if item.endswith('.css')] + if not files: + continue + if not _os.path.isdir(_os.path.join(basedir, dirname, 'out')): + continue + term.yellow("---> %s" % (dirname[strip:],)) + files.sort() + for filename in files: + if run_test( + _os.path.join(dirname, filename), + _os.path.join(dirname, 'out', filename[:-4] + '.out'), + ): erred = 1 + term.yellow("<--- %s" % (dirname[strip:],)) + return erred + + +def main(): + """ Main """ + basedir, libdir = None, None + accept_opts = True + args = [] + for arg in _sys.argv[1:]: + if accept_opts: + if arg == '--': + accept_opts = False + continue + elif arg == '-q': + term.write = term.green = term.red = term.yellow = \ + term.announce = \ + lambda fmt, **kwargs: None + continue + elif arg == '-p': + info = {} + for key in term.terminfo(): + info[key] = '' + info['ERASE'] = '\n' + term.terminfo.info = info + continue + elif arg.startswith('-'): + _sys.stderr.write("Unrecognized option %r\n" % (arg,)) + return 2 + args.append(arg) + if len(args) > 2: + _sys.stderr.write("Too many arguments\n") + return 2 + elif len(args) < 1: + _sys.stderr.write("Missing arguments\n") + return 2 + basedir = args[0] + if len(args) > 1: + libdir = args[1] + return run_tests(basedir, libdir) + + +if __name__ == '__main__': + _sys.exit(main()) diff --git a/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/setup.py b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/setup.py new file mode 100644 index 00000000000..d4ca570bf29 --- /dev/null +++ b/chromium/third_party/catapult/common/py_vulcanize/third_party/rcssmin/setup.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# -*- coding: ascii -*- +# +# Copyright 2006 - 2013 +# Andr\xe9 Malo or his licensors, as applicable +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys as _sys +from _setup import run + + +def setup(args=None, _manifest=0): + """ Main setup function """ + from _setup.ext import Extension + + if 'java' in _sys.platform.lower(): + # no c extension for jython + ext = None + else: + ext=[Extension('_rcssmin', sources=['rcssmin.c'])] + + return run(script_args=args, ext=ext, manifest_only=_manifest) + + +def manifest(): + """ Create List of packaged files """ + return setup((), _manifest=1) + + +if __name__ == '__main__': + setup() |