User:Reza1615/smalltools.js

From Meta, a Wikimedia project coordination wiki

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/*<pre>*/

// این اسکریپت دکمه‌های ویرایشی پس از انتخاب توسط کاربر به ویکی‌پدیا اضافه می‌کند
// بخش زیادی از این ابزار توسط [[User:Behaafarid]] نوشته شده‌است.

function applyOnSelection(callback) {
  var txtarea = document.editform.wpTextbox1;
  var selText;
  if (document.selection && document.selection.createRange) { // IE/Opera
    // get current selection  
    txtarea.focus();
    var range = document.selection.createRange();
    selText = range.text;
    if (selText) {
      range.text = callback.apply(this, [selText]);
      range.select();
    } else {
      txtarea.value = callback.apply(this, [txtarea.value]);
    }
  } else if (txtarea.selectionStart || txtarea.selectionStart == '0') { // Mozilla
    // get current selection
    txtarea.focus();
    var startPos = txtarea.selectionStart;
    var endPos = txtarea.selectionEnd;
    selText = txtarea.value.substring(startPos, endPos);
    //insert tags
    if (selText) {
      txtarea.value = txtarea.value.substring(0, startPos) + callback.apply(this, [selText]) + txtarea.value.substring(endPos, txtarea.value.length);
      txtarea.selectionStart = startPos + selText.length;
      txtarea.selectionEnd = txtarea.selectionStart;
    } else {
      txtarea.value = callback.apply(this, [txtarea.value]);
    }
  }
}


function setFocusToFirstInput() {
  for (var i = 0; i < document.forms.length; i++)
  for (var j = 0; j < document.forms[i].elements.length; j++)
  if (document.forms[i].elements[j].type != 'hidden' && document.forms[i].elements[j].style.display != 'none' && document.forms[i].elements[j].style.visibility != 'hidden' && document.forms[i].elements[j].className == 'wrong') {
    document.forms[i].elements[j].focus();
    if (document.forms[i].elements[j].type == 'text' || document.forms[i].elements[j].type == 'password') document.forms[i].elements[j].select();
    return true;
  }

  for (var i = 0; i < document.forms.length; i++)
  for (var j = 0; j < document.forms[i].elements.length; j++)
  if (document.forms[i].elements[j].type != 'hidden' && document.forms[i].elements[j].style.display != 'none' && document.forms[i].elements[j].style.visibility != 'hidden') {
    document.forms[i].elements[j].focus();
    if (document.forms[i].elements[j].type == 'text' || document.forms[i].elements[j].type == 'password') document.forms[i].elements[j].select();
    return true;
  }
  return true;
}

// slightly modified by mohsens

