mediawiki-extensions-CodeMi.../includes/DataScript.php
MusikAnimal 7e9d90bb52 CM6: put template folding behind feature flag and rework config settings
Template folding is likely going to be a big 'hit' of a feature, but not
everyone will want it. Until CodeMirror prefs are introduced (T359498),
we need a way to control the rollout of template folding. This commit
adds $wgCodeMirrorTemplateFoldingNamespaces which acts similar to the
existing $wgCodeMirrorLineNumberingNamespaces.

We also move template folding to be part of CodeMirrorModeMediaWiki,
since the feature is unique to MediaWiki wikitext.

Move configuration settings to be part of the DataScript, thus removing
the need for the ResourceLoaderGetConfigVarsHook (which unnecessarily
makes the config settings available on every page load).

Other minor changes like adding missing JSDoc blocks.

Bug: T30684
Change-Id: I67518c0968f64c79e290f57b4884d30a161212d3
2024-03-14 23:54:39 -04:00

99 lines
3.3 KiB
PHP

<?php
/**
* ResourceLoader callback for ext.CodeMirror.data module
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
*/
namespace MediaWiki\Extension\CodeMirror;
use ExtensionRegistry;
use MediaWiki\MediaWikiServices;
use MediaWiki\ResourceLoader as RL;
use MediaWiki\ResourceLoader\ResourceLoader;
/**
* ResourceLoader callback for ext.CodeMirror.data
*/
class DataScript {
/**
* @param RL\Context $context
* @return string
*/
public static function makeScript( RL\Context $context ) {
return ResourceLoader::makeConfigSetScript(
[ 'extCodeMirrorConfig' => self::getFrontendConfiguraton() ]
);
}
/**
* Returns an array of variables for CodeMirror to work (tags and so on)
*
* @return array
*/
private static function getFrontendConfiguraton() {
// Use the content language, not the user language. (See T170130.)
$lang = MediaWikiServices::getInstance()->getContentLanguage();
$registry = ExtensionRegistry::getInstance();
$parser = MediaWikiServices::getInstance()->getParser();
$mwConfig = MediaWikiServices::getInstance()->getMainConfig();
$tagModes = $registry->getAttribute( 'CodeMirrorTagModes' );
$tagNames = array_merge( $parser->getTags(), array_keys( $tagModes ) );
// initialize configuration
$config = [
'lineNumberingNamespaces' => $mwConfig->get( 'CodeMirrorLineNumberingNamespaces' ),
'templateFoldingNamespaces' => $mwConfig->get( 'CodeMirrorTemplateFoldingNamespaces' ),
'pluginModules' => $registry->getAttribute( 'CodeMirrorPluginModules' ),
'tagModes' => $tagModes,
'tags' => array_fill_keys( $tagNames, true ),
'doubleUnderscore' => [ [], [] ],
'functionSynonyms' => $parser->getFunctionSynonyms(),
'urlProtocols' => $parser->getUrlProtocols(),
'linkTrailCharacters' => $lang->linkTrail(),
];
$mw = $lang->getMagicWords();
$magicWordFactory = $parser->getMagicWordFactory();
foreach ( $magicWordFactory->getDoubleUnderscoreArray()->getNames() as $name ) {
if ( isset( $mw[$name] ) ) {
$caseSensitive = array_shift( $mw[$name] ) == 0 ? 0 : 1;
foreach ( $mw[$name] as $n ) {
$n = $caseSensitive ? $n : $lang->lc( $n );
$config['doubleUnderscore'][$caseSensitive][$n] = $name;
}
} else {
$config['doubleUnderscore'][0][] = $name;
}
}
foreach ( $magicWordFactory->getVariableIDs() as $name ) {
if ( isset( $mw[$name] ) ) {
$caseSensitive = array_shift( $mw[$name] ) == 0 ? 0 : 1;
foreach ( $mw[$name] as $n ) {
$n = $caseSensitive ? $n : $lang->lc( $n );
$config['functionSynonyms'][$caseSensitive][$n] = $name;
}
}
}
return $config;
}
}