<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://120.55.36.65/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-MiniEdit.js</id>
	<title>MediaWiki:Gadget-MiniEdit.js - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://120.55.36.65/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-MiniEdit.js"/>
	<link rel="alternate" type="text/html" href="http://120.55.36.65/w/index.php?title=MediaWiki:Gadget-MiniEdit.js&amp;action=history"/>
	<updated>2026-04-04T05:05:35Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>http://120.55.36.65/w/index.php?title=MediaWiki:Gadget-MiniEdit.js&amp;diff=119&amp;oldid=prev</id>
		<title>DGCK81LNN：​导入1个版本</title>
		<link rel="alternate" type="text/html" href="http://120.55.36.65/w/index.php?title=MediaWiki:Gadget-MiniEdit.js&amp;diff=119&amp;oldid=prev"/>
		<updated>2024-08-14T04:01:17Z</updated>

		<summary type="html">&lt;p&gt;导入1个版本&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh-Hans-CN&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2024年8月14日 (三) 12:01的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;zh-Hans-CN&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;（没有差异）&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>DGCK81LNN</name></author>
	</entry>
	<entry>
		<id>http://120.55.36.65/w/index.php?title=MediaWiki:Gadget-MiniEdit.js&amp;diff=118&amp;oldid=prev</id>
		<title>lnnblog&gt;LNNBot：​导入1个版本：​从分支站同步更改</title>
		<link rel="alternate" type="text/html" href="http://120.55.36.65/w/index.php?title=MediaWiki:Gadget-MiniEdit.js&amp;diff=118&amp;oldid=prev"/>
		<updated>2024-06-10T11:39:32Z</updated>

		<summary type="html">&lt;p&gt;导入1个版本：​从分支站同步更改&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/**&lt;br /&gt;
 * MiniEdit enables quick and simple edits without leaving the page&lt;br /&gt;
 * Documentation: https://www.mediawiki.org/wiki/MiniEdit&lt;br /&gt;
 * License: GNU General Public License 3 or later (http://www.gnu.org/licenses/gpl-3.0.html)&lt;br /&gt;
 * Author: Felipe Schenone (User:Sophivorus)&lt;br /&gt;
 */&lt;br /&gt;
