<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fa">
	<id>https://www.iran-pedia.org/w/index.php?action=history&amp;feed=atom&amp;title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C%3AGadget-AutoSign.js</id>
	<title>مدیاویکی:Gadget-AutoSign.js - تاریخچهٔ نسخه‌ها</title>
	<link rel="self" type="application/atom+xml" href="https://www.iran-pedia.org/w/index.php?action=history&amp;feed=atom&amp;title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C%3AGadget-AutoSign.js"/>
	<link rel="alternate" type="text/html" href="https://www.iran-pedia.org/w/index.php?title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Gadget-AutoSign.js&amp;action=history"/>
	<updated>2026-04-26T09:06:44Z</updated>
	<subtitle>تاریخچهٔ نسخه‌ها برای این صفحه در ویکی</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://www.iran-pedia.org/w/index.php?title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Gadget-AutoSign.js&amp;diff=2419&amp;oldid=prev</id>
		<title>Rootadmin: ۱ نسخه واردشده</title>
		<link rel="alternate" type="text/html" href="https://www.iran-pedia.org/w/index.php?title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Gadget-AutoSign.js&amp;diff=2419&amp;oldid=prev"/>
		<updated>2017-12-02T10:56:41Z</updated>

		<summary type="html">&lt;p&gt;۱ نسخه واردشده&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;fa&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;نسخهٔ ‏۲ دسامبر ۲۰۱۷، ساعت ۱۲:۵۶&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;fa&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>Rootadmin</name></author>
	</entry>
	<entry>
		<id>https://www.iran-pedia.org/w/index.php?title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Gadget-AutoSign.js&amp;diff=2418&amp;oldid=prev</id>
		<title>Rootadmin: ۱ نسخه واردشده</title>
		<link rel="alternate" type="text/html" href="https://www.iran-pedia.org/w/index.php?title=%D9%85%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Gadget-AutoSign.js&amp;diff=2418&amp;oldid=prev"/>
		<updated>2017-08-29T15:53:38Z</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;//https://meta.wikimedia.org/wiki/User:Perhelion/signing.js&lt;br /&gt;
