<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.rvlt.gg/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ATextCleaner.js</id>
	<title>MediaWiki:TextCleaner.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.rvlt.gg/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ATextCleaner.js"/>
	<link rel="alternate" type="text/html" href="https://wiki.rvlt.gg/index.php?title=MediaWiki:TextCleaner.js&amp;action=history"/>
	<updated>2026-05-05T10:46:14Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.3</generator>
	<entry>
		<id>https://wiki.rvlt.gg/index.php?title=MediaWiki:TextCleaner.js&amp;diff=356&amp;oldid=prev</id>
		<title>Insert: Created page with &quot;/** Wikitext sanitation for MediaWiki  Author: User:Lupo, January 2008 License: Quadruple licensed GFDL, GPL, LGPL and Creative Commons Attribution 3.0 (CC-BY-3.0)  Choose whichever license of these you like best :-) */ // &lt;nowiki&gt; /* global mw:false, TextCleaner:true */ /* eslint no-control-regex:0, one-var:0, vars-on-top:0, camelcase:0, curly:0, space-in-parens:0, computed-property-spacing:0, array-bracket-spacing:0 */ /* jshint curly:false, eqnull:true, laxbreak:t...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.rvlt.gg/index.php?title=MediaWiki:TextCleaner.js&amp;diff=356&amp;oldid=prev"/>
		<updated>2023-01-06T18:17:38Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;* Wikitext sanitation for MediaWiki  Author: &lt;a href=&quot;/index.php?title=User:Lupo&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:Lupo (page does not exist)&quot;&gt;User:Lupo&lt;/a&gt;, January 2008 License: Quadruple licensed GFDL, GPL, LGPL and Creative Commons Attribution 3.0 (CC-BY-3.0)  Choose whichever license of these you like best :-): &lt;/span&gt; // &amp;lt;nowiki&amp;gt; &lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;global mw:false, TextCleaner:true: &lt;/span&gt; &lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;eslint no-control-regex:0, one-var:0, vars-on-top:0, camelcase:0, curly:0, space-in-parens:0, computed-property-spacing:0, array-bracket-spacing:0: &lt;/span&gt; /* jshint curly:false, eqnull:true, laxbreak:t...&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Páàjì titun&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/**&lt;br /&gt;
