diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..8ec4b92
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+node_modules/
+vendor/
+composer.lock
diff --git a/.gitreview b/.gitreview
new file mode 100644
index 0000000..5d3f375
--- /dev/null
+++ b/.gitreview
@@ -0,0 +1,6 @@
+[gerrit]
+host=gerrit.wikimedia.org
+port=29418
+project=mediawiki/skins/Example.git
+track=1
+defaultrebase=0
diff --git a/.phpcs.xml b/.phpcs.xml
new file mode 100644
index 0000000..d222096
--- /dev/null
+++ b/.phpcs.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+ .
+
+
+
diff --git a/.stylelintrc.json b/.stylelintrc.json
new file mode 100644
index 0000000..b681cd2
--- /dev/null
+++ b/.stylelintrc.json
@@ -0,0 +1,6 @@
+{
+ "extends": "stylelint-config-wikimedia",
+ "rules": {
+ "selector-max-id": null
+ }
+}
diff --git a/BootstrapMediaWiki.skin.php b/BootstrapMediaWiki.skin.php
deleted file mode 100644
index 17fe226..0000000
--- a/BootstrapMediaWiki.skin.php
+++ /dev/null
@@ -1,489 +0,0 @@
-
- * @Copyright Matthew Batchelder 2012 - http://borkweb.com/
- * @License: GPLv2 (http://www.gnu.org/copyleft/gpl.html)
- */
-
-if ( ! defined( 'MEDIAWIKI' ) ) {
- die( -1 );
-}//end if
-
-//File removed on new mediawiki versions (1.24.1 at least).
-//require_once('includes/SkinTemplate.php');
-
-if(file_exists('includes/SkinTemplate.php')){
- require_once('includes/SkinTemplate.php');
-}
-
-/**
- * Inherit main code from SkinTemplate, set the CSS and template filter.
- * @package MediaWiki
- * @subpackage Skins
- */
-class SkinBootstrapMediaWiki extends SkinTemplate {
- /** Using Bootstrap */
- public $skinname = 'bootstrap-mediawiki';
- public $stylename = 'bootstrap-mediawiki';
- public $template = 'BootstrapMediaWikiTemplate';
- public $useHeadElement = true;
-
- /**
- * initialize the page
- */
- public function initPage( OutputPage $out ) {
- global $wgSiteJS;
- parent::initPage( $out );
- $out->addModuleScripts( 'skins.bootstrapmediawiki' );
- $out->addMeta( 'viewport', 'width=device-width, initial-scale=1, maximum-scale=1' );
- }//end initPage
-
- /**
- * prepares the skin's CSS
- */
- public function setupSkinUserCss( OutputPage $out ) {
- global $wgSiteCSS;
-
- parent::setupSkinUserCss( $out );
-
- $out->addModuleStyles( 'skins.bootstrapmediawiki' );
-
- // we need to include this here so the file pathing is right
- $out->addStyle( 'bootstrap-mediawiki/font-awesome/css/font-awesome.min.css' );
- }//end setupSkinUserCss
-}
-
-/**
- * @package MediaWiki
- * @subpackage Skins
- */
-class BootstrapMediaWikiTemplate extends QuickTemplate {
- /**
- * @var Cached skin object
- */
- public $skin;
-
- /**
- * Template filter callback for Bootstrap 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
- */
- public function execute() {
- global $wgRequest, $wgUser, $wgSitename, $wgSitenameshort, $wgCopyrightLink, $wgCopyright, $wgBootstrap, $wgArticlePath, $wgGoogleAnalyticsID, $wgSiteCSS;
- global $wgEnableUploads;
- global $wgLogo;
- global $wgTOCLocation;
- global $wgNavBarClasses;
- global $wgSubnavBarClasses;
-
- $this->skin = $this->data['skin'];
- $action = $wgRequest->getText( 'action' );
- $url_prefix = str_replace( '$1', '', $wgArticlePath );
-
- // Suppress warnings to prevent notices about missing indexes in $this->data
- wfSuppressWarnings();
-
- $this->html('headelement');
- ?>
-
-
-
-
-
-
-
- -
- Home
-
- -
- Tools
-
-
- nav( $this->get_page_links( 'Bootstrap:TitleBar' ) ); ?>
-
- isLoggedIn() ) {
- if ( count( $this->data['personal_urls'] ) > 0 ) {
- $user_icon = '
)).'.jpg?s=20&r=g)
';
- $name = strtolower( $wgUser->getName() );
- $user_nav = $this->get_array_links( $this->data['personal_urls'], $user_icon . $name, 'user' );
- ?>
-
html('userlangattributes') ?> class="nav navbar-nav navbar-right">
-
-
- data['content_actions']) > 0 ) {
- $content_nav = $this->get_array_links( $this->data['content_actions'], 'Page', 'page' );
- ?>
-
-
-
-
-
-
-
-
- get_page_links('Bootstrap:Subnav') ) {
- ?>
-
-
- nav_select( $subnav_links );
-
- if ( trim( $subnav_select ) ) {
-
- ?>
-
-
-
- nav( $subnav_links ); ?>
-
-
-
-
-
-
-
-
-
-
-
- data['sitenotice'] ) { ?>html('sitenotice') ?>
- data['undelete'] ): ?>
-
- html( 'undelete' ) ?>
-
-
- data['newtalk'] ): ?>
-
- html( 'newtalk' ) ?>
-
-
-
-
-
-
- html( 'bodytext' ) ?>
-
-
- data['catlinks'] ): ?>
-
-
- html( 'catlinks' ); ?>
-
-
-
- data['dataAfterContent'] ): ?>
-
-
- html( 'dataAfterContent' ); ?>
-
-
-
-
-
-
-
-
-
-
- includePage('Bootstrap:Footer'); ?>
-
-
-
-
- html('bottomscripts'); /* JS call to runBodyOnloadHook */
- $this->html('reporttime');
-
- if ( $this->data['debug'] ) {
- ?>
-
-
-