function fromEntityToUtf8(obj, isStr) {
  var f = function (s, n, ofs, all) {
    return String.fromCharCode(n);
  };
  if (isStr) {
    return obj.replace(/&#([0-9]+);/g, f);
  } else {
    obj.value = obj.value.replace(/&#([0-9]+);/g, f);
  }
}

function fromUtf8ToEntity(obj_id) {
  var obj = document.getElementById(obj_id);
  obj.value = obj.value.replace(/([^\x00-\x7f])/g, function (s, c, ofs, all) {
    c = String(c);
    return "&#" + c.charCodeAt(0) + ";";
  });
}

function escapeHTMLEntities(obj_id) {
  var obj = document.getElementById(obj_id);
  s = obj.value;
  s = s.replace(/&/g, '&amp;');
  s = s.replace(/</g, '&lt;');
  s = s.replace(/>/g, '&gt;');
  s = s.replace(/'/g, '&apos;');
  s = s.replace(/"/g, '&quot;');
  obj.value = s;
}

function unescapeHTMLEntities(obj_id) {
  var obj = document.getElementById(obj_id);
  s = obj.value;
  s = s.replace(/&lt;/g, '<');
  s = s.replace(/&gt/g, '<');
  s = s.replace(/&apos;/g, '\'');
  s = s.replace(/&quot;/g, '"');
  s = s.replace(/&amp;/g, '&');
  obj.value = s;
}



function AtSignReplace(obj) {
  var s = obj.value;

  s = s.replace(/(\S+?)@(\S+?)/g, '$1{{at}}$2');

  obj.value = s;
}

function URLfix(obj) {

  s = obj.value;
  var old = "";
  while (old != s) {
    old = s;
    s = s.replace(/(http[^\s]+?)\%20/g, '$1\u200c\u200c\u200c_\u200c\u200c\u200c');
  }
  s = s.replace(/(http[^\s]+)/g, function (s, p) {
    return decodeURI(p)
  });
  s = s.replace(/\u200c\u200c\u200c_\u200c\u200c\u200c/g, '%20');

  obj.value = s;
}

function YKarabic(obj, selectionMode) {
  var f = function (s) {
    var sold = s;

    //ي --> ی و ك --> ک
    //برای جلوگیری از خرابکاری در پیوند تصویرها و میان\u200cویکی
    s = s.replace(/\[\[([^\]]*?\:[^\]]*?)ي(.*?)\]\]/g, '[[$1\u200c\u200c\u200cی\u200c\u200c\u200c$2]]');
    s = s.replace(/\[\[([^\]]*?\:[^\]]*?)ك(.*?)\]\]/g, '[[$1\u200c\u200c\u200cک\u200c\u200c\u200c$2]]');

    while (sold != s) {
      sold = s;
      s = s.replace(/\[\[([^\]]*?\:[^\]]*?)ي(.*?)\]\]/g, '[[$1\u200c\u200c\u200cی\u200c\u200c\u200c$2]]');
      s = s.replace(/\[\[([^\]]*?\:[^\]]*?)ك(.*?)\]\]/g, '[[$1\u200c\u200c\u200cک\u200c\u200c\u200c$2]]');
    }

    s = s.replace(/ي/g, 'ی');
    s = s.replace(/ك/g, 'ک');

    s = s.replace(/\u200c\u200c\u200cی\u200c\u200c\u200c/g, 'ي');
    s = s.replace(/\u200c\u200c\u200cک\u200c\u200c\u200c/g, 'ك');

    //اصلاح ی و ک در متنهای عربی
    sold = s;
    s = s.replace(/\{\{عربی([^(\}\})]*?)ی(.*?)\}\}/g, '{{عربی$1ي$2}}');
    s = s.replace(/\{\{عربی([^(\}\})]*?)ک(.*?)\}\}/g, '{{عربی$1ك$2}}');
    s = s.replace(/\{\{آغاز\sعربی\}\}([^(پایان\sعربی\}\})]*?)ی(.*?)پایان\sعربی\}\}/g, '{{آغاز عربی}}$1ي$2پایان عربی}}');
    s = s.replace(/\{\{شروع\sعربی\}\}([^(پایان\sعربی\}\})]*?)ی(.*?)پایان\sعربی\}\}/g, '{{شروع عربی}}$1ي$2پایان عربی}}');
    s = s.replace(/\{\{آغاز\sعربی\}\}([^(پایان\sعربی\}\})]*?)ک(.*?)پایان\sعربی\}\}/g, '{{آغاز عربی}}$1ك$2پایان عربی}}');
    s = s.replace(/\{\{شروع\sعربی\}\}([^پایان\sعربی(\}\})]*?)ک(.*?)پایان\sعربی\}\}/g, '{{شروع عربی}}$1ك$2پایان عربی}}');
    s = s.replace(/\[\[ar:(.*?)ی(.*?)\]\]/g, '[[ar:$1ي$2]]');
    s = s.replace(/\[\[ar:(.*?)ک(.*?)\]\]/g, '[[ar:$1ك$2]]');


    while (sold != s) {
      sold = s;
      s = s.replace(/\{\{عربی([^(\}\})]*?)ی(.*?)\}\}/g, '{{عربی$1ي$2}}');
      s = s.replace(/\{\{عربی([^(\}\})]*?)ک(.*?)\}\}/g, '{{عربی$1ك$2}}');
      s = s.replace(/\{\{آغاز\sعربی\}\}([^(پایان\sعربی\}\})]*?)ی(.*?)پایان\sعربی\}\}/g, '{{آغاز عربی}}$1ي$2پایان عربی}}');
      s = s.replace(/\{\{شروع\sعربی\}\}([^(پایان\sعربی\}\})]*?)ی(.*?)پایان\sعربی\}\}/g, '{{شروع عربی}}$1ي$2پایان عربی}}');
      s = s.replace(/\{\{آغاز\sعربی\}\}([^(پایان\sعربی\}\})]*?)ک(.*?)پایان\sعربی\}\}/g, '{{آغاز عربی}}$1ك$2پایان عربی}}');
      s = s.replace(/\{\{شروع\sعربی\}\}([^پایان\sعربی(\}\})]*?)ک(.*?)پایان\sعربی\}\}/g, '{{شروع عربی}}$1ك$2پایان عربی}}');
      s = s.replace(/\[\[ar:(.*?)ی(.*?)\]\]/g, '[[ar:$1ي$2]]');
      s = s.replace(/\[\[ar:(.*?)ک(.*?)\]\]/g, '[[ar:$1ك$2]]');

    }


    //حدف نویسهٔ ممنوع  ۰۶۴۹
    sold = s;

    //جلوگیری از تغییر متن نشان عربی خورده و تصویر و پیوندهای میان‌ویکی
    s = s.replace(/\[\[([^\]]*?\:[^\]]*?)ى(.*?)\]\]/g, '[[$1\u200c\u200c\u200cی\u200c\u200c\u200c$2]]');
    s = s.replace(/\{\{عربی(.*?)ى(.*?)\}\}/g, '{{عربی$1\u200c\u200c\u200cی\u200c\u200c\u200c$2}}');
    s = s.replace(/\{\{آغاز عربی(.*?)ى(.*?)پایان عربی\}\}/g, '{{آغاز عربی$1\u200c\u200c\u200cی\u200c\u200c\u200c$2پایان عربی}}');
    s = s.replace(/\{\{شروع عربی(.*?)ى(.*?)پایان عربی\}\}/g, '{{شروع عربی$1\u200c\u200c\u200cی\u200c\u200c\u200c$2پایان عربی}}');

    while (sold != s) {
      sold = s;
      s = s.replace(/\[\[([^\]]*?\:[^\]]*?)ى(.*?)\]\]/g, '[[$1\u200c\u200c\u200cی\u200c\u200c\u200c$2]]');
      s = s.replace(/\{\{عربی(.*?)ى(.*?)\}\}/g, '{{عربی$1\u200c\u200c\u200cی\u200c\u200c\u200c$2}}');
      s = s.replace(/\{\{آغاز عربی(.*?)ى(.*?)پایان عربی\}\}/g, '{{آغاز عربی$1\u200c\u200c\u200cی\u200c\u200c\u200c$2پایان عربی}}');
      s = s.replace(/\{\{شروع عربی(.*?)ى(.*?)پایان عربی\}\}/g, '{{شروع عربی$1\u200c\u200c\u200cی\u200c\u200c\u200c$2پایان عربی}}');

    }

    s = s.replace(/ى/g, 'ی');
    s = s.replace(/\u200c\u200c\u200cی\u200c\u200c\u200c/g, 'ى');

    sold = s;
    //اصلاح رده‌ها
    s = s.replace(/\[\[(رده|Category|category):(.*?)(ى|ي)(.*?)\]\]/g, '[[$1:$2ی$4]]');
    s = s.replace(/\[\[(رده|Category|category):(.*?)ك(.*?)\]\]/g, '[[$1:$2ک$3]]');
    while (sold != s) {
      sold = s;
      s = s.replace(/\[\[(رده|Category|category):(.*?)(ى|ي)(.*?)\]\]/g, '[[$1:$2ی$4]]');
      s = s.replace(/\[\[(رده|Category|category):(.*?)ك(.*?)\]\]/g, '[[$1:$2ک$3]]');

    }
    return s;
  };
  if (selectionMode) {
    applyOnSelection(f);
  } else {
    obj.value = f(obj.value);
  }
}