Wikitext sanitation for MediaWiki&lt;br /&gt;
&lt;br /&gt;
Author: [[User:Lupo]], January 2008&lt;br /&gt;
License: Quadruple licensed GFDL, GPL, LGPL and Creative Commons Attribution 3.0 (CC-BY-3.0)&lt;br /&gt;
&lt;br /&gt;
Choose whichever license of these you like best :-)&lt;br /&gt;
*/&lt;br /&gt;
// &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/* global mw:false, TextCleaner:true */&lt;br /&gt;
/* eslint no-control-regex:0, one-var:0, vars-on-top:0, camelcase:0, curly:0, space-in-parens:0, computed-property-spacing:0, array-bracket-spacing:0 */&lt;br /&gt;
/* jshint curly:false, eqnull:true, laxbreak:true */&lt;br /&gt;
(function () {&lt;br /&gt;
&amp;#039;use strict&amp;#039;;&lt;br /&gt;
window.TextCleaner = {&lt;br /&gt;
&lt;br /&gt;
	imgNamespaceNames: null,&lt;br /&gt;
&lt;br /&gt;
// This function attempts to construct well-formed wikitext from input that may contain&lt;br /&gt;
// possibly broken wikitext.&lt;br /&gt;
//&lt;br /&gt;
// Note: even just a half-baked sanitation of wikitext is hyper-complex due to the presence&lt;br /&gt;
// of templates, and due to the fact that image thumbnail captions may themselves contain&lt;br /&gt;
// links. This implementation catches the most common errors (such as forgetting to close a&lt;br /&gt;
// template or a link), and even some more elaborate ones. With enough malice, this sanitation&lt;br /&gt;
// can still be broken by user input such that the result is not well-formed wikitext as the&lt;br /&gt;
// parser at the servers would like to have it. (It&amp;#039;s still possible that the result is broken&lt;br /&gt;
// wikitext, if the input was broken wikitext. But it never transforms well-formed wikitext&lt;br /&gt;
// into broken wikitext.)&lt;br /&gt;
//&lt;br /&gt;
// If &amp;#039;only_thumbs&amp;#039; is true, all [[Image: links are changed to [[:Image:, unless the original&lt;br /&gt;
// image link was a thumbnail or had a width smaller than 300px specified.&lt;br /&gt;
//&lt;br /&gt;
// WARNING: do *not* attempt to use this to process large texts (e.g., a whole article). It is&lt;br /&gt;
// probably rather inefficient due to the many substrings that are generated. This function is&lt;br /&gt;
// primarily intended to be used to clean up user input in forms, which are typically rather&lt;br /&gt;
// short.&lt;br /&gt;
	sanitizeWikiText: function (input, only_thumbs) {&lt;br /&gt;
		if (input.search(/[\][}{]|&amp;lt;nowiki(\s[^&amp;gt;]*)?&amp;gt;|&amp;lt;!--/) &amp;lt; 0)&lt;br /&gt;
			return input;&lt;br /&gt;
	// No critical characters&lt;br /&gt;
&lt;br /&gt;
		if (!TextCleaner.imgNamespaceNames) {&lt;br /&gt;
			TextCleaner.imgNamespaceNames = [];&lt;br /&gt;
			var namespaceIds = mw.config.get(&amp;#039;wgNamespaceIds&amp;#039;);&lt;br /&gt;
			if (namespaceIds) {&lt;br /&gt;
				for (var name in namespaceIds) {&lt;br /&gt;
					if (namespaceIds[name] === 6) // Image namespace&lt;br /&gt;
						TextCleaner.imgNamespaceNames.push(name);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		// Make sure that we have the two canonical names&lt;br /&gt;
			TextCleaner.imgNamespaceNames.push(&amp;#039;Image&amp;#039;);&lt;br /&gt;
			TextCleaner.imgNamespaceNames.push(&amp;#039;File&amp;#039;);&lt;br /&gt;
		// If your Wiki does not have wgNamespaceIds, add aliases or localized namespace names here!&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var consumed = [0, 0];&lt;br /&gt;
	// For image captions. Image caption may contain links, and may even contain images.&lt;br /&gt;
	// The current MediaWiki parser actually allows this only once. For deeper recursions,&lt;br /&gt;
	// it fails. But here, it&amp;#039;s actually easier to implement no limit.&lt;br /&gt;
&lt;br /&gt;
		var base_regexp = new RegExp(&amp;#039;[\\x01\\x02\\x03\\x04[\\]\\|\\x05\\x06\\x07\\x08]&amp;#039; +&lt;br /&gt;
			&amp;#039;|&amp;lt;nowiki(\\s[^&amp;gt;]*)?&amp;gt;|&amp;lt;!--&amp;#039;,&lt;br /&gt;
		&amp;#039;i&amp;#039;); // Ignore case&lt;br /&gt;
		var nowiki_regexp = new RegExp(&amp;#039;&amp;lt;\\/nowiki(\\s[^&amp;gt;]*)?&amp;gt;|&amp;lt;!--&amp;#039;, &amp;#039;i&amp;#039;);&lt;br /&gt;
		var allow_only_thumbs = only_thumbs;&lt;br /&gt;
&lt;br /&gt;
		function sanitize(s, with_links, caption_level, allow_thumbs, break_at_pipe, with_tables, with_galleries) {&lt;br /&gt;
			if (!s || !s.length) {&lt;br /&gt;
				if (caption_level &amp;gt; 0) {&lt;br /&gt;
					if (consumed.length &amp;lt; caption_level)&lt;br /&gt;
						consumed.push(0);&lt;br /&gt;
					else&lt;br /&gt;
						consumed[caption_level - 1] = 0;&lt;br /&gt;
				}&lt;br /&gt;
				return s;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var result = &amp;#039;&amp;#039;;&lt;br /&gt;
			var ch = &amp;#039;&amp;#039;;&lt;br /&gt;
			var initial_length = s.length;&lt;br /&gt;
			var get_out = false;&lt;br /&gt;
			var in_nowiki = false;&lt;br /&gt;
			var endings = null;&lt;br /&gt;
		// Stack recording template and table nesting&lt;br /&gt;
			var next;&lt;br /&gt;
			var regexp = base_regexp;&lt;br /&gt;
&lt;br /&gt;
			function push_end(val) {&lt;br /&gt;
				if (!endings)&lt;br /&gt;
					endings = [val];&lt;br /&gt;
				else&lt;br /&gt;
					endings.push(val);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			function pop_end() {&lt;br /&gt;
				if (!endings)&lt;br /&gt;
					return null; // Shouldn&amp;#039;t happen&lt;br /&gt;
				var result;&lt;br /&gt;
				if (endings.length === 1) {&lt;br /&gt;
					result = endings[0];&lt;br /&gt;
					endings = null;&lt;br /&gt;
				} else {&lt;br /&gt;
					result = endings[endings.length - 1];&lt;br /&gt;
					endings.length--;&lt;br /&gt;
				}&lt;br /&gt;
				return result;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			function get_initial(i, s) {&lt;br /&gt;
				for (var j = 0; j &amp;lt; TextCleaner.imgNamespaceNames.length; j++) {&lt;br /&gt;
					if (s.length &amp;gt;= i + TextCleaner.imgNamespaceNames[j].length + 1) {&lt;br /&gt;
						var t = s.substr(i, TextCleaner.imgNamespaceNames[j].length + 1);&lt;br /&gt;
						if (t.toLowerCase() === (TextCleaner.imgNamespaceNames[j].toLowerCase() + &amp;#039;:&amp;#039;))&lt;br /&gt;
							return t;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				return null;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			while (s.length &amp;gt; 0 &amp;amp;&amp;amp; !get_out) {&lt;br /&gt;
				next = s.search(regexp);&lt;br /&gt;
				if (next &amp;lt; 0) {&lt;br /&gt;
					result += s;&lt;br /&gt;
					break;&lt;br /&gt;
				}&lt;br /&gt;
				ch = s.charAt(next);&lt;br /&gt;
				var i = -1;&lt;br /&gt;
				var j = -1;&lt;br /&gt;
				var k = -1;&lt;br /&gt;
				switch (ch) {&lt;br /&gt;
					case &amp;#039;&amp;lt;&amp;#039;:&lt;br /&gt;
				// Nowiki or HTML comment. Must be closed.&lt;br /&gt;
						if (s.charAt(next + 1) === &amp;#039;!&amp;#039;) {&lt;br /&gt;
					// HTML comment. Cannot be nested.&lt;br /&gt;
							i = s.indexOf(&amp;#039;--&amp;gt;&amp;#039;, next + 3);&lt;br /&gt;
							if (i &amp;lt; 0) {&lt;br /&gt;
								result += s + &amp;#039;--&amp;gt;&amp;#039;;&lt;br /&gt;
								s = &amp;#039;&amp;#039;;&lt;br /&gt;
							} else {&lt;br /&gt;
								result += s.substring(0, i + 3);&lt;br /&gt;
								s = s.substring(i + 3);&lt;br /&gt;
							}&lt;br /&gt;
						} else if (s.charAt(next + 1) === &amp;#039;n&amp;#039;) {&lt;br /&gt;
					// Nowiki may contain HTML comments!&lt;br /&gt;
							in_nowiki = true;&lt;br /&gt;
							regexp = nowiki_regexp;&lt;br /&gt;
							result += s.substring(0, next + 7);&lt;br /&gt;
							s = s.substring(next + 7);&lt;br /&gt;
						} else {&lt;br /&gt;
					// End of nowiki. Searched for and found only if in_nowiki === true&lt;br /&gt;
							in_nowiki = false;&lt;br /&gt;
							regexp = base_regexp;&lt;br /&gt;
							i = s.indexOf(&amp;#039;&amp;gt;&amp;#039;, next + 1); // End of tag&lt;br /&gt;
							result += s.substring(0, i + 1);&lt;br /&gt;
							s = s.substring(i + 1);&lt;br /&gt;
						}&lt;br /&gt;
						break;&lt;br /&gt;
					case &amp;#039;\x05&amp;#039;:&lt;br /&gt;
				// Table start&lt;br /&gt;
						if (!with_tables) {&lt;br /&gt;
							result += s.substring(0, next);&lt;br /&gt;
							get_out = true;&lt;br /&gt;
							break;&lt;br /&gt;
						}&lt;br /&gt;
				/* fall through */&lt;br /&gt;
					case &amp;#039;\x07&amp;#039;:&lt;br /&gt;
						if (ch === &amp;#039;\x07&amp;#039; &amp;amp;&amp;amp; !with_galleries) {&lt;br /&gt;
							result += s.substring(0, next);&lt;br /&gt;
							get_out = true;&lt;br /&gt;
							break;&lt;br /&gt;
						}&lt;br /&gt;
				/* fall through */&lt;br /&gt;
					case &amp;#039;\x01&amp;#039;:&lt;br /&gt;
				// Start of template, table, or gallery&lt;br /&gt;
						result += s.substring(0, next + 1);&lt;br /&gt;
						push_end(String.fromCharCode(ch.charCodeAt(0) + 1).charAt(0));&lt;br /&gt;
						s = s.substring(next + 1);&lt;br /&gt;
						break;&lt;br /&gt;
					case &amp;#039;\x06&amp;#039;:&lt;br /&gt;
				// Table end&lt;br /&gt;
						if (break_at_pipe &amp;amp;&amp;amp; !endings) {&lt;br /&gt;
							result += s.substring(0, next);&lt;br /&gt;
							get_out = true;&lt;br /&gt;
							break;&lt;br /&gt;
						}&lt;br /&gt;
				/* fall through */&lt;br /&gt;
					case &amp;#039;\x02&amp;#039;:&lt;br /&gt;
				// End of a template or table&lt;br /&gt;
						result += s.substring(0, next);&lt;br /&gt;
						if (!endings || endings[endings.length - 1] !== ch) {&lt;br /&gt;
					// Spurious template or table end&lt;br /&gt;
							if (ch === &amp;#039;\x02&amp;#039;)&lt;br /&gt;
								result += &amp;#039;&amp;amp;#x7D;&amp;amp;#x7D;&amp;#039;;&lt;br /&gt;
							else&lt;br /&gt;
								result += &amp;#039;&amp;amp;#x7C;&amp;amp;#x7D;&amp;#039;;&lt;br /&gt;
						} else {&lt;br /&gt;
							result += pop_end();&lt;br /&gt;
						}&lt;br /&gt;
						s = s.substring(next + 1);&lt;br /&gt;
						break;&lt;br /&gt;
					case &amp;#039;\x08&amp;#039;:&lt;br /&gt;
				// End of gallery&lt;br /&gt;
						result += s.substring(0, next + 1);&lt;br /&gt;
						if (endings &amp;amp;&amp;amp; endings[endings.length - 1] === ch)&lt;br /&gt;
							pop_end();&lt;br /&gt;
						s = s.substring(next + 1);&lt;br /&gt;
						break;&lt;br /&gt;
					case &amp;#039;\x03&amp;#039;:&lt;br /&gt;
					case &amp;#039;[&amp;#039;: {&lt;br /&gt;
						if (!with_links &amp;amp;&amp;amp; !endings) {&lt;br /&gt;
							get_out = true;&lt;br /&gt;
							break;&lt;br /&gt;
						}&lt;br /&gt;
					// Image links must be treated specially, since they may contain nested links&lt;br /&gt;
					// in the caption!&lt;br /&gt;
						var initial = null; // If set, it&amp;#039;s &amp;#039;image:&amp;#039; or &amp;#039;file:&amp;#039; and we have an image link&lt;br /&gt;
						i = next;&lt;br /&gt;
						while (i &amp;lt; s.length &amp;amp;&amp;amp; s.charAt(i) === ch)&lt;br /&gt;
							i++;&lt;br /&gt;
						if (ch === &amp;#039;\x03&amp;#039; &amp;amp;&amp;amp; i &amp;lt; s.length &amp;amp;&amp;amp; s.charAt(i) === &amp;#039;[&amp;#039;)&lt;br /&gt;
							i++;&lt;br /&gt;
						initial = get_initial(i, s);&lt;br /&gt;
&lt;br /&gt;
					// Scan ahead. We&amp;#039;ll break at the next top-level | or ] or ]] or [ or [[ or {| or |}&lt;br /&gt;
						var lk_text = sanitize(s.substring(i),&lt;br /&gt;
							false, // No links at top-level allowed&lt;br /&gt;
							caption_level + 1,&lt;br /&gt;
							false, // No thumbs&lt;br /&gt;
							true, // Break at pipe&lt;br /&gt;
							false, // No tables&lt;br /&gt;
							false); // No galleries&lt;br /&gt;
						var lk_text_length = consumed[caption_level];&lt;br /&gt;
						j = i + lk_text_length;&lt;br /&gt;
						if (j &amp;gt;= s.length) {&lt;br /&gt;
						// Used up the whole text: [[Foo or [bar&lt;br /&gt;
							if (initial &amp;amp;&amp;amp; allow_only_thumbs) {&lt;br /&gt;
							// Should in any case have started with [[, not [&lt;br /&gt;
&lt;br /&gt;
								result += s.substring(0, i - 1) + &amp;#039;\x03:&amp;#039; + initial +&lt;br /&gt;
							lk_text.substring(initial.length) + &amp;#039;\x04&amp;#039;;&lt;br /&gt;
							} else {&lt;br /&gt;
								result += s.substring(0, i) + lk_text +&lt;br /&gt;
							((s.charAt(i - 1) === &amp;#039;[&amp;#039;) ? &amp;#039;]&amp;#039; : &amp;#039;\x04&amp;#039;);&lt;br /&gt;
							}&lt;br /&gt;
							s = &amp;#039;&amp;#039;;&lt;br /&gt;
							break;&lt;br /&gt;
						}&lt;br /&gt;
						if (s.charAt(j) === &amp;#039;|&amp;#039;)&lt;br /&gt;
							k = j;&lt;br /&gt;
						else&lt;br /&gt;
							k = -1;&lt;br /&gt;
						if (k &amp;lt; 0) {&lt;br /&gt;
						// No pipe found: we should be on the closing ]] or ] or [[Foo]] or [bar]&lt;br /&gt;
							if (initial &amp;amp;&amp;amp; allow_only_thumbs) {&lt;br /&gt;
							// Should in any case have started with [[, not [&lt;br /&gt;
								result += s.substring(0, i - 1) + &amp;#039;\x03:&amp;#039; + initial +&lt;br /&gt;
							lk_text.substring(initial.length) + &amp;#039;\x04&amp;#039;;&lt;br /&gt;
							} else {&lt;br /&gt;
								result += s.substring(0, i) + lk_text +&lt;br /&gt;
							((s.charAt(i - 1) === &amp;#039;[&amp;#039;) ? &amp;#039;]&amp;#039; : &amp;#039;\x04&amp;#039;);&lt;br /&gt;
							}&lt;br /&gt;
							if (s.charAt(j) === &amp;#039;]&amp;#039; || s.charAt(j) === &amp;#039;\x04&amp;#039;) {&lt;br /&gt;
							// Indeed closing the link&lt;br /&gt;
								s = s.substring(j + 1);&lt;br /&gt;
							} else {&lt;br /&gt;
								s = s.substring(j);&lt;br /&gt;
							}&lt;br /&gt;
							break;&lt;br /&gt;
						} else {&lt;br /&gt;
							var caption = null;&lt;br /&gt;
							var used = 0;&lt;br /&gt;
						// Pipe found.&lt;br /&gt;
							if (!initial) {&lt;br /&gt;
							// Not an image link. Must be something like [[Foo|Bar]].&lt;br /&gt;
								caption = sanitize(&lt;br /&gt;
									s.substring(k + 1),&lt;br /&gt;
									// No links, please&lt;br /&gt;
									false,&lt;br /&gt;
									caption_level + 1,&lt;br /&gt;
									// No thumbs either&lt;br /&gt;
									false,&lt;br /&gt;
									// Don&amp;#039;t care about pipes&lt;br /&gt;
									false,&lt;br /&gt;
									// Allow tables (yes, parser allows that!)&lt;br /&gt;
									true,&lt;br /&gt;
									// Allow galleries (?)&lt;br /&gt;
									true);&lt;br /&gt;
							// Now we&amp;#039;re at [[, [, ]], or ]&lt;br /&gt;
								used = consumed[caption_level];&lt;br /&gt;
								result += s.substring(0, i) + lk_text + &amp;#039;|&amp;#039; + caption +&lt;br /&gt;
							((s.charAt(i - 1) === &amp;#039;[&amp;#039;) ? &amp;#039;]&amp;#039; : &amp;#039;\x04&amp;#039;);&lt;br /&gt;
							} else {&lt;br /&gt;
								var q = s.substring(k);&lt;br /&gt;
							// We assume that there are no templates, nowikis, and other nasty things&lt;br /&gt;
							// in the parameters. Search forward until the next [, {, ], }&lt;br /&gt;
								var l = q.search(/[\x01\x02\x03[\x04\]{}\x05\x06\x07\x08]/);&lt;br /&gt;
								if (l &amp;lt; 0)&lt;br /&gt;
									l = q.length;&lt;br /&gt;
								if (l + 1 &amp;lt; q.length)&lt;br /&gt;
									q = q.substring(0, l + 1);&lt;br /&gt;
								var is_thumb = q.search(/\|\s*thumb(nail)?\s*[|\x04]/) &amp;gt;= 0;&lt;br /&gt;
								var img_width = /\|\s*(\d+)px\s*[|\x04]/.exec(q);&lt;br /&gt;
								if (img_width &amp;amp;&amp;amp; img_width.length &amp;gt; 1) {&lt;br /&gt;
									img_width = parseInt(img_width[1], 10);&lt;br /&gt;
									if (isNaN(img_width))&lt;br /&gt;
										img_width = null;&lt;br /&gt;
								} else {&lt;br /&gt;
									img_width = null;&lt;br /&gt;
								}&lt;br /&gt;
								if (!img_width)&lt;br /&gt;
									img_width = is_thumb ? 180 : 301;&lt;br /&gt;
								var is_small = img_width &amp;lt;= 300;&lt;br /&gt;
&lt;br /&gt;
							// Caption starts at the last pipe before l. If that is a parameter,&lt;br /&gt;
							// it doesn&amp;#039;t hurt.&lt;br /&gt;
								var m = k + q.lastIndexOf(&amp;#039;|&amp;#039;, l);&lt;br /&gt;
								caption = sanitize(&lt;br /&gt;
									s.substring(m + 1),&lt;br /&gt;
									// Allow links only if it&amp;#039;s a thumb&lt;br /&gt;
									is_thumb,&lt;br /&gt;
									caption_level + 1,&lt;br /&gt;
									allow_thumbs &amp;amp;&amp;amp; is_thumb,&lt;br /&gt;
									// Don&amp;#039;t break at pipe&lt;br /&gt;
									false,&lt;br /&gt;
									// Tables only if it&amp;#039;s a thumb&lt;br /&gt;
									is_thumb,&lt;br /&gt;
									// Allow galleries for thumbs (?)&lt;br /&gt;
									is_thumb);&lt;br /&gt;
								used = consumed[caption_level];&lt;br /&gt;
							// caption used &amp;#039;used&amp;#039; chars from m+1, s.charAt(m+1+used) === &amp;#039;\x04&amp;#039;&lt;br /&gt;
								is_thumb = allow_thumbs &amp;amp;&amp;amp; is_small;&lt;br /&gt;
								if (is_thumb || !allow_only_thumbs) {&lt;br /&gt;
									result += s.substring(0, i - 1) + &amp;#039;\x03&amp;#039; + lk_text;&lt;br /&gt;
								} else {&lt;br /&gt;
									result += s.substring(0, i - 1) + &amp;#039;\x03:&amp;#039; + initial +&lt;br /&gt;
								lk_text.substring(initial.length);&lt;br /&gt;
								}&lt;br /&gt;
								result += s.substring(k, m + 1) + caption + &amp;#039;\x04&amp;#039;;&lt;br /&gt;
								k = m;&lt;br /&gt;
							}&lt;br /&gt;
							next = k + 1 + used;&lt;br /&gt;
							if (next &amp;lt; s.length) {&lt;br /&gt;
								if (s.charAt(next) !== &amp;#039;\x04&amp;#039;)&lt;br /&gt;
									s = s.substring(next);&lt;br /&gt;
								else&lt;br /&gt;
									s = s.substring(next + 1);&lt;br /&gt;
							} else {&lt;br /&gt;
								s = &amp;#039;&amp;#039;;&lt;br /&gt;
							}&lt;br /&gt;
						}&lt;br /&gt;
						break;&lt;br /&gt;
					}&lt;br /&gt;
					case &amp;#039;\x04&amp;#039;:&lt;br /&gt;
					case &amp;#039;]&amp;#039;:&lt;br /&gt;
				// Extra bracket.&lt;br /&gt;
						result += s.substring(0, next);&lt;br /&gt;
						if (!caption_level &amp;amp;&amp;amp; !break_at_pipe) {&lt;br /&gt;
							result += (ch === &amp;#039;]&amp;#039; ? &amp;#039;&amp;amp;#x5D;&amp;#039; : &amp;#039;&amp;amp;#x5D;&amp;amp;#x5D;&amp;#039;);&lt;br /&gt;
							s = s.substring(next + 1);&lt;br /&gt;
						} else {&lt;br /&gt;
							get_out = true;&lt;br /&gt;
						}&lt;br /&gt;
						break;&lt;br /&gt;
					case &amp;#039;|&amp;#039;:&lt;br /&gt;
						result += s.substring(0, next);&lt;br /&gt;
						if (break_at_pipe &amp;amp;&amp;amp; !endings) {&lt;br /&gt;
					// Pipe character at top level&lt;br /&gt;
							get_out = true;&lt;br /&gt;
						} else {&lt;br /&gt;
							if (!caption_level &amp;amp;&amp;amp; !break_at_pipe &amp;amp;&amp;amp; !endings)&lt;br /&gt;
								result += &amp;#039;&amp;amp;#x7C;&amp;#039;; // Top-level pipe character&lt;br /&gt;
							else&lt;br /&gt;
								result += &amp;#039;|&amp;#039;;&lt;br /&gt;
							s = s.substring(next + 1);&lt;br /&gt;
						}&lt;br /&gt;
						break;&lt;br /&gt;
				} // end switch&lt;br /&gt;
			} // end while&lt;br /&gt;
			if (in_nowiki)&lt;br /&gt;
				result += &amp;#039;&amp;lt;/nowiki&amp;gt;&amp;#039;; // Make sure this nowiki is closed.&lt;br /&gt;
		// Close open templates and tables&lt;br /&gt;
			while (endings) {&lt;br /&gt;
				ch = pop_end();&lt;br /&gt;
				result += (ch === &amp;#039;\x06&amp;#039; ? &amp;#039;\n&amp;#039; : &amp;#039;&amp;#039;) + ch;&lt;br /&gt;
			}&lt;br /&gt;
			if (caption_level &amp;gt; 0) {&lt;br /&gt;
				var used_up = initial_length - (get_out ? (s.length - next) : 0);&lt;br /&gt;
				if (consumed.length &amp;lt; caption_level)&lt;br /&gt;
					consumed.push(used_up);&lt;br /&gt;
				else&lt;br /&gt;
					consumed[caption_level - 1] = used_up;&lt;br /&gt;
			}&lt;br /&gt;
			return result;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	// Replace multi-character tokens by one-character placeholders, simplifying the&lt;br /&gt;
	// subsequent processing.&lt;br /&gt;
		var s = input.replace(/\{\{/g, &amp;#039;\x01&amp;#039;)&lt;br /&gt;
			.replace(/\n\s*\|\}\}\}/g, &amp;#039;\n\x06\x02&amp;#039;) // Table end + template end&lt;br /&gt;
			.replace(/\}\}/g, &amp;#039;\x02&amp;#039;)&lt;br /&gt;
			.replace(/\[\[/g, &amp;#039;\x03&amp;#039;)&lt;br /&gt;
			.replace(/\]\]/g, &amp;#039;\x04&amp;#039;)&lt;br /&gt;
			.replace(/\n\s*\{\|/g, &amp;#039;\n\x05&amp;#039;) // Table start and end must be on own line&lt;br /&gt;
			.replace(/^\s*\{\|/, &amp;#039;\x05&amp;#039;) // Table start at the very beginning&lt;br /&gt;
			.replace(/\n\s*\|\}/g, &amp;#039;\n\x06&amp;#039;) // (we strip leading whitespace)&lt;br /&gt;
			.replace(/&amp;lt;\s*gallery\s*&amp;gt;/g, &amp;#039;\x07&amp;#039;)&lt;br /&gt;
			.replace(/&amp;lt;\/\s*gallery\s*&amp;gt;/g, &amp;#039;\x08&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		s = sanitize(s, true, 0, true, false, true, true);&lt;br /&gt;
	// with links, allow thumbs, don&amp;#039;t break at pipe, allow tables, allow galleries&lt;br /&gt;
		return s.replace(/\x01/g, &amp;#039;{{&amp;#039;)&lt;br /&gt;
			.replace(/\x02/g, &amp;#039;}}&amp;#039;)&lt;br /&gt;
			.replace(/\x03/g, &amp;#039;[[&amp;#039;)&lt;br /&gt;
			.replace(/\x04/g, &amp;#039;]]&amp;#039;)&lt;br /&gt;
			.replace(/\x05/g, &amp;#039;{|&amp;#039;)&lt;br /&gt;
			.replace(/\x06/g, &amp;#039;|}&amp;#039;)&lt;br /&gt;
			.replace(/\x07/g, &amp;#039;&amp;lt;gallery&amp;gt;&amp;#039;)&lt;br /&gt;
			.replace(/\x08/g, &amp;#039;&amp;lt;/gallery&amp;gt;&amp;#039;);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
}());&lt;br /&gt;
// &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Insert</name></author>
	</entry>
</feed>