mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/CodeMirror
synced 2024-11-27 15:40:00 +00:00
Merge "CM6: put template folding behind feature flag and rework config settings"
This commit is contained in:
commit
ffa569a472
|
@ -16,11 +16,6 @@
|
|||
"MediaWiki": ">= 1.42.0"
|
||||
},
|
||||
"config": {
|
||||
"CodeMirrorLineNumberingNamespaces": {
|
||||
"value": null,
|
||||
"description": "List of namespace IDs where line numbering should be enabled, or `null` to enable for all namespaces. Set to [] to disable everywhere. Defaults to `null` for all namespaces.",
|
||||
"public": true
|
||||
},
|
||||
"CodeMirrorV6": {
|
||||
"value": false,
|
||||
"description": "Temporary feature flag for the CodeMirror 6 upgrade."
|
||||
|
@ -31,6 +26,16 @@
|
|||
],
|
||||
"description": "An array of gadget names that, if enabled, will prevent CodeMirror from loading on action=edit and action=submit.",
|
||||
"public": true
|
||||
},
|
||||
"CodeMirrorTemplateFoldingNamespaces": {
|
||||
"value": null,
|
||||
"description": "List of namespace IDs where template folding should be enabled, or `null` to enable for all namespaces. Set to [] to disable everywhere.",
|
||||
"public": true
|
||||
},
|
||||
"CodeMirrorLineNumberingNamespaces": {
|
||||
"value": null,
|
||||
"description": "List of namespace IDs where line numbering should be enabled, or `null` to enable for all namespaces. Set to [] to disable everywhere.",
|
||||
"public": true
|
||||
}
|
||||
},
|
||||
"MessagesDirs": {
|
||||
|
@ -251,8 +256,7 @@
|
|||
"Hooks": {
|
||||
"EditPage::showEditForm:initial": "main",
|
||||
"EditPage::showReadOnlyForm:initial": "main",
|
||||
"GetPreferences": "main",
|
||||
"ResourceLoaderGetConfigVars": "main"
|
||||
"GetPreferences": "main"
|
||||
},
|
||||
"HookHandlers": {
|
||||
"main": {
|
||||
|
|
|
@ -51,12 +51,15 @@ class DataScript {
|
|||
$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 ),
|
||||
|
|
|
@ -11,7 +11,6 @@ use MediaWiki\Hook\EditPage__showEditForm_initialHook;
|
|||
use MediaWiki\Hook\EditPage__showReadOnlyForm_initialHook;
|
||||
use MediaWiki\Output\OutputPage;
|
||||
use MediaWiki\Preferences\Hook\GetPreferencesHook;
|
||||
use MediaWiki\ResourceLoader\Hook\ResourceLoaderGetConfigVarsHook;
|
||||
use MediaWiki\User\Options\UserOptionsLookup;
|
||||
use MediaWiki\User\User;
|
||||
|
||||
|
@ -21,7 +20,6 @@ use MediaWiki\User\User;
|
|||
class Hooks implements
|
||||
EditPage__showEditForm_initialHook,
|
||||
EditPage__showReadOnlyForm_initialHook,
|
||||
ResourceLoaderGetConfigVarsHook,
|
||||
GetPreferencesHook
|
||||
{
|
||||
|
||||
|
@ -143,20 +141,6 @@ class Hooks implements
|
|||
return $this->useV6 || $out->getRequest()->getRawVal( 'cm6enable' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Hook handler for enabling bracket matching.
|
||||
*
|
||||
* TODO: restrict to pages where codemirror might be enabled.
|
||||
*
|
||||
* @param array &$vars Array of variables to be added into the output of the startup module
|
||||
* @param string $skin
|
||||
* @param Config $config
|
||||
* @return void This hook must not abort, it must return no value
|
||||
*/
|
||||
public function onResourceLoaderGetConfigVars( array &$vars, $skin, Config $config ): void {
|
||||
$vars['wgCodeMirrorLineNumberingNamespaces'] = $config->get( 'CodeMirrorLineNumberingNamespaces' );
|
||||
}
|
||||
|
||||
/**
|
||||
* GetPreferences hook handler
|
||||
*
|
||||
|
|
2
resources/dist/main.js
vendored
2
resources/dist/main.js
vendored
File diff suppressed because one or more lines are too long
2
resources/dist/main.js.map.json
vendored
2
resources/dist/main.js.map.json
vendored
File diff suppressed because one or more lines are too long
|
@ -3,6 +3,11 @@ import { EditorView, lineNumbers, highlightSpecialChars } from '@codemirror/view
|
|||
import CodemirrorTextSelection from './codemirror.textSelection';
|
||||
import bidiIsolationExtension from './codemirror.bidiIsolation';
|
||||
|
||||
// Necessary so that `require` doesn't get mangled into `__webpack_require__`,
|
||||
// which ResourceLoader won't recognize and thus be unable to load the virtual file.
|
||||
// See https://webpack-v3.jsx.app/api/module-variables/#__non_webpack_require__-webpack-specific-
|
||||
__non_webpack_require__( '../ext.CodeMirror.data.js' );
|
||||
|
||||
/**
|
||||
* @class CodeMirror
|
||||
* @property {jQuery} $textarea
|
||||
|
@ -47,10 +52,11 @@ export default class CodeMirror {
|
|||
}
|
||||
|
||||
// Set to [] to disable everywhere, or null to enable everywhere
|
||||
const namespaces = mw.config.get( 'wgCodeMirrorLineNumberingNamespaces' );
|
||||
const namespaces = mw.config.get( 'extCodeMirrorConfig' ).lineNumberingNamespaces;
|
||||
if ( !namespaces || namespaces.includes( mw.config.get( 'wgNamespaceNumber' ) ) ) {
|
||||
extensions.push( lineNumbers() );
|
||||
}
|
||||
|
||||
return extensions;
|
||||
}
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@ import {
|
|||
} from '@codemirror/language';
|
||||
import { mwModeConfig as modeConfig } from './codemirror.mode.mediawiki.config';
|
||||
import { Tag } from '@lezer/highlight';
|
||||
import { templateFoldingExtension } from './codemirror.templateFolding';
|
||||
|
||||
/**
|
||||
* Adapted from the original CodeMirror 5 stream parser by Pavel Astakhov
|
||||
|
@ -1202,7 +1203,7 @@ class CodeMirrorModeMediaWiki {
|
|||
/**
|
||||
* Extra tokens to use in this parser.
|
||||
*
|
||||
* @see CodeMirrorModeMediaWikiConfig.tokenTable
|
||||
* @see CodeMirrorModeMediaWikiConfig.defaultTokenTable
|
||||
* @return {Object<Tag>}
|
||||
*/
|
||||
tokenTable: this.tokenTable
|
||||
|
@ -1223,15 +1224,22 @@ class CodeMirrorModeMediaWiki {
|
|||
* @return {LanguageSupport}
|
||||
*/
|
||||
export const mediaWikiLang = ( config = null ) => {
|
||||
const mode = new CodeMirrorModeMediaWiki(
|
||||
config || mw.config.get( 'extCodeMirrorConfig' )
|
||||
);
|
||||
config = config || mw.config.get( 'extCodeMirrorConfig' );
|
||||
const mode = new CodeMirrorModeMediaWiki( config );
|
||||
const parser = mode.mediawiki;
|
||||
const lang = StreamLanguage.define( parser );
|
||||
const highlighter = syntaxHighlighting(
|
||||
const langExtension = [ syntaxHighlighting(
|
||||
HighlightStyle.define(
|
||||
modeConfig.getTagStyles( parser )
|
||||
)
|
||||
);
|
||||
return new LanguageSupport( lang, highlighter );
|
||||
) ];
|
||||
|
||||
// Add template folding if in supported namespace.
|
||||
const templateFoldingNs = config.templateFoldingNamespaces;
|
||||
// Set to [] to disable everywhere, or null to enable everywhere.
|
||||
if ( !templateFoldingNs || templateFoldingNs.includes( mw.config.get( 'wgNamespaceNumber' ) ) ) {
|
||||
langExtension.push( templateFoldingExtension );
|
||||
}
|
||||
|
||||
return new LanguageSupport( lang, langExtension );
|
||||
};
|
||||
|
|
|
@ -3,20 +3,23 @@ import { EditorState, EditorSelection } from '@codemirror/state';
|
|||
import { EditorView, drawSelection, keymap } from '@codemirror/view';
|
||||
import { defaultKeymap, history, historyKeymap } from '@codemirror/commands';
|
||||
import { searchKeymap } from '@codemirror/search';
|
||||
import { bracketMatching } from '@codemirror/language';
|
||||
|
||||
// Necessary so that `require` doesn't get mangled into `__webpack_require__`,
|
||||
// which ResourceLoader won't recognize and thus be unable to load the virtual file.
|
||||
// See https://webpack-v3.jsx.app/api/module-variables/#__non_webpack_require__-webpack-specific-
|
||||
__non_webpack_require__( '../ext.CodeMirror.data.js' );
|
||||
import { bracketMatching, LanguageSupport } from '@codemirror/language';
|
||||
|
||||
/**
|
||||
* @class CodeMirrorWikiEditor
|
||||
* @property {LanguageSupport|Extension} langExtension
|
||||
* @property {Function|null} editRecoveryHandler
|
||||
* @property {boolean} useCodeMirror
|
||||
*/
|
||||
export default class CodeMirrorWikiEditor extends CodeMirror {
|
||||
constructor( $textarea, langExtensions ) {
|
||||
/**
|
||||
* @constructor
|
||||
* @param {jQuery} $textarea
|
||||
* @param {LanguageSupport|Extension} langExtension
|
||||
*/
|
||||
constructor( $textarea, langExtension ) {
|
||||
super( $textarea );
|
||||
this.langExtensions = langExtensions;
|
||||
this.langExtension = langExtension;
|
||||
this.editRecoveryHandler = null;
|
||||
this.useCodeMirror = mw.user.options.get( 'usecodemirror' ) > 0;
|
||||
}
|
||||
|
@ -25,7 +28,8 @@ export default class CodeMirrorWikiEditor extends CodeMirror {
|
|||
* @inheritDoc
|
||||
*/
|
||||
setCodeMirrorPreference( prefValue ) {
|
||||
this.useCodeMirror = prefValue; // Save state for function updateToolbarButton()
|
||||
// Save state for function updateToolbarButton()
|
||||
this.useCodeMirror = prefValue;
|
||||
super.setCodeMirrorPreference( prefValue );
|
||||
}
|
||||
|
||||
|
@ -49,7 +53,7 @@ export default class CodeMirrorWikiEditor extends CodeMirror {
|
|||
*/
|
||||
const extensions = [
|
||||
...this.defaultExtensions,
|
||||
...this.langExtensions,
|
||||
this.langExtension,
|
||||
bracketMatching(),
|
||||
history(),
|
||||
// See also the default attributes at contentAttributesExtension() in the parent class.
|
||||
|
|
|
@ -1,13 +1,9 @@
|
|||
import CodeMirrorWikiEditor from './codemirror.wikieditor';
|
||||
import { mediaWikiLang } from './codemirror.mode.mediawiki';
|
||||
import { templateFoldingExtension } from './codemirror.templateFolding';
|
||||
|
||||
if ( mw.loader.getState( 'ext.wikiEditor' ) ) {
|
||||
mw.hook( 'wikiEditor.toolbarReady' ).add( ( $textarea ) => {
|
||||
const cmWE = new CodeMirrorWikiEditor( $textarea, [
|
||||
mediaWikiLang(),
|
||||
templateFoldingExtension
|
||||
] );
|
||||
const cmWE = new CodeMirrorWikiEditor( $textarea, mediaWikiLang() );
|
||||
cmWE.addCodeMirrorToWikiEditor();
|
||||
} );
|
||||
}
|
||||
|
|
|
@ -89,8 +89,8 @@ module.exports = ( env, argv ) => ( {
|
|||
// Minified uncompressed size limits for chunks / assets and entrypoints. Keep these numbers
|
||||
// up-to-date and rounded to the nearest 10th of a kibibyte so that code sizing costs are
|
||||
// well understood. Related to bundlesize minified, gzipped compressed file size tests.
|
||||
maxAssetSize: 351.0 * 1024,
|
||||
maxEntrypointSize: 351.0 * 1024,
|
||||
maxAssetSize: 352.0 * 1024,
|
||||
maxEntrypointSize: 352.0 * 1024,
|
||||
|
||||
// The default filter excludes map files, but we rename ours.
|
||||
assetFilter: ( filename ) => !filename.endsWith( srcMapExt )
|
||||
|
|
Loading…
Reference in a new issue