/** Description: AUTOMATIC SIGNING: if not sure, warn.&lt;br /&gt;
*** aut. signing / (automatische Unterschrift) ***&lt;br /&gt;
* @documentation: see [[w:de:User:Perhelion/signing]]&lt;br /&gt;
* @revision: 20:41, 15 July 2016 (UTC)&lt;br /&gt;
* @authors:&lt;br /&gt;
*  created 23.04.2006 [[w:de:User:Olliminatore]] version 1.56 13.03.2007&lt;br /&gt;
*  updated 23.04.2006 [[w:en:User:Ilmari Karonen]]&lt;br /&gt;
*  updated 19.09.2011 – 29.12.2011 [[User:Perhelion]], FIX for non Gecko&lt;br /&gt;
*  updated 31.12.2011 [[w:de:User:PerfektesChaos]], some code improvements&lt;br /&gt;
*  updated 19.06.2014 Perhelion, fixes (code tidy up, jshint) gimmicks added&lt;br /&gt;
*  updated 09.09.2014 [[w:de:User:Schnark]] (code cosmetic)&lt;br /&gt;
*  –2016 Perhelion&lt;br /&gt;
* tested only on modern browsers &amp;lt;nowiki&amp;gt;&lt;br /&gt;
* @license released dual-licensed under the terms of the GFDL v1.2 or the GPL v2.&lt;br /&gt;
* required modules: &amp;#039;jquery.textSelection&amp;#039;,&amp;#039;mediawiki.language&amp;#039;,&amp;#039;mediawiki.util&amp;#039;, &amp;#039;mediawiki.action.edit.preview&amp;#039;&lt;br /&gt;
todo:&lt;br /&gt;
**/&lt;br /&gt;
(function($, mw) {&lt;br /&gt;
    &amp;#039;use strict&amp;#039;;&lt;br /&gt;
    if (!mw.libs || mw.libs.threadSign)&lt;br /&gt;
        return;&lt;br /&gt;
    var ns = mw.config.get(&amp;#039;wgNamespaceNumber&amp;#039;);&lt;br /&gt;
    var name = &amp;#039;امضاء کردن&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    function useLivePreview() {&lt;br /&gt;
        if (!Number(mw.user.options.get(&amp;#039;uselivepreview&amp;#039;)) &amp;amp;&amp;amp; (!$(&amp;#039;#wpMinoredit&amp;#039;).prop(&amp;#039;checked&amp;#039;) || $(&amp;#039;#wpSigning&amp;#039;).prop(&amp;#039;checked&amp;#039;))) {&lt;br /&gt;
            mw.user.options.set(&amp;#039;uselivepreview&amp;#039;, 1);&lt;br /&gt;
            mw.loader.load(&amp;#039;mediawiki.action.edit.preview&amp;#039;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    var threadSign = {&lt;br /&gt;
        version: &amp;#039;1.91j&amp;#039;,&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var c = $.extend({&lt;br /&gt;
                usersignature: (window.usersignature) ? usersignature : &amp;#039;-- ~~\~~&amp;#039;,&lt;br /&gt;
                sigAccessKey: &amp;#039;&amp;gt;&amp;#039;,&lt;br /&gt;
                sigText: null&lt;br /&gt;
            }, threadSign.config, mw.config.get([&amp;#039;wgDBname&amp;#039;, &amp;#039;wgAction&amp;#039;, &amp;#039;wgContentLanguage&amp;#039;, &amp;#039;wgRelevantUserName&amp;#039;, &amp;#039;wgFormattedNamespaces&amp;#039;, &amp;#039;wgUserName&amp;#039;, &amp;#039;wgPageName&amp;#039;, &amp;#039;wgIsArticle&amp;#039;]));&lt;br /&gt;
            if (!/^(edit|submit)$/.test(c.wgAction))&lt;br /&gt;
                return;&lt;br /&gt;
            var newSection = /section=new/.test(location.search);&lt;br /&gt;
            if (!c.sigText)&lt;br /&gt;
                c.sigText = c.usersignature;&lt;br /&gt;
            c.sigText = &amp;#039; &amp;#039; + $.trim(c.sigText) + &amp;#039;\n&amp;#039;;&lt;br /&gt;
            var regpages = null,&lt;br /&gt;
                whitelist = [],&lt;br /&gt;
                blacklist = [],&lt;br /&gt;
                p, len;&lt;br /&gt;
            if (newSection)&lt;br /&gt;
                c.dSum = &amp;#039;&amp;#039;;&lt;br /&gt;
            if (ns === 4) {&lt;br /&gt;
                if (c.regpages) {&lt;br /&gt;
                    regpages = c.regpages;&lt;br /&gt;
                    if (!$.isArray(regpages) || typeof regpages[0] !== &amp;#039;string&amp;#039;)&lt;br /&gt;
                        return alert(&amp;#039;Config error: &amp;quot;&amp;#039; + regpages + &amp;#039;&amp;quot; must be of type string array.&amp;#039;);&lt;br /&gt;
                }&lt;br /&gt;
                blacklist = [/\/[Ii]ntro$/, /\/[Hh]eader$/, /\/بایگانی?[ _/]/, /\/[Aa]rchive?[ _/]/, /\/\d{4}\/\d\d\/\d\d$/];&lt;br /&gt;
                switch (c.wgDBname) {&lt;br /&gt;
                    case &amp;#039;enwiki&amp;#039;:&lt;br /&gt;
                        whitelist = [&amp;#039;:Requests for undeletion&amp;#039;, &amp;#039;:Requests for adminship/&amp;#039;, &amp;#039;:Requests for arbitration/&amp;#039;, &amp;#039;:Requests for permissions&amp;#039;, &amp;#039; for deletion&amp;#039;, &amp;#039; for discussion&amp;#039;, &amp;#039;:Dispute resolution noticeboard&amp;#039;, &amp;#039;:Adminship survey&amp;#039;, &amp;#039;:Deletion review&amp;#039;, &amp;#039;:Cleanup&amp;#039;, &amp;#039;:SVG help&amp;#039;, &amp;#039;:Arbitration/&amp;#039;, &amp;#039;:Village pump&amp;#039;, &amp;#039;:Articles for deletion&amp;#039;, &amp;#039;.*noticeboard.*&amp;#039;, &amp;#039;:page protection&amp;#039;, &amp;#039;mediation)&amp;#039;, &amp;#039;:Bot requests&amp;#039;, &amp;#039;:Help desk&amp;#039;, &amp;#039;:Editor review&amp;#039;, &amp;#039;:Media copyright questions&amp;#039;];&lt;br /&gt;
                        break;&lt;br /&gt;
                    case &amp;#039;fawiki&amp;#039;:&lt;br /&gt;
                        whitelist = [&amp;#039;:نظرخواهی.*&amp;#039;,&amp;#039;:درخواست.*&amp;#039;,&amp;#039;:قهوه‌خانه.*&amp;#039;,&amp;#039;:تابلوی اعلانات.*&amp;#039;];&lt;br /&gt;
                        break;&lt;br /&gt;
                }&lt;br /&gt;
                for (p = 0, len = blacklist.length; p &amp;lt; len; p++) {&lt;br /&gt;
                    if (blacklist[p].test(c.wgPageName)) {&lt;br /&gt;
                        whitelist = &amp;#039;&amp;#039;;&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                regpages = (regpages &amp;amp;&amp;amp; whitelist) ? whitelist.concat(regpages) : whitelist;&lt;br /&gt;
                if (newSection)&lt;br /&gt;
                    regpages = &amp;#039;&amp;#039;;&lt;br /&gt;
                if (whitelist) {&lt;br /&gt;
                    if ($.isArray(regpages))&lt;br /&gt;
                        for (p = 0, len = regpages.length; p &amp;lt; len; p++) {&lt;br /&gt;
                            if (c.wgPageName.indexOf(regpages[p].replace(/ /g, &amp;#039;_&amp;#039;)) !== -1) {&lt;br /&gt;
                                regpages = &amp;#039;&amp;#039;;&lt;br /&gt;
                                break;&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    if (c.wgDBname === &amp;#039;enwiki&amp;#039;) {&lt;br /&gt;
                        $(&amp;#039;.hiddencats li&amp;#039;).children(&amp;#039;a&amp;#039;).each(function() {&lt;br /&gt;
                            if (this.text &amp;amp;&amp;amp; /Non-talk pages that are automatically signed$/.test(this.text))&lt;br /&gt;
                                regpages = &amp;#039;&amp;#039;;&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                    if (regpages) {&lt;br /&gt;
                        $.when(mw.loader.load(&amp;#039;mediawiki.util&amp;#039;), $.ready).then(function() {&lt;br /&gt;
                            $.getJSON(mw.util.wikiScript(&amp;#039;api&amp;#039;), {&lt;br /&gt;
                                action: &amp;#039;query&amp;#039;,&lt;br /&gt;
                                prop: &amp;#039;pageprops&amp;#039;,&lt;br /&gt;
                                indexpageids: true,&lt;br /&gt;
                                titles: c.wgPageName,&lt;br /&gt;
                                cache: true,&lt;br /&gt;
                                format: &amp;#039;json&amp;#039;,&lt;br /&gt;
                                timeout: 3000&lt;br /&gt;
                            }).done(function(json) {&lt;br /&gt;
                                if (!json || !json.query || !json.query.pages)&lt;br /&gt;
                                    return console.log(&amp;#039;could not get page info!&amp;#039;);&lt;br /&gt;
                                json = json.query.pages[json.query.pageids];&lt;br /&gt;
                                if (json &amp;amp;&amp;amp; json.pageprops &amp;amp;&amp;amp; typeof json.pageprops.newsectionlink !== &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
                                    if (&amp;#039;Perhelion&amp;#039; === c.wgUserName) alert(&amp;#039;Page was still not registered!&amp;#039;);&lt;br /&gt;
                                    c.regpages = &amp;#039;&amp;#039;;&lt;br /&gt;
                                }&lt;br /&gt;
                            }).always(function() {&lt;br /&gt;
                                threadSign.exec(c);&lt;br /&gt;
                            });&lt;br /&gt;
                        });&lt;br /&gt;
                    } else {&lt;br /&gt;
                        c.regpages = &amp;#039;&amp;#039;;&lt;br /&gt;
                        return threadSign.exec(c);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            } else {&lt;br /&gt;
                if (ns % 2 === 1)&lt;br /&gt;
                    regpages = &amp;#039;&amp;#039;;&lt;br /&gt;
                c.regpages = regpages;&lt;br /&gt;
                if (regpages === &amp;#039;&amp;#039; || ns === 2)&lt;br /&gt;
                    return threadSign.exec(c);&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        _cntOcc: function(txt) {&lt;br /&gt;
            var sig = /~{3}/g,&lt;br /&gt;
                falseRe = /(\{\{subst\:unsig.*?\}\})|(&amp;lt;nowiki&amp;gt;[\s\S]*?&amp;lt;\/nowiki&amp;gt;)|(&amp;lt;!--[\s\S]*?--&amp;gt;)/g,&lt;br /&gt;
                count = 0,&lt;br /&gt;
                cnt2 = 0,&lt;br /&gt;
                cnt = 0;&lt;br /&gt;
            while (sig.test(txt))&lt;br /&gt;
                cnt++;&lt;br /&gt;
            count = txt.match(falseRe) || [];&lt;br /&gt;
            for (var i = 0; i &amp;lt; count.length; i++) {&lt;br /&gt;
                while (sig.test(count[i]))&lt;br /&gt;
                    cnt2++;&lt;br /&gt;
            }&lt;br /&gt;
            return [cnt, cnt2];&lt;br /&gt;
        },&lt;br /&gt;
        setIndentation: function(e) {&lt;br /&gt;
            var $textarea = $(e.target);&lt;br /&gt;
            var txt = $textarea.val();&lt;br /&gt;
            var pos = $textarea.textSelection(&amp;#039;getCaretPosition&amp;#039;);&lt;br /&gt;
            if (!pos)&lt;br /&gt;
                return;&lt;br /&gt;
            var txtE = txt.slice(pos);&lt;br /&gt;
            txt = txt.slice(0, pos);&lt;br /&gt;
            var lrI = txt.lastIndexOf(&amp;#039;\n&amp;#039;);&lt;br /&gt;
            var line = txt.slice(lrI + 1, pos);&lt;br /&gt;
            this.indent = &amp;quot;&amp;quot;;&lt;br /&gt;
            if (line) {&lt;br /&gt;
                var lrM = line.match(/^[:*#]+ ?/);&lt;br /&gt;
                if (lrM) {&lt;br /&gt;
                    var lrLen = lrM[0].length;&lt;br /&gt;
                    if (lrLen) {&lt;br /&gt;
                        $textarea.val(txt + &amp;#039;\n&amp;#039; + lrM[0] + txtE);&lt;br /&gt;
                        this.indent = [pos, lrLen];&lt;br /&gt;
                        lrLen++;&lt;br /&gt;
                        $textarea.textSelection(&amp;#039;setSelection&amp;#039;, {&lt;br /&gt;
                            start: pos + lrLen&lt;br /&gt;
                        });&lt;br /&gt;
                        e.preventDefault();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            return;&lt;br /&gt;
        },&lt;br /&gt;
        rmvIndentation: function(e) {&lt;br /&gt;
            var $textarea = $(e.target);&lt;br /&gt;
            var txt = $textarea.val();&lt;br /&gt;
            var pos = this.indent[0];&lt;br /&gt;
            if (pos) {&lt;br /&gt;
                pos++;&lt;br /&gt;
                var txtE = txt.slice(pos + this.indent[1]);&lt;br /&gt;
                txt = txt.slice(0, pos);&lt;br /&gt;
                this.indent = &amp;quot;&amp;quot;;&lt;br /&gt;
                $textarea.val(txt + txtE);&lt;br /&gt;
                $textarea.textSelection(&amp;#039;setSelection&amp;#039;, {&lt;br /&gt;
                    start: pos&lt;br /&gt;
                });&lt;br /&gt;
                return e.preventDefault();&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        exec: function(c) {&lt;br /&gt;
            var $Minoredit = $(&amp;#039;#wpMinoredit&amp;#039;),&lt;br /&gt;
                $editform = $(&amp;#039;#editform&amp;#039;),&lt;br /&gt;
                signTxt = [],&lt;br /&gt;
                $textarea = $(&amp;#039;#wpTextbox1&amp;#039;),&lt;br /&gt;
                $sum = $editform.find(&amp;#039;input#wpSummary, #wpSummary &amp;gt; input&amp;#039;),&lt;br /&gt;
                n = /\n/,&lt;br /&gt;
                maxlLength = 40,&lt;br /&gt;
                bSig = !(c.regpages !== &amp;#039;&amp;#039; || ns === 2);&lt;br /&gt;
            if (window.wikEd instanceof Object)&lt;br /&gt;
                return console.log(name, &amp;#039;is not compatible with wikEd&amp;#039;);&lt;br /&gt;
            if (bSig) useLivePreview();&lt;br /&gt;
            $textarea.on(&amp;#039;keypress&amp;#039;, function(e) {&lt;br /&gt;
                if (e.which === 13)&lt;br /&gt;
                    return threadSign.setIndentation(e);&lt;br /&gt;
                if (e.which === 8 &amp;amp;&amp;amp; threadSign.indent)&lt;br /&gt;
                    return threadSign.rmvIndentation(e);&lt;br /&gt;
                threadSign.indent = &amp;quot;&amp;quot;;&lt;br /&gt;
            });&lt;br /&gt;
            if (mw.language &amp;amp;&amp;amp; $.inArray(&amp;#039;de&amp;#039;, mw.language.getFallbackLanguageChain()) !== -1)&lt;br /&gt;
                signTxt = {&lt;br /&gt;
                    boxTitle: &amp;#039;Diese Bearbeitung automatisch unterschreiben.&amp;#039;,&lt;br /&gt;
                    boxText: &amp;#039;Signieren&amp;#039;,&lt;br /&gt;
                    btnAlt: &amp;#039;Manuelle Signatur&amp;#039;,&lt;br /&gt;
                    confirm: &amp;#039;Es wurde keine Signierung gefunden. Trotzdem fortfahren?&amp;#039;&lt;br /&gt;
                };&lt;br /&gt;
            else&lt;br /&gt;
                signTxt = {&lt;br /&gt;
                    boxTitle: &amp;#039;امضای خودکار این متن&amp;#039;,&lt;br /&gt;
                    boxText: &amp;#039;امضاء کردن&amp;#039;,&lt;br /&gt;
                    btnAlt: &amp;#039;امضاء به صورت دستی&amp;#039;,&lt;br /&gt;
                    confirm: &amp;#039;امضایی یافت نشد ادامه دهم؟&amp;#039;&lt;br /&gt;
                };&lt;br /&gt;
            signTxt.hi = ($.inArray(c.wgContentLanguage, [&amp;#039;de&amp;#039;, &amp;#039;nn&amp;#039;, &amp;#039;da&amp;#039;]) !== -1) ? &amp;#039;Hallo &amp;#039; : &amp;#039;درود&amp;#039;;&lt;br /&gt;
            if (!$editform.length)&lt;br /&gt;
                return;&lt;br /&gt;
            threadSign.setPing = function() {&lt;br /&gt;
                var reUser = getUser();&lt;br /&gt;
                reUser = (reUser &amp;amp;&amp;amp; reUser[1] &amp;amp;&amp;amp; reUser[1] !== c.wgRelevantUserName) ? reUser[1] : &amp;#039;&amp;#039;;&lt;br /&gt;
                return $textarea.textSelection(&amp;#039;encapsulateSelection&amp;#039;, {&lt;br /&gt;
                    pre: &amp;#039;{{پینگ|&amp;#039;,&lt;br /&gt;
                    peri: reUser,&lt;br /&gt;
                    post: &amp;#039;}}&amp;#039;&lt;br /&gt;
                });&lt;br /&gt;
            };&lt;br /&gt;
            threadSign.setOutdent = function() {&lt;br /&gt;
                var txt = $textarea.val();&lt;br /&gt;
                var outdent = (c.wgDBname === &amp;#039;fawiki&amp;#039;) ? &amp;#039;\n{{تورفتگی}}&amp;#039; : &amp;#039;\n:┘{{padleft:┌|22|─}}\n&amp;#039;;&lt;br /&gt;
                var pos = $textarea.textSelection(&amp;#039;getCaretPosition&amp;#039;);&lt;br /&gt;
                if (pos &amp;lt; 0)&lt;br /&gt;
                    pos = txt.length;&lt;br /&gt;
                if (n.test(txt[pos]) &amp;amp;&amp;amp; !n.test(txt[pos - 1]))&lt;br /&gt;
                    pos++;&lt;br /&gt;
                if (txt[pos + 1] &amp;amp;&amp;amp; n.test(txt[pos + 1]))&lt;br /&gt;
                    pos++;&lt;br /&gt;
                rmvIndent($.trim(txt.slice(0, pos)) + outdent + txt.slice(pos), CmtE);&lt;br /&gt;
            };&lt;br /&gt;
            var doSig = threadSign.doSig = function(e, pos) {&lt;br /&gt;
                var txt = $textarea.val();&lt;br /&gt;
                var sigText = c.sigText;&lt;br /&gt;
                if (!pos) {&lt;br /&gt;
                    pos = $textarea.textSelection(&amp;#039;getCaretPosition&amp;#039;);&lt;br /&gt;
                    sigText = sigText.replace(/\n+$/, &amp;#039;&amp;#039;);&lt;br /&gt;
                } else {&lt;br /&gt;
                    if (pos &amp;lt; 0)&lt;br /&gt;
                        pos = txt.length;&lt;br /&gt;
                    var tmpRe = /\}\}\s*$/;&lt;br /&gt;
                    if (tmpRe.test(txt.slice(pos - 4, pos))) {&lt;br /&gt;
                        var lrIndex = txt.slice(0, pos).replace(/\s+$/, &amp;#039;&amp;#039;).lastIndexOf(r);&lt;br /&gt;
                        var tmpTxt = txt.slice(lrIndex, pos);&lt;br /&gt;
                        if (/\|1\s*=[^\n]*(\}\})\s*$/.test(tmpTxt)) {&lt;br /&gt;
                            tmpRe = tmpTxt.search(tmpRe);&lt;br /&gt;
                            pos = lrIndex + tmpRe;&lt;br /&gt;
                            sigText = sigText.replace(/\n+$/, &amp;#039;&amp;#039;);&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                sigText = (pos &amp;gt; maxlLength &amp;amp;&amp;amp; !n.test(txt.slice(pos - maxlLength, pos).replace(/\n+$/, &amp;#039;&amp;#039;))) ? sigText : sigText.replace(/white-space:nowrap;?/, &amp;#039;&amp;#039;).replace(&amp;#039; style=&amp;quot;&amp;quot;&amp;#039;, &amp;#039;&amp;#039;);&lt;br /&gt;
                if (n.test(txt[pos]) &amp;amp;&amp;amp; !n.test(txt[pos - 1]))&lt;br /&gt;
                    pos++;&lt;br /&gt;
                if (txt[pos + 1] &amp;amp;&amp;amp; n.test(txt[pos + 1]))&lt;br /&gt;
                    pos++;&lt;br /&gt;
                rmvIndent(txt.slice(0, pos).replace(/\s+$/, &amp;#039;&amp;#039;) + sigText + txt.slice(pos), CmtE, pos);&lt;br /&gt;
                if (c.dSum) {&lt;br /&gt;
                    if (!/^(?:(\/\*.+?\*\/ *))([^ ])|^([^/]+?)(?!\/\*.+?\*\/ *)/.test($sum.val())) {&lt;br /&gt;
                        $sum[0].value += c.dSum;&lt;br /&gt;
                    }&lt;br /&gt;
                    c.dSum = &amp;#039;&amp;#039;;&lt;br /&gt;
                }&lt;br /&gt;
                return e;&lt;br /&gt;
            };&lt;br /&gt;
            var $sigBox = $(&amp;#039;&amp;lt;input&amp;gt;&amp;#039;, {&lt;br /&gt;
                type: &amp;#039;checkbox&amp;#039;,&lt;br /&gt;
                name: &amp;#039;wpSigning&amp;#039;,&lt;br /&gt;
                id: &amp;#039;wpSigning&amp;#039;,&lt;br /&gt;
                checked: bSig,&lt;br /&gt;
                change: function() {&lt;br /&gt;
                    useLivePreview();&lt;br /&gt;
                    $(this).next().toggleClass(&amp;#039;usermessage&amp;#039;);&lt;br /&gt;
                },&lt;br /&gt;
                &amp;#039;class&amp;#039;: &amp;#039;not-patrolled&amp;#039;,&lt;br /&gt;
                accessKey: c.sigAccessKey&lt;br /&gt;
            });&lt;br /&gt;
            var cURL = &amp;#039;https://upload.wikimedia.org/wikipedia/commons/thumb/&amp;#039;;&lt;br /&gt;
            var $sBtn = $(&amp;#039;&amp;lt;img&amp;gt;&amp;#039;, {&lt;br /&gt;
                src: cURL + &amp;#039;5/52/Tango_style_insert-signature_icon.svg/22px-Tango_style_insert-signature_icon.svg.png&amp;#039;,&lt;br /&gt;
                title: &amp;#039;امضاء کردن&amp;#039;,&lt;br /&gt;
                rel: &amp;#039;امضاء کردن&amp;#039;,&lt;br /&gt;
                alt: signTxt.btnAlt,&lt;br /&gt;
                width: &amp;#039;22&amp;#039;,&lt;br /&gt;
                onclick: &amp;#039;mw.libs.threadSign.doSig(event)&amp;#039;,&lt;br /&gt;
                height: &amp;#039;22&amp;#039;,&lt;br /&gt;
                style: &amp;#039;cursor:pointer&amp;#039;,&lt;br /&gt;
                &amp;#039;class&amp;#039;: &amp;#039;tool&amp;#039;&lt;br /&gt;
            });&lt;br /&gt;
            var $pBtn = $sBtn.clone().attr({&lt;br /&gt;
                src: cURL + &amp;#039;f/fa/Tango_style_ping_icon.svg/22px-Tango_style_ping_icon.svg.png&amp;#039;,&lt;br /&gt;
                title: &amp;#039;Ping&amp;#039;,&lt;br /&gt;
                alt: &amp;#039;&amp;#039;,&lt;br /&gt;
                rel: &amp;#039;Ping&amp;#039;,&lt;br /&gt;
                onclick: &amp;#039;mw.libs.threadSign.setPing()&amp;#039;&lt;br /&gt;
            });&lt;br /&gt;
            var $oBtn = $sBtn.clone().attr({&lt;br /&gt;
                src: cURL + &amp;#039;b/bb/Tango_style_outdent_icon.svg/22px-Tango_style_outdent_icon.svg.png&amp;#039;,&lt;br /&gt;
                title: &amp;#039;Outdent&amp;#039;,&lt;br /&gt;
                alt: &amp;#039;&amp;#039;,&lt;br /&gt;
                rel: &amp;#039;Outdent&amp;#039;,&lt;br /&gt;
                onclick: &amp;#039;mw.libs.threadSign.setOutdent()&amp;#039;&lt;br /&gt;
            });&lt;br /&gt;
            if (!$(&amp;#039;#wpSigning&amp;#039;).length) {&lt;br /&gt;
                $(&amp;#039;#wpWatchthis&amp;#039;).parent().parent().append($sigBox, $(&amp;#039;&amp;lt;label&amp;gt;&amp;#039;, {&lt;br /&gt;
                    &amp;#039;for&amp;#039;: &amp;#039;wpSigning&amp;#039;,&lt;br /&gt;
                    &amp;#039;class&amp;#039;: (bSig) ? &amp;#039;usermessage&amp;#039; : &amp;#039;&amp;#039;,&lt;br /&gt;
                    title: signTxt.boxTitle,&lt;br /&gt;
                    style: &amp;#039;padding:2px 6px;&amp;#039; + ((!bSig) ? &amp;#039;border-color:#C00;color:#A00&amp;#039; : &amp;#039;&amp;#039;),&lt;br /&gt;
                    text: signTxt.boxText&lt;br /&gt;
                }), $sBtn, $oBtn, $pBtn);&lt;br /&gt;
            }&lt;br /&gt;
            if ($sigBox.updateTooltipAccessKeys)&lt;br /&gt;
                $sigBox.updateTooltipAccessKeys();&lt;br /&gt;
&lt;br /&gt;
            function stripeCmt(txt) {&lt;br /&gt;
                var cmtRe = /(&amp;lt;!--[\s\S]*?--&amp;gt;)(?!\n*&amp;lt;!--)/g;&lt;br /&gt;
                var cmtRight = &amp;#039;&amp;#039;;&lt;br /&gt;
                CmtE = &amp;#039;&amp;#039;;&lt;br /&gt;
                while (cmtRe.test(txt)) {&lt;br /&gt;
                    CmtE = &amp;#039;\n&amp;#039; + RegExp.lastMatch;&lt;br /&gt;
                }&lt;br /&gt;
                if (CmtE) {&lt;br /&gt;
                    var cmtEndI = cmtRe.lastIndex;&lt;br /&gt;
                    if (cmtEndI &amp;lt; txt.length &amp;amp;&amp;amp; cmtEndI &amp;gt; txtLen) {&lt;br /&gt;
                        cmtRight = txt.slice(cmtEndI);&lt;br /&gt;
                    }&lt;br /&gt;
                    txt = $.trim(txt.slice(0, cmtEndI - CmtE.length));&lt;br /&gt;
                    CmtE += cmtRight;&lt;br /&gt;
                }&lt;br /&gt;
                return txt;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function rmvIndent(txt, cmtE, pos) {&lt;br /&gt;
                var lrLi = 0;&lt;br /&gt;
                if (lrLen) {&lt;br /&gt;
                    if (cmtE) {&lt;br /&gt;
                        txt = stripeCmt(txt);&lt;br /&gt;
                        cmtE = CmtE;&lt;br /&gt;
                    }&lt;br /&gt;
                    lrLi = txt.lastIndexOf(r);&lt;br /&gt;
                    txt = txt.slice(0, lrLi) + txt.slice(lrLi).replace(new RegExp(&amp;#039;\\n[:*# ]+ *&amp;#039; + $.trim(reUser) + &amp;#039; *$&amp;#039;), &amp;#039;&amp;#039;) + cmtE;&lt;br /&gt;
                    reUser = &amp;#039;&amp;#039;;&lt;br /&gt;
                    lrLen = &amp;#039;&amp;#039;;&lt;br /&gt;
                }&lt;br /&gt;
                $textarea.val(txt);&lt;br /&gt;
                if (pos)&lt;br /&gt;
                    $textarea.textSelection(&amp;#039;setSelection&amp;#039;, {&lt;br /&gt;
                        start: pos&lt;br /&gt;
                    }).textSelection(&amp;#039;scrollToCaretPosition&amp;#039;).focus();&lt;br /&gt;
                return txt;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function getUser() {&lt;br /&gt;
                var strRe = new RegExp(&amp;#039;\\[\\[(?:&amp;#039; + c.wgFormattedNamespaces[2] + &amp;#039;(?:in)?|&amp;#039; + c.wgFormattedNamespaces[3] + &amp;#039;|User(?:[ _]talk)?): ?([^\\]\\|[]+)(?:\\|([^\\]\[]+))?\\]\\]&amp;#039;, &amp;#039;ig&amp;#039;);&lt;br /&gt;
                var reUser = &amp;#039;&amp;#039;;&lt;br /&gt;
                while (strRe.test(lrR)) {&lt;br /&gt;
                    reUser = [RegExp.lastMatch, RegExp.$1, RegExp.$2];&lt;br /&gt;
                }&lt;br /&gt;
                if (reUser) {&lt;br /&gt;
                    if (reUser[2]) {&lt;br /&gt;
                        if (new RegExp(c.wgFormattedNamespaces[3] + &amp;#039;|User[ _]talk&amp;#039;, &amp;#039;i&amp;#039;).test(reUser[0]))&lt;br /&gt;
                            reUser.pop();&lt;br /&gt;
                        else {&lt;br /&gt;
                            reUser[2] = $.trim(reUser[2]);&lt;br /&gt;
                            if (reUser[2].indexOf(&amp;#039; &amp;#039;) &amp;gt; 1)&lt;br /&gt;
                                reUser.pop();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    var user = $.trim(reUser[1].replace(strRe, &amp;#039;$1&amp;#039;));&lt;br /&gt;
                    if (user) {&lt;br /&gt;
                        if (user.indexOf(&amp;#039;/&amp;#039;) !== -1)&lt;br /&gt;
                            user = user.split(&amp;#039;/&amp;#039;)[0];&lt;br /&gt;
                        else if (user.indexOf(&amp;#039;#&amp;#039;) !== -1)&lt;br /&gt;
                            user = user.split(&amp;#039;#&amp;#039;)[0];&lt;br /&gt;
                    }&lt;br /&gt;
                    reUser[1] = (user !== c.wgUserName) ? user : &amp;#039;&amp;#039;;&lt;br /&gt;
                }&lt;br /&gt;
                return reUser;&lt;br /&gt;
            }&lt;br /&gt;
            var txtOld = $.trim($textarea.val()),&lt;br /&gt;
                CmtE = &amp;#039;&amp;#039;,&lt;br /&gt;
                txt = txtOld,&lt;br /&gt;
                r = &amp;#039;\n&amp;#039;;&lt;br /&gt;
            if (!txt) {&lt;br /&gt;
                c.dSum = &amp;#039;&amp;#039;;&lt;br /&gt;
                if (ns === 3 &amp;amp;&amp;amp; !$Minoredit.length &amp;amp;&amp;amp; c.wgRelevantUserName !== c.wgUserName) {&lt;br /&gt;
                    txt = signTxt.hi + &amp;#039;،\n&amp;#039;;&lt;br /&gt;
                    $textarea.val(txt).textSelection(&amp;#039;setSelection&amp;#039;, {&lt;br /&gt;
                        start: txt.length - 1&lt;br /&gt;
                    }).focus();&lt;br /&gt;
                }&lt;br /&gt;
            } else if (/--&amp;gt;$/.test(txt))&lt;br /&gt;
                txt = stripeCmt(txt);&lt;br /&gt;
            var txtLen = txt.length,&lt;br /&gt;
                lrI = txt.lastIndexOf(r) + 1,&lt;br /&gt;
                lrR = txt.slice(lrI),&lt;br /&gt;
                lrM = lrR.match(/^[:*#]+/),&lt;br /&gt;
                lrLen = (lrM) ? lrM[0].length : 0,&lt;br /&gt;
                txtEndLen = -18 - lrLen,&lt;br /&gt;
                txtOldEnd = txtOld.slice(txtEndLen),&lt;br /&gt;
                reUser = &amp;#039;&amp;#039;,&lt;br /&gt;
                txtOldL = txtOld.length;&lt;br /&gt;
            if (c.wgAction === &amp;#039;edit&amp;#039;) {&lt;br /&gt;
                if (lrLen &amp;amp;&amp;amp; lrI + lrLen + 1 &amp;lt; txtLen) {&lt;br /&gt;
                    lrI = &amp;#039;:&amp;#039;;&lt;br /&gt;
                    lrLen++;&lt;br /&gt;
                    if (lrLen === 2 &amp;amp;&amp;amp; lrM[0] !== &amp;#039;:&amp;#039;) {&lt;br /&gt;
                        lrI = &amp;#039;&amp;#039;;&lt;br /&gt;
                        lrLen = 1;&lt;br /&gt;
                    }&lt;br /&gt;
                    $textarea.val(txt + r + lrM[0] + lrI + &amp;#039; &amp;#039; + CmtE);&lt;br /&gt;
                    txtLen += lrLen + 2;&lt;br /&gt;
                } else if (!lrLen &amp;amp;&amp;amp; c.autoSalut &amp;amp;&amp;amp; txtOldEnd &amp;amp;&amp;amp; /\d{4} \((?:CES?T|UTC)\)[^\d]*?$/.test(lrR)) {&lt;br /&gt;
                    lrLen++;&lt;br /&gt;
                    reUser = getUser();&lt;br /&gt;
                    lrI = &amp;#039;&amp;#039;;&lt;br /&gt;
                    if (reUser) {&lt;br /&gt;
                        lrI = &amp;#039;: &amp;#039;;&lt;br /&gt;
                        reUser = (reUser[2] &amp;amp;&amp;amp; /\w+/.test(reUser[2])) ? reUser[2] : reUser[1];&lt;br /&gt;
                        if (reUser)&lt;br /&gt;
                            reUser = signTxt.hi + reUser.replace(/\d+$/g, &amp;#039;&amp;#039;) + &amp;#039;, &amp;#039;;&lt;br /&gt;
                        lrLen += reUser.length;&lt;br /&gt;
                    }&lt;br /&gt;
                    txtLen += lrLen + lrI.length;&lt;br /&gt;
                    $textarea.val(txt + r + lrI + reUser + CmtE);&lt;br /&gt;
                } else {&lt;br /&gt;
                    lrLen = 0;&lt;br /&gt;
                    if (txt) {&lt;br /&gt;
                        txtLen++;&lt;br /&gt;
                        $textarea.val(txt + r + CmtE);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            if (bSig)&lt;br /&gt;
                $(window).on( &amp;#039;load&amp;#039;, function() {&lt;br /&gt;
                    $textarea.textSelection(&amp;#039;setSelection&amp;#039;, {&lt;br /&gt;
                        start: txtLen&lt;br /&gt;
                    }).textSelection(&amp;#039;scrollToCaretPosition&amp;#039;).focus();&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
            function offSigBox(e) {&lt;br /&gt;
                if (e.type === &amp;#039;click&amp;#039;)&lt;br /&gt;
                    e = $(e.target);&lt;br /&gt;
                e = e.prop(&amp;#039;checked&amp;#039;);&lt;br /&gt;
                if (e)&lt;br /&gt;
                    useLivePreview();&lt;br /&gt;
                $sigBox.prop(&amp;#039;disabled&amp;#039;, e);&lt;br /&gt;
            }&lt;br /&gt;
            if ($Minoredit.length) {&lt;br /&gt;
                offSigBox($Minoredit);&lt;br /&gt;
                $Minoredit.click(offSigBox);&lt;br /&gt;
            }&lt;br /&gt;
            threadSign.doSign = function(e) {&lt;br /&gt;
                function _chkEdit(c, pos) {&lt;br /&gt;
                    pos = txt.indexOf(c, pos--);&lt;br /&gt;
                    if (pos &amp;gt; 1) {&lt;br /&gt;
                        var txtEnd = txt.substr(pos, 24).replace(/(^\s+)/, &amp;#039;&amp;#039;);&lt;br /&gt;
                        var txtNewEnd = txt.slice(pos - 16, pos);&lt;br /&gt;
                        var oldp = (c === r) ? txtOld.lastIndexOf(txtEnd) : 0;&lt;br /&gt;
                        if (!oldp &amp;amp;&amp;amp; /--&amp;gt;$/.test(txtEnd)) {&lt;br /&gt;
                            c = txt.lastIndexOf(&amp;#039;&amp;lt;!--&amp;#039;);&lt;br /&gt;
                            if (c &amp;lt; pos)&lt;br /&gt;
                                pos = c--;&lt;br /&gt;
                        }&lt;br /&gt;
                        if (oldp !== -1 &amp;amp;&amp;amp; oldp &amp;lt; pos - 3 &amp;amp;&amp;amp; txtOld.indexOf(txtNewEnd + RegExp.$1 + txtEnd) === -1) {&lt;br /&gt;
                            return pos;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                var tolerance = 4;&lt;br /&gt;
                var $textarea = $(&amp;#039;#wpTextbox1&amp;#039;);&lt;br /&gt;
                var txt = $.trim($textarea.val());&lt;br /&gt;
                if ($(&amp;#039;#wpMinoredit&amp;#039;).prop(&amp;#039;checked&amp;#039;) || !$(&amp;#039;#wpSigning&amp;#039;).prop(&amp;#039;checked&amp;#039;))&lt;br /&gt;
                    return rmvIndent(txt, CmtE);&lt;br /&gt;
                if (!txt)&lt;br /&gt;
                    return;&lt;br /&gt;
                var cOld = threadSign._cntOcc(txtOld),&lt;br /&gt;
                    cNew = threadSign._cntOcc(txt),&lt;br /&gt;
                    oldp, txtEnd, pos;&lt;br /&gt;
                if (cNew[0] - cNew[1])&lt;br /&gt;
                    return rmvIndent(txt, CmtE);&lt;br /&gt;
                if (cNew[0] &amp;lt;= cOld[1]) {&lt;br /&gt;
                    if (!CmtE) {&lt;br /&gt;
                        txtEnd = [txt.substr(txtEndLen - (lrLen ? lrLen + 1 : 0), -txtEndLen), txt.slice(txtEndLen)];&lt;br /&gt;
                        oldp = txtOldL + txtEndLen;&lt;br /&gt;
                        if (!txtOld || $.inArray(txtOldEnd, txtEnd) &amp;lt; 0) {&lt;br /&gt;
                            return doSig(e, -1);&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    pos = $textarea.textSelection(&amp;#039;getCaretPosition&amp;#039;);&lt;br /&gt;
                    pos = _chkEdit(r, pos);&lt;br /&gt;
                    if (pos) {&lt;br /&gt;
                        return doSig(e, pos);&lt;br /&gt;
                    }&lt;br /&gt;
                    txt = rmvIndent(txt, CmtE);&lt;br /&gt;
                    if (txt.length &amp;gt; (txtOldL + tolerance)) {&lt;br /&gt;
                        var lines = txt.match(/.+/gm) || [],&lt;br /&gt;
                            linesOld = txtOld.match(/.+/gm) || [];&lt;br /&gt;
                        if (lines.length &amp;gt; linesOld.length) {&lt;br /&gt;
                            lines = lines.filter(function(x) {&lt;br /&gt;
                                return linesOld.indexOf(x) &amp;lt; 0;&lt;br /&gt;
                            }).pop() || [];&lt;br /&gt;
                            if (lines.length) {&lt;br /&gt;
                                pos = txt.lastIndexOf(lines);&lt;br /&gt;
                                return doSig(e, pos + lines.length);&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if (CmtE) {&lt;br /&gt;
                        pos = _chkEdit(&amp;#039;&amp;lt;!--&amp;#039;, txtLen);&lt;br /&gt;
                        if (pos)&lt;br /&gt;
                            return doSig(e, pos);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                if (&amp;#039;Perhelion&amp;#039; === c.wgUserName &amp;amp;&amp;amp; /^wp(Diff|Preview)$/.test(e.target.name)) return console.warn(name + &amp;#039; main-edit, but no auto signature position found!&amp;#039;);&lt;br /&gt;
                if (e.target.name === &amp;#039;wpSave&amp;#039;) {&lt;br /&gt;
                    $editform.submit(function(e) {&lt;br /&gt;
                        if (!confirm(signTxt.confirm))&lt;br /&gt;
                            return e.preventDefault();&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
            };&lt;br /&gt;
            $(&amp;#039;#wpSave, #wpPreview, #wpDiff, #wpMinoredit&amp;#039;).click(threadSign.doSign);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    mw.libs.threadSign = threadSign;&lt;br /&gt;
    if (mw.config.get(&amp;#039;wgPageContentModel&amp;#039;) === &amp;#039;wikitext&amp;#039;) {&lt;br /&gt;
        $(document).trigger(&amp;#039;loadWikiScript&amp;#039;, [&amp;#039;Gadget-AutoSign.js&amp;#039;, threadSign]);&lt;br /&gt;
        $.when(mw.loader.using([&amp;#039;jquery.textSelection&amp;#039;, &amp;#039;mediawiki.language&amp;#039;, &amp;#039;user.options&amp;#039;]), $.ready).then(threadSign.init);&lt;br /&gt;
    }&lt;br /&gt;
}(jQuery, mediaWiki));&lt;/div&gt;</summary>
		<author><name>Rootadmin</name></author>
	</entry>
</feed>