উইকিবই bnwikibooks https://bn.wikibooks.org/wiki/%E0%A6%AA%E0%A7%8D%E0%A6%B0%E0%A6%A7%E0%A6%BE%E0%A6%A8_%E0%A6%AA%E0%A6%BE%E0%A6%A4%E0%A6%BE MediaWiki 1.39.0-wmf.26 first-letter মিডিয়া বিশেষ আলাপ ব্যবহারকারী ব্যবহারকারী আলাপ উইকিবই উইকিবই আলোচনা চিত্র চিত্র আলোচনা মিডিয়াউইকি মিডিয়াউইকি আলোচনা টেমপ্লেট টেমপ্লেট আলোচনা সাহায্য সাহায্য আলোচনা বিষয়শ্রেণী বিষয়শ্রেণী আলোচনা উইকিশৈশব উইকিশৈশব আলাপ বিষয় বিষয় আলাপ রন্ধনপ্রণালী রন্ধনপ্রণালী আলোচনা TimedText TimedText talk মডিউল মডিউল আলাপ গ্যাজেট গ্যাজেট আলোচনা গ্যাজেট সংজ্ঞা গ্যাজেট সংজ্ঞার আলোচনা উইকিশৈশব:বিড়ালের বড় প্রজাতি 100 3522 46851 40960 2022-08-28T16:52:00Z Salil Kumar Mukherjee 7573 পরিভাষা wikitext text/x-wiki <!--{{বিশেষ বই}} {{ভাল বই}}--> {{উইকিশৈশব বিড়ালের বড় প্রজাতি}} '''এই পৃষ্ঠাটি [[উইকিশৈশব]]-এর ''বিড়ালের বড় প্রজাতি'' প্রকল্পের অন্তর্ভুক্ত।''' এই প্রকল্পে যখন কাজ করবেন, মনে রাখবেন এটা শিশুদের জন্য বিশেষায়িত। সুতরাং ভালভাবে বোঝে শুনে একদম গুরুত্বপূর্ণ এবং যথার্থ শব্দ ব্যবহার করবেন। লেখকের প্রতিটি বিষয়ের বিস্তারিত আলোচনার চেয়ে বরং তুলনামুলক সবচেয়ে গুরুত্বপূর্ণ ধারণার উপর মনোনিবেশ করা উচিত। প্রয়োজনে আপনি প্রযুক্তিগত শব্দ বা শব্দভান্ডার ব্যবহার করুন, কিন্তু যেখানে সহজ ভাষায় কাজ করবে, সেখানে বড় শব্দ ব্যবহার করবেন না। আপনি যদি এই উইকিবইয়ে অবদান রাখেন এবং একজন লেখক হবার জন্য আনুষ্ঠানিক স্বীকৃতি চান,তাহলে এই তালিকায় আপনার নাম যোগ করুন: [[উইকিশৈশব:বিড়ালের বড় প্রজাতি/লেখক|সমস্ত উইকিশৈশব বিড়ালের বড় প্রজাতি লেখকদের তালিকা]] == সম্পূর্ণ উইকিবই == এগুলি একক পৃষ্ঠা গঠনের জন্য সংকলিত উইকিবইয়ের সব মডিউল। মনে রাখবেন যে এই নিবন্ধগুলিতে অধিক সংখ্যক চিত্রের পাশাপাশি এই উইকিবুকের দৈর্ঘ্যের কারণে এটি লোড হতে কিছুটা সময় নিতে পারে। === পিডিএফ রূপ === * [[মিডিয়া:Wikijunior-Big Cats.pdf|একটি পিডিএফ সংস্করণ ডাউনলোড করতে এখানে ক্লিক করুন]] (১১ই ডিসেম্বর, ২০০৫ মতে, পাতা ৬৫) * আরও আকর্ষণীয় লেআউট সহ [http://www.scribd.com/doc/2490736/Wikijunior-Big-Cats Scribd]তে দেখুন === এইচটিএমএল রূপ === * [[উইকিশৈশব বড় বিড়াল/পূর্ণ সংস্করণ|সম্পূর্ণ উইকিশৈশব বড় বিড়াল]] == প্রধান নিবন্ধসমূহ == এই বইয়ে যে নিবন্ধগুলি অন্তর্ভুক্ত করা হবে: '''ভূমিকা''' * [[উইকিশৈশব:Big Cats/Foreword|Foreword]] a note to the parents. * [[উইকিশৈশব:Big Cats/Meet The Cats|Meet the Cats]] some facts about cats and what makes them special '''বৃহদাকায় বিড়াল''' [[উইকিশৈশব:বড় বিড়াল/সিংহ|সিংহ]], [[উইকিশৈশব:বড় বিড়াল/বাঘ|বাঘ]], [[উইকিশৈশব:বড় বিড়াল/চিতাবাঘ|চিতাবাঘ]], [[উইকিশৈশব:বড় বিড়াল/জাগুয়ার|জাগুয়ার]], [[উইকিশৈশব:বড় বিড়াল/তুষার চিতা|তুষার চিতা]], [[উইকিশৈশব:বড় বিড়াল/মেঘলা চিতা|মেঘলা চিতা]], [[উইকিশৈশব:বিড়ালের বড় প্রজাতি/মার্বেল বিড়াল|মার্বেল বিড়াল]] '''দ্রুতগতির বিড়াল''' [[উইকিশৈশব:বিড়ালের বড় প্রজাতি/চিতা|চিতা]] '''SMALL NEW WORLD CATS''' [[উইকিশৈশব:Big Cats/Puma|Puma]], [[উইকিশৈশব:Big Cats/Lynx and bobcats|Lynx and bobcats]], [[উইকিশৈশব:Big Cats/Ocelot|Ocelot]], [[উইকিশৈশব:Big Cats/Margay|Margay]], [[উইকিশৈশব:Big Cats/Jaguarundi|Jaguarundi]], [[উইকিশৈশব:Big Cats/Rusty spotted cat|Rusty-spotted cat]] '''SMALL OLD WORLD CATS''' [[উইকিশৈশব:Big Cats/Caracal|Caracal]], [[উইকিশৈশব:Big Cats/Serval|Serval]], [[উইকিশৈশব:Big Cats/Manul|Manul]], [[উইকিশৈশব:Big Cats/Wildcat|Wild cat]], [[উইকিশৈশব:Big Cats/Sand cat|Sand cat]] '''সঙ্কর প্রজাতি''' [[উইকিশৈশব:Big Cats/Tigons and Ligers|Tigons and Ligers]], [[উইকিশৈশব:Big Cats/Leopons|Leopons]], [[উইকিশৈশব:Big Cats/Pumapards|Pumapards]], [[উইকিশৈশব:Big Cats/Marozi|Marozi]], [[উইকিশৈশব:Big Cats/Tigards|Tigards]] '''আরও বিষয়''' * [[উইকিশৈশব:Big Cats/Raising young|How do cats raise their young?]] - Learn how cats raise their young. * [[উইকিশৈশব:Big Cats/Fossil History|Fossil History]] - Sabretooth tigers, Cave lions, and Bears, oh my! * [[উইকিশৈশব:Big Cats/In danger of extinction|In Danger of Extinction]] - Be aware of the danger cats may be in. * [[উইকিশৈশব:Big Cats/Keeping cats|Keeping Cats]] - An interview with a zoo keeper on how big cats are "kept" * [[উইকিশৈশব:বিড়ালের বড় প্রজাতি/শ্রেণীবিভাগ|বিড়ালের শ্রেণীবিভাগ]] - কিভাবে বিজ্ঞানীরা বিড়ালের নামকরণ এবং শ্রেণীবিভাগ করেন। * [[উইকিশৈশব:Big Cats/Glossary|Glossary]] - Define general terms children may not understand from context. '''সম্মুখ প্রচ্ছদের জন্য প্রস্তাব''' [[চিত্র:উইকিশৈশব বিড়ালের বড় প্রজাতি.png|থাম্ব|বাম|বাঘ এবং ধূসর রং]] {{উইকিপিডিয়া|Big cat}} {{বিষয়|উইকিশৈশব প্রাকৃতিক বিশ্ব}} {{বর্ণানুক্রমিক|ব}} {{অবস্থা|25%}} [[বিষয়শ্রেণী:পিডিএফ সংস্করণসহ বই]] {{বইয়ের বিষয়শ্রেণী}} oni6y1kn09q6tzv7jnk75o7futh75a0 উইকিশৈশব:ইউরোপ/এস্তোনিয়া 100 7062 46853 39034 2022-08-28T16:57:28Z Salil Kumar Mukherjee 7573 অনুবাদ wikitext text/x-wiki {{DISPLAYTITLE:<span style="color:blue"><center>উইকিশৈশব ইউরোপ: {{SUBPAGENAME}}</center></span>}} [[চিত্র:Flag_of_Estonia_(bordered).svg|200px|থাম্ব|ডান|এস্তোনিয়ার জাতীয় পতাকা]] [[চিত্র:LocationEstoniaInEurope.png|থাম্ব|200px|ডান|Map showing location of Estonia in Europe]] '''ইস্তোনিয়া বা এস্তোনিয়া'''(এস্তোনীয় ভাষায় Eesti এস্তি) উত্তর-পূর্ব ইউরোপের একটি রাষ্ট্র। সরকারীভাবে এর নাম এস্তোনিয়া প্রজাতন্ত্র (Eesti Vabariik এস্তি ভাবারিক)। এর রাজধানীর নাম তাল্লিন। এস্তোনিয়া দেশটি বাল্টিক সাগরের পূর্ব প্রান্তে অবস্থিত। এস্তোনিয়ার রাজধানী তাল্লিন একটি গুরুত্বপূর্ণ বাল্টিক সমুদ্রবন্দর এবং দেশের বৃহত্তম শহর। ২০০৪ সালের ১লা মে এস্তোনিয়া ইউরোপীয় ইউনিয়নের পূর্ণ সদস্যপদ লাভ করে এবং একই বছরের ২৯শে মার্চ থেকে দেশটি ন্যাটোজোটভুক্ত। == এস্তোনিয়ার ইতিহাস == প্রথম বিশ্বযুদ্ধের রুশ সাম্রাজ্যের পতন হলে এস্তোনিয়া ১৯১৮ সালের নভেম্বর মাসে নিজেকে স্বাধীন ঘোষণা করে। তার্তুর শান্তিচুক্তিতে রাশিয়া এস্তোনিয়ার স্বাধীনতার স্বীকৃতি দেয়। ১৯২০ সালের এস্তোনিয়ার প্রথম সংবিধান গৃহীত হয় এবং এখানে একটি সংসদীয় সরকার ব্যবস্থা প্রতিষ্ঠা করা হয়। এস্তোনিয়া আরও প্রায় ২২ বছর স্বাধীন ছিল। স্বাধীন এস্তোনিয়াতে সব ধর্ম ও সংস্কৃতির লোকদের সমান মর্যাদা ছিল। ১৯৮০-র দশকের শেষের দিকে মিখাইল গর্বাচফের অধীনে মতপ্রকাশের স্বাধীনতার উপর কড়াকড়ি শিথিল হলে এস্তোনীয়রা স্বাধীকারের উপর সোচ্চার হয়ে ওঠে। ১৯৮৮ সাল নাগাদ হাজার হাজার লোক পূর্বতন জাতীয় গানগুলি গাওয়া শুরু করে। এটি ছিল এস্তোনিয়ার "সঙ্গীত বিপ্লব"। ১৯৮৮ সালের এস্তোনিয়ার সুপ্রীম কোর্ট সার্বভৌমত্বের বিবৃতি পাস করেন। ১৯৯০ সালে এস্তোনিয়া প্রজাতন্ত্র নামটি পুনরায় বহাল করা হয় এবং ১৯৯১ সালের সোভিয়েত ক্যু-র পর এস্তোনিয়া পূর্ণ স্বাধীনতা ঘোষণা করে। ১৯৯১ সালে সোভিয়েত সুপ্রীম কোর্ট স্বাধীন এস্তোনিয়াকে স্বীকৃতি দেয়। কোন রক্ত না ঝরিয়েই এস্তোনিয়া স্বাধীনতা লাভ করে। ১৯৯১ সালের ১৭ই সেপ্টেম্বর এস্তোনিয়া জাতিসংঘের সদস্য হয়। এছাড়াও এটি IAEA, ICAO, UNCTAD, WHO, WIPO, UNESCO, ILO, IMF, WB/EBRD এবং OSCE-র সদস্য। তিন বছর আলোচনার পর ১৯৯৪ সালের ৩১শে আগস্ট রুশ ফেডারেশনের সামরিক বাহিনী এস্তোনিয়া থেকে নিজেদের প্রত্যাহার করে নেয়। == আরও পড়ুন == {{টেমপ্লেট:উইকিশৈশব ইউরোপ}} {{বইয়ের বিষয়শ্রেণী}} {{Wikivoyage|{{SUBPAGENAME}}}} 0zs5d05bzibxt845xzeip84otb4osmo উইকিশৈশব:ইউরোপ/স্লোভেনিয়া 100 7288 46852 40358 2022-08-28T16:56:01Z Salil Kumar Mukherjee 7573 অনুবাদ wikitext text/x-wiki {{DISPLAYTITLE:<span style="color:blue"><center>উইকিশৈশব:ইউরোপ: {{SUBPAGENAME}}</center></span>}} [[চিত্র:Flag of Slovenia.svg|থাম্ব|280px|ডান|স্লোভেনিয়ার জাতীয় পতাকা]] {{উইকিপিডিয়া|স্লোভেনিয়া}} ajalcft9ixf22nnzbaq77tm1k9sqfqd মিডিয়াউইকি:Gadget-twinklespeedy.js 8 7975 46855 44028 2022-08-29T10:08:51Z Aishik Rehman 5249 javascript text/javascript // <nowiki> (function($) { /* **************************************** *** twinklespeedy.js: CSD module **************************************** * Mode of invocation: Tab ("দ্রুত অপসারণ প্রস্তাবনা") * Active on: Non-special, existing pages * * NOTE FOR DEVELOPERS: * If adding a new criterion, add it to the appropriate places at the top of * twinkleconfig.js. Also check out the default values of the CSD preferences * in twinkle.js, and add your new criterion to those if you think it would be * good. */ Twinkle.speedy = function twinklespeedy() { // Disable on: // * special pages // * non-existent pages if (mw.config.get('wgNamespaceNumber') < 0 || !mw.config.get('wgArticleId')) { return; } Twinkle.addPortletLink(Twinkle.speedy.callback, 'দ্রুত অপসারণ প্রস্তাবনা', 'tw-csd', Morebits.userIsSysop ? 'Delete page according to WP:CSD' : 'WP:CSD অনুযায়ী দ্রুত অপসারণের জন্য অনুরোধ'); }; // This function is run when the CSD tab/header link is clicked Twinkle.speedy.callback = function twinklespeedyCallback() { Twinkle.speedy.initDialog(Morebits.userIsSysop ? Twinkle.speedy.callback.evaluateSysop : Twinkle.speedy.callback.evaluateUser, true); }; // Used by unlink feature Twinkle.speedy.dialog = null; // Used throughout Twinkle.speedy.hasCSD = !!$('#delete-reason').length; // Prepares the speedy deletion dialog and displays it Twinkle.speedy.initDialog = function twinklespeedyInitDialog(callbackfunc) { var dialog; Twinkle.speedy.dialog = new Morebits.simpleWindow(Twinkle.getPref('speedyWindowWidth'), Twinkle.getPref('speedyWindowHeight')); dialog = Twinkle.speedy.dialog; dialog.setTitle('দ্রুত অপসারণের বিচারধারা নির্বাচন করুন'); dialog.setScriptName('টুইংকল'); dialog.addFooterLink('দ্রুত অপসারণ নীতিমালা', 'WP:CSD'); dialog.addFooterLink('পছন্দ', 'WP:TW/PREF#দ্রুত'); dialog.addFooterLink('টুইংকল সাহায্য', 'WP:TW/DOC#দ্রুত'); dialog.addFooterLink('প্রতিক্রিয়া জানান', 'WT:TW'); var form = new Morebits.quickForm(callbackfunc, Twinkle.getPref('speedySelectionStyle') === 'radioClick' ? 'change' : null); if (Morebits.userIsSysop) { form.append({ type: 'checkbox', list: [ { label: 'শুধুমাত্র ট্যাগ করা হবে, অপসারিত হবে না', value: 'tag_only', name: 'tag_only', tooltip: 'If you just want to tag the page, instead of deleting it now', checked: !(Twinkle.speedy.hasCSD || Twinkle.getPref('deleteSysopDefaultToDelete')), event: function(event) { var cForm = event.target.form; var cChecked = event.target.checked; // enable talk page checkbox if (cForm.talkpage) { cForm.talkpage.checked = !cChecked && Twinkle.getPref('deleteTalkPageOnDelete'); } // enable redirects checkbox cForm.redirects.checked = !cChecked; // enable delete multiple cForm.delmultiple.checked = false; // enable notify checkbox cForm.notify.checked = cChecked; // enable deletion notification checkbox cForm.warnusertalk.checked = !cChecked && !Twinkle.speedy.hasCSD; // enable multiple cForm.multiple.checked = false; // enable requesting creation protection cForm.salting.checked = false; Twinkle.speedy.callback.modeChanged(cForm); event.stopPropagation(); } } ] }); var deleteOptions = form.append({ type: 'div', name: 'delete_options' }); deleteOptions.append({ type: 'header', label: 'Delete-related options' }); if (mw.config.get('wgNamespaceNumber') % 2 === 0 && (mw.config.get('wgNamespaceNumber') !== 2 || (/\//).test(mw.config.get('wgTitle')))) { // hide option for user pages, to avoid accidentally deleting user talk page deleteOptions.append({ type: 'checkbox', list: [ { label: 'আলাপ পাতাও অপসারণ করুন', value: 'talkpage', name: 'talkpage', tooltip: "This option deletes the page's talk page in addition. If you choose the F8 (moved to Commons) criterion, this option is ignored and the talk page is *not* deleted.", checked: Twinkle.getPref('deleteTalkPageOnDelete'), event: function(event) { event.stopPropagation(); } } ] }); } deleteOptions.append({ type: 'checkbox', list: [ { label: 'সকল পুনর্নির্দেশও অপসারণ করুন', value: 'redirects', name: 'redirects', tooltip: 'This option deletes all incoming redirects in addition. Avoid this option for procedural (e.g. move/merge) deletions.', checked: Twinkle.getPref('deleteRedirectsOnDelete'), event: function (event) { event.stopPropagation(); } }, { label: 'একাধিক বিচারধারায় অপসারণ করুন', value: 'delmultiple', name: 'delmultiple', tooltip: 'When selected, you can select several criteria that apply to the page. For example, G11 and A7 are a common combination for articles.', event: function(event) { Twinkle.speedy.callback.modeChanged(event.target.form); event.stopPropagation(); } }, { label: 'পাতা তৈরিকারীকে অপসারণের বিজ্ঞপ্তি পাঠান', value: 'warnusertalk', name: 'warnusertalk', tooltip: 'A notification template will be placed on the talk page of the creator, IF you have a notification enabled in your Twinkle preferences ' + 'for the criterion you choose AND this box is checked. The creator may be welcomed as well.', checked: !Twinkle.speedy.hasCSD, event: function(event) { event.stopPropagation(); } } ] }); } var tagOptions = form.append({ type: 'div', name: 'tag_options' }); if (Morebits.userIsSysop) { tagOptions.append({ type: 'header', label: 'Tag-related options' }); } tagOptions.append({ type: 'checkbox', list: [ { label: 'যদি সম্ভব হয় তবে পাতা তৈরিকারীকে বিজ্ঞপ্তি পাঠান', value: 'notify', name: 'notify', tooltip: 'A notification template will be placed on the talk page of the creator, IF you have a notification enabled in your Twinkle preferences ' + 'for the criterion you choose AND this box is checked. The creator may be welcomed as well.', checked: !Morebits.userIsSysop || !(Twinkle.speedy.hasCSD || Twinkle.getPref('deleteSysopDefaultToDelete')), event: function(event) { event.stopPropagation(); } }, { label: 'একইসাথে পাতা তৈরি সুরক্ষার জন্যও ট্যাগ করুন', value: 'salting', name: 'salting', tooltip: 'When selected, the speedy deletion tag will be accompanied by a {{salt}} tag requesting that the deleting administrator apply creation protection. Only select if this page has been repeatedly recreated.', event: function(event) { event.stopPropagation(); } }, { label: 'একাধিক বিচারধারায় ট্যাগ করুন', value: 'multiple', name: 'multiple', tooltip: 'When selected, you can select several criteria that apply to the page. For example, G11 and A7 are a common combination for articles.', event: function(event) { Twinkle.speedy.callback.modeChanged(event.target.form); event.stopPropagation(); } } ] }); form.append({ type: 'div', id: 'prior-deletion-count', style: 'font-style: italic' }); form.append({ type: 'div', name: 'work_area', label: 'Failed to initialize the CSD module. Please try again, or tell the Twinkle developers about the issue.' }); if (Twinkle.getPref('speedySelectionStyle') !== 'radioClick') { form.append({ type: 'submit', className: 'tw-speedy-submit' }); // Renamed in modeChanged } var result = form.render(); dialog.setContent(result); dialog.display(); Twinkle.speedy.callback.modeChanged(result); // Check for prior deletions. Just once, upon init Twinkle.speedy.callback.priorDeletionCount(); }; Twinkle.speedy.callback.modeChanged = function twinklespeedyCallbackModeChanged(form) { var namespace = mw.config.get('wgNamespaceNumber'); // first figure out what mode we're in var mode = { isSysop: !!form.tag_only && !form.tag_only.checked, isMultiple: form.tag_only && !form.tag_only.checked ? form.delmultiple.checked : form.multiple.checked, isRadioClick: Twinkle.getPref('speedySelectionStyle') === 'radioClick' }; if (mode.isSysop) { $('[name=delete_options]').show(); $('[name=tag_options]').hide(); $('button.tw-speedy-submit').text('Delete page'); } else { $('[name=delete_options]').hide(); $('[name=tag_options]').show(); $('button.tw-speedy-submit').text('জমা দিন'); } var work_area = new Morebits.quickForm.element({ type: 'div', name: 'work_area' }); if (mode.isMultiple && mode.isRadioClick) { var evaluateType = mode.isSysop ? 'evaluateSysop' : 'evaluateUser'; work_area.append({ type: 'div', label: 'When finished choosing criteria, click:' }); work_area.append({ type: 'button', name: 'submit-multiple', label: mode.isSysop ? 'Delete page' : 'Tag page', event: function(event) { Twinkle.speedy.callback[evaluateType](event); event.stopPropagation(); } }); } var appendList = function(headerLabel, csdList) { work_area.append({ type: 'header', label: headerLabel }); work_area.append({ type: mode.isMultiple ? 'checkbox' : 'radio', name: 'csd', list: Twinkle.speedy.generateCsdList(csdList, mode) }); }; if (mode.isSysop && !mode.isMultiple) { appendList('Custom rationale', Twinkle.speedy.customRationale); } if (namespace % 2 === 1 && namespace !== 3) { // show db-talk on talk pages, but not user talk pages appendList('আলাপ পাতা', Twinkle.speedy.talkList); } if (!Morebits.isPageRedirect()) { switch (namespace) { case 0: // article case 1: // talk appendList('নিবন্ধ', Twinkle.speedy.articleList); break; case 2: // user case 3: // user talk appendList('ব্যবহারকারী পাতা', Twinkle.speedy.userList); break; case 6: // file case 7: // file talk appendList('Files', Twinkle.speedy.fileList); if (!mode.isSysop) { work_area.append({ type: 'div', label: 'Tagging for CSD F4 (no license), F5 (orphaned fair use), F6 (no fair use rationale), and F11 (no permission) can be done using Twinkle\'s "DI" tab.' }); } break; case 14: // category case 15: // category talk appendList('Categories', Twinkle.speedy.categoryList); break; case 100: // portal case 101: // portal talk appendList('Portals', Twinkle.speedy.portalList); break; default: break; } } else { if (namespace === 2 || namespace === 3) { appendList('ব্যবহারকারী পাতা', Twinkle.speedy.userList); } appendList('Redirects', Twinkle.speedy.redirectList); } var generalCriteria = Twinkle.speedy.generalList; // custom rationale lives under general criteria when tagging if (!mode.isSysop) { generalCriteria = Twinkle.speedy.customRationale.concat(generalCriteria); } appendList('সাধারণ বিচারধারা', generalCriteria); var old_area = Morebits.quickForm.getElements(form, 'work_area')[0]; form.replaceChild(work_area.render(), old_area); // if sysop, check if CSD is already on the page and fill in custom rationale if (mode.isSysop && Twinkle.speedy.hasCSD) { var customOption = $('input[name=csd][value=reason]')[0]; if (customOption) { if (Twinkle.getPref('speedySelectionStyle') !== 'radioClick') { // force listeners to re-init customOption.click(); customOption.parentNode.appendChild(customOption.subgroup); } customOption.subgroup.querySelector('input').value = decodeURIComponent($('#delete-reason').text()).replace(/\+/g, ' '); } } }; Twinkle.speedy.callback.priorDeletionCount = function () { var query = { action: 'query', format: 'json', list: 'logevents', letype: 'delete', leaction: 'delete/delete', // Just pure page deletion, no redirect overwrites or revdel letitle: mw.config.get('wgPageName'), leprop: '', // We're just counting we don't actually care about the entries lelimit: 5 // A little bit goes a long way }; new Morebits.wiki.api('Checking for past deletions', query, function(apiobj) { var response = apiobj.getResponse(); var delCount = response.query.logevents.length; if (delCount) { var message = delCount + ' বার অপসারণ করা হয়েছে'; if (delCount > 1) { message += 's'; if (response.continue) { message = 'More than ' + message; } // 3+ seems problematic if (delCount >= 3) { $('#prior-deletion-count').css('color', 'red'); } } // Provide a link to page logs (CSD templates have one for sysops) var link = Morebits.htmlNode('a', '(লগ)'); link.setAttribute('href', mw.util.getUrl('Special:Log', {page: mw.config.get('wgPageName')})); link.setAttribute('target', '_blank'); $('#prior-deletion-count').text(message + ' '); // Space before log link $('#prior-deletion-count').append(link); } }).post(); }; Twinkle.speedy.generateCsdList = function twinklespeedyGenerateCsdList(list, mode) { var pageNamespace = mw.config.get('wgNamespaceNumber'); var openSubgroupHandler = function(e) { $(e.target.form).find('input').prop('disabled', true); $(e.target.form).children().css('color', 'gray'); $(e.target).parent().css('color', 'black').find('input').prop('disabled', false); $(e.target).parent().find('input:text')[0].focus(); e.stopPropagation(); }; var submitSubgroupHandler = function(e) { var evaluateType = mode.isSysop ? 'evaluateSysop' : 'evaluateUser'; Twinkle.speedy.callback[evaluateType](e); e.stopPropagation(); }; return $.map(list, function(critElement) { var criterion = $.extend({}, critElement); if (mode.isMultiple) { if (criterion.hideWhenMultiple) { return null; } if (criterion.hideSubgroupWhenMultiple) { criterion.subgroup = null; } } else { if (criterion.hideWhenSingle) { return null; } if (criterion.hideSubgroupWhenSingle) { criterion.subgroup = null; } } if (mode.isSysop) { if (criterion.hideWhenSysop) { return null; } if (criterion.hideSubgroupWhenSysop) { criterion.subgroup = null; } } else { if (criterion.hideWhenUser) { return null; } if (criterion.hideSubgroupWhenUser) { criterion.subgroup = null; } } if (Morebits.isPageRedirect() && criterion.hideWhenRedirect) { return null; } if (criterion.showInNamespaces && criterion.showInNamespaces.indexOf(pageNamespace) < 0) { return null; } if (criterion.hideInNamespaces && criterion.hideInNamespaces.indexOf(pageNamespace) > -1) { return null; } if (criterion.subgroup && !mode.isMultiple && mode.isRadioClick) { if (Array.isArray(criterion.subgroup)) { criterion.subgroup = criterion.subgroup.concat({ type: 'button', name: 'submit', label: mode.isSysop ? 'Delete page' : 'Tag page', event: submitSubgroupHandler }); } else { criterion.subgroup = [ criterion.subgroup, { type: 'button', name: 'submit', // ends up being called "csd.submit" so this is OK label: mode.isSysop ? 'Delete page' : 'Tag page', event: submitSubgroupHandler } ]; } // FIXME: does this do anything? criterion.event = openSubgroupHandler; } return criterion; }); }; Twinkle.speedy.customRationale = [ { label: 'নিজস্ব যৌক্তিকতা' + (Morebits.userIsSysop ? ' (custom deletion reason)' : ' {{db}} টেমপ্লেট ব্যবহার করে'), value: 'reason', tooltip: '{{db}} is short for "delete because". At least one of the other deletion criteria must still apply to the page, and you must make mention of this in your rationale. This is not a "catch-all" for when you can\'t find any criteria that fit.', subgroup: { name: 'reason_1', type: 'input', label: 'Rationale:', size: 60 }, hideWhenMultiple: true } ]; Twinkle.speedy.talkList = [ { label: 'স৮: ইতিমধ্যেই অপসারিত বা অস্তিত্বহীন পাতার ওপর নির্ভরশীল পাতা বা আলাপ পাতা', value: 'talk', tooltip: 'পরবর্তীতে প্রয়োজন হতে পারে এমন পাতাগুলো এটির আওতাভুক্ত নয়, যেমন ব্যবহারকারী আলাপ পাতা, আলাপ পাতার আর্কাইভ, কমন্সে রয়েছে এমন ফাইলের আলাপ পাতা ইত্যাদি।' } ]; Twinkle.speedy.articleList = [ { label: 'নি১: নিবন্ধের বিষয়বস্তু যাচাই করার মতো যথেষ্ট পরিমাণ লেখা নেই।', value: 'nocontext', tooltip: 'Example: "He is a funny man with a red car. He makes people laugh." This applies only to very short articles. Context is different from content, treated in A3, below.' }, { label: 'নি২: বিদেশি ভাষার নিবন্ধ যা অন্য একটি উইকিমিডিয়া প্রকল্পে রয়েছে', value: 'foreign', tooltip: 'নিবন্ধটি বাংলা ভাষায় লিখিত নয়', subgroup: { name: 'foreign_source', type: 'input', label: 'Interwiki link to the article on the foreign-language wiki:', tooltip: 'For example, fr:Bonjour' } }, { label: 'নি৩: খালি নিবন্ধ বা কোনো তথ্য নেই', value: 'nocontent', tooltip: 'Any article consisting only of links elsewhere (including hyperlinks, category tags and "see also" sections), a rephrasing of the title, and/or attempts to correspond with the person or group named by its title. This does not include disambiguation pages' }, { label: 'নি৫: নিবন্ধ যা অন্য কোনো প্রকল্পের জন্য প্রযোজ্য বা স্থানান্তরিত', value: 'transwiki', tooltip: 'Any article that has been discussed at Articles for Deletion (et al), where the outcome was to transwiki, and where the transwikification has been properly performed and the author information recorded. Alternately, any article that consists of only a dictionary definition, where the transwikification has been properly performed and the author information recorded', subgroup: { name: 'transwiki_location', type: 'input', label: 'Link to where the page has been transwikied:', tooltip: 'For example, https://en.wiktionary.org/wiki/twinkle or [[wikt:twinkle]]' } }, ]; Twinkle.speedy.categoryList = [ { label: 'বি১: খালি বিষয়শ্রেণী', value: 'catempty', tooltip: 'Categories that have been unpopulated for at least seven days. This does not apply to categories being discussed at WP:CFD, disambiguation categories, and certain other exceptions. If the category isn\'t relatively new, it possibly contained articles earlier, and deeper investigation is needed' }, { label: 'স৮: অপসারিত বা নামান্তরিত টেমপ্লেট দ্বারা পপুলেটেড বিষয়শ্রেণী', value: 'templatecat', tooltip: 'This is for situations where a category is effectively empty, because the template(s) that formerly placed pages in that category are now deleted. This excludes categories that are still in use.', subgroup: { name: 'templatecat_rationale', type: 'input', label: 'Optional explanation:', size: 60 } }, { label: 'স৮: অস্তিত্ব নেই এমন লক্ষ্যে পুনর্নির্দেশিত', value: 'redirnone', tooltip: 'This excludes any page that is useful to the project, and in particular: deletion discussions that are not logged elsewhere, user and user talk pages, talk page archives, plausible redirects that can be changed to valid targets, and file pages or talk pages for files that exist on Wikimedia Commons.', hideWhenMultiple: true } ]; Twinkle.speedy.userList = [ { label: 'ব্য১: ব্যবহারকারীর অনুরোধে', value: 'userreq', tooltip: 'Personal subpages, upon request by their user. In some rare cases there may be administrative need to retain the page. Also, sometimes, main user pages may be deleted as well. See Wikipedia:User page for full instructions and guidelines', subgroup: mw.config.get('wgNamespaceNumber') === 3 && mw.config.get('wgTitle').indexOf('/') === -1 ? { name: 'userreq_rationale', type: 'input', label: 'কেন আলাপ পাতাটি অপসারিত হবে তার যৌক্তিক কারণ লিখুন (এটি বাধ্যতামূলক):', tooltip: 'User talk pages are deleted only in highly exceptional circumstances. See WP:DELTALK.', size: 60 } : null, hideSubgroupWhenMultiple: true }, { label: 'ব্য২: অস্তিত্বহীন ব্যবহারকারী', value: 'nouser', tooltip: 'User pages of users that do not exist (Check Special:Listusers)' }, { label: 'ব্য৩: অ-মুক্ত চিত্রশালা', value: 'gallery', tooltip: 'Galleries in the userspace which consist mostly of "fair use" or non-free files. Wikipedia\'s non-free content policy forbids users from displaying non-free files, even ones they have uploaded themselves, in userspace. It is acceptable to have free files, GFDL-files, Creative Commons and similar licenses along with public domain material, but not "fair use" files', hideWhenRedirect: true }, { label: 'ব্য৫: WP:NOTWEBHOST হিসেবে ব্যবহারকারী পাতার অনুপযুক্ত ব্যবহার', value: 'notwebhost', tooltip: 'এখানে উইকিপিডিয়ার লক্ষ্যগুলির সাথে ঘনিষ্ঠভাবে সম্পর্কিত নয় এমন রচনা, তথ্য, আলোচনা, ও/বা ক্রিয়াকলাপগুলি রয়েছে। ব্যবহারকারী, ব্যবহারকারী নামস্থানের বাইরে খুব কম বা কোনও সম্পাদনা করেনি।', hideWhenRedirect: true }, { label: 'স১১: প্রচারমূলক ব্যবহারকারী নামের অধীনে প্রচারমূলক ব্যবহারকারী পাতা', value: 'spamuser', tooltip: 'প্রচারমূলক ব্যবহারকারীর পৃষ্ঠা, ব্যবহারকারীর নাম দেখে মনে হচ্ছে ব্যবহারকারী কোন সত্তার সাথে সম্পর্কিত ও তা প্রচার করছে।', hideWhenMultiple: true, hideWhenRedirect: true }, /*{ label: 'G13: AfC draft submission or a blank draft, stale by over 6 months', value: 'afc', tooltip: 'Any rejected or unsubmitted AfC draft submission or a blank draft, that has not been edited in over 6 months (excluding bot edits).', hideWhenMultiple: true, hideWhenRedirect: true }*/ ]; Twinkle.speedy.portalList = [ { label: 'প্র১: প্রবেশদ্বার পাতা যা নিবন্ধ হিসেবে দ্রুত অপসারণের জন্য বিবেচ্য', value: 'p1', tooltip: 'You must specify a single article criterion that applies in this case (A1, A3, A7, or A10).', subgroup: { name: 'p1_criterion', type: 'input', label: 'Article criterion that would apply:' } }, { label: 'প্র২: পর্যাপ্ত নিবন্ধ বা বিষয়বস্তু নেই এমন বিষয়ের ওপর প্রণীত প্রবেশদ্বার পাতা', value: 'emptyportal', tooltip: 'Any Portal based on a topic for which there is not a non-stub header article, and at least three non-stub articles detailing subject matter that would be appropriate to discuss under the title of that Portal' } ]; Twinkle.speedy.generalList = [ { label: 'স১: অসংলগ্ন,অর্থহীন,অ-উল্লেখযোগ্য বা অবোধগম্য পাতা', value: 'nonsense', tooltip: 'This does not include poor writing, partisan screeds, obscene remarks, vandalism, fictional material, material not in English, poorly translated material, implausible theories, or hoaxes. In short, if you can understand it, G1 does not apply.', hideInNamespaces: [ 2 ] // Not applicable in userspace }, { label: 'স২: পরীক্ষামূলক পাতা', value: 'test', tooltip: 'A page created to test editing or other Wikipedia functions. Pages in the User namespace are not included, nor are valid but unused or duplicate templates.', hideInNamespaces: [ 2 ] // Not applicable in userspace }, { label: 'স৩: স্পষ্টত ধ্বংসপ্রবণতা', value: 'vandalism', tooltip: 'Plain pure vandalism (including redirects left behind from pagemove vandalism)' }, { label: 'স৩: ধোঁকাবাজি, চালাকি বা তামাসা', value: 'hoax', tooltip: 'Blatant and obvious hoax, to the point of vandalism', hideWhenMultiple: true }, { label: 'স৪: আলোচনার মাধ্যমে অপসারিত পাতা পুনঃতৈরি', value: 'repost', tooltip: 'A copy, by any title, of a page that was deleted via an XfD process or Deletion review, provided that the copy is substantially identical to the deleted version. This clause does not apply to content that has been "userfied", to content undeleted as a result of Deletion review, or if the prior deletions were proposed or speedy deletions, although in this last case, other speedy deletion criteria may still apply', subgroup: { name: 'repost_xfd', type: 'input', label: 'যে পাতায় অপসারণ আলোচনা সংঘটিত হয়েছে:', tooltip: 'Must start with "Wikipedia:"', size: 60 } }, { label: 'স৫: নিষিদ্ধ বা বাধাপ্রাপ্ত ব্যবহারকারীর তৈরি পাতা', value: 'banned', tooltip: 'Pages created by banned or blocked users in violation of their ban or block, and which have no substantial edits by others', subgroup: { name: 'banned_user', type: 'input', label: 'নিষিদ্ধ ব্যবহারকারী ব্যবহারকারী না (যদি পাওয়া যায়):', tooltip: 'Should not start with "User:"' } }, { label: 'স৬: স্থানান্তর', value: 'move', tooltip: 'Making way for an uncontroversial move like reversing a redirect', subgroup: [ { name: 'move_page', type: 'input', label: 'যে পাতা এখানে স্থানান্তর করা হবে:' }, { name: 'move_reason', type: 'input', label: 'Reason:', size: 60 } ], hideWhenMultiple: true }, { label: 'স৬: অপসারণ প্রস্তাবনা (এক্সএফডি)', value: 'xfd', tooltip: 'A deletion discussion (at AfD, FfD, RfD, TfD, CfD, or MfD) was closed as "delete", but the page wasn\'t actually deleted.', subgroup: { name: 'xfd_fullvotepage', type: 'input', label: 'যে পাতায় অপসারণ আলোচনা সংঘটিত হয়েছে:', tooltip: 'Must start with "Wikipedia:"', size: 40 }, hideWhenMultiple: true }, { label: 'স৬: অনুলিপি-প্রতিলিপি করে পাতা স্থানান্তর', value: 'copypaste', tooltip: 'This only applies for a copy-and-paste page move of another page that needs to be temporarily deleted to make room for a clean page move.', subgroup: { name: 'copypaste_sourcepage', type: 'input', label: 'যে পাতাটি থেকে এখানে অনুলিপি-প্রতিলিপি করা হয়েছে তার নাম:' }, hideWhenMultiple: true }, { label: 'স৬: গৃহস্থালি ও নিয়মমাফিক (অবিতর্কিত) পরিষ্করণ', value: 'g6', tooltip: 'Other routine maintenance tasks', subgroup: { name: 'g6_rationale', type: 'input', label: 'Rationale:', size: 60 } }, { label: 'স৭: প্রণেতার অপসারণ অনুরোধ, অথবা প্রণেতা পাতাটি খালি করেছেন', value: 'author', tooltip: 'Any page for which deletion is requested by the original author in good faith, provided the page\'s only substantial content was added by its author. If the author blanks the page, this can also be taken as a deletion request.', subgroup: { name: 'author_rationale', type: 'input', label: 'ঐচ্ছিক ব্যাখ্যা:', tooltip: 'Perhaps linking to where the author requested this deletion.', size: 60 }, hideSubgroupWhenSysop: true }, { label: 'স৮: অপসারিত পাতার উপর নির্ভরশীল পাতা', value: 'g8', tooltip: 'such as talk pages with no corresponding subject page; subpages with no parent page; file pages without a corresponding file; redirects to non-existent targets; or categories populated by deleted or retargeted templates. This excludes any page that is useful to the project, and in particular: deletion discussions that are not logged elsewhere, user and user talk pages, talk page archives, plausible redirects that can be changed to valid targets, and file pages or talk pages for files that exist on Wikimedia Commons.', subgroup: { name: 'g8_rationale', type: 'input', label: 'Optional explanation:', size: 60 }, hideSubgroupWhenSysop: true }, { label: 'স৮: অপসারিত পাতার উপপাতা', value: 'subpage', tooltip: 'This excludes any page that is useful to the project, and in particular: deletion discussions that are not logged elsewhere, user and user talk pages, talk page archives, plausible redirects that can be changed to valid targets, and file pages or talk pages for files that exist on Wikimedia Commons.', hideWhenMultiple: true, hideInNamespaces: [ 0, 6, 8 ] // hide in main, file, and mediawiki-spaces }, { label: 'স১১: দ্ব্যর্থহীন বিজ্ঞাপন', value: 'spam', tooltip: 'Pages which exclusively promote a company, product, group, service, or person and which would need to be fundamentally rewritten in order to become encyclopedic. Note that an article about a company or a product which describes its subject from a neutral point of view does not qualify for this criterion; an article that is blatant advertising should have inappropriate content as well' }, { label: 'স১২: দ্ব্যর্থহীন কপিরাইট লঙ্ঘন', value: 'copyvio', tooltip: 'Either: (1) Material was copied from another website that does not have a license compatible with Wikipedia, or is photography from a stock photo seller (such as Getty Images or Corbis) or other commercial content provider; (2) There is no non-infringing content in the page history worth saving; or (3) The infringement was introduced at once by a single person rather than created organically on wiki and then copied by another website such as one of the many Wikipedia mirrors', subgroup: [ { name: 'copyvio_url', type: 'input', label: 'ইউআরএল (যদি থাকে):', tooltip: 'If the material was copied from an online source, put the URL here, including the "http://" or "https://" protocol.', size: 60 }, { name: 'copyvio_url2', type: 'input', label: 'অতিরিক্ত ইউআরএল:', tooltip: 'Optional. Should begin with "http://" or "https://"', size: 60 }, { name: 'copyvio_url3', type: 'input', label: 'অতিরিক্ত ইউআরএল:', tooltip: 'Optional. Should begin with "http://" or "https://"', size: 60 } ] }, { label: 'স১৩: Page in draft namespace or userspace AfC submission, stale by over 6 months', value: 'afc', tooltip: 'Any rejected or unsubmitted AfC submission in userspace or any non-redirect page in draft namespace, that has not been edited for more than 6 months. Blank drafts in either namespace are also included.', hideWhenRedirect: true, showInNamespaces: [2, 118] // user, draft namespaces only }, ]; Twinkle.speedy.redirectList = [ { label: 'প২: বিষয়শ্রেণী:, টেমপ্লেট:, উইকিবই:, সাহায্য: এবং প্রবেশদ্বার নামস্থান ব্যতীত প্রধান নামস্থান থেকে অন্য নামস্থান পুনঃনির্দেশ', value: 'rediruser', tooltip: 'This does not include the pseudo-namespace shortcuts. If this was the result of a page move, consider waiting a day or two before deleting the redirect', showInNamespaces: [ 0 ] }, { label: 'প৩: এমন একটি অভাবনীয় টাইপোর ফলে তৈরি পুনঃনির্দেশ যা সম্প্রতি তৈরি করা হয়েছিল', value: 'redirtypo', tooltip: 'However, redirects from common misspellings or misnomers are generally useful, as are redirects in other languages' }, { label: 'স৮: বিদ্যমান নেই এমন লক্ষ্যে পুনর্নির্দেশ', value: 'redirnone', tooltip: 'This excludes any page that is useful to the project, and in particular: deletion discussions that are not logged elsewhere, user and user talk pages, talk page archives, plausible redirects that can be changed to valid targets, and file pages or talk pages for files that exist on Wikimedia Commons.', hideWhenMultiple: true } ]; Twinkle.speedy.normalizeHash = { reason: 'db', nonsense: 'g1', test: 'g2', vandalism: 'g3', hoax: 'g3', repost: 'g4', banned: 'g5', move: 'g6', xfd: 'g6', movedab: 'g6', copypaste: 'g6', g6: 'g6', author: 'g7', g8: 'g8', talk: 'g8', subpage: 'g8', redirnone: 'g8', templatecat: 'g8', imagepage: 'g8', attack: 'g10', negublp: 'g10', spam: 'g11', spamuser: 'g11', copyvio: 'g12', afc: 'g13', disambig: 'g14', nocontext: 'a1', foreign: 'a2', nocontent: 'a3', transwiki: 'a5', a7: 'a7', person: 'a7', corp: 'a7', web: 'a7', band: 'a7', club: 'a7', animal: 'a7', event: 'a7', a9: 'a9', a10: 'a10', madeup: 'a11', rediruser: 'r2', redirtypo: 'r3', redircom: 'r4', redundantimage: 'f1', noimage: 'f2', fpcfail: 'f2', noncom: 'f3', unksource: 'f4', unfree: 'f5', f5: 'f5', norat: 'f6', badfairuse: 'f7', commons: 'f8', imgcopyvio: 'f9', badfiletype: 'f10', nopermission: 'f11', catempty: 'c1', userreq: 'u1', nouser: 'u2', notwebhost: 'u5', p1: 'p1', emptyportal: 'p2' }; Twinkle.speedy.callbacks = { getTemplateCodeAndParams: function(params) { var code, parameters, i; if (params.normalizeds.length > 1) { code = '{{db-multiple'; params.utparams = {}; $.each(params.normalizeds, function(index, norm) { code += '|' + norm.toUpperCase(); parameters = params.templateParams[index] || []; for (var i in parameters) { if (typeof parameters[i] === 'string' && !parseInt(i, 10)) { // skip numeric parameters - {{db-multiple}} doesn't understand them code += '|' + i + '=' + parameters[i]; } } $.extend(params.utparams, Twinkle.speedy.getUserTalkParameters(norm, parameters)); }); code += '}}'; } else { parameters = params.templateParams[0] || []; code = '{{db-' + params.values[0]; for (i in parameters) { if (typeof parameters[i] === 'string') { code += '|' + i + '=' + parameters[i]; } } if (params.usertalk) { code += '|help=off'; } code += '}}'; params.utparams = Twinkle.speedy.getUserTalkParameters(params.normalizeds[0], parameters); } return [code, params.utparams]; }, parseWikitext: function(wikitext, callback) { var query = { action: 'parse', prop: 'text', pst: 'true', text: wikitext, contentmodel: 'wikitext', title: mw.config.get('wgPageName'), disablelimitreport: true, format: 'json' }; var statusIndicator = new Morebits.status('অপসারণ সারাংশ তৈরি করা হচ্ছে'); var api = new Morebits.wiki.api('Parsing deletion template', query, function(apiobj) { var reason = decodeURIComponent($(apiobj.getResponse().parse.text).find('#delete-reason').text()).replace(/\+/g, ' '); if (!reason) { statusIndicator.warn('অপসারণ টেমপ্লেট থেকে সারাংশ তৈরি করা যায়নি'); } else { statusIndicator.info('সম্পন্ন'); } callback(reason); }, statusIndicator); api.post(); }, noteToCreator: function(pageobj) { var params = pageobj.getCallbackParameters(); var initialContrib = pageobj.getCreator(); // disallow notifying yourself if (initialContrib === mw.config.get('wgUserName')) { Morebits.status.warn('আপনি (' + initialContrib + ') এই পাতাটি তৈরি করেছেন তাই বিজ্ঞপ্তি পাঠানো হচ্ছে না'); initialContrib = null; // don't notify users when their user talk page is nominated/deleted } else if (initialContrib === mw.config.get('wgTitle') && mw.config.get('wgNamespaceNumber') === 3) { Morebits.status.warn('প্রাথমিক অবদানকারীকে অবহিতকরণ: এই ব্যবহারকারী তার নিজস্ব ব্যবহারকারী আলাপ পাতা তৈরি করেছেন, তাই বিজ্ঞপ্তি এড়িয়ে যাওয়া হচ্ছে'); initialContrib = null; // quick hack to prevent excessive unwanted notifications, per request. Should actually be configurable on recipient page... } else if ((initialContrib === 'RagibBot') && params.normalizeds[0] === 'f2') { Morebits.status.warn('মূল অবদানকারীকে জানানো হচ্ছে: page created procedurally by bot; skipping notification'); initialContrib = null; // Check for already existing tags } else if (Twinkle.speedy.hasCSD && params.warnUser && !confirm('পাতাটিতে একটি অপসারণ সম্পর্কিত ট্যাগ রয়েছে এবং প্রণেতাকে সম্ভবত অবহিত করা হয়েছে৷ আপনি কি এই মুছে ফেলার জন্য তাকে জানাতে চান?')) { Morebits.status.info('মূল অবদানকারীকে জানানো হচ্ছে', 'canceled by user; skipping notification.'); initialContrib = null; } if (initialContrib) { var usertalkpage = new Morebits.wiki.page('User talk:' + initialContrib, 'মূল অবদানকারীকে জানানো হচ্ছে (' + initialContrib + ')'), notifytext, i, editsummary; // special cases: "db" and "db-multiple" if (params.normalizeds.length > 1) { notifytext = '\n{{subst:db-' + (params.warnUser ? 'deleted' : 'notice') + '-multiple|1=' + Morebits.pageNameNorm; var count = 2; $.each(params.normalizeds, function(index, norm) { notifytext += '|' + count++ + '=' + norm.toUpperCase(); }); } else if (params.normalizeds[0] === 'db') { notifytext = '\n{{subst:db-reason-' + (params.warnUser ? 'deleted' : 'notice') + '|1=' + Morebits.pageNameNorm; } else { notifytext = '\n{{subst:db-csd-' + (params.warnUser ? 'deleted' : 'notice') + '-custom|1='; if (params.values[0] === 'copypaste') { notifytext += params.templateParams[0].sourcepage; } else { notifytext += Morebits.pageNameNorm; } notifytext += '|2=' + params.values[0]; } for (i in params.utparams) { if (typeof params.utparams[i] === 'string') { notifytext += '|' + i + '=' + params.utparams[i]; } } notifytext += (params.welcomeuser ? '' : '|nowelcome=yes') + '}} ~~~~'; editsummary = 'বিজ্ঞপ্তি:' + (params.warnUser ? '' : ' দ্রুত অপসারণ প্রস্তাবনা,'); if (params.normalizeds.indexOf('g10') === -1) { // no article name in summary for G10 taggings editsummary += ' [[:' + Morebits.pageNameNorm + ']]-এর'; } else { editsummary += ' একটি আক্রমণাত্বক পাতার'; } usertalkpage.setAppendText(notifytext); usertalkpage.setEditSummary(editsummary); usertalkpage.setChangeTags(Twinkle.changeTags); usertalkpage.setCreateOption('recreate'); usertalkpage.setWatchlist(Twinkle.getPref('watchSpeedyUser')); usertalkpage.setFollowRedirect(true, false); usertalkpage.append(function onNotifySuccess() { // add this nomination to the user's userspace log, if the user has enabled it if (params.lognomination) { Twinkle.speedy.callbacks.user.addToLog(params, initialContrib); } }, function onNotifyError() { // if user could not be notified, log nomination without mentioning that notification was sent if (params.lognomination) { Twinkle.speedy.callbacks.user.addToLog(params, null); } }); } else if (params.lognomination) { // log nomination even if the user notification wasn't sent Twinkle.speedy.callbacks.user.addToLog(params, null); } }, sysop: { main: function(params) { var reason; if (!params.normalizeds.length && params.normalizeds[0] === 'db') { reason = prompt('Enter the deletion summary to use, which will be entered into the deletion log:', ''); Twinkle.speedy.callbacks.sysop.deletePage(reason, params); } else { var code = Twinkle.speedy.callbacks.getTemplateCodeAndParams(params)[0]; Twinkle.speedy.callbacks.parseWikitext(code, function(reason) { if (params.promptForSummary) { reason = prompt('Enter the deletion summary to use, or press OK to accept the automatically generated one.', reason); } Twinkle.speedy.callbacks.sysop.deletePage(reason, params); }); } }, deletePage: function(reason, params) { var thispage = new Morebits.wiki.page(mw.config.get('wgPageName'), 'Deleting page'); if (reason === null) { return Morebits.status.error('Asking for reason', 'User cancelled'); } else if (!reason || !reason.replace(/^\s*/, '').replace(/\s*$/, '')) { return Morebits.status.error('Asking for reason', "you didn't give one. I don't know... what with admins and their apathetic antics... I give up..."); } var deleteMain = function(callback) { thispage.setEditSummary(reason); thispage.setChangeTags(Twinkle.changeTags); thispage.setWatchlist(params.watch); thispage.deletePage(function() { thispage.getStatusElement().info('done'); typeof callback === 'function' && callback(); Twinkle.speedy.callbacks.sysop.deleteTalk(params); }); }; // look up initial contributor. If prompting user for deletion reason, just display a link. // Otherwise open the talk page directly if (params.warnUser) { thispage.setCallbackParameters(params); thispage.lookupCreation(function(pageobj) { deleteMain(function() { Twinkle.speedy.callbacks.noteToCreator(pageobj); }); }); } else { deleteMain(); } }, deleteTalk: function(params) { // delete talk page if (params.deleteTalkPage && params.normalized !== 'f8' && !document.getElementById('ca-talk').classList.contains('new')) { var talkpage = new Morebits.wiki.page(mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceNumber') + 1] + ':' + mw.config.get('wgTitle'), 'Deleting talk page'); talkpage.setEditSummary('[[WP:CSD#G8|G8]]: Talk page of deleted page "' + Morebits.pageNameNorm + '"'); talkpage.setChangeTags(Twinkle.changeTags); talkpage.deletePage(); // this is ugly, but because of the architecture of wiki.api, it is needed // (otherwise success/failure messages for the previous action would be suppressed) window.setTimeout(function() { Twinkle.speedy.callbacks.sysop.deleteRedirects(params); }, 1800); } else { Twinkle.speedy.callbacks.sysop.deleteRedirects(params); } }, deleteRedirects: function(params) { // delete redirects if (params.deleteRedirects) { var query = { action: 'query', titles: mw.config.get('wgPageName'), prop: 'redirects', rdlimit: 'max', // 500 is max for normal users, 5000 for bots and sysops format: 'json' }; var wikipedia_api = new Morebits.wiki.api('getting list of redirects...', query, Twinkle.speedy.callbacks.sysop.deleteRedirectsMain, new Morebits.status('Deleting redirects')); wikipedia_api.params = params; wikipedia_api.post(); } // promote Unlink tool var $link, $bigtext; if (mw.config.get('wgNamespaceNumber') === 6 && params.normalized !== 'f8') { $link = $('<a/>', { href: '#', text: 'click here to go to the Unlink tool', css: { fontSize: '130%', fontWeight: 'bold' }, click: function() { Morebits.wiki.actionCompleted.redirect = null; Twinkle.speedy.dialog.close(); Twinkle.unlink.callback('Removing usages of and/or links to deleted file ' + Morebits.pageNameNorm); } }); $bigtext = $('<span/>', { text: 'To orphan backlinks and remove instances of file usage', css: { fontSize: '130%', fontWeight: 'bold' } }); Morebits.status.info($bigtext[0], $link[0]); } else if (params.normalized !== 'f8') { $link = $('<a/>', { href: '#', text: 'click here to go to the Unlink tool', css: { fontSize: '130%', fontWeight: 'bold' }, click: function() { Morebits.wiki.actionCompleted.redirect = null; Twinkle.speedy.dialog.close(); Twinkle.unlink.callback('Removing links to deleted page ' + Morebits.pageNameNorm); } }); $bigtext = $('<span/>', { text: 'To orphan backlinks', css: { fontSize: '130%', fontWeight: 'bold' } }); Morebits.status.info($bigtext[0], $link[0]); } }, deleteRedirectsMain: function(apiobj) { var response = apiobj.getResponse(); var snapshot = response.query.pages[0].redirects || []; var total = snapshot.length; var statusIndicator = apiobj.statelem; if (!total) { statusIndicator.status('no redirects found'); return; } statusIndicator.status('0%'); var current = 0; var onsuccess = function(apiobjInner) { var now = parseInt(100 * ++current / total, 10) + '%'; statusIndicator.update(now); apiobjInner.statelem.unlink(); if (current >= total) { statusIndicator.info(now + ' (completed)'); Morebits.wiki.removeCheckpoint(); } }; Morebits.wiki.addCheckpoint(); snapshot.forEach(function(value) { var title = value.title; var page = new Morebits.wiki.page(title, 'Deleting redirect "' + title + '"'); page.setEditSummary('[[WP:CSD#G8|G8]]: Redirect to deleted page "' + Morebits.pageNameNorm + '"'); page.setChangeTags(Twinkle.changeTags); page.deletePage(onsuccess); }); } }, user: { main: function(pageobj) { var statelem = pageobj.getStatusElement(); if (!pageobj.exists()) { statelem.error("It seems that the page doesn't exist; perhaps it has already been deleted"); return; } var params = pageobj.getCallbackParameters(); // given the params, builds the template and also adds the user talk page parameters to the params that were passed in // returns => [<string> wikitext, <object> utparams] var buildData = Twinkle.speedy.callbacks.getTemplateCodeAndParams(params), code = buildData[0]; params.utparams = buildData[1]; // Set the correct value for |ts= parameter in {{db-g13}} if (params.normalizeds.indexOf('g13') !== -1) { code = code.replace('$TIMESTAMP', pageobj.getLastEditTime()); } // Tag if possible, post on talk if not if (pageobj.canEdit() && ['wikitext', 'Scribunto', 'javascript', 'css', 'sanitized-css'].indexOf(pageobj.getContentModel()) !== -1) { var text = pageobj.getPageText(); statelem.status('Checking for tags on the page...'); // check for existing deletion tags var tag = /(?:\{\{\s*(db|delete|db-.*?|speedy deletion-.*?)(?:\s*\||\s*\}\}))/.exec(text); // This won't make use of the db-multiple template but it probably should if (tag && !confirm('The page already has the CSD-related template {{' + tag[1] + '}} on it. Do you want to add another CSD template?')) { return; } var xfd = /\{\{((?:article for deletion|proposed deletion|prod blp|template for discussion)\/dated|[cfm]fd\b)/i.exec(text) || /#invoke:(RfD)/.exec(text); if (xfd && !confirm('The deletion-related template {{' + xfd[1] + '}} was found on the page. Do you still want to add a CSD template?')) { return; } // curate/patrol the page if (Twinkle.getPref('markSpeedyPagesAsPatrolled')) { pageobj.triage = function() {this.patrol(); }; } // Wrap SD template in noinclude tags if we are in template space. // Won't work with userboxes in userspace, or any other transcluded page outside template space if (mw.config.get('wgNamespaceNumber') === 10) { // Template: code = '<noinclude>' + code + '</noinclude>'; } // Remove tags that become superfluous with this action text = text.replace(/\{\{\s*([Uu]serspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/g, ''); if (mw.config.get('wgNamespaceNumber') === 6) { // remove "move to Commons" tag - deletion-tagged files cannot be moved to Commons text = text.replace(/\{\{(mtc|(copy |move )?to ?commons|move to wikimedia commons|copy to wikimedia commons)[^}]*\}\}/gi, ''); } if (params.requestsalt) { if (params.normalizeds.indexOf('g10') === -1) { code += '\n{{salt}}'; } else { code = '{{salt}}\n' + code; } } if (mw.config.get('wgPageContentModel') === 'Scribunto') { // Scribunto isn't parsed like wikitext, so CSD templates on modules need special handling to work var equals = ''; while (code.indexOf(']' + equals + ']') !== -1) { equals += '='; } code = "require('Module:Module wikitext')._addText([" + equals + '[' + code + ']' + equals + ']);'; } else if (['javascript', 'css', 'sanitized-css'].indexOf(mw.config.get('wgPageContentModel')) !== -1) { // Likewise for JS/CSS pages code = '/* ' + code + ' */'; } // Generate edit summary for edit var editsummary; if (params.normalizeds.length > 1) { editsummary = 'দ্রুত অপসারণ প্রস্তাবনা ('; $.each(params.normalizeds, function(index, norm) { editsummary += '[[WP:CSD#' + norm.toUpperCase() + '|CSD ' + norm.toUpperCase() + ']], '; }); editsummary = editsummary.substr(0, editsummary.length - 2); // remove trailing comma editsummary += ').'; } else if (params.normalizeds[0] === 'db') { editsummary = 'Requesting [[WP:CSD|speedy deletion]] with rationale "' + params.templateParams[0]['1'] + '".'; } else { editsummary = 'দ্রুত অপসারণ প্রস্তাবনা ([[WP:CSD#' + params.normalizeds[0].toUpperCase() + '|সিএসডি ' + params.normalizeds[0].toUpperCase() + ']])।'; } // Blank attack pages if (params.normalizeds.indexOf('g10') !== -1) { text = code; } else { // Insert tag after short description or any hatnotes var wikipage = new Morebits.wikitext.page(text); text = wikipage.insertAfterTemplates(code + '\n', Twinkle.hatnoteRegex).getText(); } pageobj.setPageText(text); pageobj.setEditSummary(editsummary); pageobj.setWatchlist(params.watch); pageobj.save(Twinkle.speedy.callbacks.user.tagComplete); } else { // Attempt to place on talk page var talkName = new mw.Title(pageobj.getPageName()).getTalkPage().toText(); if (talkName !== pageobj.getPageName()) { if (params.requestsalt) { code += '\n{{salt}}'; } pageobj.getStatusElement().warn('Unable to edit page, placing tag on talk page'); var talk_page = new Morebits.wiki.page(talkName, 'Automatically placing tag on talk page'); talk_page.setNewSectionTitle(pageobj.getPageName() + ' nominated for CSD, request deletion'); talk_page.setNewSectionText(code + '\n\nআমি ' + pageobj.getPageName() + ' পাতাটি ট্যাগ করতে পারছি না, অনুগ্ৰহ করে এটি অপসারণ করুন। ~~~~'); talk_page.setCreateOption('recreate'); talk_page.setFollowRedirect(true); talk_page.setWatchlist(params.watch); talk_page.setChangeTags(Twinkle.changeTags); talk_page.setCallbackParameters(params); talk_page.newSection(Twinkle.speedy.callbacks.user.tagComplete); } else { pageobj.getStatusElement().error('Page protected and nowhere to add an edit request, aborting'); } } }, tagComplete: function(pageobj) { var params = pageobj.getCallbackParameters(); // Notification to first contributor, will also log nomination to the user's userspace log if (params.usertalk) { var thispage = new Morebits.wiki.page(Morebits.pageNameNorm); thispage.setCallbackParameters(params); thispage.lookupCreation(Twinkle.speedy.callbacks.noteToCreator); // or, if not notifying, add this nomination to the user's userspace log without the initial contributor's name } else if (params.lognomination) { Twinkle.speedy.callbacks.user.addToLog(params, null); } }, addToLog: function(params, initialContrib) { var usl = new Morebits.userspaceLogger(Twinkle.getPref('speedyLogPageName')); usl.initialText = "এই সব [[WP:CSD|দ্রুত অপসারণের]] মনোনয়নের লগ যা [[WP:TW|টুইংকলের]] CSD মডিউল ব্যবহার করে এই ব্যবহারকারী তৈরি করেছেন।\n\n" + 'আপনি যদি আর এই লগ রাখতে না চান, তাহলে আপনি [[উইকিপিডিয়া:টুইংকল/পছন্দসমূহ|পছন্দসমূহ প্যানেল]] ব্যবহার করে এটি বন্ধ করতে পারেন, এবং ' + '[[WP:CSD#U1|সিএসডি ব১]]-এর অধীনে এই পাতাটি দ্রুত অপসারণের জন্য মনোনয়ন করতে পারেন।' + (Morebits.userIsSysop ? '\n\nThis log does not track outright speedy deletions made using Twinkle.' : ''); var formatParamLog = function(normalize, csdparam, input) { if ((normalize === 'G4' && csdparam === 'xfd') || (normalize === 'G6' && csdparam === 'page') || (normalize === 'G6' && csdparam === 'fullvotepage') || (normalize === 'G6' && csdparam === 'sourcepage') || (normalize === 'A2' && csdparam === 'source') || (normalize === 'A10' && csdparam === 'article') || (normalize === 'F1' && csdparam === 'filename')) { input = '[[:' + input + ']]'; } else if (normalize === 'G5' && csdparam === 'user') { input = '[[:User:' + input + ']]'; } else if (normalize === 'G12' && csdparam.lastIndexOf('url', 0) === 0 && input.lastIndexOf('http', 0) === 0) { input = '[' + input + ' ' + input + ']'; } else if (normalize === 'F8' && csdparam === 'filename') { input = '[[commons:' + input + ']]'; } else if (normalize === 'P1' && csdparam === 'criterion') { input = '[[WP:CSD#' + input + ']]'; } return ' {' + normalize + ' ' + csdparam + ': ' + input + '}'; }; var extraInfo = ''; // If a logged file is deleted but exists on commons, the wikilink will be blue, so provide a link to the log var fileLogLink = mw.config.get('wgNamespaceNumber') === 6 ? ' ([{{fullurl:Special:Log|page=' + mw.util.wikiUrlencode(mw.config.get('wgPageName')) + '}} log])' : ''; var editsummary = 'দ্রুত অপসারণের মনোনয়ন তালিকাভুক্ত করা হচ্ছে,'; var appendText = '# [[:' + Morebits.pageNameNorm; if (params.normalizeds.indexOf('g10') === -1) { // no article name in log for G10 taggings appendText += ']]' + fileLogLink + ': '; editsummary += ' [[:' + Morebits.pageNameNorm + ']]।'; } else { appendText += '|এটা]] attack page' + fileLogLink + ': '; editsummary += ' of an attack page.'; } if (params.normalizeds.length > 1) { appendText += 'multiple criteria ('; $.each(params.normalizeds, function(index, norm) { appendText += '[[WP:CSD#' + norm.toUpperCase() + '|' + norm.toUpperCase() + ']], '; }); appendText = appendText.substr(0, appendText.length - 2); // remove trailing comma appendText += ')'; } else if (params.normalizeds[0] === 'db') { appendText += '{{tl|db-reason}}'; } else { appendText += '[[WP:CSD#' + params.normalizeds[0].toUpperCase() + '|CSD ' + params.normalizeds[0].toUpperCase() + ']] ({{tl|db-' + params.values[0] + '}})'; } // If params is "empty" it will still be full of empty arrays, but ask anyway if (params.templateParams) { // Treat custom rationale individually if (params.normalizeds[0] && params.normalizeds[0] === 'db') { extraInfo += formatParamLog('Custom', 'rationale', params.templateParams[0]['1']); } else { params.templateParams.forEach(function(item, index) { var keys = Object.keys(item); if (keys[0] !== undefined && keys[0].length > 0) { // Second loop required since some items (G12, F9) may have multiple keys keys.forEach(function(key, keyIndex) { if (keys[keyIndex] === 'blanked' || keys[keyIndex] === 'ts') { return true; // Not worth logging } extraInfo += formatParamLog(params.normalizeds[index].toUpperCase(), keys[keyIndex], item[key]); }); } }); } } if (params.requestsalt) { appendText += '; requested creation protection ([[WP:SALT|salting]])'; } if (extraInfo) { appendText += '; additional information:' + extraInfo; } if (initialContrib) { appendText += '; notified {{user|1=' + initialContrib + '}}'; } appendText += ' ~~~~~\n'; usl.changeTags = Twinkle.changeTags; usl.log(appendText, editsummary); } } }; // validate subgroups in the form passed into the speedy deletion tag Twinkle.speedy.getParameters = function twinklespeedyGetParameters(form, values) { var parameters = []; $.each(values, function(index, value) { var currentParams = []; switch (value) { case 'reason': if (form['csd.reason_1']) { var dbrationale = form['csd.reason_1'].value; if (!dbrationale || !dbrationale.trim()) { alert('Custom rationale: Please specify a rationale.'); parameters = null; return false; } currentParams['1'] = dbrationale; } break; case 'userreq': // U1 if (form['csd.userreq_rationale']) { var u1rationale = form['csd.userreq_rationale'].value; if (mw.config.get('wgNamespaceNumber') === 3 && !(/\//).test(mw.config.get('wgTitle')) && (!u1rationale || !u1rationale.trim())) { alert('CSD U1: Please specify a rationale when nominating user talk pages.'); parameters = null; return false; } currentParams.rationale = u1rationale; } break; case 'repost': // G4 if (form['csd.repost_xfd']) { var deldisc = form['csd.repost_xfd'].value; if (deldisc) { if (!new RegExp('^:?' + Morebits.namespaceRegex(4) + ':', 'i').test(deldisc)) { alert('CSD G4: The deletion discussion page name, if provided, must start with "Wikipedia:".'); parameters = null; return false; } currentParams.xfd = deldisc; } } break; case 'banned': // G5 if (form['csd.banned_user'] && form['csd.banned_user'].value) { currentParams.user = form['csd.banned_user'].value.replace(/^\s*User:/i, ''); } break; case 'move': // G6 if (form['csd.move_page'] && form['csd.move_reason']) { var movepage = form['csd.move_page'].value, movereason = form['csd.move_reason'].value; if (!movepage || !movepage.trim()) { alert('CSD G6 (move): Please specify the page to be moved here.'); parameters = null; return false; } if (!movereason || !movereason.trim()) { alert('CSD G6 (move): Please specify the reason for the move.'); parameters = null; return false; } currentParams.page = movepage; currentParams.reason = movereason; } break; case 'xfd': // G6 if (form['csd.xfd_fullvotepage']) { var xfd = form['csd.xfd_fullvotepage'].value; if (xfd) { if (!new RegExp('^:?' + Morebits.namespaceRegex(4) + ':', 'i').test(xfd)) { alert('CSD G6 (XFD): The deletion discussion page name, if provided, must start with "Wikipedia:".'); parameters = null; return false; } currentParams.fullvotepage = xfd; } } break; case 'copypaste': // G6 if (form['csd.copypaste_sourcepage']) { var copypaste = form['csd.copypaste_sourcepage'].value; if (!copypaste || !copypaste.trim()) { alert('CSD G6 (copypaste): Please specify the source page name.'); parameters = null; return false; } currentParams.sourcepage = copypaste; } break; case 'g6': // G6 if (form['csd.g6_rationale'] && form['csd.g6_rationale'].value) { currentParams.rationale = form['csd.g6_rationale'].value; } break; case 'author': // G7 if (form['csd.author_rationale'] && form['csd.author_rationale'].value) { currentParams.rationale = form['csd.author_rationale'].value; } break; case 'g8': // G8 if (form['csd.g8_rationale'] && form['csd.g8_rationale'].value) { currentParams.rationale = form['csd.g8_rationale'].value; } break; case 'templatecat': // G8 if (form['csd.templatecat_rationale'] && form['csd.templatecat_rationale'].value) { currentParams.rationale = form['csd.templatecat_rationale'].value; } break; case 'attack': // G10 currentParams.blanked = 'yes'; // it is actually blanked elsewhere in code, but setting the flag here break; case 'copyvio': // G12 if (form['csd.copyvio_url'] && form['csd.copyvio_url'].value) { currentParams.url = form['csd.copyvio_url'].value; } if (form['csd.copyvio_url2'] && form['csd.copyvio_url2'].value) { currentParams.url2 = form['csd.copyvio_url2'].value; } if (form['csd.copyvio_url3'] && form['csd.copyvio_url3'].value) { currentParams.url3 = form['csd.copyvio_url3'].value; } break; case 'afc': // G13 currentParams.ts = '$TIMESTAMP'; // to be replaced by the last revision timestamp when page is saved break; case 'redundantimage': // F1 if (form['csd.redundantimage_filename']) { var redimage = form['csd.redundantimage_filename'].value; if (!redimage || !redimage.trim()) { alert('CSD F1: Please specify the filename of the other file.'); parameters = null; return false; } currentParams.filename = new RegExp('^\\s*' + Morebits.namespaceRegex(6) + ':', 'i').test(redimage) ? redimage : 'File:' + redimage; } break; case 'badfairuse': // F7 if (form['csd.badfairuse_rationale'] && form['csd.badfairuse_rationale'].value) { currentParams.rationale = form['csd.badfairuse_rationale'].value; } break; case 'commons': // F8 if (form['csd.commons_filename']) { var filename = form['csd.commons_filename'].value; if (filename && filename.trim() && filename !== Morebits.pageNameNorm) { currentParams.filename = new RegExp('^\\s*' + Morebits.namespaceRegex(6) + ':', 'i').test(filename) ? filename : 'File:' + filename; } } break; case 'imgcopyvio': // F9 if (form['csd.imgcopyvio_url'] && form['csd.imgcopyvio_rationale']) { var f9url = form['csd.imgcopyvio_url'].value; var f9rationale = form['csd.imgcopyvio_rationale'].value; if ((!f9url || !f9url.trim()) && (!f9rationale || !f9rationale.trim())) { alert('CSD F9: You must enter a url or reason (or both) when nominating a file under F9.'); parameters = null; return false; } if (form['csd.imgcopyvio_url'].value) { currentParams.url = f9url; } if (form['csd.imgcopyvio_rationale'].value) { currentParams.rationale = f9rationale; } } break; case 'foreign': // A2 if (form['csd.foreign_source']) { var foreignlink = form['csd.foreign_source'].value; if (!foreignlink || !foreignlink.trim()) { alert('CSD A2: Please specify an interwiki link to the article of which this is a copy.'); parameters = null; return false; } currentParams.source = foreignlink; } break; case 'transwiki': // A5 if (form['csd.transwiki_location'] && form['csd.transwiki_location'].value) { currentParams.location = form['csd.transwiki_location'].value; } break; case 'a10': // A10 if (form['csd.a10_article']) { var duptitle = form['csd.a10_article'].value; if (!duptitle || !duptitle.trim()) { alert('CSD A10: Please specify the name of the article which is duplicated.'); parameters = null; return false; } currentParams.article = duptitle; } break; case 'p1': // P1 if (form['csd.p1_criterion']) { var criterion = form['csd.p1_criterion'].value; if (!criterion || !criterion.trim()) { alert('CSD P1: Please specify a single criterion.'); parameters = null; return false; } currentParams.criterion = criterion; } break; default: break; } parameters.push(currentParams); }); return parameters; }; // Function for processing talk page notification template parameters // key1/value1: for {{db-criterion-[notice|deleted]}} (via {{db-csd-[notice|deleted]-custom}}) // utparams.param: for {{db-[notice|deleted]-multiple}} Twinkle.speedy.getUserTalkParameters = function twinklespeedyGetUserTalkParameters(normalized, parameters) { var utparams = []; // Special cases if (normalized === 'db') { utparams['2'] = parameters['1']; } else if (normalized === 'g6') { utparams.key1 = 'to'; utparams.value1 = Morebits.pageNameNorm; } else if (normalized === 'g12') { ['url', 'url2', 'url3'].forEach(function(item, idx) { if (parameters[item]) { idx++; utparams['key' + idx] = item; utparams['value' + idx] = utparams[item] = parameters[item]; } }); } else { // Handle the rest var param; switch (normalized) { case 'g4': param = 'xfd'; break; case 'a2': param = 'source'; break; case 'a5': param = 'location'; break; case 'a10': param = 'article'; break; case 'f9': param = 'url'; break; case 'p1': param = 'criterion'; break; default: break; } // No harm in providing a usertalk template with the others' parameters if (param && parameters[param]) { utparams.key1 = param; utparams.value1 = utparams[param] = parameters[param]; } } return utparams; }; /** * @param {Event} e * @returns {Array} */ Twinkle.speedy.resolveCsdValues = function twinklespeedyResolveCsdValues(e) { var values = (e.target.form ? e.target.form : e.target).getChecked('csd'); if (values.length === 0) { alert('দয়া করে একটি বিচারধারা বাছুন!'); return null; } return values; }; Twinkle.speedy.callback.evaluateSysop = function twinklespeedyCallbackEvaluateSysop(e) { var form = e.target.form ? e.target.form : e.target; if (e.target.type === 'checkbox' || e.target.type === 'text' || e.target.type === 'select') { return; } var tag_only = form.tag_only; if (tag_only && tag_only.checked) { Twinkle.speedy.callback.evaluateUser(e); return; } var values = Twinkle.speedy.resolveCsdValues(e); if (!values) { return; } var templateParams = Twinkle.speedy.getParameters(form, values); if (!templateParams) { return; } var normalizeds = values.map(function(value) { return Twinkle.speedy.normalizeHash[value]; }); // analyse each criterion to determine whether to watch the page, prompt for summary, or notify the creator var watchPage, promptForSummary; normalizeds.forEach(function(norm) { if (Twinkle.getPref('watchSpeedyPages').indexOf(norm) !== -1) { watchPage = Twinkle.getPref('watchSpeedyExpiry'); } if (Twinkle.getPref('promptForSpeedyDeletionSummary').indexOf(norm) !== -1) { promptForSummary = true; } }); var warnusertalk = form.warnusertalk.checked && normalizeds.some(function (norm, index) { return Twinkle.getPref('warnUserOnSpeedyDelete').indexOf(norm) !== -1 && !(norm === 'g6' && values[index] !== 'copypaste'); }); var welcomeuser = warnusertalk && normalizeds.some(function (norm) { return Twinkle.getPref('welcomeUserOnSpeedyDeletionNotification').indexOf(norm) !== -1; }); var params = { values: values, normalizeds: normalizeds, watch: watchPage, deleteTalkPage: form.talkpage && form.talkpage.checked, deleteRedirects: form.redirects.checked, warnUser: warnusertalk, welcomeuser: welcomeuser, promptForSummary: promptForSummary, templateParams: templateParams }; Morebits.simpleWindow.setButtonsEnabled(false); Morebits.status.init(form); Twinkle.speedy.callbacks.sysop.main(params); }; Twinkle.speedy.callback.evaluateUser = function twinklespeedyCallbackEvaluateUser(e) { var form = e.target.form ? e.target.form : e.target; if (e.target.type === 'checkbox' || e.target.type === 'text' || e.target.type === 'select') { return; } var values = Twinkle.speedy.resolveCsdValues(e); if (!values) { return; } var templateParams = Twinkle.speedy.getParameters(form, values); if (!templateParams) { return; } // var multiple = form.multiple.checked; var normalizeds = values.map(function(value) { return Twinkle.speedy.normalizeHash[value]; }); // analyse each criterion to determine whether to watch the page/notify the creator var watchPage = normalizeds.some(function(norm) { return Twinkle.getPref('watchSpeedyPages').indexOf(norm) !== -1 && Twinkle.getPref('watchSpeedyExpiry'); }); var notifyuser = form.notify.checked && normalizeds.some(function(norm, index) { return Twinkle.getPref('notifyUserOnSpeedyDeletionNomination').indexOf(norm) !== -1 && !(norm === 'g6' && values[index] !== 'copypaste'); }); var welcomeuser = notifyuser && normalizeds.some(function(norm) { return Twinkle.getPref('welcomeUserOnSpeedyDeletionNotification').indexOf(norm) !== -1; }); var csdlog = Twinkle.getPref('logSpeedyNominations') && normalizeds.some(function(norm) { return Twinkle.getPref('noLogOnSpeedyNomination').indexOf(norm) === -1; }); var params = { values: values, normalizeds: normalizeds, watch: watchPage, usertalk: notifyuser, welcomeuser: welcomeuser, lognomination: csdlog, requestsalt: form.salting.checked, templateParams: templateParams }; Morebits.simpleWindow.setButtonsEnabled(false); Morebits.status.init(form); Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName'); Morebits.wiki.actionCompleted.notice = 'ট্যাগ করা সম্পন্ন হয়েছে'; var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), 'পাতায় ট্যাগ যোগ করা হচ্ছে'); wikipedia_page.setChangeTags(Twinkle.changeTags); // Here to apply to triage wikipedia_page.setCallbackParameters(params); wikipedia_page.load(Twinkle.speedy.callbacks.user.main); }; Twinkle.addInitCallback(Twinkle.speedy, 'speedy'); })(jQuery); // </nowiki> 6htdux8tc4btj8epdj6yu03yva3wksx 46858 46855 2022-08-29T10:15:13Z Aishik Rehman 5249 javascript text/javascript // <nowiki> (function($) { /* **************************************** *** twinklespeedy.js: CSD module **************************************** * Mode of invocation: Tab ("দ্রুত অপসারণ প্রস্তাবনা") * Active on: Non-special, existing pages * * NOTE FOR DEVELOPERS: * If adding a new criterion, add it to the appropriate places at the top of * twinkleconfig.js. Also check out the default values of the CSD preferences * in twinkle.js, and add your new criterion to those if you think it would be * good. */ Twinkle.speedy = function twinklespeedy() { // Disable on: // * special pages // * non-existent pages if (mw.config.get('wgNamespaceNumber') < 0 || !mw.config.get('wgArticleId')) { return; } Twinkle.addPortletLink(Twinkle.speedy.callback, 'দ্রুত অপসারণ প্রস্তাবনা', 'tw-csd', Morebits.userIsSysop ? 'Delete page according to WP:CSD' : 'WP:CSD অনুযায়ী দ্রুত অপসারণের জন্য অনুরোধ'); }; // This function is run when the CSD tab/header link is clicked Twinkle.speedy.callback = function twinklespeedyCallback() { Twinkle.speedy.initDialog(Morebits.userIsSysop ? Twinkle.speedy.callback.evaluateSysop : Twinkle.speedy.callback.evaluateUser, true); }; // Used by unlink feature Twinkle.speedy.dialog = null; // Used throughout Twinkle.speedy.hasCSD = !!$('#delete-reason').length; // Prepares the speedy deletion dialog and displays it Twinkle.speedy.initDialog = function twinklespeedyInitDialog(callbackfunc) { var dialog; Twinkle.speedy.dialog = new Morebits.simpleWindow(Twinkle.getPref('speedyWindowWidth'), Twinkle.getPref('speedyWindowHeight')); dialog = Twinkle.speedy.dialog; dialog.setTitle('দ্রুত অপসারণের বিচারধারা নির্বাচন করুন'); dialog.setScriptName('টুইংকল'); dialog.addFooterLink('দ্রুত অপসারণ নীতিমালা', 'WP:CSD'); dialog.addFooterLink('পছন্দ', 'WP:TW/PREF#দ্রুত'); dialog.addFooterLink('টুইংকল সাহায্য', 'WP:TW/DOC#দ্রুত'); dialog.addFooterLink('প্রতিক্রিয়া জানান', 'WT:TW'); var form = new Morebits.quickForm(callbackfunc, Twinkle.getPref('speedySelectionStyle') === 'radioClick' ? 'change' : null); if (Morebits.userIsSysop) { form.append({ type: 'checkbox', list: [ { label: 'শুধুমাত্র ট্যাগ করা হবে, অপসারিত হবে না', value: 'tag_only', name: 'tag_only', tooltip: 'If you just want to tag the page, instead of deleting it now', checked: !(Twinkle.speedy.hasCSD || Twinkle.getPref('deleteSysopDefaultToDelete')), event: function(event) { var cForm = event.target.form; var cChecked = event.target.checked; // enable talk page checkbox if (cForm.talkpage) { cForm.talkpage.checked = !cChecked && Twinkle.getPref('deleteTalkPageOnDelete'); } // enable redirects checkbox cForm.redirects.checked = !cChecked; // enable delete multiple cForm.delmultiple.checked = false; // enable notify checkbox cForm.notify.checked = cChecked; // enable deletion notification checkbox cForm.warnusertalk.checked = !cChecked && !Twinkle.speedy.hasCSD; // enable multiple cForm.multiple.checked = false; // enable requesting creation protection cForm.salting.checked = false; Twinkle.speedy.callback.modeChanged(cForm); event.stopPropagation(); } } ] }); var deleteOptions = form.append({ type: 'div', name: 'delete_options' }); deleteOptions.append({ type: 'header', label: 'Delete-related options' }); if (mw.config.get('wgNamespaceNumber') % 2 === 0 && (mw.config.get('wgNamespaceNumber') !== 2 || (/\//).test(mw.config.get('wgTitle')))) { // hide option for user pages, to avoid accidentally deleting user talk page deleteOptions.append({ type: 'checkbox', list: [ { label: 'আলাপ পাতাও অপসারণ করুন', value: 'talkpage', name: 'talkpage', tooltip: "This option deletes the page's talk page in addition. If you choose the F8 (moved to Commons) criterion, this option is ignored and the talk page is *not* deleted.", checked: Twinkle.getPref('deleteTalkPageOnDelete'), event: function(event) { event.stopPropagation(); } } ] }); } deleteOptions.append({ type: 'checkbox', list: [ { label: 'সকল পুনর্নির্দেশও অপসারণ করুন', value: 'redirects', name: 'redirects', tooltip: 'This option deletes all incoming redirects in addition. Avoid this option for procedural (e.g. move/merge) deletions.', checked: Twinkle.getPref('deleteRedirectsOnDelete'), event: function (event) { event.stopPropagation(); } }, { label: 'একাধিক বিচারধারায় অপসারণ করুন', value: 'delmultiple', name: 'delmultiple', tooltip: 'When selected, you can select several criteria that apply to the page. For example, G11 and A7 are a common combination for articles.', event: function(event) { Twinkle.speedy.callback.modeChanged(event.target.form); event.stopPropagation(); } }, { label: 'পাতা তৈরিকারীকে অপসারণের বিজ্ঞপ্তি পাঠান', value: 'warnusertalk', name: 'warnusertalk', tooltip: 'A notification template will be placed on the talk page of the creator, IF you have a notification enabled in your Twinkle preferences ' + 'for the criterion you choose AND this box is checked. The creator may be welcomed as well.', checked: !Twinkle.speedy.hasCSD, event: function(event) { event.stopPropagation(); } } ] }); } var tagOptions = form.append({ type: 'div', name: 'tag_options' }); if (Morebits.userIsSysop) { tagOptions.append({ type: 'header', label: 'Tag-related options' }); } tagOptions.append({ type: 'checkbox', list: [ { label: 'যদি সম্ভব হয় তবে পাতা তৈরিকারীকে বিজ্ঞপ্তি পাঠান', value: 'notify', name: 'notify', tooltip: 'A notification template will be placed on the talk page of the creator, IF you have a notification enabled in your Twinkle preferences ' + 'for the criterion you choose AND this box is checked. The creator may be welcomed as well.', checked: !Morebits.userIsSysop || !(Twinkle.speedy.hasCSD || Twinkle.getPref('deleteSysopDefaultToDelete')), event: function(event) { event.stopPropagation(); } }, { label: 'একইসাথে পাতা তৈরি সুরক্ষার জন্যও ট্যাগ করুন', value: 'salting', name: 'salting', tooltip: 'When selected, the speedy deletion tag will be accompanied by a {{salt}} tag requesting that the deleting administrator apply creation protection. Only select if this page has been repeatedly recreated.', event: function(event) { event.stopPropagation(); } }, { label: 'একাধিক বিচারধারায় ট্যাগ করুন', value: 'multiple', name: 'multiple', tooltip: 'When selected, you can select several criteria that apply to the page. For example, G11 and A7 are a common combination for articles.', event: function(event) { Twinkle.speedy.callback.modeChanged(event.target.form); event.stopPropagation(); } } ] }); form.append({ type: 'div', id: 'prior-deletion-count', style: 'font-style: italic' }); form.append({ type: 'div', name: 'work_area', label: 'Failed to initialize the CSD module. Please try again, or tell the Twinkle developers about the issue.' }); if (Twinkle.getPref('speedySelectionStyle') !== 'radioClick') { form.append({ type: 'submit', className: 'tw-speedy-submit' }); // Renamed in modeChanged } var result = form.render(); dialog.setContent(result); dialog.display(); Twinkle.speedy.callback.modeChanged(result); // Check for prior deletions. Just once, upon init Twinkle.speedy.callback.priorDeletionCount(); }; Twinkle.speedy.callback.modeChanged = function twinklespeedyCallbackModeChanged(form) { var namespace = mw.config.get('wgNamespaceNumber'); // first figure out what mode we're in var mode = { isSysop: !!form.tag_only && !form.tag_only.checked, isMultiple: form.tag_only && !form.tag_only.checked ? form.delmultiple.checked : form.multiple.checked, isRadioClick: Twinkle.getPref('speedySelectionStyle') === 'radioClick' }; if (mode.isSysop) { $('[name=delete_options]').show(); $('[name=tag_options]').hide(); $('button.tw-speedy-submit').text('Delete page'); } else { $('[name=delete_options]').hide(); $('[name=tag_options]').show(); $('button.tw-speedy-submit').text('জমা দিন'); } var work_area = new Morebits.quickForm.element({ type: 'div', name: 'work_area' }); if (mode.isMultiple && mode.isRadioClick) { var evaluateType = mode.isSysop ? 'evaluateSysop' : 'evaluateUser'; work_area.append({ type: 'div', label: 'When finished choosing criteria, click:' }); work_area.append({ type: 'button', name: 'submit-multiple', label: mode.isSysop ? 'Delete page' : 'Tag page', event: function(event) { Twinkle.speedy.callback[evaluateType](event); event.stopPropagation(); } }); } var appendList = function(headerLabel, csdList) { work_area.append({ type: 'header', label: headerLabel }); work_area.append({ type: mode.isMultiple ? 'checkbox' : 'radio', name: 'csd', list: Twinkle.speedy.generateCsdList(csdList, mode) }); }; if (mode.isSysop && !mode.isMultiple) { appendList('Custom rationale', Twinkle.speedy.customRationale); } if (namespace % 2 === 1 && namespace !== 3) { // show db-talk on talk pages, but not user talk pages appendList('আলাপ পাতা', Twinkle.speedy.talkList); } if (!Morebits.isPageRedirect()) { switch (namespace) { case 0: // article case 1: // talk appendList('নিবন্ধ', Twinkle.speedy.articleList); break; case 2: // user case 3: // user talk appendList('ব্যবহারকারী পাতা', Twinkle.speedy.userList); break; case 6: // file case 7: // file talk appendList('Files', Twinkle.speedy.fileList); if (!mode.isSysop) { work_area.append({ type: 'div', label: 'Tagging for CSD F4 (no license), F5 (orphaned fair use), F6 (no fair use rationale), and F11 (no permission) can be done using Twinkle\'s "DI" tab.' }); } break; case 14: // category case 15: // category talk appendList('Categories', Twinkle.speedy.categoryList); break; case 100: // portal case 101: // portal talk appendList('Portals', Twinkle.speedy.portalList); break; default: break; } } else { if (namespace === 2 || namespace === 3) { appendList('ব্যবহারকারী পাতা', Twinkle.speedy.userList); } appendList('Redirects', Twinkle.speedy.redirectList); } var generalCriteria = Twinkle.speedy.generalList; // custom rationale lives under general criteria when tagging if (!mode.isSysop) { generalCriteria = Twinkle.speedy.customRationale.concat(generalCriteria); } appendList('সাধারণ বিচারধারা', generalCriteria); var old_area = Morebits.quickForm.getElements(form, 'work_area')[0]; form.replaceChild(work_area.render(), old_area); // if sysop, check if CSD is already on the page and fill in custom rationale if (mode.isSysop && Twinkle.speedy.hasCSD) { var customOption = $('input[name=csd][value=reason]')[0]; if (customOption) { if (Twinkle.getPref('speedySelectionStyle') !== 'radioClick') { // force listeners to re-init customOption.click(); customOption.parentNode.appendChild(customOption.subgroup); } customOption.subgroup.querySelector('input').value = decodeURIComponent($('#delete-reason').text()).replace(/\+/g, ' '); } } }; Twinkle.speedy.callback.priorDeletionCount = function () { var query = { action: 'query', format: 'json', list: 'logevents', letype: 'delete', leaction: 'delete/delete', // Just pure page deletion, no redirect overwrites or revdel letitle: mw.config.get('wgPageName'), leprop: '', // We're just counting we don't actually care about the entries lelimit: 5 // A little bit goes a long way }; new Morebits.wiki.api('Checking for past deletions', query, function(apiobj) { var response = apiobj.getResponse(); var delCount = response.query.logevents.length; if (delCount) { var message = delCount + ' বার অপসারণ করা হয়েছে'; if (delCount > 1) { message += 's'; if (response.continue) { message = 'More than ' + message; } // 3+ seems problematic if (delCount >= 3) { $('#prior-deletion-count').css('color', 'red'); } } // Provide a link to page logs (CSD templates have one for sysops) var link = Morebits.htmlNode('a', '(লগ)'); link.setAttribute('href', mw.util.getUrl('Special:Log', {page: mw.config.get('wgPageName')})); link.setAttribute('target', '_blank'); $('#prior-deletion-count').text(message + ' '); // Space before log link $('#prior-deletion-count').append(link); } }).post(); }; Twinkle.speedy.generateCsdList = function twinklespeedyGenerateCsdList(list, mode) { var pageNamespace = mw.config.get('wgNamespaceNumber'); var openSubgroupHandler = function(e) { $(e.target.form).find('input').prop('disabled', true); $(e.target.form).children().css('color', 'gray'); $(e.target).parent().css('color', 'black').find('input').prop('disabled', false); $(e.target).parent().find('input:text')[0].focus(); e.stopPropagation(); }; var submitSubgroupHandler = function(e) { var evaluateType = mode.isSysop ? 'evaluateSysop' : 'evaluateUser'; Twinkle.speedy.callback[evaluateType](e); e.stopPropagation(); }; return $.map(list, function(critElement) { var criterion = $.extend({}, critElement); if (mode.isMultiple) { if (criterion.hideWhenMultiple) { return null; } if (criterion.hideSubgroupWhenMultiple) { criterion.subgroup = null; } } else { if (criterion.hideWhenSingle) { return null; } if (criterion.hideSubgroupWhenSingle) { criterion.subgroup = null; } } if (mode.isSysop) { if (criterion.hideWhenSysop) { return null; } if (criterion.hideSubgroupWhenSysop) { criterion.subgroup = null; } } else { if (criterion.hideWhenUser) { return null; } if (criterion.hideSubgroupWhenUser) { criterion.subgroup = null; } } if (Morebits.isPageRedirect() && criterion.hideWhenRedirect) { return null; } if (criterion.showInNamespaces && criterion.showInNamespaces.indexOf(pageNamespace) < 0) { return null; } if (criterion.hideInNamespaces && criterion.hideInNamespaces.indexOf(pageNamespace) > -1) { return null; } if (criterion.subgroup && !mode.isMultiple && mode.isRadioClick) { if (Array.isArray(criterion.subgroup)) { criterion.subgroup = criterion.subgroup.concat({ type: 'button', name: 'submit', label: mode.isSysop ? 'Delete page' : 'Tag page', event: submitSubgroupHandler }); } else { criterion.subgroup = [ criterion.subgroup, { type: 'button', name: 'submit', // ends up being called "csd.submit" so this is OK label: mode.isSysop ? 'Delete page' : 'Tag page', event: submitSubgroupHandler } ]; } // FIXME: does this do anything? criterion.event = openSubgroupHandler; } return criterion; }); }; Twinkle.speedy.customRationale = [ { label: 'নিজস্ব যৌক্তিকতা' + (Morebits.userIsSysop ? ' (custom deletion reason)' : ' {{db}} টেমপ্লেট ব্যবহার করে'), value: 'reason', tooltip: '{{db}} is short for "delete because". At least one of the other deletion criteria must still apply to the page, and you must make mention of this in your rationale. This is not a "catch-all" for when you can\'t find any criteria that fit.', subgroup: { name: 'reason_1', type: 'input', label: 'Rationale:', size: 60 }, hideWhenMultiple: true } ]; Twinkle.speedy.talkList = [ { label: 'স৮: ইতিমধ্যেই অপসারিত বা অস্তিত্বহীন পাতার ওপর নির্ভরশীল পাতা বা আলাপ পাতা', value: 'talk', tooltip: 'পরবর্তীতে প্রয়োজন হতে পারে এমন পাতাগুলো এটির আওতাভুক্ত নয়, যেমন ব্যবহারকারী আলাপ পাতা, আলাপ পাতার আর্কাইভ, কমন্সে রয়েছে এমন ফাইলের আলাপ পাতা ইত্যাদি।' } ]; Twinkle.speedy.articleList = [ { label: 'নি১: নিবন্ধের বিষয়বস্তু যাচাই করার মতো যথেষ্ট পরিমাণ লেখা নেই।', value: 'nocontext', tooltip: 'Example: "He is a funny man with a red car. He makes people laugh." This applies only to very short articles. Context is different from content, treated in A3, below.' }, { label: 'নি২: বিদেশি ভাষার নিবন্ধ যা অন্য একটি উইকিমিডিয়া প্রকল্পে রয়েছে', value: 'foreign', tooltip: 'নিবন্ধটি বাংলা ভাষায় লিখিত নয়', subgroup: { name: 'foreign_source', type: 'input', label: 'Interwiki link to the article on the foreign-language wiki:', tooltip: 'For example, fr:Bonjour' } }, { label: 'নি৩: খালি নিবন্ধ বা কোনো তথ্য নেই', value: 'nocontent', tooltip: 'Any article consisting only of links elsewhere (including hyperlinks, category tags and "see also" sections), a rephrasing of the title, and/or attempts to correspond with the person or group named by its title. This does not include disambiguation pages' }, { label: 'নি৫: নিবন্ধ যা অন্য কোনো প্রকল্পের জন্য প্রযোজ্য বা স্থানান্তরিত', value: 'transwiki', tooltip: 'Any article that has been discussed at Articles for Deletion (et al), where the outcome was to transwiki, and where the transwikification has been properly performed and the author information recorded. Alternately, any article that consists of only a dictionary definition, where the transwikification has been properly performed and the author information recorded', subgroup: { name: 'transwiki_location', type: 'input', label: 'Link to where the page has been transwikied:', tooltip: 'For example, https://en.wiktionary.org/wiki/twinkle or [[wikt:twinkle]]' } }, ]; Twinkle.speedy.categoryList = [ { label: 'বি১: খালি বিষয়শ্রেণী', value: 'catempty', tooltip: 'Categories that have been unpopulated for at least seven days. This does not apply to categories being discussed at WP:CFD, disambiguation categories, and certain other exceptions. If the category isn\'t relatively new, it possibly contained articles earlier, and deeper investigation is needed' }, { label: 'স৮: অপসারিত বা নামান্তরিত টেমপ্লেট দ্বারা পপুলেটেড বিষয়শ্রেণী', value: 'templatecat', tooltip: 'This is for situations where a category is effectively empty, because the template(s) that formerly placed pages in that category are now deleted. This excludes categories that are still in use.', subgroup: { name: 'templatecat_rationale', type: 'input', label: 'Optional explanation:', size: 60 } }, { label: 'স৮: অস্তিত্ব নেই এমন লক্ষ্যে পুনর্নির্দেশিত', value: 'redirnone', tooltip: 'This excludes any page that is useful to the project, and in particular: deletion discussions that are not logged elsewhere, user and user talk pages, talk page archives, plausible redirects that can be changed to valid targets, and file pages or talk pages for files that exist on Wikimedia Commons.', hideWhenMultiple: true } ]; Twinkle.speedy.userList = [ { label: 'ব্য১: ব্যবহারকারীর অনুরোধে', value: 'userreq', tooltip: 'Personal subpages, upon request by their user. In some rare cases there may be administrative need to retain the page. Also, sometimes, main user pages may be deleted as well. See Wikipedia:User page for full instructions and guidelines', subgroup: mw.config.get('wgNamespaceNumber') === 3 && mw.config.get('wgTitle').indexOf('/') === -1 ? { name: 'userreq_rationale', type: 'input', label: 'কেন আলাপ পাতাটি অপসারিত হবে তার যৌক্তিক কারণ লিখুন (এটি বাধ্যতামূলক):', tooltip: 'User talk pages are deleted only in highly exceptional circumstances. See WP:DELTALK.', size: 60 } : null, hideSubgroupWhenMultiple: true }, { label: 'ব্য২: অস্তিত্বহীন ব্যবহারকারী', value: 'nouser', tooltip: 'User pages of users that do not exist (Check Special:Listusers)' }, { label: 'ব্য৩: অ-মুক্ত চিত্রশালা', value: 'gallery', tooltip: 'Galleries in the userspace which consist mostly of "fair use" or non-free files. Wikipedia\'s non-free content policy forbids users from displaying non-free files, even ones they have uploaded themselves, in userspace. It is acceptable to have free files, GFDL-files, Creative Commons and similar licenses along with public domain material, but not "fair use" files', hideWhenRedirect: true }, { label: 'ব্য৫: WP:NOTWEBHOST হিসেবে ব্যবহারকারী পাতার অনুপযুক্ত ব্যবহার', value: 'notwebhost', tooltip: 'এখানে উইকিপিডিয়ার লক্ষ্যগুলির সাথে ঘনিষ্ঠভাবে সম্পর্কিত নয় এমন রচনা, তথ্য, আলোচনা, ও/বা ক্রিয়াকলাপগুলি রয়েছে। ব্যবহারকারী, ব্যবহারকারী নামস্থানের বাইরে খুব কম বা কোনও সম্পাদনা করেনি।', hideWhenRedirect: true }, { label: 'স১১: প্রচারমূলক ব্যবহারকারী নামের অধীনে প্রচারমূলক ব্যবহারকারী পাতা', value: 'spamuser', tooltip: 'প্রচারমূলক ব্যবহারকারীর পৃষ্ঠা, ব্যবহারকারীর নাম দেখে মনে হচ্ছে ব্যবহারকারী কোন সত্তার সাথে সম্পর্কিত ও তা প্রচার করছে।', hideWhenMultiple: true, hideWhenRedirect: true }, /*{ label: 'G13: AfC draft submission or a blank draft, stale by over 6 months', value: 'afc', tooltip: 'Any rejected or unsubmitted AfC draft submission or a blank draft, that has not been edited in over 6 months (excluding bot edits).', hideWhenMultiple: true, hideWhenRedirect: true }*/ ]; Twinkle.speedy.portalList = [ { label: 'প্র১: প্রবেশদ্বার পাতা যা নিবন্ধ হিসেবে দ্রুত অপসারণের জন্য বিবেচ্য', value: 'p1', tooltip: 'You must specify a single article criterion that applies in this case (A1, A3, A7, or A10).', subgroup: { name: 'p1_criterion', type: 'input', label: 'Article criterion that would apply:' } }, { label: 'প্র২: পর্যাপ্ত নিবন্ধ বা বিষয়বস্তু নেই এমন বিষয়ের ওপর প্রণীত প্রবেশদ্বার পাতা', value: 'emptyportal', tooltip: 'Any Portal based on a topic for which there is not a non-stub header article, and at least three non-stub articles detailing subject matter that would be appropriate to discuss under the title of that Portal' } ]; Twinkle.speedy.generalList = [ { label: 'স১: অসংলগ্ন,অর্থহীন,অ-উল্লেখযোগ্য বা অবোধগম্য পাতা', value: 'nonsense', tooltip: 'This does not include poor writing, partisan screeds, obscene remarks, vandalism, fictional material, material not in English, poorly translated material, implausible theories, or hoaxes. In short, if you can understand it, G1 does not apply.', hideInNamespaces: [ 2 ] // Not applicable in userspace }, { label: 'স২: পরীক্ষামূলক পাতা', value: 'test', tooltip: 'A page created to test editing or other Wikipedia functions. Pages in the User namespace are not included, nor are valid but unused or duplicate templates.', hideInNamespaces: [ 2 ] // Not applicable in userspace }, { label: 'স৩: স্পষ্টত ধ্বংসপ্রবণতা', value: 'vandalism', tooltip: 'Plain pure vandalism (including redirects left behind from pagemove vandalism)' }, { label: 'স৩: ধোঁকাবাজি, চালাকি বা তামাসা', value: 'hoax', tooltip: 'Blatant and obvious hoax, to the point of vandalism', hideWhenMultiple: true }, { label: 'স৪: আলোচনার মাধ্যমে অপসারিত পাতা পুনঃতৈরি', value: 'repost', tooltip: 'A copy, by any title, of a page that was deleted via an XfD process or Deletion review, provided that the copy is substantially identical to the deleted version. This clause does not apply to content that has been "userfied", to content undeleted as a result of Deletion review, or if the prior deletions were proposed or speedy deletions, although in this last case, other speedy deletion criteria may still apply', subgroup: { name: 'repost_xfd', type: 'input', label: 'যে পাতায় অপসারণ আলোচনা সংঘটিত হয়েছে:', tooltip: 'Must start with "Wikipedia:"', size: 60 } }, { label: 'স৫: নিষিদ্ধ বা বাধাপ্রাপ্ত ব্যবহারকারীর তৈরি পাতা', value: 'banned', tooltip: 'Pages created by banned or blocked users in violation of their ban or block, and which have no substantial edits by others', subgroup: { name: 'banned_user', type: 'input', label: 'নিষিদ্ধ ব্যবহারকারী ব্যবহারকারী না (যদি পাওয়া যায়):', tooltip: 'Should not start with "User:"' } }, { label: 'স৬: স্থানান্তর', value: 'move', tooltip: 'Making way for an uncontroversial move like reversing a redirect', subgroup: [ { name: 'move_page', type: 'input', label: 'যে পাতা এখানে স্থানান্তর করা হবে:' }, { name: 'move_reason', type: 'input', label: 'Reason:', size: 60 } ], hideWhenMultiple: true }, { label: 'স৬: অপসারণ প্রস্তাবনা (এক্সএফডি)', value: 'xfd', tooltip: 'A deletion discussion (at AfD, FfD, RfD, TfD, CfD, or MfD) was closed as "delete", but the page wasn\'t actually deleted.', subgroup: { name: 'xfd_fullvotepage', type: 'input', label: 'যে পাতায় অপসারণ আলোচনা সংঘটিত হয়েছে:', tooltip: 'Must start with "Wikipedia:"', size: 40 }, hideWhenMultiple: true }, { label: 'স৬: অনুলিপি-প্রতিলিপি করে পাতা স্থানান্তর', value: 'copypaste', tooltip: 'This only applies for a copy-and-paste page move of another page that needs to be temporarily deleted to make room for a clean page move.', subgroup: { name: 'copypaste_sourcepage', type: 'input', label: 'যে পাতাটি থেকে এখানে অনুলিপি-প্রতিলিপি করা হয়েছে তার নাম:' }, hideWhenMultiple: true }, { label: 'স৬: গৃহস্থালি ও নিয়মমাফিক (অবিতর্কিত) পরিষ্করণ', value: 'g6', tooltip: 'Other routine maintenance tasks', subgroup: { name: 'g6_rationale', type: 'input', label: 'Rationale:', size: 60 } }, { label: 'স৭: প্রণেতার অপসারণ অনুরোধ, অথবা প্রণেতা পাতাটি খালি করেছেন', value: 'author', tooltip: 'Any page for which deletion is requested by the original author in good faith, provided the page\'s only substantial content was added by its author. If the author blanks the page, this can also be taken as a deletion request.', subgroup: { name: 'author_rationale', type: 'input', label: 'ঐচ্ছিক ব্যাখ্যা:', tooltip: 'Perhaps linking to where the author requested this deletion.', size: 60 }, hideSubgroupWhenSysop: true }, { label: 'স৮: অপসারিত পাতার উপর নির্ভরশীল পাতা', value: 'g8', tooltip: 'such as talk pages with no corresponding subject page; subpages with no parent page; file pages without a corresponding file; redirects to non-existent targets; or categories populated by deleted or retargeted templates. This excludes any page that is useful to the project, and in particular: deletion discussions that are not logged elsewhere, user and user talk pages, talk page archives, plausible redirects that can be changed to valid targets, and file pages or talk pages for files that exist on Wikimedia Commons.', subgroup: { name: 'g8_rationale', type: 'input', label: 'Optional explanation:', size: 60 }, hideSubgroupWhenSysop: true }, { label: 'স৮: অপসারিত পাতার উপপাতা', value: 'subpage', tooltip: 'This excludes any page that is useful to the project, and in particular: deletion discussions that are not logged elsewhere, user and user talk pages, talk page archives, plausible redirects that can be changed to valid targets, and file pages or talk pages for files that exist on Wikimedia Commons.', hideWhenMultiple: true, hideInNamespaces: [ 0, 6, 8 ] // hide in main, file, and mediawiki-spaces }, { label: 'স১১: দ্ব্যর্থহীন বিজ্ঞাপন', value: 'spam', tooltip: 'Pages which exclusively promote a company, product, group, service, or person and which would need to be fundamentally rewritten in order to become encyclopedic. Note that an article about a company or a product which describes its subject from a neutral point of view does not qualify for this criterion; an article that is blatant advertising should have inappropriate content as well' }, { label: 'স১২: দ্ব্যর্থহীন কপিরাইট লঙ্ঘন', value: 'copyvio', tooltip: 'Either: (1) Material was copied from another website that does not have a license compatible with Wikipedia, or is photography from a stock photo seller (such as Getty Images or Corbis) or other commercial content provider; (2) There is no non-infringing content in the page history worth saving; or (3) The infringement was introduced at once by a single person rather than created organically on wiki and then copied by another website such as one of the many Wikipedia mirrors', subgroup: [ { name: 'copyvio_url', type: 'input', label: 'ইউআরএল (যদি থাকে):', tooltip: 'If the material was copied from an online source, put the URL here, including the "http://" or "https://" protocol.', size: 60 }, { name: 'copyvio_url2', type: 'input', label: 'অতিরিক্ত ইউআরএল:', tooltip: 'Optional. Should begin with "http://" or "https://"', size: 60 }, { name: 'copyvio_url3', type: 'input', label: 'অতিরিক্ত ইউআরএল:', tooltip: 'Optional. Should begin with "http://" or "https://"', size: 60 } ] }, { label: 'স১৩: Page in draft namespace or userspace AfC submission, stale by over 6 months', value: 'afc', tooltip: 'Any rejected or unsubmitted AfC submission in userspace or any non-redirect page in draft namespace, that has not been edited for more than 6 months. Blank drafts in either namespace are also included.', hideWhenRedirect: true, showInNamespaces: [2, 118] // user, draft namespaces only }, ]; Twinkle.speedy.redirectList = [ { label: 'প২: বিষয়শ্রেণী:, টেমপ্লেট:, উইকিবই:, সাহায্য: এবং প্রবেশদ্বার নামস্থান ব্যতীত প্রধান নামস্থান থেকে অন্য নামস্থান পুনঃনির্দেশ', value: 'rediruser', tooltip: 'This does not include the pseudo-namespace shortcuts. If this was the result of a page move, consider waiting a day or two before deleting the redirect', showInNamespaces: [ 0 ] }, { label: 'প৩: এমন একটি অভাবনীয় টাইপোর ফলে তৈরি পুনঃনির্দেশ যা সম্প্রতি তৈরি করা হয়েছিল', value: 'redirtypo', tooltip: 'However, redirects from common misspellings or misnomers are generally useful, as are redirects in other languages' }, { label: 'স৮: বিদ্যমান নেই এমন লক্ষ্যে পুনর্নির্দেশ', value: 'redirnone', tooltip: 'This excludes any page that is useful to the project, and in particular: deletion discussions that are not logged elsewhere, user and user talk pages, talk page archives, plausible redirects that can be changed to valid targets, and file pages or talk pages for files that exist on Wikimedia Commons.', hideWhenMultiple: true } ]; Twinkle.speedy.normalizeHash = { reason: 'db', nonsense: 'g1', test: 'g2', vandalism: 'g3', hoax: 'g3', repost: 'g4', banned: 'g5', move: 'g6', xfd: 'g6', movedab: 'g6', copypaste: 'g6', g6: 'g6', author: 'g7', g8: 'g8', talk: 'g8', subpage: 'g8', redirnone: 'g8', templatecat: 'g8', imagepage: 'g8', attack: 'g10', negublp: 'g10', spam: 'g11', spamuser: 'g11', copyvio: 'g12', afc: 'g13', disambig: 'g14', nocontext: 'a1', foreign: 'a2', nocontent: 'a3', transwiki: 'a5', a7: 'a7', person: 'a7', corp: 'a7', web: 'a7', band: 'a7', club: 'a7', animal: 'a7', event: 'a7', a9: 'a9', a10: 'a10', madeup: 'a11', rediruser: 'r2', redirtypo: 'r3', redircom: 'r4', redundantimage: 'f1', noimage: 'f2', fpcfail: 'f2', noncom: 'f3', unksource: 'f4', unfree: 'f5', f5: 'f5', norat: 'f6', badfairuse: 'f7', commons: 'f8', imgcopyvio: 'f9', badfiletype: 'f10', nopermission: 'f11', catempty: 'c1', userreq: 'u1', nouser: 'u2', notwebhost: 'u5', p1: 'p1', emptyportal: 'p2' }; Twinkle.speedy.callbacks = { getTemplateCodeAndParams: function(params) { var code, parameters, i; if (params.normalizeds.length > 1) { code = '{{db-multiple'; params.utparams = {}; $.each(params.normalizeds, function(index, norm) { code += '|' + norm.toUpperCase(); parameters = params.templateParams[index] || []; for (var i in parameters) { if (typeof parameters[i] === 'string' && !parseInt(i, 10)) { // skip numeric parameters - {{db-multiple}} doesn't understand them code += '|' + i + '=' + parameters[i]; } } $.extend(params.utparams, Twinkle.speedy.getUserTalkParameters(norm, parameters)); }); code += '}}'; } else { parameters = params.templateParams[0] || []; code = '{{db-' + params.values[0]; for (i in parameters) { if (typeof parameters[i] === 'string') { code += '|' + i + '=' + parameters[i]; } } if (params.usertalk) { code += '|help=off'; } code += '}}'; params.utparams = Twinkle.speedy.getUserTalkParameters(params.normalizeds[0], parameters); } return [code, params.utparams]; }, parseWikitext: function(wikitext, callback) { var query = { action: 'parse', prop: 'text', pst: 'true', text: wikitext, contentmodel: 'wikitext', title: mw.config.get('wgPageName'), disablelimitreport: true, format: 'json' }; var statusIndicator = new Morebits.status('অপসারণ সারাংশ তৈরি করা হচ্ছে'); var api = new Morebits.wiki.api('Parsing deletion template', query, function(apiobj) { var reason = decodeURIComponent($(apiobj.getResponse().parse.text).find('#delete-reason').text()).replace(/\+/g, ' '); if (!reason) { statusIndicator.warn('অপসারণ টেমপ্লেট থেকে সারাংশ তৈরি করা যায়নি'); } else { statusIndicator.info('সম্পন্ন'); } callback(reason); }, statusIndicator); api.post(); }, noteToCreator: function(pageobj) { var params = pageobj.getCallbackParameters(); var initialContrib = pageobj.getCreator(); // disallow notifying yourself if (initialContrib === mw.config.get('wgUserName')) { Morebits.status.warn('আপনি (' + initialContrib + ') এই পাতাটি তৈরি করেছেন তাই বিজ্ঞপ্তি পাঠানো হচ্ছে না'); initialContrib = null; // don't notify users when their user talk page is nominated/deleted } else if (initialContrib === mw.config.get('wgTitle') && mw.config.get('wgNamespaceNumber') === 3) { Morebits.status.warn('প্রাথমিক অবদানকারীকে অবহিতকরণ: এই ব্যবহারকারী তার নিজস্ব ব্যবহারকারী আলাপ পাতা তৈরি করেছেন, তাই বিজ্ঞপ্তি এড়িয়ে যাওয়া হচ্ছে'); initialContrib = null; // quick hack to prevent excessive unwanted notifications, per request. Should actually be configurable on recipient page... } else if ((initialContrib === 'RagibBot') && params.normalizeds[0] === 'f2') { Morebits.status.warn('মূল অবদানকারীকে জানানো হচ্ছে: page created procedurally by bot; skipping notification'); initialContrib = null; // Check for already existing tags } else if (Twinkle.speedy.hasCSD && params.warnUser && !confirm('পাতাটিতে একটি অপসারণ সম্পর্কিত ট্যাগ রয়েছে এবং প্রণেতাকে সম্ভবত অবহিত করা হয়েছে৷ আপনি কি এই মুছে ফেলার জন্য তাকে জানাতে চান?')) { Morebits.status.info('মূল অবদানকারীকে জানানো হচ্ছে', 'canceled by user; skipping notification.'); initialContrib = null; } if (initialContrib) { var usertalkpage = new Morebits.wiki.page('User talk:' + initialContrib, 'মূল অবদানকারীকে জানানো হচ্ছে (' + initialContrib + ')'), notifytext, i, editsummary; // special cases: "db" and "db-multiple" if (params.normalizeds.length > 1) { notifytext = '\n{{subst:db-' + (params.warnUser ? 'deleted' : 'notice') + '-multiple|1=' + Morebits.pageNameNorm; var count = 2; $.each(params.normalizeds, function(index, norm) { notifytext += '|' + count++ + '=' + norm.toUpperCase(); }); } else if (params.normalizeds[0] === 'db') { notifytext = '\n{{subst:db-reason-' + (params.warnUser ? 'deleted' : 'notice') + '|1=' + Morebits.pageNameNorm; } else { notifytext = '\n{{subst:db-csd-' + (params.warnUser ? 'deleted' : 'notice') + '-custom|1='; if (params.values[0] === 'copypaste') { notifytext += params.templateParams[0].sourcepage; } else { notifytext += Morebits.pageNameNorm; } notifytext += '|2=' + params.values[0]; } for (i in params.utparams) { if (typeof params.utparams[i] === 'string') { notifytext += '|' + i + '=' + params.utparams[i]; } } notifytext += (params.welcomeuser ? '' : '|nowelcome=yes') + '}} ~~~~'; editsummary = 'বিজ্ঞপ্তি:' + (params.warnUser ? '' : ' দ্রুত অপসারণ প্রস্তাবনা,'); if (params.normalizeds.indexOf('g10') === -1) { // no article name in summary for G10 taggings editsummary += ' [[:' + Morebits.pageNameNorm + ']]-এর'; } else { editsummary += ' একটি আক্রমণাত্বক পাতার'; } usertalkpage.setAppendText(notifytext); usertalkpage.setEditSummary(editsummary); usertalkpage.setChangeTags(Twinkle.changeTags); usertalkpage.setCreateOption('recreate'); usertalkpage.setWatchlist(Twinkle.getPref('watchSpeedyUser')); usertalkpage.setFollowRedirect(true, false); usertalkpage.append(function onNotifySuccess() { // add this nomination to the user's userspace log, if the user has enabled it if (params.lognomination) { Twinkle.speedy.callbacks.user.addToLog(params, initialContrib); } }, function onNotifyError() { // if user could not be notified, log nomination without mentioning that notification was sent if (params.lognomination) { Twinkle.speedy.callbacks.user.addToLog(params, null); } }); } else if (params.lognomination) { // log nomination even if the user notification wasn't sent Twinkle.speedy.callbacks.user.addToLog(params, null); } }, sysop: { main: function(params) { var reason; if (!params.normalizeds.length && params.normalizeds[0] === 'db') { reason = prompt('Enter the deletion summary to use, which will be entered into the deletion log:', ''); Twinkle.speedy.callbacks.sysop.deletePage(reason, params); } else { var code = Twinkle.speedy.callbacks.getTemplateCodeAndParams(params)[0]; Twinkle.speedy.callbacks.parseWikitext(code, function(reason) { if (params.promptForSummary) { reason = prompt('Enter the deletion summary to use, or press OK to accept the automatically generated one.', reason); } Twinkle.speedy.callbacks.sysop.deletePage(reason, params); }); } }, deletePage: function(reason, params) { var thispage = new Morebits.wiki.page(mw.config.get('wgPageName'), 'Deleting page'); if (reason === null) { return Morebits.status.error('Asking for reason', 'User cancelled'); } else if (!reason || !reason.replace(/^\s*/, '').replace(/\s*$/, '')) { return Morebits.status.error('Asking for reason', "you didn't give one. I don't know... what with admins and their apathetic antics... I give up..."); } var deleteMain = function(callback) { thispage.setEditSummary(reason); thispage.setChangeTags(Twinkle.changeTags); thispage.setWatchlist(params.watch); thispage.deletePage(function() { thispage.getStatusElement().info('done'); typeof callback === 'function' && callback(); Twinkle.speedy.callbacks.sysop.deleteTalk(params); }); }; // look up initial contributor. If prompting user for deletion reason, just display a link. // Otherwise open the talk page directly if (params.warnUser) { thispage.setCallbackParameters(params); thispage.lookupCreation(function(pageobj) { deleteMain(function() { Twinkle.speedy.callbacks.noteToCreator(pageobj); }); }); } else { deleteMain(); } }, deleteTalk: function(params) { // delete talk page if (params.deleteTalkPage && params.normalized !== 'f8' && !document.getElementById('ca-talk').classList.contains('new')) { var talkpage = new Morebits.wiki.page(mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceNumber') + 1] + ':' + mw.config.get('wgTitle'), 'Deleting talk page'); talkpage.setEditSummary('[[WP:CSD#G8|G8]]: Talk page of deleted page "' + Morebits.pageNameNorm + '"'); talkpage.setChangeTags(Twinkle.changeTags); talkpage.deletePage(); // this is ugly, but because of the architecture of wiki.api, it is needed // (otherwise success/failure messages for the previous action would be suppressed) window.setTimeout(function() { Twinkle.speedy.callbacks.sysop.deleteRedirects(params); }, 1800); } else { Twinkle.speedy.callbacks.sysop.deleteRedirects(params); } }, deleteRedirects: function(params) { // delete redirects if (params.deleteRedirects) { var query = { action: 'query', titles: mw.config.get('wgPageName'), prop: 'redirects', rdlimit: 'max', // 500 is max for normal users, 5000 for bots and sysops format: 'json' }; var wikipedia_api = new Morebits.wiki.api('getting list of redirects...', query, Twinkle.speedy.callbacks.sysop.deleteRedirectsMain, new Morebits.status('Deleting redirects')); wikipedia_api.params = params; wikipedia_api.post(); } // promote Unlink tool var $link, $bigtext; if (mw.config.get('wgNamespaceNumber') === 6 && params.normalized !== 'f8') { $link = $('<a/>', { href: '#', text: 'click here to go to the Unlink tool', css: { fontSize: '130%', fontWeight: 'bold' }, click: function() { Morebits.wiki.actionCompleted.redirect = null; Twinkle.speedy.dialog.close(); Twinkle.unlink.callback('Removing usages of and/or links to deleted file ' + Morebits.pageNameNorm); } }); $bigtext = $('<span/>', { text: 'To orphan backlinks and remove instances of file usage', css: { fontSize: '130%', fontWeight: 'bold' } }); Morebits.status.info($bigtext[0], $link[0]); } else if (params.normalized !== 'f8') { $link = $('<a/>', { href: '#', text: 'click here to go to the Unlink tool', css: { fontSize: '130%', fontWeight: 'bold' }, click: function() { Morebits.wiki.actionCompleted.redirect = null; Twinkle.speedy.dialog.close(); Twinkle.unlink.callback('Removing links to deleted page ' + Morebits.pageNameNorm); } }); $bigtext = $('<span/>', { text: 'To orphan backlinks', css: { fontSize: '130%', fontWeight: 'bold' } }); Morebits.status.info($bigtext[0], $link[0]); } }, deleteRedirectsMain: function(apiobj) { var response = apiobj.getResponse(); var snapshot = response.query.pages[0].redirects || []; var total = snapshot.length; var statusIndicator = apiobj.statelem; if (!total) { statusIndicator.status('no redirects found'); return; } statusIndicator.status('0%'); var current = 0; var onsuccess = function(apiobjInner) { var now = parseInt(100 * ++current / total, 10) + '%'; statusIndicator.update(now); apiobjInner.statelem.unlink(); if (current >= total) { statusIndicator.info(now + ' (completed)'); Morebits.wiki.removeCheckpoint(); } }; Morebits.wiki.addCheckpoint(); snapshot.forEach(function(value) { var title = value.title; var page = new Morebits.wiki.page(title, 'Deleting redirect "' + title + '"'); page.setEditSummary('[[WP:CSD#G8|G8]]: Redirect to deleted page "' + Morebits.pageNameNorm + '"'); page.setChangeTags(Twinkle.changeTags); page.deletePage(onsuccess); }); } }, user: { main: function(pageobj) { var statelem = pageobj.getStatusElement(); if (!pageobj.exists()) { statelem.error("It seems that the page doesn't exist; perhaps it has already been deleted"); return; } var params = pageobj.getCallbackParameters(); // given the params, builds the template and also adds the user talk page parameters to the params that were passed in // returns => [<string> wikitext, <object> utparams] var buildData = Twinkle.speedy.callbacks.getTemplateCodeAndParams(params), code = buildData[0]; params.utparams = buildData[1]; // Set the correct value for |ts= parameter in {{db-g13}} if (params.normalizeds.indexOf('g13') !== -1) { code = code.replace('$TIMESTAMP', pageobj.getLastEditTime()); } // Tag if possible, post on talk if not if (pageobj.canEdit() && ['wikitext', 'Scribunto', 'javascript', 'css', 'sanitized-css'].indexOf(pageobj.getContentModel()) !== -1) { var text = pageobj.getPageText(); statelem.status('Checking for tags on the page...'); // check for existing deletion tags var tag = /(?:\{\{\s*(db|delete|db-.*?|speedy deletion-.*?)(?:\s*\||\s*\}\}))/.exec(text); // This won't make use of the db-multiple template but it probably should if (tag && !confirm('The page already has the CSD-related template {{' + tag[1] + '}} on it. Do you want to add another CSD template?')) { return; } var xfd = /\{\{((?:article for deletion|proposed deletion|prod blp|template for discussion)\/dated|[cfm]fd\b)/i.exec(text) || /#invoke:(RfD)/.exec(text); if (xfd && !confirm('The deletion-related template {{' + xfd[1] + '}} was found on the page. Do you still want to add a CSD template?')) { return; } // curate/patrol the page if (Twinkle.getPref('markSpeedyPagesAsPatrolled')) { pageobj.patrol(); } // Wrap SD template in noinclude tags if we are in template space. // Won't work with userboxes in userspace, or any other transcluded page outside template space if (mw.config.get('wgNamespaceNumber') === 10) { // Template: code = '<noinclude>' + code + '</noinclude>'; } // Remove tags that become superfluous with this action text = text.replace(/\{\{\s*([Uu]serspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/g, ''); if (mw.config.get('wgNamespaceNumber') === 6) { // remove "move to Commons" tag - deletion-tagged files cannot be moved to Commons text = text.replace(/\{\{(mtc|(copy |move )?to ?commons|move to wikimedia commons|copy to wikimedia commons)[^}]*\}\}/gi, ''); } if (params.requestsalt) { if (params.normalizeds.indexOf('g10') === -1) { code += '\n{{salt}}'; } else { code = '{{salt}}\n' + code; } } if (mw.config.get('wgPageContentModel') === 'Scribunto') { // Scribunto isn't parsed like wikitext, so CSD templates on modules need special handling to work var equals = ''; while (code.indexOf(']' + equals + ']') !== -1) { equals += '='; } code = "require('Module:Module wikitext')._addText([" + equals + '[' + code + ']' + equals + ']);'; } else if (['javascript', 'css', 'sanitized-css'].indexOf(mw.config.get('wgPageContentModel')) !== -1) { // Likewise for JS/CSS pages code = '/* ' + code + ' */'; } // Generate edit summary for edit var editsummary; if (params.normalizeds.length > 1) { editsummary = 'দ্রুত অপসারণ প্রস্তাবনা ('; $.each(params.normalizeds, function(index, norm) { editsummary += '[[WP:CSD#' + norm.toUpperCase() + '|CSD ' + norm.toUpperCase() + ']], '; }); editsummary = editsummary.substr(0, editsummary.length - 2); // remove trailing comma editsummary += ').'; } else if (params.normalizeds[0] === 'db') { editsummary = 'Requesting [[WP:CSD|speedy deletion]] with rationale "' + params.templateParams[0]['1'] + '".'; } else { editsummary = 'দ্রুত অপসারণ প্রস্তাবনা ([[WP:CSD#' + params.normalizeds[0].toUpperCase() + '|সিএসডি ' + params.normalizeds[0].toUpperCase() + ']])।'; } // Blank attack pages if (params.normalizeds.indexOf('g10') !== -1) { text = code; } else { // Insert tag after short description or any hatnotes var wikipage = new Morebits.wikitext.page(text); text = wikipage.insertAfterTemplates(code + '\n', Twinkle.hatnoteRegex).getText(); } pageobj.setPageText(text); pageobj.setEditSummary(editsummary); pageobj.setWatchlist(params.watch); pageobj.save(Twinkle.speedy.callbacks.user.tagComplete); } else { // Attempt to place on talk page var talkName = new mw.Title(pageobj.getPageName()).getTalkPage().toText(); if (talkName !== pageobj.getPageName()) { if (params.requestsalt) { code += '\n{{salt}}'; } pageobj.getStatusElement().warn('Unable to edit page, placing tag on talk page'); var talk_page = new Morebits.wiki.page(talkName, 'Automatically placing tag on talk page'); talk_page.setNewSectionTitle(pageobj.getPageName() + ' nominated for CSD, request deletion'); talk_page.setNewSectionText(code + '\n\nআমি ' + pageobj.getPageName() + ' পাতাটি ট্যাগ করতে পারছি না, অনুগ্ৰহ করে এটি অপসারণ করুন। ~~~~'); talk_page.setCreateOption('recreate'); talk_page.setFollowRedirect(true); talk_page.setWatchlist(params.watch); talk_page.setChangeTags(Twinkle.changeTags); talk_page.setCallbackParameters(params); talk_page.newSection(Twinkle.speedy.callbacks.user.tagComplete); } else { pageobj.getStatusElement().error('Page protected and nowhere to add an edit request, aborting'); } } }, tagComplete: function(pageobj) { var params = pageobj.getCallbackParameters(); // Notification to first contributor, will also log nomination to the user's userspace log if (params.usertalk) { var thispage = new Morebits.wiki.page(Morebits.pageNameNorm); thispage.setCallbackParameters(params); thispage.lookupCreation(Twinkle.speedy.callbacks.noteToCreator); // or, if not notifying, add this nomination to the user's userspace log without the initial contributor's name } else if (params.lognomination) { Twinkle.speedy.callbacks.user.addToLog(params, null); } }, addToLog: function(params, initialContrib) { var usl = new Morebits.userspaceLogger(Twinkle.getPref('speedyLogPageName')); usl.initialText = "এই সব [[WP:CSD|দ্রুত অপসারণের]] মনোনয়নের লগ যা [[WP:TW|টুইংকলের]] CSD মডিউল ব্যবহার করে এই ব্যবহারকারী তৈরি করেছেন।\n\n" + 'আপনি যদি আর এই লগ রাখতে না চান, তাহলে আপনি [[উইকিপিডিয়া:টুইংকল/পছন্দসমূহ|পছন্দসমূহ প্যানেল]] ব্যবহার করে এটি বন্ধ করতে পারেন, এবং ' + '[[WP:CSD#U1|সিএসডি ব১]]-এর অধীনে এই পাতাটি দ্রুত অপসারণের জন্য মনোনয়ন করতে পারেন।' + (Morebits.userIsSysop ? '\n\nThis log does not track outright speedy deletions made using Twinkle.' : ''); var formatParamLog = function(normalize, csdparam, input) { if ((normalize === 'G4' && csdparam === 'xfd') || (normalize === 'G6' && csdparam === 'page') || (normalize === 'G6' && csdparam === 'fullvotepage') || (normalize === 'G6' && csdparam === 'sourcepage') || (normalize === 'A2' && csdparam === 'source') || (normalize === 'A10' && csdparam === 'article') || (normalize === 'F1' && csdparam === 'filename')) { input = '[[:' + input + ']]'; } else if (normalize === 'G5' && csdparam === 'user') { input = '[[:User:' + input + ']]'; } else if (normalize === 'G12' && csdparam.lastIndexOf('url', 0) === 0 && input.lastIndexOf('http', 0) === 0) { input = '[' + input + ' ' + input + ']'; } else if (normalize === 'F8' && csdparam === 'filename') { input = '[[commons:' + input + ']]'; } else if (normalize === 'P1' && csdparam === 'criterion') { input = '[[WP:CSD#' + input + ']]'; } return ' {' + normalize + ' ' + csdparam + ': ' + input + '}'; }; var extraInfo = ''; // If a logged file is deleted but exists on commons, the wikilink will be blue, so provide a link to the log var fileLogLink = mw.config.get('wgNamespaceNumber') === 6 ? ' ([{{fullurl:Special:Log|page=' + mw.util.wikiUrlencode(mw.config.get('wgPageName')) + '}} log])' : ''; var editsummary = 'দ্রুত অপসারণের মনোনয়ন তালিকাভুক্ত করা হচ্ছে,'; var appendText = '# [[:' + Morebits.pageNameNorm; if (params.normalizeds.indexOf('g10') === -1) { // no article name in log for G10 taggings appendText += ']]' + fileLogLink + ': '; editsummary += ' [[:' + Morebits.pageNameNorm + ']]।'; } else { appendText += '|এটা]] attack page' + fileLogLink + ': '; editsummary += ' of an attack page.'; } if (params.normalizeds.length > 1) { appendText += 'multiple criteria ('; $.each(params.normalizeds, function(index, norm) { appendText += '[[WP:CSD#' + norm.toUpperCase() + '|' + norm.toUpperCase() + ']], '; }); appendText = appendText.substr(0, appendText.length - 2); // remove trailing comma appendText += ')'; } else if (params.normalizeds[0] === 'db') { appendText += '{{tl|db-reason}}'; } else { appendText += '[[WP:CSD#' + params.normalizeds[0].toUpperCase() + '|CSD ' + params.normalizeds[0].toUpperCase() + ']] ({{tl|db-' + params.values[0] + '}})'; } // If params is "empty" it will still be full of empty arrays, but ask anyway if (params.templateParams) { // Treat custom rationale individually if (params.normalizeds[0] && params.normalizeds[0] === 'db') { extraInfo += formatParamLog('Custom', 'rationale', params.templateParams[0]['1']); } else { params.templateParams.forEach(function(item, index) { var keys = Object.keys(item); if (keys[0] !== undefined && keys[0].length > 0) { // Second loop required since some items (G12, F9) may have multiple keys keys.forEach(function(key, keyIndex) { if (keys[keyIndex] === 'blanked' || keys[keyIndex] === 'ts') { return true; // Not worth logging } extraInfo += formatParamLog(params.normalizeds[index].toUpperCase(), keys[keyIndex], item[key]); }); } }); } } if (params.requestsalt) { appendText += '; requested creation protection ([[WP:SALT|salting]])'; } if (extraInfo) { appendText += '; additional information:' + extraInfo; } if (initialContrib) { appendText += '; notified {{user|1=' + initialContrib + '}}'; } appendText += ' ~~~~~\n'; usl.changeTags = Twinkle.changeTags; usl.log(appendText, editsummary); } } }; // validate subgroups in the form passed into the speedy deletion tag Twinkle.speedy.getParameters = function twinklespeedyGetParameters(form, values) { var parameters = []; $.each(values, function(index, value) { var currentParams = []; switch (value) { case 'reason': if (form['csd.reason_1']) { var dbrationale = form['csd.reason_1'].value; if (!dbrationale || !dbrationale.trim()) { alert('Custom rationale: Please specify a rationale.'); parameters = null; return false; } currentParams['1'] = dbrationale; } break; case 'userreq': // U1 if (form['csd.userreq_rationale']) { var u1rationale = form['csd.userreq_rationale'].value; if (mw.config.get('wgNamespaceNumber') === 3 && !(/\//).test(mw.config.get('wgTitle')) && (!u1rationale || !u1rationale.trim())) { alert('CSD U1: Please specify a rationale when nominating user talk pages.'); parameters = null; return false; } currentParams.rationale = u1rationale; } break; case 'repost': // G4 if (form['csd.repost_xfd']) { var deldisc = form['csd.repost_xfd'].value; if (deldisc) { if (!new RegExp('^:?' + Morebits.namespaceRegex(4) + ':', 'i').test(deldisc)) { alert('CSD G4: The deletion discussion page name, if provided, must start with "Wikipedia:".'); parameters = null; return false; } currentParams.xfd = deldisc; } } break; case 'banned': // G5 if (form['csd.banned_user'] && form['csd.banned_user'].value) { currentParams.user = form['csd.banned_user'].value.replace(/^\s*User:/i, ''); } break; case 'move': // G6 if (form['csd.move_page'] && form['csd.move_reason']) { var movepage = form['csd.move_page'].value, movereason = form['csd.move_reason'].value; if (!movepage || !movepage.trim()) { alert('CSD G6 (move): Please specify the page to be moved here.'); parameters = null; return false; } if (!movereason || !movereason.trim()) { alert('CSD G6 (move): Please specify the reason for the move.'); parameters = null; return false; } currentParams.page = movepage; currentParams.reason = movereason; } break; case 'xfd': // G6 if (form['csd.xfd_fullvotepage']) { var xfd = form['csd.xfd_fullvotepage'].value; if (xfd) { if (!new RegExp('^:?' + Morebits.namespaceRegex(4) + ':', 'i').test(xfd)) { alert('CSD G6 (XFD): The deletion discussion page name, if provided, must start with "Wikipedia:".'); parameters = null; return false; } currentParams.fullvotepage = xfd; } } break; case 'copypaste': // G6 if (form['csd.copypaste_sourcepage']) { var copypaste = form['csd.copypaste_sourcepage'].value; if (!copypaste || !copypaste.trim()) { alert('CSD G6 (copypaste): Please specify the source page name.'); parameters = null; return false; } currentParams.sourcepage = copypaste; } break; case 'g6': // G6 if (form['csd.g6_rationale'] && form['csd.g6_rationale'].value) { currentParams.rationale = form['csd.g6_rationale'].value; } break; case 'author': // G7 if (form['csd.author_rationale'] && form['csd.author_rationale'].value) { currentParams.rationale = form['csd.author_rationale'].value; } break; case 'g8': // G8 if (form['csd.g8_rationale'] && form['csd.g8_rationale'].value) { currentParams.rationale = form['csd.g8_rationale'].value; } break; case 'templatecat': // G8 if (form['csd.templatecat_rationale'] && form['csd.templatecat_rationale'].value) { currentParams.rationale = form['csd.templatecat_rationale'].value; } break; case 'attack': // G10 currentParams.blanked = 'yes'; // it is actually blanked elsewhere in code, but setting the flag here break; case 'copyvio': // G12 if (form['csd.copyvio_url'] && form['csd.copyvio_url'].value) { currentParams.url = form['csd.copyvio_url'].value; } if (form['csd.copyvio_url2'] && form['csd.copyvio_url2'].value) { currentParams.url2 = form['csd.copyvio_url2'].value; } if (form['csd.copyvio_url3'] && form['csd.copyvio_url3'].value) { currentParams.url3 = form['csd.copyvio_url3'].value; } break; case 'afc': // G13 currentParams.ts = '$TIMESTAMP'; // to be replaced by the last revision timestamp when page is saved break; case 'redundantimage': // F1 if (form['csd.redundantimage_filename']) { var redimage = form['csd.redundantimage_filename'].value; if (!redimage || !redimage.trim()) { alert('CSD F1: Please specify the filename of the other file.'); parameters = null; return false; } currentParams.filename = new RegExp('^\\s*' + Morebits.namespaceRegex(6) + ':', 'i').test(redimage) ? redimage : 'File:' + redimage; } break; case 'badfairuse': // F7 if (form['csd.badfairuse_rationale'] && form['csd.badfairuse_rationale'].value) { currentParams.rationale = form['csd.badfairuse_rationale'].value; } break; case 'commons': // F8 if (form['csd.commons_filename']) { var filename = form['csd.commons_filename'].value; if (filename && filename.trim() && filename !== Morebits.pageNameNorm) { currentParams.filename = new RegExp('^\\s*' + Morebits.namespaceRegex(6) + ':', 'i').test(filename) ? filename : 'File:' + filename; } } break; case 'imgcopyvio': // F9 if (form['csd.imgcopyvio_url'] && form['csd.imgcopyvio_rationale']) { var f9url = form['csd.imgcopyvio_url'].value; var f9rationale = form['csd.imgcopyvio_rationale'].value; if ((!f9url || !f9url.trim()) && (!f9rationale || !f9rationale.trim())) { alert('CSD F9: You must enter a url or reason (or both) when nominating a file under F9.'); parameters = null; return false; } if (form['csd.imgcopyvio_url'].value) { currentParams.url = f9url; } if (form['csd.imgcopyvio_rationale'].value) { currentParams.rationale = f9rationale; } } break; case 'foreign': // A2 if (form['csd.foreign_source']) { var foreignlink = form['csd.foreign_source'].value; if (!foreignlink || !foreignlink.trim()) { alert('CSD A2: Please specify an interwiki link to the article of which this is a copy.'); parameters = null; return false; } currentParams.source = foreignlink; } break; case 'transwiki': // A5 if (form['csd.transwiki_location'] && form['csd.transwiki_location'].value) { currentParams.location = form['csd.transwiki_location'].value; } break; case 'a10': // A10 if (form['csd.a10_article']) { var duptitle = form['csd.a10_article'].value; if (!duptitle || !duptitle.trim()) { alert('CSD A10: Please specify the name of the article which is duplicated.'); parameters = null; return false; } currentParams.article = duptitle; } break; case 'p1': // P1 if (form['csd.p1_criterion']) { var criterion = form['csd.p1_criterion'].value; if (!criterion || !criterion.trim()) { alert('CSD P1: Please specify a single criterion.'); parameters = null; return false; } currentParams.criterion = criterion; } break; default: break; } parameters.push(currentParams); }); return parameters; }; // Function for processing talk page notification template parameters // key1/value1: for {{db-criterion-[notice|deleted]}} (via {{db-csd-[notice|deleted]-custom}}) // utparams.param: for {{db-[notice|deleted]-multiple}} Twinkle.speedy.getUserTalkParameters = function twinklespeedyGetUserTalkParameters(normalized, parameters) { var utparams = []; // Special cases if (normalized === 'db') { utparams['2'] = parameters['1']; } else if (normalized === 'g6') { utparams.key1 = 'to'; utparams.value1 = Morebits.pageNameNorm; } else if (normalized === 'g12') { ['url', 'url2', 'url3'].forEach(function(item, idx) { if (parameters[item]) { idx++; utparams['key' + idx] = item; utparams['value' + idx] = utparams[item] = parameters[item]; } }); } else { // Handle the rest var param; switch (normalized) { case 'g4': param = 'xfd'; break; case 'a2': param = 'source'; break; case 'a5': param = 'location'; break; case 'a10': param = 'article'; break; case 'f9': param = 'url'; break; case 'p1': param = 'criterion'; break; default: break; } // No harm in providing a usertalk template with the others' parameters if (param && parameters[param]) { utparams.key1 = param; utparams.value1 = utparams[param] = parameters[param]; } } return utparams; }; /** * @param {Event} e * @returns {Array} */ Twinkle.speedy.resolveCsdValues = function twinklespeedyResolveCsdValues(e) { var values = (e.target.form ? e.target.form : e.target).getChecked('csd'); if (values.length === 0) { alert('দয়া করে একটি বিচারধারা বাছুন!'); return null; } return values; }; Twinkle.speedy.callback.evaluateSysop = function twinklespeedyCallbackEvaluateSysop(e) { var form = e.target.form ? e.target.form : e.target; if (e.target.type === 'checkbox' || e.target.type === 'text' || e.target.type === 'select') { return; } var tag_only = form.tag_only; if (tag_only && tag_only.checked) { Twinkle.speedy.callback.evaluateUser(e); return; } var values = Twinkle.speedy.resolveCsdValues(e); if (!values) { return; } var templateParams = Twinkle.speedy.getParameters(form, values); if (!templateParams) { return; } var normalizeds = values.map(function(value) { return Twinkle.speedy.normalizeHash[value]; }); // analyse each criterion to determine whether to watch the page, prompt for summary, or notify the creator var watchPage, promptForSummary; normalizeds.forEach(function(norm) { if (Twinkle.getPref('watchSpeedyPages').indexOf(norm) !== -1) { watchPage = Twinkle.getPref('watchSpeedyExpiry'); } if (Twinkle.getPref('promptForSpeedyDeletionSummary').indexOf(norm) !== -1) { promptForSummary = true; } }); var warnusertalk = form.warnusertalk.checked && normalizeds.some(function (norm, index) { return Twinkle.getPref('warnUserOnSpeedyDelete').indexOf(norm) !== -1 && !(norm === 'g6' && values[index] !== 'copypaste'); }); var welcomeuser = warnusertalk && normalizeds.some(function (norm) { return Twinkle.getPref('welcomeUserOnSpeedyDeletionNotification').indexOf(norm) !== -1; }); var params = { values: values, normalizeds: normalizeds, watch: watchPage, deleteTalkPage: form.talkpage && form.talkpage.checked, deleteRedirects: form.redirects.checked, warnUser: warnusertalk, welcomeuser: welcomeuser, promptForSummary: promptForSummary, templateParams: templateParams }; Morebits.simpleWindow.setButtonsEnabled(false); Morebits.status.init(form); Twinkle.speedy.callbacks.sysop.main(params); }; Twinkle.speedy.callback.evaluateUser = function twinklespeedyCallbackEvaluateUser(e) { var form = e.target.form ? e.target.form : e.target; if (e.target.type === 'checkbox' || e.target.type === 'text' || e.target.type === 'select') { return; } var values = Twinkle.speedy.resolveCsdValues(e); if (!values) { return; } var templateParams = Twinkle.speedy.getParameters(form, values); if (!templateParams) { return; } // var multiple = form.multiple.checked; var normalizeds = values.map(function(value) { return Twinkle.speedy.normalizeHash[value]; }); // analyse each criterion to determine whether to watch the page/notify the creator var watchPage = normalizeds.some(function(norm) { return Twinkle.getPref('watchSpeedyPages').indexOf(norm) !== -1 && Twinkle.getPref('watchSpeedyExpiry'); }); var notifyuser = form.notify.checked && normalizeds.some(function(norm, index) { return Twinkle.getPref('notifyUserOnSpeedyDeletionNomination').indexOf(norm) !== -1 && !(norm === 'g6' && values[index] !== 'copypaste'); }); var welcomeuser = notifyuser && normalizeds.some(function(norm) { return Twinkle.getPref('welcomeUserOnSpeedyDeletionNotification').indexOf(norm) !== -1; }); var csdlog = Twinkle.getPref('logSpeedyNominations') && normalizeds.some(function(norm) { return Twinkle.getPref('noLogOnSpeedyNomination').indexOf(norm) === -1; }); var params = { values: values, normalizeds: normalizeds, watch: watchPage, usertalk: notifyuser, welcomeuser: welcomeuser, lognomination: csdlog, requestsalt: form.salting.checked, templateParams: templateParams }; Morebits.simpleWindow.setButtonsEnabled(false); Morebits.status.init(form); Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName'); Morebits.wiki.actionCompleted.notice = 'ট্যাগ করা সম্পন্ন হয়েছে'; var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), 'পাতায় ট্যাগ যোগ করা হচ্ছে'); wikipedia_page.setChangeTags(Twinkle.changeTags); // Here to apply to triage wikipedia_page.setCallbackParameters(params); wikipedia_page.load(Twinkle.speedy.callbacks.user.main); }; Twinkle.addInitCallback(Twinkle.speedy, 'speedy'); })(jQuery); // </nowiki> enx5iyi9zm1471q1opiiymts8k6gwuc ব্যবহারকারী আলাপ:MetaContributor 3 15862 46854 2022-08-28T18:40:18Z KanikBot 8129 স্বাগতম! wikitext text/x-wiki == বাংলা উইকিবইয়ে স্বাগত == {{স্বাগত/২য় সংস্করণ}} ১৮:৪০, ২৮ আগস্ট ২০২২ (ইউটিসি) 9jpb18tyiow2czkdgjan1b3evxkqv43 উইকিবই:খেলাঘর/৪ 4 15863 46856 2022-08-29T10:12:11Z 103.106.0.165 "Test page for https://bn.wikibooks.org/wiki/%E0%A6%AE%E0%A6%BF%E0%A6%A1%E0%A6%BF%E0%A6%AF%E0%A6%BC%E0%A6%BE%E0%A6%89%E0%A6%87%E0%A6%95%E0%A6%BF:Gadget-twinklespeedy.js testing" দিয়ে পাতা তৈরি wikitext text/x-wiki Test page for https://bn.wikibooks.org/wiki/%E0%A6%AE%E0%A6%BF%E0%A6%A1%E0%A6%BF%E0%A6%AF%E0%A6%BC%E0%A6%BE%E0%A6%89%E0%A6%87%E0%A6%95%E0%A6%BF:Gadget-twinklespeedy.js testing dgtd1dcv4hi1f55q0o3tz8r47y64rw6 46857 46856 2022-08-29T10:13:26Z Aishik Rehman 5249 দ্রুত অপসারণ প্রস্তাবনা ([[WP:CSD#G1|সিএসডি G1]])। wikitext text/x-wiki {{db-nonsense}} Test page for https://bn.wikibooks.org/wiki/%E0%A6%AE%E0%A6%BF%E0%A6%A1%E0%A6%BF%E0%A6%AF%E0%A6%BC%E0%A6%BE%E0%A6%89%E0%A6%87%E0%A6%95%E0%A6%BF:Gadget-twinklespeedy.js testing 26mn2tuyyfpyw6dkq32w07cjqkgh1uf 46859 46857 2022-08-29T10:16:01Z Aishik Rehman 5249 দ্রুত অপসারণ প্রস্তাবনা ([[WP:CSD#G2|সিএসডি G2]])। wikitext text/x-wiki {{db-test|help=off}} {{db-nonsense}} Test page for https://bn.wikibooks.org/wiki/%E0%A6%AE%E0%A6%BF%E0%A6%A1%E0%A6%BF%E0%A6%AF%E0%A6%BC%E0%A6%BE%E0%A6%89%E0%A6%87%E0%A6%95%E0%A6%BF:Gadget-twinklespeedy.js testing 5szn1pppbz5npr31tytkqraouewkys9 46861 46859 2022-08-29T10:16:19Z Aishik Rehman 5249 দ্রুত অপসারণ প্রস্তাবনা ([[WP:CSD#G2|সিএসডি G2]])। wikitext text/x-wiki {{db-test|help=off}} {{db-test|help=off}} {{db-nonsense}} Test page for https://bn.wikibooks.org/wiki/%E0%A6%AE%E0%A6%BF%E0%A6%A1%E0%A6%BF%E0%A6%AF%E0%A6%BC%E0%A6%BE%E0%A6%89%E0%A6%87%E0%A6%95%E0%A6%BF:Gadget-twinklespeedy.js testing iig87w78ild84uhyvj5qctt5707we9e 46863 46861 2022-08-29T10:16:38Z Aishik Rehman 5249 wikitext text/x-wiki Test page for https://bn.wikibooks.org/wiki/%E0%A6%AE%E0%A6%BF%E0%A6%A1%E0%A6%BF%E0%A6%AF%E0%A6%BC%E0%A6%BE%E0%A6%89%E0%A6%87%E0%A6%95%E0%A6%BF:Gadget-twinklespeedy.js testing dgtd1dcv4hi1f55q0o3tz8r47y64rw6 46864 46863 2022-08-29T10:16:46Z Aishik Rehman 5249 দ্রুত অপসারণ প্রস্তাবনা ([[WP:CSD#G2|সিএসডি G2]])। wikitext text/x-wiki {{db-test|help=off}} Test page for https://bn.wikibooks.org/wiki/%E0%A6%AE%E0%A6%BF%E0%A6%A1%E0%A6%BF%E0%A6%AF%E0%A6%BC%E0%A6%BE%E0%A6%89%E0%A6%87%E0%A6%95%E0%A6%BF:Gadget-twinklespeedy.js testing o20y2vzjjhwmf6k6mx50il7t27p2ugx 46866 46864 2022-08-29T10:17:15Z Aishik Rehman 5249 দ্রুত অপসারণ প্রস্তাবনা ([[WP:CSD#G2|সিএসডি G2]])। wikitext text/x-wiki {{db-test|help=off}} {{db-test|help=off}} Test page for https://bn.wikibooks.org/wiki/%E0%A6%AE%E0%A6%BF%E0%A6%A1%E0%A6%BF%E0%A6%AF%E0%A6%BC%E0%A6%BE%E0%A6%89%E0%A6%87%E0%A6%95%E0%A6%BF:Gadget-twinklespeedy.js testing 2wpxoozem0bbkh5lgzex4a7xeb7507e ব্যবহারকারী আলাপ:103.106.0.165 3 15864 46860 2022-08-29T10:16:03Z Aishik Rehman 5249 বিজ্ঞপ্তি: দ্রুত অপসারণ প্রস্তাবনা, [[:উইকিবই:খেলাঘর/৪]]-এর wikitext text/x-wiki {{subst:db-csd-notice-custom|1=উইকিবই:খেলাঘর/৪|2=test}} [[ব্যবহারকারী:Aishik Rehman|Aishik Rehman]] ([[ব্যবহারকারী আলাপ:Aishik Rehman|আলাপ]]) ১০:১৬, ২৯ আগস্ট ২০২২ (ইউটিসি) 3sfwi7hejhdcg5uwgfo83grcxrn2e8s 46862 46860 2022-08-29T10:16:20Z Aishik Rehman 5249 বিজ্ঞপ্তি: দ্রুত অপসারণ প্রস্তাবনা, [[:উইকিবই:খেলাঘর/৪]]-এর wikitext text/x-wiki {{subst:db-csd-notice-custom|1=উইকিবই:খেলাঘর/৪|2=test}} [[ব্যবহারকারী:Aishik Rehman|Aishik Rehman]] ([[ব্যবহারকারী আলাপ:Aishik Rehman|আলাপ]]) ১০:১৬, ২৯ আগস্ট ২০২২ (ইউটিসি) {{subst:db-csd-notice-custom|1=উইকিবই:খেলাঘর/৪|2=test}} [[ব্যবহারকারী:Aishik Rehman|Aishik Rehman]] ([[ব্যবহারকারী আলাপ:Aishik Rehman|আলাপ]]) ১০:১৬, ২৯ আগস্ট ২০২২ (ইউটিসি) c74fv9aowr1ec60ussiq9a20kcrh8ty 46865 46862 2022-08-29T10:16:48Z Aishik Rehman 5249 বিজ্ঞপ্তি: দ্রুত অপসারণ প্রস্তাবনা, [[:উইকিবই:খেলাঘর/৪]]-এর wikitext text/x-wiki {{subst:db-csd-notice-custom|1=উইকিবই:খেলাঘর/৪|2=test}} [[ব্যবহারকারী:Aishik Rehman|Aishik Rehman]] ([[ব্যবহারকারী আলাপ:Aishik Rehman|আলাপ]]) ১০:১৬, ২৯ আগস্ট ২০২২ (ইউটিসি) {{subst:db-csd-notice-custom|1=উইকিবই:খেলাঘর/৪|2=test}} [[ব্যবহারকারী:Aishik Rehman|Aishik Rehman]] ([[ব্যবহারকারী আলাপ:Aishik Rehman|আলাপ]]) ১০:১৬, ২৯ আগস্ট ২০২২ (ইউটিসি) {{subst:db-csd-notice-custom|1=উইকিবই:খেলাঘর/৪|2=test}} [[ব্যবহারকারী:Aishik Rehman|Aishik Rehman]] ([[ব্যবহারকারী আলাপ:Aishik Rehman|আলাপ]]) ১০:১৬, ২৯ আগস্ট ২০২২ (ইউটিসি) 4i7930gh4ij5wty02eigd3lmkbvzzrp 46867 46865 2022-08-29T10:17:17Z Aishik Rehman 5249 বিজ্ঞপ্তি: দ্রুত অপসারণ প্রস্তাবনা, [[:উইকিবই:খেলাঘর/৪]]-এর wikitext text/x-wiki {{subst:db-csd-notice-custom|1=উইকিবই:খেলাঘর/৪|2=test}} [[ব্যবহারকারী:Aishik Rehman|Aishik Rehman]] ([[ব্যবহারকারী আলাপ:Aishik Rehman|আলাপ]]) ১০:১৬, ২৯ আগস্ট ২০২২ (ইউটিসি) {{subst:db-csd-notice-custom|1=উইকিবই:খেলাঘর/৪|2=test}} [[ব্যবহারকারী:Aishik Rehman|Aishik Rehman]] ([[ব্যবহারকারী আলাপ:Aishik Rehman|আলাপ]]) ১০:১৬, ২৯ আগস্ট ২০২২ (ইউটিসি) {{subst:db-csd-notice-custom|1=উইকিবই:খেলাঘর/৪|2=test}} [[ব্যবহারকারী:Aishik Rehman|Aishik Rehman]] ([[ব্যবহারকারী আলাপ:Aishik Rehman|আলাপ]]) ১০:১৬, ২৯ আগস্ট ২০২২ (ইউটিসি) {{subst:db-csd-notice-custom|1=উইকিবই:খেলাঘর/৪|2=test}} [[ব্যবহারকারী:Aishik Rehman|Aishik Rehman]] ([[ব্যবহারকারী আলাপ:Aishik Rehman|আলাপ]]) ১০:১৭, ২৯ আগস্ট ২০২২ (ইউটিসি) ffjvx40ydou7yl67i0qxq9hb9xz6yel