var MiniEdit = {&lt;br /&gt;
&lt;br /&gt;
	/**d&lt;br /&gt;
	 * Will hold the wikitext of the current page&lt;br /&gt;
	 */&lt;br /&gt;
	pageWikitext: '',&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Initialization script&lt;br /&gt;
	 */&lt;br /&gt;
	init: function () {&lt;br /&gt;
		// EDIT: pre-register messages to eliminate access to wikimedia sites&lt;br /&gt;
		mw.messages.set( {&lt;br /&gt;
			&amp;quot;miniedit-form-publish&amp;quot;: &amp;quot;发布&amp;quot;,&lt;br /&gt;
			&amp;quot;miniedit-form-cancel&amp;quot;: &amp;quot;取消&amp;quot;,&lt;br /&gt;
			&amp;quot;miniedit-form-summary&amp;quot;: &amp;quot;编辑摘要&amp;quot;,&lt;br /&gt;
			&amp;quot;miniedit-form-minor&amp;quot;: &amp;quot;小编辑&amp;quot;,&lt;br /&gt;
			&amp;quot;miniedit-form-saving&amp;quot;: &amp;quot;正在保存...&amp;quot;,&lt;br /&gt;
			&amp;quot;miniedit-summary-edit&amp;quot;: &amp;quot;编辑段落&amp;quot;,&lt;br /&gt;
			&amp;quot;miniedit-summary-delete&amp;quot;: &amp;quot;删除段落&amp;quot;&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		// Only init when viewing&lt;br /&gt;
		var action = mw.config.get( 'wgAction' );&lt;br /&gt;
		if ( action !== 'view' ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Only init in useful namespaces&lt;br /&gt;
		var namespaces = [ 0, 2, 4, 12, 14 ];&lt;br /&gt;
		var namespace = mw.config.get( 'wgNamespaceNumber' );&lt;br /&gt;
		var talk = namespace % 2 === 1; // Talk pages always have odd namespaces&lt;br /&gt;
		if ( !namespaces.includes( namespace ) &amp;amp;&amp;amp; !talk ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Only init in wikitext pages&lt;br /&gt;
		var model = mw.config.get( 'wgPageContentModel' );&lt;br /&gt;
		if ( model !== 'wikitext' ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Select only paragraphs that are direct children&lt;br /&gt;
		// to reduce the chances of matching paragraphs that come from templates&lt;br /&gt;
		var selector = '#mw-content-text &amp;gt; .mw-parser-output &amp;gt; p';&lt;br /&gt;
		if ( mw.config.get( 'skin' ) === 'minerva' ) {&lt;br /&gt;
			selector = '#mw-content-text &amp;gt; .mw-parser-output &amp;gt; section &amp;gt; p';&lt;br /&gt;
		}&lt;br /&gt;
		$( selector ).each( MiniEdit.addEditButton );&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Add an edit button&lt;br /&gt;
	 */&lt;br /&gt;
	addEditButton: function () {&lt;br /&gt;
		var $paragraph = $( this );&lt;br /&gt;
&lt;br /&gt;
		// Skip empty paragraphs&lt;br /&gt;
		if ( !$paragraph.text().trim() ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Make the edit button&lt;br /&gt;
		var path = '&amp;lt;path fill=&amp;quot;currentColor&amp;quot; d=&amp;quot;M16.77 8l1.94-2a1 1 0 0 0 0-1.41l-3.34-3.3a1 1 0 0 0-1.41 0L12 3.23zm-5.81-3.71L1 14.25V19h4.75l9.96-9.96-4.75-4.75z&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;';&lt;br /&gt;
		var icon = '&amp;lt;svg width=&amp;quot;14&amp;quot; height=&amp;quot;14&amp;quot; viewBox=&amp;quot;0 0 20 20&amp;quot;&amp;gt;' + path + '&amp;lt;/svg&amp;gt;';&lt;br /&gt;
		var $button = $( '&amp;lt;span class=&amp;quot;miniedit-button noprint&amp;quot;&amp;gt;' + icon + '&amp;lt;/span&amp;gt;' );&lt;br /&gt;
		$button.css( { 'color': '#a2a9b1', 'cursor': 'pointer' } );&lt;br /&gt;
		$button.on( 'click', MiniEdit.onEditButtonClick );&lt;br /&gt;
&lt;br /&gt;
		// Only show the button when the user hovers over the paragraph&lt;br /&gt;
		// On mobile devices there's no hover event, so we just skip this part and show the button always&lt;br /&gt;
		if ( window.innerWidth &amp;gt; 800 ) {&lt;br /&gt;
			$button.hide();&lt;br /&gt;
			$paragraph.on( 'mouseenter', function () { $button.show(); } );&lt;br /&gt;
			$paragraph.on( 'mouseleave', function () { $button.hide(); } );&lt;br /&gt;
			$button.on( 'mouseenter', function () { $( this ).css( 'color', '#202122' ); } );&lt;br /&gt;
			$button.on( 'mouseleave', function () { $( this ).css( 'color', '#a2a9b1' ); } );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Add to the DOM&lt;br /&gt;
		$paragraph.append( ' ', $button );&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Handle a click on an edit button&lt;br /&gt;
	 */&lt;br /&gt;
	onEditButtonClick: function () {&lt;br /&gt;
		var $button = $( this ).closest( '.miniedit-button' );&lt;br /&gt;
		var $paragraph = $button.parent();&lt;br /&gt;
&lt;br /&gt;
		// Save the original paragraph in case we need to restore it later&lt;br /&gt;
		// For some reason the hover events on the button are not getting cloned, so we remake the button&lt;br /&gt;
		var $original = $paragraph.clone( true );&lt;br /&gt;
		$original.find( '.miniedit-button' ).remove();&lt;br /&gt;
		MiniEdit.addEditButton.call( $original );&lt;br /&gt;
&lt;br /&gt;
		// If pageWikitext is set, it means that the dependencies were already loaded by a previous click&lt;br /&gt;
		if ( MiniEdit.pageWikitext ) {&lt;br /&gt;
			MiniEdit.addEditForm( $paragraph, $original );&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// If we reach this point, we need to load the dependencies&lt;br /&gt;
		// First, we replace the button for a loading spinner&lt;br /&gt;
		// to prevent further clicks and to signal the user that something's happening&lt;br /&gt;
		var $spinner = MiniEdit.getSpinner();&lt;br /&gt;
		$button.replaceWith( $spinner );&lt;br /&gt;
&lt;br /&gt;
		// Then we load dependencies&lt;br /&gt;
		$.when(&lt;br /&gt;
			MiniEdit.getPageWikitext(),&lt;br /&gt;
			MiniEdit.getMessages( 'en' )&lt;br /&gt;
		).done( function () {&lt;br /&gt;
			// Note the special treatment of getMessages( pageLanguage )&lt;br /&gt;
			// because it may fail if a translation doesn't exist yet&lt;br /&gt;
			// and because its success callback needs to run AFTER getMessages( 'en' )&lt;br /&gt;
			var pageLanguage = mw.config.get( 'wgPageContentLanguage' );&lt;br /&gt;
			MiniEdit.getMessages( pageLanguage ).always( function () {&lt;br /&gt;
				MiniEdit.addEditForm( $paragraph, $original );&lt;br /&gt;
			} );&lt;br /&gt;
		} );&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Add an edit form&lt;br /&gt;
	 */&lt;br /&gt;
	addEditForm: function ( $paragraph, $original ) {&lt;br /&gt;
		// If no relevant wikitext for the element is found, fallback to regular edit&lt;br /&gt;
		var wikitext = MiniEdit.getParagraphWikitext( $paragraph );&lt;br /&gt;
		if ( !wikitext ) {&lt;br /&gt;
			var $section = MiniEdit.getSection( $paragraph );&lt;br /&gt;
			var sectionNumber = $section ? 1 + $section.prevAll( ':header' ).length : 0;&lt;br /&gt;
			var editUrl = mw.util.getUrl( null, { action: 'edit', section: sectionNumber } );&lt;br /&gt;
			window.location.href = editUrl;&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Make the form&lt;br /&gt;
		var wikitextInput = new OO.ui.MultilineTextInputWidget( { name: 'wikitext', value: wikitext, autofocus: true, autosize: true } );&lt;br /&gt;
		var wikitextLayout = new OO.ui.HorizontalLayout( { items: [ wikitextInput ] } );&lt;br /&gt;
		var summaryInput = new OO.ui.TextInputWidget( { name: 'summary', placeholder: mw.msg( 'miniedit-form-summary' ) } );&lt;br /&gt;
		var summaryLayout = new OO.ui.HorizontalLayout( { items: [ summaryInput ] } );&lt;br /&gt;
&lt;br /&gt;
		// Anons can't mark edits as minor&lt;br /&gt;
		if ( !mw.user.isAnon() ) {&lt;br /&gt;
			var minorCheckbox = new OO.ui.CheckboxInputWidget( { name: 'minor' } );&lt;br /&gt;
			var minorLayout = new OO.ui.FieldLayout( minorCheckbox, { label: mw.msg( 'miniedit-form-minor' ), align: 'inline' } );&lt;br /&gt;
			summaryLayout.addItems( [ minorLayout ] );&lt;br /&gt;
			summaryLayout.$element.find( '.oo-ui-fieldLayout' ).css( 'vertical-align', 'text-bottom' ); // Minor alignment fix&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Add the buttons&lt;br /&gt;
		var publishButton = new OO.ui.ButtonInputWidget( { label: mw.msg( 'miniedit-form-publish' ), flags: [ 'primary', 'progressive' ] } );&lt;br /&gt;
		var cancelButton = new OO.ui.ButtonInputWidget( { label: mw.msg( 'miniedit-form-cancel' ), flags: 'destructive', framed: false } );&lt;br /&gt;
		var formLayout = new OO.ui.FormLayout( { items: [ wikitextLayout, summaryLayout, publishButton, cancelButton ] } );&lt;br /&gt;
&lt;br /&gt;
		// CSS tweaks&lt;br /&gt;
		formLayout.$element.css( 'overflow', 'hidden' );&lt;br /&gt;
		wikitextInput.$element.css( { 'font-family': 'monospace', 'max-width': '100%' } );&lt;br /&gt;
&lt;br /&gt;
		// Add to the DOM&lt;br /&gt;
		var $form = formLayout.$element;&lt;br /&gt;
		$paragraph.html( $form );&lt;br /&gt;
&lt;br /&gt;
		// Handle a submission&lt;br /&gt;
		publishButton.on( 'click', MiniEdit.onSubmit, [ $paragraph, $original, $form, wikitext, publishButton, cancelButton ] );&lt;br /&gt;
&lt;br /&gt;
		// Handle a cancel&lt;br /&gt;
		cancelButton.on( 'click', function () {&lt;br /&gt;
			$paragraph.replaceWith( $original );&lt;br /&gt;
		} );&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Handle a submission&lt;br /&gt;
	 */&lt;br /&gt;
	onSubmit: function ( $paragraph, $original, $form, oldWikitext, publishButton, cancelButton ) {&lt;br /&gt;
		var newWikitext = $form.find( 'textarea[name=&amp;quot;wikitext&amp;quot;]' ).val();&lt;br /&gt;
&lt;br /&gt;
		// If no changes were made, just restore the original element&lt;br /&gt;
		if ( oldWikitext === newWikitext ) {&lt;br /&gt;
			$paragraph.replaceWith( $original );&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Disable the buttons to prevent further clicks and to signal the user that something's happening&lt;br /&gt;
		publishButton.setDisabled( true );&lt;br /&gt;
		cancelButton.setDisabled( true );&lt;br /&gt;
&lt;br /&gt;
		// Get the rest of the form data&lt;br /&gt;
		var summary = $form.find( 'input[name=&amp;quot;summary&amp;quot;]' ).val();&lt;br /&gt;
		var minor = $form.find( 'input[name=&amp;quot;minor&amp;quot;]' ).prop( 'checked' );&lt;br /&gt;
&lt;br /&gt;
		// Fix excessive line breaks&lt;br /&gt;
		newWikitext = newWikitext.trim();&lt;br /&gt;
		newWikitext = newWikitext.replace( /\n\n\n+/g, '\n\n' );&lt;br /&gt;
&lt;br /&gt;
		// If the paragraph was deleted, remove also any trailing newlines&lt;br /&gt;
		if ( !newWikitext ) {&lt;br /&gt;
			oldWikitext = oldWikitext.replace( /[.*+?^${}()|[\]\\]/g, '\\$&amp;amp;' ); // Escape special characters&lt;br /&gt;
			oldWikitext = new RegExp( oldWikitext + '\n+' );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		MiniEdit.pageWikitext = MiniEdit.pageWikitext.replace( oldWikitext, newWikitext );&lt;br /&gt;
		var params = {&lt;br /&gt;
			'action': 'edit',&lt;br /&gt;
			'title': mw.config.get( 'wgPageName' ),&lt;br /&gt;
			'text': MiniEdit.pageWikitext,&lt;br /&gt;
			'minor': minor,&lt;br /&gt;
			'summary': MiniEdit.makeSummary( summary, $form, newWikitext ),&lt;br /&gt;
			'tags': mw.config.get( 'miniedit-tag' )&lt;br /&gt;
		};&lt;br /&gt;
		new mw.Api().postWithEditToken( params ).done( function () {&lt;br /&gt;
			MiniEdit.onSuccess( $paragraph, newWikitext );&lt;br /&gt;
		} );&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Callback on successful edits&lt;br /&gt;
	 */&lt;br /&gt;
	onSuccess: function ( $paragraph, newWikitext ) {&lt;br /&gt;
		if ( !newWikitext ) {&lt;br /&gt;
			$paragraph.remove();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		var params = {&lt;br /&gt;
			'action': 'parse',&lt;br /&gt;
			'title': mw.config.get( 'wgPageName' ),&lt;br /&gt;
			'text': newWikitext,&lt;br /&gt;
			'formatversion': 2,&lt;br /&gt;
			'prop': 'text',&lt;br /&gt;
			'disablelimitreport': true,&lt;br /&gt;
		};&lt;br /&gt;
		new mw.Api().get( params ).done( function ( data ) {&lt;br /&gt;
			var text = data.parse.text;&lt;br /&gt;
			var $html = $( text );&lt;br /&gt;
			var $paragraphs = $html.find( 'p' );&lt;br /&gt;
			$paragraph.replaceWith( $paragraphs );&lt;br /&gt;
			$paragraphs.each( MiniEdit.addEditButton );&lt;br /&gt;
		} );&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Get the wikitext of the current page&lt;br /&gt;
	 */&lt;br /&gt;
	getPageWikitext: function () {&lt;br /&gt;
		var params = {&lt;br /&gt;
			'page': mw.config.get( 'wgPageName' ),&lt;br /&gt;
			'action': 'parse',&lt;br /&gt;
			'prop': 'wikitext',&lt;br /&gt;
			'formatversion': 2,&lt;br /&gt;
		};&lt;br /&gt;
		return new mw.Api().get( params ).done( function ( data ) {&lt;br /&gt;
			MiniEdit.pageWikitext = data.parse.wikitext;&lt;br /&gt;
		} );&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * ~~Get messages from the Wikimedia repository~~&lt;br /&gt;
	 * Changing this to a no-op since we pre-register messages&lt;br /&gt;
	 */&lt;br /&gt;
	getMessages: function ( language ) {&lt;br /&gt;
		return jQuery.Deferred().resolve();&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Helper method to get the relevant wikitext that corresponds to a given paragraph&lt;br /&gt;
	 *&lt;br /&gt;
	 * This is actually the heart of the tool&lt;br /&gt;
	 * It's a heuristic method to try to find the relevant wikitext&lt;br /&gt;
	 * that corresponds to the paragraph being edited&lt;br /&gt;
	 * Since wikitext and HTML are different markups&lt;br /&gt;
	 * the only place where they are the same is in plain text fragments&lt;br /&gt;
	 * so we find the longest plain text fragment in the HTML&lt;br /&gt;
	 * then we search for that same fragment in the wikitext&lt;br /&gt;
	 * and return the entire line of wikitext containing that fragment&lt;br /&gt;
	 * or null if anything goes wrong&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param {jQuery object} jQuery object representing the DOM element being edited&lt;br /&gt;
	 * @return {string|null} Wikitext of the paragraph being edited, or null if it can't be found&lt;br /&gt;
	 */&lt;br /&gt;
	getParagraphWikitext: function ( $paragraph ) {&lt;br /&gt;
		// The longest text node has the most chances of being unique&lt;br /&gt;
		var text = MiniEdit.getLongestText( $paragraph );&lt;br /&gt;
&lt;br /&gt;
		// Some paragraphs may not have text nodes at all&lt;br /&gt;
		if ( !text ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Match all lines that contain the text&lt;br /&gt;
		text = text.replace( /[.*+?^${}()|[\]\\]/g, '\\$&amp;amp;' ); // Escape special characters&lt;br /&gt;
		var regexp = new RegExp( '.*' + text + '.*', 'g' );&lt;br /&gt;
		var matches = MiniEdit.pageWikitext.match( regexp );&lt;br /&gt;
&lt;br /&gt;
		// This may happen if the paragraph comes from a template&lt;br /&gt;
		if ( !matches ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// This may happen if the longest text is very short and repeats somewhere else&lt;br /&gt;
		if ( matches.length &amp;gt; 1 ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// We got our relevant wikitext line&lt;br /&gt;
		return matches[0];&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Helper method to get the text of the longest text node&lt;br /&gt;
	 */&lt;br /&gt;
	getLongestText: function ( $paragraph ) {&lt;br /&gt;
		var text = '';&lt;br /&gt;
		var $textNodes = $paragraph.contents().filter( function () {&lt;br /&gt;
			return this.nodeType === Node.TEXT_NODE;&lt;br /&gt;
		} );&lt;br /&gt;
		$textNodes.each( function () {&lt;br /&gt;
			var nodeText = $( this ).text().trim();&lt;br /&gt;
			if ( nodeText.length &amp;gt; text.length ) {&lt;br /&gt;
				text = nodeText;&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
		return text;&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Helper method to build a helpful edit summary&lt;br /&gt;
	 */&lt;br /&gt;
	makeSummary: function ( summary, $paragraph, wikitext ) {&lt;br /&gt;
		if ( !summary ) {&lt;br /&gt;
			var action = wikitext ? 'edit' : 'delete';&lt;br /&gt;
			summary = mw.msg( 'miniedit-summary-' + action );&lt;br /&gt;
		}&lt;br /&gt;
		var $section = MiniEdit.getSection( $paragraph );&lt;br /&gt;
		if ( $section ) {&lt;br /&gt;
			var section = $section.find( '.mw-headline' ).attr( 'id' ).replaceAll( '_', ' ' );&lt;br /&gt;
			summary = '/* ' + section + ' */ ' + summary;&lt;br /&gt;
		}&lt;br /&gt;
		var page = mw.config.get( 'miniedit-page', 'mw:MiniEdit' );&lt;br /&gt;
		summary += ' [[' + page + '| #MiniEdit]]'; // For https://hashtags.wmcloud.org&lt;br /&gt;
		return summary;&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Helper method to find the closest section&lt;br /&gt;
	 * by traversing back and up the DOM tree&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param {jQuery object} Starting element&lt;br /&gt;
	 * @return {jQuery object} Closest section&lt;br /&gt;
	 */&lt;br /&gt;
	getSection: function ( $element ) {&lt;br /&gt;
		if ( $element.attr( 'id' ) === 'mw-content-text' ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if ( $element.is( ':header' ) ) {&lt;br /&gt;
			return $element;&lt;br /&gt;
		}&lt;br /&gt;
		var $previous = $element.prevAll( ':header' ).first();&lt;br /&gt;
		if ( $previous.length ) {&lt;br /&gt;
			return $previous;&lt;br /&gt;
		}&lt;br /&gt;
		var $parent = $element.parent();&lt;br /&gt;
		return MiniEdit.getSection( $parent );&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Helper method to get a spinner (loading) icon&lt;br /&gt;
	 */&lt;br /&gt;
	 getSpinner: function () {&lt;br /&gt;
		var spinner = '&amp;lt;svg class=&amp;quot;miniedit-spinner&amp;quot; width=&amp;quot;14&amp;quot; height=&amp;quot;14&amp;quot; viewBox=&amp;quot;0 0 100 100&amp;quot;&amp;gt;';&lt;br /&gt;
		spinner += '&amp;lt;rect fill=&amp;quot;#555555&amp;quot; height=&amp;quot;10&amp;quot; rx=&amp;quot;5&amp;quot; ry=&amp;quot;5&amp;quot; width=&amp;quot;28&amp;quot; x=&amp;quot;67&amp;quot; y=&amp;quot;45&amp;quot; opacity=&amp;quot;0.000&amp;quot; transform=&amp;quot;rotate(-90 50 50)&amp;quot; /&amp;gt;';&lt;br /&gt;
		spinner += '&amp;lt;rect fill=&amp;quot;#555555&amp;quot; height=&amp;quot;10&amp;quot; rx=&amp;quot;5&amp;quot; ry=&amp;quot;5&amp;quot; width=&amp;quot;28&amp;quot; x=&amp;quot;67&amp;quot; y=&amp;quot;45&amp;quot; opacity=&amp;quot;0.125&amp;quot; transform=&amp;quot;rotate(-45 50 50)&amp;quot; /&amp;gt;';&lt;br /&gt;
		spinner += '&amp;lt;rect fill=&amp;quot;#555555&amp;quot; height=&amp;quot;10&amp;quot; rx=&amp;quot;5&amp;quot; ry=&amp;quot;5&amp;quot; width=&amp;quot;28&amp;quot; x=&amp;quot;67&amp;quot; y=&amp;quot;45&amp;quot; opacity=&amp;quot;0.250&amp;quot; transform=&amp;quot;rotate(0 50 50)&amp;quot; /&amp;gt;';&lt;br /&gt;
		spinner += '&amp;lt;rect fill=&amp;quot;#555555&amp;quot; height=&amp;quot;10&amp;quot; rx=&amp;quot;5&amp;quot; ry=&amp;quot;5&amp;quot; width=&amp;quot;28&amp;quot; x=&amp;quot;67&amp;quot; y=&amp;quot;45&amp;quot; opacity=&amp;quot;0.375&amp;quot; transform=&amp;quot;rotate(45 50 50)&amp;quot; /&amp;gt;';&lt;br /&gt;
		spinner += '&amp;lt;rect fill=&amp;quot;#555555&amp;quot; height=&amp;quot;10&amp;quot; rx=&amp;quot;5&amp;quot; ry=&amp;quot;5&amp;quot; width=&amp;quot;28&amp;quot; x=&amp;quot;67&amp;quot; y=&amp;quot;45&amp;quot; opacity=&amp;quot;0.500&amp;quot; transform=&amp;quot;rotate(90 50 50)&amp;quot; /&amp;gt;';&lt;br /&gt;
		spinner += '&amp;lt;rect fill=&amp;quot;#555555&amp;quot; height=&amp;quot;10&amp;quot; rx=&amp;quot;5&amp;quot; ry=&amp;quot;5&amp;quot; width=&amp;quot;28&amp;quot; x=&amp;quot;67&amp;quot; y=&amp;quot;45&amp;quot; opacity=&amp;quot;0.625&amp;quot; transform=&amp;quot;rotate(135 50 50)&amp;quot; /&amp;gt;';&lt;br /&gt;
		spinner += '&amp;lt;rect fill=&amp;quot;#555555&amp;quot; height=&amp;quot;10&amp;quot; rx=&amp;quot;5&amp;quot; ry=&amp;quot;5&amp;quot; width=&amp;quot;28&amp;quot; x=&amp;quot;67&amp;quot; y=&amp;quot;45&amp;quot; opacity=&amp;quot;0.750&amp;quot; transform=&amp;quot;rotate(180 50 50)&amp;quot; /&amp;gt;';&lt;br /&gt;
		spinner += '&amp;lt;rect fill=&amp;quot;#555555&amp;quot; height=&amp;quot;10&amp;quot; rx=&amp;quot;5&amp;quot; ry=&amp;quot;5&amp;quot; width=&amp;quot;28&amp;quot; x=&amp;quot;67&amp;quot; y=&amp;quot;45&amp;quot; opacity=&amp;quot;0.875&amp;quot; transform=&amp;quot;rotate(225 50 50)&amp;quot; /&amp;gt;';&lt;br /&gt;
		spinner += '&amp;lt;/svg&amp;gt;';&lt;br /&gt;
		var $spinner = $( spinner );&lt;br /&gt;
		var degrees = 0;&lt;br /&gt;
		setInterval( function () {&lt;br /&gt;
			degrees += 45;&lt;br /&gt;
			$spinner.css( 'transform', 'rotate(' + degrees + 'deg)' );&lt;br /&gt;
		}, 100 );&lt;br /&gt;
		return $spinner;&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Helper method to decode base64 strings&lt;br /&gt;
	 * See https://stackoverflow.com/questions/30106476&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param {string} Encoded string&lt;br /&gt;
	 * @return {string} Decoded string&lt;br /&gt;
	 */&lt;br /&gt;
	decodeBase64: function ( string ) {&lt;br /&gt;
		return decodeURIComponent( window.atob( string ).split( '' ).map( function ( character ) {&lt;br /&gt;
			return '%' + ( '00' + character.charCodeAt( 0 ).toString( 16 ) ).slice( -2 );&lt;br /&gt;
		} ).join( '' ) );&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
mw.loader.using( [&lt;br /&gt;
	'mediawiki.api',&lt;br /&gt;
	'mediawiki.user',&lt;br /&gt;
	'mediawiki.util',&lt;br /&gt;
	'oojs-ui-core',&lt;br /&gt;
	'oojs-ui-widgets'&lt;br /&gt;
], MiniEdit.init );&lt;/div&gt;</summary>
		<author><name>lnnblog&gt;LNNBot</name></author>
	</entry>
</feed>