From 246b38834224f9575f7b22cf84428ff615cb5acd Mon Sep 17 00:00:00 2001 From: Nicolas Vigier Date: Mon, 24 Oct 2011 18:01:35 +0000 Subject: add mediawiki themes --- skins/Chick.deps.php | 13 + skins/Chick.php | 32 + skins/CologneBlue.php | 366 ++ skins/Modern.deps.php | 12 + skins/Modern.php | 338 ++ skins/MonoBook.deps.php | 12 + skins/MonoBook.php | 346 ++ skins/MySkin.deps.php | 13 + skins/MySkin.php | 20 + skins/Nostalgia.php | 119 + skins/Simple.deps.php | 13 + skins/Simple.php | 68 + skins/Standard.php | 283 ++ skins/Vector.deps.php | 11 + skins/Vector.php | 767 ++++ skins/chick/IE50Fixes.css | 67 + skins/chick/IE55Fixes.css | 81 + skins/chick/IE60Fixes.css | 79 + skins/chick/main.css | 411 ++ skins/common/IE80Fixes.css | 15 + skins/common/IEFixes.js | 128 + skins/common/Makefile | 2 + skins/common/ajax.js | 167 + skins/common/ajaxwatch.js | 180 + skins/common/block.js | 57 + skins/common/changepassword.js | 16 + skins/common/cologneblue.css | 101 + skins/common/commonPrint.css | 249 ++ skins/common/common_rtl.css | 59 + skins/common/diff.css | 143 + skins/common/diff.js | 20 + skins/common/edit.js | 231 ++ skins/common/enhancedchanges.js | 40 + skins/common/feed.css | 95 + skins/common/history.js | 94 + skins/common/htmlform.js | 40 + skins/common/images/Arr_.png | Bin 0 -> 246 bytes skins/common/images/Arr_d.png | Bin 0 -> 215 bytes skins/common/images/Arr_l.png | Bin 0 -> 263 bytes skins/common/images/Arr_r.png | Bin 0 -> 210 bytes skins/common/images/Arr_u.png | Bin 0 -> 425 bytes skins/common/images/Checker-16x16.png | Bin 0 -> 81 bytes skins/common/images/Zoom_sans.gif | Bin 0 -> 901 bytes skins/common/images/add.png | Bin 0 -> 3329 bytes skins/common/images/ajax-loader.gif | Bin 0 -> 3208 bytes skins/common/images/ar/button_bold.png | Bin 0 -> 741 bytes skins/common/images/ar/button_headline.png | Bin 0 -> 629 bytes skins/common/images/ar/button_italic.png | Bin 0 -> 692 bytes skins/common/images/ar/button_link.png | Bin 0 -> 741 bytes skins/common/images/ar/button_nowiki.png | Bin 0 -> 1185 bytes skins/common/images/arrow_disabled_first_25.png | Bin 0 -> 481 bytes skins/common/images/arrow_disabled_last_25.png | Bin 0 -> 480 bytes skins/common/images/arrow_disabled_left_25.png | Bin 0 -> 460 bytes skins/common/images/arrow_disabled_right_25.png | Bin 0 -> 447 bytes skins/common/images/arrow_first_25.png | Bin 0 -> 482 bytes skins/common/images/arrow_last_25.png | Bin 0 -> 484 bytes skins/common/images/arrow_left_25.png | Bin 0 -> 462 bytes skins/common/images/arrow_right_25.png | Bin 0 -> 449 bytes skins/common/images/be-tarask/button_bold.png | Bin 0 -> 554 bytes skins/common/images/be-tarask/button_italic.png | Bin 0 -> 592 bytes skins/common/images/be-tarask/button_link.png | Bin 0 -> 466 bytes skins/common/images/bullet.gif | Bin 0 -> 50 bytes skins/common/images/button_bold.png | Bin 0 -> 288 bytes skins/common/images/button_extlink.png | Bin 0 -> 494 bytes skins/common/images/button_headline.png | Bin 0 -> 465 bytes skins/common/images/button_hr.png | Bin 0 -> 251 bytes skins/common/images/button_image.png | Bin 0 -> 584 bytes skins/common/images/button_italic.png | Bin 0 -> 292 bytes skins/common/images/button_link.png | Bin 0 -> 337 bytes skins/common/images/button_math.png | Bin 0 -> 617 bytes skins/common/images/button_media.png | Bin 0 -> 780 bytes skins/common/images/button_nowiki.png | Bin 0 -> 352 bytes skins/common/images/button_sig.png | Bin 0 -> 953 bytes skins/common/images/button_template.png | Bin 0 -> 233 bytes skins/common/images/cyrl/LICENSE | 17 + skins/common/images/cyrl/button_bold.png | Bin 0 -> 275 bytes skins/common/images/cyrl/button_italic.png | Bin 0 -> 460 bytes skins/common/images/cyrl/button_link.png | Bin 0 -> 347 bytes skins/common/images/de/button_bold.png | Bin 0 -> 328 bytes skins/common/images/de/button_italic.png | Bin 0 -> 351 bytes skins/common/images/diffunderline.gif | Bin 0 -> 52 bytes skins/common/images/fa/button_bold.png | Bin 0 -> 500 bytes skins/common/images/fa/button_headline.png | Bin 0 -> 434 bytes skins/common/images/fa/button_italic.png | Bin 0 -> 573 bytes skins/common/images/fa/button_link.png | Bin 0 -> 535 bytes skins/common/images/fa/button_nowiki.png | Bin 0 -> 1185 bytes skins/common/images/feed-icon.png | Bin 0 -> 557 bytes skins/common/images/gnu-fdl.png | Bin 0 -> 1730 bytes skins/common/images/icons/COPYING | 43 + skins/common/images/icons/fileicon-c.png | Bin 0 -> 2211 bytes skins/common/images/icons/fileicon-cpp.png | Bin 0 -> 1882 bytes skins/common/images/icons/fileicon-deb.png | Bin 0 -> 4801 bytes skins/common/images/icons/fileicon-djvu.png | Bin 0 -> 10752 bytes skins/common/images/icons/fileicon-djvu.xcf | Bin 0 -> 83394 bytes skins/common/images/icons/fileicon-dvi.png | Bin 0 -> 12778 bytes skins/common/images/icons/fileicon-exe.png | Bin 0 -> 5680 bytes skins/common/images/icons/fileicon-h.png | Bin 0 -> 1191 bytes skins/common/images/icons/fileicon-html.png | Bin 0 -> 7422 bytes skins/common/images/icons/fileicon-iso.png | Bin 0 -> 6450 bytes skins/common/images/icons/fileicon-java.png | Bin 0 -> 5989 bytes skins/common/images/icons/fileicon-mid.png | Bin 0 -> 6657 bytes skins/common/images/icons/fileicon-mov.png | Bin 0 -> 7716 bytes skins/common/images/icons/fileicon-o.png | Bin 0 -> 2204 bytes skins/common/images/icons/fileicon-ogg.png | Bin 0 -> 3750 bytes skins/common/images/icons/fileicon-ogg.xcf | Bin 0 -> 40236 bytes skins/common/images/icons/fileicon-pdf.png | Bin 0 -> 4976 bytes skins/common/images/icons/fileicon-ps.png | Bin 0 -> 3012 bytes skins/common/images/icons/fileicon-rm.png | Bin 0 -> 2851 bytes skins/common/images/icons/fileicon-rpm.png | Bin 0 -> 4103 bytes skins/common/images/icons/fileicon-svg.png | Bin 0 -> 5094 bytes skins/common/images/icons/fileicon-tar.png | Bin 0 -> 6347 bytes skins/common/images/icons/fileicon-tex.png | Bin 0 -> 3997 bytes skins/common/images/icons/fileicon-ttf.png | Bin 0 -> 3469 bytes skins/common/images/icons/fileicon-txt.png | Bin 0 -> 3638 bytes skins/common/images/icons/fileicon.png | Bin 0 -> 1121 bytes skins/common/images/ksh/LICENSE | 7 + skins/common/images/ksh/button_S_italic.png | Bin 0 -> 3206 bytes skins/common/images/link_icon.gif | Bin 0 -> 342 bytes skins/common/images/magnify-clip.png | Bin 0 -> 204 bytes skins/common/images/mediawiki.png | Bin 0 -> 22987 bytes skins/common/images/nextredirectltr.png | Bin 0 -> 187 bytes skins/common/images/nextredirectrtl.png | Bin 0 -> 187 bytes skins/common/images/poweredby_mediawiki_88x31.png | Bin 0 -> 1927 bytes skins/common/images/public-domain.png | Bin 0 -> 2251 bytes skins/common/images/redirectltr.png | Bin 0 -> 381 bytes skins/common/images/redirectrtl.png | Bin 0 -> 381 bytes skins/common/images/remove.png | Bin 0 -> 3346 bytes skins/common/images/sort_down.gif | Bin 0 -> 464 bytes skins/common/images/sort_none.gif | Bin 0 -> 462 bytes skins/common/images/sort_up.gif | Bin 0 -> 466 bytes skins/common/images/spinner.gif | Bin 0 -> 4648 bytes skins/common/images/tooltip_icon.png | Bin 0 -> 430 bytes skins/common/images/wiki.png | Bin 0 -> 24801 bytes skins/common/jquery.js | 4384 ++++++++++++++++++++ skins/common/jquery.min.js | 433 ++ skins/common/metadata.js | 49 + skins/common/mwsuggest.js | 995 +++++ skins/common/nostalgia.css | 17 + skins/common/oldshared.css | 383 ++ skins/common/prefs.js | 217 + skins/common/preview.js | 53 + skins/common/protect.js | 351 ++ skins/common/quickbar-right.css | 1 + skins/common/quickbar.css | 1 + skins/common/rightclickedit.js | 48 + skins/common/search.js | 50 + skins/common/shared.css | 831 ++++ skins/common/upload.js | 343 ++ skins/common/wikibits.js | 1042 +++++ skins/common/wikiprintable.css | 46 + skins/common/wikistandard.css | 48 + skins/modern/audio.png | Bin 0 -> 312 bytes skins/modern/bullet.gif | Bin 0 -> 50 bytes skins/modern/discussionitem_icon.gif | Bin 0 -> 549 bytes skins/modern/document.png | Bin 0 -> 270 bytes skins/modern/external.png | Bin 0 -> 165 bytes skins/modern/file_icon.gif | Bin 0 -> 323 bytes skins/modern/footer-grad.png | Bin 0 -> 149 bytes skins/modern/link_icon.gif | Bin 0 -> 342 bytes skins/modern/lock_icon.gif | Bin 0 -> 321 bytes skins/modern/mail_icon.gif | Bin 0 -> 321 bytes skins/modern/main.css | 923 +++++ skins/modern/news_icon.png | Bin 0 -> 297 bytes skins/modern/print.css | 10 + skins/modern/rtl.css | 163 + skins/modern/video.png | Bin 0 -> 215 bytes skins/monobook/FF2Fixes.css | 4 + skins/monobook/IE50Fixes.css | 67 + skins/monobook/IE55Fixes.css | 85 + skins/monobook/IE60Fixes.css | 98 + skins/monobook/IE70Fixes.css | 84 + skins/monobook/Opera6Fixes.css | 20 + skins/monobook/Opera7Fixes.css | 21 + skins/monobook/Opera9Fixes.css | 11 + skins/monobook/audio.png | Bin 0 -> 312 bytes skins/monobook/bullet.gif | Bin 0 -> 50 bytes skins/monobook/discussionitem_icon.gif | Bin 0 -> 549 bytes skins/monobook/document.png | Bin 0 -> 270 bytes skins/monobook/external-rtl.png | Bin 0 -> 198 bytes skins/monobook/external.png | Bin 0 -> 165 bytes skins/monobook/file_icon.gif | Bin 0 -> 323 bytes skins/monobook/headbg.jpg | Bin 0 -> 7881 bytes skins/monobook/link_icon.gif | Bin 0 -> 342 bytes skins/monobook/lock_icon.gif | Bin 0 -> 918 bytes skins/monobook/magnify-clip.png | Bin 0 -> 170 bytes skins/monobook/mail_icon.gif | Bin 0 -> 321 bytes skins/monobook/main.css | 1308 ++++++ skins/monobook/news_icon.png | Bin 0 -> 297 bytes skins/monobook/required.gif | Bin 0 -> 47 bytes skins/monobook/rtl.css | 251 ++ skins/monobook/user.gif | Bin 0 -> 325 bytes skins/monobook/video.png | Bin 0 -> 169 bytes skins/monobook/wiki-indexed.png | Bin 0 -> 8205 bytes skins/monobook/wiki.png | Bin 0 -> 22987 bytes skins/myskin/main.css | 1 + skins/simple/discussionitem_icon.gif | Bin 0 -> 549 bytes skins/simple/external.png | Bin 0 -> 165 bytes skins/simple/file_icon.gif | Bin 0 -> 323 bytes skins/simple/link_icon.gif | Bin 0 -> 342 bytes skins/simple/lock_icon.gif | Bin 0 -> 321 bytes skins/simple/mail_icon.gif | Bin 0 -> 321 bytes skins/simple/main.css | 392 ++ skins/simple/rtl.css | 185 + skins/vector/Makefile | 18 + skins/vector/csshover.htc | 262 ++ skins/vector/cssjanus/COPYING | 13 + skins/vector/cssjanus/LICENSE | 202 + skins/vector/cssjanus/README | 91 + skins/vector/cssjanus/cssjanus.py | 574 +++ skins/vector/cssjanus/csslex.py | 114 + skins/vector/experiments/babaco-colors-a.css | 109 + skins/vector/experiments/babaco-colors-b.css | 67 + skins/vector/experiments/babaco-colors-c.css | 91 + skins/vector/experiments/images/new-border.png | Bin 0 -> 124 bytes .../experiments/images/new-portal-break-ltr.png | Bin 0 -> 891 bytes .../experiments/images/new-portal-break-rtl.png | Bin 0 -> 891 bytes skins/vector/experiments/images/page-base-fade.png | Bin 0 -> 306 bytes .../experiments/images/page-base-updated.png | Bin 0 -> 124 bytes .../vector/experiments/images/tab-active-first.png | Bin 0 -> 981 bytes .../vector/experiments/images/tab-active-last.png | Bin 0 -> 980 bytes skins/vector/experiments/images/tab-fade.png | Bin 0 -> 226 bytes skins/vector/experiments/images/tab-first.png | Bin 0 -> 1057 bytes skins/vector/experiments/images/tab-last.png | Bin 0 -> 1057 bytes skins/vector/experiments/images/tab-new-fade.png | Bin 0 -> 216 bytes skins/vector/experiments/new-tabs.css | 322 ++ skins/vector/images/arrow-down-icon.png | Bin 0 -> 181 bytes skins/vector/images/audio-icon.png | Bin 0 -> 345 bytes skins/vector/images/border.png | Bin 0 -> 119 bytes skins/vector/images/bullet-icon.png | Bin 0 -> 152 bytes skins/vector/images/document-icon.png | Bin 0 -> 345 bytes skins/vector/images/edit-icon.png | Bin 0 -> 358 bytes skins/vector/images/external-link-ltr-icon.png | Bin 0 -> 279 bytes skins/vector/images/external-link-rtl-icon.png | Bin 0 -> 277 bytes skins/vector/images/file-icon.png | Bin 0 -> 402 bytes skins/vector/images/link-icon.png | Bin 0 -> 429 bytes skins/vector/images/lock-icon.png | Bin 0 -> 370 bytes skins/vector/images/magnify-clip.png | Bin 0 -> 204 bytes skins/vector/images/mail-icon.png | Bin 0 -> 375 bytes skins/vector/images/news-icon.png | Bin 0 -> 359 bytes skins/vector/images/page-base.png | Bin 0 -> 119 bytes skins/vector/images/page-fade.png | Bin 0 -> 253 bytes skins/vector/images/portal-break-ltr.png | Bin 0 -> 287 bytes skins/vector/images/portal-break-rtl.png | Bin 0 -> 280 bytes skins/vector/images/portal-break.png | Bin 0 -> 242 bytes skins/vector/images/preferences-base.png | Bin 0 -> 119 bytes skins/vector/images/preferences-break.png | Bin 0 -> 286 bytes skins/vector/images/preferences-edge.png | Bin 0 -> 119 bytes skins/vector/images/preferences-fade.png | Bin 0 -> 248 bytes skins/vector/images/search-fade.png | Bin 0 -> 185 bytes skins/vector/images/search-ltr.png | Bin 0 -> 214 bytes skins/vector/images/search-rtl.png | Bin 0 -> 214 bytes skins/vector/images/tab-break.png | Bin 0 -> 263 bytes skins/vector/images/tab-current-fade.png | Bin 0 -> 121 bytes skins/vector/images/tab-normal-fade.png | Bin 0 -> 254 bytes skins/vector/images/talk-icon.png | Bin 0 -> 377 bytes skins/vector/images/user-icon.png | Bin 0 -> 345 bytes skins/vector/images/video-icon.png | Bin 0 -> 395 bytes skins/vector/images/watch-icon-loading.gif | Bin 0 -> 840 bytes skins/vector/images/watch-icons.png | Bin 0 -> 1745 bytes skins/vector/main-ltr.css | 1128 +++++ skins/vector/main-rtl.css | 1128 +++++ skins/vector/wiki-indexed.png | Bin 0 -> 8205 bytes skins/vector/wiki.png | Bin 0 -> 22987 bytes 263 files changed, 21789 insertions(+) create mode 100644 skins/Chick.deps.php create mode 100644 skins/Chick.php create mode 100644 skins/CologneBlue.php create mode 100644 skins/Modern.deps.php create mode 100644 skins/Modern.php create mode 100644 skins/MonoBook.deps.php create mode 100644 skins/MonoBook.php create mode 100644 skins/MySkin.deps.php create mode 100644 skins/MySkin.php create mode 100644 skins/Nostalgia.php create mode 100644 skins/Simple.deps.php create mode 100644 skins/Simple.php create mode 100644 skins/Standard.php create mode 100644 skins/Vector.deps.php create mode 100644 skins/Vector.php create mode 100644 skins/chick/IE50Fixes.css create mode 100644 skins/chick/IE55Fixes.css create mode 100644 skins/chick/IE60Fixes.css create mode 100644 skins/chick/main.css create mode 100644 skins/common/IE80Fixes.css create mode 100644 skins/common/IEFixes.js create mode 100644 skins/common/Makefile create mode 100644 skins/common/ajax.js create mode 100644 skins/common/ajaxwatch.js create mode 100644 skins/common/block.js create mode 100644 skins/common/changepassword.js create mode 100644 skins/common/cologneblue.css create mode 100644 skins/common/commonPrint.css create mode 100644 skins/common/common_rtl.css create mode 100644 skins/common/diff.css create mode 100644 skins/common/diff.js create mode 100644 skins/common/edit.js create mode 100644 skins/common/enhancedchanges.js create mode 100644 skins/common/feed.css create mode 100644 skins/common/history.js create mode 100644 skins/common/htmlform.js create mode 100644 skins/common/images/Arr_.png create mode 100644 skins/common/images/Arr_d.png create mode 100644 skins/common/images/Arr_l.png create mode 100644 skins/common/images/Arr_r.png create mode 100644 skins/common/images/Arr_u.png create mode 100644 skins/common/images/Checker-16x16.png create mode 100644 skins/common/images/Zoom_sans.gif create mode 100644 skins/common/images/add.png create mode 100644 skins/common/images/ajax-loader.gif create mode 100644 skins/common/images/ar/button_bold.png create mode 100644 skins/common/images/ar/button_headline.png create mode 100644 skins/common/images/ar/button_italic.png create mode 100644 skins/common/images/ar/button_link.png create mode 100644 skins/common/images/ar/button_nowiki.png create mode 100644 skins/common/images/arrow_disabled_first_25.png create mode 100644 skins/common/images/arrow_disabled_last_25.png create mode 100644 skins/common/images/arrow_disabled_left_25.png create mode 100644 skins/common/images/arrow_disabled_right_25.png create mode 100644 skins/common/images/arrow_first_25.png create mode 100644 skins/common/images/arrow_last_25.png create mode 100644 skins/common/images/arrow_left_25.png create mode 100644 skins/common/images/arrow_right_25.png create mode 100644 skins/common/images/be-tarask/button_bold.png create mode 100644 skins/common/images/be-tarask/button_italic.png create mode 100644 skins/common/images/be-tarask/button_link.png create mode 100644 skins/common/images/bullet.gif create mode 100644 skins/common/images/button_bold.png create mode 100644 skins/common/images/button_extlink.png create mode 100644 skins/common/images/button_headline.png create mode 100644 skins/common/images/button_hr.png create mode 100644 skins/common/images/button_image.png create mode 100644 skins/common/images/button_italic.png create mode 100644 skins/common/images/button_link.png create mode 100644 skins/common/images/button_math.png create mode 100644 skins/common/images/button_media.png create mode 100644 skins/common/images/button_nowiki.png create mode 100644 skins/common/images/button_sig.png create mode 100644 skins/common/images/button_template.png create mode 100644 skins/common/images/cyrl/LICENSE create mode 100644 skins/common/images/cyrl/button_bold.png create mode 100644 skins/common/images/cyrl/button_italic.png create mode 100644 skins/common/images/cyrl/button_link.png create mode 100644 skins/common/images/de/button_bold.png create mode 100644 skins/common/images/de/button_italic.png create mode 100644 skins/common/images/diffunderline.gif create mode 100644 skins/common/images/fa/button_bold.png create mode 100644 skins/common/images/fa/button_headline.png create mode 100644 skins/common/images/fa/button_italic.png create mode 100644 skins/common/images/fa/button_link.png create mode 100644 skins/common/images/fa/button_nowiki.png create mode 100644 skins/common/images/feed-icon.png create mode 100644 skins/common/images/gnu-fdl.png create mode 100644 skins/common/images/icons/COPYING create mode 100644 skins/common/images/icons/fileicon-c.png create mode 100644 skins/common/images/icons/fileicon-cpp.png create mode 100644 skins/common/images/icons/fileicon-deb.png create mode 100644 skins/common/images/icons/fileicon-djvu.png create mode 100644 skins/common/images/icons/fileicon-djvu.xcf create mode 100644 skins/common/images/icons/fileicon-dvi.png create mode 100644 skins/common/images/icons/fileicon-exe.png create mode 100644 skins/common/images/icons/fileicon-h.png create mode 100644 skins/common/images/icons/fileicon-html.png create mode 100644 skins/common/images/icons/fileicon-iso.png create mode 100644 skins/common/images/icons/fileicon-java.png create mode 100644 skins/common/images/icons/fileicon-mid.png create mode 100644 skins/common/images/icons/fileicon-mov.png create mode 100644 skins/common/images/icons/fileicon-o.png create mode 100644 skins/common/images/icons/fileicon-ogg.png create mode 100644 skins/common/images/icons/fileicon-ogg.xcf create mode 100644 skins/common/images/icons/fileicon-pdf.png create mode 100644 skins/common/images/icons/fileicon-ps.png create mode 100644 skins/common/images/icons/fileicon-rm.png create mode 100644 skins/common/images/icons/fileicon-rpm.png create mode 100644 skins/common/images/icons/fileicon-svg.png create mode 100644 skins/common/images/icons/fileicon-tar.png create mode 100644 skins/common/images/icons/fileicon-tex.png create mode 100644 skins/common/images/icons/fileicon-ttf.png create mode 100644 skins/common/images/icons/fileicon-txt.png create mode 100644 skins/common/images/icons/fileicon.png create mode 100644 skins/common/images/ksh/LICENSE create mode 100644 skins/common/images/ksh/button_S_italic.png create mode 100644 skins/common/images/link_icon.gif create mode 100644 skins/common/images/magnify-clip.png create mode 100644 skins/common/images/mediawiki.png create mode 100644 skins/common/images/nextredirectltr.png create mode 100644 skins/common/images/nextredirectrtl.png create mode 100644 skins/common/images/poweredby_mediawiki_88x31.png create mode 100644 skins/common/images/public-domain.png create mode 100644 skins/common/images/redirectltr.png create mode 100644 skins/common/images/redirectrtl.png create mode 100644 skins/common/images/remove.png create mode 100644 skins/common/images/sort_down.gif create mode 100644 skins/common/images/sort_none.gif create mode 100644 skins/common/images/sort_up.gif create mode 100644 skins/common/images/spinner.gif create mode 100644 skins/common/images/tooltip_icon.png create mode 100644 skins/common/images/wiki.png create mode 100644 skins/common/jquery.js create mode 100644 skins/common/jquery.min.js create mode 100644 skins/common/metadata.js create mode 100644 skins/common/mwsuggest.js create mode 100644 skins/common/nostalgia.css create mode 100644 skins/common/oldshared.css create mode 100644 skins/common/prefs.js create mode 100644 skins/common/preview.js create mode 100644 skins/common/protect.js create mode 100644 skins/common/quickbar-right.css create mode 100644 skins/common/quickbar.css create mode 100644 skins/common/rightclickedit.js create mode 100644 skins/common/search.js create mode 100644 skins/common/shared.css create mode 100644 skins/common/upload.js create mode 100644 skins/common/wikibits.js create mode 100644 skins/common/wikiprintable.css create mode 100644 skins/common/wikistandard.css create mode 100644 skins/modern/audio.png create mode 100644 skins/modern/bullet.gif create mode 100644 skins/modern/discussionitem_icon.gif create mode 100644 skins/modern/document.png create mode 100644 skins/modern/external.png create mode 100644 skins/modern/file_icon.gif create mode 100644 skins/modern/footer-grad.png create mode 100644 skins/modern/link_icon.gif create mode 100644 skins/modern/lock_icon.gif create mode 100644 skins/modern/mail_icon.gif create mode 100644 skins/modern/main.css create mode 100644 skins/modern/news_icon.png create mode 100644 skins/modern/print.css create mode 100644 skins/modern/rtl.css create mode 100644 skins/modern/video.png create mode 100644 skins/monobook/FF2Fixes.css create mode 100644 skins/monobook/IE50Fixes.css create mode 100644 skins/monobook/IE55Fixes.css create mode 100644 skins/monobook/IE60Fixes.css create mode 100644 skins/monobook/IE70Fixes.css create mode 100644 skins/monobook/Opera6Fixes.css create mode 100644 skins/monobook/Opera7Fixes.css create mode 100644 skins/monobook/Opera9Fixes.css create mode 100644 skins/monobook/audio.png create mode 100644 skins/monobook/bullet.gif create mode 100644 skins/monobook/discussionitem_icon.gif create mode 100644 skins/monobook/document.png create mode 100644 skins/monobook/external-rtl.png create mode 100644 skins/monobook/external.png create mode 100644 skins/monobook/file_icon.gif create mode 100644 skins/monobook/headbg.jpg create mode 100644 skins/monobook/link_icon.gif create mode 100644 skins/monobook/lock_icon.gif create mode 100644 skins/monobook/magnify-clip.png create mode 100644 skins/monobook/mail_icon.gif create mode 100644 skins/monobook/main.css create mode 100644 skins/monobook/news_icon.png create mode 100644 skins/monobook/required.gif create mode 100644 skins/monobook/rtl.css create mode 100644 skins/monobook/user.gif create mode 100644 skins/monobook/video.png create mode 100644 skins/monobook/wiki-indexed.png create mode 100644 skins/monobook/wiki.png create mode 100644 skins/myskin/main.css create mode 100644 skins/simple/discussionitem_icon.gif create mode 100644 skins/simple/external.png create mode 100644 skins/simple/file_icon.gif create mode 100644 skins/simple/link_icon.gif create mode 100644 skins/simple/lock_icon.gif create mode 100644 skins/simple/mail_icon.gif create mode 100644 skins/simple/main.css create mode 100644 skins/simple/rtl.css create mode 100644 skins/vector/Makefile create mode 100644 skins/vector/csshover.htc create mode 100644 skins/vector/cssjanus/COPYING create mode 100644 skins/vector/cssjanus/LICENSE create mode 100644 skins/vector/cssjanus/README create mode 100755 skins/vector/cssjanus/cssjanus.py create mode 100755 skins/vector/cssjanus/csslex.py create mode 100644 skins/vector/experiments/babaco-colors-a.css create mode 100644 skins/vector/experiments/babaco-colors-b.css create mode 100644 skins/vector/experiments/babaco-colors-c.css create mode 100644 skins/vector/experiments/images/new-border.png create mode 100644 skins/vector/experiments/images/new-portal-break-ltr.png create mode 100644 skins/vector/experiments/images/new-portal-break-rtl.png create mode 100644 skins/vector/experiments/images/page-base-fade.png create mode 100644 skins/vector/experiments/images/page-base-updated.png create mode 100644 skins/vector/experiments/images/tab-active-first.png create mode 100644 skins/vector/experiments/images/tab-active-last.png create mode 100644 skins/vector/experiments/images/tab-fade.png create mode 100644 skins/vector/experiments/images/tab-first.png create mode 100644 skins/vector/experiments/images/tab-last.png create mode 100644 skins/vector/experiments/images/tab-new-fade.png create mode 100644 skins/vector/experiments/new-tabs.css create mode 100644 skins/vector/images/arrow-down-icon.png create mode 100644 skins/vector/images/audio-icon.png create mode 100644 skins/vector/images/border.png create mode 100644 skins/vector/images/bullet-icon.png create mode 100644 skins/vector/images/document-icon.png create mode 100644 skins/vector/images/edit-icon.png create mode 100644 skins/vector/images/external-link-ltr-icon.png create mode 100644 skins/vector/images/external-link-rtl-icon.png create mode 100644 skins/vector/images/file-icon.png create mode 100644 skins/vector/images/link-icon.png create mode 100644 skins/vector/images/lock-icon.png create mode 100644 skins/vector/images/magnify-clip.png create mode 100644 skins/vector/images/mail-icon.png create mode 100644 skins/vector/images/news-icon.png create mode 100644 skins/vector/images/page-base.png create mode 100644 skins/vector/images/page-fade.png create mode 100644 skins/vector/images/portal-break-ltr.png create mode 100644 skins/vector/images/portal-break-rtl.png create mode 100644 skins/vector/images/portal-break.png create mode 100644 skins/vector/images/preferences-base.png create mode 100644 skins/vector/images/preferences-break.png create mode 100644 skins/vector/images/preferences-edge.png create mode 100644 skins/vector/images/preferences-fade.png create mode 100644 skins/vector/images/search-fade.png create mode 100644 skins/vector/images/search-ltr.png create mode 100644 skins/vector/images/search-rtl.png create mode 100644 skins/vector/images/tab-break.png create mode 100644 skins/vector/images/tab-current-fade.png create mode 100644 skins/vector/images/tab-normal-fade.png create mode 100644 skins/vector/images/talk-icon.png create mode 100644 skins/vector/images/user-icon.png create mode 100644 skins/vector/images/video-icon.png create mode 100644 skins/vector/images/watch-icon-loading.gif create mode 100644 skins/vector/images/watch-icons.png create mode 100644 skins/vector/main-ltr.css create mode 100644 skins/vector/main-rtl.css create mode 100644 skins/vector/wiki-indexed.png create mode 100644 skins/vector/wiki.png diff --git a/skins/Chick.deps.php b/skins/Chick.deps.php new file mode 100644 index 0000000..a7cb084 --- /dev/null +++ b/skins/Chick.deps.php @@ -0,0 +1,13 @@ +addStyle( 'chick/main.css', 'screen,handheld' ); + $out->addStyle( 'chick/IE50Fixes.css', 'screen,handheld', 'lt IE 5.5000' ); + $out->addStyle( 'chick/IE55Fixes.css', 'screen,handheld', 'IE 5.5000' ); + $out->addStyle( 'chick/IE60Fixes.css', 'screen,handheld', 'IE 6' ); + } +} diff --git a/skins/CologneBlue.php b/skins/CologneBlue.php new file mode 100644 index 0000000..a7aac8a --- /dev/null +++ b/skins/CologneBlue.php @@ -0,0 +1,366 @@ +qbSetting(); + $mainPageObj = Title::newMainPage(); + + $s = "\n
\n
" . + ''; + + $s .= '
'; + $s .= ''; + $s .= '' . wfMsg( 'sitetitle' ) . ''; + + $s .= ''; + $s .= $this->sysLinks(); + $s .= '
'; + + $s .= ''; + $s .= htmlspecialchars( wfMsg( 'sitesubtitle' ) ) . ''; + $s .= ''; + + $s .= ''; + $s .= str_replace( '
', '', $this->otherLanguages() ); + $cat = $this->getCategoryLinks(); + if( $cat ) { + $s .= "
$cat\n"; + } + $s .= '
' . $this->pageTitleLinks(); + $s .= '
'; + + $s .= "
\n"; + + $s .= "\n
\n
"; + + $notice = wfGetSiteNotice(); + if( $notice ) { + $s .= "\n
$notice
\n"; + } + $s .= $this->pageTitle(); + $s .= $this->pageSubtitle() . "\n"; + return $s; + } + + function doAfterContent(){ + global $wgLang; + + $s = "\n