function FM(obj, selectionMode) {
  var f = function (s) {

    //بن‌های ماضی
    var a01 = "(آراست|آرامید|آزرد|آزمود|آسود|آشامید|آشفت|آغازید|آغشت|آفرید|آگند|آلود|آمد|آمرزید";
    var a02 = "|آموخت|آمیخت|آورد|آویخت|آهیخت|ارزید|افتاد|افراشت|افروخت|افزود|افسرد|افشاند|افگند";
    var a03 = "|انباشت|انجامید|انداخت|اندوخت|اندود|اندیشید|انگاشت|انگیخت|اوباشت|ایستاد|باخت";
    var a04 = "|بارید|بافت|بالید|بایست|بخشود|بخشید|برازید|برد|برید|بست|بسود|بسیجید|بلعید|بود";
    var a05 = "|بوسید|بویید|بیخت|پاشید|پالود|پخت|پذیرفت|پراکند|پرداخت|پرستید|پرسید|پرورد|پرید";
    var a06 = "|پژمرد|پژوهید|پسندید|پلاسید|پلکید|پناهید|پنداشت|پوسید|پوشید|پویید|پیچید|پیراست";
    var a07 = "|پیمود|پیوست|تاخت|تافت|تپید|تراشید|تراوید|ترسید|ترشید|ترکید|تکاند|تکانید|تنید|توانست";
    var a08 = "|جست|جُست|جَست|جنبید|جنگید|جوشید|جوید|جهید|چاپید|چایید|چپید|چربید|چرخید|چرید|چسبید|چشید";
    var a09 = "|چکید|چلاند|چلانید|چمید|چید|خارید|خاست|خایید|خراشید|خرامید|خروشید|خرید|خزید|خست";
    var a10 = "|خشکید|خلید|خمید|خوابید|خواست|خواند|خورد|خوفید|خیسید|داد|داشت|دانست|درخشید|دروید";
    var a11 = "|درید|دزدید|دمید|دوخت|دوشید|دوید|دیدم|ربود|رخشید|رسید|رست|رَست|رُست|رشت|رفت|رُفت|روفت";
    var a12 = "|رقصید|رمید|رنجید|رندید|رویید|ریخت|رید|زارید|زایید|زد|زدود|زیست|ساخت|سپرد|سپوخت";
    var a13 = "|ستد|سترد|ستود|ستیزید|سرود|سرشت|سرید|سزید|سفت|سگالید|سنجید|سوخت|سود|شاشید|شایست";
    var a14 = "|شتافت|شد|شست|شکافت|شکست|شکفت|شکیفت|شگفت|شمرد|شناخت|شنید|شورید|طلبید|طوفید|غارتید";
    var a15 = "|غرید|غلطید|غنود|فرستاد|فرسود|فرمود|فروخت|فریفت|فشرد|فهمید|قاپید|قبولاند|کاست";
    var a16 = "|کاشت|کاوید|کرد|کشت|کشید|مکشید|کفت|کفید|کند|کوچید|کوشید|کوفت|گایید|گداخت|گذاشت";
    var a17 = "|گذشت|گرازید|گرایید|گردید|گرفت|گروید|گریخت|گریست|گزارد|گزید|گُزید|گَزید|گسارد|گسترد|گسست";
    var a18 = "|گشت|گشود|گفت|گماشت|گنجید|گندید|گوارید|گوزید|لرزید|لغزید|لمدنی|لندید|لنگید|لهید";
    var a19 = "|لیسید|ماسید|مالید|ماند|مرد|مکید|مولید|مویید|نازید|نالید|نامید|نشست|نکوهید|نگاشت";
    var a20 = "|نگریست|نمود|نواخت|نوردید|نوشت|نوشید|نهاد|نهفت|نیوشید|ورزید|وزید|هراسید|هشت";
    var a21 = "|یارست|یازید|یافت)";

    var verbs = a01 + a02 + a03 + a04 + a05 + a06 + a07 + a08 + a09 + a10 + a11 + a12 + a13 + a14 + a15 + a16 + a17 + a18 + a19 + a20 + a21;
    var hoohaahaahaa = "(می|نمی)" + verbs + "(م|ی|یم|ید|ند|\\s|\\.|،|!|؛)"
    var re = new RegExp(hoohaahaahaa, "g");
    s = s.replace(re, '$1\u200c$2$3');

    //بن‌های مضارع
    var b01 = "(آرای|آرام|آزار|آزمای|آسای|آشام|آشوب|آغاز|آغار|آفرین|آگن|آلای|آی|آمرز";
    var b02 = "|آموز|آمیز|آور|آویز|آهنج|ارز|افت|افراز|افروز|افزای|افسر|افشان|افگن";
    var b03 = "|انبار|انجام|انداز|اندوز|اندای|اندیش|انگار|انگیز|اوبار|ایست|باز";
    var b04 = "|بار|باش|باف|بال|بای|بخشای|بخش|براز|بر|بُر|بَر|بند|بساو|بسیج|بلع|بو";
    var b05 = "|بوس|بوی|بیز|پاش|پالای|پز|پذیر|پراکن|پرداز|پرست|پرس|پرور|پر";
    var b06 = "|پژمر|پژوه|پسند|پلاس|پلک|پناه|پندار|پوس|پوش|پوی|پیچ|پیرای";
    var b07 = "|پیمای|پیوند|تاز|تاب|تپ|توپ|تراش|تراو|ترس|ترش|ترک|تکان|تن|توان";
    var b08 = "|جه|جوی|جنب|جنگ|جوش|جو|چاپ|چای|چپ|چرب|چرخ|چر|چسب|چش";
    var b09 = "|چک|چلان|چم|چین|خار|خیز|خای|خراش|خرام|خروش|خر|خز|خست";
    var b10 = "|خشک|خل|خم|خواب|خواه|خوان|خور|خوف|خیس|ده|دار|دان|درخش|درو";
    var b11 = "|در|دزد|دم|دوز|دوش|دو|بین|ربای|رخش|رس|ره|روی|رشت|رو|روب";
    var b12 = "|رقص|رم|رنج|رند|روی|ریز|رین|زار|زای|زن|زدای|زی|ساز|سپر|سپوز";
    var b13 = "|ستان|ستر|ستان|ستیز|سرای|سرشت|سر|سز|سنب|سگال|سنج|سوز|سای|شاش|شای";
    var b14 = "|شتاب|شو|شوی|شکاف|شکن|شکوف|شکیب|شمر|شناس|شنو|شور|طلب|طوف|غارت";
    var b15 = "|غر|غلط|غنو|فرست|فرسای|فرمای|فروش|فریب|فشر|فهم|قاپ|قبولان|کاه";
    var b16 = "|کار|کاو|کن|کار|کُش|کش|کِش|کَش|کف|کن|کوچ|کوش|کوب|گای|گداز|گذار";
    var b17 = "|گذر|گراز|گرای|گرد|گیر|گرو|گریز|گری|گزار|گز|گزین|گسار|گستر|گسل";
    var b18 = "|گشای|گو|گمار|گنج|گند|گوار|گوز|لرز|لغز|لم|لند|لنگ|له";
    var b19 = "|لیس|ماس|مال|مان|میر|مک|مول|موی|ناز|نال|نام|نشین|نکوه|نگار";
    var b20 = "|نگر|نمای|نواز|نورد|نویس|نوش|نه|نهنب|نیوش|ورز|وز|هراس|هل";
    var b21 = "|یار|یاز|یاب)";


    var verbs = b01 + b02 + b03 + b04 + b05 + b06 + b07 + b08 + b09 + b10 + b11 + b12 + b13 + b14 + b15 + b16 + b17 + b18 + b19 + b20 + b21;
    var hoohbbhbbhbb = "(می|نمی)" + verbs + "(م|ی|د|یم|ید|ند)"
    var re = new RegExp(hoohbbhbbhbb, "g");
    s = s.replace(re, '$1\u200c$2$3');

    //ای «توان» ناقلا!
    s = s.replace(/(می|نمی)توان/g, "$1\u200cتوان");

    //تبدیل الگو {{فم}} به نویسه
    s = s.replace(/\{\{فم\}\}/g, '\u200c');

    //تبدیل چند فاصلهٔ مجازی پشت\u200cسرهم به یک فاصله مجازی.
    s = s.replace(/(\u200c)+/g, '\u200c');

    // برای حذف علامت ستاره اضافی قبل از عنوان‌ها
    s = s.replace(/\n\*\s*(\=+.+?\=+\n)/g, "\n$1");

    // برای حذف فاصله‌های اضافی در پیوندها
    s = s.replace(/\[\[\s*(.*?)\s*]]/g, "[[$1]]");

    // عضو علامت‌های نقل قول تکی از عنوان‌ها
    s = s.replace(/(\n=+)(.*?)(?:'+)(.*?)(?:'+)(.*?)(=+\n)/g, "$1$2$3$4$5");

    //حذف فاصلهٔ مجازی بعد از آادذرزژو . ، « »
    s = s.replace(/([\.،«»\:؛\sزرذدواژؤإأآءةa-zA-Z])\u200c/g, '$1');

    // اول و آخر هم خط اگر فاصلهٔ مجازی باشد، حذف شود
    s = s.replace(/(^\u200c|\u200c$)/mg, '');

    //حذف فاصلهٔ مجازی پیش از حروف لاتین و نیز نشانه‌های سجاوندی
    s = s.replace(/\u200c([\w\[\]\n\s\.،«»\:؛])/g, '$1');

    //اصلاح می پیشوندی
    s = s.replace(/\sمی\s/g, ' می\u200c');
    s = s.replace(/\sنمی\s/g, ' نمی\u200c');
    s = s.replace(/\sمی\u200cو\s/g, ' می و');

    //فعلهای مصدر بودن
    s = s.replace(/ه\sام([\]\.،\:»\)\s])/g, 'ه\u200cام$1');
    s = s.replace(/ه\sای([\]\.،\:»\)\s])/g, 'ه\u200cای$1');
    s = s.replace(/([^ا])ه\sاست([\]\.،\:»\)\s])/g, '$1ه\u200cاست$2');
    s = s.replace(/ه\sایم([\]\.،\:»\)\s])/g, 'ه\u200cایم$1');
    s = s.replace(/ه\sاید([\]\.،\:»\)\s])/g, 'ه\u200cاید$1');
    s = s.replace(/ه\sاند([\]\.،\:»\)\s])/g, 'ه\u200cاند$1');

    /*چسباندن ها بر اساس مفاد دستور خط فرهنگستان و شیوه\u200cنامهٔ ویکی\u200cپدیا:*/
    //تمام «ها» با فاصلهٔ مجازی می‌چسبند. و این مطابق مفاد آخرین شیوه‌نامه غلط نیست.
    s = s.replace(/\sها([\]\.،\:»\)\s])/g, '\u200cها$1');
    s = s.replace(/\sها(ی|یی|یم|یت|یش|مان|تان|شان)([\]\.،\:»\)\s])/g, '\u200cها$1$2');

    //موارد جزئی دیگر: هرچند ربطی به ZWNJ ندارد. ولی فعلاً اینجا می‌گذاریمشان تا بعداً بفرستیمشان جایی دیگر.
    s = s.replace(/ا\sً/g, 'اً');

    // ویکی پدیا و ویکیپدیا به ویکی‌پدیا
    s = s.replace(/ویکی\s?پدیا/g, 'ویکی\u200cپدیا');

    // اسثنائات، این‌ها بایست که بعداً به طور دقیقتری بررسی شوند
    // می۸ به می ۸ تبدیل شود، به خاطر replace(/\sمی\s/g, ' می\u200c') اشتباه شده
    s = s.replace(/\sمی\u200c[\d۰-۹]\s/g, ' می $1');
    // میوزیک؟ می + بن مضارع وز + ی
    s = s.replace(/می‌وزیک/g, "میوزیک");
    // لوییز می الکات، با replace(/\sمی\s/g, ' می\u200c') تغییر می‌کند
    s = s.replace(/می‌الکات/g, "می الکات");

    return s;
  };
  if (selectionMode) {
    applyOnSelection(f);
  } else {
    obj.value = f(obj.value);
  }
}

