summaryrefslogtreecommitdiff
path: root/skins/vector
diff options
context:
space:
mode:
Diffstat (limited to 'skins/vector')
-rw-r--r--skins/vector/Makefile18
-rw-r--r--skins/vector/csshover.htc262
-rw-r--r--skins/vector/cssjanus/COPYING13
-rw-r--r--skins/vector/cssjanus/LICENSE202
-rw-r--r--skins/vector/cssjanus/README91
-rw-r--r--skins/vector/cssjanus/cssjanus.py574
-rw-r--r--skins/vector/cssjanus/csslex.py114
-rw-r--r--skins/vector/experiments/babaco-colors-a.css109
-rw-r--r--skins/vector/experiments/babaco-colors-b.css67
-rw-r--r--skins/vector/experiments/babaco-colors-c.css91
-rw-r--r--skins/vector/experiments/images/new-border.pngbin0 -> 124 bytes
-rw-r--r--skins/vector/experiments/images/new-portal-break-ltr.pngbin0 -> 891 bytes
-rw-r--r--skins/vector/experiments/images/new-portal-break-rtl.pngbin0 -> 891 bytes
-rw-r--r--skins/vector/experiments/images/page-base-fade.pngbin0 -> 306 bytes
-rw-r--r--skins/vector/experiments/images/page-base-updated.pngbin0 -> 124 bytes
-rw-r--r--skins/vector/experiments/images/tab-active-first.pngbin0 -> 981 bytes
-rw-r--r--skins/vector/experiments/images/tab-active-last.pngbin0 -> 980 bytes
-rw-r--r--skins/vector/experiments/images/tab-fade.pngbin0 -> 226 bytes
-rw-r--r--skins/vector/experiments/images/tab-first.pngbin0 -> 1057 bytes
-rw-r--r--skins/vector/experiments/images/tab-last.pngbin0 -> 1057 bytes
-rw-r--r--skins/vector/experiments/images/tab-new-fade.pngbin0 -> 216 bytes
-rw-r--r--skins/vector/experiments/new-tabs.css322
-rw-r--r--skins/vector/images/arrow-down-icon.pngbin0 -> 181 bytes
-rw-r--r--skins/vector/images/audio-icon.pngbin0 -> 345 bytes
-rw-r--r--skins/vector/images/border.pngbin0 -> 119 bytes
-rw-r--r--skins/vector/images/bullet-icon.pngbin0 -> 152 bytes
-rw-r--r--skins/vector/images/document-icon.pngbin0 -> 345 bytes
-rw-r--r--skins/vector/images/edit-icon.pngbin0 -> 358 bytes
-rw-r--r--skins/vector/images/external-link-ltr-icon.pngbin0 -> 279 bytes
-rw-r--r--skins/vector/images/external-link-rtl-icon.pngbin0 -> 277 bytes
-rw-r--r--skins/vector/images/file-icon.pngbin0 -> 402 bytes
-rw-r--r--skins/vector/images/link-icon.pngbin0 -> 429 bytes
-rw-r--r--skins/vector/images/lock-icon.pngbin0 -> 370 bytes
-rw-r--r--skins/vector/images/magnify-clip.pngbin0 -> 204 bytes
-rw-r--r--skins/vector/images/mail-icon.pngbin0 -> 375 bytes
-rw-r--r--skins/vector/images/news-icon.pngbin0 -> 359 bytes
-rw-r--r--skins/vector/images/page-base.pngbin0 -> 119 bytes
-rw-r--r--skins/vector/images/page-fade.pngbin0 -> 253 bytes
-rw-r--r--skins/vector/images/portal-break-ltr.pngbin0 -> 287 bytes
-rw-r--r--skins/vector/images/portal-break-rtl.pngbin0 -> 280 bytes
-rw-r--r--skins/vector/images/portal-break.pngbin0 -> 242 bytes
-rw-r--r--skins/vector/images/preferences-base.pngbin0 -> 119 bytes
-rw-r--r--skins/vector/images/preferences-break.pngbin0 -> 286 bytes
-rw-r--r--skins/vector/images/preferences-edge.pngbin0 -> 119 bytes
-rw-r--r--skins/vector/images/preferences-fade.pngbin0 -> 248 bytes
-rw-r--r--skins/vector/images/search-fade.pngbin0 -> 185 bytes
-rw-r--r--skins/vector/images/search-ltr.pngbin0 -> 214 bytes
-rw-r--r--skins/vector/images/search-rtl.pngbin0 -> 214 bytes
-rw-r--r--skins/vector/images/tab-break.pngbin0 -> 263 bytes
-rw-r--r--skins/vector/images/tab-current-fade.pngbin0 -> 121 bytes
-rw-r--r--skins/vector/images/tab-normal-fade.pngbin0 -> 254 bytes
-rw-r--r--skins/vector/images/talk-icon.pngbin0 -> 377 bytes
-rw-r--r--skins/vector/images/user-icon.pngbin0 -> 345 bytes
-rw-r--r--skins/vector/images/video-icon.pngbin0 -> 395 bytes
-rw-r--r--skins/vector/images/watch-icon-loading.gifbin0 -> 840 bytes
-rw-r--r--skins/vector/images/watch-icons.pngbin0 -> 1745 bytes
-rw-r--r--skins/vector/main-ltr.css1128
-rw-r--r--skins/vector/main-rtl.css1128
-rw-r--r--skins/vector/wiki-indexed.pngbin0 -> 8205 bytes
-rw-r--r--skins/vector/wiki.pngbin0 -> 22987 bytes
60 files changed, 4119 insertions, 0 deletions
diff --git a/skins/vector/Makefile b/skins/vector/Makefile
new file mode 100644
index 00000000..74e36c45
--- /dev/null
+++ b/skins/vector/Makefile
@@ -0,0 +1,18 @@
+#
+# Handy makefile to build the RTL variant with cssjanus
+#
+
+all: main-rtl.css
+
+main-rtl.css: main-ltr.css cssjanus/cssjanus.py
+ python cssjanus/cssjanus.py --swap_ltr_rtl_in_url < main-ltr.css > main-rtl.css
+
+# SVN version is broken; checking in our own.
+#cssjanus/cssjanus.py:
+# svn co http://cssjanus.googlecode.com/svn/trunk cssjanus
+
+#distclean: clean
+# rm -rf cssjanus
+
+clean:
+ rm -f main-rtl.css
diff --git a/skins/vector/csshover.htc b/skins/vector/csshover.htc
new file mode 100644
index 00000000..a88fa08d
--- /dev/null
+++ b/skins/vector/csshover.htc
@@ -0,0 +1,262 @@
+<public:attach event="ondocumentready" onevent="CSSHover()" />
+<script>
+// <![CDATA[
+/**
+ * Whatever:hover - V3.00.081222
+ * ------------------------------------------------------------
+ * Author - Peter Nederlof, http://www.xs4all.nl/~peterned
+ * License - http://creativecommons.org/licenses/LGPL/2.1
+ *
+ * Whatever:hover is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Whatever:hover is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * howto: body { behavior:url("csshover3.htc"); }
+ * ------------------------------------------------------------
+ */
+
+window.CSSHover = (function(){
+
+ // regular expressions, used and explained later on.
+ var REG_INTERACTIVE = /(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i,
+ REG_AFFECTED = /(.*?)\:(hover|active|focus)/i,
+ REG_PSEUDO = /[^:]+:([a-z-]+).*/i,
+ REG_SELECT = /(\.([a-z0-9_-]+):[a-z]+)|(:[a-z]+)/gi,
+ REG_CLASS = /\.([a-z0-9_-]*on(hover|active|focus))/i,
+ REG_MSIE = /msie (5|6|7)/i,
+ REG_COMPAT = /backcompat/i;
+
+ // css prefix, a leading dash would be nice (spec), but IE6 doesn't like that.
+ var CSSHOVER_PREFIX = 'csh-';
+
+ /**
+ * Local CSSHover object
+ * --------------------------
+ */
+
+ var CSSHover = {
+
+ // array of CSSHoverElements, used to unload created events
+ elements: [],
+
+ // buffer used for checking on duplicate expressions
+ callbacks: {},
+
+ // init, called once ondomcontentready via the exposed window.CSSHover function
+ init:function() {
+ // don't run in IE8 standards; expressions don't work in standards mode anyway,
+ // and the stuff we're trying to fix should already work properly
+ if(!REG_MSIE.test(navigator.userAgent) && !REG_COMPAT.test(window.document.compatMode)) return;
+
+ // start parsing the existing stylesheets
+ var sheets = window.document.styleSheets, l = sheets.length;
+ for(var i=0; i<l; i++) {
+ this.parseStylesheet(sheets[i]);
+ }
+ },
+
+ // called from init, parses individual stylesheets
+ parseStylesheet:function(sheet) {
+ // check sheet imports and parse those recursively
+ if(sheet.imports) {
+ try {
+ var imports = sheet.imports, l = imports.length;
+ for(var i=0; i<l; i++) {
+ this.parseStylesheet(sheet.imports[i]);
+ }
+ } catch(securityException){
+ // trycatch for various possible errors,
+ // todo; might need to be placed inside the for loop, since an error
+ // on an import stops following imports from being processed.
+ }
+ }
+
+ // interate the sheet's rules and send them to the parser
+ try {
+ var rules = sheet.rules, l = rules.length;
+ for(var j=0; j<l; j++) {
+ this.parseCSSRule(rules[j], sheet);
+ }
+ } catch(securityException){
+ // trycatch for various errors, most likely accessing the sheet's rules,
+ // don't see how individual rules would throw errors, but you never know.
+ }
+ },
+
+ // magic starts here ...
+ parseCSSRule:function(rule, sheet) {
+
+ // The sheet is used to insert new rules into, this must be the same sheet the rule
+ // came from, to ensure that relative paths keep pointing to the right location.
+
+ // only parse a rule if it contains an interactive pseudo.
+ var select = rule.selectorText;
+ if(REG_INTERACTIVE.test(select)) {
+ var style = rule.style.cssText,
+
+ // affected elements are found by truncating the selector after the interactive pseudo,
+ // eg: "div li:hover" >> "div li"
+ affected = REG_AFFECTED.exec(select)[1],
+
+ // that pseudo is needed for a classname, and defines the type of interaction (focus, hover, active)
+ // eg: "li:hover" >> "onhover"
+ pseudo = select.replace(REG_PSEUDO, 'on$1'),
+
+ // the new selector is going to use that classname in a new css rule,
+ // since IE6 doesn't support multiple classnames, this is merged into one classname
+ // eg: "li:hover" >> "li.onhover", "li.folder:hover" >> "li.folderonhover"
+ newSelect = select.replace(REG_SELECT, '.$2' + pseudo),
+
+ // the classname is needed for the events that are going to be set on affected nodes
+ // eg: "li.folder:hover" >> "folderonhover"
+ className = REG_CLASS.exec(newSelect)[1];
+
+ // no need to set the same callback more than once when the same selector uses the same classname
+ var hash = affected + className;
+ if(!this.callbacks[hash]) {
+
+ // affected elements are given an expression under a fake css property, the classname is used
+ // because a unique name (eg "behavior:") would be overruled (in IE6, not 7) by a following rule
+ // selecting the same element. The expression does a callback to CSSHover.patch, rerouted via the
+ // exposed window.CSSHover function.
+
+ // because the expression is added to the stylesheet, and styles are always applied to html that is
+ // dynamically added to the dom, the expression will also trigger for those new elements (provided
+ // they are selected by the affected selector).
+
+ sheet.addRule(affected, CSSHOVER_PREFIX + className + ':expression(CSSHover(this, "'+pseudo+'", "'+className+'"))');
+
+ // hash it, so an identical selector/class combo does not duplicate the expression
+ this.callbacks[hash] = true;
+ }
+
+ // duplicate expressions need not be set, but the style could differ
+ sheet.addRule(newSelect, style);
+ }
+ },
+
+ // called via the expression, patches individual nodes
+ patch:function(node, type, className) {
+
+ // the patch's type is returned to the expression. That way the expression property
+ // can be found and removed, to stop it from calling patch over and over.
+ // The if will fail the first time, since the expression has not yet received a value.
+ var property = CSSHOVER_PREFIX + className;
+ if(node.style[property]) {
+ node.style[property] = null;
+ }
+
+ // just to make sure, also keep track of patched classnames locally on the node
+ if(!node.csshover) node.csshover = [];
+
+ // and check for it to prevent duplicate events with the same classname from being set
+ if(!node.csshover[className]) {
+ node.csshover[className] = true;
+
+ // create an instance for the given type and class
+ var element = new CSSHoverElement(node, type, className);
+
+ // and store that instance for unloading later on
+ this.elements.push(element);
+ }
+
+ // returns a dummy value to the expression
+ return type;
+ },
+
+ // unload stuff onbeforeunload
+ unload:function() {
+ try {
+
+ // remove events
+ var l = this.elements.length;
+ for(var i=0; i<l; i++) {
+ this.elements[i].unload();
+ }
+
+ // and set properties to null
+ this.elements = [];
+ this.callbacks = {};
+
+ } catch (e) {
+ }
+ }
+ };
+
+ // add the unload to the onbeforeunload event
+ window.attachEvent('onbeforeunload', function(){
+ CSSHover.unload();
+ });
+
+ /**
+ * CSSHoverElement
+ * --------------------------
+ */
+
+ // the event types associated with the interactive pseudos
+ var CSSEvents = {
+ onhover: { activator: 'onmouseenter', deactivator: 'onmouseleave' },
+ onactive: { activator: 'onmousedown', deactivator: 'onmouseup' },
+ onfocus: { activator: 'onfocus', deactivator: 'onblur' }
+ };
+
+ // CSSHoverElement constructor, called via CSSHover.patch
+ function CSSHoverElement(node, type, className) {
+
+ // the CSSHoverElement patches individual nodes by manually applying the events that should
+ // have fired by the css pseudoclasses, eg mouseenter and mouseleave for :hover.
+
+ this.node = node;
+ this.type = type;
+ var replacer = new RegExp('(^|\\s)'+className+'(\\s|$)', 'g');
+
+ // store event handlers for removal onunload
+ this.activator = function(){ node.className += ' ' + className; };
+ this.deactivator = function(){ node.className = node.className.replace(replacer, ' '); };
+
+ // add the events
+ node.attachEvent(CSSEvents[type].activator, this.activator);
+ node.attachEvent(CSSEvents[type].deactivator, this.deactivator);
+ }
+
+ CSSHoverElement.prototype = {
+ // onbeforeunload, called via CSSHover.unload
+ unload:function() {
+
+ // remove events
+ this.node.detachEvent(CSSEvents[this.type].activator, this.activator);
+ this.node.detachEvent(CSSEvents[this.type].deactivator, this.deactivator);
+
+ // and set properties to null
+ this.activator = null;
+ this.deactivator = null;
+ this.node = null;
+ this.type = null;
+ }
+ };
+
+ /**
+ * Public hook
+ * --------------------------
+ */
+
+ return function(node, type, className) {
+ if(node) {
+ // called via the css expression; patches individual nodes
+ return CSSHover.patch(node, type, className);
+ } else {
+ // called ondomcontentready via the public:attach node
+ CSSHover.init();
+ }
+ };
+
+})();
+
+// ]]>
+</script> \ No newline at end of file
diff --git a/skins/vector/cssjanus/COPYING b/skins/vector/cssjanus/COPYING
new file mode 100644
index 00000000..3f2c8953
--- /dev/null
+++ b/skins/vector/cssjanus/COPYING
@@ -0,0 +1,13 @@
+ Copyright 2008 Google Inc.
+
+ 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/skins/vector/cssjanus/LICENSE b/skins/vector/cssjanus/LICENSE
new file mode 100644
index 00000000..d6456956
--- /dev/null
+++ b/skins/vector/cssjanus/LICENSE
@@ -0,0 +1,202 @@
+
+ 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/skins/vector/cssjanus/README b/skins/vector/cssjanus/README
new file mode 100644
index 00000000..9b922156
--- /dev/null
+++ b/skins/vector/cssjanus/README
@@ -0,0 +1,91 @@
+=CSSJanus=
+
+_Flips CSS from LTR to an RTL orienation and vice-versa_
+
+Author: `Lindsey Simon <elsigh@google.com>`
+
+==Introduction==
+
+CSSJanus is CSS parser utility designed to aid the conversion of a website's
+layout from left-to-right(LTR) to right-to-left(RTL). The script was born out of
+a need to convert CSS for RTL languages when tables are not being used for layout (since tables will automatically reorder TD's in RTL).
+CSSJanus will change most of the obvious CSS property names and their values as
+well as some not-so-obvious ones (cursor, background-position %, etc...).
+The script is designed to offer flexibility to account for cases when you do
+not want to change certain rules which exist to account for bidirectional text
+display bugs, as well as situations where you may or may not want to flip annotations inside of the background url string.
+Note that you can disable CSSJanus from running on an entire class or any
+rule within a class by prepending a /* @noflip */ comment before the rule(s)
+you want CSSJanus to ignore.
+
+CSSJanus itself is not always enough to make a website that works in a LTR
+language context work in a RTL language all the way, but it is a start.
+
+==Getting the code==
+
+View the trunk at:
+
+ http://cssjanus.googlecode.com/svn/trunk/
+
+Check out the latest development version anonymously with:
+
+{{{
+ $ svn checkout http://cssjanus.googlecode.com/svn/trunk/ cssjanus
+}}}
+
+==Using==
+
+Usage:
+ ./cssjanus.py < file.css > file-rtl.css
+Flags:
+ --swap_left_right_in_url: Fixes "left"/"right" string within urls.
+ Ex: ./cssjanus.py --swap_left_right_in_url < file.css > file_rtl.css
+ --swap_ltr_rtl_in_url: Fixes "ltr"/"rtl" string within urls.
+ Ex: ./cssjanus.py --swap_ltr_rtl_in_url < file.css > file_rtl.css
+
+If you'd like to make use of the webapp version of cssjanus, you'll need to
+download the Google App Engine SDK
+ http://code.google.com/appengine/downloads.html
+and also drop a "django" directory into this directory, with the latest svn
+from django. You should be good to go with that setup. Please let me know
+otherwise.
+
+==Bugs, Patches==
+
+Patches and bug reports are welcome, just please keep the style
+consistent with the original source. If you find a bug, please include a diff
+of cssjanus_test.py with the bug included as a new unit test which fails. It
+will make understanding and fixing the bug easier.
+
+==Todo==
+
+* Include some helpers for some typical bidi text solutions?
+* Aural CSS (azimuth) swapping?
+
+==Contributors==
+
+Additional thanks to Mike Samuel for his work on csslex.py, Andy Perelson for
+his help coding and reviewing, Stephen Zabel for his help with i18n and my sanity,
+and to Eric Meyer for his thoughtful input.
+Thanks to Junyu Wang for the Chinese translation.
+Thanks to Masashi Kawashima for the Japanese translation.
+Thanks to Taaryk Taar and Tariq Al-Omaireeni for an updated Arabic translation.
+Thanks to Jens Meiert for the German translation.
+
+==License==
+
+{{{
+ Copyright 2008 Google Inc. All Rights Reserved.
+
+ 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/skins/vector/cssjanus/cssjanus.py b/skins/vector/cssjanus/cssjanus.py
new file mode 100644
index 00000000..dd14bd58
--- /dev/null
+++ b/skins/vector/cssjanus/cssjanus.py
@@ -0,0 +1,574 @@
+#!/usr/bin/python
+#
+# Copyright 2008 Google Inc. All Rights Reserved.
+
+"""Converts a LeftToRight Cascading Style Sheet into a RightToLeft one.
+
+ This is a utility script for replacing "left" oriented things in a CSS file
+ like float, padding, margin with "right" oriented values.
+ It also does the opposite.
+ The goal is to be able to conditionally serve one large, cat'd, compiled CSS
+ file appropriate for LeftToRight oriented languages and RightToLeft ones.
+ This utility will hopefully help your structural layout done in CSS in
+ terms of its RTL compatibility. It will not help with some of the more
+ complicated bidirectional text issues.
+"""
+
+__author__ = 'elsigh@google.com (Lindsey Simon)'
+__version__ = '0.1'
+
+import logging
+import re
+import sys
+import getopt
+import os
+
+import csslex
+
+logging.getLogger().setLevel(logging.INFO)
+
+# Global for the command line flags.
+SWAP_LTR_RTL_IN_URL_DEFAULT = False
+SWAP_LEFT_RIGHT_IN_URL_DEFAULT = False
+FLAGS = {'swap_ltr_rtl_in_url': SWAP_LTR_RTL_IN_URL_DEFAULT,
+ 'swap_left_right_in_url': SWAP_LEFT_RIGHT_IN_URL_DEFAULT}
+
+# Generic token delimiter character.
+TOKEN_DELIMITER = '~'
+
+# This is a temporary match token we use when swapping strings.
+TMP_TOKEN = '%sTMP%s' % (TOKEN_DELIMITER, TOKEN_DELIMITER)
+
+# Token to be used for joining lines.
+TOKEN_LINES = '%sJ%s' % (TOKEN_DELIMITER, TOKEN_DELIMITER)
+
+# Global constant text strings for CSS value matches.
+LTR = 'ltr'
+RTL = 'rtl'
+LEFT = 'left'
+RIGHT = 'right'
+
+# This is a lookbehind match to ensure that we don't replace instances
+# of our string token (left, rtl, etc...) if there's a letter in front of it.
+# Specifically, this prevents replacements like 'background: url(bright.png)'.
+LOOKBEHIND_NOT_LETTER = r'(?<![a-zA-Z])'
+
+# This is a lookahead match to make sure we don't replace left and right
+# in actual classnames, so that we don't break the HTML/CSS dependencies.
+# Read literally, it says ignore cases where the word left, for instance, is
+# directly followed by valid classname characters and a curly brace.
+# ex: .column-left {float: left} will become .column-left {float: right}
+LOOKAHEAD_NOT_OPEN_BRACE = (r'(?!(?:%s|%s|%s|#|\:|\.|\,|\+|>)*?{)' %
+ (csslex.NMCHAR, TOKEN_LINES, csslex.SPACE))
+
+
+# These two lookaheads are to test whether or not we are within a
+# background: url(HERE) situation.
+# Ref: http://www.w3.org/TR/CSS21/syndata.html#uri
+VALID_AFTER_URI_CHARS = r'[\'\"]?%s' % csslex.WHITESPACE
+LOOKAHEAD_NOT_CLOSING_PAREN = r'(?!%s?%s\))' % (csslex.URL_CHARS,
+ VALID_AFTER_URI_CHARS)
+LOOKAHEAD_FOR_CLOSING_PAREN = r'(?=%s?%s\))' % (csslex.URL_CHARS,
+ VALID_AFTER_URI_CHARS)
+
+# Compile a regex to swap left and right values in 4 part notations.
+# We need to match negatives and decimal numeric values.
+# ex. 'margin: .25em -2px 3px 0' becomes 'margin: .25em 0 3px -2px'.
+POSSIBLY_NEGATIVE_QUANTITY = r'((?:-?%s)|(?:inherit|auto))' % csslex.QUANTITY
+POSSIBLY_NEGATIVE_QUANTITY_SPACE = r'%s%s%s' % (POSSIBLY_NEGATIVE_QUANTITY,
+ csslex.SPACE,
+ csslex.WHITESPACE)
+FOUR_NOTATION_QUANTITY_RE = re.compile(r'%s%s%s%s' %
+ (POSSIBLY_NEGATIVE_QUANTITY_SPACE,
+ POSSIBLY_NEGATIVE_QUANTITY_SPACE,
+ POSSIBLY_NEGATIVE_QUANTITY_SPACE,
+ POSSIBLY_NEGATIVE_QUANTITY),
+ re.I)
+COLOR = r'(%s|%s)' % (csslex.NAME, csslex.HASH)
+COLOR_SPACE = r'%s%s' % (COLOR, csslex.SPACE)
+FOUR_NOTATION_COLOR_RE = re.compile(r'(-color%s:%s)%s%s%s(%s)' %
+ (csslex.WHITESPACE,
+ csslex.WHITESPACE,
+ COLOR_SPACE,
+ COLOR_SPACE,
+ COLOR_SPACE,
+ COLOR),
+ re.I)
+
+# Compile the cursor resize regexes
+CURSOR_EAST_RE = re.compile(LOOKBEHIND_NOT_LETTER + '([ns]?)e-resize')
+CURSOR_WEST_RE = re.compile(LOOKBEHIND_NOT_LETTER + '([ns]?)w-resize')
+
+# Matches the condition where we need to replace the horizontal component
+# of a background-position value when expressed in horizontal percentage.
+# Had to make two regexes because in the case of position-x there is only
+# one quantity, and otherwise we don't want to match and change cases with only
+# one quantity.
+BG_HORIZONTAL_PERCENTAGE_RE = re.compile(r'background(-position)?(%s:%s)'
+ '([^%%]*?)(%s)%%'
+ '(%s(?:%s|%s))' % (csslex.WHITESPACE,
+ csslex.WHITESPACE,
+ csslex.NUM,
+ csslex.WHITESPACE,
+ csslex.QUANTITY,
+ csslex.IDENT))
+
+BG_HORIZONTAL_PERCENTAGE_X_RE = re.compile(r'background-position-x(%s:%s)'
+ '(%s)%%' % (csslex.WHITESPACE,
+ csslex.WHITESPACE,
+ csslex.NUM))
+
+# Matches the opening of a body selector.
+BODY_SELECTOR = r'body%s{%s' % (csslex.WHITESPACE, csslex.WHITESPACE)
+
+# Matches anything up until the closing of a selector.
+CHARS_WITHIN_SELECTOR = r'[^\}]*?'
+
+# Matches the direction property in a selector.
+DIRECTION_RE = r'direction%s:%s' % (csslex.WHITESPACE, csslex.WHITESPACE)
+
+# These allow us to swap "ltr" with "rtl" and vice versa ONLY within the
+# body selector and on the same line.
+BODY_DIRECTION_LTR_RE = re.compile(r'(%s)(%s)(%s)(ltr)' %
+ (BODY_SELECTOR, CHARS_WITHIN_SELECTOR,
+ DIRECTION_RE),
+ re.I)
+BODY_DIRECTION_RTL_RE = re.compile(r'(%s)(%s)(%s)(rtl)' %
+ (BODY_SELECTOR, CHARS_WITHIN_SELECTOR,
+ DIRECTION_RE),
+ re.I)
+
+
+# Allows us to swap "direction:ltr" with "direction:rtl" and
+# vice versa anywhere in a line.
+DIRECTION_LTR_RE = re.compile(r'%s(ltr)' % DIRECTION_RE)
+DIRECTION_RTL_RE = re.compile(r'%s(rtl)' % DIRECTION_RE)
+
+# We want to be able to switch left with right and vice versa anywhere
+# we encounter left/right strings, EXCEPT inside the background:url(). The next
+# two regexes are for that purpose. We have alternate IN_URL versions of the
+# regexes compiled in case the user passes the flag that they do
+# actually want to have left and right swapped inside of background:urls.
+LEFT_RE = re.compile('%s(%s)%s%s' % (LOOKBEHIND_NOT_LETTER,
+ LEFT,
+ LOOKAHEAD_NOT_CLOSING_PAREN,
+ LOOKAHEAD_NOT_OPEN_BRACE),
+ re.I)
+RIGHT_RE = re.compile('%s(%s)%s%s' % (LOOKBEHIND_NOT_LETTER,
+ RIGHT,
+ LOOKAHEAD_NOT_CLOSING_PAREN,
+ LOOKAHEAD_NOT_OPEN_BRACE),
+ re.I)
+LEFT_IN_URL_RE = re.compile('%s(%s)%s' % (LOOKBEHIND_NOT_LETTER,
+ LEFT,
+ LOOKAHEAD_FOR_CLOSING_PAREN),
+ re.I)
+RIGHT_IN_URL_RE = re.compile('%s(%s)%s' % (LOOKBEHIND_NOT_LETTER,
+ RIGHT,
+ LOOKAHEAD_FOR_CLOSING_PAREN),
+ re.I)
+LTR_IN_URL_RE = re.compile('%s(%s)%s' % (LOOKBEHIND_NOT_LETTER,
+ LTR,
+ LOOKAHEAD_FOR_CLOSING_PAREN),
+ re.I)
+RTL_IN_URL_RE = re.compile('%s(%s)%s' % (LOOKBEHIND_NOT_LETTER,
+ RTL,
+ LOOKAHEAD_FOR_CLOSING_PAREN),
+ re.I)
+
+COMMENT_RE = re.compile('(%s)' % csslex.COMMENT, re.I)
+
+NOFLIP_TOKEN = r'\@noflip'
+# The NOFLIP_TOKEN inside of a comment. For now, this requires that comments
+# be in the input, which means users of a css compiler would have to run
+# this script first if they want this functionality.
+NOFLIP_ANNOTATION = r'/\*%s%s%s\*/' % (csslex.WHITESPACE,
+ NOFLIP_TOKEN,
+ csslex. WHITESPACE)
+
+# After a NOFLIP_ANNOTATION, and within a class selector, we want to be able
+# to set aside a single rule not to be flipped. We can do this by matching
+# our NOFLIP annotation and then using a lookahead to make sure there is not
+# an opening brace before the match.
+NOFLIP_SINGLE_RE = re.compile(r'(%s%s[^;}]+;?)' % (NOFLIP_ANNOTATION,
+ LOOKAHEAD_NOT_OPEN_BRACE),
+ re.I)
+
+# After a NOFLIP_ANNOTATION, we want to grab anything up until the next } which
+# means the entire following class block. This will prevent all of its
+# declarations from being flipped.
+NOFLIP_CLASS_RE = re.compile(r'(%s%s})' % (NOFLIP_ANNOTATION,
+ CHARS_WITHIN_SELECTOR),
+ re.I)
+
+
+class Tokenizer:
+ """Replaces any CSS comments with string tokens and vice versa."""
+
+ def __init__(self, token_re, token_string):
+ """Constructor for the Tokenizer.
+
+ Args:
+ token_re: A regex for the string to be replace by a token.
+ token_string: The string to put between token delimiters when tokenizing.
+ """
+ logging.debug('Tokenizer::init token_string=%s' % token_string)
+ self.token_re = token_re
+ self.token_string = token_string
+ self.originals = []
+
+ def Tokenize(self, line):
+ """Replaces any string matching token_re in line with string tokens.
+
+ By passing a function as an argument to the re.sub line below, we bypass
+ the usual rule where re.sub will only replace the left-most occurrence of
+ a match by calling the passed in function for each occurrence.
+
+ Args:
+ line: A line to replace token_re matches in.
+
+ Returns:
+ line: A line with token_re matches tokenized.
+ """
+ line = self.token_re.sub(self.TokenizeMatches, line)
+ logging.debug('Tokenizer::Tokenize returns: %s' % line)
+ return line
+
+ def DeTokenize(self, line):
+ """Replaces tokens with the original string.
+
+ Args:
+ line: A line with tokens.
+
+ Returns:
+ line with any tokens replaced by the original string.
+ """
+
+ # Put all of the comments back in by their comment token.
+ for i, original in enumerate(self.originals):
+ token = '%s%s_%s%s' % (TOKEN_DELIMITER, self.token_string, i + 1,
+ TOKEN_DELIMITER)
+ line = line.replace(token, original)
+ logging.debug('Tokenizer::DeTokenize i:%s w/%s' % (i, token))
+ logging.debug('Tokenizer::DeTokenize returns: %s' % line)
+ return line
+
+ def TokenizeMatches(self, m):
+ """Replaces matches with tokens and stores the originals.
+
+ Args:
+ m: A match object.
+
+ Returns:
+ A string token which replaces the CSS comment.
+ """
+ logging.debug('Tokenizer::TokenizeMatches %s' % m.group(1))
+ self.originals.append(m.group(1))
+ return '%s%s_%s%s' % (TOKEN_DELIMITER,
+ self.token_string,
+ len(self.originals),
+ TOKEN_DELIMITER)
+
+
+def FixBodyDirectionLtrAndRtl(line):
+ """Replaces ltr with rtl and vice versa ONLY in the body direction.
+
+ Args:
+ line: A string to replace instances of ltr with rtl.
+ Returns:
+ line with direction: ltr and direction: rtl swapped only in body selector.
+ line = FixBodyDirectionLtrAndRtl('body { direction:ltr }')
+ line will now be 'body { direction:rtl }'.
+ """
+
+ line = BODY_DIRECTION_LTR_RE.sub('\\1\\2\\3%s' % TMP_TOKEN, line)
+ line = BODY_DIRECTION_RTL_RE.sub('\\1\\2\\3%s' % LTR, line)
+ line = line.replace(TMP_TOKEN, RTL)
+ logging.debug('FixBodyDirectionLtrAndRtl returns: %s' % line)
+ return line
+
+
+def FixLeftAndRight(line):
+ """Replaces left with right and vice versa in line.
+
+ Args:
+ line: A string in which to perform the replacement.
+
+ Returns:
+ line with left and right swapped. For example:
+ line = FixLeftAndRight('padding-left: 2px; margin-right: 1px;')
+ line will now be 'padding-right: 2px; margin-left: 1px;'.
+ """
+
+ line = LEFT_RE.sub(TMP_TOKEN, line)
+ line = RIGHT_RE.sub(LEFT, line)
+ line = line.replace(TMP_TOKEN, RIGHT)
+ logging.debug('FixLeftAndRight returns: %s' % line)
+ return line
+
+
+def FixLeftAndRightInUrl(line):
+ """Replaces left with right and vice versa ONLY within background urls.
+
+ Args:
+ line: A string in which to replace left with right and vice versa.
+
+ Returns:
+ line with left and right swapped in the url string. For example:
+ line = FixLeftAndRightInUrl('background:url(right.png)')
+ line will now be 'background:url(left.png)'.
+ """
+
+ line = LEFT_IN_URL_RE.sub(TMP_TOKEN, line)
+ line = RIGHT_IN_URL_RE.sub(LEFT, line)
+ line = line.replace(TMP_TOKEN, RIGHT)
+ logging.debug('FixLeftAndRightInUrl returns: %s' % line)
+ return line
+
+
+def FixLtrAndRtlInUrl(line):
+ """Replaces ltr with rtl and vice versa ONLY within background urls.
+
+ Args:
+ line: A string in which to replace ltr with rtl and vice versa.
+
+ Returns:
+ line with left and right swapped. For example:
+ line = FixLtrAndRtlInUrl('background:url(rtl.png)')
+ line will now be 'background:url(ltr.png)'.
+ """
+
+ line = LTR_IN_URL_RE.sub(TMP_TOKEN, line)
+ line = RTL_IN_URL_RE.sub(LTR, line)
+ line = line.replace(TMP_TOKEN, RTL)
+ logging.debug('FixLtrAndRtlInUrl returns: %s' % line)
+ return line
+
+
+def FixCursorProperties(line):
+ """Fixes directional CSS cursor properties.
+
+ Args:
+ line: A string to fix CSS cursor properties in.
+
+ Returns:
+ line reformatted with the cursor properties substituted. For example:
+ line = FixCursorProperties('cursor: ne-resize')
+ line will now be 'cursor: nw-resize'.
+ """
+
+ line = CURSOR_EAST_RE.sub('\\1' + TMP_TOKEN, line)
+ line = CURSOR_WEST_RE.sub('\\1e-resize', line)
+ line = line.replace(TMP_TOKEN, 'w-resize')
+ logging.debug('FixCursorProperties returns: %s' % line)
+ return line
+
+
+def FixFourPartNotation(line):
+ """Fixes the second and fourth positions in 4 part CSS notation.
+
+ Args:
+ line: A string to fix 4 part CSS notation in.
+
+ Returns:
+ line reformatted with the 4 part notations swapped. For example:
+ line = FixFourPartNotation('padding: 1px 2px 3px 4px')
+ line will now be 'padding: 1px 4px 3px 2px'.
+ """
+ line = FOUR_NOTATION_QUANTITY_RE.sub('\\1 \\4 \\3 \\2', line)
+ line = FOUR_NOTATION_COLOR_RE.sub('\\1\\2 \\5 \\4 \\3', line)
+ logging.debug('FixFourPartNotation returns: %s' % line)
+ return line
+
+
+def FixBackgroundPosition(line):
+ """Fixes horizontal background percentage values in line.
+
+ Args:
+ line: A string to fix horizontal background position values in.
+
+ Returns:
+ line reformatted with the 4 part notations swapped.
+ """
+ line = BG_HORIZONTAL_PERCENTAGE_RE.sub(CalculateNewBackgroundPosition, line)
+ line = BG_HORIZONTAL_PERCENTAGE_X_RE.sub(CalculateNewBackgroundPositionX,
+ line)
+ logging.debug('FixBackgroundPosition returns: %s' % line)
+ return line
+
+
+def CalculateNewBackgroundPosition(m):
+ """Fixes horizontal background-position percentages.
+
+ This function should be used as an argument to re.sub since it needs to
+ perform replacement specific calculations.
+
+ Args:
+ m: A match object.
+
+ Returns:
+ A string with the horizontal background position percentage fixed.
+ BG_HORIZONTAL_PERCENTAGE_RE.sub(FixBackgroundPosition,
+ 'background-position: 75% 50%')
+ will return 'background-position: 25% 50%'.
+ """
+
+ # The flipped value is the offset from 100%
+ new_x = str(100-int(m.group(4)))
+
+ # Since m.group(1) may very well be None type and we need a string..
+ if m.group(1):
+ position_string = m.group(1)
+ else:
+ position_string = ''
+
+ return 'background%s%s%s%s%%%s' % (position_string, m.group(2), m.group(3),
+ new_x, m.group(5))
+
+
+def CalculateNewBackgroundPositionX(m):
+ """Fixes percent based background-position-x.
+
+ This function should be used as an argument to re.sub since it needs to
+ perform replacement specific calculations.
+
+ Args:
+ m: A match object.
+
+ Returns:
+ A string with the background-position-x percentage fixed.
+ BG_HORIZONTAL_PERCENTAGE_X_RE.sub(CalculateNewBackgroundPosition,
+ 'background-position-x: 75%')
+ will return 'background-position-x: 25%'.
+ """
+
+ # The flipped value is the offset from 100%
+ new_x = str(100-int(m.group(2)))
+
+ return 'background-position-x%s%s%%' % (m.group(1), new_x)
+
+
+def ChangeLeftToRightToLeft(lines,
+ swap_ltr_rtl_in_url=None,
+ swap_left_right_in_url=None):
+ """Turns lines into a stream and runs the fixing functions against it.
+
+ Args:
+ lines: An list of CSS lines.
+ swap_ltr_rtl_in_url: Overrides this flag if param is set.
+ swap_left_right_in_url: Overrides this flag if param is set.
+
+ Returns:
+ The same lines, but with left and right fixes.
+ """
+
+ global FLAGS
+
+ # Possibly override flags with params.
+ logging.debug('ChangeLeftToRightToLeft swap_ltr_rtl_in_url=%s, '
+ 'swap_left_right_in_url=%s' % (swap_ltr_rtl_in_url,
+ swap_left_right_in_url))
+ if swap_ltr_rtl_in_url is None:
+ swap_ltr_rtl_in_url = FLAGS['swap_ltr_rtl_in_url']
+ if swap_left_right_in_url is None:
+ swap_left_right_in_url = FLAGS['swap_left_right_in_url']
+
+ # Turns the array of lines into a single line stream.
+ logging.debug('LINES COUNT: %s' % len(lines))
+ line = TOKEN_LINES.join(lines)
+
+ # Tokenize any single line rules with the /* noflip */ annotation.
+ noflip_single_tokenizer = Tokenizer(NOFLIP_SINGLE_RE, 'NOFLIP_SINGLE')
+ line = noflip_single_tokenizer.Tokenize(line)
+
+ # Tokenize any class rules with the /* noflip */ annotation.
+ noflip_class_tokenizer = Tokenizer(NOFLIP_CLASS_RE, 'NOFLIP_CLASS')
+ line = noflip_class_tokenizer.Tokenize(line)
+
+ # Tokenize the comments so we can preserve them through the changes.
+ comment_tokenizer = Tokenizer(COMMENT_RE, 'C')
+ line = comment_tokenizer.Tokenize(line)
+
+ # Here starteth the various left/right orientation fixes.
+ line = FixBodyDirectionLtrAndRtl(line)
+
+ if swap_left_right_in_url:
+ line = FixLeftAndRightInUrl(line)
+
+ if swap_ltr_rtl_in_url:
+ line = FixLtrAndRtlInUrl(line)
+
+ line = FixLeftAndRight(line)
+ line = FixCursorProperties(line)
+ line = FixFourPartNotation(line)
+ line = FixBackgroundPosition(line)
+
+ # DeTokenize the single line noflips.
+ line = noflip_single_tokenizer.DeTokenize(line)
+
+ # DeTokenize the class-level noflips.
+ line = noflip_class_tokenizer.DeTokenize(line)
+
+ # DeTokenize the comments.
+ line = comment_tokenizer.DeTokenize(line)
+
+ # Rejoin the lines back together.
+ lines = line.split(TOKEN_LINES)
+
+ return lines
+
+def usage():
+ """Prints out usage information."""
+
+ print 'Usage:'
+ print ' ./cssjanus.py < file.css > file-rtl.css'
+ print 'Flags:'
+ print ' --swap_left_right_in_url: Fixes "left"/"right" string within urls.'
+ print ' Ex: ./cssjanus.py --swap_left_right_in_url < file.css > file_rtl.css'
+ print ' --swap_ltr_rtl_in_url: Fixes "ltr"/"rtl" string within urls.'
+ print ' Ex: ./cssjanus --swap_ltr_rtl_in_url < file.css > file_rtl.css'
+
+def setflags(opts):
+ """Parse the passed in command line arguments and set the FLAGS global.
+
+ Args:
+ opts: getopt iterable intercepted from argv.
+ """
+
+ global FLAGS
+
+ # Parse the arguments.
+ for opt, arg in opts:
+ logging.debug('opt: %s, arg: %s' % (opt, arg))
+ if opt in ("-h", "--help"):
+ usage()
+ sys.exit()
+ elif opt in ("-d", "--debug"):
+ logging.getLogger().setLevel(logging.DEBUG)
+ elif opt == '--swap_ltr_rtl_in_url':
+ FLAGS['swap_ltr_rtl_in_url'] = True
+ elif opt == '--swap_left_right_in_url':
+ FLAGS['swap_left_right_in_url'] = True
+
+
+def main(argv):
+ """Sends stdin lines to ChangeLeftToRightToLeft and writes to stdout."""
+
+ # Define the flags.
+ try:
+ opts, args = getopt.getopt(argv, 'hd', ['help', 'debug',
+ 'swap_left_right_in_url',
+ 'swap_ltr_rtl_in_url'])
+ except getopt.GetoptError:
+ usage()
+ sys.exit(2)
+
+ # Parse and set the flags.
+ setflags(opts)
+
+ # Call the main routine with all our functionality.
+ fixed_lines = ChangeLeftToRightToLeft(sys.stdin.readlines())
+ sys.stdout.write(''.join(fixed_lines))
+
+if __name__ == '__main__':
+ main(sys.argv[1:])
diff --git a/skins/vector/cssjanus/csslex.py b/skins/vector/cssjanus/csslex.py
new file mode 100644
index 00000000..1fc7304e
--- /dev/null
+++ b/skins/vector/cssjanus/csslex.py
@@ -0,0 +1,114 @@
+#!/usr/bin/python
+#
+# Copyright 2007 Google Inc. All Rights Reserved.
+
+"""CSS Lexical Grammar rules.
+
+CSS lexical grammar from http://www.w3.org/TR/CSS21/grammar.html
+"""
+
+__author__ = ['elsigh@google.com (Lindsey Simon)',
+ 'msamuel@google.com (Mike Samuel)']
+
+# public symbols
+__all__ = [ "NEWLINE", "HEX", "NON_ASCII", "UNICODE", "ESCAPE", "NMSTART", "NMCHAR", "STRING1", "STRING2", "IDENT", "NAME", "HASH", "NUM", "STRING", "URL", "SPACE", "WHITESPACE", "COMMENT", "QUANTITY", "PUNC" ]
+
+# The comments below are mostly copied verbatim from the grammar.
+
+# "@import" {return IMPORT_SYM;}
+# "@page" {return PAGE_SYM;}
+# "@media" {return MEDIA_SYM;}
+# "@charset" {return CHARSET_SYM;}
+KEYWORD = r'(?:\@(?:import|page|media|charset))'
+
+# nl \n|\r\n|\r|\f ; a newline
+NEWLINE = r'\n|\r\n|\r|\f'
+
+# h [0-9a-f] ; a hexadecimal digit
+HEX = r'[0-9a-f]'
+
+# nonascii [\200-\377]
+NON_ASCII = r'[\200-\377]'
+
+# unicode \\{h}{1,6}(\r\n|[ \t\r\n\f])?
+UNICODE = r'(?:(?:\\' + HEX + r'{1,6})(?:\r\n|[ \t\r\n\f])?)'
+
+# escape {unicode}|\\[^\r\n\f0-9a-f]
+ESCAPE = r'(?:' + UNICODE + r'|\\[^\r\n\f0-9a-f])'
+
+# nmstart [_a-z]|{nonascii}|{escape}
+NMSTART = r'(?:[_a-z]|' + NON_ASCII + r'|' + ESCAPE + r')'
+
+# nmchar [_a-z0-9-]|{nonascii}|{escape}
+NMCHAR = r'(?:[_a-z0-9-]|' + NON_ASCII + r'|' + ESCAPE + r')'
+
+# ident -?{nmstart}{nmchar}*
+IDENT = r'-?' + NMSTART + NMCHAR + '*'
+
+# name {nmchar}+
+NAME = NMCHAR + r'+'
+
+# hash
+HASH = r'#' + NAME
+
+# string1 \"([^\n\r\f\\"]|\\{nl}|{escape})*\" ; "string"
+STRING1 = r'"(?:[^\"\\]|\\.)*"'
+
+# string2 \'([^\n\r\f\\']|\\{nl}|{escape})*\' ; 'string'
+STRING2 = r"'(?:[^\'\\]|\\.)*'"
+
+# string {string1}|{string2}
+STRING = '(?:' + STRING1 + r'|' + STRING2 + ')'
+
+# num [0-9]+|[0-9]*"."[0-9]+
+NUM = r'(?:[0-9]*\.[0-9]+|[0-9]+)'
+
+# s [ \t\r\n\f]
+SPACE = r'[ \t\r\n\f]'
+
+# w {s}*
+WHITESPACE = '(?:' + SPACE + r'*)'
+
+# url special chars
+URL_SPECIAL_CHARS = r'[!#$%&*-~]'
+
+# url chars ({url_special_chars}|{nonascii}|{escape})*
+URL_CHARS = r'(?:%s|%s|%s)*' % (URL_SPECIAL_CHARS, NON_ASCII, ESCAPE)
+
+# url
+URL = r'url\(%s(%s|%s)%s\)' % (WHITESPACE, STRING, URL_CHARS, WHITESPACE)
+
+# comments
+# see http://www.w3.org/TR/CSS21/grammar.html
+COMMENT = r'/\*[^*]*\*+([^/*][^*]*\*+)*/'
+
+# {E}{M} {return EMS;}
+# {E}{X} {return EXS;}
+# {P}{X} {return LENGTH;}
+# {C}{M} {return LENGTH;}
+# {M}{M} {return LENGTH;}
+# {I}{N} {return LENGTH;}
+# {P}{T} {return LENGTH;}
+# {P}{C} {return LENGTH;}
+# {D}{E}{G} {return ANGLE;}
+# {R}{A}{D} {return ANGLE;}
+# {G}{R}{A}{D} {return ANGLE;}
+# {M}{S} {return TIME;}
+# {S} {return TIME;}
+# {H}{Z} {return FREQ;}
+# {K}{H}{Z} {return FREQ;}
+# % {return PERCENTAGE;}
+UNIT = r'(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)'
+
+# {num}{UNIT|IDENT} {return NUMBER;}
+QUANTITY = '%s(?:%s%s|%s)?' % (NUM, WHITESPACE, UNIT, IDENT)
+
+# "<!--" {return CDO;}
+# "-->" {return CDC;}
+# "~=" {return INCLUDES;}
+# "|=" {return DASHMATCH;}
+# {w}"{" {return LBRACE;}
+# {w}"+" {return PLUS;}
+# {w}">" {return GREATER;}
+# {w}"," {return COMMA;}
+PUNC = r'<!--|-->|~=|\|=|[\{\+>,:;]'
diff --git a/skins/vector/experiments/babaco-colors-a.css b/skins/vector/experiments/babaco-colors-a.css
new file mode 100644
index 00000000..ce6f67dd
--- /dev/null
+++ b/skins/vector/experiments/babaco-colors-a.css
@@ -0,0 +1,109 @@
+/* Babaco Color Scheme A */
+
+
+a:visited,
+a:visited div.vectorTabs li.selected a:visited span {
+ color: #260e9c;
+}
+
+html .thumbimage,
+#toc, .toc, .mw-warning, div.thumbinner {
+ border-color: #cccccc;
+ background-color: #f7f7f7;
+}
+
+/* Framework */
+#mw-page-base {
+ background-color: inherit !important;
+ background-image: none !important;
+}
+body {
+ background-color: #f9f9f9 !important;
+ background-image:url(images/page-base-updated.png);
+}
+
+/* Links */
+a {
+ color: #0066cc;
+}
+a:visited {
+ color: #004d99;
+}
+a:active {
+ color: #ff6600;
+}
+a.stub {
+ color: #56228b;
+}
+a.new, #p-personal a.new {
+ color: #a31205 !important;
+}
+a.new:visited, #p-personal a.new:visited {
+ color: #a31205;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ border-color:#999999;
+ font-family:georgia, times, serif;
+ font-weight:bold;
+}
+#firstHeading {
+ font-size:1.5em;
+}
+h2 .editsection,
+.portal h5{
+ font-family:sans-serif;
+ font-weight:normal;
+
+}
+#toc h2, .toc h2 {
+ font-family:sans-serif;
+ font-weight:normal;
+}
+body #mw-panel div.portal div.body {
+ background-image:url(images/new-portal-break-ltr.png);
+}
+body.rtl #mw-panel div.portal div.body {
+ background-image:url(images/new-portal-break-rtl.png);
+}
+body div.vectorTabs li a, div.vectorTabs li a span{
+ color:#4d4d4d;
+}
+body div.vectorTabs li.selected a,
+body div.vectorTabs li.selected a span,
+body div.vectorTabs li.selected a:visited
+body div.vectorTabs li.selected a:visited span {
+ color: #ff9900 !important;
+ font-weight:bold;
+}
+div.vectorTabs li.new a,
+div.vectorTabs li.new a span,
+div.vectorTabs li.new a:visited,
+div.vectorTabs li.new a:visited span {
+ color:#a31205;
+}
+#toc,
+.toc,
+.mw-warning,
+div.gallerybox div.thumb,
+table.gallery,
+#preferences fieldset.prefsection fieldset,
+#preferences,
+html .thumbimage,
+.usermessage,
+img.thumbborder,
+div.thumbinner{
+ border: 1px solid #cccccc;
+ background-color: #f7f7f7;
+}
+#mw-panel div.portal h5 {
+ font-weight:bold;
+ margin-bottom:0;
+ padding-bottom:0.05em;
+ color:#000000;
+}
diff --git a/skins/vector/experiments/babaco-colors-b.css b/skins/vector/experiments/babaco-colors-b.css
new file mode 100644
index 00000000..227e197c
--- /dev/null
+++ b/skins/vector/experiments/babaco-colors-b.css
@@ -0,0 +1,67 @@
+/* Babaco Color Scheme A */
+
+
+html .thumbimage,
+#toc, .toc, .mw-warning, div.thumbinner {
+ border-color: #cccccc;
+ background-color: #f7f7f7;
+}
+
+/* Framework */
+#mw-page-base {
+ background-color: inherit !important;
+ background-image: none !important;
+}
+body {
+ background-color: #f9f9f9 !important;
+ background-image:url(images/page-base-updated.png);
+}
+/* Links */
+a {
+ color: #003cb3;
+}
+a.stub {
+ color: #772233;
+}
+a.new, #p-personal a.new {
+ color: #a31205 !important;
+}
+{
+ color: #260e9c;
+}
+a:visited,
+a:visited div.vectorTabs li.selected a:visited span,
+a.new:visited,
+#p-personal a.new:visited {
+ color: #260e9c;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ border-color:#999999;
+}
+
+div.vectorTabs li.new a,
+div.vectorTabs li.new a span,
+div.vectorTabs li.new a:visited,
+div.vectorTabs li.new a:visited span {
+ color:#a31205;
+}
+
+#toc,
+.toc,
+.mw-warning,
+div.gallerybox div.thumb,
+table.gallery,
+#preferences fieldset.prefsection fieldset,
+#preferences,
+html .thumbimage,
+.usermessage,
+img.thumbborder,
+div.thumbinner{
+ border: 1px solid #cccccc;
+ background-color: #f7f7f7;
+}
diff --git a/skins/vector/experiments/babaco-colors-c.css b/skins/vector/experiments/babaco-colors-c.css
new file mode 100644
index 00000000..d2dabf7d
--- /dev/null
+++ b/skins/vector/experiments/babaco-colors-c.css
@@ -0,0 +1,91 @@
+/* Babaco Color Scheme C */
+
+/* ridding ourselves of the gradient */
+#mw-page-base {
+ background-color: inherit !important;
+ background-image: none !important;
+}
+
+a:visited,
+a:visited div.vectorTabs li.selected a:visited span {
+ color: #260e9c;
+}
+
+html .thumbimage,
+#toc, .toc, .mw-warning, div.thumbinner {
+ border-color: #cccccc;
+ background-color: #f7f7f7;
+}
+
+/* Framework */
+body {
+ background-color: #f9f9f9 !important;
+ background-image:url(images/page-base-updated.png);
+}
+
+/* Links */
+a {
+ color: #0066cc;
+}
+a:visited {
+ color: #004d99;
+}
+a:active {
+ color: #ff6600;
+}
+a.stub {
+ color: #56228b;
+}
+a.new, #p-personal a.new {
+ color: #a31205 !important;
+}
+a.new:visited, #p-personal a.new:visited {
+ color: #a31205;
+}
+
+#firstHeading {
+ font-size:1.5em;
+}
+h2 .editsection,
+.portal h5 {
+ font-weight:normal;
+}
+#toc h2, .toc h2 {
+ font-weight:normal;
+}
+body #mw-panel div.portal div.body {
+ background-image:url(images/new-portal-break-ltr.png);
+}
+
+div.vectorTabs li.new a,
+div.vectorTabs li.new a span,
+div.vectorTabs li.new a:visited,
+div.vectorTabs li.new a:visited span {
+ color:#a31205;
+}
+#toc,
+.toc,
+.mw-warning,
+div.gallerybox div.thumb,
+table.gallery,
+#preferences fieldset.prefsection fieldset,
+#preferences,
+html .thumbimage,
+.usermessage,
+img.thumbborder,
+div.thumbinner {
+ border: 1px solid #cccccc;
+ background-color: #f7f7f7;
+}
+#mw-panel div.portal h5 {
+ font-weight:bold;
+ margin-bottom:0;
+ padding-bottom:0.05em;
+ color:#000000;
+}
+div.vectorTabs li.selected a,
+div.vectorTabs li.selected a span,
+div.vectorTabs li.selected a:visited
+div.vectorTabs li.selected a:visited span {
+ color: #333333 !important;
+} \ No newline at end of file
diff --git a/skins/vector/experiments/images/new-border.png b/skins/vector/experiments/images/new-border.png
new file mode 100644
index 00000000..735324ef
--- /dev/null
+++ b/skins/vector/experiments/images/new-border.png
Binary files differ
diff --git a/skins/vector/experiments/images/new-portal-break-ltr.png b/skins/vector/experiments/images/new-portal-break-ltr.png
new file mode 100644
index 00000000..cd8f3b15
--- /dev/null
+++ b/skins/vector/experiments/images/new-portal-break-ltr.png
Binary files differ
diff --git a/skins/vector/experiments/images/new-portal-break-rtl.png b/skins/vector/experiments/images/new-portal-break-rtl.png
new file mode 100644
index 00000000..45c5b2f9
--- /dev/null
+++ b/skins/vector/experiments/images/new-portal-break-rtl.png
Binary files differ
diff --git a/skins/vector/experiments/images/page-base-fade.png b/skins/vector/experiments/images/page-base-fade.png
new file mode 100644
index 00000000..dc631823
--- /dev/null
+++ b/skins/vector/experiments/images/page-base-fade.png
Binary files differ
diff --git a/skins/vector/experiments/images/page-base-updated.png b/skins/vector/experiments/images/page-base-updated.png
new file mode 100644
index 00000000..54ffeb00
--- /dev/null
+++ b/skins/vector/experiments/images/page-base-updated.png
Binary files differ
diff --git a/skins/vector/experiments/images/tab-active-first.png b/skins/vector/experiments/images/tab-active-first.png
new file mode 100644
index 00000000..e4c39c42
--- /dev/null
+++ b/skins/vector/experiments/images/tab-active-first.png
Binary files differ
diff --git a/skins/vector/experiments/images/tab-active-last.png b/skins/vector/experiments/images/tab-active-last.png
new file mode 100644
index 00000000..a96f3916
--- /dev/null
+++ b/skins/vector/experiments/images/tab-active-last.png
Binary files differ
diff --git a/skins/vector/experiments/images/tab-fade.png b/skins/vector/experiments/images/tab-fade.png
new file mode 100644
index 00000000..1eb0e23b
--- /dev/null
+++ b/skins/vector/experiments/images/tab-fade.png
Binary files differ
diff --git a/skins/vector/experiments/images/tab-first.png b/skins/vector/experiments/images/tab-first.png
new file mode 100644
index 00000000..439b713f
--- /dev/null
+++ b/skins/vector/experiments/images/tab-first.png
Binary files differ
diff --git a/skins/vector/experiments/images/tab-last.png b/skins/vector/experiments/images/tab-last.png
new file mode 100644
index 00000000..08e283dd
--- /dev/null
+++ b/skins/vector/experiments/images/tab-last.png
Binary files differ
diff --git a/skins/vector/experiments/images/tab-new-fade.png b/skins/vector/experiments/images/tab-new-fade.png
new file mode 100644
index 00000000..44925505
--- /dev/null
+++ b/skins/vector/experiments/images/tab-new-fade.png
Binary files differ
diff --git a/skins/vector/experiments/new-tabs.css b/skins/vector/experiments/new-tabs.css
new file mode 100644
index 00000000..e3850e8e
--- /dev/null
+++ b/skins/vector/experiments/new-tabs.css
@@ -0,0 +1,322 @@
+/* new border color */
+#content {
+ background-image: url(images/new-border.png);
+}
+
+#footer {
+ background-image: url(images/new-border.png);
+}
+ body div#left-navigation,
+ body div#right-navigation {
+ top:3.2em;
+ }
+ body div#right-navigation {
+ margin-top:3.2em;
+ }
+ body #p-search form,
+ body #p-search input,
+ body #simpleSearch {
+ margin-top:0;
+ }
+ body div#p-cactions {
+ margin-top:0;
+ }
+ /* Namespaces and Views */
+ /* @noflip */
+ div.vectorTabs {
+ float: left;
+ }
+ body div.vectorTabs {
+ background-image: none;
+ padding-left: 0;
+ }
+ /* @noflip */
+ div.vectorTabs ul {
+ float: left;
+ }
+ div.vectorTabs ul {
+ height: 100%;
+ list-style: none;
+ background-image:none;
+ margin: 0;
+ padding: 0;
+ }
+ /* @noflip */
+ div.vectorTabs ul li {
+ float: left;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ body div.vectorTabs ul li {
+ line-height: 1em;
+ display: inline-block;
+ height: 2em;
+ margin: 0 1px 0 0;
+ padding: 0;
+ background:none;
+ overflow:hidden;
+ white-space:nowrap;
+ }
+ /* IGNORED BY IE6 */
+ div.vectorTabs ul > li {
+ display: block;
+ }
+ body div.vectorTabs li.selected {
+ background-image: none;
+ border:none;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ body div.vectorTabs li a {
+ border-top:1px solid #cccccc;
+ border-left:1px solid #cccccc;
+ border-right:1px solid #cccccc;
+ display: inline-block;
+ height: 1.7em;
+ padding-left: 0.6em;
+ padding-right: 0.6em;
+ background-image:url(images/tab-fade.png);
+ background-position:bottom left;
+ background-repeat:repeat-x;
+ background-color:#ffffff;
+ }
+ body div.vectorTabs li.new a{
+ background-image:url(images/tab-new-fade.png);
+
+ }
+ div.vectorTabs li a,
+ div.vectorTabs li a span {
+ cursor: pointer;
+ }
+ div.vectorTabs li a span {
+ font-size: 0.8em;
+ }
+ /* IGNORED BY IE6 */
+ div.vectorTabs li > a {
+ display: block;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ body div.vectorTabs a span {
+ display: inline-block;
+ padding-top: 0.5em;
+ }
+ /* IGNORED BY IE6 */
+ /* @noflip */
+ div.vectorTabs a > span {
+ float: left;
+ display: block;
+ }
+ body div.vectorTabs li.last {
+ background-image: url(images/tab-last.png);
+ background-repeat:no-repeat;
+ background-position:top right;
+ border:none;
+ }
+ body div.vectorTabs li.last a {
+ margin-right:7px;
+ padding-left:0.4em;
+ padding-right:0;
+ border-left:1px solid #cccccc;
+ border-top:1px solid #cccccc;
+ border-right:none;
+ background-image:url(images/tab-fade.png);
+ background-position:top left;
+ background-repeat:repeat-x;
+ }
+ body div.vectorTabs li.first {
+ background-image: url(images/tab-first.png);
+ background-repeat:no-repeat;
+ background-position:top left;
+ border:none;
+ }
+ body div.vectorTabs li.first a {
+ margin-left:7px;
+ padding-left:0em;
+ padding-right:0.4em;
+ border-right:1px solid #cccccc;
+ border-top:1px solid #cccccc;
+ background-image:url(images/tab-fade.png);
+ background-position:top left;
+ background-repeat:repeat-x;
+ }
+
+ div.vectorTabs li.selected a,
+ div.vectorTabs li.selected a span,
+ div.vectorTabs li.selected a:visited
+ div.vectorTabs li.selected a:visited span {
+ color: #be5900 !important;
+ text-decoration: none;
+ }
+
+ body div.vectorTabs li.selected a {
+ border-top:1px solid #6cc8f3;
+ border-right:1px solid #6cc8f3;
+ border-left:1px solid #6cc8f3;
+ background-color:#fff;
+ height:1.75em;
+ background-image:none;
+ }
+ body div.vectorTabs li.selected.first {
+ background-image: url(images/tab-active-first.png);
+ background-repeat:no-repeat;
+ background-position:top left;
+ }
+ body div.vectorTabs li.selected.first a {
+ margin-left:7px;
+ padding-right:0.6em;
+ padding-left:0.4em;
+ border-left:none;
+ }
+ body div.vectorTabs li.selected.last {
+ background-image: url(images/tab-active-last.png);
+ background-repeat:no-repeat;
+ background-position:top right;
+ }
+ body div.vectorTabs li.selected.last a {
+ margin-right:7px;
+ padding-left:0.6em;
+ padding-right:0.4em;
+ border-right:none;
+ }
+
+ /* Variants and Actions */
+ /* @noflip */
+ div.vectorMenu {
+ background-image:url(images/tab-fade.png);
+ background-position:bottom left;
+ background-repeat:repeat-x;
+ border-top:1px solid #cccccc;
+ border-left:1px solid #cccccc;
+ border-right:1px solid #cccccc;
+ }
+ body.rtl div.vectorMenu {
+ direction: rtl;
+ }
+ /* @noflip */
+ body #mw-head div.vectorMenu h5 {
+ background-image: url(../images/arrow-down-icon.png);
+ background-position: center center;
+ background-repeat: no-repeat;
+ padding-left: 0;
+ margin-left: 0px;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ body div.vectorMenu h5 a {
+ display: inline-block;
+ width: 24px;
+ height:1.5em;
+ background-image: none !important;
+
+ }
+ /* IGNORED BY IE6 */
+ div.vectorMenu h5 > a {
+ display: block;
+ }
+ div.vectorMenu div.menu {
+ position: relative;
+ left:1px;
+ display: none;
+ clear: both;
+ text-align: left;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ body.rtl div.vectorMenu div.menu {
+ margin-right: 24px;
+ }
+ /* IGNORED BY IE6 */
+ body.rtl div.vectorMenu > div.menu {
+ margin-right: auto;
+ }
+ /* Fixes old versions of FireFox */
+ body.rtl div.vectorMenu > div.menu,
+ x:-moz-any-link {
+ margin-right: 24px;
+ }
+ div.vectorMenu:hover div.menu {
+ 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;
+ }
+ /* IGNORED BY IE6 */
+ div.vectorMenu li > a {
+ display: block;
+ }
+ div.vectorMenu li a {
+ color: #0645ad;
+ cursor: pointer;
+ font-size: 0.8em;
+ }
+ div.vectorMenu li.selected a,
+ div.vectorMenu li.selected a:visited {
+ color: #333333;
+ text-decoration: none;
+ }
+#ca-unwatch.icon,
+#ca-watch.icon {
+ background-color:#ffffff;
+ height:1.75em !important;
+ background-image:url(images/tab-fade.png);
+ background-position:bottom left;
+ background-repeat:repeat-x;
+}
+#ca-unwatch.icon a,
+#ca-watch.icon a {
+ height: 1.7em !important;
+ border-bottom:none;
+ background-color:transparent;
+}
+#ca-watch.icon a,
+#ca-unwatch.icon a {
+ background-repeat:no-repeat;
+}
+.wikiEditor-ui-tabs {
+ border: none;
+ height: 2.15em;
+}
+.wikiEditor-ui-buttons {
+ height: 2.15em;
+}
+.wikiEditor-ui-tabs div {
+ border: 1px solid silver;
+ margin-right: 1px;
+ height: 2.15em;
+}
+.wikiEditor-ui-tabs div a {
+ line-height: 2.15em;
+ background: #FFFFFF url(images/tab-fade.png) repeat-x 0 100%;
+}
+.wikiEditor-ui-tabs div.current a {
+ background: #FFFFFF;
+}
diff --git a/skins/vector/images/arrow-down-icon.png b/skins/vector/images/arrow-down-icon.png
new file mode 100644
index 00000000..bf2d4fb4
--- /dev/null
+++ b/skins/vector/images/arrow-down-icon.png
Binary files differ
diff --git a/skins/vector/images/audio-icon.png b/skins/vector/images/audio-icon.png
new file mode 100644
index 00000000..0f59a2bb
--- /dev/null
+++ b/skins/vector/images/audio-icon.png
Binary files differ
diff --git a/skins/vector/images/border.png b/skins/vector/images/border.png
new file mode 100644
index 00000000..54b47922
--- /dev/null
+++ b/skins/vector/images/border.png
Binary files differ
diff --git a/skins/vector/images/bullet-icon.png b/skins/vector/images/bullet-icon.png
new file mode 100644
index 00000000..e304b267
--- /dev/null
+++ b/skins/vector/images/bullet-icon.png
Binary files differ
diff --git a/skins/vector/images/document-icon.png b/skins/vector/images/document-icon.png
new file mode 100644
index 00000000..91dc16f6
--- /dev/null
+++ b/skins/vector/images/document-icon.png
Binary files differ
diff --git a/skins/vector/images/edit-icon.png b/skins/vector/images/edit-icon.png
new file mode 100644
index 00000000..4a962767
--- /dev/null
+++ b/skins/vector/images/edit-icon.png
Binary files differ
diff --git a/skins/vector/images/external-link-ltr-icon.png b/skins/vector/images/external-link-ltr-icon.png
new file mode 100644
index 00000000..4b710b03
--- /dev/null
+++ b/skins/vector/images/external-link-ltr-icon.png
Binary files differ
diff --git a/skins/vector/images/external-link-rtl-icon.png b/skins/vector/images/external-link-rtl-icon.png
new file mode 100644
index 00000000..17df03a3
--- /dev/null
+++ b/skins/vector/images/external-link-rtl-icon.png
Binary files differ
diff --git a/skins/vector/images/file-icon.png b/skins/vector/images/file-icon.png
new file mode 100644
index 00000000..1261f00c
--- /dev/null
+++ b/skins/vector/images/file-icon.png
Binary files differ
diff --git a/skins/vector/images/link-icon.png b/skins/vector/images/link-icon.png
new file mode 100644
index 00000000..fc77e81d
--- /dev/null
+++ b/skins/vector/images/link-icon.png
Binary files differ
diff --git a/skins/vector/images/lock-icon.png b/skins/vector/images/lock-icon.png
new file mode 100644
index 00000000..9e63807a
--- /dev/null
+++ b/skins/vector/images/lock-icon.png
Binary files differ
diff --git a/skins/vector/images/magnify-clip.png b/skins/vector/images/magnify-clip.png
new file mode 100644
index 00000000..00a9cee1
--- /dev/null
+++ b/skins/vector/images/magnify-clip.png
Binary files differ
diff --git a/skins/vector/images/mail-icon.png b/skins/vector/images/mail-icon.png
new file mode 100644
index 00000000..50de0781
--- /dev/null
+++ b/skins/vector/images/mail-icon.png
Binary files differ
diff --git a/skins/vector/images/news-icon.png b/skins/vector/images/news-icon.png
new file mode 100644
index 00000000..8ab49957
--- /dev/null
+++ b/skins/vector/images/news-icon.png
Binary files differ
diff --git a/skins/vector/images/page-base.png b/skins/vector/images/page-base.png
new file mode 100644
index 00000000..17d02a74
--- /dev/null
+++ b/skins/vector/images/page-base.png
Binary files differ
diff --git a/skins/vector/images/page-fade.png b/skins/vector/images/page-fade.png
new file mode 100644
index 00000000..815a0486
--- /dev/null
+++ b/skins/vector/images/page-fade.png
Binary files differ
diff --git a/skins/vector/images/portal-break-ltr.png b/skins/vector/images/portal-break-ltr.png
new file mode 100644
index 00000000..c1823705
--- /dev/null
+++ b/skins/vector/images/portal-break-ltr.png
Binary files differ
diff --git a/skins/vector/images/portal-break-rtl.png b/skins/vector/images/portal-break-rtl.png
new file mode 100644
index 00000000..a45144c0
--- /dev/null
+++ b/skins/vector/images/portal-break-rtl.png
Binary files differ
diff --git a/skins/vector/images/portal-break.png b/skins/vector/images/portal-break.png
new file mode 100644
index 00000000..e81b5597
--- /dev/null
+++ b/skins/vector/images/portal-break.png
Binary files differ
diff --git a/skins/vector/images/preferences-base.png b/skins/vector/images/preferences-base.png
new file mode 100644
index 00000000..adfd70d7
--- /dev/null
+++ b/skins/vector/images/preferences-base.png
Binary files differ
diff --git a/skins/vector/images/preferences-break.png b/skins/vector/images/preferences-break.png
new file mode 100644
index 00000000..6c5c68c4
--- /dev/null
+++ b/skins/vector/images/preferences-break.png
Binary files differ
diff --git a/skins/vector/images/preferences-edge.png b/skins/vector/images/preferences-edge.png
new file mode 100644
index 00000000..3da0d099
--- /dev/null
+++ b/skins/vector/images/preferences-edge.png
Binary files differ
diff --git a/skins/vector/images/preferences-fade.png b/skins/vector/images/preferences-fade.png
new file mode 100644
index 00000000..b4773c5c
--- /dev/null
+++ b/skins/vector/images/preferences-fade.png
Binary files differ
diff --git a/skins/vector/images/search-fade.png b/skins/vector/images/search-fade.png
new file mode 100644
index 00000000..53461d6d
--- /dev/null
+++ b/skins/vector/images/search-fade.png
Binary files differ
diff --git a/skins/vector/images/search-ltr.png b/skins/vector/images/search-ltr.png
new file mode 100644
index 00000000..1db2eb24
--- /dev/null
+++ b/skins/vector/images/search-ltr.png
Binary files differ
diff --git a/skins/vector/images/search-rtl.png b/skins/vector/images/search-rtl.png
new file mode 100644
index 00000000..c26c8d07
--- /dev/null
+++ b/skins/vector/images/search-rtl.png
Binary files differ
diff --git a/skins/vector/images/tab-break.png b/skins/vector/images/tab-break.png
new file mode 100644
index 00000000..81155562
--- /dev/null
+++ b/skins/vector/images/tab-break.png
Binary files differ
diff --git a/skins/vector/images/tab-current-fade.png b/skins/vector/images/tab-current-fade.png
new file mode 100644
index 00000000..c6238d26
--- /dev/null
+++ b/skins/vector/images/tab-current-fade.png
Binary files differ
diff --git a/skins/vector/images/tab-normal-fade.png b/skins/vector/images/tab-normal-fade.png
new file mode 100644
index 00000000..4a5e3e4a
--- /dev/null
+++ b/skins/vector/images/tab-normal-fade.png
Binary files differ
diff --git a/skins/vector/images/talk-icon.png b/skins/vector/images/talk-icon.png
new file mode 100644
index 00000000..0b80ee91
--- /dev/null
+++ b/skins/vector/images/talk-icon.png
Binary files differ
diff --git a/skins/vector/images/user-icon.png b/skins/vector/images/user-icon.png
new file mode 100644
index 00000000..ac3d59d5
--- /dev/null
+++ b/skins/vector/images/user-icon.png
Binary files differ
diff --git a/skins/vector/images/video-icon.png b/skins/vector/images/video-icon.png
new file mode 100644
index 00000000..5e7f4af7
--- /dev/null
+++ b/skins/vector/images/video-icon.png
Binary files differ
diff --git a/skins/vector/images/watch-icon-loading.gif b/skins/vector/images/watch-icon-loading.gif
new file mode 100644
index 00000000..618c308e
--- /dev/null
+++ b/skins/vector/images/watch-icon-loading.gif
Binary files differ
diff --git a/skins/vector/images/watch-icons.png b/skins/vector/images/watch-icons.png
new file mode 100644
index 00000000..54b2c793
--- /dev/null
+++ b/skins/vector/images/watch-icons.png
Binary files differ
diff --git a/skins/vector/main-ltr.css b/skins/vector/main-ltr.css
new file mode 100644
index 00000000..78dd1e2b
--- /dev/null
+++ b/skins/vector/main-ltr.css
@@ -0,0 +1,1128 @@
+/*
+ * main-rtl.css is automatically generated using CSSJanus, a python script for
+ * creating RTL versions of otherwise LTR stylesheets.
+ *
+ * You may download the tool to rebuild this stylesheet
+ * http://code.google.com/p/cssjanus/
+ *
+ * An online version of this tool can be used at:
+ * http://cssjanus.commoner.com/
+ *
+ * The following command is used to generate the RTL version of this file
+ * ./cssjanus.py --swap_ltr_rtl_in_url < main-ltr.css > main-rtl.css
+ *
+ * Any rules which should not be flipped should be prepended with @noflip in
+ * a comment block.
+ */
+/* Framework */
+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);
+}
+/* Content */
+#content {
+ margin-left: 10em;
+ padding: 1em;
+ background-image: url(images/border.png);
+ background-position: top left;
+ background-repeat: repeat-y;
+ background-color: white;
+}
+/* Head */
+#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;
+}
+#mw-head {
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 100%;
+}
+#mw-head h5 {
+ margin: 0;
+ padding: 0;
+}
+ /* Hide empty portlets */
+ div.emptyPortlet {
+ display: none;
+ }
+ /* Personal */
+ #p-personal {
+ position: absolute;
+ top: 0;
+ margin-left: 10em;
+ right: 0.75em;
+ }
+ #p-personal h5 {
+ display: none;
+ }
+ #p-personal ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ }
+ /* @noflip */
+ #p-personal li {
+ line-height: 1.125em;
+ float: left;
+ }
+ #p-personal li {
+ margin-left: 0.75em;
+ margin-top: 0.5em;
+ font-size: 0.75em;
+ }
+ /* 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;
+ }
+ div.vectorTabs {
+ 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;
+ 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 {
+ background-image: url(images/tab-current-fade.png);
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ div.vectorTabs li a {
+ display: inline-block;
+ height: 2.5em;
+ padding-left: 0.4em;
+ padding-right: 0.4em;
+ background-image: url(images/tab-break.png);
+ background-position: bottom right;
+ background-repeat: no-repeat;
+ }
+ div.vectorTabs li a,
+ div.vectorTabs li a span {
+ color: #0645ad;
+ cursor: pointer;
+ }
+ div.vectorTabs li a span {
+ font-size: 0.8em;
+ }
+ /* IGNORED BY IE6 */
+ div.vectorTabs li > a {
+ display: block;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ div.vectorTabs a span {
+ display: inline-block;
+ padding-top: 1.25em;
+ }
+ /* IGNORED BY IE6 */
+ /* @noflip */
+ div.vectorTabs a > span {
+ float: left;
+ display: block;
+ }
+ div.vectorTabs li.selected a,
+ div.vectorTabs li.selected a span,
+ div.vectorTabs li.selected a:visited
+ div.vectorTabs li.selected a:visited span {
+ color: #333333;
+ text-decoration: none;
+ }
+ div.vectorTabs li.new a,
+ div.vectorTabs li.new a span,
+ div.vectorTabs li.new a:visited,
+ div.vectorTabs li.new a:visited span {
+ color: #a55858;
+ }
+ /* Variants and Actions */
+ /* @noflip */
+ div.vectorMenu {
+ direction: ltr;
+ float: left;
+ background-image: url(images/arrow-down-icon.png);
+ background-position: center center;
+ background-repeat: no-repeat;
+ }
+ /* @noflip */
+ body.rtl div.vectorMenu {
+ direction: rtl;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ /* @noflip */
+ #mw-head div.vectorMenu h5 {
+ float: left;
+ background-image: url(images/tab-break.png);
+ background-repeat: no-repeat;
+ }
+ /* IGNORED BY IE6 */
+ #mw-head div.vectorMenu > h5 {
+ background-image: none;
+ }
+ #mw-head div.vectorMenu h5 {
+ background-position: bottom left;
+ margin-left: -1px;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ /* @noflip */
+ 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;
+ }
+ /* 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;
+ }
+ /* Fixes old versions of FireFox */
+ /* @noflip */
+ body.rtl div.vectorMenu > div.menu,
+ x:-moz-any-link {
+ margin-left: 23px;
+ }
+ div.vectorMenu:hover div.menu {
+ 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;
+ }
+ /* IGNORED BY IE6 */
+ div.vectorMenu li > a {
+ display: block;
+ }
+ div.vectorMenu li a {
+ color: #0645ad;
+ cursor: pointer;
+ font-size: 0.8em;
+ }
+ 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;
+ }
+ #simpleSearch {
+ margin-top: 0.5em;
+ position: relative;
+ border: solid 1px #AAAAAA;
+ background-color: white;
+ background-image: url(images/search-fade.png);
+ background-position: top left;
+ background-repeat: repeat-x;
+ }
+ #simpleSearch label {
+ font-size: 0.8em;
+ top: 0.25em;
+ }
+ #simpleSearch input#searchInput {
+ margin: 0;
+ border-width: 0;
+ padding: 0.25em;
+ line-height: 1em;
+ font-size: 0.8em;
+ width: 9em;
+ background-color: transparent;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ #simpleSearch button#searchButton {
+ margin: 0;
+ padding: 0;
+ width: 1.75em;
+ height: 1.5em;
+ border: none;
+ cursor: pointer;
+ background-color: transparent;
+ background-image: url(images/search-ltr.png);
+ background-position: center center;
+ background-repeat: no-repeat;
+ }
+ /* IGNORED BY IE6 */
+ #simpleSearch > button#searchButton {
+ height: 100%;
+ }
+ .suggestions-special .special-label {
+ font-size: 0.8em;
+ color: gray;
+ }
+ .suggestions-special .special-query {
+ color: black;
+ font-style: italic;
+ }
+ .suggestions-special .special-hover {
+ background-color: silver;
+ }
+/* Panel */
+#mw-panel {
+ position: absolute;
+ top: 160px;
+ padding-top: 1em;
+ width: 10em;
+ left: 0;
+}
+ #mw-panel div.portal {
+ padding-bottom: 1.5em;
+ }
+ #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;
+ }
+ #mw-panel div.portal div.body {
+ margin: 0;
+ padding-top: 0.5em;
+ margin-left: 1.25em;
+ background-image: url(images/portal-break.png);
+ background-repeat: no-repeat;
+ background-position: top left;
+ }
+ #mw-panel div.portal div.body ul {
+ list-style: none;
+ list-style-image: none;
+ list-style-type: none;
+ padding: 0;
+ margin: 0;
+ }
+ #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;
+ }
+ #mw-panel div.portal div.body ul li a {
+ color: #0645ad;
+ }
+ #mw-panel div.portal div.body ul li a:visited {
+ color: #0b0080;
+ }
+/* Footer */
+#footer {
+ margin-left: 10em;
+ margin-top: 0;
+ padding: 0.75em;
+ background-image: url(images/border.png);
+ background-position: top left;
+ background-repeat: repeat-x;
+}
+#footer ul {
+ list-style: none;
+ list-style-image: none;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+#footer ul li {
+ margin: 0;
+ padding: 0;
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ color: #333333;
+ font-size: 0.7em;
+}
+#footer #footer-icons {
+ float: right;
+}
+/* @noflip */
+body.ltr #footer #footer-places {
+ float: left;
+}
+#footer #footer-info li {
+ line-height: 1.4em;
+}
+#footer #footer-icons li {
+ float: left;
+ margin-left: 0.5em;
+ line-height: 2em;
+}
+#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;
+ 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;
+ background-image: url(images/preferences-break.png);
+ background-position: bottom right;
+ background-repeat: no-repeat;
+ }
+ /* IGNORED BY IE6 */
+ #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 {
+ text-decoration: underline;
+ }
+ #preftoc li.selected a {
+ 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;
+ background-image: url(images/preferences-base.png);
+}
+#preferences fieldset.prefsection {
+ border: none;
+ padding: 0;
+ margin: 1em;
+}
+#preferences fieldset.prefsection fieldset {
+ border: none;
+ border-top: solid 1px #cccccc;
+}
+#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;
+}
+
+/*
+ * Styles for the user login and create account forms
+ */
+#userlogin, #userloginForm {
+ border: solid 1px #cccccc;
+ padding: 1.2em;
+ margin: .5em;
+ float: left;
+}
+
+#userlogin {
+ min-width: 20em;
+ max-width: 90%;
+ width: 40em;
+}
+
+/*
+ *
+ * The following code is slightly modified from monobook
+ *
+ */
+#content {
+ line-height: 1.5em;
+}
+#bodyContent {
+ font-size: 0.8em;
+}
+/* Links */
+a {
+ text-decoration: none;
+ color: #0645ad;
+ background: none;
+}
+a:visited {
+ color: #0b0080;
+}
+a:active {
+ color: #faa700;
+}
+a:hover {
+ text-decoration: underline;
+}
+a.stub {
+ color: #772233;
+}
+a.new, #p-personal a.new {
+ color: #ba0000;
+}
+a.new:visited, #p-personal a.new:visited {
+ color: #a55858;
+}
+
+/* Inline Elements */
+img {
+ border: none;
+ vertical-align: middle;
+}
+hr {
+ height: 1px;
+ color: #aaa;
+ background-color: #aaa;
+ border: 0;
+ margin: .2em 0 .2em 0;
+}
+
+/* Structural Elements */
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ color: black;
+ background: none;
+ font-weight: normal;
+ margin: 0;
+ padding-top: .5em;
+ padding-bottom: .17em;
+ border-bottom: 1px solid #aaa;
+ width: auto;
+}
+h1 { font-size: 188%; }
+h1 .editsection { font-size: 53%; }
+h2 { font-size: 150%; }
+h2 .editsection { font-size: 67%; }
+h3,
+h4,
+h5,
+h6 {
+ border-bottom: none;
+ font-weight: bold;
+}
+h3 { font-size: 132%; }
+h3 .editsection { font-size: 76%; font-weight: normal; }
+h4 { font-size: 116%; }
+h4 .editsection { font-size: 86%; font-weight: normal; }
+h5 { font-size: 100%; }
+h5 .editsection { font-weight: normal; }
+h6 { font-size: 80%; }
+h6 .editsection { font-size: 125%; font-weight: normal; }
+p {
+ margin: .4em 0 .5em 0;
+ line-height: 1.5em;
+}
+ p img {
+ margin: 0;
+ }
+abbr,
+acronym,
+.explain {
+ border-bottom: 1px dotted black;
+ color: black;
+ background: none;
+ cursor: help;
+}
+q {
+ font-family: Times, "Times New Roman", serif;
+ font-style: italic;
+}
+/* Disabled for now
+blockquote {
+ font-family: Times, "Times New Roman", serif;
+ font-style: italic;
+}*/
+code {
+ background-color: #f9f9f9;
+}
+pre {
+ padding: 1em;
+ border: 1px dashed #2f6fab;
+ color: black;
+ background-color: #f9f9f9;
+ line-height: 1.1em;
+}
+ul {
+ line-height: 1.5em;
+ list-style-type: square;
+ margin: .3em 0 0 1.5em;
+ padding: 0;
+ list-style-image: url(images/bullet-icon.png);
+}
+ol {
+ line-height: 1.5em;
+ margin: .3em 0 0 3.2em;
+ padding: 0;
+ list-style-image: none;
+}
+li {
+ margin-bottom: .1em;
+}
+dt {
+ font-weight: bold;
+ margin-bottom: .1em;
+}
+dl {
+ margin-top: .2em;
+ margin-bottom: .5em;
+}
+dd {
+ line-height: 1.5em;
+ margin-left: 2em;
+ margin-bottom: .1em;
+}
+/* Tables */
+table {
+ font-size: 100%;
+ color: black;
+ /* we don't want the bottom borders of <h2>s to be visible through
+ * floated tables */
+ background-color: white;
+}
+fieldset table {
+ /* but keep table layouts in forms clean... */
+ background: none;
+}
+/* Forms */
+fieldset {
+ border: 1px solid #2f6fab;
+ margin: 1em 0 1em 0;
+ padding: 0 1em 1em;
+ line-height: 1.5em;
+}
+ fieldset.nested {
+ margin: 0 0 0.5em 0;
+ padding: 0 0.5em 0.5em;
+ }
+legend {
+ padding: .5em;
+ font-size: 95%;
+}
+form {
+ border: none;
+ margin: 0;
+}
+textarea {
+ width: 100%;
+ padding: .1em;
+}
+select {
+ vertical-align: top;
+}
+/* Table of Contents */
+#toc,
+.toc,
+.mw-warning {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ font-size: 95%;
+}
+#toc h2,
+.toc h2 {
+ display: inline;
+ border: none;
+ padding: 0;
+ font-size: 100%;
+ font-weight: bold;
+}
+#toc #toctitle,
+.toc #toctitle,
+#toc .toctitle,
+.toc .toctitle {
+ text-align: center;
+}
+#toc ul,
+.toc ul {
+ list-style-type: none;
+ list-style-image: none;
+ margin-left: 0;
+ padding-left: 0;
+ text-align: left;
+}
+#toc ul ul,
+.toc ul ul {
+ margin: 0 0 0 2em;
+}
+#toc .toctoggle,
+.toc .toctoggle {
+ font-size: 94%;
+}
+/* Images */
+div.floatright, table.floatright {
+ clear: right;
+ float: right;
+ position: relative;
+ margin: 0 0 .5em .5em;
+ border: 0;
+}
+div.floatright p { font-style: italic; }
+div.floatleft, table.floatleft {
+ float: left;
+ clear: left;
+ position: relative;
+ margin: 0 .5em .5em 0;
+ border: 0;
+}
+div.floatleft p { font-style: italic; }
+/* Thumbnails */
+div.thumb {
+ margin-bottom: .5em;
+ border-style: solid;
+ border-color: white;
+ width: auto;
+ background-color: transparent;
+}
+div.thumbinner {
+ border: 1px solid #ccc;
+ padding: 3px !important;
+ background-color: #f9f9f9;
+ 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 {
+ float: right;
+ border: none !important;
+ background: none !important;
+}
+div.magnify a, div.magnify img {
+ display: block;
+ border: none !important;
+ background: none !important;
+}
+div.tright {
+ clear: right;
+ float: right;
+ border-width: .5em 0 .8em 1.4em;
+}
+div.tleft {
+ float: left;
+ clear: left;
+ margin-right: .5em;
+ border-width: .5em 1.4em .8em 0;
+}
+img.thumbborder {
+ border: 1px solid #dddddd;
+}
+.hiddenStructure {
+ display: none;
+}
+/* Warning */
+.mw-warning {
+ margin-left: 50px;
+ margin-right: 50px;
+ text-align: center;
+}
+/* User Message */
+.usermessage {
+ background-color: #ffce7b;
+ border: 1px solid #ffa500;
+ color: black;
+ font-weight: bold;
+ margin: 2em 0 1em;
+ padding: .5em 1em;
+ vertical-align: middle;
+}
+/* Site Notice */
+#siteNotice {
+ text-align: center;
+ font-size: 0.8em;
+ margin: 0;
+}
+ #siteNotice div,
+ #siteNotice p {
+ margin: 0;
+ padding: 0;
+ margin-bottom: 0.9em;
+ }
+/* Categories */
+.catlinks {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ margin-top: 1em;
+ clear: both;
+}
+/* Sub-navigation */
+#siteSub {
+ display: none;
+}
+#jump-to-nav {
+ display: none;
+}
+#contentSub, #contentSub2 {
+ font-size: 84%;
+ line-height: 1.2em;
+ margin: 0 0 1.4em 1em;
+ color: #7d7d7d;
+ width: auto;
+}
+span.subpages {
+ display: block;
+}
+/* Emulate Center */
+.center {
+ width: 100%;
+ text-align: center;
+}
+*.center * {
+ margin-left: auto;
+ margin-right: auto;
+}
+/* Small for tables and similar */
+.small, .small * {
+ font-size: 94%;
+}
+table.small {
+ font-size: 100%;
+}
+/* Edge Cases for Content */
+h1, h2 {
+ margin-bottom: .6em;
+}
+h3, h4, h5 {
+ margin-bottom: .3em;
+}
+#firstHeading {
+ padding-top: 0;
+ margin-top: 0;
+ padding-top: 0;
+ margin-bottom: 0.1em;
+ line-height: 1.2em;
+ font-size: 1.6em;
+ padding-bottom: 0;
+}
+#content a.external,
+#content a[href ^="gopher://"] {
+ background: url(images/external-link-ltr-icon.png) center right no-repeat;
+ padding: 0 13px 0 0;
+}
+#content a[href ^="https://"],
+.link-https {
+ background: url(images/lock-icon.png) center right no-repeat;
+ padding: 0 18px 0 0;
+}
+#content a[href ^="mailto:"],
+.link-mailto {
+ background: url(images/mail-icon.png) center right no-repeat;
+ padding: 0 18px 0 0;
+}
+#content a[href ^="news://"] {
+ background: url(images/news-icon.png) center right no-repeat;
+ padding: 0 18px 0 0;
+}
+#content a[href ^="ftp://"],
+.link-ftp {
+ background: url(images/file-icon.png) center right no-repeat;
+ padding: 0 18px 0 0;
+}
+#content a[href ^="irc://"],
+#content a.extiw[href ^="irc://"],
+.link-irc {
+ background: url(images/talk-icon.png) center right no-repeat;
+ padding: 0 18px 0 0;
+}
+#content a.external[href $=".ogg"], #content a.external[href $=".OGG"],
+#content a.external[href $=".mid"], #content a.external[href $=".MID"],
+#content a.external[href $=".midi"], #content a.external[href $=".MIDI"],
+#content a.external[href $=".mp3"], #content a.external[href $=".MP3"],
+#content a.external[href $=".wav"], #content a.external[href $=".WAV"],
+#content a.external[href $=".wma"], #content a.external[href $=".WMA"],
+.link-audio {
+ background: url("images/audio-icon.png") center right no-repeat;
+ padding: 0 18px 0 0;
+}
+#content a.external[href $=".ogm"], #content a.external[href $=".OGM"],
+#content a.external[href $=".avi"], #content a.external[href $=".AVI"],
+#content a.external[href $=".mpeg"], #content a.external[href $=".MPEG"],
+#content a.external[href $=".mpg"], #content a.external[href $=".MPG"],
+.link-video {
+ background: url("images/video-icon.png") center right no-repeat;
+ padding: 0 18px 0 0;
+}
+#content a.external[href $=".pdf"], #content a.external[href $=".PDF"],
+#content a.external[href *=".pdf#"], #content a.external[href *=".PDF#"],
+#content a.external[href *=".pdf?"], #content a.external[href *=".PDF?"],
+.link-document {
+ background: url("images/document-icon.png") center right no-repeat;
+ padding: 0 18px 0 0;
+}
+/* Interwiki Styling (Disabled) */
+#content a.extiw,
+#content a.extiw:active {
+ color: #36b;
+ background: none;
+ padding: 0;
+}
+#content a.external {
+ color: #36b;
+}
+#content .printfooter {
+ display: none;
+}
+/* Icon for Usernames */
+#pt-userpage,
+#pt-anonuserpage,
+#pt-login {
+ background: url(images/user-icon.png) left top no-repeat;
+ padding-left: 15px !important;
+ text-transform: none;
+}
+
+.toccolours {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ font-size: 95%;
+}
+#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,
+#ca-watch.icon {
+ margin-right:1px;
+}
+#ca-unwatch.icon a,
+#ca-watch.icon a {
+ margin: 0;
+ padding: 0;
+ outline: none;
+ display: block;
+ width: 26px;
+ height: 2.5em;
+}
+#ca-unwatch.icon a {
+ background-image: url(images/watch-icons.png);
+ background-position: -43px 60%;
+}
+#ca-watch.icon a {
+ background-image: url(images/watch-icons.png);
+ background-position: 5px 60%;
+}
+#ca-unwatch.icon a:hover {
+ background-image: url(images/watch-icons.png);
+ background-position: -67px 60%;
+}
+#ca-watch.icon a:hover {
+ background-image: url(images/watch-icons.png);
+ background-position: -19px 60%;
+}
+#ca-unwatch.icon a.loading,
+#ca-watch.icon a.loading {
+ background-image: url(images/watch-icon-loading.gif);
+ background-position: center 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;
+}
diff --git a/skins/vector/main-rtl.css b/skins/vector/main-rtl.css
new file mode 100644
index 00000000..5387289f
--- /dev/null
+++ b/skins/vector/main-rtl.css
@@ -0,0 +1,1128 @@
+/*
+ * main-rtl.css is automatically generated using CSSJanus, a python script for
+ * creating RTL versions of otherwise LTR stylesheets.
+ *
+ * You may download the tool to rebuild this stylesheet
+ * http://code.google.com/p/cssjanus/
+ *
+ * An online version of this tool can be used at:
+ * http://cssjanus.commoner.com/
+ *
+ * The following command is used to generate the RTL version of this file
+ * ./cssjanus.py --swap_ltr_rtl_in_url < main-ltr.css > main-rtl.css
+ *
+ * Any rules which should not be flipped should be prepended with @noflip in
+ * a comment block.
+ */
+/* Framework */
+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);
+}
+/* Content */
+#content {
+ margin-right: 10em;
+ padding: 1em;
+ background-image: url(images/border.png);
+ background-position: top right;
+ background-repeat: repeat-y;
+ background-color: white;
+}
+/* Head */
+#mw-page-base {
+ height: 5em;
+ background-color: white;
+ background-image: url(images/page-fade.png);
+ background-position: bottom right;
+ background-repeat: repeat-x;
+}
+#mw-head-base {
+ margin-top: -5em;
+ margin-right: 10em;
+ height: 5em;
+ background-image: url(images/border.png);
+ background-position: bottom right;
+ background-repeat: repeat-x;
+}
+#mw-head {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+}
+#mw-head h5 {
+ margin: 0;
+ padding: 0;
+}
+ /* Hide empty portlets */
+ div.emptyPortlet {
+ display: none;
+ }
+ /* Personal */
+ #p-personal {
+ position: absolute;
+ top: 0;
+ margin-right: 10em;
+ left: 0.75em;
+ }
+ #p-personal h5 {
+ display: none;
+ }
+ #p-personal ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ }
+ /* @noflip */
+ #p-personal li {
+ line-height: 1.125em;
+ float: left;
+ }
+ #p-personal li {
+ margin-right: 0.75em;
+ margin-top: 0.5em;
+ font-size: 0.75em;
+ }
+ /* Navigation Containers */
+ #left-navigation {
+ position: absolute;
+ right: 10em;
+ top: 2.5em;
+ }
+ #right-navigation {
+ float: left;
+ margin-top: 2.5em;
+ }
+ /* Navigation Labels */
+ div.vectorTabs h5,
+ div.vectorMenu h5 span {
+ display: none;
+ }
+ /* Namespaces and Views */
+ /* @noflip */
+ div.vectorTabs {
+ float: left;
+ }
+ div.vectorTabs {
+ background-image: url(images/tab-break.png);
+ background-position: bottom right;
+ background-repeat: no-repeat;
+ padding-right: 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;
+ background-image: url(images/tab-normal-fade.png);
+ background-position: bottom right;
+ background-repeat: repeat-x;
+ white-space:nowrap;
+ }
+ /* IGNORED BY IE6 */
+ div.vectorTabs ul > li {
+ display: block;
+ }
+ div.vectorTabs li.selected {
+ background-image: url(images/tab-current-fade.png);
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ div.vectorTabs li a {
+ display: inline-block;
+ height: 2.5em;
+ padding-right: 0.4em;
+ padding-left: 0.4em;
+ background-image: url(images/tab-break.png);
+ background-position: bottom left;
+ background-repeat: no-repeat;
+ }
+ div.vectorTabs li a,
+ div.vectorTabs li a span {
+ color: #0645ad;
+ cursor: pointer;
+ }
+ div.vectorTabs li a span {
+ font-size: 0.8em;
+ }
+ /* IGNORED BY IE6 */
+ div.vectorTabs li > a {
+ display: block;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ div.vectorTabs a span {
+ display: inline-block;
+ padding-top: 1.25em;
+ }
+ /* IGNORED BY IE6 */
+ /* @noflip */
+ div.vectorTabs a > span {
+ float: left;
+ display: block;
+ }
+ div.vectorTabs li.selected a,
+ div.vectorTabs li.selected a span,
+ div.vectorTabs li.selected a:visited
+ div.vectorTabs li.selected a:visited span {
+ color: #333333;
+ text-decoration: none;
+ }
+ div.vectorTabs li.new a,
+ div.vectorTabs li.new a span,
+ div.vectorTabs li.new a:visited,
+ div.vectorTabs li.new a:visited span {
+ color: #a55858;
+ }
+ /* Variants and Actions */
+ /* @noflip */
+ div.vectorMenu {
+ direction: ltr;
+ float: left;
+ background-image: url(images/arrow-down-icon.png);
+ background-position: center center;
+ background-repeat: no-repeat;
+ }
+ /* @noflip */
+ body.rtl div.vectorMenu {
+ direction: rtl;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ /* @noflip */
+ #mw-head div.vectorMenu h5 {
+ float: left;
+ background-image: url(images/tab-break.png);
+ background-repeat: no-repeat;
+ }
+ /* IGNORED BY IE6 */
+ #mw-head div.vectorMenu > h5 {
+ background-image: none;
+ }
+ #mw-head div.vectorMenu h5 {
+ background-position: bottom right;
+ margin-right: -1px;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ /* @noflip */
+ 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 left;
+ }
+ /* IGNORED BY IE6 */
+ div.vectorMenu h5 > a {
+ display: block;
+ }
+ div.vectorMenu div.menu {
+ position: relative;
+ display: none;
+ clear: both;
+ text-align: right;
+ }
+ /* 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;
+ }
+ /* Fixes old versions of FireFox */
+ /* @noflip */
+ body.rtl div.vectorMenu > div.menu,
+ x:-moz-any-link {
+ margin-left: 23px;
+ }
+ div.vectorMenu:hover div.menu {
+ 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-right: -1px;
+ text-align: right;
+ }
+ /* 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: right;
+ line-height: 1em;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ div.vectorMenu li a {
+ display: inline-block;
+ padding: 0.5em;
+ white-space: nowrap;
+ }
+ /* IGNORED BY IE6 */
+ div.vectorMenu li > a {
+ display: block;
+ }
+ div.vectorMenu li a {
+ color: #0645ad;
+ cursor: pointer;
+ font-size: 0.8em;
+ }
+ 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-left: 0.5em;
+ margin-right: 0.5em;
+ }
+ #p-search form,
+ #p-search input {
+ margin: 0;
+ margin-top: 0.4em;
+ }
+ #simpleSearch {
+ margin-top: 0.5em;
+ position: relative;
+ border: solid 1px #AAAAAA;
+ background-color: white;
+ background-image: url(images/search-fade.png);
+ background-position: top right;
+ background-repeat: repeat-x;
+ }
+ #simpleSearch label {
+ font-size: 0.8em;
+ top: 0.25em;
+ }
+ #simpleSearch input#searchInput {
+ margin: 0;
+ border-width: 0;
+ padding: 0.25em;
+ line-height: 1em;
+ font-size: 0.8em;
+ width: 9em;
+ background-color: transparent;
+ }
+ /* OVERRIDDEN BY COMPLIANT BROWSERS */
+ #simpleSearch button#searchButton {
+ margin: 0;
+ padding: 0;
+ width: 1.75em;
+ height: 1.5em;
+ border: none;
+ cursor: pointer;
+ background-color: transparent;
+ background-image: url(images/search-rtl.png);
+ background-position: center center;
+ background-repeat: no-repeat;
+ }
+ /* IGNORED BY IE6 */
+ #simpleSearch > button#searchButton {
+ height: 100%;
+ }
+ .suggestions-special .special-label {
+ font-size: 0.8em;
+ color: gray;
+ }
+ .suggestions-special .special-query {
+ color: black;
+ font-style: italic;
+ }
+ .suggestions-special .special-hover {
+ background-color: silver;
+ }
+/* Panel */
+#mw-panel {
+ position: absolute;
+ top: 160px;
+ padding-top: 1em;
+ width: 10em;
+ right: 0;
+}
+ #mw-panel div.portal {
+ padding-bottom: 1.5em;
+ }
+ #mw-panel div.portal h5 {
+ font-weight: normal;
+ color: #444444;
+ padding: 0.25em;
+ padding-top: 0;
+ padding-right: 1.75em;
+ cursor: default;
+ border: none;
+ font-size: 0.75em;
+ }
+ #mw-panel div.portal div.body {
+ margin: 0;
+ padding-top: 0.5em;
+ margin-right: 1.25em;
+ background-image: url(images/portal-break.png);
+ background-repeat: no-repeat;
+ background-position: top right;
+ }
+ #mw-panel div.portal div.body ul {
+ list-style: none;
+ list-style-image: none;
+ list-style-type: none;
+ padding: 0;
+ margin: 0;
+ }
+ #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;
+ }
+ #mw-panel div.portal div.body ul li a {
+ color: #0645ad;
+ }
+ #mw-panel div.portal div.body ul li a:visited {
+ color: #0b0080;
+ }
+/* Footer */
+#footer {
+ margin-right: 10em;
+ margin-top: 0;
+ padding: 0.75em;
+ background-image: url(images/border.png);
+ background-position: top right;
+ background-repeat: repeat-x;
+}
+#footer ul {
+ list-style: none;
+ list-style-image: none;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+#footer ul li {
+ margin: 0;
+ padding: 0;
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ color: #333333;
+ font-size: 0.7em;
+}
+#footer #footer-icons {
+ float: left;
+}
+/* @noflip */
+body.ltr #footer #footer-places {
+ float: left;
+}
+#footer #footer-info li {
+ line-height: 1.4em;
+}
+#footer #footer-icons li {
+ float: right;
+ margin-right: 0.5em;
+ line-height: 2em;
+}
+#footer #footer-places li {
+ float: right;
+ margin-left: 1em;
+ line-height: 2em;
+}
+/* Logo */
+#p-logo {
+ position: absolute;
+ top: -160px;
+ right: 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: right;
+ clear: both;
+ margin: 0 !important;
+ padding: 0 !important;
+ background-image: url(images/preferences-break.png);
+ background-position: bottom right;
+ background-repeat: no-repeat;
+}
+ #preftoc li {
+ /* Tab */
+ float: right;
+ margin: 0;
+ padding: 0;
+ padding-left: 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 left;
+ background-repeat: no-repeat;
+ }
+ /* IGNORED BY IE6 */
+ #preftoc li:first-child {
+ margin-right: 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 {
+ text-decoration: underline;
+ }
+ #preftoc li.selected a {
+ background-image: url(images/preferences-fade.png);
+ background-position: bottom;
+ background-repeat: repeat-x;
+ color: #333333;
+ text-decoration: none;
+ }
+#preferences {
+ float: right;
+ width: 100%;
+ margin: 0;
+ margin-top: -2px;
+ clear: both;
+ border: solid 1px #cccccc;
+ background-color: #f9f9f9;
+ background-image: url(images/preferences-base.png);
+}
+#preferences fieldset.prefsection {
+ border: none;
+ padding: 0;
+ margin: 1em;
+}
+#preferences fieldset.prefsection fieldset {
+ border: none;
+ border-top: solid 1px #cccccc;
+}
+#preferences legend {
+ color: #666666;
+}
+#preferences fieldset.prefsection legend.mainLegend {
+ display: none;
+}
+#preferences td {
+ padding-right: 0.5em;
+ padding-left: 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-left: 0.25em;
+}
+
+/*
+ * Styles for the user login and create account forms
+ */
+#userlogin, #userloginForm {
+ border: solid 1px #cccccc;
+ padding: 1.2em;
+ margin: .5em;
+ float: right;
+}
+
+#userlogin {
+ min-width: 20em;
+ max-width: 90%;
+ width: 40em;
+}
+
+/*
+ *
+ * The following code is slightly modified from monobook
+ *
+ */
+#content {
+ line-height: 1.5em;
+}
+#bodyContent {
+ font-size: 0.8em;
+}
+/* Links */
+a {
+ text-decoration: none;
+ color: #0645ad;
+ background: none;
+}
+a:visited {
+ color: #0b0080;
+}
+a:active {
+ color: #faa700;
+}
+a:hover {
+ text-decoration: underline;
+}
+a.stub {
+ color: #772233;
+}
+a.new, #p-personal a.new {
+ color: #ba0000;
+}
+a.new:visited, #p-personal a.new:visited {
+ color: #a55858;
+}
+
+/* Inline Elements */
+img {
+ border: none;
+ vertical-align: middle;
+}
+hr {
+ height: 1px;
+ color: #aaa;
+ background-color: #aaa;
+ border: 0;
+ margin: .2em 0 .2em 0;
+}
+
+/* Structural Elements */
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ color: black;
+ background: none;
+ font-weight: normal;
+ margin: 0;
+ padding-top: .5em;
+ padding-bottom: .17em;
+ border-bottom: 1px solid #aaa;
+ width: auto;
+}
+h1 { font-size: 188%; }
+h1 .editsection { font-size: 53%; }
+h2 { font-size: 150%; }
+h2 .editsection { font-size: 67%; }
+h3,
+h4,
+h5,
+h6 {
+ border-bottom: none;
+ font-weight: bold;
+}
+h3 { font-size: 132%; }
+h3 .editsection { font-size: 76%; font-weight: normal; }
+h4 { font-size: 116%; }
+h4 .editsection { font-size: 86%; font-weight: normal; }
+h5 { font-size: 100%; }
+h5 .editsection { font-weight: normal; }
+h6 { font-size: 80%; }
+h6 .editsection { font-size: 125%; font-weight: normal; }
+p {
+ margin: .4em 0 .5em 0;
+ line-height: 1.5em;
+}
+ p img {
+ margin: 0;
+ }
+abbr,
+acronym,
+.explain {
+ border-bottom: 1px dotted black;
+ color: black;
+ background: none;
+ cursor: help;
+}
+q {
+ font-family: Times, "Times New Roman", serif;
+ font-style: italic;
+}
+/* Disabled for now
+blockquote {
+ font-family: Times, "Times New Roman", serif;
+ font-style: italic;
+}*/
+code {
+ background-color: #f9f9f9;
+}
+pre {
+ padding: 1em;
+ border: 1px dashed #2f6fab;
+ color: black;
+ background-color: #f9f9f9;
+ line-height: 1.1em;
+}
+ul {
+ line-height: 1.5em;
+ list-style-type: square;
+ margin: .3em 1.5em 0 0;
+ padding: 0;
+ list-style-image: url(images/bullet-icon.png);
+}
+ol {
+ line-height: 1.5em;
+ margin: .3em 3.2em 0 0;
+ padding: 0;
+ list-style-image: none;
+}
+li {
+ margin-bottom: .1em;
+}
+dt {
+ font-weight: bold;
+ margin-bottom: .1em;
+}
+dl {
+ margin-top: .2em;
+ margin-bottom: .5em;
+}
+dd {
+ line-height: 1.5em;
+ margin-right: 2em;
+ margin-bottom: .1em;
+}
+/* Tables */
+table {
+ font-size: 100%;
+ color: black;
+ /* we don't want the bottom borders of <h2>s to be visible through
+ * floated tables */
+ background-color: white;
+}
+fieldset table {
+ /* but keep table layouts in forms clean... */
+ background: none;
+}
+/* Forms */
+fieldset {
+ border: 1px solid #2f6fab;
+ margin: 1em 0 1em 0;
+ padding: 0 1em 1em;
+ line-height: 1.5em;
+}
+ fieldset.nested {
+ margin: 0 0 0.5em 0;
+ padding: 0 0.5em 0.5em;
+ }
+legend {
+ padding: .5em;
+ font-size: 95%;
+}
+form {
+ border: none;
+ margin: 0;
+}
+textarea {
+ width: 100%;
+ padding: .1em;
+}
+select {
+ vertical-align: top;
+}
+/* Table of Contents */
+#toc,
+.toc,
+.mw-warning {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ font-size: 95%;
+}
+#toc h2,
+.toc h2 {
+ display: inline;
+ border: none;
+ padding: 0;
+ font-size: 100%;
+ font-weight: bold;
+}
+#toc #toctitle,
+.toc #toctitle,
+#toc .toctitle,
+.toc .toctitle {
+ text-align: center;
+}
+#toc ul,
+.toc ul {
+ list-style-type: none;
+ list-style-image: none;
+ margin-right: 0;
+ padding-right: 0;
+ text-align: right;
+}
+#toc ul ul,
+.toc ul ul {
+ margin: 0 2em 0 0;
+}
+#toc .toctoggle,
+.toc .toctoggle {
+ font-size: 94%;
+}
+/* Images */
+div.floatright, table.floatright {
+ clear: left;
+ float: left;
+ position: relative;
+ margin: 0 .5em .5em 0;
+ border: 0;
+}
+div.floatright p { font-style: italic; }
+div.floatleft, table.floatleft {
+ float: right;
+ clear: right;
+ position: relative;
+ margin: 0 0 .5em .5em;
+ border: 0;
+}
+div.floatleft p { font-style: italic; }
+/* Thumbnails */
+div.thumb {
+ margin-bottom: .5em;
+ border-style: solid;
+ border-color: white;
+ width: auto;
+ background-color: transparent;
+}
+div.thumbinner {
+ border: 1px solid #ccc;
+ padding: 3px !important;
+ background-color: #f9f9f9;
+ font-size: 94%;
+ text-align: center;
+ overflow: hidden;
+}
+html .thumbimage {
+ border: 1px solid #ccc;
+}
+html .thumbcaption {
+ border: none;
+ text-align: right;
+ line-height: 1.4em;
+ padding: 3px !important;
+ font-size: 94%;
+}
+div.magnify {
+ float: left;
+ border: none !important;
+ background: none !important;
+}
+div.magnify a, div.magnify img {
+ display: block;
+ border: none !important;
+ background: none !important;
+}
+div.tright {
+ clear: left;
+ float: left;
+ border-width: .5em 1.4em .8em 0;
+}
+div.tleft {
+ float: right;
+ clear: right;
+ margin-left: .5em;
+ border-width: .5em 0 .8em 1.4em;
+}
+img.thumbborder {
+ border: 1px solid #dddddd;
+}
+.hiddenStructure {
+ display: none;
+}
+/* Warning */
+.mw-warning {
+ margin-right: 50px;
+ margin-left: 50px;
+ text-align: center;
+}
+/* User Message */
+.usermessage {
+ background-color: #ffce7b;
+ border: 1px solid #ffa500;
+ color: black;
+ font-weight: bold;
+ margin: 2em 0 1em;
+ padding: .5em 1em;
+ vertical-align: middle;
+}
+/* Site Notice */
+#siteNotice {
+ text-align: center;
+ font-size: 0.8em;
+ margin: 0;
+}
+ #siteNotice div,
+ #siteNotice p {
+ margin: 0;
+ padding: 0;
+ margin-bottom: 0.9em;
+ }
+/* Categories */
+.catlinks {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ margin-top: 1em;
+ clear: both;
+}
+/* Sub-navigation */
+#siteSub {
+ display: none;
+}
+#jump-to-nav {
+ display: none;
+}
+#contentSub, #contentSub2 {
+ font-size: 84%;
+ line-height: 1.2em;
+ margin: 0 1em 1.4em 0;
+ color: #7d7d7d;
+ width: auto;
+}
+span.subpages {
+ display: block;
+}
+/* Emulate Center */
+.center {
+ width: 100%;
+ text-align: center;
+}
+*.center * {
+ margin-right: auto;
+ margin-left: auto;
+}
+/* Small for tables and similar */
+.small, .small * {
+ font-size: 94%;
+}
+table.small {
+ font-size: 100%;
+}
+/* Edge Cases for Content */
+h1, h2 {
+ margin-bottom: .6em;
+}
+h3, h4, h5 {
+ margin-bottom: .3em;
+}
+#firstHeading {
+ padding-top: 0;
+ margin-top: 0;
+ padding-top: 0;
+ margin-bottom: 0.1em;
+ line-height: 1.2em;
+ font-size: 1.6em;
+ padding-bottom: 0;
+}
+#content a.external,
+#content a[href ^="gopher://"] {
+ background: url(images/external-link-rtl-icon.png) center left no-repeat;
+ padding: 0 0 0 13px;
+}
+#content a[href ^="https://"],
+.link-https {
+ background: url(images/lock-icon.png) center left no-repeat;
+ padding: 0 0 0 18px;
+}
+#content a[href ^="mailto:"],
+.link-mailto {
+ background: url(images/mail-icon.png) center left no-repeat;
+ padding: 0 0 0 18px;
+}
+#content a[href ^="news://"] {
+ background: url(images/news-icon.png) center left no-repeat;
+ padding: 0 0 0 18px;
+}
+#content a[href ^="ftp://"],
+.link-ftp {
+ background: url(images/file-icon.png) center left no-repeat;
+ padding: 0 0 0 18px;
+}
+#content a[href ^="irc://"],
+#content a.extiw[href ^="irc://"],
+.link-irc {
+ background: url(images/talk-icon.png) center left no-repeat;
+ padding: 0 0 0 18px;
+}
+#content a.external[href $=".ogg"], #content a.external[href $=".OGG"],
+#content a.external[href $=".mid"], #content a.external[href $=".MID"],
+#content a.external[href $=".midi"], #content a.external[href $=".MIDI"],
+#content a.external[href $=".mp3"], #content a.external[href $=".MP3"],
+#content a.external[href $=".wav"], #content a.external[href $=".WAV"],
+#content a.external[href $=".wma"], #content a.external[href $=".WMA"],
+.link-audio {
+ background: url("images/audio-icon.png") center left no-repeat;
+ padding: 0 0 0 18px;
+}
+#content a.external[href $=".ogm"], #content a.external[href $=".OGM"],
+#content a.external[href $=".avi"], #content a.external[href $=".AVI"],
+#content a.external[href $=".mpeg"], #content a.external[href $=".MPEG"],
+#content a.external[href $=".mpg"], #content a.external[href $=".MPG"],
+.link-video {
+ background: url("images/video-icon.png") center left no-repeat;
+ padding: 0 0 0 18px;
+}
+#content a.external[href $=".pdf"], #content a.external[href $=".PDF"],
+#content a.external[href *=".pdf#"], #content a.external[href *=".PDF#"],
+#content a.external[href *=".pdf?"], #content a.external[href *=".PDF?"],
+.link-document {
+ background: url("images/document-icon.png") center left no-repeat;
+ padding: 0 0 0 18px;
+}
+/* Interwiki Styling (Disabled) */
+#content a.extiw,
+#content a.extiw:active {
+ color: #36b;
+ background: none;
+ padding: 0;
+}
+#content a.external {
+ color: #36b;
+}
+#content .printfooter {
+ display: none;
+}
+/* Icon for Usernames */
+#pt-userpage,
+#pt-anonuserpage,
+#pt-login {
+ background: url(images/user-icon.png) right top no-repeat;
+ padding-right: 15px !important;
+ text-transform: none;
+}
+
+.toccolours {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ font-size: 95%;
+}
+#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,
+#ca-watch.icon {
+ margin-left:1px;
+}
+#ca-unwatch.icon a,
+#ca-watch.icon a {
+ margin: 0;
+ padding: 0;
+ outline: none;
+ display: block;
+ width: 26px;
+ height: 2.5em;
+}
+#ca-unwatch.icon a {
+ background-image: url(images/watch-icons.png);
+ background-position: -43px 60%;
+}
+#ca-watch.icon a {
+ background-image: url(images/watch-icons.png);
+ background-position: 5px 60%;
+}
+#ca-unwatch.icon a:hover {
+ background-image: url(images/watch-icons.png);
+ background-position: -67px 60%;
+}
+#ca-watch.icon a:hover {
+ background-image: url(images/watch-icons.png);
+ background-position: -19px 60%;
+}
+#ca-unwatch.icon a.loading,
+#ca-watch.icon a.loading {
+ background-image: url(images/watch-icon-loading.gif);
+ background-position: center 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:left bottom;
+ background-repeat:no-repeat;
+}
diff --git a/skins/vector/wiki-indexed.png b/skins/vector/wiki-indexed.png
new file mode 100644
index 00000000..189a2ae3
--- /dev/null
+++ b/skins/vector/wiki-indexed.png
Binary files differ
diff --git a/skins/vector/wiki.png b/skins/vector/wiki.png
new file mode 100644
index 00000000..2463b521
--- /dev/null
+++ b/skins/vector/wiki.png
Binary files differ