mirror of
https://github.com/StarCitizenTools/mediawiki-skins-Citizen.git
synced 2024-11-27 15:50:34 +00:00
Merge pull request #163 from StarCitizenTools/dev
Various improvement and bug fixes
This commit is contained in:
commit
596423753f
176
README.md
176
README.md
|
@ -1,88 +1,88 @@
|
||||||
# Citizen
|
# Citizen
|
||||||
![](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/workflows/MediaWiki%20CI/badge.svg)
|
![](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/workflows/MediaWiki%20CI/badge.svg)
|
||||||
|
|
||||||
Citizen is a responsive skin for [MediaWiki](https://www.mediawiki.org) built by the [Star Citizen Wiki](https://starcitizen.tools) team. Although it is specifically built for the Star Citizen Wiki, the skin should be able to run on any Mediawiki installation that is 1.31 or higher. Due to resource constraints, we might not be able to provide full support for setups that are vastly different than us, but please feel free to submit patches or bug report!
|
Citizen is a responsive skin for [MediaWiki](https://www.mediawiki.org) built by the [Star Citizen Wiki](https://starcitizen.tools) team. Although it is specifically built for the Star Citizen Wiki, the skin should be able to run on any Mediawiki installation that is 1.31 or higher. Due to resource constraints, we might not be able to provide full support for setups that are vastly different than us, but please feel free to submit patches or bug report!
|
||||||
|
|
||||||
Live demo can be seen at the [Star Citizen Wiki](https://starcitizen.tools), more avaliable [here](https://wikiapiary.com/wiki/Skin:Citizen).
|
Live demo can be seen at the [Star Citizen Wiki](https://starcitizen.tools), more avaliable [here](https://wikiapiary.com/wiki/Skin:Citizen).
|
||||||
|
|
||||||
## Notable features
|
## Notable features
|
||||||
* **Fully responsive skin**: Responsive and able to adapt to different screen sizes. 📱💻🖥️
|
* **Fully responsive skin**: Responsive and able to adapt to different screen sizes. 📱💻🖥️
|
||||||
* **Persistent ToC**: Access ToC anywhere in the article. ***Tracking require JS.*** 🔍📖
|
* **Persistent ToC**: Access ToC anywhere in the article. ***Tracking require JS.*** 🔍📖
|
||||||
* **Rich search suggestions**: More helpful search suggestions with images and descriptions. ***Require JS.*** 🔍👀
|
* **Rich search suggestions**: More helpful search suggestions with images and descriptions. ***Require JS.*** 🔍👀
|
||||||
* **Lazyload images**: Improve load time of your wiki and avoid unnessecary image downloads. ***Require JS.*** 🚀
|
* **Lazyload images**: Improve load time of your wiki and avoid unnecessary image downloads. ***Require JS.*** 🚀
|
||||||
* **Native light/dark mode support**: Respect OS and app configuration for light and dark mode. ☀️🌙
|
* **Native light/dark mode support**: Respect OS and app configuration for light and dark mode. ☀️🌙
|
||||||
* **Webapp manifest**: Give a more app-like experience when user add your wiki to their home screen. 📱
|
* **Webapp manifest**: Give a more app-like experience when user add your wiki to their home screen. 📱
|
||||||
* **HTTP security response headers**: Enhance the security of your wiki from HTTP response headers. 🔒🔑
|
* **HTTP security response headers**: Enhance the security of your wiki from HTTP response headers. 🔒🔑
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
1. [Download](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/archive/master.zip) place the file(s) in a directory called `Citizen` in your `skins/` folder.
|
1. [Download](https://github.com/StarCitizenTools/mediawiki-skins-Citizen/archive/master.zip) place the file(s) in a directory called `Citizen` in your `skins/` folder.
|
||||||
2. Add the following code at the bottom of your LocalSettings.php:
|
2. Add the following code at the bottom of your LocalSettings.php:
|
||||||
```php
|
```php
|
||||||
wfLoadSkin( 'Citizen' );
|
wfLoadSkin( 'Citizen' );
|
||||||
```
|
```
|
||||||
3. **✔️Done** - Navigate to Special:Version on your wiki to verify that the skin is successfully installed.
|
3. **✔️Done** - Navigate to Special:Version on your wiki to verify that the skin is successfully installed.
|
||||||
|
|
||||||
## Configurations
|
## Configurations
|
||||||
**The skin works out of the box without any configurations.**
|
**The skin works out of the box without any configurations.**
|
||||||
The config flags allow more customization on the specific features in the skin.
|
The config flags allow more customization on the specific features in the skin.
|
||||||
|
|
||||||
Note that:
|
Note that:
|
||||||
* By default all security-related features are turned off to ensure maximum compatiability.
|
* By default, all security-related features are turned off to ensure maximum compatibility.
|
||||||
* If you have a lot of users that does not use javascript, it is recommended to turn off image lazyload as it requires javascript to display images properly.
|
* If you have a lot of users that do not use javascript, it is recommended to turn off lazyloading of images as it requires javascript to display images properly.
|
||||||
|
|
||||||
### Search suggestions
|
### Search suggestions
|
||||||
Name | Description | Values | Default
|
Name | Description | Values | Default
|
||||||
:--- | :--- | :--- | :---
|
:--- | :--- | :--- | :---
|
||||||
`$wgCitizenEnableSearch` | Enable or disable rich search suggestions |`true` - enable; `false` - disable | `true`
|
`$wgCitizenEnableSearch` | Enable or disable rich search suggestions |`true` - enable; `false` - disable | `true`
|
||||||
`$wgCitizenSearchDescriptionSource` | Source of description text on search suggestions | `wikidata` - Use description provided by [WikibaseLib](Extension:WikibaseLib) or [ShortDescription](https://www.mediawiki.org/wiki/Extension:ShortDescription); `textextracts` - Use description provided by [TextExtracts](https://www.mediawiki.org/wiki/Extension:TextExtracts); `pagedescription` - Use description provided by [Description2](https://www.mediawiki.org/wiki/Extension:Description2) or any other extension that sets the `description` page property | `textextracts`
|
`$wgCitizenSearchDescriptionSource` | Source of description text on search suggestions | `wikidata` - Use description provided by [WikibaseLib](Extension:WikibaseLib) or [ShortDescription](https://www.mediawiki.org/wiki/Extension:ShortDescription); `textextracts` - Use description provided by [TextExtracts](https://www.mediawiki.org/wiki/Extension:TextExtracts); `pagedescription` - Use description provided by [Description2](https://www.mediawiki.org/wiki/Extension:Description2) or any other extension that sets the `description` page property | `textextracts`
|
||||||
`$wgCitizenMaxSearchResults` | Max number of search suggestions | Integer > 0 | `6`
|
`$wgCitizenMaxSearchResults` | Max number of search suggestions | Integer > 0 | `6`
|
||||||
|
|
||||||
### Image lazyload
|
### Image lazyload
|
||||||
Name | Description | Values | Default
|
Name | Description | Values | Default
|
||||||
:--- | :--- | :--- | :---
|
:--- | :--- | :--- | :---
|
||||||
`$wgCitizenEnableLazyload` | Enable or disable image lazyloading | `true` - enable; `false` - disable | `true`
|
`$wgCitizenEnableLazyload` | Enable or disable image lazyloading | `true` - enable; `false` - disable | `true`
|
||||||
`$wgCitizenThumbnailSize` | Thumbnail size in pixels to use for lazy-loading placeholder | Integer > 0 | `10`
|
`$wgCitizenThumbnailSize` | Thumbnail size in pixels to use for lazy-loading placeholder | Integer > 0 | `10`
|
||||||
|
|
||||||
### Security-related
|
### Security-related
|
||||||
#### Content Security Policy (CSP)
|
#### Content Security Policy (CSP)
|
||||||
Name | Description | Values | Default
|
Name | Description | Values | Default
|
||||||
:--- | :--- | :--- | :---
|
:--- | :--- | :--- | :---
|
||||||
`$wgCitizenEnableCSP` | Enable or disable [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy), as an alternative to [`$wgCSPHeader`](https://www.mediawiki.org/wiki/Manual:$wgCSPHeader) in Mediawiki 1.32+ | `true` - enable; `false` - disable | `false`
|
`$wgCitizenEnableCSP` | Enable or disable [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy), as an alternative to [`$wgCSPHeader`](https://www.mediawiki.org/wiki/Manual:$wgCSPHeader) in Mediawiki 1.32+ | `true` - enable; `false` - disable | `false`
|
||||||
`$wgCitizenEnableCSPReportMode` | Enable or disable [CSP report only mode](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only), overrides `$wgCitizenEnableCSP` | `true` - enable; `false` - disable | `false`
|
`$wgCitizenEnableCSPReportMode` | Enable or disable [CSP report only mode](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only), overrides `$wgCitizenEnableCSP` | `true` - enable; `false` - disable | `false`
|
||||||
`$wgCitizenCSPDirective` | The string of yourr CSP directive | See the [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy) page |
|
`$wgCitizenCSPDirective` | The string of yourr CSP directive | See the [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy) page |
|
||||||
|
|
||||||
#### HTTP Strict Transport Security (HSTS)
|
#### HTTP Strict Transport Security (HSTS)
|
||||||
Name | Description | Values | Default
|
Name | Description | Values | Default
|
||||||
:--- | :--- | :--- | :---
|
:--- | :--- | :--- | :---
|
||||||
`$wgCitizenEnableHSTS` | Enable or disable [HTTP Strict Transport Security](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security) | `true` - enable; `false` - disable | `false`
|
`$wgCitizenEnableHSTS` | Enable or disable [HTTP Strict Transport Security](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security) | `true` - enable; `false` - disable | `false`
|
||||||
`$wgCitizenHSTSMaxAge` | Time in second that the browser should remember that a site is only to be accessed using HTTPS | Integer > 0 | `300`
|
`$wgCitizenHSTSMaxAge` | Time in second that the browser should remember that a site is only to be accessed using HTTPS | Integer > 0 | `300`
|
||||||
`$wgCitizenHSTSIncludeSubdomains` | Apply HSTS to all of the site's subdomains | `true` - enable; `false` - disable | `false`
|
`$wgCitizenHSTSIncludeSubdomains` | Apply HSTS to all of the site's subdomains | `true` - enable; `false` - disable | `false`
|
||||||
`$wgCitizenHSTSPreload` | Enable or disable [HSTS preload](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security#Preloading_Strict_Transport_Security) | `true` - enable; `false` - disable | `false`
|
`$wgCitizenHSTSPreload` | Enable or disable [HSTS preload](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security#Preloading_Strict_Transport_Security) | `true` - enable; `false` - disable | `false`
|
||||||
|
|
||||||
#### Other security headers
|
#### Other security headers
|
||||||
Name | Description | Values | Default
|
Name | Description | Values | Default
|
||||||
:--- | :--- | :--- | :---
|
:--- | :--- | :--- | :---
|
||||||
`$wgCitizenEnableDenyXFrameOptions` | Enable or disable the deny [X-Frame-Options](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options) header | `true` - enable; `false` - disable | `false`
|
`$wgCitizenEnableDenyXFrameOptions` | Enable or disable the deny [X-Frame-Options](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options) header | `true` - enable; `false` - disable | `false`
|
||||||
`$wgCitizenEnableXXSSProtection` | Enable or disable the [X-XSS-Protection header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection) | `true` - enable; `false` - disable | `false`
|
`$wgCitizenEnableXXSSProtection` | Enable or disable the [X-XSS-Protection header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection) | `true` - enable; `false` - disable | `false`
|
||||||
`$wgCitizenEnableStrictReferrerPolicy` | Enable or disable `strict-origin-when-cross-origin` [referrer policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy) header, should be used in conjunction with [`$wgReferrerPolicy`](https://www.mediawiki.org/wiki/Manual:$wgReferrerPolicy) as that only outputs the meta tags | `true` - enable; `false` - disable | `false`
|
`$wgCitizenEnableStrictReferrerPolicy` | Enable or disable `strict-origin-when-cross-origin` [referrer policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy) header, should be used in conjunction with [`$wgReferrerPolicy`](https://www.mediawiki.org/wiki/Manual:$wgReferrerPolicy) as that only outputs the meta tags | `true` - enable; `false` - disable | `false`
|
||||||
`$wgCitizenEnableFeaturePolicy` | Enable or disable [Feature Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy) | `true` - enable; `false` - disable | `false`
|
`$wgCitizenEnableFeaturePolicy` | Enable or disable [Feature Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy) | `true` - enable; `false` - disable | `false`
|
||||||
`$wgCitizenFeaturePolicyDirective` | The string of your Feature Policy directive | See the [Feature Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy) page |
|
`$wgCitizenFeaturePolicyDirective` | The string of your Feature Policy directive | See the [Feature Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy) page |
|
||||||
|
|
||||||
### Webapp manifest
|
### Webapp manifest
|
||||||
Name | Description | Values | Default
|
Name | Description | Values | Default
|
||||||
:--- | :--- | :--- | :---
|
:--- | :--- | :--- | :---
|
||||||
`$wgCitizenEnableManifest` | Enable or disable [web app manifest](https://developer.mozilla.org/en-US/docs/Web/Manifest) | `true` - enable; `false` - disable | `true`
|
`$wgCitizenEnableManifest` | Enable or disable [web app manifest](https://developer.mozilla.org/en-US/docs/Web/Manifest) | `true` - enable; `false` - disable | `true`
|
||||||
`$wgCitizenManifestThemeColor` | [Theme color](https://developer.mozilla.org/en-US/docs/Web/Manifest/theme_color) of the web app manifest | Hex color code | `#11151d`
|
`$wgCitizenManifestThemeColor` | [Theme color](https://developer.mozilla.org/en-US/docs/Web/Manifest/theme_color) of the web app manifest | Hex color code | `#11151d`
|
||||||
`$wgCitizenManifestBackgroundColor` | [Background color](https://developer.mozilla.org/en-US/docs/Web/Manifest/background_color) of the web app manifest | Hex color code | `#fff`
|
`$wgCitizenManifestBackgroundColor` | [Background color](https://developer.mozilla.org/en-US/docs/Web/Manifest/background_color) of the web app manifest | Hex color code | `#fff`
|
||||||
|
|
||||||
### Miscellaneous
|
### Miscellaneous
|
||||||
Name | Description | Values | Default
|
Name | Description | Values | Default
|
||||||
:--- | :--- | :--- | :---
|
:--- | :--- | :--- | :---
|
||||||
`$wgCitizenShowPageTools` | The condition of page tools visibility | `true` - always visible; `login` - visible to logged-in users; `permission` - visible to users with the right permissions | `true`
|
`$wgCitizenShowPageTools` | The condition of page tools visibility | `true` - always visible; `login` - visible to logged-in users; `permission` - visible to users with the right permissions | `true`
|
||||||
`$wgCitizenEnablePreconnect` | Enable or disable [preconnect to required origin](https://web.dev/uses-rel-preconnect/) | `true` - enable; `false` - disable | `false`
|
`$wgCitizenEnablePreconnect` | Enable or disable [preconnect to required origin](https://web.dev/uses-rel-preconnect/) | `true` - enable; `false` - disable | `false`
|
||||||
`$wgCitizenPreconnectURL` | The URL for preconnect to required origin | URL |
|
`$wgCitizenPreconnectURL` | The URL for preconnect to required origin | URL |
|
||||||
`$wgCitizenThemeColor` | The color defined in the `theme-color` meta tag | Hex color code | `#11151d`
|
`$wgCitizenThemeColor` | The color defined in the `theme-color` meta tag | Hex color code | `#11151d`
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
* [MediaWiki](https://www.mediawiki.org) 1.31 or later
|
* [MediaWiki](https://www.mediawiki.org) 1.31 or later
|
||||||
|
|
||||||
|
|
|
@ -84,6 +84,7 @@ class CitizenHooks {
|
||||||
} catch ( ConfigException $e ) {
|
} catch ( ConfigException $e ) {
|
||||||
wfLogWarning( sprintf( 'Could not get config for "$wgThumbnailSize". Defaulting to "10". %s',
|
wfLogWarning( sprintf( 'Could not get config for "$wgThumbnailSize". Defaulting to "10". %s',
|
||||||
$e->getMessage() ) );
|
$e->getMessage() ) );
|
||||||
|
$lazyloadEnabled = true;
|
||||||
$thumbSize = 10;
|
$thumbSize = 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@ class CitizenTemplate extends BaseTemplate {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Outputs the entire contents of the page
|
* Outputs the entire contents of the page
|
||||||
|
* @throws MWException
|
||||||
*/
|
*/
|
||||||
public function execute() {
|
public function execute() {
|
||||||
// Naming conventions for Mustache parameters:
|
// Naming conventions for Mustache parameters:
|
||||||
|
@ -128,6 +129,8 @@ class CitizenTemplate extends BaseTemplate {
|
||||||
* Render the navigation drawer
|
* Render the navigation drawer
|
||||||
* Based on Vector (be3843e)
|
* Based on Vector (be3843e)
|
||||||
* @return array
|
* @return array
|
||||||
|
* @throws MWException
|
||||||
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
private function buildDrawer() : array {
|
private function buildDrawer() : array {
|
||||||
$skin = $this->getSkin();
|
$skin = $this->getSkin();
|
||||||
|
@ -156,7 +159,7 @@ class CitizenTemplate extends BaseTemplate {
|
||||||
// The language portal will be added provided either
|
// The language portal will be added provided either
|
||||||
// languages exist or there is a value in html-after-portal
|
// languages exist or there is a value in html-after-portal
|
||||||
// for example to show the add language wikidata link (T252800)
|
// for example to show the add language wikidata link (T252800)
|
||||||
if ( count( $languages ) || $portal['html-after-portal'] ) {
|
if ( $portal['html-after-portal'] || count( $languages ) ) {
|
||||||
$props[] = $portal;
|
$props[] = $portal;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -220,9 +223,10 @@ class CitizenTemplate extends BaseTemplate {
|
||||||
* TODO: Use standardize classes and IDs
|
* TODO: Use standardize classes and IDs
|
||||||
* TODO: Rebuild icon function based on Desktop Improvement Project
|
* TODO: Rebuild icon function based on Desktop Improvement Project
|
||||||
* @return array
|
* @return array
|
||||||
|
* @throws MWException
|
||||||
*/
|
*/
|
||||||
private function buildLogo() : array {
|
private function buildLogo() : array {
|
||||||
$props = [
|
return [
|
||||||
'msg-sitetitle' => $this->getMsg( 'sitetitle' )->text(),
|
'msg-sitetitle' => $this->getMsg( 'sitetitle' )->text(),
|
||||||
'html-mainpage-attributes' => Xml::expandAttributes(
|
'html-mainpage-attributes' => Xml::expandAttributes(
|
||||||
Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) + [
|
Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) + [
|
||||||
|
@ -230,14 +234,13 @@ class CitizenTemplate extends BaseTemplate {
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
return $props;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Echo notification badges and ULS button
|
* Echo notification badges and ULS button
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
private function getExtratools() {
|
private function getExtratools(): array {
|
||||||
$personalTools = $this->getPersonalTools();
|
$personalTools = $this->getPersonalTools();
|
||||||
|
|
||||||
// Create the Echo badges and ULS
|
// Create the Echo badges and ULS
|
||||||
|
@ -264,6 +267,7 @@ class CitizenTemplate extends BaseTemplate {
|
||||||
* Render the search box
|
* Render the search box
|
||||||
* TODO: Use standardized classes and IDs
|
* TODO: Use standardized classes and IDs
|
||||||
* @return array
|
* @return array
|
||||||
|
* @throws MWException
|
||||||
*/
|
*/
|
||||||
private function buildSearchbox() : array {
|
private function buildSearchbox() : array {
|
||||||
$config = $this->config;
|
$config = $this->config;
|
||||||
|
@ -271,7 +275,7 @@ class CitizenTemplate extends BaseTemplate {
|
||||||
$toggleMsg = $this->getMsg( 'citizen-search-toggle' )->text();
|
$toggleMsg = $this->getMsg( 'citizen-search-toggle' )->text();
|
||||||
$accessKey = Linker::accesskey( 'search' );
|
$accessKey = Linker::accesskey( 'search' );
|
||||||
|
|
||||||
$props = [
|
return [
|
||||||
'msg-citizen-search-toggle' => $toggleMsg,
|
'msg-citizen-search-toggle' => $toggleMsg,
|
||||||
'msg-citizen-search-toggle-shortcut' => $toggleMsg . ' [alt-shift-' . $accessKey . ']',
|
'msg-citizen-search-toggle-shortcut' => $toggleMsg . ' [alt-shift-' . $accessKey . ']',
|
||||||
'form-action' => $config->get( 'Script' ),
|
'form-action' => $config->get( 'Script' ),
|
||||||
|
@ -281,7 +285,6 @@ class CitizenTemplate extends BaseTemplate {
|
||||||
'html-random-href' => Skin::makeSpecialUrl( 'Randompage' ),
|
'html-random-href' => Skin::makeSpecialUrl( 'Randompage' ),
|
||||||
'msg-random' => $this->getMsg( 'Randompage' )->text(),
|
'msg-random' => $this->getMsg( 'Randompage' )->text(),
|
||||||
];
|
];
|
||||||
return $props;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -292,9 +295,9 @@ class CitizenTemplate extends BaseTemplate {
|
||||||
* * 'login': only visible if logged in (string)
|
* * 'login': only visible if logged in (string)
|
||||||
* * 'permission-*': only visible if user has permission
|
* * 'permission-*': only visible if user has permission
|
||||||
* e.g. permission-edit = only visible if user can edit pages
|
* e.g. permission-edit = only visible if user can edit pages
|
||||||
* @return string html
|
* @return array html
|
||||||
*/
|
*/
|
||||||
protected function buildPageTools() {
|
protected function buildPageTools(): array {
|
||||||
$config = $this->config;
|
$config = $this->config;
|
||||||
$skin = $this->getSkin();
|
$skin = $this->getSkin();
|
||||||
$condition = $config->get( 'CitizenShowPageTools' );
|
$condition = $config->get( 'CitizenShowPageTools' );
|
||||||
|
@ -341,7 +344,7 @@ class CitizenTemplate extends BaseTemplate {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Render page-related links at the bottom
|
* Render page-related links at the bottom
|
||||||
* @return string html
|
* @return array html
|
||||||
*/
|
*/
|
||||||
private function buildPageLinks() : array {
|
private function buildPageLinks() : array {
|
||||||
$contentNavigation = $this->data['content_navigation'];
|
$contentNavigation = $this->data['content_navigation'];
|
||||||
|
@ -357,12 +360,10 @@ class CitizenTemplate extends BaseTemplate {
|
||||||
$variantshtml[ 'label-class' ] .= 'screen-reader-text';
|
$variantshtml[ 'label-class' ] .= 'screen-reader-text';
|
||||||
}
|
}
|
||||||
|
|
||||||
$props = [
|
return [
|
||||||
'data-namespaces' => $namespaceshtml,
|
'data-namespaces' => $namespaceshtml,
|
||||||
'data-variants' => $variantshtml,
|
'data-variants' => $variantshtml,
|
||||||
];
|
];
|
||||||
|
|
||||||
return $props;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -373,11 +374,9 @@ class CitizenTemplate extends BaseTemplate {
|
||||||
$lastMod = null;
|
$lastMod = null;
|
||||||
$footerLinks = $this->getFooterLinks();
|
$footerLinks = $this->getFooterLinks();
|
||||||
|
|
||||||
if ( isset( $footerLinks['info'] ) ) {
|
if ( isset( $footerLinks['info'] ) && in_array( 'lastmod', $footerLinks['info'], true ) ) {
|
||||||
if ( in_array( 'lastmod', $footerLinks['info'] ) ) {
|
$key = array_search( 'lastmod', $footerLinks['info'], true );
|
||||||
$key = array_search( 'lastmod', $footerLinks['info'] );
|
$lastMod = $this->get( $footerLinks['info'][$key], '' );
|
||||||
$lastMod = $this->get( $footerLinks['info'][$key], '' );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $lastMod;
|
return $lastMod;
|
||||||
|
@ -502,7 +501,7 @@ class CitizenTemplate extends BaseTemplate {
|
||||||
$props['html-after-portal'] = $this->getAfterPortlet( $label );
|
$props['html-after-portal'] = $this->getAfterPortlet( $label );
|
||||||
|
|
||||||
// Mark the portal as empty if it has no content
|
// Mark the portal as empty if it has no content
|
||||||
$class = ( count( $urls ) == 0 && !$props['html-after-portal'] )
|
$class = ( count( $urls ) === 0 && !$props['html-after-portal'] )
|
||||||
? ' mw-portal-empty' : '';
|
? ' mw-portal-empty' : '';
|
||||||
$props['class'] = $class;
|
$props['class'] = $class;
|
||||||
return $props;
|
return $props;
|
||||||
|
|
|
@ -27,7 +27,7 @@ use ApiFormatJson;
|
||||||
use ApiResult;
|
use ApiResult;
|
||||||
use ConfigException;
|
use ConfigException;
|
||||||
use Exception;
|
use Exception;
|
||||||
use MWHttpRequest;
|
use MediaWiki\MediaWikiServices;
|
||||||
use Title;
|
use Title;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -83,7 +83,9 @@ class ApiWebappManifest extends ApiBase {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$request = MWHttpRequest::factory( $appleTouchIconUrl );
|
$request = MediaWikiServices::getInstance()
|
||||||
|
->getHttpRequestFactory()
|
||||||
|
->create( $appleTouchIconUrl );
|
||||||
$request->execute();
|
$request->execute();
|
||||||
$appleTouchIconContent = $request->getContent();
|
$appleTouchIconContent = $request->getContent();
|
||||||
|
|
||||||
|
|
|
@ -155,3 +155,31 @@
|
||||||
box-shadow: 0 19px 38px rgba( 0, 0, 0, 0.075 ), 0 15px 12px rgba( 0, 0, 0, 0.055 ); // Dialogs
|
box-shadow: 0 19px 38px rgba( 0, 0, 0, 0.075 ), 0 15px 12px rgba( 0, 0, 0, 0.055 ); // Dialogs
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Borrowed from Mediawiki core 1.35
|
||||||
|
// “Clearfix Reloaded” Mixin
|
||||||
|
// The mixin is used on a container with floating children.
|
||||||
|
// Margin collapsing is a feature, not a bug, hence relying on `display: block` as default.
|
||||||
|
// With `.mixin-clearfix( @collapse: false; );` you call it to let `margin`s not collapse.
|
||||||
|
// See https://www.cssmojo.com/the-very-latest-clearfix-reloaded/
|
||||||
|
// In future we might replace the `&:after` pseudo-element with
|
||||||
|
// `display: flow-root;` altogether.
|
||||||
|
// Support: Firefox 3.5+, Safari 4+, Chrome, Opera 15+, IE 8+
|
||||||
|
.mixin-clearfix( @collapse: true ) {
|
||||||
|
&:after {
|
||||||
|
clear: both;
|
||||||
|
// Margin collapsing as feature. Apply it.
|
||||||
|
& when ( @collapse ) {
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Margin collapsing as bug. Prevent it.
|
||||||
|
& when not ( @collapse ) {
|
||||||
|
&:before,
|
||||||
|
&:after {
|
||||||
|
content: '';
|
||||||
|
display: table;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -144,6 +144,7 @@
|
||||||
position: relative;
|
position: relative;
|
||||||
.content-center;
|
.content-center;
|
||||||
z-index: 0;
|
z-index: 0;
|
||||||
|
.mixin-clearfix();
|
||||||
|
|
||||||
p {
|
p {
|
||||||
overflow-wrap: break-word;
|
overflow-wrap: break-word;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "Citizen",
|
"name": "Citizen",
|
||||||
"namemsg": "skinname-citizen",
|
"namemsg": "skinname-citizen",
|
||||||
"version": "0.9.3",
|
"version": "0.9.4",
|
||||||
"author": [
|
"author": [
|
||||||
"[https://www.mediawiki.org/wiki/User:Alistair3149 Alistair3149]",
|
"[https://www.mediawiki.org/wiki/User:Alistair3149 Alistair3149]",
|
||||||
"[https://www.mediawiki.org/wiki/User:Octfx Octfx]"
|
"[https://www.mediawiki.org/wiki/User:Octfx Octfx]"
|
||||||
|
|
Loading…
Reference in a new issue