<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans">
	<id>https://notblog.vudrux.site/wiki/MediaWiki:Gadget-MiniEdit.js?action=history&amp;feed=atom</id>
	<title>MediaWiki:Gadget-MiniEdit.js - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://notblog.vudrux.site/wiki/MediaWiki:Gadget-MiniEdit.js?action=history&amp;feed=atom"/>
	<link rel="alternate" type="text/html" href="https://notblog.vudrux.site/wiki/MediaWiki:Gadget-MiniEdit.js?action=history"/>
	<updated>2026-06-18T08:01:13Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://notblog.vudrux.site/index.php?title=MediaWiki:Gadget-MiniEdit.js&amp;diff=2458&amp;oldid=prev</id>
		<title>LNNBot：​导入1个版本：​从分支站同步更改</title>
		<link rel="alternate" type="text/html" href="https://notblog.vudrux.site/index.php?title=MediaWiki:Gadget-MiniEdit.js&amp;diff=2458&amp;oldid=prev"/>
		<updated>2024-06-10T11:39:32Z</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&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年6月10日 (一) 19:39的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;zh-Hans&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>LNNBot</name></author>
	</entry>
	<entry>
		<id>https://notblog.vudrux.site/index.php?title=MediaWiki:Gadget-MiniEdit.js&amp;diff=2457&amp;oldid=prev</id>
		<title>2024年5月26日 (日) 08:45 DGCK81LNN</title>
		<link rel="alternate" type="text/html" href="https://notblog.vudrux.site/index.php?title=MediaWiki:Gadget-MiniEdit.js&amp;diff=2457&amp;oldid=prev"/>
		<updated>2024-05-26T08:45:24Z</updated>

		<summary type="html">&lt;p&gt;&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: &amp;#039;&amp;#039;,&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( &amp;#039;wgAction&amp;#039; );&lt;br /&gt;
		if ( action !== &amp;#039;view&amp;#039; ) {&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( &amp;#039;wgNamespaceNumber&amp;#039; );&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( &amp;#039;wgPageContentModel&amp;#039; );&lt;br /&gt;
		if ( model !== &amp;#039;wikitext&amp;#039; ) {&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 = &amp;#039;#mw-content-text &amp;gt; .mw-parser-output &amp;gt; p&amp;#039;;&lt;br /&gt;
		if ( mw.config.get( &amp;#039;skin&amp;#039; ) === &amp;#039;minerva&amp;#039; ) {&lt;br /&gt;
			selector = &amp;#039;#mw-content-text &amp;gt; .mw-parser-output &amp;gt; section &amp;gt; p&amp;#039;;&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;#039;&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;&amp;#039;;&lt;br /&gt;
		var icon = &amp;#039;&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;&amp;#039; + path + &amp;#039;&amp;lt;/svg&amp;gt;&amp;#039;;&lt;br /&gt;
		var $button = $( &amp;#039;&amp;lt;span class=&amp;quot;miniedit-button noprint&amp;quot;&amp;gt;&amp;#039; + icon + &amp;#039;&amp;lt;/span&amp;gt;&amp;#039; );&lt;br /&gt;
		$button.css( { &amp;#039;color&amp;#039;: &amp;#039;#a2a9b1&amp;#039;, &amp;#039;cursor&amp;#039;: &amp;#039;pointer&amp;#039; } );&lt;br /&gt;
		$button.on( &amp;#039;click&amp;#039;, 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&amp;#039;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( &amp;#039;mouseenter&amp;#039;, function () { $button.show(); } );&lt;br /&gt;
			$paragraph.on( &amp;#039;mouseleave&amp;#039;, function () { $button.hide(); } );&lt;br /&gt;
			$button.on( &amp;#039;mouseenter&amp;#039;, function () { $( this ).css( &amp;#039;color&amp;#039;, &amp;#039;#202122&amp;#039; ); } );&lt;br /&gt;
			$button.on( &amp;#039;mouseleave&amp;#039;, function () { $( this ).css( &amp;#039;color&amp;#039;, &amp;#039;#a2a9b1&amp;#039; ); } );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Add to the DOM&lt;br /&gt;
		$paragraph.append( &amp;#039; &amp;#039;, $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( &amp;#039;.miniedit-button&amp;#039; );&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( &amp;#039;.miniedit-button&amp;#039; ).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&amp;#039;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( &amp;#039;en&amp;#039; )&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&amp;#039;t exist yet&lt;br /&gt;
			// and because its success callback needs to run AFTER getMessages( &amp;#039;en&amp;#039; )&lt;br /&gt;
			var pageLanguage = mw.config.get( &amp;#039;wgPageContentLanguage&amp;#039; );&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( &amp;#039;:header&amp;#039; ).length : 0;&lt;br /&gt;
			var editUrl = mw.util.getUrl( null, { action: &amp;#039;edit&amp;#039;, 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: &amp;#039;wikitext&amp;#039;, 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: &amp;#039;summary&amp;#039;, placeholder: mw.msg( &amp;#039;miniedit-form-summary&amp;#039; ) } );&lt;br /&gt;
		var summaryLayout = new OO.ui.HorizontalLayout( { items: [ summaryInput ] } );&lt;br /&gt;
&lt;br /&gt;
		// Anons can&amp;#039;t mark edits as minor&lt;br /&gt;
		if ( !mw.user.isAnon() ) {&lt;br /&gt;
			var minorCheckbox = new OO.ui.CheckboxInputWidget( { name: &amp;#039;minor&amp;#039; } );&lt;br /&gt;
			var minorLayout = new OO.ui.FieldLayout( minorCheckbox, { label: mw.msg( &amp;#039;miniedit-form-minor&amp;#039; ), align: &amp;#039;inline&amp;#039; } );&lt;br /&gt;
			summaryLayout.addItems( [ minorLayout ] );&lt;br /&gt;
			summaryLayout.$element.find( &amp;#039;.oo-ui-fieldLayout&amp;#039; ).css( &amp;#039;vertical-align&amp;#039;, &amp;#039;text-bottom&amp;#039; ); // 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( &amp;#039;miniedit-form-publish&amp;#039; ), flags: [ &amp;#039;primary&amp;#039;, &amp;#039;progressive&amp;#039; ] } );&lt;br /&gt;
		var cancelButton = new OO.ui.ButtonInputWidget( { label: mw.msg( &amp;#039;miniedit-form-cancel&amp;#039; ), flags: &amp;#039;destructive&amp;#039;, 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( &amp;#039;overflow&amp;#039;, &amp;#039;hidden&amp;#039; );&lt;br /&gt;
		wikitextInput.$element.css( { &amp;#039;font-family&amp;#039;: &amp;#039;monospace&amp;#039;, &amp;#039;max-width&amp;#039;: &amp;#039;100%&amp;#039; } );&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( &amp;#039;click&amp;#039;, MiniEdit.onSubmit, [ $paragraph, $original, $form, wikitext, publishButton, cancelButton ] );&lt;br /&gt;
&lt;br /&gt;
		// Handle a cancel&lt;br /&gt;
		cancelButton.on( &amp;#039;click&amp;#039;, 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( &amp;#039;textarea[name=&amp;quot;wikitext&amp;quot;]&amp;#039; ).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&amp;#039;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( &amp;#039;input[name=&amp;quot;summary&amp;quot;]&amp;#039; ).val();&lt;br /&gt;
		var minor = $form.find( &amp;#039;input[name=&amp;quot;minor&amp;quot;]&amp;#039; ).prop( &amp;#039;checked&amp;#039; );&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, &amp;#039;\n\n&amp;#039; );&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;#039;\\$&amp;amp;&amp;#039; ); // Escape special characters&lt;br /&gt;
			oldWikitext = new RegExp( oldWikitext + &amp;#039;\n+&amp;#039; );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		MiniEdit.pageWikitext = MiniEdit.pageWikitext.replace( oldWikitext, newWikitext );&lt;br /&gt;
		var params = {&lt;br /&gt;
			&amp;#039;action&amp;#039;: &amp;#039;edit&amp;#039;,&lt;br /&gt;
			&amp;#039;title&amp;#039;: mw.config.get( &amp;#039;wgPageName&amp;#039; ),&lt;br /&gt;
			&amp;#039;text&amp;#039;: MiniEdit.pageWikitext,&lt;br /&gt;
			&amp;#039;minor&amp;#039;: minor,&lt;br /&gt;
			&amp;#039;summary&amp;#039;: MiniEdit.makeSummary( summary, $form, newWikitext ),&lt;br /&gt;
			&amp;#039;tags&amp;#039;: mw.config.get( &amp;#039;miniedit-tag&amp;#039; )&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;
			&amp;#039;action&amp;#039;: &amp;#039;parse&amp;#039;,&lt;br /&gt;
			&amp;#039;title&amp;#039;: mw.config.get( &amp;#039;wgPageName&amp;#039; ),&lt;br /&gt;
			&amp;#039;text&amp;#039;: newWikitext,&lt;br /&gt;
			&amp;#039;formatversion&amp;#039;: 2,&lt;br /&gt;
			&amp;#039;prop&amp;#039;: &amp;#039;text&amp;#039;,&lt;br /&gt;
			&amp;#039;disablelimitreport&amp;#039;: 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( &amp;#039;p&amp;#039; );&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;
			&amp;#039;page&amp;#039;: mw.config.get( &amp;#039;wgPageName&amp;#039; ),&lt;br /&gt;
			&amp;#039;action&amp;#039;: &amp;#039;parse&amp;#039;,&lt;br /&gt;
			&amp;#039;prop&amp;#039;: &amp;#039;wikitext&amp;#039;,&lt;br /&gt;
			&amp;#039;formatversion&amp;#039;: 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&amp;#039;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&amp;#039;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;#039;\\$&amp;amp;&amp;#039; ); // Escape special characters&lt;br /&gt;
		var regexp = new RegExp( &amp;#039;.*&amp;#039; + text + &amp;#039;.*&amp;#039;, &amp;#039;g&amp;#039; );&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 = &amp;#039;&amp;#039;;&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 ? &amp;#039;edit&amp;#039; : &amp;#039;delete&amp;#039;;&lt;br /&gt;
			summary = mw.msg( &amp;#039;miniedit-summary-&amp;#039; + action );&lt;br /&gt;
		}&lt;br /&gt;
		var $section = MiniEdit.getSection( $paragraph );&lt;br /&gt;
		if ( $section ) {&lt;br /&gt;
			var section = $section.find( &amp;#039;.mw-headline&amp;#039; ).attr( &amp;#039;id&amp;#039; ).replaceAll( &amp;#039;_&amp;#039;, &amp;#039; &amp;#039; );&lt;br /&gt;
			summary = &amp;#039;/* &amp;#039; + section + &amp;#039; */ &amp;#039; + summary;&lt;br /&gt;
		}&lt;br /&gt;
		var page = mw.config.get( &amp;#039;miniedit-page&amp;#039;, &amp;#039;mw:MiniEdit&amp;#039; );&lt;br /&gt;
		summary += &amp;#039; [[&amp;#039; + page + &amp;#039;| #MiniEdit]]&amp;#039;; // 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( &amp;#039;id&amp;#039; ) === &amp;#039;mw-content-text&amp;#039; ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if ( $element.is( &amp;#039;:header&amp;#039; ) ) {&lt;br /&gt;
			return $element;&lt;br /&gt;
		}&lt;br /&gt;
		var $previous = $element.prevAll( &amp;#039;:header&amp;#039; ).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;#039;&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;&amp;#039;;&lt;br /&gt;
		spinner += &amp;#039;&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;&amp;#039;;&lt;br /&gt;
		spinner += &amp;#039;&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;&amp;#039;;&lt;br /&gt;
		spinner += &amp;#039;&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;&amp;#039;;&lt;br /&gt;
		spinner += &amp;#039;&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;&amp;#039;;&lt;br /&gt;
		spinner += &amp;#039;&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;&amp;#039;;&lt;br /&gt;
		spinner += &amp;#039;&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;&amp;#039;;&lt;br /&gt;
		spinner += &amp;#039;&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;&amp;#039;;&lt;br /&gt;
		spinner += &amp;#039;&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;&amp;#039;;&lt;br /&gt;
		spinner += &amp;#039;&amp;lt;/svg&amp;gt;&amp;#039;;&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( &amp;#039;transform&amp;#039;, &amp;#039;rotate(&amp;#039; + degrees + &amp;#039;deg)&amp;#039; );&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( &amp;#039;&amp;#039; ).map( function ( character ) {&lt;br /&gt;
			return &amp;#039;%&amp;#039; + ( &amp;#039;00&amp;#039; + character.charCodeAt( 0 ).toString( 16 ) ).slice( -2 );&lt;br /&gt;
		} ).join( &amp;#039;&amp;#039; ) );&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
mw.loader.using( [&lt;br /&gt;
	&amp;#039;mediawiki.api&amp;#039;,&lt;br /&gt;
	&amp;#039;mediawiki.user&amp;#039;,&lt;br /&gt;
	&amp;#039;mediawiki.util&amp;#039;,&lt;br /&gt;
	&amp;#039;oojs-ui-core&amp;#039;,&lt;br /&gt;
	&amp;#039;oojs-ui-widgets&amp;#039;&lt;br /&gt;
], MiniEdit.init );&lt;/div&gt;</summary>
		<author><name>DGCK81LNN</name></author>
	</entry>
</feed>