<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://eurovision.jobogamer.xyz/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-Prosesize.js</id>
	<title>MediaWiki:Gadget-Prosesize.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://eurovision.jobogamer.xyz/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-Prosesize.js"/>
	<link rel="alternate" type="text/html" href="https://eurovision.jobogamer.xyz/index.php?title=MediaWiki:Gadget-Prosesize.js&amp;action=history"/>
	<updated>2026-05-20T19:38:08Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://eurovision.jobogamer.xyz/index.php?title=MediaWiki:Gadget-Prosesize.js&amp;diff=97&amp;oldid=prev</id>
		<title>Alfie: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://eurovision.jobogamer.xyz/index.php?title=MediaWiki:Gadget-Prosesize.js&amp;diff=97&amp;oldid=prev"/>
		<updated>2026-03-19T09:58:27Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&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;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 05:58, 19 March 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Alfie</name></author>
	</entry>
	<entry>
		<id>https://eurovision.jobogamer.xyz/index.php?title=MediaWiki:Gadget-Prosesize.js&amp;diff=96&amp;oldid=prev</id>
		<title>en&gt;Galobtter: fix</title>
		<link rel="alternate" type="text/html" href="https://eurovision.jobogamer.xyz/index.php?title=MediaWiki:Gadget-Prosesize.js&amp;diff=96&amp;oldid=prev"/>
		<updated>2024-08-18T20:02:54Z</updated>

		<summary type="html">&lt;p&gt;fix&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/*  _____________________________________________________________________________&lt;br /&gt;
 * |                                                                             |&lt;br /&gt;
 * |                    === WARNING: GLOBAL GADGET FILE ===                      |&lt;br /&gt;
 * |                  Changes to this page affect many users.                    |&lt;br /&gt;
 * | Please discuss changes on the talk page or on [[WT:Gadget]] before editing. |&lt;br /&gt;
 * |_____________________________________________________________________________|&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
/**&lt;br /&gt;
 * Prosesize&lt;br /&gt;
 * Documentation at en.wikipedia.org/wiki/Wikipedia:Prosesize&lt;br /&gt;
 * Rewrite of [[User:Dr_pda/prosesize.js]].&lt;br /&gt;
*/&lt;br /&gt;
&amp;#039;use strict&amp;#039;;&lt;br /&gt;
( function () {&lt;br /&gt;
	function sizeFormatter( size ) {&lt;br /&gt;
		var nbsp = &amp;quot;\xA0&amp;quot;; // Equivalent to &amp;amp;nbsp;&lt;br /&gt;
		if ( size &amp;gt; 10240 ) {&lt;br /&gt;
			return ( Math.round( size / 1024 ) + nbsp + &amp;#039;kB&amp;#039; );&lt;br /&gt;
		} else {&lt;br /&gt;
			return ( size + nbsp + &amp;#039;B&amp;#039; );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function sizeElement( id, text, size, extraText ) {&lt;br /&gt;
		return $( &amp;#039;&amp;lt;li&amp;gt;&amp;#039; )&lt;br /&gt;
			.prop( &amp;#039;id&amp;#039;, id )&lt;br /&gt;
			.append(&lt;br /&gt;
				$( &amp;#039;&amp;lt;b&amp;gt;&amp;#039; ).text( text ),&lt;br /&gt;
				document.createTextNode( &amp;#039; &amp;#039; + sizeFormatter( size ) + ( extraText || &amp;#039;&amp;#039; ) )&lt;br /&gt;
			);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getRevisionSize( proseValue ) {&lt;br /&gt;
		var Api = new mw.Api();&lt;br /&gt;
		function appendResult( size ) {&lt;br /&gt;
			var wikiValue = sizeElement( &amp;#039;wiki-size&amp;#039;, &amp;#039;Wiki text:&amp;#039;, size );&lt;br /&gt;
			proseValue.before( wikiValue );&lt;br /&gt;
		}&lt;br /&gt;
		if ( mw.config.get( &amp;#039;wgAction&amp;#039; ) === &amp;#039;submit&amp;#039; ) {&lt;br /&gt;
			// Get size of text in edit box&lt;br /&gt;
			// eslint-disable-next-line no-jquery/no-global-selector&lt;br /&gt;
			appendResult( $( &amp;#039;#wpTextbox1&amp;#039; ).textSelection( &amp;#039;getContents&amp;#039; ).length );&lt;br /&gt;
		} else if ( mw.config.get( &amp;#039;wgIsArticle&amp;#039; ) ) {&lt;br /&gt;
			// Get revision size from API&lt;br /&gt;
			Api.get( {&lt;br /&gt;
				action: &amp;#039;query&amp;#039;,&lt;br /&gt;
				prop: &amp;#039;revisions&amp;#039;,&lt;br /&gt;
				rvprop: &amp;#039;size&amp;#039;,&lt;br /&gt;
				revids: mw.config.get( &amp;#039;wgRevisionId&amp;#039; ),&lt;br /&gt;
				formatversion: 2&lt;br /&gt;
			} ).then( function ( result ) {&lt;br /&gt;
				appendResult( result.query.pages[ 0 ].revisions[ 0 ].size );&lt;br /&gt;
			} );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getFileSize( proseHtmlValue ) {&lt;br /&gt;
		// HTML document size not well defined for preview mode or section edit&lt;br /&gt;
		if ( mw.config.get( &amp;#039;wgAction&amp;#039; ) !== &amp;#039;submit&amp;#039; ) {&lt;br /&gt;
			$.get( location ).then( function ( result ) {&lt;br /&gt;
				var fsize = sizeElement( &amp;#039;total-size&amp;#039;, &amp;#039;HTML document size:&amp;#039;, result.length );&lt;br /&gt;
				proseHtmlValue.before( fsize );&lt;br /&gt;
			} );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getLength( id ) {&lt;br /&gt;
		var i;&lt;br /&gt;
		var textLength = 0;&lt;br /&gt;
		for ( i = 0; i &amp;lt; id.childNodes.length; i++ ) {&lt;br /&gt;
			if ( id.childNodes[ i ].nodeType === Node.TEXT_NODE ) {&lt;br /&gt;
				textLength += id.childNodes[ i ].nodeValue.length;&lt;br /&gt;
			} else if (&lt;br /&gt;
				id.childNodes[ i ].nodeType === Node.ELEMENT_NODE &amp;amp;&amp;amp;&lt;br /&gt;
				( id.childNodes[ i ].id === &amp;#039;coordinates&amp;#039; || id.childNodes[ i ].className.indexOf( &amp;#039;emplate&amp;#039; ) !== -1 )&lt;br /&gt;
			) {&lt;br /&gt;
				// special case for {{coord}} and {{fact}}-like templates&lt;br /&gt;
				// Exclude from length, and don&amp;#039;t set background yellow&lt;br /&gt;
				id.childNodes[ i ].className += &amp;#039; prosesize-special-template&amp;#039;;&lt;br /&gt;
            } else if (id.childNodes[ i ].tagName !== &amp;#039;STYLE&amp;#039;) {&lt;br /&gt;
                // Exclude style tags&lt;br /&gt;
				textLength += getLength( id.childNodes[ i ] );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return textLength;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getRefMarkLength( id, html ) {&lt;br /&gt;
		var i;&lt;br /&gt;
		var textLength = 0;&lt;br /&gt;
		for ( i = 0; i &amp;lt; id.childNodes.length; i++ ) {&lt;br /&gt;
			if (&lt;br /&gt;
				id.childNodes[ i ].nodeType === Node.ELEMENT_NODE &amp;amp;&amp;amp;&lt;br /&gt;
				id.childNodes[ i ].className === &amp;#039;reference&amp;#039;&lt;br /&gt;
			) {&lt;br /&gt;
				textLength += ( html ) ?&lt;br /&gt;
					id.childNodes[ i ].innerHTML.length :&lt;br /&gt;
					getLength( id.childNodes[ i ] );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return textLength;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function main() {&lt;br /&gt;
		var prosePromise, proseValue, refValue, refHtmlValue, proseHtmlValue;&lt;br /&gt;
		// eslint-disable-next-line no-jquery/no-global-selector&lt;br /&gt;
		var parserOutput = $( &amp;#039;#mw-content-text .mw-parser-output&amp;#039; );&lt;br /&gt;
		// eslint-disable-next-line no-jquery/no-global-selector&lt;br /&gt;
		var prevStats = $( &amp;#039;#document-size-stats&amp;#039; );&lt;br /&gt;
		// eslint-disable-next-line no-jquery/no-global-selector&lt;br /&gt;
		var prevHeader = $( &amp;#039;#document-size-header&amp;#039; );&lt;br /&gt;
		var proseSize = 0;&lt;br /&gt;
		var proseSizeHtml = 0;&lt;br /&gt;
		var refmarksize = 0;&lt;br /&gt;
		var refmarkSizeHtml = 0;&lt;br /&gt;
		var wordCount = 0;&lt;br /&gt;
		var refSize = 0;&lt;br /&gt;
		var refSizeHtml = 0;&lt;br /&gt;
		var header = $( &amp;#039;&amp;lt;span&amp;gt;&amp;#039; )&lt;br /&gt;
			.prop( &amp;#039;id&amp;#039;, &amp;#039;document-size-header&amp;#039; )&lt;br /&gt;
			.html( &amp;#039;Document statistics &amp;lt;small&amp;gt;(&amp;lt;a href=&amp;quot;//en.wikipedia.org/wiki/Wikipedia:Prosesize&amp;quot;&amp;gt;more information&amp;lt;/a&amp;gt;)&amp;lt;/small&amp;gt;:&amp;#039; );&lt;br /&gt;
		var output = $( &amp;#039;&amp;lt;ul&amp;gt;&amp;#039; )&lt;br /&gt;
			.prop( &amp;#039;id&amp;#039;, &amp;#039;document-size-stats&amp;#039; );&lt;br /&gt;
		var combined = $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; )&lt;br /&gt;
			.prop( &amp;#039;id&amp;#039;, &amp;#039;document-size&amp;#039; )&lt;br /&gt;
			.append( header, output );&lt;br /&gt;
		if ( parserOutput.length === 0 ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if ( prevStats.length ) {&lt;br /&gt;
			// If statistics already exist, turn them off and remove highlighting&lt;br /&gt;
			prevStats.remove();&lt;br /&gt;
			prevHeader.remove();&lt;br /&gt;
			parserOutput.children( &amp;#039;p&amp;#039; ).removeClass( &amp;#039;prosesize-highlight&amp;#039; );&lt;br /&gt;
		} else {&lt;br /&gt;
			// Use prosesize API to get a more accurate prose size account&lt;br /&gt;
			// The calculations below are left in for the highlighting&lt;br /&gt;
			prosePromise = $.getJSON( &amp;#039;https://prosesize.toolforge.org/api/&amp;#039; + mw.config.get( &amp;#039;wgServerName&amp;#039; ) + &amp;#039;/&amp;#039;&lt;br /&gt;
				+ encodeURIComponent( mw.config.get( &amp;#039;wgPageName&amp;#039; ) ) + &amp;#039;?revision=&amp;#039; + mw.config.get( &amp;#039;wgRevisionId&amp;#039; ) );&lt;br /&gt;
&lt;br /&gt;
			// Calculate prose size and size of reference markers ([1] etc)&lt;br /&gt;
			parserOutput.children( &amp;#039;p&amp;#039; ).each( function () {&lt;br /&gt;
				$( this ).addClass( &amp;#039;prosesize-highlight&amp;#039; );&lt;br /&gt;
				proseSize += getLength( this );&lt;br /&gt;
				proseSizeHtml += this.innerHTML.length;&lt;br /&gt;
				refmarksize += getRefMarkLength( this, false );&lt;br /&gt;
				refmarkSizeHtml += getRefMarkLength( this, true );&lt;br /&gt;
				wordCount += this.innerHTML.replace( /(&amp;lt;([^&amp;gt;]+)&amp;gt;)/ig, &amp;#039;&amp;#039; ).split( &amp;#039; &amp;#039; ).length;&lt;br /&gt;
			} );&lt;br /&gt;
&lt;br /&gt;
			// Calculate size of references (i.e. output of &amp;lt;references/&amp;gt;)&lt;br /&gt;
			parserOutput.find( &amp;#039;ol.references&amp;#039; ).each( function () {&lt;br /&gt;
				refSize = getLength( this );&lt;br /&gt;
				refSizeHtml = this.innerHTML.length;&lt;br /&gt;
			} );&lt;br /&gt;
			&lt;br /&gt;
			proseSize -= refmarksize;&lt;br /&gt;
			&lt;br /&gt;
			function show_output() {&lt;br /&gt;
				proseValue = sizeElement( &amp;#039;prose-size&amp;#039;, &amp;#039;Prose size (text only):&amp;#039;, proseSize, &amp;#039; (&amp;#039; + wordCount + &amp;#039; words) &amp;quot;readable prose size&amp;quot;&amp;#039; );&lt;br /&gt;
				refValue = sizeElement( &amp;#039;ref-size&amp;#039;, &amp;#039;References (text only):&amp;#039;, refSize + refmarksize );&lt;br /&gt;
				refHtmlValue = sizeElement( &amp;#039;ref-size-html&amp;#039;, &amp;#039;References (including all HTML code):&amp;#039;, refSizeHtml + refmarkSizeHtml );&lt;br /&gt;
				proseHtmlValue = sizeElement( &amp;#039;prose-size-html&amp;#039;, &amp;#039;Prose size (including all HTML code):&amp;#039;, proseSizeHtml - refmarkSizeHtml );&lt;br /&gt;
				output.append( proseHtmlValue, refHtmlValue, proseValue, refValue );&lt;br /&gt;
				parserOutput.prepend( combined );&lt;br /&gt;
				getFileSize( proseHtmlValue );&lt;br /&gt;
				getRevisionSize( proseValue );&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			// Add the relevant outputs once we have fetched the prose size.&lt;br /&gt;
			prosePromise.then(&lt;br /&gt;
				function( data ) {&lt;br /&gt;
					if ( mw.config.get( &amp;#039;wgIsArticle&amp;#039; ) ) {&lt;br /&gt;
						// Tool doesn&amp;#039;t work on previews&lt;br /&gt;
						proseSize = data.prose_size;&lt;br /&gt;
						wordCount = data.word_count;&lt;br /&gt;
				    }&lt;br /&gt;
					show_output();&lt;br /&gt;
				},&lt;br /&gt;
				// If tool is down fallback to our prose count&lt;br /&gt;
				show_output&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (&lt;br /&gt;
		!mw.config.get( &amp;#039;wgCanonicalSpecialPageName&amp;#039; )&lt;br /&gt;
	) {&lt;br /&gt;
		$.ready.then( function () {&lt;br /&gt;
			/**&lt;br /&gt;
			 * Depending on whether in edit mode or preview/view mode,&lt;br /&gt;
			 * show the approppiate response upon clicking the portlet link&lt;br /&gt;
			*/&lt;br /&gt;
			var func, $portlet, notEnabled = false;&lt;br /&gt;
			if (&lt;br /&gt;
				mw.config.get( &amp;#039;wgAction&amp;#039; ) === &amp;#039;edit&amp;#039; ||&lt;br /&gt;
				( mw.config.get( &amp;#039;wgAction&amp;#039; ) === &amp;#039;submit&amp;#039; &amp;amp;&amp;amp; document.getElementById( &amp;#039;wikiDiff&amp;#039; ) )&lt;br /&gt;
			) {&lt;br /&gt;
				notEnabled = true;&lt;br /&gt;
				func = function () {&lt;br /&gt;
					mw.notify( &amp;#039;You need to preview the text for the prose size script to work in edit mode.&amp;#039; );&lt;br /&gt;
				};&lt;br /&gt;
			} else if ( [ &amp;#039;view&amp;#039;, &amp;#039;submit&amp;#039;, &amp;#039;historysubmit&amp;#039;, &amp;#039;purge&amp;#039; ].indexOf( mw.config.get( &amp;#039;wgAction&amp;#039; ) ) !== -1 ) {&lt;br /&gt;
				func = main;&lt;br /&gt;
			}&lt;br /&gt;
			if ( func ) {&lt;br /&gt;
				$portlet = $( mw.util.addPortletLink( &amp;#039;p-tb&amp;#039;, &amp;#039;#&amp;#039;, &amp;#039;Page size&amp;#039;, &amp;#039;t-page-size&amp;#039;, &amp;#039;Calculate page and prose size&amp;#039; ) );&lt;br /&gt;
				if ( notEnabled ) {&lt;br /&gt;
					$portlet.addClass( &amp;#039;prosesize-portlet-link-edit-mode&amp;#039; );&lt;br /&gt;
				}&lt;br /&gt;
				$portlet.on( &amp;#039;click&amp;#039;, function ( e ) {&lt;br /&gt;
					e.preventDefault();&lt;br /&gt;
					if ( window.ve &amp;amp;&amp;amp; ve.init &amp;amp;&amp;amp; ve.init.target &amp;amp;&amp;amp; ve.init.target.active ) {&lt;br /&gt;
						mw.notify( &amp;#039;Prosesize does not work with the Visual Editor.&amp;#039; );&lt;br /&gt;
					} else {&lt;br /&gt;
						func();&lt;br /&gt;
					}&lt;br /&gt;
				} );&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>en&gt;Galobtter</name></author>
	</entry>
</feed>