function NonStandard(obj, selectionMode) {

  var f = function (s) {

    //همزه روی ی
    s = s.replace(/ه\u200cی\s/g, 'هٔ ');
    s = s.replace(/ه\u200eی\s/g, 'هٔ ');
    s = s.replace(/ه\sی\s/g, 'هٔ ');
    s = s.replace(/(ۀ|هٓ)/g, 'هٔ');
    s = s.replace(/هء /g, 'هٔ ');
    s = s.replace(/ه‌یی/g, 'ه‌ای');

    //تبدیل الگو {{ی}} به نویسه
    s = s.replace(/\{\{ی\}\}/g, 'ٔ');

    //اصلاح گیومه
    s = s.replace(/"([^\w\n]*?)"/g, '«$1»');
    s = s.replace(/«([\w]*?)»/g, '"$1"');
    s = s.replace(/(\w)=«([^"]*?)»/g, '$1="$2"'); // to fix the problem with HTML double quotes.
    return s;
  };
  if (selectionMode) {
    applyOnSelection(f);
  } else {
    obj.value = f(obj.value);
  }
}

function digits(obj, selectionMode) {
  // Convert Codes to Characters
  var f = function (s) {
    s = fromEntityToUtf8(s, true);
    var old = s;
    var entofa = new Array("۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹");
    var entoar = new Array("٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩");
    var faChrs = "آأإئؤبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهیيك"
    var faNums = "۰۱۲۳۴۵۶۷۸۹"
    var arNums = "٠١٢٣٤٥٦٧٨٩"
    // فارسی به انگلیسی
    while (1==1) {
      for (var i = 0; i < 10; i++) {
         var reFaToEn = new RegExp("([A-Za-z0-9][^"+faChrs+faNums+"\\n\\{}\\|=]*)"+entofa[i]+"([^"+faNums+"\\n\\{\\}\\|=]*?[A-Za-z0-9])", "g");
         old = old.replace(reFaToEn, "$1¬¬¬"+i+"$2");
      }
      if (old==s) break;
      s = old;
    }
    s = s.replace(/¬¬¬/g, "");
    // انگلیسی به فارسی
    old = s;
    while (1==1) {
      for (var i = 0; i < 10; i++) {
         var reEnToFa = new RegExp("(["+faChrs+"][^A-Za-z0-9\\n\\{\\}\\|=]*)"+i+"([^A-Za-z\\n\\{\\}\\|=]*?["+faChrs+faNums+"])", "g");
         old = old.replace(reEnToFa, "$1"+entofa[i]+"$2");
      }
      if (old==s) break;
      s = old;
    }
    // عربی به فارسی
    for (var i = 0; i < 10; i++) {
      s = s.replace(new RegExp(entoar[i], 'g'), entofa[i]);
    }
    // برای ارقام درون جدول‌ها
    old = s;
    while (1==1) {
      for (var i = 0; i < 10; i++) {
         var reEnToFa = new RegExp('(\\|\\||["\\n] *\\|)([^A-Za-z0-9\\n\\{\\}\\|=]*)'+i+"([^A-Za-z\\n\\{\\}\\|=]*?)( *\\|\\||\\n)", "g");
         old = old.replace(reEnToFa, "$1$2"+entofa[i]+"$3$4");
      }
      if (old==s) break;
      s = old;
    }
    return s;
  };
  if (selectionMode) {
    applyOnSelection(f);
  } else {
    obj.value = f(obj.value);
  }
}

function Punctuation(obj, selectionMode) {

  var f = function (s) {
    s = s.replace(/\<br ?\/?\>/g, "{{سخ}}");   

    //  s=s.replace(/([^\n^\r])([\(«])/g,'$1 $2');
    //  s=s.replace(/([^(\<pre\>)])\ئ+/g,'$1 ');
    s = s.replace(/ ([؟،:!\.\}])/g, "$1");
    s = s.replace(/([،\.])([^\s\.\(\)«»\"\[\]\<\>\d\w\{\}\|۰-۹])/g, "$1 $2");

    s = s.replace(/([\(«])\s/g, '$1');
    s = s.replace(/\s([\)»])/g, '$1');
    s = s.replace(/٬\s/g, "، ");

    s = s.replace(/(\<\/ref\>)\s+(\<ref)/g, "$1$2");

    // تغییرات جزئی که برای ربات‌ها تعریف شده بود
    s = s.replace(/^(\=+)\s*(.*?)\s*(\=+)$/mg, "$1 $2 $3");
    s = s.replace(/((?:^|\n)\=.*?\=\n)\n*/g, "$1");
    s = s.replace(/([^=])\n+(\=.*?\=\n)/g, "$1\n\n$2");
    s = s.replace(/^([*#]+)([^*#:\s])/mg, "$1 $2");

    // پاک کردن فاصله‌ها بین خطوط * دار
    s = s.replace(/(\n\*.*?)\n(?=\n\*)/g, '$1');

    // فاصله را از آخر خط پاک می‌کند
    s = s.replace(/([^ =]) *$/mg, "$1");

    // اصلاح {{•}}
    s = s.replace(/[\n ]*(&nbsp;)?(\{\{?[•·ن]\}\}|&bull;|•) */g, "{{•}} ");

    // برای گذاشتن گیومه برای خاصیت‌های برچسب طبق اکس‌ام‌ال
    // اشکال مشخصی که دارد این است که همهٔ نویسه‌های قابل قبول برای اکس‌ام‌ال را نمی‌پذیرد، چه نویسه‌هایی لازم است؟
    var sold = "";
    while (sold != s) {
      sold = s;
      s = s.replace(/(\<\w*(?:\s\w*=['"\w\d]+)*\s+\w*=)([\w\d_]+)((?:\s\w*=['"\w\d]+)*\s?\/?\>)/g, "$1\"$2\"$3")
      // first version: .replace(/\<(\w*\s+\w*=)(\w+[\w\d]*)\>/, "<$1\"$2\">");
    }
    return s;
  };
  if (selectionMode) {
    applyOnSelection(f);
  } else {
    obj.value = f(obj.value);
  }
}

function SuperTool(obj, selectionMode) {
  YKarabic(obj, selectionMode);
  FM(obj, selectionMode);
  NonStandard(obj, selectionMode);
  digits(obj, selectionMode);
  Punctuation(obj, selectionMode);
}


function toggleDir(obj) {
  var isrtl = 0;
  if (obj) {
    isrtl = obj.style.direction != 'ltr';
    if (isrtl) {
      obj.style.textAlign = "left";
      obj.style.direction = "ltr";
    } else {
      obj.style.textAlign = "right";
      obj.style.direction = "rtl";
    }
  }
}

function InterwikiSorter(obj) {

  var ref = /\[\[(\w\w\w?|bat-smg|be-x-old|cbk-zam|fiu-vro|nds-nl|roa-tara|ru-sib|simple|tokipona|zh-classical|zh-min-nan|zh-yue)\:(.*?)\]\]\r?\n?(\s*)/g

  var s = obj.value;

  //extract interwiki's and delete them temporarily from the string
  interwikis = s.match(ref);
  if (interwikis == null) return;
  s = s.replace(ref, "");

  //sort interwikis
  interwikis = interwikis.sort();
  //put interwiki's back
  s = s + interwikis.join("");

  //update string.
  obj.value = s;
}

function SortText(obj, selectionMode) {
  function sortPreparation(instr){      // solve persian problem on sorting by replace characters in strings
    return instr.replace(/ی/g,"ي")
                .replace(/ک/g,"ك")
                .replace(/گ/g,"كی")
                .replace(/ژ/g,"زی")
                .replace(/چ/g,"جی")
                .replace(/پ/g,"بی");
  }
  var f = function (s) {
    temp = s.split('\n');
    temp.sort(function(a,b){ 
      var keyA = sortPreparation(a);
      var keyB = sortPreparation(b);
 
      if (keyA < keyB) return -1;
      if (keyA > keyB) return 1;
      return 0;
    });
    var result = temp.join('\n');
    return result;
  };
  if (selectionMode) {
    applyOnSelection(f);
  } else {
    obj.value = f(obj.value);
  }
}

function buttonHTMLGenerator(javascriptCode, imageSuffix, title, alt) {
  return "<a href=\"javascript:" + javascriptCode + "\"><img src=" +
         "\"http://upload.wikimedia.org/wikipedia/" + imageSuffix + "\"" +
         " title=\"" + title + "\"" +
         " alt=\"" + alt + "\"></a>";
}

/* تغییر جهت */
var toggleDirection = buttonHTMLGenerator(
  "toggleDir(document.editform.wpTextbox1);", "fa/d/d0/Button_toggle_dir.png", "تغییر جهت جعبهٔ ویرایش", "تغییرجهت"
);

/* ی ک */
var YKArabic = buttonHTMLGenerator(
  "YKarabic(document.editform.wpTextbox1);", "fa/8/88/Button_YehKeh.png", "اصلاح ی و ک", "ی و ک"
);

/* فاصله مجازی */
var zwnj = buttonHTMLGenerator(
  "FM(document.editform.wpTextbox1);", "fa/d/d0/Button_ZWNJ.png", "فاصلهٔ مجازی", "فاصلهٔ مجازی"
);

/* نویسهٔ غیراستاندارد */
var nonS = buttonHTMLGenerator(
  "NonStandard(document.editform.wpTextbox1);", "fa/9/94/Button_non_standard.png", "نویسه‌های غیراستاندارد", "نویسه‌های غیراستاندارد"
);

/* فارسی‌سازی ارقام */
var Dig = buttonHTMLGenerator(
  "digits(document.editform.wpTextbox1,true);", "fa/4/4a/Button_numbers.png", "فارسی سازی ارقام", "ارقام"
);

/* تبدیل به یونیکد در آدرس‌های وب */
var URLFIX = buttonHTMLGenerator(
  "URLfix(document.editform.wpTextbox1);", "fa/b/ba/Button_decode_URI.png", "یونیکدسازی نشانی‌ها", "یونیکدسازی"
);

/* اَبَرابزار */
var STool = buttonHTMLGenerator(
  "SuperTool(document.editform.wpTextbox1);", "fa/f/fc/Button_super_tool.png", "ابرابزار", "ابرابزار"
);

/* اصلاح علامت @ */
var AtSignFix = buttonHTMLGenerator(
  "AtSignReplace(document.editform.wpTextbox1);", "fa/7/7f/Button_at_sign.png", "اصلاح علامت @", "@"
);

/* ویکی‌سازی */
var Wikify = buttonHTMLGenerator(
  "void(document.editform.wpTextbox1.value='{{ویکی‌سازی}}\\n'+document.editform.wpTextbox1.value);", "fa/3/38/Button_wikify.png", "ویکی‌سازی", "ویکی‌سازی"
);
/* شد! */
var shod = buttonHTMLGenerator(
  "void(document.editform.wpTextbox1.value=document.editform.wpTextbox1.value+'\n:{{شد}}--~~~~');", "commons/5/5b/Button_check.png", "شد", "شد"
);
/* بدون منبع */
var NoS = buttonHTMLGenerator(
  "void(document.editform.wpTextbox1.value='{{بدون منبع}}\\n'+document.editform.wpTextbox1.value)", "fa/8/8a/Button_no_source_fa.png", "بدون منبع", "بدون منبع"
);

/* ملزومات مقاله */
var AddEssentialThings = buttonHTMLGenerator(
  "insertTags('== جستارهای وابسته ==\\n\\n== منابع ==\\n\\n{{پانویس}}','','');", "commons/e/ef/Add_note.jpg", "ملزومات مقاله", "ملزومات مقاله"
);

/* حق تکثیر مشکوک */
var Sus = "<a href=\"javascript:document.editform.wpTextbox1.value='{{حق تکثیر مشکوک}}\\n'+document.editform.wpTextbox1.value;void(document.getElementById('wpSummary').value='حق تکثیر مشکوک')\"><img src=\"http://upload.wikimedia.org/wikipedia/fa/c/c7/Button_Sus.png\" title=\"حق تکثیر مشکوک\" alt=\"حق تکثیر مشکوک\"></a>";

/* نقض حق تکثیر */
var CopyR = "<a href=\"javascript:document.editform.wpTextbox1.value='';insertTags('{{جا:نقض حق تکثیر|url=','}}','Address');void(document.getElementById('wpSummary').value='نقض حق تکثیر');\"><img src=\"http://upload.wikimedia.org/wikipedia/fa/6/6f/Button_CopyR.png\" title=\"نقض حق تکثیر\" alt=\"نقض حق تکثیر\"></a>";

/* لحن نامناسب */
var Tone = "<a href=\"javascript:document.editform.wpTextbox1.value='{{لحن نامناسب}}\\n'+document.editform.wpTextbox1.value;void(document.getElementById('wpSummary').value='لحن نامناسب')\"><img src=\"http://upload.wikimedia.org/wikipedia/fa/f/fc/Button_Tone.png\" title=\"لحن نامناسب\" alt=\"لحن\"></a>";

/* اصلاحات نقطه گذاری */
var Punc = "<a href=\"javascript:Punctuation(document.editform.wpTextbox1)\"><img src=\"http://upload.wikimedia.org/wikipedia/fa/e/ed/Button_punctuation.png\" title=\"نقطه‌گذاری\" alt=\"نقطه‌گذاری\"></a>";

/* اصلاح ترتیب میان‌ویکی‌ها */
var InterW = "<a href=\"javascript:InterwikiSorter(document.editform.wpTextbox1)\"><img src=\"http://upload.wikimedia.org/wikipedia/fa/9/96/Button_interwiki.png\" title=\"اصلاح ترتیب میان‌ویکی‌ها\" alt=\"ترتیب میان‌ویکی‌ها\"></a>";

/* چپچین */
var ChapChin = "<a href=\"javascript:insertTags('{{چپ‌چین}}\\n','\\n{{پایان چپ‌چین}}','متن چپ‌چین شده')\"><img src=\"http://upload.wikimedia.org/wikipedia/en/e/ea/Button_align_left.png\" title=\"چپ‌چین‌کردن متن\" alt=\"چپ‌چین\"></a>";

/* سر سطر */
var SareSatr = "<a href=\"javascript:insertTags('<br />','','');\"><img src=\"http://upload.wikimedia.org/wikipedia/en/1/13/Button_enter.png\" title=\"سرخط\" alt=\"سرخط\"></a>";

/* اندیس بالا */
var UpperText = "<a href=\"javascript:insertTags('<sup>','</sup>','اندیس');\"><img src=\"http://upload.wikimedia.org/wikipedia/en/8/80/Button_upper_letter.png\" title=\"اندیس بالا\ alt=\"اندیس بالا\"></a>";

/* اندیس پایین */
var LowerText = "<a href=\"javascript:insertTags('<sub>','</sub>','اندیس');\"><img src=\"http://upload.wikimedia.org/wikipedia/en/7/70/Button_lower_letter.png\" title=\"اندیس پایین\" alt=\"اندیس پایین\"></a>";

/* حذف سریع */
var SpeedyDel = "<a href=\"javascript:temp1=document.editform.wpTextbox1;temp2=temp1.value;temp1.value='';insertTags('{{حذف سریع|','}}\\n'+temp2,'معیار');void(document.getElementById('wpSummary').value='حذف سریع');\"><img src=\"http://upload.wikimedia.org/wikipedia/fa/c/c1/Button_delete_vote.png\" title=\"حذف سریع\" alt=\"حذف سریع\"></a>";

/* منبع تصویر نامعلوم */
var PicSource = "<a href=\"javascript:document.editform.wpTextbox1.value='{{منبع تصویر نامعلوم}}\\n'+ document.editform.wpTextbox1.value;void(document.getElementById('wpSummary').value='منبع تصویر نامعلوم')\"><img src=\"http://upload.wikimedia.org/wikipedia/fa/5/59/Button_image_source.png\" title=\"منبع تصویر نامعلوم\" alt=\"منبع تصویر نامعلوم\"></a>";

/* حق تکثیر تصویر نامعلوم */
var PicCopy = "<a href=\"javascript:document.editform.wpTextbox1.value='{{جا:حق تکثیر تصویر نامعلوم}}\\n'+ document.editform.wpTextbox1.value;void(document.getElementById('wpSummary').value='حق تکثیر تصویر نامعلوم')\"><img src=\"http://upload.wikimedia.org/wikipedia/fa/7/7e/Button_image_copyright.png\" title=\"حق تکثیر تصویر نامعلوم\" alt=\"حق تکثیر تصویر نامعلوم\"></a>";

/* تمیزکاری */
var Cleanup = "<a href=\"javascript:void(document.editform.wpTextbox1.value='{{تمیزکاری}}\\n'+document.editform.wpTextbox1.value);\"><img src=\"http://upload.wikimedia.org/wikipedia/commons/2/2e/Button_broom.png\" title=\"تمیزکاری\" alt=\"تمیزکاری\"></a>";

/* تغییر مسیر */
var RedirectButton = "<a href=\"javascript:document.editform.wpTextbox1.value='';insertTags('#تغییرمسیر [[',']]','پیوند');void(document.getElementById('wpSummary').value='تغییر مسیر');\"><img src=\"http://upload.wikimedia.org/wikipedia/en/c/c8/Button_redirect.png\" title=\"تغيير مسير\" alt=\"تغيير مسير\"></a>";

/* سال میلادی */
var GregYear = "<a href=\"javascript:insertTags('{{میلادی|','|ماه\u200cاختیاری|روز\u200cاختیاری|قبل\u200cاز\u200cمیلاد\u200cاختیاری}}','سال');\"><img src=\"http://upload.wikimedia.org/wikibooks/fa/a/a7/Button_cal.png\" title=\"سال میلادی\" alt=\"میلادی\"></a>";

/* کد */
var CodeButton = "<a href=\"javascript:insertTags('<code>','</code>','کد');\"><img src=\"http://upload.wikimedia.org/wikibooks/fa/2/23/Button_code.png\" title=\"کد\" alt=\"کد\"></a>";

/* خوشامدید */
var Welcome = "<a href=\"javascript:insertTags('{{جا:خوشامدید|~~~~}}','','');void(document.getElementById('wpSummary').value='خوشامد')\"><img src=\"http://upload.wikimedia.org/wikipedia/commons/4/4a/Smilies_Alien_cool.png\" title=\"خوشامدگویی\" alt=\"خوشامد\"></a>";

/* جدول */
var TableButton = "<a href=\"javascript:insertTags('\\n{| border=1 \\n|- \\n| ش۱ || ش۲ \\n|- \\n| ش۳ || ش۴','\\n|}\\n','');\"><img src=\"http://upload.wikimedia.org/wikibooks/fa/6/60/Button_insert_table.png\" title=\"جدول\" alt=\"جدول\"></a>";

/* توضیح */
var CommentButton = "<a href=\"javascript:insertTags('<!--','-->','توضیح');\"><img src=\"http://upload.wikimedia.org/wikibooks/fa/3/34/Button_hide_comment.png\" title=\"توضیح\" alt=\"توضیح\"></a>";

/* گالری */
var GalleryButton = "<a href=\"javascript:insertTags('\\n<gallery>\\n','\\n</gallery>','تصویر:PictureFileName.jpg|شرح\\nتصویر:PictureFileName.jpg|شرح');\"><img src=\"http://upload.wikimedia.org/wikibooks/fa/1/12/Button_gallery.png\" title=\"نگارخانه\" alt=\"نگارخانه\"></a>";

/* متن خط خورده */
var StrikeTextButton = "<a href=\"javascript:insertTags('<s>','</s>','متن خط خورده');\"><img src=\"http://upload.wikimedia.org/wikibooks/fa/c/c9/Button_strike.png\" title=\"متن خط‌خورده\" alt=\"متن خط‌خورده\"></a>";

/* اخطار نگاره */
var ImgWarn = "<a href=\"javascript:document.editform.wpTextbox1.value='';insertTags('{{جا:اخطار نگاره|','}}','نگاره');void(document.getElementById('wpSummary').value='اخطار نگاره');\"><img src=\"http://upload.wikimedia.org/wikipedia/commons/e/ec/Button_aviso.png\" title=\"اخطار نگاره\" alt=\"اخطار نگاره\"></a>";

/* پیوند ویکی */
var wikilink = "<a href=\"javascript:insertTags('[[',']]','مقاله');\"><img src=\"http://upload.wikimedia.org/wikipedia/fa/d/d0/Button_in_wikify.png\" title=\"پیوند\" alt=\"پیوند\"></a>";

/* مرتب سازی */
var sorttext = "<a href=\"javascript:SortText(document.editform.wpTextbox1,true);\"><img src=\"http://upload.wikimedia.org/wikipedia/fa/3/33/Button_sort.png\" title=\"مرتب‌سازی\" alt=\"مرتب‌سازی\"></a>";

var Spacer = " ";

var NewRow = "<br />";

if (typeof(mytools) === "undefined") {
  var mytools = '';
}

function InsertButtonsToToolBar() {
  var before = document.getElementById("wpTextbox1");
  if (before == null) {
    return;
  }
  var tooly = document.createElement("tooly");
  tooly.innerHTML = toggleDirection + Spacer + mytools + Spacer + YKArabic + zwnj + STool;
  before.parentNode.insertBefore(tooly, before);

}

hookEvent('load', InsertButtonsToToolBar);

/*</pre>*/