\n"; + + $s .= "\n\n
\n"; + + if ( 0 != $qb ) { + $s .= $this->quickBar(); + } + return $s; + } + + function reallyGenerateUserStylesheet() { + $s = parent::reallyGenerateUserStylesheet(); + $qb = $this->qbSetting(); + + if ( 2 == $qb ) { # Right + $s .= "#quickbar { position: absolute; right: 4px; }\n" . + "#article { margin-left: 4px; margin-right: 148px; }\n"; + } elseif ( 1 == $qb ) { + $s .= "#quickbar { position: absolute; left: 4px; }\n" . + "#article { margin-left: 148px; margin-right: 4px; }\n"; + } elseif ( 3 == $qb ) { # Floating left + $s .= "#quickbar { position:absolute; left:4px } \n" . + "#topbar { margin-left: 148px }\n" . + "#article { margin-left:148px; margin-right: 4px; } \n" . + "body>#quickbar { position:fixed; left:4px; top:4px; overflow:auto ;bottom:4px;} \n"; # Hides from IE + } elseif ( 4 == $qb ) { # Floating right + $s .= "#quickbar { position: fixed; right: 4px; } \n" . + "#topbar { margin-right: 148px }\n" . + "#article { margin-right: 148px; margin-left: 4px; } \n" . + "body>#quickbar { position: fixed; right: 4px; top: 4px; overflow: auto ;bottom:4px;} \n"; # Hides from IE + } + return $s; + } + + function sysLinks() { + global $wgUser, $wgLang, $wgContLang; + $li = SpecialPage::getTitleFor( 'Userlogin' ); + $lo = SpecialPage::getTitleFor( 'Userlogout' ); + + $rt = $this->mTitle->getPrefixedURL(); + if ( 0 == strcasecmp( urlencode( $lo ), $rt ) ) { + $q = array(); + } else { + $q = array( 'returnto' => $rt ); + } + + $s = array( + $this->mainPageLink(), + $this->linkKnown( + Title::newFromText( wfMsgForContent( 'aboutpage' ) ), + wfMsg( 'about' ) + ), + $this->linkKnown( + Title::newFromText( wfMsgForContent( 'helppage' ) ), + wfMsg( 'help' ) + ), + $this->linkKnown( + Title::newFromText( wfMsgForContent( 'faqpage' ) ), + wfMsg( 'faq' ) + ), + $this->specialLink( 'specialpages' ) + ); + + /* show links to different language variants */ + if( $this->variantLinks() ) { + $s[] = $this->variantLinks(); + } + if( $this->extensionTabLinks() ) { + $s[] = $this->extensionTabLinks(); + } + if ( $wgUser->isLoggedIn() ) { + $s[] = $this->linkKnown( + $lo, + wfMsg( 'logout' ), + array(), + $q + ); + } else { + $s[] = $this->linkKnown( + $li, + wfMsg( 'login' ), + array(), + $q + ); + } + + return $wgLang->pipeList( $s ); + } + + /** + * Compute the sidebar + * @access private + */ + function quickBar(){ + global $wgOut, $wgUser, $wgEnableUploads; + + $tns = $this->mTitle->getNamespace(); + + $s = "\n
"; + + $sep = '
'; + $s .= $this->menuHead( 'qbfind' ); + $s .= $this->searchForm(); + + $s .= $this->menuHead( 'qbbrowse' ); + + # Use the first heading from the Monobook sidebar as the "browse" section + $bar = $this->buildSidebar(); + unset( $bar['SEARCH'] ); + unset( $bar['LANGUAGES'] ); + unset( $bar['TOOLBOX'] ); + $browseLinks = reset( $bar ); + + foreach ( $browseLinks as $link ) { + if ( $link['text'] != '-' ) { + $s .= "" . + htmlspecialchars( $link['text'] ) . '' . $sep; + } + } + + if ( $wgOut->isArticle() ) { + $s .= $this->menuHead( 'qbedit' ); + $s .= '' . $this->editThisPage() . ''; + + $s .= $sep . $this->linkKnown( + Title::newFromText( wfMsgForContent( 'edithelppage' ) ), + wfMsg( 'edithelp' ) + ); + + if( $wgUser->isLoggedIn() ) { + $s .= $sep . $this->moveThisPage(); + } + if ( $wgUser->isAllowed( 'delete' ) ) { + $dtp = $this->deleteThisPage(); + if ( $dtp != '' ) { + $s .= $sep . $dtp; + } + } + if ( $wgUser->isAllowed( 'protect' ) ) { + $ptp = $this->protectThisPage(); + if ( $ptp != '' ) { + $s .= $sep . $ptp; + } + } + $s .= $sep; + + $s .= $this->menuHead( 'qbpageoptions' ); + $s .= $this->talkLink() + . $sep . $this->commentLink() + . $sep . $this->printableLink(); + if ( $wgUser->isLoggedIn() ) { + $s .= $sep . $this->watchThisPage(); + } + + $s .= $sep; + + $s .= $this->menuHead( 'qbpageinfo' ) + . $this->historyLink() + . $sep . $this->whatLinksHere() + . $sep . $this->watchPageLinksLink(); + + if( $tns == NS_USER || $tns == NS_USER_TALK ) { + $id = User::idFromName( $this->mTitle->getText() ); + if( $id != 0 ) { + $s .= $sep . $this->userContribsLink(); + if( $this->showEmailUser( $id ) ) { + $s .= $sep . $this->emailUserLink(); + } + } + } + $s .= $sep; + } + + $s .= $this->menuHead( 'qbmyoptions' ); + if ( $wgUser->isLoggedIn() ) { + $name = $wgUser->getName(); + $tl = $this->link( + $wgUser->getTalkPage(), + wfMsg( 'mytalk' ), + array(), + array(), + array( 'known', 'noclasses' ) + ); + if ( $wgUser->getNewtalk() ) { + $tl .= ' *'; + } + + $s .= $this->link( + $wgUser->getUserPage(), + wfMsg( 'mypage' ), + array(), + array(), + array( 'known', 'noclasses' ) + ) . $sep . $tl . $sep . $this->specialLink( 'watchlist' ) + . $sep . + $this->link( + SpecialPage::getSafeTitleFor( 'Contributions', $wgUser->getName() ), + wfMsg( 'mycontris' ), + array(), + array(), + array( 'known', 'noclasses' ) + ) . $sep . $this->specialLink( 'preferences' ) + . $sep . $this->specialLink( 'userlogout' ); + } else { + $s .= $this->specialLink( 'userlogin' ); + } + + $s .= $this->menuHead( 'qbspecialpages' ) + . $this->specialLink( 'newpages' ) + . $sep . $this->specialLink( 'listfiles' ) + . $sep . $this->specialLink( 'statistics' ); + if ( $wgUser->isLoggedIn() && $wgEnableUploads ) { + $s .= $sep . $this->specialLink( 'upload' ); + } + + global $wgSiteSupportPage; + + if( $wgSiteSupportPage ) { + $s .= $sep . '' + . wfMsg( 'sitesupport' ) . ''; + } + + $s .= $sep . $this->link( + SpecialPage::getTitleFor( 'Specialpages' ), + wfMsg( 'moredotdotdot' ), + array(), + array(), + array( 'known', 'noclasses' ) + ); + + $s .= $sep . "\n
\n"; + return $s; + } + + function menuHead( $key ) { + $s = "\n
" . wfMsg( $key ) . "
"; + return $s; + } + + function searchForm( $label = '' ) { + global $wgRequest, $wgUseTwoButtonsSearchForm; + + $search = $wgRequest->getText( 'search' ); + $action = $this->escapeSearchLink(); + $s = "
searchboxes}\" method=\"get\" class=\"inline\" action=\"$action\">"; + if( $label != '' ) { + $s .= "{$label}: "; + } + + $s .= "searchboxes}\" class=\"mw-searchInput\" name=\"search\" size=\"14\" value=\"" + . htmlspecialchars( substr( $search, 0, 256 ) ) . "\" />
" + . "searchboxes}\" class=\"searchButton\" name=\"go\" value=\"" . htmlspecialchars( wfMsg( 'searcharticle' ) ) . "\" />"; + + if( $wgUseTwoButtonsSearchForm ) { + $s .= "searchboxes}\" class=\"searchButton\" name=\"fulltext\" value=\"" . htmlspecialchars( wfMsg( 'search' ) ) . "\" />\n"; + } else { + $s .= '
\n"; + } + + $s .= '
'; + + // Ensure unique id's for search boxes made after the first + $this->searchboxes = $this->searchboxes == '' ? 2 : $this->searchboxes + 1; + + return $s; + } +} diff --git a/skins/Modern.deps.php b/skins/Modern.deps.php new file mode 100644 index 0000000..e76ab99 --- /dev/null +++ b/skins/Modern.deps.php @@ -0,0 +1,12 @@ +Powered by MediaWiki $wgVersion"; + } + + function setupSkinUserCss( OutputPage $out ){ + global $wgStyleVersion, $wgJsMimeType, $wgStylePath; + + // Do not call parent::setupSkinUserCss(), we have our own print style + $out->addStyle( 'common/shared.css', 'screen' ); + $out->addStyle( 'modern/main.css', 'screen' ); + $out->addStyle( 'modern/print.css', 'print' ); + $out->addStyle( 'modern/rtl.css', 'screen', '', 'rtl' ); + } +} + +/** + * @todo document + * @ingroup Skins + */ +class ModernTemplate extends QuickTemplate { + var $skin; + /** + * Template filter callback for Modern skin. + * Takes an associative array of data set from a SkinTemplate-based + * class, and a wrapper for MediaWiki's localization database, and + * outputs a formatted page. + * + * @access private + */ + function execute() { + global $wgRequest, $wgOut; + $this->skin = $skin = $this->data['skin']; + $action = $wgRequest->getText( 'action' ); + + // Suppress warnings to prevent notices about missing indexes in $this->data + wfSuppressWarnings(); + + $this->html( 'headelement' ); +?> + + +

