ویکی‌پدیا:درخواست‌های ربات/ربات گروه مجوز دهندگان ربات/ابرابزار

از ویکی‌پدیا، دانشنامهٔ آزاد

<syntaxhighlight lang="python">

def YKarabic(obj):

   s=obj
   #ي --> ی و ك --> ک    
   #برای جلوگیری از خرابکاری در پیوند تصویرها و میان\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')
   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, 'ك')
   #اصلاح ی و ک در متنهای عربی
   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, )
   s = s.replace(/\[\[ar:(.*?)ک(.*?)\]\]/g, )
   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, )
   s = s.replace(/\[\[ar:(.*?)ک(.*?)\]\]/g, )
   #حدف نویسهٔ ممنوع  ۰۶۴۹
   #جلوگیری از تغییر متن نشان عربی خورده و تصویر و پیوندهای میان‌ویکی
   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, '$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, 'ى')
   #اصلاح رده‌ها
   s = s.replace(/\[\[(رده|[Cc]ategory):(.*?)(ى|ي)(.*?)\]\]/g, '$1:$2ی$4')
   s = s.replace(/\[\[(رده|[Cc]ategory):(.*?)ك(.*?)\]\]/g, '$1:$2ک$3')
   s = s.replace(/\[\[(رده|[Cc]ategory):(.*?)(ى|ي)(.*?)\]\]/g, '$1:$2ی$4')
   s = s.replace(/\[\[(رده|[Cc]ategory):(.*?)ك(.*?)\]\]/g, '$1:$2ک$3')
   return s

