function updateVisualEditorConfig() {
    if (ve) {
        if (ve.init && ve.init.mw && ve.init.mw.Target) {
            ve.init.mw.Target.static.toolbarGroups.forEach(function (toolbarItem) {
                if (toolbarItem.name === 'format') {
                    // 将heading1从demote中移除,防止heading1出现在底部
                    toolbarItem.demote = toolbarItem.demote.filter(function (item) {
                        return item !== 'heading1';
                    });
                }
            });
        } else {
            console.warn('Cannot find "ve.init.Target"');
        }

        if (ve.ui) {
            // 重命名heading1-6
            for (var i = 1; i <= 6; i ++) {
                var className = 'MWHeading' + i + 'FormatTool';
                var msgId = 'isekai-ve-formatdropdown-format-mw-heading' + i;
                if (ve.ui[className]) {
                    ve.ui[className].static.title = OO.ui.deferMsg(msgId);
                } else {
                    console.warn('Cannot find "ve.ui.' + className + '"');
                }
            }
        } else {
            console.warn('Cannot find "ve.ui"');
        }
    } else {
        console.warn('Cannot find ve lib');
    }

    if (mw.libs && mw.libs.ve && mw.libs.ve.targetLoader) {
        var _oldRequestParsoidData = mw.libs.ve.targetLoader.requestParsoidData;

        /**
        * Request the page data and various metadata from the MediaWiki API (which will use
        * Parsoid or RESTBase).
        *
        * @param {string} mode Target mode: 'visual' or 'source'
        * @param {string} pageName Page name to request, in prefixed DB key form (underscores instead of spaces)
        * @param {Object} [options]
        * @param {boolean} [options.sessionStore] Store result in session storage (by page+mode+section) for auto-save
        * @param {null|string} [options.section] Section to edit; number, 'T-'-prefixed, null or 'new' (currently just source mode)
        * @param {number} [options.oldId] Old revision ID. Current if omitted.
        * @param {string} [options.targetName] Optional target name for tracking
        * @param {boolean} [options.modified] The page was been modified before loading (e.g. in source mode)
        * @param {string} [options.wikitext] Wikitext to convert to HTML. The original document is fetched if undefined.
        * @param {string} [options.editintro] Name of a page to use as edit intro message
        * @param {string} [options.preload] Name of a page to use as preloaded content if pageName is empty
        * @param {Array} [options.preloadparams] Parameters to substitute into preload if it's used
        * @return {jQuery.Promise} Abortable promise resolved with a JSON object
        */
        mw.libs.ve.targetLoader.requestParsoidData = function ( mode, pageName, options ) {
            console.log('loading page data: ', pageName);
            if (window.URL) {
                var urlInfo = new URL(location.href);
                let tplPageName = urlInfo.searchParams.get('tplPageName');
                if (tplPageName) {
                    // 使用模板页面名替代页面名
                    pageName = tplPageName;
                }
            }

            return _oldRequestParsoidData(mode, pageName, options);
        }
    } else {
        console.log('mw.libs.ve.targetLoader not defined');
    }

    // 重写参数输入框
    // 1. 添加下拉框类型
    if (ve.ui && ve.ui.MWParameterPage) {
        var _oldCreateValueInput = ve.ui.MWParameterPage.prototype.createValueInput;
        ve.ui.MWParameterPage.prototype.createValueInput = function () {
            var type = this.parameter.getType(),
                value = this.parameter.getValue(),
                valueInputConfig = this.getDefaultInputConfig();

            if ( type === 'dropdown' ) {
                return new ve.ui.MWParameterDropdownInputWidget( valueInputConfig, this.parameter.getDefaultValue() );
            }

            return _oldCreateValueInput.call(this);
        }
    } else {
        console.log('ve.ui.MWParameterPage not defined');
    }
}

updateVisualEditorConfig();