<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://library.hmoegirl.com/index.php?action=history&amp;feed=atom&amp;title=Wikihighlight.js</id>
	<title>Wikihighlight.js - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://library.hmoegirl.com/index.php?action=history&amp;feed=atom&amp;title=Wikihighlight.js"/>
	<link rel="alternate" type="text/html" href="https://library.hmoegirl.com/index.php?title=Wikihighlight.js&amp;action=history"/>
	<updated>2026-08-12T16:38:17Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://library.hmoegirl.com/index.php?title=Wikihighlight.js&amp;diff=289&amp;oldid=prev</id>
		<title>CaoPig：​搬运自H萌娘User:Irukaza/tools/wikihighlight.js</title>
		<link rel="alternate" type="text/html" href="https://library.hmoegirl.com/index.php?title=Wikihighlight.js&amp;diff=289&amp;oldid=prev"/>
		<updated>2026-08-01T08:45:51Z</updated>

		<summary type="html">&lt;p&gt;搬运自H萌娘User:Irukaza/tools/wikihighlight.js&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;//&amp;lt;pre&amp;gt; Disable signature replacing&lt;br /&gt;
CodeMirror.defineMode(&amp;#039;mediawiki&amp;#039;, function() {&lt;br /&gt;
	function arrayRemove(array, object) {&lt;br /&gt;
		var index = array.indexOf(object);&lt;br /&gt;
		if (index !== -1) array.splice(index, 1);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var module = {};&lt;br /&gt;
	var config = {&lt;br /&gt;
		protocols: [&lt;br /&gt;
			&amp;#039;bitcoin:&amp;#039;, &amp;#039;ftp://&amp;#039;, &amp;#039;ftps://&amp;#039;, &amp;#039;geo:&amp;#039;, &amp;#039;git://&amp;#039;, &amp;#039;gopher://&amp;#039;, &amp;#039;http://&amp;#039;,&lt;br /&gt;
			&amp;#039;https://&amp;#039;, &amp;#039;irc://&amp;#039;, &amp;#039;ircs://&amp;#039;, &amp;#039;magnet:&amp;#039;, &amp;#039;mailto:&amp;#039;, &amp;#039;mms://&amp;#039;, &amp;#039;news:&amp;#039;,&lt;br /&gt;
			&amp;#039;nntp://&amp;#039;, &amp;#039;redis://&amp;#039;, &amp;#039;sftp://&amp;#039;, &amp;#039;sip:&amp;#039;, &amp;#039;sips:&amp;#039;, &amp;#039;sms:&amp;#039;, &amp;#039;ssh://&amp;#039;,&lt;br /&gt;
			&amp;#039;svn://&amp;#039;, &amp;#039;tel:&amp;#039;, &amp;#039;telnet://&amp;#039;, &amp;#039;urn:&amp;#039;, &amp;#039;worldwind://&amp;#039;, &amp;#039;xmpp:&amp;#039;,&lt;br /&gt;
			// Note &amp;#039;//&amp;#039;&amp;#039; should not be included here&lt;br /&gt;
		],&lt;br /&gt;
		linktrail: false&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	var EXT_LINK_ADDR = /(?:[0-9.]+|\[[0-9a-fA-F:.]+\]|[^\]\[&amp;lt;&amp;gt;&amp;quot;\s])/; // Match host name, include IPv4, IPv6 and Domain name&lt;br /&gt;
	var EXT_LINK_PROTOCOL_NOREL = new RegExp(config.protocols.join(&amp;#039;|&amp;#039;));&lt;br /&gt;
	var EXT_LINK_PROTOCOL = new RegExp(config.protocols.join(&amp;#039;|&amp;#039;) + &amp;#039;|//&amp;#039;);&lt;br /&gt;
	var EXT_LINK_URL = /(?:[0-9.]+|\[[0-9a-fA-F:.]+\]|[^\]\[&amp;lt;&amp;gt;&amp;quot;\s])[^\]\[&amp;lt;&amp;gt;&amp;quot;\s]*/;&lt;br /&gt;
&lt;br /&gt;
	var ALLOWED_TAGS = {&lt;br /&gt;
		bdi: true,&lt;br /&gt;
		ins: true,&lt;br /&gt;
		u: true,&lt;br /&gt;
		font: true,&lt;br /&gt;
		big: true,&lt;br /&gt;
		small: true,&lt;br /&gt;
		sub: true,&lt;br /&gt;
		sup: true,&lt;br /&gt;
		h1: true,&lt;br /&gt;
		h2: true,&lt;br /&gt;
		h3: true,&lt;br /&gt;
		h4: true,&lt;br /&gt;
		h5: true,&lt;br /&gt;
		h6: true,&lt;br /&gt;
		cite: true,&lt;br /&gt;
		code: true,&lt;br /&gt;
		strike: true,&lt;br /&gt;
		tt: true,&lt;br /&gt;
		var: true,&lt;br /&gt;
		div: true,&lt;br /&gt;
		center: true,&lt;br /&gt;
		blockquote: true,&lt;br /&gt;
		ol: true,&lt;br /&gt;
		ul: true,&lt;br /&gt;
		dl: true,&lt;br /&gt;
		table: true,&lt;br /&gt;
		caption: true,&lt;br /&gt;
		pre: true,&lt;br /&gt;
		ruby: true,&lt;br /&gt;
		rb: true,&lt;br /&gt;
		rp: true,&lt;br /&gt;
		rt: true,&lt;br /&gt;
		rtc: true,&lt;br /&gt;
		p: true,&lt;br /&gt;
		span: true,&lt;br /&gt;
		abbr: true,&lt;br /&gt;
		dfn: true,&lt;br /&gt;
		kbd: true,&lt;br /&gt;
		samp: true,&lt;br /&gt;
		data: true,&lt;br /&gt;
		time: true,&lt;br /&gt;
		mark: true,&lt;br /&gt;
		br: false,&lt;br /&gt;
		wbr: false,&lt;br /&gt;
		hr: false,&lt;br /&gt;
		li: true,&lt;br /&gt;
		dt: true,&lt;br /&gt;
		dd: true,&lt;br /&gt;
		td: true,&lt;br /&gt;
		th: true,&lt;br /&gt;
		tr: true,&lt;br /&gt;
		// These tags are added here but they are not html&lt;br /&gt;
		noinclude: true,&lt;br /&gt;
		includeonly: true,&lt;br /&gt;
		onlyinclude: true,&lt;br /&gt;
		style: true,&lt;br /&gt;
		script: true&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	function generateStyleMixinTagHandler(style) {&lt;br /&gt;
		return {&lt;br /&gt;
			open: function(stream, state) {&lt;br /&gt;
				state.mixinStyle.push(style);&lt;br /&gt;
			},&lt;br /&gt;
			close: function(stream, state) {&lt;br /&gt;
				var index = state.mixinStyle.indexOf(style);&lt;br /&gt;
				if (index !== -1) state.mixinStyle.splice(index, 1);&lt;br /&gt;
			}&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	ALLOWED_TAGS[&amp;#039;s&amp;#039;] = ALLOWED_TAGS[&amp;#039;strike&amp;#039;] = ALLOWED_TAGS[&amp;#039;del&amp;#039;] = generateStyleMixinTagHandler(&amp;#039;strikethrough&amp;#039;); // Alias&lt;br /&gt;
	ALLOWED_TAGS[&amp;#039;b&amp;#039;] = ALLOWED_TAGS[&amp;#039;strong&amp;#039;] = generateStyleMixinTagHandler(&amp;#039;strong&amp;#039;); // Alias&lt;br /&gt;
	ALLOWED_TAGS[&amp;#039;i&amp;#039;] = ALLOWED_TAGS[&amp;#039;em&amp;#039;] = generateStyleMixinTagHandler(&amp;#039;em&amp;#039;); // Alias&lt;br /&gt;
&lt;br /&gt;
	ALLOWED_TAGS[&amp;#039;nowiki&amp;#039;] = {&lt;br /&gt;
		open: function(stream, state) {&lt;br /&gt;
			state.unclosedTags.pop();&lt;br /&gt;
			state.handler = parseNowikiTag;&lt;br /&gt;
		},&lt;br /&gt;
		canSelfClose: true&lt;br /&gt;
			// close never reached&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	ALLOWED_TAGS[&amp;#039;pre&amp;#039;] = {&lt;br /&gt;
		open: function(stream, state) {&lt;br /&gt;
			state.mixinStyle.push(&amp;#039;mw-pre&amp;#039;);&lt;br /&gt;
			state.unclosedTags.pop();&lt;br /&gt;
			state.handler = parsePreTag;&lt;br /&gt;
		},&lt;br /&gt;
		canSelfClose: true&lt;br /&gt;
			// close never reached&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	// Extension:Cite&lt;br /&gt;
	ALLOWED_TAGS[&amp;#039;ref&amp;#039;] = true;&lt;br /&gt;
	ALLOWED_TAGS[&amp;#039;references&amp;#039;] = false;&lt;br /&gt;
&lt;br /&gt;
	// Other extensions&lt;br /&gt;
	ALLOWED_TAGS[&amp;#039;categorytree&amp;#039;] = true;&lt;br /&gt;
	ALLOWED_TAGS[&amp;#039;charinsert&amp;#039;] = true;&lt;br /&gt;
	ALLOWED_TAGS[&amp;#039;choose&amp;#039;] = true;&lt;br /&gt;
	ALLOWED_TAGS[&amp;#039;dynamicpagelist&amp;#039;] = true;&lt;br /&gt;
	ALLOWED_TAGS[&amp;#039;flashmp3&amp;#039;] = true;&lt;br /&gt;
	ALLOWED_TAGS[&amp;#039;gallery&amp;#039;] = true;&lt;br /&gt;
	ALLOWED_TAGS[&amp;#039;imagemap&amp;#039;] = true;&lt;br /&gt;
	ALLOWED_TAGS[&amp;#039;indicator&amp;#039;] = true;&lt;br /&gt;
	ALLOWED_TAGS[&amp;#039;inputbox&amp;#039;] = true;&lt;br /&gt;
	ALLOWED_TAGS[&amp;#039;poem&amp;#039;] = true;&lt;br /&gt;
	ALLOWED_TAGS[&amp;#039;poll&amp;#039;] = true;&lt;br /&gt;
	ALLOWED_TAGS[&amp;#039;sm2&amp;#039;] = true;&lt;br /&gt;
&lt;br /&gt;
	// Utility&lt;br /&gt;
	function tagCanSelfClose(tagname) {&lt;br /&gt;
		var tag = ALLOWED_TAGS[tagname];&lt;br /&gt;
		if (tag === false) {&lt;br /&gt;
			return true;&lt;br /&gt;
		}&lt;br /&gt;
		if (typeof tag !== &amp;#039;object&amp;#039;) {&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		if (&amp;#039;canSelfClose&amp;#039; in tag) {&lt;br /&gt;
			return tag.canSelfClose;&lt;br /&gt;
		}&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function makeStyle(style, state) {&lt;br /&gt;
		if (state.bold) {&lt;br /&gt;
			style += &amp;#039; strong&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		if (state.italic) {&lt;br /&gt;
			style += &amp;#039; em&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		style += &amp;#039; &amp;#039; + state.mixinStyle.join(&amp;#039; &amp;#039;);&lt;br /&gt;
		return style;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parseWikitext(stream, state) {&lt;br /&gt;
		var sol = stream.sol();&lt;br /&gt;
&lt;br /&gt;
		var match = stream.match(EXT_LINK_PROTOCOL_NOREL);&lt;br /&gt;
		if (match) {&lt;br /&gt;
			if (stream.match(EXT_LINK_ADDR, false)) {&lt;br /&gt;
				// The URL must looks like a URL&lt;br /&gt;
				state.stack.push(state.handler);&lt;br /&gt;
				state.handler = parseFreeExternalLink;&lt;br /&gt;
				return &amp;#039;mw-extlink&amp;#039;;&lt;br /&gt;
			} else {&lt;br /&gt;
				// Does not look like URL, backUp&lt;br /&gt;
				stream.backUp(match[0].length);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		stream.backUp(1);&lt;br /&gt;
		var sow = !/\w/.exec(stream.next());&lt;br /&gt;
&lt;br /&gt;
		if (sow) {&lt;br /&gt;
			match = stream.match(/(?:ISBN|RFC|PMID)\s+/);&lt;br /&gt;
			if (match) {&lt;br /&gt;
				if (match[0].startsWith(&amp;#039;ISBN&amp;#039;)) {&lt;br /&gt;
					var match2 = stream.match(/(?:97[89][- ]?)?(?:[0-9][- ]?){9}[0-9Xx]\b/);&lt;br /&gt;
					if (match2) {&lt;br /&gt;
						return &amp;#039;mw-isbn&amp;#039;;&lt;br /&gt;
					}&lt;br /&gt;
				} else {&lt;br /&gt;
					var match2 = stream.match(/[0-9]+\b/);&lt;br /&gt;
					if (match2) {&lt;br /&gt;
						if (match[0].startsWith(&amp;#039;RFC&amp;#039;)) {&lt;br /&gt;
							return &amp;#039;mw-rfc&amp;#039;;&lt;br /&gt;
						} else {&lt;br /&gt;
							return &amp;#039;mw-pmid&amp;#039;;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				stream.backUp(match[0].length);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (sol) {&lt;br /&gt;
			// Table&lt;br /&gt;
			if (stream.match(/\s*(:*)\s*(?=\{\|)/)) {&lt;br /&gt;
				state.stack.push(state.handler);&lt;br /&gt;
				state.handler = parseTableStart;&lt;br /&gt;
				return &amp;#039;mw-ident&amp;#039;;&lt;br /&gt;
			}&lt;br /&gt;
			switch (stream.peek()) {&lt;br /&gt;
				case &amp;#039;-&amp;#039;:&lt;br /&gt;
					if (stream.match(/-{4,}/)) {&lt;br /&gt;
						return &amp;#039;mw-hr&amp;#039;;&lt;br /&gt;
					}&lt;br /&gt;
					break;&lt;br /&gt;
				case &amp;#039;#&amp;#039;: // TODO #REDIRECT&lt;br /&gt;
				case &amp;#039;*&amp;#039;:&lt;br /&gt;
				case &amp;#039;;&amp;#039;:&lt;br /&gt;
				case &amp;#039;:&amp;#039;:&lt;br /&gt;
					stream.match(/[*#;:]*/);&lt;br /&gt;
					return &amp;#039;mw-ident&amp;#039;;&lt;br /&gt;
				case &amp;#039; &amp;#039;:&lt;br /&gt;
					stream.next();&lt;br /&gt;
					return &amp;#039;line-cm-mw-pre&amp;#039;;&lt;br /&gt;
				case &amp;#039;=&amp;#039;:&lt;br /&gt;
					match = stream.match(/(={1,6})(?=.+?\1\s*$)/);&lt;br /&gt;
					if (match) {&lt;br /&gt;
						state.handler = makeParseSectionHeader(match[1].length);&lt;br /&gt;
						return &amp;#039;mw-section line-cm-mw-section-&amp;#039; + match[1].length;&lt;br /&gt;
					}&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		switch (stream.peek()) {&lt;br /&gt;
			case &amp;#039;\&amp;#039;&amp;#039;:&lt;br /&gt;
				if (stream.match(/&amp;#039;+(?=&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;)/)) { // more than 5 apostrophes, only last five are considered&lt;br /&gt;
					return makeStyle(&amp;#039;&amp;#039;, state);&lt;br /&gt;
				}&lt;br /&gt;
				if (stream.match(/&amp;#039;(?=&amp;#039;&amp;#039;&amp;#039;(?!&amp;#039;))/)) { // 4 apostrophes, only last three are considered&lt;br /&gt;
					return makeStyle(&amp;#039;&amp;#039;, state);&lt;br /&gt;
				}&lt;br /&gt;
				if (stream.match(&amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot;)) {&lt;br /&gt;
					if (!state.bold) {&lt;br /&gt;
						state.bold = true;&lt;br /&gt;
						return &amp;#039;mw-bold-start&amp;#039;;&lt;br /&gt;
					} else {&lt;br /&gt;
						state.bold = false;&lt;br /&gt;
						return &amp;#039;mw-bold-end&amp;#039;;&lt;br /&gt;
					}&lt;br /&gt;
				} else if (stream.match(&amp;quot;&amp;#039;&amp;#039;&amp;quot;)) {&lt;br /&gt;
					if (!state.italic) {&lt;br /&gt;
						state.italic = true;&lt;br /&gt;
						return &amp;#039;mw-italic-start&amp;#039;;&lt;br /&gt;
					} else {&lt;br /&gt;
						state.italic = false;&lt;br /&gt;
						return &amp;#039;mw-italic-end&amp;#039;;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				// TODO Mismatch Recovery&lt;br /&gt;
				break;&lt;br /&gt;
			case &amp;#039;~&amp;#039;:&lt;br /&gt;
				var match = stream.match(/~{3,5}/);&lt;br /&gt;
				if (match) {&lt;br /&gt;
					return &amp;#039;mw-signature&amp;#039;;&lt;br /&gt;
				}&lt;br /&gt;
				break;&lt;br /&gt;
			case &amp;#039;_&amp;#039;:&lt;br /&gt;
				if (sow) {&lt;br /&gt;
					var match = stream.match(/\b__[A-Z_]+?__/);&lt;br /&gt;
					if (match) {&lt;br /&gt;
						return &amp;#039;mw-magic-word&amp;#039;;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				break;&lt;br /&gt;
			case &amp;#039;{&amp;#039;:&lt;br /&gt;
				if (stream.match(&amp;#039;{{&amp;#039;)) {&lt;br /&gt;
					state.stack.push(state.handler);&lt;br /&gt;
					state.handler = parseTemplateName;&lt;br /&gt;
					return &amp;#039;mw-template-start&amp;#039;;&lt;br /&gt;
				}&lt;br /&gt;
				break;&lt;br /&gt;
			case &amp;#039;[&amp;#039;:&lt;br /&gt;
				if (stream.match(&amp;#039;[[&amp;#039;)) {&lt;br /&gt;
					if (!stream.match(/[^\|\[\]]+(?:\|.*?)?\]\]/, false)) { // Not a link&lt;br /&gt;
						return makeStyle(&amp;#039;&amp;#039;, state);&lt;br /&gt;
					}&lt;br /&gt;
					state.stack.push(state.handler);&lt;br /&gt;
					state.handler = parseLinkTarget;&lt;br /&gt;
					return &amp;#039;mw-link-start&amp;#039;;&lt;br /&gt;
				} else {&lt;br /&gt;
					stream.next();&lt;br /&gt;
					var match = stream.match(EXT_LINK_PROTOCOL);&lt;br /&gt;
					if (match) {&lt;br /&gt;
						if (stream.match(EXT_LINK_ADDR, false) &amp;amp;&amp;amp; stream.match(/.+?]/, false)) {&lt;br /&gt;
							// The URL must looks like a URL&lt;br /&gt;
							state.stack.push(state.handler);&lt;br /&gt;
							state.handler = parseExternalLink;&lt;br /&gt;
							// Still have to back up the URL, rendered differently&lt;br /&gt;
							stream.backUp(match[0].length);&lt;br /&gt;
							return &amp;#039;mw-extlink-start&amp;#039;;&lt;br /&gt;
						} else {&lt;br /&gt;
							// Does not look like URL, backUp&lt;br /&gt;
							stream.backUp(match[0].length);&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					// Bug reported by AnnAngela&lt;br /&gt;
					// [{{}} does not render correctly&lt;br /&gt;
					return makeStyle(&amp;#039;&amp;#039;, state);&lt;br /&gt;
				}&lt;br /&gt;
				break;&lt;br /&gt;
			case &amp;#039;&amp;amp;&amp;#039;:&lt;br /&gt;
				return parseEntityOnly(stream, state);&lt;br /&gt;
			case &amp;#039;&amp;lt;&amp;#039;:&lt;br /&gt;
				if (stream.match(&amp;#039;&amp;lt;!--&amp;#039;)) {&lt;br /&gt;
					state.stack.push(state.handler);&lt;br /&gt;
					state.handler = parseComment;&lt;br /&gt;
					return &amp;#039;mw-comment&amp;#039;;&lt;br /&gt;
				}&lt;br /&gt;
				stream.next(); // eat &amp;lt;&lt;br /&gt;
				var closing = !!stream.eat(&amp;#039;/&amp;#039;);&lt;br /&gt;
				var tagname = stream.match(/\w+/);&lt;br /&gt;
				if (!tagname || !(tagname[0] in ALLOWED_TAGS)) {&lt;br /&gt;
					// The eaten ones are treated as plain text if this is not a tag or not allowed&lt;br /&gt;
					return makeStyle(&amp;#039;&amp;#039;, state);&lt;br /&gt;
				}&lt;br /&gt;
				tagname = tagname[0];&lt;br /&gt;
				var match = stream.match(/[^&amp;lt;]*?(\/)?&amp;gt;/, false);&lt;br /&gt;
				if (!match) {&lt;br /&gt;
					// No closing &amp;gt;, treat as text&lt;br /&gt;
					return makeStyle(&amp;#039;&amp;#039;, state);&lt;br /&gt;
				}&lt;br /&gt;
				var selfClose = false;&lt;br /&gt;
				if (match[1]) {&lt;br /&gt;
					// Self-closing tag processing&lt;br /&gt;
					if (!closing &amp;amp;&amp;amp; !tagCanSelfClose(tagname)) {&lt;br /&gt;
						// Not self-closing tag, treat as text&lt;br /&gt;
						return makeStyle(&amp;#039;&amp;#039;, state);&lt;br /&gt;
					}&lt;br /&gt;
					selfClose = true;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				if (closing) {&lt;br /&gt;
					var uc = state.unclosedTags.slice();&lt;br /&gt;
					while (uc.length) {&lt;br /&gt;
						if (uc.pop() === tagname) {&lt;br /&gt;
							break;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					// If closing tag&lt;br /&gt;
					if (state.unclosedTags[uc.length] === tagname) {&lt;br /&gt;
						state.unclosedTags = uc;&lt;br /&gt;
						if (stream.match(/[^&amp;lt;]*?&amp;gt;/)) {&lt;br /&gt;
							if (typeof(ALLOWED_TAGS[tagname]) === &amp;#039;object&amp;#039;)&lt;br /&gt;
								ALLOWED_TAGS[tagname].close(stream, state);&lt;br /&gt;
&lt;br /&gt;
							state.handler = state.stack.pop();&lt;br /&gt;
							return &amp;#039;mw-tag-close&amp;#039;;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					// Otherwise, treat as text&lt;br /&gt;
					return makeStyle(&amp;#039;&amp;#039;, state);&lt;br /&gt;
				} else {&lt;br /&gt;
					if (ALLOWED_TAGS[tagname] &amp;amp;&amp;amp; !selfClose) { // If not self-closing&lt;br /&gt;
						state.unclosedTags.push(tagname);&lt;br /&gt;
					}&lt;br /&gt;
					state.stack.push(state.handler);&lt;br /&gt;
					state.handler = makeParseOpenTag(tagname, selfClose);&lt;br /&gt;
					return &amp;#039;mw-tag-open&amp;#039;;&lt;br /&gt;
				}&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		stream.next();&lt;br /&gt;
		return makeStyle(&amp;#039;&amp;#039;, state);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parseFreeExternalLink(stream, state) {&lt;br /&gt;
		var match = stream.match(EXT_LINK_URL);&lt;br /&gt;
		var text = match[0];&lt;br /&gt;
&lt;br /&gt;
		// {{, ~~~, &amp;#039;&amp;#039; will start their effect, so detect and correct&lt;br /&gt;
		var match = /\{\{|~~~|&amp;#039;&amp;#039;/.exec(text);&lt;br /&gt;
		if (match) {&lt;br /&gt;
			// Pushback the wrongly included part&lt;br /&gt;
			stream.backUp(text.length - match.index);&lt;br /&gt;
			text = text.substring(0, match.index);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// There are some symbols common in English, they are &lt;br /&gt;
		// not treated as part of URL if they are trailing.&lt;br /&gt;
		// If there is no left parenthesis, &lt;br /&gt;
		// we assume that right parenthese will then not be part of URL&lt;br /&gt;
		var regex = text.indexOf(&amp;#039;(&amp;#039;) !== -1 ? /[,;\\.:!?]+$/ : /[,;\\.:!?)]+$/;&lt;br /&gt;
		var match = regex.exec(text);&lt;br /&gt;
		var detLength = match ? match[0].length : 0;&lt;br /&gt;
		if (detLength !== 0) {&lt;br /&gt;
			stream.backUp(detLength);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		state.handler = state.stack.pop();&lt;br /&gt;
		return &amp;#039;mw-extlink&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function makeParseSectionHeader(count) {&lt;br /&gt;
		var regExp = new RegExp(&amp;#039;={&amp;#039; + count + &amp;#039;}\\s*$&amp;#039;);&lt;br /&gt;
		return function(stream, state) {&lt;br /&gt;
			if (stream.match(regExp)) {&lt;br /&gt;
				return &amp;#039;mw-section&amp;#039;;&lt;br /&gt;
			}&lt;br /&gt;
			return parseWikitext(stream, state);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parseComment(stream, state) {&lt;br /&gt;
		if (stream.match(&amp;#039;--&amp;gt;&amp;#039;)) {&lt;br /&gt;
			state.handler = state.stack.pop();&lt;br /&gt;
		} else {&lt;br /&gt;
			stream.next();&lt;br /&gt;
		}&lt;br /&gt;
		return &amp;#039;mw-comment&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parseTableStart(stream, state) {&lt;br /&gt;
		stream.match(&amp;#039;{|&amp;#039;);&lt;br /&gt;
		state.handler = state.stack.pop();&lt;br /&gt;
		return &amp;#039;mw-table-start&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function makeParseOpenTag(tagname, selfClose) {&lt;br /&gt;
		return function(stream, state) {&lt;br /&gt;
			if (stream.match(/\/?&amp;gt;/)) {&lt;br /&gt;
				if (!selfClose) {&lt;br /&gt;
					state.handler = parseWikitext;&lt;br /&gt;
					if (typeof(ALLOWED_TAGS[tagname]) === &amp;#039;object&amp;#039;) {&lt;br /&gt;
						ALLOWED_TAGS[tagname].open(stream, state);&lt;br /&gt;
					}&lt;br /&gt;
				} else {&lt;br /&gt;
					state.handler = state.stack.pop();&lt;br /&gt;
				}&lt;br /&gt;
				return &amp;#039;mw-tag-open&amp;#039;;&lt;br /&gt;
			} else {&lt;br /&gt;
				stream.next();&lt;br /&gt;
				return &amp;#039;mw-tag-attr&amp;#039;;&lt;br /&gt;
			}&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parseEntityOnly(stream, state) {&lt;br /&gt;
		if (stream.next() === &amp;#039;&amp;amp;&amp;#039;) {&lt;br /&gt;
			var success;&lt;br /&gt;
			if (stream.eat(&amp;#039;#&amp;#039;)) {&lt;br /&gt;
				if (stream.eat(&amp;#039;x&amp;#039;)) {&lt;br /&gt;
					success = stream.eatWhile(/[a-fA-F\d]/);&lt;br /&gt;
				} else {&lt;br /&gt;
					success = stream.eatWhile(/[\d]/);&lt;br /&gt;
				}&lt;br /&gt;
			} else {&lt;br /&gt;
				success = stream.eatWhile(/[\w\.\-:]/);&lt;br /&gt;
			}&lt;br /&gt;
			if (success) {&lt;br /&gt;
				success = stream.eat(&amp;#039;;&amp;#039;);&lt;br /&gt;
			}&lt;br /&gt;
			if (success) {&lt;br /&gt;
				return makeStyle(&amp;#039;mw-entity&amp;#039;, state);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return makeStyle(&amp;#039;&amp;#039;, state);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Internal link parsing */&lt;br /&gt;
&lt;br /&gt;
	function parseLinkTarget(stream, state) {&lt;br /&gt;
		stream.match(/.+?(?=\||\]\])/);&lt;br /&gt;
		if (stream.peek() === &amp;#039;|&amp;#039;) {&lt;br /&gt;
			state.handler = parseLinkPipe;&lt;br /&gt;
		} else {&lt;br /&gt;
			state.handler = parseLinkEnd;&lt;br /&gt;
		}&lt;br /&gt;
		return &amp;#039;mw-link-target&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parseLinkEnd(stream, state) {&lt;br /&gt;
		stream.match(&amp;#039;]]&amp;#039;);&lt;br /&gt;
		if (config.linktrail) {&lt;br /&gt;
			state.handler = parseLinkTrail;&lt;br /&gt;
		} else {&lt;br /&gt;
			state.handler = state.stack.pop();&lt;br /&gt;
		}&lt;br /&gt;
		return &amp;#039;mw-link-end&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parseLinkTrail(stream, state) {&lt;br /&gt;
		stream.match(/\w*/);&lt;br /&gt;
		state.handler = state.stack.pop();&lt;br /&gt;
		return &amp;#039;mw-link-trail&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parseLinkPipe(stream, state) {&lt;br /&gt;
		stream.match(&amp;#039;|&amp;#039;);&lt;br /&gt;
		state.handler = parseLinkText;&lt;br /&gt;
		return &amp;#039;mw-link-pipe&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parseLinkText(stream, state) {&lt;br /&gt;
		if (stream.match(&amp;#039;]]&amp;#039;, false)) {&lt;br /&gt;
			// Maybe just return directly?&lt;br /&gt;
			state.handler = parseLinkEnd;&lt;br /&gt;
			return &amp;#039;&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		var ret = parseWikitext(stream, state);&lt;br /&gt;
		return ret + &amp;#039; mw-link-text&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// External link parsing&lt;br /&gt;
	function parseExternalLink(stream, state) {&lt;br /&gt;
		var match = stream.match(EXT_LINK_URL);&lt;br /&gt;
		var text = match[0];&lt;br /&gt;
&lt;br /&gt;
		// {{, ~~~, &amp;#039;&amp;#039; will start their effect, so detect and correct&lt;br /&gt;
		var match = new RegExp(&amp;quot;\\{\\{|~~~|&amp;#039;&amp;#039;&amp;quot;).exec(text);&lt;br /&gt;
		if (match) {&lt;br /&gt;
			// Pushback the wrongly included part&lt;br /&gt;
			stream.backUp(text.length - match.index);&lt;br /&gt;
			text = text.substring(0, match.index);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		state.handler = parseExternalLinkText;&lt;br /&gt;
		return &amp;#039;mw-extlink-target&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parseExternalLinkText(stream, state) {&lt;br /&gt;
		if (stream.eat(&amp;#039;]&amp;#039;)) {&lt;br /&gt;
			state.handler = state.stack.pop();&lt;br /&gt;
			return &amp;#039;mw-extlink-end&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		var ret = parseWikitext(stream, state);&lt;br /&gt;
		return ret + &amp;#039; mw-link-text&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Template&lt;br /&gt;
&lt;br /&gt;
	function parseTemplateName(stream, state) {&lt;br /&gt;
		if (stream.eat(&amp;#039;|&amp;#039;)) {&lt;br /&gt;
			if (stream.match(/[^\|\{\}]*=/, false)) {&lt;br /&gt;
				state.handler = parseTemplateArgName;&lt;br /&gt;
			} else {&lt;br /&gt;
				state.handler = parseTemplateArg;&lt;br /&gt;
			}&lt;br /&gt;
			return &amp;#039;mw-template-pipe&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		if (stream.match(&amp;#039;}}&amp;#039;)) {&lt;br /&gt;
			state.handler = state.stack.pop();&lt;br /&gt;
			return &amp;#039;mw-template-end&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		stream.next();&lt;br /&gt;
		return &amp;#039;mw-template-name&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parseTemplateArg(stream, state) {&lt;br /&gt;
		if (stream.eat(&amp;#039;|&amp;#039;)) {&lt;br /&gt;
			if (stream.match(/[^\|\{\}]*=/, false)) {&lt;br /&gt;
				state.handler = parseTemplateArgName;&lt;br /&gt;
			}&lt;br /&gt;
			return &amp;#039;mw-template-pipe&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		if (stream.match(&amp;#039;}}&amp;#039;)) {&lt;br /&gt;
			state.handler = state.stack.pop();&lt;br /&gt;
			return &amp;#039;mw-template-end&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		var ret = parseWikitext(stream, state);&lt;br /&gt;
		return ret + &amp;#039; mw-template-arg&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parseTemplateArgName(stream, state) {&lt;br /&gt;
		if (stream.eat(&amp;#039;=&amp;#039;)) {&lt;br /&gt;
			state.handler = parseTemplateArg;&lt;br /&gt;
			return &amp;#039;mw-template-assign&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		// The below two cases are rare cases, where simple regex for detecting = fails&lt;br /&gt;
		if (stream.eat(&amp;#039;|&amp;#039;)) {&lt;br /&gt;
			if (!stream.match(/[^\|\{\}]*=/, false)) {&lt;br /&gt;
				state.handler = parseTemplateArg;&lt;br /&gt;
			}&lt;br /&gt;
			return &amp;#039;mw-template-pipe&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		if (stream.match(&amp;#039;}}&amp;#039;)) {&lt;br /&gt;
			state.handler = state.stack.pop();&lt;br /&gt;
			return &amp;#039;mw-template-end&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		var ret = parseWikitext(stream, state);&lt;br /&gt;
		return ret + &amp;#039; mw-template-argname&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Tag handlers&lt;br /&gt;
&lt;br /&gt;
	function parseNowikiTag(stream, state) {&lt;br /&gt;
		if (stream.match(/&amp;lt;\/nowiki\s*&amp;gt;/)) {&lt;br /&gt;
			state.handler = state.stack.pop();&lt;br /&gt;
			return &amp;#039;mw-tag-close&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		return parseEntityOnly(stream, state);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parsePreTag(stream, state) {&lt;br /&gt;
		if (stream.match(/&amp;lt;\/pre\s*&amp;gt;/)) {&lt;br /&gt;
			state.handler = state.stack.pop();&lt;br /&gt;
			arrayRemove(state.mixinStyle, &amp;#039;mw-pre&amp;#039;);&lt;br /&gt;
			return &amp;#039;mw-tag-close&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		return parseEntityOnly(stream, state);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	module.startState = function() {&lt;br /&gt;
		return {&lt;br /&gt;
			handler: parseWikitext,&lt;br /&gt;
			bold: false,&lt;br /&gt;
			italic: false,&lt;br /&gt;
			mixinStyle: [],&lt;br /&gt;
			unclosedTags: [],&lt;br /&gt;
			stack: []&lt;br /&gt;
		};&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	module.copyState = function(state) {&lt;br /&gt;
		return {&lt;br /&gt;
			handler: state.handler,&lt;br /&gt;
			bold: state.bold,&lt;br /&gt;
			italic: state.italic,&lt;br /&gt;
			mixinStyle: state.mixinStyle.slice(),&lt;br /&gt;
			unclosedTags: state.unclosedTags.slice(),&lt;br /&gt;
			stack: state.stack.slice()&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	module.token = function(stream, state) {&lt;br /&gt;
		if (stream.sol()) {&lt;br /&gt;
			state.bold = false;&lt;br /&gt;
			state.italic = false;&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			return state.handler(stream, state);&lt;br /&gt;
		} catch (e) {&lt;br /&gt;
			stream.next();&lt;br /&gt;
			state.handler = parseWikitext;&lt;br /&gt;
			console.error(&amp;#039;Error in WikiHighlight&amp;#039;, e.stack || e);&lt;br /&gt;
			return null;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return module;&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
$(function() {&lt;br /&gt;
	var target = $(&amp;#039;#wpTextbox1&amp;#039;);&lt;br /&gt;
	if(target.length) {&lt;br /&gt;
		var cm = CodeMirror.fromTextArea(target[0], {&lt;br /&gt;
			lineNumbers: true,&lt;br /&gt;
			lineWrapping: true,&lt;br /&gt;
			mode: &amp;#039;mediawiki&amp;#039;&lt;br /&gt;
		});&lt;br /&gt;
		cm.on(&amp;#039;change&amp;#039;, function () {&lt;br /&gt;
			target.trigger(&amp;#039;input&amp;#039;);&lt;br /&gt;
		});&lt;br /&gt;
		$.valHooks[&amp;#039;textarea&amp;#039;] = {&lt;br /&gt;
			get: function(elem){ if(elem === target[0]) return cm.getValue(); else return elem.value; },&lt;br /&gt;
			set: function(elem, value){ if(elem === target[0]) cm.setValue(value); else elem.value = value; }&lt;br /&gt;
		};&lt;br /&gt;
		var origTextSelection = $.fn.textSelection;&lt;br /&gt;
		$.fn.textSelection = function(command, options) {&lt;br /&gt;
			if (cm.getTextArea() !== this[0]) {&lt;br /&gt;
				return origTextSelection.call(this, command, options);&lt;br /&gt;
			}&lt;br /&gt;
			var fn, retval;&lt;br /&gt;
		&lt;br /&gt;
			fn = {&lt;br /&gt;
				/**&lt;br /&gt;
				 * Get the contents of the textarea&lt;br /&gt;
				 */&lt;br /&gt;
				getContents: function() {&lt;br /&gt;
					return cm.doc.getValue();&lt;br /&gt;
				},&lt;br /&gt;
		&lt;br /&gt;
				setContents: function(newContents) {&lt;br /&gt;
					cm.doc.setValue(newContents);&lt;br /&gt;
				},&lt;br /&gt;
		&lt;br /&gt;
				/**&lt;br /&gt;
				 * Get the currently selected text in this textarea. Will focus the textarea&lt;br /&gt;
				 * in some browsers (IE/Opera)&lt;br /&gt;
				 */&lt;br /&gt;
				getSelection: function() {&lt;br /&gt;
					return cm.doc.getSelection();&lt;br /&gt;
				},&lt;br /&gt;
		&lt;br /&gt;
				/**&lt;br /&gt;
				 * Inserts text at the beginning and end of a text selection, optionally&lt;br /&gt;
				 * inserting text at the caret when selection is empty.&lt;br /&gt;
				 */&lt;br /&gt;
				encapsulateSelection: function(options) {&lt;br /&gt;
					return this.each(function() {&lt;br /&gt;
						var insertText,&lt;br /&gt;
							selText,&lt;br /&gt;
							selectPeri = options.selectPeri,&lt;br /&gt;
							pre = options.pre,&lt;br /&gt;
							post = options.post,&lt;br /&gt;
							startCursor = cm.doc.getCursor(true),&lt;br /&gt;
							endCursor = cm.doc.getCursor(false);&lt;br /&gt;
		&lt;br /&gt;
						if (options.selectionStart !== undefined) {&lt;br /&gt;
							// fn[command].call( this, options );&lt;br /&gt;
							fn.setSelection({&lt;br /&gt;
								start: options.selectionStart,&lt;br /&gt;
								end: options.selectionEnd&lt;br /&gt;
							}); // not tested&lt;br /&gt;
						}&lt;br /&gt;
		&lt;br /&gt;
						selText = cm.doc.getSelection();&lt;br /&gt;
						if (!selText) {&lt;br /&gt;
							selText = options.peri;&lt;br /&gt;
						} else if (options.replace) {&lt;br /&gt;
							selectPeri = false;&lt;br /&gt;
							selText = options.peri;&lt;br /&gt;
						} else {&lt;br /&gt;
							selectPeri = false;&lt;br /&gt;
							while (selText.charAt(selText.length - 1) === &amp;#039; &amp;#039;) {&lt;br /&gt;
								// Exclude ending space char&lt;br /&gt;
								selText = selText.substring(0, selText.length - 1);&lt;br /&gt;
								post += &amp;#039; &amp;#039;;&lt;br /&gt;
							}&lt;br /&gt;
							while (selText.charAt(0) === &amp;#039; &amp;#039;) {&lt;br /&gt;
								// Exclude prepending space char&lt;br /&gt;
								selText = selText.substring(1, selText.length);&lt;br /&gt;
								pre = &amp;#039; &amp;#039; + pre;&lt;br /&gt;
							}&lt;br /&gt;
						}&lt;br /&gt;
		&lt;br /&gt;
						/**&lt;br /&gt;
						 * Do the splitlines stuff.&lt;br /&gt;
						 *&lt;br /&gt;
						 * Wrap each line of the selected text with pre and post&lt;br /&gt;
						 */&lt;br /&gt;
						function doSplitLines(selText, pre, post) {&lt;br /&gt;
							var i,&lt;br /&gt;
								insertText = &amp;#039;&amp;#039;,&lt;br /&gt;
								selTextArr = selText.split(&amp;#039;\n&amp;#039;);&lt;br /&gt;
		&lt;br /&gt;
							for (i = 0; i &amp;lt; selTextArr.length; i++) {&lt;br /&gt;
								insertText += pre + selTextArr[i] + post;&lt;br /&gt;
								if (i !== selTextArr.length - 1) {&lt;br /&gt;
									insertText += &amp;#039;\n&amp;#039;;&lt;br /&gt;
								}&lt;br /&gt;
							}&lt;br /&gt;
							return insertText;&lt;br /&gt;
						}&lt;br /&gt;
		&lt;br /&gt;
						if (options.splitlines) {&lt;br /&gt;
							selectPeri = false;&lt;br /&gt;
							insertText = doSplitLines(selText, pre, post);&lt;br /&gt;
						} else {&lt;br /&gt;
							insertText = pre + selText + post;&lt;br /&gt;
						}&lt;br /&gt;
		&lt;br /&gt;
						if (options.ownline) {&lt;br /&gt;
							if (startCursor.ch !== 0) {&lt;br /&gt;
								insertText = &amp;#039;\n&amp;#039; + insertText;&lt;br /&gt;
								pre += &amp;#039;\n&amp;#039;;&lt;br /&gt;
							}&lt;br /&gt;
		&lt;br /&gt;
							if (cm.doc.getLine(endCursor.line).length !== endCursor.ch) {&lt;br /&gt;
								insertText += &amp;#039;\n&amp;#039;;&lt;br /&gt;
								post += &amp;#039;\n&amp;#039;;&lt;br /&gt;
							}&lt;br /&gt;
						}&lt;br /&gt;
		&lt;br /&gt;
						cm.doc.replaceSelection(insertText);&lt;br /&gt;
		&lt;br /&gt;
						if (selectPeri) {&lt;br /&gt;
							cm.doc.setSelection(&lt;br /&gt;
								cm.doc.posFromIndex(cm.doc.indexFromPos(startCursor) + pre.length),&lt;br /&gt;
								cm.doc.posFromIndex(cm.doc.indexFromPos(startCursor) + pre.length + selText.length)&lt;br /&gt;
							);&lt;br /&gt;
						}&lt;br /&gt;
					});&lt;br /&gt;
				},&lt;br /&gt;
		&lt;br /&gt;
				/**&lt;br /&gt;
				 * Get the position (in resolution of bytes not necessarily characters)&lt;br /&gt;
				 * in a textarea&lt;br /&gt;
				 */&lt;br /&gt;
				getCaretPosition: function(options) {&lt;br /&gt;
					var caretPos = cm.doc.indexFromPos(cm.doc.getCursor(true)),&lt;br /&gt;
						endPos = cm.doc.indexFromPos(cm.doc.getCursor(false));&lt;br /&gt;
					if (options.startAndEnd) {&lt;br /&gt;
						return [caretPos, endPos];&lt;br /&gt;
					}&lt;br /&gt;
					return caretPos;&lt;br /&gt;
				},&lt;br /&gt;
		&lt;br /&gt;
				setSelection: function(options) {&lt;br /&gt;
					return this.each(function() {&lt;br /&gt;
						cm.doc.setSelection(cm.doc.posFromIndex(options.start), cm.doc.posFromIndex(options.end));&lt;br /&gt;
					});&lt;br /&gt;
				},&lt;br /&gt;
		&lt;br /&gt;
				/**&lt;br /&gt;
				 * Scroll a textarea to the current cursor position. You can set the cursor&lt;br /&gt;
				 * position with setSelection()&lt;br /&gt;
				 */&lt;br /&gt;
				scrollToCaretPosition: function() {&lt;br /&gt;
					return this.each(function() {&lt;br /&gt;
						cm.scrollIntoView(null);&lt;br /&gt;
					});&lt;br /&gt;
				}&lt;br /&gt;
			};&lt;br /&gt;
		&lt;br /&gt;
			switch (command) {&lt;br /&gt;
				// case &amp;#039;getContents&amp;#039;: // no params&lt;br /&gt;
				// case &amp;#039;setContents&amp;#039;: // no params with defaults&lt;br /&gt;
				// case &amp;#039;getSelection&amp;#039;: // no params&lt;br /&gt;
				case &amp;#039;encapsulateSelection&amp;#039;:&lt;br /&gt;
					options = $.extend({&lt;br /&gt;
						pre: &amp;#039;&amp;#039;, // Text to insert before the cursor/selection&lt;br /&gt;
						peri: &amp;#039;&amp;#039;, // Text to insert between pre and post and select afterwards&lt;br /&gt;
						post: &amp;#039;&amp;#039;, // Text to insert after the cursor/selection&lt;br /&gt;
						ownline: false, // Put the inserted text on a line of its own&lt;br /&gt;
						replace: false, // If there is a selection, replace it with peri instead of leaving it alone&lt;br /&gt;
						selectPeri: true, // Select the peri text if it was inserted (but not if there was a selection and replace==false, or if splitlines==true)&lt;br /&gt;
						splitlines: false, // If multiple lines are selected, encapsulate each line individually&lt;br /&gt;
						selectionStart: undefined, // Position to start selection at&lt;br /&gt;
						selectionEnd: undefined // Position to end selection at. Defaults to start&lt;br /&gt;
					}, options);&lt;br /&gt;
					break;&lt;br /&gt;
				case &amp;#039;getCaretPosition&amp;#039;:&lt;br /&gt;
					options = $.extend({&lt;br /&gt;
						// Return [start, end] instead of just start&lt;br /&gt;
						startAndEnd: false&lt;br /&gt;
					}, options);&lt;br /&gt;
					// FIXME: We may not need character position-based functions if we insert markers in the right places&lt;br /&gt;
					break;&lt;br /&gt;
				case &amp;#039;setSelection&amp;#039;:&lt;br /&gt;
					options = $.extend({&lt;br /&gt;
						// Position to start selection at&lt;br /&gt;
						start: undefined,&lt;br /&gt;
						// Position to end selection at. Defaults to start&lt;br /&gt;
						end: undefined,&lt;br /&gt;
						// Element to start selection in (iframe only)&lt;br /&gt;
						startContainer: undefined,&lt;br /&gt;
						// Element to end selection in (iframe only). Defaults to startContainer&lt;br /&gt;
						endContainer: undefined&lt;br /&gt;
					}, options);&lt;br /&gt;
		&lt;br /&gt;
					if (options.end === undefined) {&lt;br /&gt;
						options.end = options.start;&lt;br /&gt;
					}&lt;br /&gt;
					if (options.endContainer === undefined) {&lt;br /&gt;
						options.endContainer = options.startContainer;&lt;br /&gt;
					}&lt;br /&gt;
					// FIXME: We may not need character position-based functions if we insert markers in the right places&lt;br /&gt;
					break;&lt;br /&gt;
				case &amp;#039;scrollToCaretPosition&amp;#039;:&lt;br /&gt;
					options = $.extend({&lt;br /&gt;
						force: false // Force a scroll even if the caret position is already visible&lt;br /&gt;
					}, options);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
		&lt;br /&gt;
			retval = fn[command].call(this, options);&lt;br /&gt;
		&lt;br /&gt;
			return retval;&lt;br /&gt;
		};&lt;br /&gt;
	};&lt;br /&gt;
});&lt;br /&gt;
//&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>CaoPig</name></author>
	</entry>
</feed>