def FM(obj):

   s=obj
   #بن‌های ماضی
   a01 = "(آراست|آرامید|آزرد|آزمود|آسود|آشامید|آشفت|آغازید|آغشت|آفرید|آگند|آلود|آمد|آمرزید";
   a02 = "|آموخت|آمیخت|آورد|آویخت|آهیخت|ارزید|افتاد|افراشت|افروخت|افزود|افسرد|افشاند|افگند";
   a03 = "|انباشت|انجامید|انداخت|اندوخت|اندود|اندیشید|انگاشت|انگیخت|اوباشت|ایستاد|باخت";
   a04 = "|بارید|بافت|بالید|بایست|بخشود|بخشید|برازید|برد|برید|بست|بسود|بسیجید|بلعید|بود";
   a05 = "|بوسید|بویید|بیخت|پاشید|پالود|پخت|پذیرفت|پراکند|پرداخت|پرستید|پرسید|پرورد|پرید";
   a06 = "|پژمرد|پژوهید|پسندید|پلاسید|پلکید|پناهید|پنداشت|پوسید|پوشید|پویید|پیچید|پیراست";
   a07 = "|پیمود|پیوست|تاخت|تافت|تپید|تراشید|تراوید|ترسید|ترشید|ترکید|تکاند|تکانید|تنید|توانست";
   a08 = "|جست|جُست|جَست|جنبید|جنگید|جوشید|جوید|جهید|چاپید|چایید|چپید|چربید|چرخید|چرید|چسبید|چشید";
   a09 = "|چکید|چلاند|چلانید|چمید|چید|خارید|خاست|خایید|خراشید|خرامید|خروشید|خرید|خزید|خست";
   a10 = "|خشکید|خلید|خمید|خوابید|خواست|خواند|خورد|خوفید|خیسید|داد|داشت|دانست|درخشید|دروید";
   a11 = "|درید|دزدید|دمید|دوخت|دوشید|دوید|دیدم|ربود|رخشید|رسید|رست|رَست|رُست|رشت|رفت|رُفت|روفت";
   a12 = "|رقصید|رمید|رنجید|رندید|رویید|ریخت|رید|زارید|زایید|زد|زدود|زیست|ساخت|سپرد|سپوخت";
   a13 = "|ستد|سترد|ستود|ستیزید|سرود|سرشت|سرید|سزید|سفت|سگالید|سنجید|سوخت|سود|شاشید|شایست";
   a14 = "|شتافت|شد|شست|شکافت|شکست|شکفت|شکیفت|شگفت|شمرد|شناخت|شنید|شورید|طلبید|طوفید|غارتید";
   a15 = "|غرید|غلطید|غنود|فرستاد|فرسود|فرمود|فروخت|فریفت|فشرد|فهمید|قاپید|قبولاند|کاست";
   a16 = "|کاشت|کاوید|کرد|کشت|کشید|مکشید|کفت|کفید|کند|کوچید|کوشید|کوفت|گایید|گداخت|گذاشت";
   a17 = "|گذشت|گرازید|گرایید|گردید|گرفت|گروید|گریخت|گریست|گزارد|گزید|گُزید|گَزید|گسارد|گسترد|گسست";
   a18 = "|گشت|گشود|گفت|گماشت|گنجید|گندید|گوارید|گوزید|لرزید|لغزید|لمدنی|لندید|لنگید|لهید";
   a19 = "|لیسید|ماسید|مالید|ماند|مرد|مکید|مولید|مویید|نازید|نالید|نامید|نشست|نکوهید|نگاشت";
   a20 = "|نگریست|نمود|نواخت|نوردید|نوشت|نوشید|نهاد|نهفت|نیوشید|ورزید|وزید|هراسید|هشت";
   a21 = "|یارست|یازید|یافت)";
   verbs = a01 + a02 + a03 + a04 + a05 + a06 + a07 + a08 + a09 + a10 + a11 + a12 + a13 + a14 + a15 + a16 + a17 + a18 + a19 + a20 + a21;
   re = new RegExp("(می|نمی)" + verbs + "(م|ی|یم|ید|ند|\\s|\\.|،|!|؛)", "g")
   s = s.replace(re, '$1\u200c$2$3')
   #بن‌های مضارع
   b01 = "(آرای|آرام|آزار|آزمای|آسای|آشام|آشوب|آغاز|آغار|آفرین|آگن|آلای|آی|آمرز";
   b02 = "|آموز|آمیز|آور|آویز|آهنج|ارز|افت|افراز|افروز|افزای|افسر|افشان|افگن";
   b03 = "|انبار|انجام|انداز|اندوز|اندای|اندیش|انگار|انگیز|اوبار|ایست|باز";
   b04 = "|بار|باش|باف|بال|بای|بخشای|بخش|براز|بر|بُر|بَر|بند|بساو|بسیج|بلع|بو";
   b05 = "|بوس|بوی|بیز|پاش|پالای|پز|پذیر|پراکن|پرداز|پرست|پرس|پرور|پر";
   b06 = "|پژمر|پژوه|پسند|پلاس|پلک|پناه|پندار|پوس|پوش|پوی|پیچ|پیرای";
   b07 = "|پیمای|پیوند|تاز|تاب|تپ|توپ|تراش|تراو|ترس|ترش|ترک|تکان|تن|توان";
   b08 = "|جه|جوی|جنب|جنگ|جوش|جو|چاپ|چای|چپ|چرب|چرخ|چر|چسب|چش";
   b09 = "|چک|چلان|چم|چین|خار|خیز|خای|خراش|خرام|خروش|خر|خز|خست";
   b10 = "|خشک|خل|خم|خواب|خواه|خوان|خور|خوف|خیس|ده|دار|درخش|درو";
   b11 = "|در|دزد|دم|دوز|دوش|دو|بین|ربای|رخش|رس|ره|روی|رشت|رو|روب";
   b12 = "|رقص|رم|رنج|رند|روی|ریز|رین|زار|زای|زن|زدای|زی|ساز|سپر|سپوز";
   b13 = "|ستان|ستر|ستان|ستیز|سرای|سرشت|سر|سز|سنب|سگال|سنج|سوز|سای|شاش|شای";
   b14 = "|شتاب|شو|شوی|شکاف|شکن|شکوف|شکیب|شمر|شناس|شنو|شور|طلب|طوف|غارت";
   b15 = "|غر|غلط|غنو|فرست|فرسای|فرمای|فروش|فریب|فشر|فهم|قاپ|قبولان|کاه";
   b16 = "|کار|کاو|کن|کار|کُش|کش|کِش|کَش|کف|کن|کوچ|کوش|کوب|گای|گداز|گذار";
   b17 = "|گذر|گراز|گرای|گرد|گیر|گرو|گریز|گری|گزار|گز|گزین|گسار|گستر|گسل";
   b18 = "|گشای|گو|گمار|گنج|گند|گوار|گوز|لرز|لغز|لم|لند|لنگ|له";
   b19 = "|لیس|ماس|مال|مان|میر|مک|مول|موی|ناز|نال|نام|نشین|نکوه|نگار";
   b20 = "|نگر|نمای|نواز|نورد|نویس|نوش|نه|نهنب|نیوش|ورز|وز|هراس|هل";
   b21 = "|یار|یاز|یاب)";
   verbs = b01 + b02 + b03 + b04 + b05 + b06 + b07 + b08 + b09 + b10 + b11 + b12 + b13 + b14 + b15 + b16 + b17 + b18 + b19 + b20 + b21;
   re = new RegExp("(می|نمی)" + verbs + "(م|ی|د|یم|ید|ند)", "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')
   #تمام «ها» با فاصلهٔ مجازی می‌چسبند. و این مطابق مفاد آخرین شیوه‌نامه غلط نیست.
   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پدیا')
   # ریشه شناسی و ریشه‌شناسی
   s = s.replace(/ریشه\s{0,3}شناسی/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

def NonStandard(obj):

   s=obj
   #همزه روی ی
   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(/"([^\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

def digits(obj):

 # Convert Codes to Characters
   old = obj
   s=obj
   entofa = new Array("۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹")
   entoar = new Array("٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩")
   faChrs = "آأإئؤبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهیيك"
   faNums = "۰۱۲۳۴۵۶۷۸۹"
   # فارسی به انگلیسی
   for (i = 0; i < 10; i++) {
        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")
        old = old.replace(/¬!¬/g, "")
        reFaToEn = new RegExp("([$\\n=>][^"+faChrs+faNums+"\\n\\{\\}\\|=]*)"+entofa[i]+"([^"+faNums+"\\n\\{\\}\\|=]*?[A-Za-z0-9])", "g")
        old = old.replace(reFaToEn, "$1¬!¬"+i+"$2")
        old = old.replace(/¬!¬/g, "")
        reFaToEn = new RegExp("([A-Za-z0-9][^"+faChrs+faNums+"\\n\\{\\}\\|=]*)"+entofa[i]+"([^"+faNums+"\\n\\{\\}\\|=]*?[\\n\\{\\}\\|<$])", "g")
        old = old.replace(reFaToEn, "$1¬!¬"+i+"$2")
        old = old.replace(/¬!¬/g, "")
    
   # انگلیسی به فارسی
   for (i = 0; i < 10; i++):
        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")
        reEnToFa = new RegExp("([$=\\n\\{\\}\\|>][^A-Za-z0-9\\n\\{\\}\\|=]*)"+i+"([^A-Za-z\\n\\{\\}\\|=]*?[\\n\\{\\}\\|<$])", "g")
        old = old.replace(reEnToFa, "$1"+entofa[i]+"$2")
   # فارسی به انگلیسی (آن‌هایی که صددرصد باید انگلیسی شوند)
   for (i = 0; i < 10; i++):
        reFaToEn = new RegExp('(style|colspan|rowspan)( *= *[^\\|\\n]*?)'+entofa[i]+'(.*?\\|)', 'g')
        old = old.replace(reFaToEn, "$1$2¬!¬"+i+"$3")
        old = old.replace(/¬!¬/g, "")
        reFaToEn = new RegExp('(<math>[^<]*?)'+entofa[i]+'([^<]*<\\/math>)', 'g')
        old = old.replace(reFaToEn, "$1¬!¬"+i+"$2")
        old = old.replace(/¬!¬/g, "")
        reFaToEn = new RegExp('(https?:#[^\\s\\r\\n\\|\\}]*?)'+entofa[i], 'g')
        old = old.replace(reFaToEn, "$1¬!¬"+i)
        old = old.replace(/¬!¬/g, "")
   # عربی به فارسی
   for (i = 0; i < 10; i++)
     s = s.replace(new RegExp(entoar[i], 'g'), entofa[i])
   # ممیز و هزارگان
   s = s.replace(/([۱۲۳۴۵۶۷۸۹۰])\.([۱۲۳۴۵۶۷۸۹۰])/g, '$1٫$2')
   s = s.replace(/([۱۲۳۴۵۶۷۸۹۰]),([۱۲۳۴۵۶۷۸۹۰])/g, '$1٬$2')
   return s

def Punctuation(obj):

   s=obj
   s = s.replace(/ *(\
|\{\{بر\}\}) */g, "
")
   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{3,}/g, "\n\n")
   s = s.replace(/([^=])\n+(\=.*?\=\n)/g, "$1\n\n$2")
   s = s.replace(/^([*#]+)([^*#:\s])/mg, "$1 $2")
   s = s.replace(/[\s\n]+\<ref/g, "<ref")
   s = s.replace(/ +\<\/ref\>/g, "</ref>")
   # پاک کردن فاصله‌ها بین خطوط * دار
   s = s.replace(/(\n\*.*?)\n(?=\n\*)/g, '$1')
   # فاصله را از آخر خط پاک می‌کند
   s = s.replace(/([^ =]) *$/mg, "$1")
   # اصلاح  • 
   s = s.replace(/[\n\s]*\{\{[•·ن](w?)\}\}\s*/g, "الگو:•$1 ")
   s = s.replace(/(\<\w*(?:\s\w*=['"\w\d]+)*\s+\w*=)([\w\d_]+)((?:\s\w*=['"\w\d]+)*\s?\/?\>)/g, "$1\"$2\"$3")
   return s

function SuperTool(obj):

 obj=YKarabic(obj)
 obj=FM(obj)
 obj=NonStandard(obj)
 obj=digits(obj)
 obj=Punctuation(obj)
 return obj