html('title') ?>

+ +
+
+ +
+
msg('views') ?>
+ +
+ + +
+ +
html("specialpageattributes") ?>> +
+ +
msg('tagline') ?>
+ data['newtalk'] ) { + ?>
html('newtalk') ?>
+ + data['sitenotice']) { + ?>
html('sitenotice') ?>
+ +
+ +
html('userlangattributes') ?>>html('subtitle') ?>
+ + data['undelete']) { ?>
html('undelete') ?>
+ data['showjumplinks']) { ?> + + html('bodytext') ?> +
+ data['catlinks']) { $this->html('catlinks'); } ?> + html ('dataAfterContent') ?> +
+
+
+ +
html("userlangattributes") ?>> + + + data['sidebar']; + if ( !isset( $sidebar['SEARCH'] ) ) $sidebar['SEARCH'] = true; + if ( !isset( $sidebar['TOOLBOX'] ) ) $sidebar['TOOLBOX'] = true; + if ( !isset( $sidebar['LANGUAGES'] ) ) $sidebar['LANGUAGES'] = true; + + foreach ($sidebar as $boxName => $cont) { + if ( $boxName == 'SEARCH' ) { + $this->searchBox(); + } elseif ( $boxName == 'TOOLBOX' ) { + $this->toolbox(); + } elseif ( $boxName == 'LANGUAGES' ) { + $this->languageBox(); + } else { + $this->customBox( $boxName, $cont ); + } + } + ?> + +
+ + +
+ +
+ + +
+
msg('personaltools') ?>
+
+ +
+
+ + + + + + html('bottomscripts'); /* JS call to runBodyOnloadHook */ ?> +html('reporttime') ?> +data['debug'] ): ?> + + + + + + + + +
+
msg('toolbox') ?>
+
+ +
+
+data['language_urls'] ) { +?> +
+
msg('otherlanguages') ?>
+
+
    +data['language_urls'] as $langlink) { ?> +
  • + +
+
+
+ +
skin->tooltip('p-'.$bar) ?>> +
+
+ + + +
+
+addStyle( 'monobook/main.css', 'screen' ); + if( $wgHandheldStyle ) { + // Currently in testing... try 'chick/main.css' + $out->addStyle( $wgHandheldStyle, 'handheld' ); + } + + $out->addStyle( 'monobook/IE50Fixes.css', 'screen', 'lt IE 5.5000' ); + $out->addStyle( 'monobook/IE55Fixes.css', 'screen', 'IE 5.5000' ); + $out->addStyle( 'monobook/IE60Fixes.css', 'screen', 'IE 6' ); + $out->addStyle( 'monobook/IE70Fixes.css', 'screen', 'IE 7' ); + + $out->addStyle( 'monobook/rtl.css', 'screen', '', 'rtl' ); + + } +} + +/** + * @todo document + * @ingroup Skins + */ +class MonoBookTemplate extends QuickTemplate { + var $skin; + /** + * Template filter callback for MonoBook skin. + * Takes an associative array of data set from a SkinTemplate-based + * class, and a wrapper for MediaWiki's localization database, and + * outputs a formatted page. + * + * @access private + */ + function execute() { + global $wgRequest; + + $this->skin = $skin = $this->data['skin']; + $action = $wgRequest->getText( 'action' ); + + // Suppress warnings to prevent notices about missing indexes in $this->data + wfSuppressWarnings(); + + $this->html( 'headelement' ); +?>
+
html("specialpageattributes") ?>> + + data['sitenotice']) { ?>
html('sitenotice') ?>
+ +

html('title') ?>

+
+

msg('tagline') ?>

+
html('userlangattributes') ?>>html('subtitle') ?>
+data['undelete']) { ?> +
html('undelete') ?>
+data['newtalk'] ) { ?> +
html('newtalk') ?>
+data['showjumplinks']) { ?> + + + +html('bodytext') ?> + data['catlinks']) { $this->html('catlinks'); } ?> + + data['dataAfterContent']) { $this->html ('dataAfterContent'); } ?> +
+
+
+
html('userlangattributes') ?>> +
+
msg('views') ?>
+ +
+
+
msg('personaltools') ?>
+
+ html('userlangattributes') ?>> +data['personal_urls'] as $key => $item) { ?> +
  • " class="active">tooltipAndAccesskey('pt-'.$key) ?> class="">
  • + + +
    +
    + + +data['sidebar']; + if ( !isset( $sidebar['SEARCH'] ) ) $sidebar['SEARCH'] = true; + if ( !isset( $sidebar['TOOLBOX'] ) ) $sidebar['TOOLBOX'] = true; + if ( !isset( $sidebar['LANGUAGES'] ) ) $sidebar['LANGUAGES'] = true; + foreach ($sidebar as $boxName => $cont) { + if ( $boxName == 'SEARCH' ) { + $this->searchBox(); + } elseif ( $boxName == 'TOOLBOX' ) { + $this->toolbox(); + } elseif ( $boxName == 'LANGUAGES' ) { + $this->languageBox(); + } else { + $this->customBox( $boxName, $cont ); + } + } +?> +
    +
    + +
    +html('bottomscripts'); /* JS call to runBodyOnloadHook */ ?> +html('reporttime') ?> +data['debug'] ): ?> + + + + + + +
    +
    msg('toolbox') ?>
    +
    + +
    +
    +data['language_urls'] ) { +?> +
    + html('userlangattributes') ?>>msg('otherlanguages') ?> +
    +
      +data['language_urls'] as $langlink) { ?> +
    • + +
    +
    +
    + +
    skin->tooltip('p-'.$bar) ?>> +
    +
    + + + +
    +
    +\n
    \n"; + $s .= ''; + + $s .= $this->pageTitle(); + $s .= $this->pageSubtitle() . "\n"; + + $s .= '
    '; + $s .= $this->topLinks() . "\n
    "; + + $notice = wfGetSiteNotice(); + if( $notice ) { + $s .= "\n
    $notice
    \n"; + } + $s .= $this->pageTitleLinks(); + + $ol = $this->otherLanguages(); + if( $ol ) { + $s .= '
    ' . $ol; + } + + $cat = $this->getCategoryLinks(); + if( $cat ) { + $s .= '
    ' . $cat; + } + + $s .= "

    \n
    \n"; + $s .= "\n
    "; + + return $s; + } + + function topLinks() { + global $wgOut, $wgUser, $wgEnableUploads; + $sep = " |\n"; + + $s = $this->mainPageLink() . $sep + . $this->specialLink( 'recentchanges' ); + + if ( $wgOut->isArticle() ) { + $s .= $sep . '' . $this->editThisPage() . '' . $sep . $this->historyLink(); + } + + /* show links to different language variants */ + $s .= $this->variantLinks(); + $s .= $this->extensionTabLinks(); + if ( $wgUser->isAnon() ) { + $s .= $sep . $this->specialLink( 'userlogin' ); + } else { + $name = $wgUser->getName(); + /* show user page and user talk links */ + $s .= $sep . $this->link( $wgUser->getUserPage(), wfMsgHtml( 'mypage' ) ); + $s .= $sep . $this->link( $wgUser->getTalkPage(), wfMsgHtml( 'mytalk' ) ); + if ( $wgUser->getNewtalk() ) { + $s .= ' *'; + } + /* show watchlist link */ + $s .= $sep . $this->specialLink( 'watchlist' ); + /* show my contributions link */ + $s .= $sep . $this->link( + SpecialPage::getSafeTitleFor( 'Contributions', $wgUser->getName() ), + wfMsgHtml( 'mycontris' ) ); + /* show my preferences link */ + $s .= $sep . $this->specialLink( 'preferences' ); + /* show upload file link */ + if ( $wgEnableUploads ) { + $s .= $sep . $this->specialLink( 'upload' ); + } + /* show log out link */ + $s .= $sep . $this->specialLink( 'userlogout' ); + } + + $s .= $sep . $this->specialPagesList(); + + return $s; + } + + function doAfterContent() { + $s = "\n

    \n"; + + $s .= "\n\n\n"; + + return $s; + } +} diff --git a/skins/Simple.deps.php b/skins/Simple.deps.php new file mode 100644 index 0000000..99fadc6 --- /dev/null +++ b/skins/Simple.deps.php @@ -0,0 +1,13 @@ +addStyle( 'simple/main.css', 'screen' ); + $out->addStyle( 'simple/rtl.css', '', '', 'rtl' ); + } + + function reallyGenerateUserStylesheet() { + global $wgUser; + $s = ''; + if( ( $undopt = $wgUser->getOption( 'underline' ) ) != 2 ) { + $underline = $undopt ? 'underline' : 'none'; + $s .= "a { text-decoration: $underline; }\n"; + } + if( $wgUser->getOption( 'highlightbroken' ) ) { + $s .= "a.new, #quickbar a.new { text-decoration: line-through; }\n"; + } else { + $s .= <<getOption( 'justify' ) ) { + $s .= "#article, #bodyContent { text-align: justify; }\n"; + } + if( !$wgUser->getOption( 'showtoc' ) ) { + $s .= "#toc { display: none; }\n"; + } + if( !$wgUser->getOption( 'editsection' ) ) { + $s .= ".editsection { display: none; }\n"; + } + return $s; + } +} diff --git a/skins/Standard.php b/skins/Standard.php new file mode 100644 index 0000000..e57cfaf --- /dev/null +++ b/skins/Standard.php @@ -0,0 +1,283 @@ +qbSetting() ) { # Floating left + $out->addStyle( 'common/quickbar.css' ); + } elseif ( 4 == $this->qbSetting() ) { # Floating right + $out->addStyle( 'common/quickbar-right.css' ); + } + parent::setupSkinUserCss( $out ); + } + + /** + * + */ + function reallyGenerateUserStylesheet() { + $s = parent::reallyGenerateUserStylesheet(); + $qb = $this->qbSetting(); + + if ( 2 == $qb ) { # Right + $s .= "#quickbar { position: absolute; top: 4px; right: 4px; " . + "border-left: 2px solid #000000; }\n" . + "#article, #mw-data-after-content { margin-left: 4px; margin-right: 152px; }\n"; + } elseif ( 1 == $qb || 3 == $qb ) { + $s .= "#quickbar { position: absolute; top: 4px; left: 4px; " . + "border-right: 1px solid gray; }\n" . + "#article, #mw-data-after-content { margin-left: 152px; margin-right: 4px; }\n"; + } elseif ( 4 == $qb ) { + $s .= "#quickbar { border-right: 1px solid gray; }\n" . + "#article, #mw-data-after-content { margin-right: 152px; margin-left: 4px; }\n"; + } + return $s; + } + + function doAfterContent() { + global $wgContLang, $wgLang; + wfProfileIn( __METHOD__ ); + wfProfileIn( __METHOD__ . '-1' ); + + $s = "\n
    \n"; + $s .= "\n\n\n"; + + wfProfileOut( __METHOD__ . '-3' ); + wfProfileIn( __METHOD__ . '-4' ); + if ( 0 != $qb ) { + $s .= $this->quickBar(); + } + wfProfileOut( __METHOD__ . '-4' ); + wfProfileOut( __METHOD__ ); + return $s; + } + + function quickBar() { + global $wgOut, $wgUser, $wgRequest, $wgContLang; + global $wgEnableUploads, $wgRemoteUploads; + + wfProfileIn( __METHOD__ ); + + $action = $wgRequest->getText( 'action' ); + $wpPreview = $wgRequest->getBool( 'wpPreview' ); + $tns = $this->mTitle->getNamespace(); + + $s = "\n
    "; + $s .= "\n" . $this->logoText() . "\n
    "; + + $sep = "\n
    "; + + # Use the first heading from the Monobook sidebar as the "browse" section + $bar = $this->buildSidebar(); + unset( $bar['SEARCH'] ); + unset( $bar['LANGUAGES'] ); + unset( $bar['TOOLBOX'] ); + $browseLinks = reset( $bar ); + + foreach ( $browseLinks as $link ) { + if ( $link['text'] != '-' ) { + $s .= "" . + htmlspecialchars( $link['text'] ) . '' . $sep; + } + } + + if( $wgUser->isLoggedIn() ) { + $s.= $this->specialLink( 'watchlist' ) ; + $s .= $sep . $this->linkKnown( + SpecialPage::getTitleFor( 'Contributions' ), + wfMsg( 'mycontris' ), + array(), + array( 'target' => $wgUser->getName() ) + ); + } + // only show watchlist link if logged in + $s .= "\n
    "; + $articleExists = $this->mTitle->getArticleId(); + if ( $wgOut->isArticle() || $action == 'edit' || $action == 'history' || $wpPreview ) { + if( $wgOut->isArticle() ) { + $s .= '' . $this->editThisPage() . ''; + } else { # backlink to the article in edit or history mode + if( $articleExists ){ # no backlink if no article + switch( $tns ) { + case NS_TALK: + case NS_USER_TALK: + case NS_PROJECT_TALK: + case NS_FILE_TALK: + case NS_MEDIAWIKI_TALK: + case NS_TEMPLATE_TALK: + case NS_HELP_TALK: + case NS_CATEGORY_TALK: + $text = wfMsg('viewtalkpage'); + break; + case NS_MAIN: + $text = wfMsg( 'articlepage' ); + break; + case NS_USER: + $text = wfMsg( 'userpage' ); + break; + case NS_PROJECT: + $text = wfMsg( 'projectpage' ); + break; + case NS_FILE: + $text = wfMsg( 'imagepage' ); + break; + case NS_MEDIAWIKI: + $text = wfMsg( 'mediawikipage' ); + break; + case NS_TEMPLATE: + $text = wfMsg( 'templatepage' ); + break; + case NS_HELP: + $text = wfMsg( 'viewhelppage' ); + break; + case NS_CATEGORY: + $text = wfMsg( 'categorypage' ); + break; + default: + $text = wfMsg( 'articlepage' ); + } + + $link = $this->mTitle->getText(); + if( $nstext = $wgContLang->getNsText( $tns ) ) { # add namespace if necessary + $link = $nstext . ':' . $link; + } + + $s .= $this->link( + Title::newFromText( $link ), + $text + ); + } elseif( $this->mTitle->getNamespace() != NS_SPECIAL ) { + # we just throw in a "New page" text to tell the user that he's in edit mode, + # and to avoid messing with the separator that is prepended to the next item + $s .= '' . wfMsg( 'newpage' ) . ''; + } + } + + # "Post a comment" link + if( ( $this->mTitle->isTalkPage() || $wgOut->showNewSectionLink() ) && $action != 'edit' && !$wpPreview ) + $s .= '
    ' . $this->link( + $this->mTitle, + wfMsg( 'postcomment' ), + array(), + array( + 'action' => 'edit', + 'section' => 'new' + ), + array( 'known', 'noclasses' ) + ); + + #if( $tns%2 && $action!='edit' && !$wpPreview) { + #$s.= '
    '.$this->linkKnown( Title::newFromText( $wgTitle->getPrefixedText() ),wfMsg('postcomment'),array(),array('action'=>'edit','section'=>'new')); + #} + + /* + watching could cause problems in edit mode: + if user edits article, then loads "watch this article" in background and then saves + article with "Watch this article" checkbox disabled, the article is transparently + unwatched. Therefore we do not show the "Watch this page" link in edit mode + */ + if ( $wgUser->isLoggedIn() && $articleExists ) { + if( $action != 'edit' && $action != 'submit' ) { + $s .= $sep . $this->watchThisPage(); + } + if ( $this->mTitle->userCan( 'edit' ) ) + $s .= $sep . $this->moveThisPage(); + } + if ( $wgUser->isAllowed( 'delete' ) && $articleExists ) { + $s .= $sep . $this->deleteThisPage() . + $sep . $this->protectThisPage(); + } + $s .= $sep . $this->talkLink(); + if( $articleExists && $action != 'history' ) { + $s .= $sep . $this->historyLink(); + } + $s .= $sep . $this->whatLinksHere(); + + if( $wgOut->isArticleRelated() ) { + $s .= $sep . $this->watchPageLinksLink(); + } + + if ( + NS_USER == $this->mTitle->getNamespace() || + $this->mTitle->getNamespace() == NS_USER_TALK + ) { + + $id = User::idFromName( $this->mTitle->getText() ); + $ip = User::isIP( $this->mTitle->getText() ); + + if( $id || $ip ){ + $s .= $sep . $this->userContribsLink(); + } + if( $this->showEmailUser( $id ) ) { + $s .= $sep . $this->emailUserLink(); + } + } + $s .= "\n

    "; + } + + if ( $wgUser->isLoggedIn() && ( $wgEnableUploads || $wgRemoteUploads ) ) { + $s .= $this->specialLink( 'upload' ) . $sep; + } + $s .= $this->specialLink( 'specialpages' ); + + global $wgSiteSupportPage; + if( $wgSiteSupportPage ) { + $s .= "\n
    ' . wfMsg( 'sitesupport' ) . ''; + } + + $s .= "\n
    \n"; + wfProfileOut( __METHOD__ ); + return $s; + } + +} diff --git a/skins/Vector.deps.php b/skins/Vector.deps.php new file mode 100644 index 0000000..7a8c288 --- /dev/null +++ b/skins/Vector.deps.php @@ -0,0 +1,11 @@ +addStyle( 'vector/main-rtl.css', 'screen', '', 'rtl' ); + $out->addStyle( 'vector/main-ltr.css', 'screen', '', 'ltr' ); + // Append CSS which includes IE only behavior fixes for hover support - + // this is better than including this in a CSS fille since it doesn't + // wait for the CSS file to load before fetching the HTC file. + $out->addScript( + '' + ); + // Add extra stylesheets + // THIS IS ONLY USEFUL FOR EXPERIMENTING WITH DIFFERNT STYLE OPTIONS! THIS WILL BE REMOVED IN THE NEAR FUTURE. + if ( is_array( $wgVectorExtraStyles ) ) { + foreach ( $wgVectorExtraStyles as $style ) { + $out->addStyle( 'vector/' . $style, 'screen' ); + } + } + } + /** + * Builds a structured array of links used for tabs and menus + * @return array + * @private + */ + function buildNavigationUrls() { + global $wgContLang, $wgLang, $wgOut, $wgUser, $wgRequest, $wgArticle, $wgStylePath; + global $wgDisableLangConversion, $wgVectorUseIconWatch; + + wfProfileIn( __METHOD__ ); + + $links = array( + 'namespaces' => array(), + 'views' => array(), + 'actions' => array(), + 'variants' => array() + ); + + // Detects parameters + $action = $wgRequest->getVal( 'action', 'view' ); + $section = $wgRequest->getVal( 'section' ); + + // Checks if page is some kind of content + if( $this->iscontent ) { + + // Gets page objects for the related namespaces + $subjectPage = $this->mTitle->getSubjectPage(); + $talkPage = $this->mTitle->getTalkPage(); + + // Determines if this is a talk page + $isTalk = $this->mTitle->isTalkPage(); + + // Generates XML IDs from namespace names + $subjectId = $this->mTitle->getNamespaceKey( '' ); + + if ( $subjectId == 'main' ) { + $talkId = 'talk'; + } else { + $talkId = "{$subjectId}_talk"; + } + $currentId = $isTalk ? $talkId : $subjectId; + + // Adds namespace links + $links['namespaces'][$subjectId] = $this->tabAction( + $subjectPage, 'vector-namespace-' . $subjectId, !$isTalk, '', true + ); + $links['namespaces'][$subjectId]['context'] = 'subject'; + $links['namespaces'][$talkId] = $this->tabAction( + $talkPage, 'vector-namespace-talk', $isTalk, '', true + ); + $links['namespaces'][$talkId]['context'] = 'talk'; + + // Adds view view link + if ( $this->mTitle->exists() ) { + $links['views']['view'] = $this->tabAction( + $isTalk ? $talkPage : $subjectPage, + 'vector-view-view', ( $action == 'view' ), '', true + ); + } + + wfProfileIn( __METHOD__ . '-edit' ); + + // Checks if user can... + if ( + // edit the current page + $this->mTitle->quickUserCan( 'edit' ) && + ( + // if it exists + $this->mTitle->exists() || + // or they can create one here + $this->mTitle->quickUserCan( 'create' ) + ) + ) { + // Builds CSS class for talk page links + $isTalkClass = $isTalk ? ' istalk' : ''; + + // Determines if we're in edit mode + $selected = ( + ( $action == 'edit' || $action == 'submit' ) && + ( $section != 'new' ) + ); + $links['views']['edit'] = array( + 'class' => ( $selected ? 'selected' : '' ) . $isTalkClass, + 'text' => $this->mTitle->exists() + ? wfMsg( 'vector-view-edit' ) + : wfMsg( 'vector-view-create' ), + 'href' => + $this->mTitle->getLocalUrl( $this->editUrlOptions() ) + ); + // Checks if this is a current rev of talk page and we should show a new + // section link + if ( ( $isTalk && $wgArticle->isCurrent() ) || ( $wgOut->showNewSectionLink() ) ) { + // Checks if we should ever show a new section link + if ( !$wgOut->forceHideNewSectionLink() ) { + // Adds new section link + //$links['actions']['addsection'] + $links['views']['addsection'] = array( + 'class' => 'collapsible ' . ( $section == 'new' ? 'selected' : false ), + 'text' => wfMsg( 'vector-action-addsection' ), + 'href' => $this->mTitle->getLocalUrl( + 'action=edit§ion=new' + ) + ); + } + } + // Checks if the page is known (some kind of viewable content) + } elseif ( $this->mTitle->isKnown() ) { + // Adds view source view link + $links['views']['viewsource'] = array( + 'class' => ( $action == 'edit' ) ? 'selected' : false, + 'text' => wfMsg( 'vector-view-viewsource' ), + 'href' => + $this->mTitle->getLocalUrl( $this->editUrlOptions() ) + ); + } + wfProfileOut( __METHOD__ . '-edit' ); + + wfProfileIn( __METHOD__ . '-live' ); + + // Checks if the page exists + if ( $this->mTitle->exists() ) { + // Adds history view link + $links['views']['history'] = array( + 'class' => 'collapsible ' . ( ($action == 'history') ? 'selected' : false ), + 'text' => wfMsg( 'vector-view-history' ), + 'href' => $this->mTitle->getLocalUrl( 'action=history' ), + 'rel' => 'archives', + ); + + if( $wgUser->isAllowed( 'delete' ) ) { + $links['actions']['delete'] = array( + 'class' => ($action == 'delete') ? 'selected' : false, + 'text' => wfMsg( 'vector-action-delete' ), + 'href' => $this->mTitle->getLocalUrl( 'action=delete' ) + ); + } + if ( $this->mTitle->quickUserCan( 'move' ) ) { + $moveTitle = SpecialPage::getTitleFor( + 'Movepage', $this->thispage + ); + $links['actions']['move'] = array( + 'class' => $this->mTitle->isSpecial( 'Movepage' ) ? + 'selected' : false, + 'text' => wfMsg( 'vector-action-move' ), + 'href' => $moveTitle->getLocalUrl() + ); + } + + if ( + $this->mTitle->getNamespace() !== NS_MEDIAWIKI && + $wgUser->isAllowed( 'protect' ) + ) { + if ( !$this->mTitle->isProtected() ){ + $links['actions']['protect'] = array( + 'class' => ($action == 'protect') ? + 'selected' : false, + 'text' => wfMsg( 'vector-action-protect' ), + 'href' => + $this->mTitle->getLocalUrl( 'action=protect' ) + ); + + } else { + $links['actions']['unprotect'] = array( + 'class' => ($action == 'unprotect') ? + 'selected' : false, + 'text' => wfMsg( 'vector-action-unprotect' ), + 'href' => + $this->mTitle->getLocalUrl( 'action=unprotect' ) + ); + } + } + } else { + // article doesn't exist or is deleted + if ( + $wgUser->isAllowed( 'deletedhistory' ) && + $wgUser->isAllowed( 'undelete' ) + ) { + if( $n = $this->mTitle->isDeleted() ) { + $undelTitle = SpecialPage::getTitleFor( 'Undelete' ); + $links['actions']['undelete'] = array( + 'class' => false, + 'text' => wfMsgExt( + 'vector-action-undelete', + array( 'parsemag' ), + $wgLang->formatNum( $n ) + ), + 'href' => $undelTitle->getLocalUrl( + 'target=' . urlencode( $this->thispage ) + ) + ); + } + } + + if ( + $this->mTitle->getNamespace() !== NS_MEDIAWIKI && + $wgUser->isAllowed( 'protect' ) + ) { + if ( !$this->mTitle->getRestrictions( 'create' ) ) { + $links['actions']['protect'] = array( + 'class' => ($action == 'protect') ? + 'selected' : false, + 'text' => wfMsg( 'vector-action-protect' ), + 'href' => + $this->mTitle->getLocalUrl( 'action=protect' ) + ); + + } else { + $links['actions']['unprotect'] = array( + 'class' => ($action == 'unprotect') ? + 'selected' : false, + 'text' => wfMsg( 'vector-action-unprotect' ), + 'href' => + $this->mTitle->getLocalUrl( 'action=unprotect' ) + ); + } + } + } + wfProfileOut( __METHOD__ . '-live' ); + /** + * The following actions use messages which, if made particular to + * the Vector skin, would break the Ajax code which makes this + * action happen entirely inline. Skin::makeGlobalVariablesScript + * defines a set of messages in a javascript object - and these + * messages are assumed to be global for all skins. Without making + * a change to that procedure these messages will have to remain as + * the global versions. + */ + // Checks if the user is logged in + if ( $this->loggedin ) { + if ( $wgVectorUseIconWatch ) { + $class = 'icon '; + $place = 'views'; + } else { + $class = ''; + $place = 'actions'; + } + $mode = $this->mTitle->userIsWatching() ? 'unwatch' : 'watch'; + $links[$place][$mode] = array( + 'class' => $class . ( ( $action == 'watch' || $action == 'unwatch' ) ? ' selected' : false ), + 'text' => wfMsg( $mode ), // uses 'watch' or 'unwatch' message + 'href' => $this->mTitle->getLocalUrl( 'action=' . $mode ) + ); + } + // This is instead of SkinTemplateTabs - which uses a flat array + wfRunHooks( 'SkinTemplateNavigation', array( &$this, &$links ) ); + + // If it's not content, it's got to be a special page + } else { + $links['namespaces']['special'] = array( + 'class' => 'selected', + 'text' => wfMsg( 'vector-namespace-special' ), + 'href' => $wgRequest->getRequestURL() + ); + } + + // Gets list of language variants + $variants = $wgContLang->getVariants(); + // Checks that language conversion is enabled and variants exist + if( !$wgDisableLangConversion && count( $variants ) > 1 ) { + // Gets preferred variant + $preferred = $wgContLang->getPreferredVariant(); + // Loops over each variant + foreach( $variants as $code ) { + // Gets variant name from language code + $varname = $wgContLang->getVariantname( $code ); + // Checks if the variant is marked as disabled + if( $varname == 'disable' ) { + // Skips this variant + continue; + } + // Appends variant link + $links['variants'][] = array( + 'class' => ( $code == $preferred ) ? 'selected' : false, + 'text' => $varname, + 'href' => $this->mTitle->getLocalURL( '', $code ) + ); + } + } + + wfProfileOut( __METHOD__ ); + + return $links; + } +} + +/** + * QuickTemplate class for Vector skin + * @ingroup Skins + */ +class VectorTemplate extends QuickTemplate { + + /* Members */ + + /** + * @var Cached skin object + */ + var $skin; + + /* Functions */ + + /** + * Outputs the entire contents of the XHTML page + */ + public function execute() { + global $wgRequest, $wgOut, $wgContLang; + + $this->skin = $this->data['skin']; + $action = $wgRequest->getText( 'action' ); + + // Build additional attributes for navigation urls + $nav = $this->skin->buildNavigationUrls(); + foreach ( $nav as $section => $links ) { + foreach ( $links as $key => $link ) { + $xmlID = $key; + if ( isset( $link['context'] ) && $link['context'] == 'subject' ) { + $xmlID = 'ca-nstab-' . $xmlID; + } else if ( isset( $link['context'] ) && $link['context'] == 'talk' ) { + $xmlID = 'ca-talk'; + } else { + $xmlID = 'ca-' . $xmlID; + } + $nav[$section][$key]['attributes'] = + ' id="' . Sanitizer::escapeId( $xmlID ) . '"'; + if ( $nav[$section][$key]['class'] ) { + $nav[$section][$key]['attributes'] .= + ' class="' . htmlspecialchars( $link['class'] ) . '"'; + unset( $nav[$section][$key]['class'] ); + } + // We don't want to give the watch tab an accesskey if the page + // is being edited, because that conflicts with the accesskey on + // the watch checkbox. We also don't want to give the edit tab + // an accesskey, because that's fairly superfluous and conflicts + // with an accesskey (Ctrl-E) often used for editing in Safari. + if ( + in_array( $action, array( 'edit', 'submit' ) ) && + in_array( $key, array( 'edit', 'watch', 'unwatch' ) ) + ) { + $nav[$section][$key]['key'] = + $this->skin->tooltip( $xmlID ); + } else { + $nav[$section][$key]['key'] = + $this->skin->tooltipAndAccesskey( $xmlID ); + } + } + } + $this->data['namespace_urls'] = $nav['namespaces']; + $this->data['view_urls'] = $nav['views']; + $this->data['action_urls'] = $nav['actions']; + $this->data['variant_urls'] = $nav['variants']; + // Build additional attributes for personal_urls + foreach ( $this->data['personal_urls'] as $key => $item) { + $this->data['personal_urls'][$key]['attributes'] = + ' id="' . Sanitizer::escapeId( "pt-$key" ) . '"'; + if ( isset( $item['active'] ) && $item['active'] ) { + $this->data['personal_urls'][$key]['attributes'] .= + ' class="active"'; + } + $this->data['personal_urls'][$key]['key'] = + $this->skin->tooltipAndAccesskey('pt-'.$key); + } + + // Generate additional footer links + $footerlinks = array( + 'info' => array( + 'lastmod', + 'viewcount', + 'numberofwatchingusers', + 'credits', + 'copyright', + 'tagline', + ), + 'places' => array( + 'privacy', + 'about', + 'disclaimer', + ), + ); + // Reduce footer links down to only those which are being used + $validFooterLinks = array(); + foreach( $footerlinks as $category => $links ) { + $validFooterLinks[$category] = array(); + foreach( $links as $link ) { + if( isset( $this->data[$link] ) && $this->data[$link] ) { + $validFooterLinks[$category][] = $link; + } + } + } + // Reverse horizontally rendered navigation elements + if ( $wgContLang->isRTL() ) { + $this->data['view_urls'] = + array_reverse( $this->data['view_urls'] ); + $this->data['namespace_urls'] = + array_reverse( $this->data['namespace_urls'] ); + $this->data['personal_urls'] = + array_reverse( $this->data['personal_urls'] ); + } + // Output HTML Page + $this->html( 'headelement' ); +?> +
    +
    + +
    html('specialpageattributes') ?>> + + + data['sitenotice'] ): ?> + +
    html( 'sitenotice' ) ?>
    + + + +

    html( 'title' ) ?>

    + + +
    + +

    msg( 'tagline' ) ?>

    + + +
    html('userlangattributes') ?>>html( 'subtitle' ) ?>
    + + data['undelete'] ): ?> + +
    html( 'undelete' ) ?>
    + + + data['newtalk'] ): ?> + +
    html( 'newtalk' ) ?>
    + + + data['showjumplinks'] ): ?> + + + + + + html( 'bodytext' ) ?> + + data['catlinks'] ): ?> + + html( 'catlinks' ); ?> + + + data['dataAfterContent'] ): ?> + + html( 'dataAfterContent' ); ?> + + +
    +
    + +
    + + +
    + renderNavigation( 'PERSONAL' ); ?> +
    + renderNavigation( array( 'NAMESPACES', 'VARIANTS' ) ); ?> +
    +
    + renderNavigation( array( 'VIEWS', 'ACTIONS', 'SEARCH' ) ); ?> +
    +
    + + +
    + + + + renderPortals( $this->data['sidebar'] ); ?> +
    + + + + + + + + html( 'bottomscripts' ); /* JS call to runBodyOnloadHook */ ?> + html( 'reporttime' ) ?> + data['debug'] ): ?> + + + + + $content ) { + echo "\n\n"; + switch( $name ) { + case 'SEARCH': + break; + case 'TOOLBOX': +?> +
    + html('userlangattributes') ?>>msg( 'toolbox' ) ?> +
    + +
    +
    +data['language_urls'] ) { +?> +
    + html('userlangattributes') ?>>msg( 'otherlanguages' ) ?> +
    +
      + data['language_urls'] as $langlink ): ?> +
    • + +
    +
    +
    + +
    skin->tooltip( 'p-' . $name ) ?>> + html('userlangattributes') ?>> +
    + + + + + +
    +
    +\n"; + } + } + + /** + * Render one or more navigations elements by name, automatically reveresed + * when UI is in RTL mode + */ + private function renderNavigation( $elements ) { + global $wgContLang, $wgVectorUseSimpleSearch, $wgStylePath; + + // If only one element was given, wrap it in an array, allowing more + // flexible arguments + if ( !is_array( $elements ) ) { + $elements = array( $elements ); + // If there's a series of elements, reverse them when in RTL mode + } else if ( $wgContLang->isRTL() ) { + $elements = array_reverse( $elements ); + } + // Render elements + foreach ( $elements as $name => $element ) { + echo "\n\n"; + switch ( $element ) { + case 'NAMESPACES': +?> +
    +
    msg('namespaces') ?>
    + html('userlangattributes') ?>> + data['namespace_urls'] as $key => $link ): ?> +
  • >>
  • + + +
    + +
    +
    msg('variants') ?>
    + +
    + +
    +
    msg('views') ?>
    + html('userlangattributes') ?>> + data['view_urls'] as $key => $link ): ?> + >>' : ''.htmlspecialchars( $link['text'] ).'') ?> + + +
    + +
    +
    msg('actions') ?>
    + +
    + +
    +
    msg('personaltools') ?>
    + html('userlangattributes') ?>> + data['personal_urls'] as $key => $item): ?> +
  • > class="">
  • + + +
    + + +\n"; + } + } +} diff --git a/skins/chick/IE50Fixes.css b/skins/chick/IE50Fixes.css new file mode 100644 index 0000000..4a193e9 --- /dev/null +++ b/skins/chick/IE50Fixes.css @@ -0,0 +1,67 @@ +/* +** IE5.0 Fix Stylesheet +*/ + +#column-content { + margin: 0 !important; + float: none; +} +#column-content #content { + margin-top: 3em; + height: 1%; +} +#column-one { + position: absolute; + overflow: visible; + top: 0; + left: 0; + z-index: 3; +} +#footer { + margin: 0 0 0 13.6em; +} + +/* IE 5 & 5.5 interpret keyword sizes one off */ +body { font-size: xx-small; } +/* +** the edit tabs +*/ +#p-cactions li { + float: left; + padding-top: 0; + padding-bottom: 0 !important; + height: 0.9em; +} +#p-cactions li a { + display: block; + padding-bottom: 0.045em; +} +#p-cactions li.selected a { + padding-bottom: 0.17em; +} +#p-cactions li a:hover { + padding-bottom: 0.17em; +} +/* 5.0 doesn't like the background icon for external links and user */ +.link-external, +.external { + background: none; + padding: 0; +} +#p-personal ul { float: right } +#p-personal li { float: left } +li#pt-userpage, +li#pt-anonuserpage, +li#pt-login, +li#pt-logout { + background: none; + padding-left: none; +} +.visualClear { + width:100%; + height: 0px; + padding:0; + margin:0; +} +#firstHeading { margin-bottom: 0.3em; } +/*div{ border:1px solid Red !important;}*/ diff --git a/skins/chick/IE55Fixes.css b/skins/chick/IE55Fixes.css new file mode 100644 index 0000000..2f78561 --- /dev/null +++ b/skins/chick/IE55Fixes.css @@ -0,0 +1,81 @@ +/* IE5.5/win- only fixes */ + +#column-content { + float: none; + margin-left: 0; + height: 1%; +} +#column-content #content { + position: relative; + z-index: 5; + margin-left: 12.2em; + margin-top: 3em; + height: 1%; +} +#column-one { + position: absolute; + top: 0; + left: 0; + z-index: 4; + width: 100%; +} +#footer { + margin-left: 13.6em; + border-left: 1px solid #fabd23; +} + +/*#bodyContent div, +#bodyContent pre { overflow: auto; }*/ + +#p-personal { padding-bottom: 0.1em; } + +body { font-size: xx-small; } + +#p-cactions { + width: 76% !important; + z-index: 3 !important; + float: none; +} +#p-cactions li { + padding-bottom: 0 !important; + border: none; + background-color: transparent; + cursor: default; + float: none !important; +} +#p-cactions li a { + display: inline-block !important; + vertical-align: top; + padding-bottom: 0; + border: solid #aaa; + border-width: 1px 1px 0; +} +#p-cactions li.selected a { + border-color: #fabd23; + padding-bottom: 0.17em; +} +#p-cactions li a:hover { + padding-bottom: 0.17em; +} +.portlet { + overflow:hidden; +} +#bodyContent a.external { + background: url(external.png) center right no-repeat; + padding-right: 13px; +} +/* show the hand */ +#p-logo a, +#p-logo a:hover { + cursor: pointer; +} +.visualClear { + width:90%; + height: 1px; + padding:0; + margin:0; +} + +#editform { + width: 100%; +} diff --git a/skins/chick/IE60Fixes.css b/skins/chick/IE60Fixes.css new file mode 100644 index 0000000..feec15f --- /dev/null +++ b/skins/chick/IE60Fixes.css @@ -0,0 +1,79 @@ +/* 6.0 - only fixes */ +/* content area */ +/* workaround for various ie float bugs */ +#column-content { + float: none; + margin-left: 0; + height: 1%; +} +#column-content #content { + margin-left: 12.2em; + margin-top: 3em; + height: 1%; +} +#column-one { + position: absolute; + top: 0; + left: 0; + z-index: 4; +} +#footer { + margin-left: 13.6em; + border-left: 1px solid #fabd23; +} + +/* the tabs */ + +#p-cactions { + z-index: 3; +} + +#p-cactions li { + padding-bottom: 0 !important; + border: none; + background-color: transparent; + cursor: default; + float: none !important; +} +#p-cactions li a { + display: inline-block !important; + vertical-align: top; + padding-bottom: 0; + border: solid #aaa; + border-width: 1px 1px 0; +} +#p-cactions li.selected a { + border-color: #fabd23; + padding-bottom: 0.17em; +} +#p-cactions li a:hover { + padding-bottom: 0.17em; +} +#portal-personaltools { + padding-bottom: 0.1em; +} +#bodyContent a.external { + background: url(external.png) center right no-repeat; + padding-right: 13px; +} + +/* show the hand */ +#p-logo a, +#p-logo a:hover { + cursor: pointer; +} +div.visualClear { + width:100%; + line-height: 0; +} +textarea { + width: 96%; +} + +div.editsection, +#catlinks, +div.tright, +div.tleft { + position: relative; +} +/*{ border:1px solid Red !important;}*/ diff --git a/skins/chick/main.css b/skins/chick/main.css new file mode 100644 index 0000000..ac61b91 --- /dev/null +++ b/skins/chick/main.css @@ -0,0 +1,411 @@ +/* +** MediaWiki 'chick' style sheet for PDAs or other small-screen devices. +** Copyright Timwi +** License: GPL (http://www.gnu.org/copyleft/gpl.html) +** +** Loosely based on Monobook by Gabriel Wicke +*/ + +body { + font-family: sans-serif; + color: black; + background: white; + margin: 0; + padding: 0.3em; +} + +a { color: #002bb8; } +a:visited { color: #5a3696; } +a:active { color: #ffa500; } +a.stub { color: #772233; } +a.new, +#p-personal a.new { color:#ba0000; } +a.new:visited, +#p-personal a.new:visited { color:#a55858; } + +img { + border: none; + vertical-align: middle; +} +p { + margin: 0.4em 0em 0.5em 0em; + line-height: 1.5em; +} + +p img { margin: 0; } + +hr { + height: 1px; + color: #aaaaaa; + background-color: #aaaaaa; + border: 0; + margin: 0.2em 0 0.2em 0; +} + +h1, h2, h3, h4, h5, h6 { + color: black; + background: none; + font-weight: normal; + margin: 0; + padding-top: 0.5em; + padding-bottom: 0.17em; + border-bottom: 1px solid #aaaaaa; +} +.editsection { + font-weight: normal; +} +h1 { font-size: 188%; } +h1 .editsection { font-size: 53.2%; } +h2 { font-size: 150%; } +h2 .editsection { font-size: 66.7%; } +h3, h4, h5, h6 { + border-bottom: none; + font-weight: bold; +} +h3 { font-size: 132%; } +h3 .editsection { font-size: 75.8%; } +h4 { font-size: 116%; } +h4 .editsection { font-size: 86.2%; } +h5 { font-size: 100%; } +h6 { font-size: 80%; } +h6 .editsection { font-size: 125%; } + +ul { + line-height: 1.5em; + margin: 0.3em 0 0 1.5em; + padding:0; +} +ol { + line-height: 1.5em; + margin: 0.3em 0 0 3.2em; + padding:0; + list-style-image: none; +} +li { margin-bottom: 0.1em; } +dt { + font-weight: bold; + margin-bottom: 0.1em; +} +dl{ + margin-top: 0.2em; + margin-bottom: 0.5em; +} +dd { + line-height: 1.5em; + margin-left: 2em; + margin-bottom: 0.1em; +} + +fieldset { + border: 1px solid #2f6fab; + margin: 1em 0em 1em 0em; + padding: 0em 1em 1em 1em; + line-height: 1.5em; +} +legend { + background: white; + padding: 0.5em; + font-size: 95%; +} +form { + border: none; + margin: 0; +} + +textarea { + border: 1px solid #2f6fab; + color: black; + background-color: white; + width: 100%; + padding: 0.1em; + overflow: auto; +} +/* hide this from ie/mac and konq2.2 */ +@media All { + head:first-child+body input { + visibility: visible; + border: 1px solid #2f6fab; + color: black; + background-color: white; + vertical-align: middle; + padding: 0.2em; + } +} +input.historysubmit { + padding: 0 0.3em 0.3em 0.3em !important; + font-size: 94%; + cursor: pointer; + height: 1.7em !important; + margin-left: 1.6em; +} +input[type="radio"], +input[type="checkbox"] { border:none; } +select { + border: 1px solid #2f6fab; + color: black; + vertical-align: top; +} +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; +} +code { background-color: #f9f9f9; } +pre { + padding: 1em; + border: 1px dashed #2f6fab; + color: black; + background-color: #f9f9f9; + line-height: 1.1em; +} + +/* +** the main content area +*/ + +span.subpages { display: block; } + +/* Some space under the headers in the content area */ +#bodyContent h1, #bodyContent h2 { margin-bottom:0.6em; } +#bodyContent h3, +#bodyContent h4, +#bodyContent h5 { + margin-bottom: 0.3em; +} +#firstHeading { margin-bottom:0.1em; } + +/* user notification thing */ +.usermessage { + background-color: #ffce7b; + border: 1px solid #ffa500; + color: black; + font-weight: bold; + margin: 0.1em 0 0 0; + padding: 2px 5px; + vertical-align: middle; +} +#siteNotice { + text-align: center; + font-size: 95%; + padding: 0 0.9em 0 0.9em; +} +#siteNotice p { margin: 0; padding: 0; } +.error { + color: red; + font-size: larger; +} +.catlinks { + border:1px solid #aaaaaa; + background-color:#f9f9f9; + padding: 2px 5px; + margin: 0.1em 0 0 0; + clear: both; +} +.catlinks { margin: 0; padding: 0; } + + +/* currently unused, intended to be used by a metadata box +in the bottom-right corner of the content area */ +.documentDescription { + /* The summary text describing the document */ + font-weight: bold; + display: block; + margin: 1em 0em; + line-height: 1.5em; +} +.documentByLine { + text-align: right; + font-size: 90%; + clear: both; + font-weight: normal; + color: #76797c; +} + +/* 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% } + +/* +** content styles +*/ + +#toc { + /*border:1px solid #2f6fab;*/ + border:1px solid #aaaaaa; + background-color:#f9f9f9; + padding:5px; + font-size: 95%; +} +#toc ul { margin-left: 2em; } +#toc .toctoggle { font-size: 94%; } +#toc .editsection { + margin-top: 0.7em; + font-size: 94%; +} + +/* images */ +div.floatright, table.floatright { + clear: right; + float: right; + margin: 0; + position: relative; + border: 0.5em solid white; + border-width: 0.5em 0 0.8em 1.4em; +} +div.floatright p { font-style: italic; } +div.floatleft, table.floatleft { + float: left; + clear: left; + margin: 0.3em 0.5em 0.5em 0; + position: relative; + border: 0.5em solid white; + border-width: 0.5em 1.4em 0.8em 0; +} +div.floatleft p { font-style: italic; } +/* thumbnails */ +div.thumb { + margin-bottom: 0.5em; + border-style: solid; border-color: white; + width: auto; +} +div.thumbinner { + border:1px solid #cccccc; + padding: 3px !important; + background-color:#f9f9f9; + font-size: 94%; + text-align: center; + overflow: hidden; +} +html .thumbimage { + border:1px solid #cccccc; +} +html .thumbcaption { + border: none; + text-align: left; + line-height: 1.4em; + padding: 0.3em 0 0.1em 0; +} +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: 0.5em 0 0.8em 1.4em; +} +div.tleft { + float: left; + clear: left; + margin-right:0.5em; + border-width: 0.5em 1.4em 0.8em 0; +} +img.thumbborder { + border: 1px solid #dddddd; +} + +.hiddenStructure { + display: none; +} + +/* +** classes for special content elements like town boxes +** intended to be referenced directly from the wiki src +*/ + +/* +** User styles +*/ +/* table standards */ +table.rimage { + float:right; + position:relative; + margin-left:1em; + margin-bottom:1em; + text-align:center; +} +.toccolours { + border:1px solid #aaaaaa; + background-color:#f9f9f9; + padding:5px; + font-size: 95%; +} + +/* +** edit views etc +*/ +.special li { + line-height: 1.4em; + margin: 0; + padding: 0; +} + +a.external { color: #3366bb; } +div#footer { text-align: center; } +ul#f-list li { list-style: none; text-align: center; } +div.portlet { margin: 0.5em 0; } + +.redirectText { + font-size:150%; + margin:5px; +} + +ul.special li.not-patrolled, ol.special li.not-patrolled { + background-color: #ffa; +} +div.patrollink { + font-size: 75%; + text-align: right; +} + +span.updatedmarker { + color:black; + background-color:#00FF00; +} + +div.gallerybox { + width: 150px; +} + +#xjump-to-nav { + display: none; +} + +.templatesUsed { margin-top: 1.5em; } + +.printfooter { + display: none; +} + +#footer { + background-color: white; + border-top: 1px solid #fabd23; + border-bottom: 1px solid #fabd23; + margin: .6em 0 1em 0; + padding: .4em 0 1.2em 0; + text-align: center; + font-size: 90%; +} +#f-poweredbyico, #f-copyrightico { + display: inline; +} diff --git a/skins/common/IE80Fixes.css b/skins/common/IE80Fixes.css new file mode 100644 index 0000000..b6360f6 --- /dev/null +++ b/skins/common/IE80Fixes.css @@ -0,0 +1,15 @@ +/** + * Fixes textarea scrolling bug (bug #19334). The bug only occurs when a + * percentage width is given, so instead of width: 100%, use min-width: 100%; + * max-width: 100%. We also need to give a fixed width for the actual width + * property for the hack to work, although the actual value (500px here) ends + * up being ignored; min/max-width take precedence. + * + * More info: http://grantovich.net/posts/2009/06/that-weird-ie8-textarea-bug/ + */ +#wpTextbox1 { + height: 390px; + width: 500px; + min-width: 100%; + max-width: 100%; +} diff --git a/skins/common/IEFixes.js b/skins/common/IEFixes.js new file mode 100644 index 0000000..762d7a7 --- /dev/null +++ b/skins/common/IEFixes.js @@ -0,0 +1,128 @@ +// IE fixes javascript + +var isMSIE55 = ( window.showModalDialog && window.clipboardData && window.createPopup ); +var doneIETransform; +var doneIEAlphaFix; + +if ( document.attachEvent ) { + document.attachEvent( 'onreadystatechange', hookit ); +} + +function hookit() { + if ( !doneIETransform && document.getElementById && document.getElementById( 'bodyContent' ) ) { + doneIETransform = true; + relativeforfloats(); + fixalpha(); + } +} + +// png alpha transparency fixes +function fixalpha( logoId ) { + // bg + if ( isMSIE55 && !doneIEAlphaFix ) { + var plogo = document.getElementById( logoId || 'p-logo' ); + if ( !plogo ) { + return; + } + + var logoa = plogo.getElementsByTagName('a')[0]; + if ( !logoa ) { + return; + } + + var bg = logoa.currentStyle.backgroundImage; + var imageUrl = bg.substring( 5, bg.length - 2 ); + + doneIEAlphaFix = true; + + if ( imageUrl.substr( imageUrl.length - 4 ).toLowerCase() == '.png' ) { + var logospan = logoa.appendChild( document.createElement( 'span' ) ); + + logoa.style.backgroundImage = 'none'; + logospan.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=' + imageUrl + ')'; + logospan.style.height = '100%'; + logospan.style.position = 'absolute'; + logospan.style.width = logoa.currentStyle.width; + logospan.style.cursor = 'hand'; + // Center image with hack for IE5.5 + if ( document.documentElement.dir == 'rtl' ) { + logospan.style.right = '50%'; + logospan.style.setExpression( 'marginRight', '"-" + (this.offsetWidth / 2) + "px"' ); + } else { + logospan.style.left = '50%'; + logospan.style.setExpression( 'marginLeft', '"-" + (this.offsetWidth / 2) + "px"' ); + } + logospan.style.top = '50%'; + logospan.style.setExpression( 'marginTop', '"-" + (this.offsetHeight / 2) + "px"' ); + + var linkFix = logoa.appendChild( logoa.cloneNode() ); + linkFix.style.position = 'absolute'; + linkFix.style.height = '100%'; + linkFix.style.width = '100%'; + } + } +} + +// fix ie6 disappering float bug +function relativeforfloats() { + var bc = document.getElementById( 'bodyContent' ); + if ( bc ) { + var tables = bc.getElementsByTagName( 'table' ); + var divs = bc.getElementsByTagName( 'div' ); + } + setrelative( tables ); + setrelative( divs ); +} +function setrelative( nodes ) { + var i = 0; + while ( i < nodes.length ) { + if( ( ( nodes[i].style.float && nodes[i].style.float != ( 'none' ) || + ( nodes[i].align && nodes[i].align != ( 'none' ) ) ) && + ( !nodes[i].style.position || nodes[i].style.position != 'relative' ) ) ) + { + nodes[i].style.position = 'relative'; + } + i++; + } +} + +// Expand links for printing +String.prototype.hasClass = function( classWanted ) { + var classArr = this.split(/\s/); + for ( var i = 0; i < classArr.length; i++ ) { + if ( classArr[i].toLowerCase() == classWanted.toLowerCase() ) { + return true; + } + } + return false; +} + +var expandedURLs; + +onbeforeprint = function() { + expandedURLs = []; + + var contentEl = document.getElementById( 'content' ); + + if ( contentEl ) { + var allLinks = contentEl.getElementsByTagName( 'a' ); + + for ( var i = 0; i < allLinks.length; i++ ) { + if ( allLinks[i].className.hasClass( 'external' ) && !allLinks[i].className.hasClass( 'free' ) ) { + var expandedLink = document.createElement( 'span' ); + var expandedText = document.createTextNode( ' (' + allLinks[i].href + ')' ); + expandedLink.appendChild( expandedText ); + allLinks[i].parentNode.insertBefore( expandedLink, allLinks[i].nextSibling ); + expandedURLs[i] = expandedLink; + } + } + } +} + +onafterprint = function() { + for ( var i = 0; i < expandedURLs.length; i++ ) { + if ( expandedURLs[i] ) { + expandedURLs[i].removeNode( true ); + } + } +} diff --git a/skins/common/Makefile b/skins/common/Makefile new file mode 100644 index 0000000..56e60bd --- /dev/null +++ b/skins/common/Makefile @@ -0,0 +1,2 @@ +jquery.min.js: jquery.js + php ../../maintenance/minify.php $< --outfile $@ diff --git a/skins/common/ajax.js b/skins/common/ajax.js new file mode 100644 index 0000000..afcfa70 --- /dev/null +++ b/skins/common/ajax.js @@ -0,0 +1,167 @@ +// remote scripting library +// (c) copyright 2005 modernmethod, inc +var sajax_debug_mode = false; +var sajax_request_type = "GET"; + +/** +* if sajax_debug_mode is true, this function outputs given the message into +* the element with id = sajax_debug; if no such element exists in the document, +* it is injected. +*/ +function sajax_debug(text) { + if (!sajax_debug_mode) return false; + + var e= document.getElementById('sajax_debug'); + + if (!e) { + e= document.createElement("p"); + e.className= 'sajax_debug'; + e.id= 'sajax_debug'; + + var b= document.getElementsByTagName("body")[0]; + + if (b.firstChild) b.insertBefore(e, b.firstChild); + else b.appendChild(e); + } + + var m= document.createElement("div"); + m.appendChild( document.createTextNode( text ) ); + + e.appendChild( m ); + + return true; +} + +/** +* compatibility wrapper for creating a new XMLHttpRequest object. +*/ +function sajax_init_object() { + sajax_debug("sajax_init_object() called..") + var A; + try { + // Try the new style before ActiveX so we don't + // unnecessarily trigger warnings in IE 7 when + // set to prompt about ActiveX usage + A = new XMLHttpRequest(); + } catch (e) { + try { + A=new ActiveXObject("Msxml2.XMLHTTP"); + } catch (e) { + try { + A=new ActiveXObject("Microsoft.XMLHTTP"); + } catch (oc) { + A=null; + } + } + } + if (!A) + sajax_debug("Could not create connection object."); + + return A; +} + +/** +* Perform an ajax call to mediawiki. Calls are handeled by AjaxDispatcher.php +* func_name - the name of the function to call. Must be registered in $wgAjaxExportList +* args - an array of arguments to that function +* target - the target that will handle the result of the call. If this is a function, +* if will be called with the XMLHttpRequest as a parameter; if it's an input +* element, its value will be set to the resultText; if it's another type of +* element, its innerHTML will be set to the resultText. +* +* Example: +* sajax_do_call('doFoo', [1, 2, 3], document.getElementById("showFoo")); +* +* This will call the doFoo function via MediaWiki's AjaxDispatcher, with +* (1, 2, 3) as the parameter list, and will show the result in the element +* with id = showFoo +*/ +function sajax_do_call(func_name, args, target) { + var i, x, n; + var uri; + var post_data; + uri = wgServer + + ((wgScript == null) ? (wgScriptPath + "/index.php") : wgScript) + + "?action=ajax"; + if (sajax_request_type == "GET") { + if (uri.indexOf("?") == -1) + uri = uri + "?rs=" + encodeURIComponent(func_name); + else + uri = uri + "&rs=" + encodeURIComponent(func_name); + for (i = 0; i < args.length; i++) + uri = uri + "&rsargs[]=" + encodeURIComponent(args[i]); + //uri = uri + "&rsrnd=" + new Date().getTime(); + post_data = null; + } else { + post_data = "rs=" + encodeURIComponent(func_name); + for (i = 0; i < args.length; i++) + post_data = post_data + "&rsargs[]=" + encodeURIComponent(args[i]); + } + x = sajax_init_object(); + if (!x) { + alert("AJAX not supported"); + return false; + } + + try { + x.open(sajax_request_type, uri, true); + } catch (e) { + if (window.location.hostname == "localhost") { + alert("Your browser blocks XMLHttpRequest to 'localhost', try using a real hostname for development/testing."); + } + throw e; + } + if (sajax_request_type == "POST") { + x.setRequestHeader("Method", "POST " + uri + " HTTP/1.1"); + x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); + } + x.setRequestHeader("Pragma", "cache=yes"); + x.setRequestHeader("Cache-Control", "no-transform"); + x.onreadystatechange = function() { + if (x.readyState != 4) + return; + + sajax_debug("received (" + x.status + " " + x.statusText + ") " + x.responseText); + + //if (x.status != 200) + // alert("Error: " + x.status + " " + x.statusText + ": " + x.responseText); + //else + + if ( typeof( target ) == 'function' ) { + target( x ); + } + else if ( typeof( target ) == 'object' ) { + if ( target.tagName == 'INPUT' ) { + if (x.status == 200) target.value= x.responseText; + //else alert("Error: " + x.status + " " + x.statusText + " (" + x.responseText + ")"); + } + else { + if (x.status == 200) target.innerHTML = x.responseText; + else target.innerHTML= "
    Error: " + x.status + " " + x.statusText + " (" + x.responseText + ")
    "; + } + } + else { + alert("bad target for sajax_do_call: not a function or object: " + target); + } + + return; + } + + sajax_debug(func_name + " uri = " + uri + " / post = " + post_data); + x.send(post_data); + sajax_debug(func_name + " waiting.."); + delete x; + + return true; +} + +/** + * @return boolean whether the browser supports XMLHttpRequest + */ +function wfSupportsAjax() { + var request = sajax_init_object(); + var supportsAjax = request ? true : false; + delete request; + return supportsAjax; +} + diff --git a/skins/common/ajaxwatch.js b/skins/common/ajaxwatch.js new file mode 100644 index 0000000..7f54601 --- /dev/null +++ b/skins/common/ajaxwatch.js @@ -0,0 +1,180 @@ +// dependencies: +// * ajax.js: + /*extern sajax_init_object, sajax_do_call */ +// * wikibits.js: + /*extern changeText, hookEvent, jsMsg */ + +// These should have been initialized in the generated js +/*extern wgAjaxWatch, wgPageName */ + +if(typeof wgAjaxWatch === "undefined" || !wgAjaxWatch) { + var wgAjaxWatch = { + watchMsg: "Watch", + unwatchMsg: "Unwatch", + watchingMsg: "Watching...", + unwatchingMsg: "Unwatching...", + 'tooltip-ca-watchMsg': "Add this page to your watchlist", + 'tooltip-ca-unwatchMsg': "Remove this page from your watchlist" + }; +} + +wgAjaxWatch.supported = true; // supported on current page and by browser +wgAjaxWatch.watching = false; // currently watching page +wgAjaxWatch.inprogress = false; // ajax request in progress +wgAjaxWatch.timeoutID = null; // see wgAjaxWatch.ajaxCall +wgAjaxWatch.watchLinks = []; // "watch"/"unwatch" links +wgAjaxWatch.iconMode = false; // new icon driven functionality +wgAjaxWatch.imgBasePath = ""; // base img path derived from icons on load + +wgAjaxWatch.setLinkText = function( newText ) { + if( wgAjaxWatch.iconMode ) { + for ( i = 0; i < wgAjaxWatch.watchLinks.length; i++ ) { + wgAjaxWatch.watchLinks[i].firstChild.alt = newText; + if ( newText == wgAjaxWatch.watchingMsg || newText == wgAjaxWatch.unwatchingMsg ) { + wgAjaxWatch.watchLinks[i].className += ' loading'; + } else if ( newText == wgAjaxWatch.watchMsg || newText == wgAjaxWatch.unwatchMsg ) { + wgAjaxWatch.watchLinks[i].className = + wgAjaxWatch.watchLinks[i].className.replace( /loading/i, '' ); + // update the title text on the link + var keyCommand = wgAjaxWatch.watchLinks[i].title.match( /\[.*?\]$/ ) ? + wgAjaxWatch.watchLinks[i].title.match( /\[.*?\]$/ )[0] : ""; + wgAjaxWatch.watchLinks[i].title = ( newText == wgAjaxWatch.watchMsg ? + wgAjaxWatch['tooltip-ca-watchMsg'] : wgAjaxWatch['tooltip-ca-unwatchMsg'] ) + + " " + keyCommand; + } + } + } else { + for ( i = 0; i < wgAjaxWatch.watchLinks.length; i++ ) { + changeText( wgAjaxWatch.watchLinks[i], newText ); + } + } +}; + +wgAjaxWatch.setLinkID = function( newId ) { + // We can only set the first one + wgAjaxWatch.watchLinks[0].parentNode.setAttribute( 'id', newId ); +}; + +wgAjaxWatch.setHref = function( string ) { + for( i = 0; i < wgAjaxWatch.watchLinks.length; i++ ) { + if( string == 'watch' ) { + wgAjaxWatch.watchLinks[i].href = wgAjaxWatch.watchLinks[i].href + .replace( /&action=unwatch/, '&action=watch' ); + } else if( string == 'unwatch' ) { + wgAjaxWatch.watchLinks[i].href = wgAjaxWatch.watchLinks[i].href + .replace( /&action=watch/, '&action=unwatch' ); + } + } +} + +wgAjaxWatch.ajaxCall = function() { + if(!wgAjaxWatch.supported) { + return true; + } else if (wgAjaxWatch.inprogress) { + return false; + } + if(!wfSupportsAjax()) { + // Lazy initialization so we don't toss up + // ActiveX warnings on initial page load + // for IE 6 users with security settings. + wgAjaxWatch.supported = false; + return true; + } + + wgAjaxWatch.inprogress = true; + wgAjaxWatch.setLinkText( wgAjaxWatch.watching + ? wgAjaxWatch.unwatchingMsg : wgAjaxWatch.watchingMsg); + sajax_do_call( + "wfAjaxWatch", + [wgPageName, (wgAjaxWatch.watching ? "u" : "w")], + wgAjaxWatch.processResult + ); + // if the request isn't done in 10 seconds, allow user to try again + wgAjaxWatch.timeoutID = window.setTimeout( + function() { wgAjaxWatch.inprogress = false; }, + 10000 + ); + return false; +}; + +wgAjaxWatch.processResult = function(request) { + if(!wgAjaxWatch.supported) { + return; + } + var response = request.responseText; + if( response.match(/^/) ) { + wgAjaxWatch.watching = true; + wgAjaxWatch.setLinkText(wgAjaxWatch.unwatchMsg); + wgAjaxWatch.setLinkID("ca-unwatch"); + wgAjaxWatch.setHref( 'unwatch' ); + } else if( response.match(/^/) ) { + wgAjaxWatch.watching = false; + wgAjaxWatch.setLinkText(wgAjaxWatch.watchMsg); + wgAjaxWatch.setLinkID("ca-watch"); + wgAjaxWatch.setHref( 'watch' ); + } else { + // Either we got a error code or it just plain broke. + window.location.href = wgAjaxWatch.watchLinks[0].href; + return; + } + jsMsg( response.substr(4), 'watch' ); + wgAjaxWatch.inprogress = false; + if(wgAjaxWatch.timeoutID) { + window.clearTimeout(wgAjaxWatch.timeoutID); + } + // Bug 12395 - avoid some watch link confusion on edit + var watchthis = document.getElementById("wpWatchthis"); + if( watchthis && response.match(/^<[uw]#>/) ) { + watchthis.checked = response.match(/^/) ? "checked" : ""; + } + return; +}; + +wgAjaxWatch.onLoad = function() { + // This document structure hardcoding sucks. We should make a class and + // toss all this out the window. + + var el1 = document.getElementById("ca-unwatch"); + var el2 = null; + if ( !el1 ) { + el1 = document.getElementById("mw-unwatch-link1"); + el2 = document.getElementById("mw-unwatch-link2"); + } + if( el1 ) { + wgAjaxWatch.watching = true; + } else { + wgAjaxWatch.watching = false; + el1 = document.getElementById("ca-watch"); + if ( !el1 ) { + el1 = document.getElementById("mw-watch-link1"); + el2 = document.getElementById("mw-watch-link2"); + } + if( !el1 ) { + wgAjaxWatch.supported = false; + return; + } + } + + // Detect if the watch/unwatch feature is in icon mode + if ( el1.className.match( /icon/i ) ) { + wgAjaxWatch.iconMode = true; + } + + // The id can be either for the parent (Monobook-based) or the element + // itself (non-Monobook) + wgAjaxWatch.watchLinks.push( el1.tagName.toLowerCase() == "a" + ? el1 : el1.firstChild ); + + if( el2 ) { + wgAjaxWatch.watchLinks.push( el2 ); + } + + // I couldn't get for (watchLink in wgAjaxWatch.watchLinks) to work, if + // you can be my guest. + for( i = 0; i < wgAjaxWatch.watchLinks.length; i++ ) { + wgAjaxWatch.watchLinks[i].onclick = wgAjaxWatch.ajaxCall; + } + return; +}; + +hookEvent("load", wgAjaxWatch.onLoad); diff --git a/skins/common/block.js b/skins/common/block.js new file mode 100644 index 0000000..ad04f81 --- /dev/null +++ b/skins/common/block.js @@ -0,0 +1,57 @@ +addOnloadHook( considerChangingExpiryFocus ); + +function considerChangingExpiryFocus() { + if ( !document.getElementById ) { + return; + } + var drop = document.getElementById( 'wpBlockExpiry' ); + if ( !drop ) { + return; + } + var field = document.getElementById( 'wpBlockOther' ); + if ( !field ) { + return; + } + var opt = drop.value; + if ( opt == 'other' ) { + field.style.display = ''; + } else { + field.style.display = 'none'; + } +} + +function updateBlockOptions() { + if ( !document.getElementById ) { + return; + } + + var target = document.getElementById( 'mw-bi-target' ); + if ( !target ) { + return; + } + + var addy = target.value; + var isEmpty = addy.match(/^\s*$/); + var isIp = addy.match(/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|:(:[0-9A-Fa-f]{1,4}){1,7}|[0-9A-Fa-f]{1,4}(:{1,2}[0-9A-Fa-f]{1,4}|::$){1,7})(\/\d+)?$/); + var isIpRange = isIp && addy.match(/\/\d+$/); + + var anonymousRow = document.getElementById( 'wpAnonOnlyRow' ); + if( anonymousRow ) { + anonymousRow.style.display = ( !isIp && !isEmpty ) ? 'none' : ''; + } + + var autoblockRow = document.getElementById( 'wpEnableAutoblockRow' ); + if( autoblockRow ) { + autoblockRow.style.display = isIp && !isEmpty ? 'none' : ''; + } + + var hideuserRow = document.getElementById( 'wpEnableHideUser' ); + if( hideuserRow ) { + hideuserRow.style.display = isIp && !isEmpty ? 'none' : ''; + } + + var watchuserRow = document.getElementById( 'wpEnableWatchUser' ); + if( watchuserRow ) { + watchuserRow.style.display = isIpRange && !isEmpty ? 'none' : ''; + } +} diff --git a/skins/common/changepassword.js b/skins/common/changepassword.js new file mode 100644 index 0000000..1e3e206 --- /dev/null +++ b/skins/common/changepassword.js @@ -0,0 +1,16 @@ + +function onNameChange() { + if ( wgUserName != document.getElementById('wpName').value ) { + document.getElementById('wpPassword').disabled = true; + document.getElementById('wpComment').disabled = false; + } else { + document.getElementById('wpPassword').disabled = false; + document.getElementById('wpComment').disabled = true; + } +} + +function onNameChangeHook() { + document.getElementById( 'wpName' ).onblur = onNameChange; +} + +addOnloadHook( onNameChangeHook ); diff --git a/skins/common/cologneblue.css b/skins/common/cologneblue.css new file mode 100644 index 0000000..2329d23 --- /dev/null +++ b/skins/common/cologneblue.css @@ -0,0 +1,101 @@ +body { margin: 0px; padding: 0px; color: black; } +#specialform { display: inline; } +#content { top: 0; margin: 0; padding: 0; } +#mw-data-after-content { + font-family: Verdana, Arial, sans-serif; + color: black; + font-size: 8pt; +} +#topbar { padding: 0px; } +#powersearch { + background: #DDEEFF; border-style: solid; border-width: 1px; padding: 2px; +} +#quickbar { + width: 140px; top: 18ex; padding: 2px; visibility: visible; z-index: 99; +} +#article, #article td, #article th, #article p { + font-family: Verdana, Arial, sans-serif; + font-size: 10pt; color: black; +} +#article p { + padding-top: 0; padding-bottom: 0; + margin-top: 1ex; margin-bottom: 0; +} +p, pre, td, th, li, dd, dt { line-height: 12pt; } +textarea { overflow: auto; } + +#footer { padding: 4px; } +#footer form { display: inline; } +#sitetitle { + font-family: Times, serif; + color: white; + font-weight: normal; font-size: 32pt; + line-height: 32pt; +} +td.top { + background-color: #6688AA; color: white; + margin-top: 4px; margin-bottom: 4px; + padding-top: 0; padding-bottom: 0; + text-transform: uppercase; + font-family: Verdana, Arial, sans-serif; font-size: 8pt; +} +td.top a { + font-family: Verdana, Arial, sans-serif; + background-color: #6688AA; color: white; + text-decoration: none; font-size: 10pt; +} +td.bottom { + font-family: Verdana, Arial, sans-serif; + font-size: 10pt; + padding: 0; +} +#pagestats { + font-family: Verdana, Arial, sans-serif; + color: black; + font-size: 9pt; +} +#sitesub { + font-family: Verdana, Arial, sans-serif; + font-size: 9pt; font-weight: bold; + color: black; + padding-top: 0; +} +#quickbar { + font-family: Verdana, Arial, sans-serif; + font-size: 8pt; font-weight: bold; line-height: 9.5pt; + text-decoration: none; + color: black; + padding: 0; margin-top: 0; +} +#quickbar a { color: #446688; } + +#quickbar h6 { + font-family: Verdana, Arial, sans-serif; + font-size: 10pt; font-weight: bold; line-height: 12pt; + text-decoration: none; + color: #666666; + padding: 0; margin-bottom: 2px; margin-top: 6px; +} +#quickbar form { padding: 0; margin-top: 0; } + +h1 { + color: #666666; + font-family: Verdana, Arial, sans-serif; + font-size: 180%; line-height: 21pt; +} +h1 .editsection { font-size: 55.6%; } +h1.pagetitle { padding-bottom: 0; margin-bottom: 0; } +#article p.subtitle { + color: #666666; font-size: 11pt; font-weight: bold; + padding-top: 0; margin-top: 0; padding-bottom: 1ex; +} + +a { color: #223366; } +a.external { color: #336644; } +a:visited { color: #8D0749; } +a.printable { text-decoration: underline; } +a.stub, #quickbar a.stub { color:#772233; text-decoration:none; } +a.new, #quickbar a.new { color: #CC2200; } +h2, h3, h4, h5, h6 { margin-bottom: 0; } +small { font-size: 75%; } +input.mw-searchInput { width: 106px; } diff --git a/skins/common/commonPrint.css b/skins/common/commonPrint.css new file mode 100644 index 0000000..0932fce --- /dev/null +++ b/skins/common/commonPrint.css @@ -0,0 +1,249 @@ +/* +** MediaWiki Print style sheet for CSS2-capable browsers. +** Copyright Gabriel Wicke, http://www.aulinx.de/ +** +** Derived from the plone (http://plone.org/) styles +** Copyright Alexander Limi +*/ + +/* Thanks to A List Apart (http://alistapart.com/) for useful extras */ +a.stub, +a.new{ color:#ba0000; text-decoration:none; } + +#toc { + /*border:1px solid #2f6fab;*/ + border:1px solid #aaaaaa; + background-color:#f9f9f9; + padding:5px; +} +.tocindent { + margin-left: 2em; +} +.tocline { + margin-bottom: 0px; +} + +/* images */ +div.floatright { + float: right; + clear: right; + margin: 0; + position:relative; + border: 0.5em solid White; + border-width: 0.5em 0 0.8em 1.4em; +} +div.floatright p { font-style: italic;} +div.floatleft { + float: left; + margin: 0.3em 0.5em 0.5em 0; + position:relative; + border: 0.5em solid White; + border-width: 0.5em 1.4em 0.8em 0; +} +div.floatleft p { font-style: italic; } +/* thumbnails */ +div.thumb { + margin-bottom: 0.5em; + border-style: solid; border-color: White; + width: auto; + overflow: hidden; +} +div.thumbinner { + border:1px solid #cccccc; + padding: 3px !important; + background-color:#f9f9f9; + font-size: 94%; + text-align: center; +} +html .thumbimage { + border:1px solid #cccccc; +} +html .thumbcaption { + border: none; + padding: 0.3em 0 0.1em 0; +} +div.magnify { display: none; } +div.tright { + float: right; + clear: right; + border-width: 0.5em 0 0.8em 1.4em; +} +div.tleft { + float: left; + margin-right:0.5em; + border-width: 0.5em 1.4em 0.8em 0; +} +img.thumbborder { + border: 1px solid #dddddd; +} + +/* table standards */ +table.rimage { + float:right; + width:1pt; + position:relative; + margin-left:1em; + margin-bottom:1em; + text-align:center; +} + +body { + background: White; + /*font-size: 11pt !important;*/ + color: Black; + margin: 0; + padding: 0; +} + +.noprint, +div#jump-to-nav, +div.top, +div#column-one, +#colophon, +.editsection, +.toctoggle, +.tochidden, +div#f-poweredbyico, +div#f-copyrightico, +li#viewcount, +li#about, +li#disclaimer, +li#privacy, +#mw-hidden-catlinks { + /* Hides all the elements irrelevant for printing */ + display: none; +} + +ul { + list-style-type: square; +} + +#content { + background: none; + border: none ! important; + padding: 0 ! important; + margin: 0 ! important; +} +#footer { + background : white; + color : black; + border-top: 1px solid black; +} + +h1, h2, h3, h4, h5, h6 { + font-weight: bold; +} + +p, .documentDescription { + margin: 1em 0 ! important; + line-height: 1.2em; +} + +.tocindent p { + margin: 0 0 0 0 ! important; +} + +pre { + border: 1pt dashed black; + white-space: pre; + font-size: 8pt; + overflow: auto; + padding: 1em 0; + background : white; + color : black; +} + +table.listing, +table.listing td { + border: 1pt solid black; + border-collapse: collapse; +} + +a { + color: Black !important; + background: none !important; + padding: 0 !important; +} + +a:link, a:visited { + color: #520; + background: transparent; + text-decoration: underline; +} + +#content a.external.text:after, #content a.external.autonumber:after { + /* Expand URLs for printing */ + content: " (" attr(href) ") "; +} + +#globalWrapper { + width: 100% !important; + min-width: 0 !important; +} + +#content { + background : white; + color : black; +} + +#column-content { + margin: 0 !important; +} + +#column-content #content { + padding: 1em; + margin: 0 !important; +} +/* MSIE/Win doesn't understand 'inherit' */ +a, a.external, a.new, a.stub { + color: black ! important; + text-decoration: none ! important; +} + +/* Continue ... */ +a, a.external, a.new, a.stub { + color: inherit ! important; + text-decoration: inherit ! important; +} + +img { border: none; } +img.tex { vertical-align: middle; } +span.texhtml { font-family: serif; } + +#siteNotice { display: none; } + +div.gallerybox { + border: 1px solid #cccccc; + background-color:#f9f9f9; + width: 150px; +} + +div.gallerytext { + overflow: visible; +} + +/* +** Diff rendering +*/ +table.diff { background:white; } +td.diff-otitle { background:#ffffff; } +td.diff-ntitle { background:#ffffff; } +td.diff-addedline { + background:#ccffcc; + font-size: smaller; + border: solid 2px black; +} +td.diff-deletedline { + background:#ffffaa; + font-size: smaller; + border: dotted 2px black; +} +td.diff-context { + background:#eeeeee; + font-size: smaller; +} +.diffchange { + color: silver; + font-weight: bold; + text-decoration: underline; +} diff --git a/skins/common/common_rtl.css b/skins/common/common_rtl.css new file mode 100644 index 0000000..2e8bb98 --- /dev/null +++ b/skins/common/common_rtl.css @@ -0,0 +1,59 @@ +/* + * This file contains CSS settings common to RTL wikis use the old + * pre-Monobook skins Wikistandard, Nostalgia and CologneBlue + * NOTE: This file is not used in Monobook! + */ + +/* js pref toc */ +#preftoc { float: right; } +/* workaround for moz bug, displayed bullets on left side */ +#preftoc li { list-style: none; } +#prefcontrol { float: right; } +fieldset.prefsection, +fieldset.operaprefsection { + margin-left: 0; + margin-right: 18em; +} +/* page history */ +#pagehistory .history-user { + margin-right: 1.4em; + margin-left: 0.4em; +} +.editsection { + float: left; + margin-right: 5px; +} +div.tright, div.floatright { + clear: none; +} +div.tleft, div.floatleft { + clear: left; +} +/* Convenience links to edit block, delete and protect reasons */ +p.mw-ipb-conveniencelinks, p.mw-protect-editreasons, +p.mw-filedelete-editreasons, p.mw-delete-editreasons, +p.mw-revdel-editreasons { + float: left; +} +table.filehistory th { + text-align: right; +} + +/** + * Lists: + * The following lines don't have a visible effect on non-Gecko browsers + * They fix a problem ith Gecko browsers rendering lists to the right of + * left-floated objects in an RTL layout. + */ +html > body div#article ul { + display: table; +} +html > body div#bodyContent ul#filetoc { + display: block; +} + +/* feed links */ +a.feedlink { + background: none !important; + padding-left: 0 !important; +} diff --git a/skins/common/diff.css b/skins/common/diff.css new file mode 100644 index 0000000..6afa373 --- /dev/null +++ b/skins/common/diff.css @@ -0,0 +1,143 @@ +/* +** Diff rendering +*/ +table.diff, td.diff-otitle, td.diff-ntitle { + background-color: white; +} +td.diff-otitle, +td.diff-ntitle { + text-align: center; +} +td.diff-marker { + text-align: right; +} +.rtl td.diff-marker { + text-align: left; +} +td.diff-lineno { + font-weight: bold; +} +td.diff-addedline { + background: #cfc; + font-size: smaller; +} +td.diff-deletedline { + background: #ffa; + font-size: smaller; +} +td.diff-context { + background: #eee; + font-size: smaller; +} +.diffchange { + color: red; + font-weight: bold; + text-decoration: none; + white-space: pre-wrap; + white-space: -moz-pre-wrap; +} + +table.diff { + border: none; + width: 98%; + border-spacing: 4px; + + /* Fixed layout is required to ensure that cells containing long URLs + don't widen in Safari, Internet Explorer, or iCab */ + table-layout: fixed; +} +table.diff td { + padding: 0; +} +table.diff col.diff-marker { + width: 2%; +} +table.diff col.diff-content { + width: 48%; +} +table.diff td div { + /* Force-wrap very long lines such as URLs or page-widening char strings. + CSS 3 draft..., but Gecko doesn't support it yet: + https://bugzilla.mozilla.org/show_bug.cgi?id=99457 */ + word-wrap: break-word; + + /* As fallback, scrollbars will be added for very wide cells + instead of text overflowing or widening */ + overflow: auto; + + /* The above rule breaks on very old versions of Mozilla due + to a bug which collapses the table cells to a single line. + + In Mozilla 1.1 and below with JavaScript enabled, the rule + will be overridden with this by diff.js; wide cell contents + then spill horizontally without widening the rest of the + table: */ + /* overflow: visible; */ +} + +/* + * Styles for the HTML Diff + */ +div.diff-switchtype{ + text-align: center; + font-weight: bold; + font-size: smaller; +} + +span.diff-html-added { + font-size: 100%; + background-color: #20ff20 +} + +span.diff-html-removed { + font-size: 100%; + text-decoration: line-through; + background-color: #ff2020 +} + +span.diff-html-changed { + background: url(images/diffunderline.gif) bottom repeat-x; + /* Hack for IE5.5, see http://lists.wikimedia.org/pipermail/wikitech-l/2008-November/040273.html */ + *background-color: #c6c6fd; /* light blue */ +} + +span.diff-html-added img{ + border: 5px solid #ccffcc; +} + +span.diff-html-removed img{ + border: 5px solid #fdc6c6; +} + +span.diff-html-changed img{ + border: 5px dotted #000099; + +} + +span.diff-html-changed { + position: relative; /* this is key */ + cursor: help; +} + +span.diff-html-changed span.tip { + display: none; /* so is this */ +} + +/* tooltip will display on :hover event */ + +span.diff-html-changed:hover span.tip { + display: block; + z-index: 95; + position: absolute; + top: 2.5em; + left: 0; + width: auto; + line-height: 1.2em; + padding: 3px 7px 4px 6px; + border: 1px solid #336; + background-color: #f7f7ee; + font-size: 10px; + text-align: left; +} + + diff --git a/skins/common/diff.js b/skins/common/diff.js new file mode 100644 index 0000000..5fd151f --- /dev/null +++ b/skins/common/diff.js @@ -0,0 +1,20 @@ +/* +Workaround for overflow bug in Mozilla 1.1 and earlier, where scrolling +
    s in cells collapse their height to a single line. + +Known to be fixed in 1.2.1 (Gecko 20021130), but the CSS hacks I've tried +with overflow-x disable the scrolling all the way until Mozilla 1.8 / FF 1.5 +and break Opera as well. + +So... we check for reaaaally old Gecko and hack in an alternate rule to let +the wide cells spill instead of scrolling them. Not ideal as it won't work +if JS is disabled, of course. +*/ + +if (navigator && navigator.product == "Gecko" && navigator.productSub < "20021130") { + var sheets = document.styleSheets; + var lastSheet = sheets[sheets.length-1]; + lastSheet.insertRule( + "table.diff td div { overflow: visible; }", + lastSheet.cssRules.length); +} diff --git a/skins/common/edit.js b/skins/common/edit.js new file mode 100644 index 0000000..423205f --- /dev/null +++ b/skins/common/edit.js @@ -0,0 +1,231 @@ +var currentFocused; + +// this function generates the actual toolbar buttons with localized text +// we use it to avoid creating the toolbar where javascript is not enabled +function addButton( imageFile, speedTip, tagOpen, tagClose, sampleText, imageId ) { + // Don't generate buttons for browsers which don't fully + // support it. + mwEditButtons.push({ + 'imageId': imageId, + 'imageFile': imageFile, + 'speedTip': speedTip, + 'tagOpen': tagOpen, + 'tagClose': tagClose, + 'sampleText': sampleText + }); +} + +// this function generates the actual toolbar buttons with localized text +// we use it to avoid creating the toolbar where JavaScript is not enabled +function mwInsertEditButton( parent, item ) { + var image = document.createElement( 'img' ); + image.width = 23; + image.height = 22; + image.className = 'mw-toolbar-editbutton'; + if ( item.imageId ) { + image.id = item.imageId; + } + image.src = item.imageFile; + image.border = 0; + image.alt = item.speedTip; + image.title = item.speedTip; + image.style.cursor = 'pointer'; + image.onclick = function() { + insertTags( item.tagOpen, item.tagClose, item.sampleText ); + // click tracking + if ( ( typeof $j != 'undefined' ) && ( typeof $j.trackAction != 'undefined' ) ) { + $j.trackAction( 'oldedit.' + item.speedTip.replace(/ /g, "-") ); + } + return false; + }; + + parent.appendChild( image ); + return true; +} + +function mwSetupToolbar() { + var toolbar = document.getElementById( 'toolbar' ); + if ( !toolbar ) { + return false; + } + + // Don't generate buttons for browsers which don't fully + // support it. + // but don't assume wpTextbox1 is always here + var textboxes = document.getElementsByTagName( 'textarea' ); + if ( !textboxes.length ) { + // No toolbar if we can't find any textarea + return false; + } + // Only check for selection capability if the textarea is visible - errors will occur otherwise - just because + // the textarea is not visible, doesn't mean we shouldn't build out the toolbar though - it might have been replaced + // with some other kind of control + if ( textboxes[0].style.display != 'none' ) { + if ( !( document.selection && document.selection.createRange ) + && textboxes[0].selectionStart === null ) { + return false; + } + } + for ( var i = 0; i < mwEditButtons.length; i++ ) { + mwInsertEditButton( toolbar, mwEditButtons[i] ); + } + for ( var i = 0; i < mwCustomEditButtons.length; i++ ) { + mwInsertEditButton( toolbar, mwCustomEditButtons[i] ); + } + return true; +} + +// apply tagOpen/tagClose to selection in textarea, +// use sampleText instead of selection if there is none +function insertTags( tagOpen, tagClose, sampleText ) { + if ( typeof $j != 'undefined' && typeof $j.fn.textSelection != 'undefined' && + ( currentFocused.nodeName.toLowerCase() == 'iframe' || currentFocused.id == 'wpTextbox1' ) ) { + $j( '#wpTextbox1' ).textSelection( + 'encapsulateSelection', { 'pre': tagOpen, 'peri': sampleText, 'post': tagClose } + ); + return; + } + var txtarea; + if ( document.editform ) { + txtarea = currentFocused; + } else { + // some alternate form? take the first one we can find + var areas = document.getElementsByTagName( 'textarea' ); + txtarea = areas[0]; + } + var selText, isSample = false; + + if ( document.selection && document.selection.createRange ) { // IE/Opera + // save window scroll position + if ( document.documentElement && document.documentElement.scrollTop ) { + var winScroll = document.documentElement.scrollTop + } else if ( document.body ) { + var winScroll = document.body.scrollTop; + } + // get current selection + txtarea.focus(); + var range = document.selection.createRange(); + selText = range.text; + // insert tags + checkSelectedText(); + range.text = tagOpen + selText + tagClose; + // mark sample text as selected + if ( isSample && range.moveStart ) { + if ( window.opera ) { + tagClose = tagClose.replace(/\n/g,''); + } + range.moveStart('character', - tagClose.length - selText.length); + range.moveEnd('character', - tagClose.length); + } + range.select(); + // restore window scroll position + if ( document.documentElement && document.documentElement.scrollTop ) { + document.documentElement.scrollTop = winScroll; + } else if ( document.body ) { + document.body.scrollTop = winScroll; + } + + } else if ( txtarea.selectionStart || txtarea.selectionStart == '0' ) { // Mozilla + // save textarea scroll position + var textScroll = txtarea.scrollTop; + // get current selection + txtarea.focus(); + var startPos = txtarea.selectionStart; + var endPos = txtarea.selectionEnd; + selText = txtarea.value.substring( startPos, endPos ); + // insert tags + checkSelectedText(); + txtarea.value = txtarea.value.substring(0, startPos) + + tagOpen + selText + tagClose + + txtarea.value.substring(endPos, txtarea.value.length); + // set new selection + if ( isSample ) { + txtarea.selectionStart = startPos + tagOpen.length; + txtarea.selectionEnd = startPos + tagOpen.length + selText.length; + } else { + txtarea.selectionStart = startPos + tagOpen.length + selText.length + tagClose.length; + txtarea.selectionEnd = txtarea.selectionStart; + } + // restore textarea scroll position + txtarea.scrollTop = textScroll; + } + + function checkSelectedText() { + if ( !selText ) { + selText = sampleText; + isSample = true; + } else if ( selText.charAt(selText.length - 1) == ' ' ) { // exclude ending space char + selText = selText.substring(0, selText.length - 1); + tagClose += ' '; + } + } + +} + +/** + * Restore the edit box scroll state following a preview operation, + * and set up a form submission handler to remember this state + */ +function scrollEditBox() { + var editBox = document.getElementById( 'wpTextbox1' ); + var scrollTop = document.getElementById( 'wpScrolltop' ); + var editForm = document.getElementById( 'editform' ); + if( editForm && editBox && scrollTop ) { + if( scrollTop.value ) { + editBox.scrollTop = scrollTop.value; + } + addHandler( editForm, 'submit', function() { + scrollTop.value = editBox.scrollTop; + } ); + } +} +hookEvent( 'load', scrollEditBox ); +hookEvent( 'load', mwSetupToolbar ); +hookEvent( 'load', function() { + currentFocused = document.getElementById( 'wpTextbox1' ); + // http://www.quirksmode.org/blog/archives/2008/04/delegating_the.html + // focus does not bubble normally, but using a trick we can do event delegation + // on the focus event on all text inputs to make the toolbox usable on all of them + var editForm = document.getElementById( 'editform' ); + if ( !editForm ) { + return; + } + function onfocus( e ) { + var elm = e.target || e.srcElement; + if ( !elm ) { + return; + } + var tagName = elm.tagName.toLowerCase(); + var type = elm.type || ''; + if ( tagName !== 'textarea' && tagName !== 'input' ) { + return; + } + if ( tagName === 'input' && type.toLowerCase() !== 'text' ) { + return; + } + + currentFocused = elm; + } + + if ( editForm.addEventListener ) { + // Gecko, WebKit, Opera, etc... (all standards compliant browsers) + editForm.addEventListener( 'focus', onfocus, true ); // This MUST be true to work + } else if ( editForm.attachEvent ) { + // IE needs a specific trick here since it doesn't support the standard + editForm.attachEvent( 'onfocusin', function() { onfocus( event ); } ); + } + + // HACK: make currentFocused work with the usability iframe + // With proper focus detection support (HTML 5!) this'll be much cleaner + if ( typeof $j != 'undefined' ) { + var iframe = $j( '.wikiEditor-ui-text iframe' ); + if ( iframe.length > 0 ) { + $j( iframe.get( 0 ).contentWindow.document ) + .add( iframe.get( 0 ).contentWindow.document.body ) // for IE + .focus( function() { currentFocused = iframe.get( 0 ); } ); + } + } + + editForm +} ); + diff --git a/skins/common/enhancedchanges.js b/skins/common/enhancedchanges.js new file mode 100644 index 0000000..b1789c9 --- /dev/null +++ b/skins/common/enhancedchanges.js @@ -0,0 +1,40 @@ +/* + JavaScript file for enhanced recentchanges + */ + +/* + * Add the CSS to hide parts that should be collapsed + * + * We do this with JS so everything will be expanded by default + * if JS is disabled + */ +appendCSS('.mw-changeslist-hidden {'+ + ' display:none;'+ + '}'+ + 'div.mw-changeslist-expanded {'+ + ' display:block;'+ + '}'+ + 'span.mw-changeslist-expanded {'+ + ' display:inline !important;'+ + ' visibility:visible !important;'+ + '}' +); + +/* + * Switch an RC line between hidden/shown + * @param int idNumber : the id number of the RC group +*/ +function toggleVisibility(idNumber) { + var openarrow = document.getElementById("mw-rc-openarrow-"+idNumber); + var closearrow = document.getElementById("mw-rc-closearrow-"+idNumber); + var subentries = document.getElementById("mw-rc-subentries-"+idNumber); + if (openarrow.className == 'mw-changeslist-expanded') { + openarrow.className = 'mw-changeslist-hidden'; + closearrow.className = 'mw-changeslist-expanded'; + subentries.className = 'mw-changeslist-expanded'; + } else { + openarrow.className = 'mw-changeslist-expanded'; + closearrow.className = 'mw-changeslist-hidden'; + subentries.className = 'mw-changeslist-hidden'; + } +} diff --git a/skins/common/feed.css b/skins/common/feed.css new file mode 100644 index 0000000..9439663 --- /dev/null +++ b/skins/common/feed.css @@ -0,0 +1,95 @@ +/* +Make RSS and Atom feeds at least semi-legible to folk who accidentally +load them in a browser... + +Compatibility: +* Mozilla is fine. +* Safari 1.2: the RSS text isn't shown +* Opera 7.5 uses the style sheet instead of its native RSS mode. +* IE/Mac 5.2: none of the :before content works; doesn't get the charset right and displays garbage for non-ASCII. +* IE/Win 6.0: No background color, borders, font size, font weight, or :before content. + +*/ + +/* RSS: */ rss, channel, title, link, description, language, generator, lastBuildDate, item, pubDate, author, comments, creator, +/* Atom: */ feed, id, modified, tagline, entry, issued, created, updated, summary, comment { + display: block; +} + +rss, feed { + background: white; + color: black; + margin: 1em; + font-family: "Verdana", "Tahoma", "Arial", "Helvetica", sans-serif; + line-height: 1.5em; + font-size: 76%; +} + +rss:before { + content: "This RSS feed is meant to be read in a syndicated news reader, and isn't ideal for a web browser."; +} + +feed:before { + content: "This Atom feed is meant to be read in a syndicated news reader, and isn't ideal for a web browser."; +} +rss:before, feed:before { + color: red; + text-align: center; + line-height: 2em; +} + +channel>title, +item>title, +feed>title, +entry>title { + font-weight: bold; + border-bottom: solid 1px #aaa; + margin-left: -0.5em; +} +channel>title, feed>title { + font-size: larger; +} +item>title, entry>title { + font-size: large; +} +item, entry { + margin-top: 1em; + margin-left: 2em; +} + +item>description, entry>summary { + white-space: pre; + overflow: auto; + background: #f8f8ff; +} + +pubDate:before { content: "Date: " } +link:before { content: "Link: " } +author:before, creator:before { content: "Author: " } +description:before { content: "Description: " } +id:before { content: "Id: " } + +generator:before { content: "Generator: " } +language:before { content: "Language: " } +lastBuildDate:before { content: "Updated: " } +comments:before { content: "Comments page: " } + +tagline:before { content: "Tagline: " } +issued:before { content: "Issued: " } +created:before { content: "Created: " } +modified:before { content: "Modified: " } +updated:before { content: "Updated: " } +summary:before { content: "Summary: " } +comment:before { content: "Comment: " } + +pubDate:before, link:before, author:before, description:before, +language:before, generator:before, lastBuildDate:before, comments:before, +tagline:before, issued:before, created:before, modified:before, +summary:before, comment:before, creator:before, id:before, updated:before { + color: #224; + font-weight: bold; +} + +feed link:after { + content: attr(href); +} diff --git a/skins/common/history.js b/skins/common/history.js new file mode 100644 index 0000000..0265122 --- /dev/null +++ b/skins/common/history.js @@ -0,0 +1,94 @@ +function historyRadios(parent) { + var inputs = parent.getElementsByTagName('input'); + var radios = []; + for (var i = 0; i < inputs.length; i++) { + if (inputs[i].name == "diff" || inputs[i].name == "oldid") { + radios[radios.length] = inputs[i]; + } + } + return radios; +} + +// check selection and tweak visibility/class onclick +function diffcheck() { + var dli = false; // the li where the diff radio is checked + var oli = false; // the li where the oldid radio is checked + var hf = document.getElementById('pagehistory'); + if (!hf) { + return true; + } + var lis = hf.getElementsByTagName('li'); + for (var i=0;i)[^>]*$|^#([\w-]+)$/, + // Is it a simple selector + isSimple = /^.[^:#\[\.,]*$/; + +jQuery.fn = jQuery.prototype = { + init: function( selector, context ) { + // Make sure that a selection was provided + selector = selector || document; + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this[0] = selector; + this.length = 1; + this.context = selector; + return this; + } + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + var match = quickExpr.exec( selector ); + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) + selector = jQuery.clean( [ match[1] ], context ); + + // HANDLE: $("#id") + else { + var elem = document.getElementById( match[3] ); + + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem && elem.id != match[3] ) + return jQuery().find( selector ); + + // Otherwise, we inject the element directly into the jQuery object + var ret = jQuery( elem || [] ); + ret.context = document; + ret.selector = selector; + return ret; + } + + // HANDLE: $(expr, [context]) + // (which is just equivalent to: $(content).find(expr) + } else + return jQuery( context ).find( selector ); + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) + return jQuery( document ).ready( selector ); + + // Make sure that old selector state is passed along + if ( selector.selector && selector.context ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return this.setArray(jQuery.isArray( selector ) ? + selector : + jQuery.makeArray(selector)); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.3.2", + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num === undefined ? + + // Return a 'clean' array + Array.prototype.slice.call( this ) : + + // Return just the object + this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = jQuery( elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) + ret.selector = this.selector + (this.selector ? " " : "") + selector; + else if ( name ) + ret.selector = this.selector + "." + name + "(" + selector + ")"; + + // Return the newly-formed element set + return ret; + }, + + // Force the current matched set of elements to become + // the specified array of elements (destroying the stack in the process) + // You should use pushStack() in order to do this, but maintain the stack + setArray: function( elems ) { + // Resetting the length to 0, then using the native Array push + // is a super-fast way to populate an object with array-like properties + this.length = 0; + Array.prototype.push.apply( this, elems ); + + return this; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem && elem.jquery ? elem[0] : elem + , this ); + }, + + attr: function( name, value, type ) { + var options = name; + + // Look for the case where we're accessing a style value + if ( typeof name === "string" ) + if ( value === undefined ) + return this[0] && jQuery[ type || "attr" ]( this[0], name ); + + else { + options = {}; + options[ name ] = value; + } + + // Check to see if we're setting style values + return this.each(function(i){ + // Set all the styles + for ( name in options ) + jQuery.attr( + type ? + this.style : + this, + name, jQuery.prop( this, options[ name ], type, i, name ) + ); + }); + }, + + css: function( key, value ) { + // ignore negative width and height values + if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 ) + value = undefined; + return this.attr( key, value, "curCSS" ); + }, + + text: function( text ) { + if ( typeof text !== "object" && text != null ) + return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); + + var ret = ""; + + jQuery.each( text || this, function(){ + jQuery.each( this.childNodes, function(){ + if ( this.nodeType != 8 ) + ret += this.nodeType != 1 ? + this.nodeValue : + jQuery.fn.text( [ this ] ); + }); + }); + + return ret; + }, + + wrapAll: function( html ) { + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).clone(); + + if ( this[0].parentNode ) + wrap.insertBefore( this[0] ); + + wrap.map(function(){ + var elem = this; + + while ( elem.firstChild ) + elem = elem.firstChild; + + return elem; + }).append(this); + } + + return this; + }, + + wrapInner: function( html ) { + return this.each(function(){ + jQuery( this ).contents().wrapAll( html ); + }); + }, + + wrap: function( html ) { + return this.each(function(){ + jQuery( this ).wrapAll( html ); + }); + }, + + append: function() { + return this.domManip(arguments, true, function(elem){ + if (this.nodeType == 1) + this.appendChild( elem ); + }); + }, + + prepend: function() { + return this.domManip(arguments, true, function(elem){ + if (this.nodeType == 1) + this.insertBefore( elem, this.firstChild ); + }); + }, + + before: function() { + return this.domManip(arguments, false, function(elem){ + this.parentNode.insertBefore( elem, this ); + }); + }, + + after: function() { + return this.domManip(arguments, false, function(elem){ + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + }, + + end: function() { + return this.prevObject || jQuery( [] ); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: [].push, + sort: [].sort, + splice: [].splice, + + find: function( selector ) { + if ( this.length === 1 ) { + var ret = this.pushStack( [], "find", selector ); + ret.length = 0; + jQuery.find( selector, this[0], ret ); + return ret; + } else { + return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){ + return jQuery.find( selector, elem ); + })), "find", selector ); + } + }, + + clone: function( events ) { + // Do the clone + var ret = this.map(function(){ + if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) { + // IE copies events bound via attachEvent when + // using cloneNode. Calling detachEvent on the + // clone will also remove the events from the orignal + // In order to get around this, we use innerHTML. + // Unfortunately, this means some modifications to + // attributes in IE that are actually only stored + // as properties will not be copied (such as the + // the name attribute on an input). + var html = this.outerHTML; + if ( !html ) { + var div = this.ownerDocument.createElement("div"); + div.appendChild( this.cloneNode(true) ); + html = div.innerHTML; + } + + return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0]; + } else + return this.cloneNode(true); + }); + + // Copy the events from the original to the clone + if ( events === true ) { + var orig = this.find("*").andSelf(), i = 0; + + ret.find("*").andSelf().each(function(){ + if ( this.nodeName !== orig[i].nodeName ) + return; + + var events = jQuery.data( orig[i], "events" ); + + for ( var type in events ) { + for ( var handler in events[ type ] ) { + jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data ); + } + } + + i++; + }); + } + + // Return the cloned set + return ret; + }, + + filter: function( selector ) { + return this.pushStack( + jQuery.isFunction( selector ) && + jQuery.grep(this, function(elem, i){ + return selector.call( elem, i ); + }) || + + jQuery.multiFilter( selector, jQuery.grep(this, function(elem){ + return elem.nodeType === 1; + }) ), "filter", selector ); + }, + + closest: function( selector ) { + var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null, + closer = 0; + + return this.map(function(){ + var cur = this; + while ( cur && cur.ownerDocument ) { + if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) { + jQuery.data(cur, "closest", closer); + return cur; + } + cur = cur.parentNode; + closer++; + } + }); + }, + + not: function( selector ) { + if ( typeof selector === "string" ) + // test special case where just one selector is passed in + if ( isSimple.test( selector ) ) + return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector ); + else + selector = jQuery.multiFilter( selector, this ); + + var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType; + return this.filter(function() { + return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector; + }); + }, + + add: function( selector ) { + return this.pushStack( jQuery.unique( jQuery.merge( + this.get(), + typeof selector === "string" ? + jQuery( selector ) : + jQuery.makeArray( selector ) + ))); + }, + + is: function( selector ) { + return !!selector && jQuery.multiFilter( selector, this ).length > 0; + }, + + hasClass: function( selector ) { + return !!selector && this.is( "." + selector ); + }, + + val: function( value ) { + if ( value === undefined ) { + var elem = this[0]; + + if ( elem ) { + if( jQuery.nodeName( elem, 'option' ) ) + return (elem.attributes.value || {}).specified ? elem.value : elem.text; + + // We need to handle select boxes special + if ( jQuery.nodeName( elem, "select" ) ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type == "select-one"; + + // Nothing was selected + if ( index < 0 ) + return null; + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + if ( option.selected ) { + // Get the specifc value for the option + value = jQuery(option).val(); + + // We don't need an array for one selects + if ( one ) + return value; + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + } + + // Everything else, we just grab the value + return (elem.value || "").replace(/\r/g, ""); + + } + + return undefined; + } + + if ( typeof value === "number" ) + value += ''; + + return this.each(function(){ + if ( this.nodeType != 1 ) + return; + + if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) ) + this.checked = (jQuery.inArray(this.value, value) >= 0 || + jQuery.inArray(this.name, value) >= 0); + + else if ( jQuery.nodeName( this, "select" ) ) { + var values = jQuery.makeArray(value); + + jQuery( "option", this ).each(function(){ + this.selected = (jQuery.inArray( this.value, values ) >= 0 || + jQuery.inArray( this.text, values ) >= 0); + }); + + if ( !values.length ) + this.selectedIndex = -1; + + } else + this.value = value; + }); + }, + + html: function( value ) { + return value === undefined ? + (this[0] ? + this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") : + null) : + this.empty().append( value ); + }, + + replaceWith: function( value ) { + return this.after( value ).remove(); + }, + + eq: function( i ) { + return this.slice( i, +i + 1 ); + }, + + slice: function() { + return this.pushStack( Array.prototype.slice.apply( this, arguments ), + "slice", Array.prototype.slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function(elem, i){ + return callback.call( elem, i, elem ); + })); + }, + + andSelf: function() { + return this.add( this.prevObject ); + }, + + domManip: function( args, table, callback ) { + if ( this[0] ) { + var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(), + scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ), + first = fragment.firstChild; + + if ( first ) + for ( var i = 0, l = this.length; i < l; i++ ) + callback.call( root(this[i], first), this.length > 1 || i > 0 ? + fragment.cloneNode(true) : fragment ); + + if ( scripts ) + jQuery.each( scripts, evalScript ); + } + + return this; + + function root( elem, cur ) { + return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ? + (elem.getElementsByTagName("tbody")[0] || + elem.appendChild(elem.ownerDocument.createElement("tbody"))) : + elem; + } + } +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +function evalScript( i, elem ) { + if ( elem.src ) + jQuery.ajax({ + url: elem.src, + async: false, + dataType: "script" + }); + + else + jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); + + if ( elem.parentNode ) + elem.parentNode.removeChild( elem ); +} + +function now(){ + return +new Date; +} + +jQuery.extend = jQuery.fn.extend = function() { + // copy reference to target object + var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) + target = {}; + + // extend jQuery itself if only one argument is passed + if ( length == i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) + // Extend the base object + for ( var name in options ) { + var src = target[ name ], copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) + continue; + + // Recurse if we're merging object values + if ( deep && copy && typeof copy === "object" && !copy.nodeType ) + target[ name ] = jQuery.extend( deep, + // Never move original objects, clone them + src || ( copy.length != null ? [ ] : { } ) + , copy ); + + // Don't bring in undefined values + else if ( copy !== undefined ) + target[ name ] = copy; + + } + + // Return the modified object + return target; +}; + +// exclude the following css properties to add px +var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, + // cache defaultView + defaultView = document.defaultView || {}, + toString = Object.prototype.toString; + +jQuery.extend({ + noConflict: function( deep ) { + window.$ = _$; + + if ( deep ) + window.jQuery = _jQuery; + + return jQuery; + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return toString.call(obj) === "[object Function]"; + }, + + isArray: function( obj ) { + return toString.call(obj) === "[object Array]"; + }, + + // check if an element is in a (or is an) XML document + isXMLDoc: function( elem ) { + return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || + !!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument ); + }, + + // Evalulates a script in a global context + globalEval: function( data ) { + if ( data && /\S/.test(data) ) { + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.getElementsByTagName("head")[0] || document.documentElement, + script = document.createElement("script"); + + script.type = "text/javascript"; + if ( jQuery.support.scriptEval ) + script.appendChild( document.createTextNode( data ) ); + else + script.text = data; + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709). + head.insertBefore( script, head.firstChild ); + head.removeChild( script ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, length = object.length; + + if ( args ) { + if ( length === undefined ) { + for ( name in object ) + if ( callback.apply( object[ name ], args ) === false ) + break; + } else + for ( ; i < length; ) + if ( callback.apply( object[ i++ ], args ) === false ) + break; + + // A special, fast, case for the most common use of each + } else { + if ( length === undefined ) { + for ( name in object ) + if ( callback.call( object[ name ], name, object[ name ] ) === false ) + break; + } else + for ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} + } + + return object; + }, + + prop: function( elem, value, type, i, name ) { + // Handle executable functions + if ( jQuery.isFunction( value ) ) + value = value.call( elem, i ); + + // Handle passing in a number to a CSS property + return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ? + value + "px" : + value; + }, + + className: { + // internal only, use addClass("class") + add: function( elem, classNames ) { + jQuery.each((classNames || "").split(/\s+/), function(i, className){ + if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) ) + elem.className += (elem.className ? " " : "") + className; + }); + }, + + // internal only, use removeClass("class") + remove: function( elem, classNames ) { + if (elem.nodeType == 1) + elem.className = classNames !== undefined ? + jQuery.grep(elem.className.split(/\s+/), function(className){ + return !jQuery.className.has( classNames, className ); + }).join(" ") : + ""; + }, + + // internal only, use hasClass("class") + has: function( elem, className ) { + return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1; + } + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + var old = {}; + // Remember the old values, and insert the new ones + for ( var name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + callback.call( elem ); + + // Revert the old values + for ( var name in options ) + elem.style[ name ] = old[ name ]; + }, + + css: function( elem, name, force, extra ) { + if ( name == "width" || name == "height" ) { + var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; + + function getWH() { + val = name == "width" ? elem.offsetWidth : elem.offsetHeight; + + if ( extra === "border" ) + return; + + jQuery.each( which, function() { + if ( !extra ) + val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; + if ( extra === "margin" ) + val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0; + else + val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; + }); + } + + if ( elem.offsetWidth !== 0 ) + getWH(); + else + jQuery.swap( elem, props, getWH ); + + return Math.max(0, Math.round(val)); + } + + return jQuery.curCSS( elem, name, force ); + }, + + curCSS: function( elem, name, force ) { + var ret, style = elem.style; + + // We need to handle opacity special in IE + if ( name == "opacity" && !jQuery.support.opacity ) { + ret = jQuery.attr( style, "opacity" ); + + return ret == "" ? + "1" : + ret; + } + + // Make sure we're using the right name for getting the float value + if ( name.match( /float/i ) ) + name = styleFloat; + + if ( !force && style && style[ name ] ) + ret = style[ name ]; + + else if ( defaultView.getComputedStyle ) { + + // Only "float" is needed here + if ( name.match( /float/i ) ) + name = "float"; + + name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); + try{ + var computedStyle = defaultView.getComputedStyle( elem, null ); + }catch(e){ + // Error in getting computedStyle + } + if ( computedStyle ) + ret = computedStyle.getPropertyValue( name ); + + // We should always get a number back from opacity + if ( name == "opacity" && ret == "" ) + ret = "1"; + + } else if ( elem.currentStyle ) { + var camelCase = name.replace(/\-(\w)/g, function(all, letter){ + return letter.toUpperCase(); + }); + + ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) { + // Remember the original values + var left = style.left, rsLeft = elem.runtimeStyle.left; + + // Put in the new values to get a computed value out + elem.runtimeStyle.left = elem.currentStyle.left; + style.left = ret || 0; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + elem.runtimeStyle.left = rsLeft; + } + } + + return ret; + }, + + clean: function( elems, context, fragment ) { + context = context || document; + + // !context.createElement fails in IE with an error but returns typeof 'object' + if ( typeof context.createElement === "undefined" ) + context = context.ownerDocument || context[0] && context[0].ownerDocument || document; + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) { + var match = /^<(\w+)\s*\/?>$/.exec(elems[0]); + if ( match ) + return [ context.createElement( match[1] ) ]; + } + + var ret = [], scripts = [], div = context.createElement("div"); + + jQuery.each(elems, function(i, elem){ + if ( typeof elem === "number" ) + elem += ''; + + if ( !elem ) + return; + + // Convert html string into DOM nodes + if ( typeof elem === "string" ) { + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){ + return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? + all : + front + ">"; + }); + + // Trim whitespace, otherwise indexOf won't work as expected + var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase(); + + var wrap = + // option or optgroup + !tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && + [ 1, "", "
    " ] || + + !tags.indexOf("", "" ] || + + // matched above + (!tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + // IE can't serialize and \ No newline at end of file diff --git a/skins/vector/cssjanus/COPYING b/skins/vector/cssjanus/COPYING new file mode 100644 index 0000000..3f2c895 --- /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 0000000..d645695 --- /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 0000000..9b92215 --- /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 ` + +==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 100755 index 0000000..dd14bd5 --- /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'(?)*?{)' % + (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 100755 index 0000000..1fc7304 --- /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 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 0000000..ce6f67d --- /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 0000000..227e197 --- /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 0000000..d2dabf7 --- /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 0000000..735324e Binary files /dev/null and b/skins/vector/experiments/images/new-border.png 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 0000000..cd8f3b1 Binary files /dev/null and b/skins/vector/experiments/images/new-portal-break-ltr.png 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 0000000..45c5b2f Binary files /dev/null and b/skins/vector/experiments/images/new-portal-break-rtl.png 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 0000000..dc63182 Binary files /dev/null and b/skins/vector/experiments/images/page-base-fade.png 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 0000000..54ffeb0 Binary files /dev/null and b/skins/vector/experiments/images/page-base-updated.png 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 0000000..e4c39c4 Binary files /dev/null and b/skins/vector/experiments/images/tab-active-first.png 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 0000000..a96f391 Binary files /dev/null and b/skins/vector/experiments/images/tab-active-last.png differ diff --git a/skins/vector/experiments/images/tab-fade.png b/skins/vector/experiments/images/tab-fade.png new file mode 100644 index 0000000..1eb0e23 Binary files /dev/null and b/skins/vector/experiments/images/tab-fade.png differ diff --git a/skins/vector/experiments/images/tab-first.png b/skins/vector/experiments/images/tab-first.png new file mode 100644 index 0000000..439b713 Binary files /dev/null and b/skins/vector/experiments/images/tab-first.png differ diff --git a/skins/vector/experiments/images/tab-last.png b/skins/vector/experiments/images/tab-last.png new file mode 100644 index 0000000..08e283d Binary files /dev/null and b/skins/vector/experiments/images/tab-last.png 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 0000000..4492550 Binary files /dev/null and b/skins/vector/experiments/images/tab-new-fade.png differ diff --git a/skins/vector/experiments/new-tabs.css b/skins/vector/experiments/new-tabs.css new file mode 100644 index 0000000..e3850e8 --- /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 0000000..bf2d4fb Binary files /dev/null and b/skins/vector/images/arrow-down-icon.png differ diff --git a/skins/vector/images/audio-icon.png b/skins/vector/images/audio-icon.png new file mode 100644 index 0000000..0f59a2b Binary files /dev/null and b/skins/vector/images/audio-icon.png differ diff --git a/skins/vector/images/border.png b/skins/vector/images/border.png new file mode 100644 index 0000000..54b4792 Binary files /dev/null and b/skins/vector/images/border.png differ diff --git a/skins/vector/images/bullet-icon.png b/skins/vector/images/bullet-icon.png new file mode 100644 index 0000000..e304b26 Binary files /dev/null and b/skins/vector/images/bullet-icon.png differ diff --git a/skins/vector/images/document-icon.png b/skins/vector/images/document-icon.png new file mode 100644 index 0000000..91dc16f Binary files /dev/null and b/skins/vector/images/document-icon.png differ diff --git a/skins/vector/images/edit-icon.png b/skins/vector/images/edit-icon.png new file mode 100644 index 0000000..4a96276 Binary files /dev/null and b/skins/vector/images/edit-icon.png 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 0000000..4b710b0 Binary files /dev/null and b/skins/vector/images/external-link-ltr-icon.png 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 0000000..17df03a Binary files /dev/null and b/skins/vector/images/external-link-rtl-icon.png differ diff --git a/skins/vector/images/file-icon.png b/skins/vector/images/file-icon.png new file mode 100644 index 0000000..1261f00 Binary files /dev/null and b/skins/vector/images/file-icon.png differ diff --git a/skins/vector/images/link-icon.png b/skins/vector/images/link-icon.png new file mode 100644 index 0000000..fc77e81 Binary files /dev/null and b/skins/vector/images/link-icon.png differ diff --git a/skins/vector/images/lock-icon.png b/skins/vector/images/lock-icon.png new file mode 100644 index 0000000..9e63807 Binary files /dev/null and b/skins/vector/images/lock-icon.png differ diff --git a/skins/vector/images/magnify-clip.png b/skins/vector/images/magnify-clip.png new file mode 100644 index 0000000..00a9cee Binary files /dev/null and b/skins/vector/images/magnify-clip.png differ diff --git a/skins/vector/images/mail-icon.png b/skins/vector/images/mail-icon.png new file mode 100644 index 0000000..50de078 Binary files /dev/null and b/skins/vector/images/mail-icon.png differ diff --git a/skins/vector/images/news-icon.png b/skins/vector/images/news-icon.png new file mode 100644 index 0000000..8ab4995 Binary files /dev/null and b/skins/vector/images/news-icon.png differ diff --git a/skins/vector/images/page-base.png b/skins/vector/images/page-base.png new file mode 100644 index 0000000..17d02a7 Binary files /dev/null and b/skins/vector/images/page-base.png differ diff --git a/skins/vector/images/page-fade.png b/skins/vector/images/page-fade.png new file mode 100644 index 0000000..815a048 Binary files /dev/null and b/skins/vector/images/page-fade.png differ diff --git a/skins/vector/images/portal-break-ltr.png b/skins/vector/images/portal-break-ltr.png new file mode 100644 index 0000000..c182370 Binary files /dev/null and b/skins/vector/images/portal-break-ltr.png differ diff --git a/skins/vector/images/portal-break-rtl.png b/skins/vector/images/portal-break-rtl.png new file mode 100644 index 0000000..a45144c Binary files /dev/null and b/skins/vector/images/portal-break-rtl.png differ diff --git a/skins/vector/images/portal-break.png b/skins/vector/images/portal-break.png new file mode 100644 index 0000000..e81b559 Binary files /dev/null and b/skins/vector/images/portal-break.png differ diff --git a/skins/vector/images/preferences-base.png b/skins/vector/images/preferences-base.png new file mode 100644 index 0000000..adfd70d Binary files /dev/null and b/skins/vector/images/preferences-base.png differ diff --git a/skins/vector/images/preferences-break.png b/skins/vector/images/preferences-break.png new file mode 100644 index 0000000..6c5c68c Binary files /dev/null and b/skins/vector/images/preferences-break.png differ diff --git a/skins/vector/images/preferences-edge.png b/skins/vector/images/preferences-edge.png new file mode 100644 index 0000000..3da0d09 Binary files /dev/null and b/skins/vector/images/preferences-edge.png differ diff --git a/skins/vector/images/preferences-fade.png b/skins/vector/images/preferences-fade.png new file mode 100644 index 0000000..b4773c5 Binary files /dev/null and b/skins/vector/images/preferences-fade.png differ diff --git a/skins/vector/images/search-fade.png b/skins/vector/images/search-fade.png new file mode 100644 index 0000000..53461d6 Binary files /dev/null and b/skins/vector/images/search-fade.png differ diff --git a/skins/vector/images/search-ltr.png b/skins/vector/images/search-ltr.png new file mode 100644 index 0000000..1db2eb2 Binary files /dev/null and b/skins/vector/images/search-ltr.png differ diff --git a/skins/vector/images/search-rtl.png b/skins/vector/images/search-rtl.png new file mode 100644 index 0000000..c26c8d0 Binary files /dev/null and b/skins/vector/images/search-rtl.png differ diff --git a/skins/vector/images/tab-break.png b/skins/vector/images/tab-break.png new file mode 100644 index 0000000..8115556 Binary files /dev/null and b/skins/vector/images/tab-break.png differ diff --git a/skins/vector/images/tab-current-fade.png b/skins/vector/images/tab-current-fade.png new file mode 100644 index 0000000..c6238d2 Binary files /dev/null and b/skins/vector/images/tab-current-fade.png differ diff --git a/skins/vector/images/tab-normal-fade.png b/skins/vector/images/tab-normal-fade.png new file mode 100644 index 0000000..4a5e3e4 Binary files /dev/null and b/skins/vector/images/tab-normal-fade.png differ diff --git a/skins/vector/images/talk-icon.png b/skins/vector/images/talk-icon.png new file mode 100644 index 0000000..0b80ee9 Binary files /dev/null and b/skins/vector/images/talk-icon.png differ diff --git a/skins/vector/images/user-icon.png b/skins/vector/images/user-icon.png new file mode 100644 index 0000000..ac3d59d Binary files /dev/null and b/skins/vector/images/user-icon.png differ diff --git a/skins/vector/images/video-icon.png b/skins/vector/images/video-icon.png new file mode 100644 index 0000000..5e7f4af Binary files /dev/null and b/skins/vector/images/video-icon.png differ diff --git a/skins/vector/images/watch-icon-loading.gif b/skins/vector/images/watch-icon-loading.gif new file mode 100644 index 0000000..618c308 Binary files /dev/null and b/skins/vector/images/watch-icon-loading.gif differ diff --git a/skins/vector/images/watch-icons.png b/skins/vector/images/watch-icons.png new file mode 100644 index 0000000..54b2c79 Binary files /dev/null and b/skins/vector/images/watch-icons.png differ diff --git a/skins/vector/main-ltr.css b/skins/vector/main-ltr.css new file mode 100644 index 0000000..78dd1e2 --- /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

    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 0000000..5387289 --- /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

    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 0000000..189a2ae Binary files /dev/null and b/skins/vector/wiki-indexed.png differ diff --git a/skins/vector/wiki.png b/skins/vector/wiki.png new file mode 100644 index 0000000..2463b52 Binary files /dev/null and b/skins/vector/wiki.png differ -- cgit v1.2.1