Skip to content

Commit

Permalink
Improve handling of overridedefault for MWN (#457)
Browse files Browse the repository at this point in the history
  • Loading branch information
The-Voidwalker authored May 21, 2024
1 parent 3f45ada commit 76790a9
Showing 1 changed file with 62 additions and 29 deletions.
91 changes: 62 additions & 29 deletions includes/Hooks.php
Original file line number Diff line number Diff line change
Expand Up @@ -122,40 +122,45 @@ public static function onCreateWikiJsonBuilder( string $wiki, DBConnRef $dbr, ar

$nsAdditional = (array)json_decode( $ns->ns_additional ?? '', true );

foreach ( $nsAdditional as $var => $val ) {
if ( isset( $additional[$var] ) ) {
if ( $val ) {
switch ( $additional[$var]['type'] ) {
case 'check':
$jsonArray['settings'][$var][] = (int)$ns->ns_namespace_id;
break;
case 'vestyle':
$jsonArray['settings'][$var][(int)$ns->ns_namespace_id] = true;
break;
default:
if ( ( $additional[$var]['constant'] ) ?? false ) {
$jsonArray['settings'][$var] = str_replace( ' ', '_', $val );
} else {
$jsonArray['settings'][$var][(int)$ns->ns_namespace_id] = $val;
}
}
} elseif (
!isset( $additional[$var]['constant'] ) &&
( !isset( $jsonArray['settings'][$var] ) || !$jsonArray['settings'][$var] )
) {
$jsonArray['settings'][$var] = [];
foreach ( $additional as $var => $conf ) {
// Select value if configured, otherwise fall back to overridedefault
if ( isset( $nsAdditional[$var] ) ) {
$val = $nsAdditional[$var];
} elseif ( is_array( $conf['overridedefault'] ) ) {
if ( array_key_exists( (int)$ns->ns_namespace_id, $conf['overridedefault'] ) ) {
$val = $conf['overridedefault'][(int)$ns->ns_namespace_id];
} elseif ( array_key_exists( 'default', $conf['overridedefault'] ) ) {
$val = $conf['overridedefault']['default'];
} else {
// TODO: throw error? this should probably not be allowed
$val = null;
}
} else {
$val = $conf['overridedefault'];
}

if (
is_array( $additional[$var]['overridedefault'] ) &&
in_array( NS_SPECIAL, $additional[$var]['overridedefault'] ) &&
!in_array( NS_SPECIAL, $jsonArray['settings'][$var] ?? [] )
) {
$jsonArray['settings'][$var][] = NS_SPECIAL;
}
if ( $val ) {
self::setNamespaceSettingJson( $jsonArray, (int)$ns->ns_namespace_id, $var, $val, $conf );
} elseif (
!isset( $conf['constant'] ) &&
( !isset( $jsonArray['settings'][$var] ) || !$jsonArray['settings'][$var] )
) {
$jsonArray['settings'][$var] = [];
}
}
}
// Search for and apply overridedefaults to NS_SPECIAL
// Notably, we do not apply 'default' overridedefault to NS_SPECIAL
// It must exist as it's own key in overridedefault
foreach ( $additional as $var => $conf ) {
if (
is_array( $conf['overridedefault'] ) &&
array_key_exists( NS_SPECIAL, $conf['overridedefault'] ) &&
$conf['overridedefault'][NS_SPECIAL]
) {
self::setNamespaceSettingJson( $jsonArray, NS_SPECIAL, $var, $conf['overridedefault'][NS_SPECIAL], $conf );
}
}
}

// Same as NS above but for permissions
Expand Down Expand Up @@ -227,6 +232,34 @@ public static function onCreateWikiJsonBuilder( string $wiki, DBConnRef $dbr, ar
}
}

/**
* Adds the namespace setting for the supplied variable
*
* @param array &$jsonArray array representation of the JSON output
* @param int $nsID namespace ID number as an integer
* @param string $var variable name
* @param mixed $val variable value
* @param array $varConf variable config from wgManageWikiNamespacesAdditional[$var]
*/
private static function setNamespaceSettingJson(
array &$jsonArray, int $nsID, string $var, $val, array $varConf
) {
switch ( $varConf['type'] ) {
case 'check':
$jsonArray['settings'][$var][] = $nsID;
break;
case 'vestyle':
$jsonArray['settings'][$var][$nsID] = true;
break;
default:
if ( ( $varConf['constant'] ) ?? false ) {
$jsonArray['settings'][$var] = str_replace( ' ', '_', $val );
} else {
$jsonArray['settings'][$var][$nsID] = $val;
}
}
}

public static function onCreateWikiCreation( $dbname, $private ) {
if ( ManageWiki::checkSetup( 'permissions' ) ) {
$mwPermissionsDefault = new ManageWikiPermissions( 'default' );
Expand Down

0 comments on commit 76790a9

Please sign in to comment.